Sqlite: Add update hook and use it to get the last changed id

Sqlite has a function to get the last inserted rowid but very often you
want to get the updated rowid too.

Change-Id: Ie276a5039682813ad16597433996a2959f54d9ba
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2020-05-12 12:54:18 +02:00
parent fded815021
commit a4b00a7742
12 changed files with 330 additions and 13 deletions

View File

@@ -71,6 +71,8 @@ protected:
QString databaseFilePath{":memory:"};
Sqlite::Database database;
Sqlite::TransactionInterface &transactionInterface = database;
MockFunction<void(Sqlite::ChangeType tupe, char const *, char const *, long long)> callbackMock;
Sqlite::Database::UpdateCallback callback = callbackMock.AsStdFunction();
};
TEST_F(SqliteDatabase, SetDatabaseFilePath)
@@ -220,4 +222,89 @@ TEST_F(SqliteDatabase, Rollback)
ASSERT_NO_THROW(transactionInterface.rollback());
}
TEST_F(SqliteDatabase, SetUpdateHookSet)
{
database.setUpdateHook(callback);
EXPECT_CALL(callbackMock, Call(_, _, _, _));
Sqlite::WriteStatement("INSERT INTO test(name) VALUES (?)", database).write(42);
}
TEST_F(SqliteDatabase, SetNullUpdateHook)
{
database.setUpdateHook(callback);
Sqlite::Database::UpdateCallback newCallback;
database.setUpdateHook(newCallback);
EXPECT_CALL(callbackMock, Call(_, _, _, _)).Times(0);
Sqlite::WriteStatement("INSERT INTO test(name) VALUES (?)", database).write(42);
}
TEST_F(SqliteDatabase, ResetUpdateHook)
{
database.setUpdateHook(callback);
Sqlite::Database::UpdateCallback newCallback;
database.resetUpdateHook();
EXPECT_CALL(callbackMock, Call(_, _, _, _)).Times(0);
Sqlite::WriteStatement("INSERT INTO test(name) VALUES (?)", database).write(42);
}
TEST_F(SqliteDatabase, DeleteUpdateHookCall)
{
Sqlite::WriteStatement("INSERT INTO test(name) VALUES (?)", database).write(42);
database.setUpdateHook(callback);
EXPECT_CALL(callbackMock, Call(Eq(Sqlite::ChangeType::Delete), _, _, _));
Sqlite::WriteStatement("DELETE FROM test WHERE name = 42", database).execute();
}
TEST_F(SqliteDatabase, InsertUpdateHookCall)
{
database.setUpdateHook(callback);
EXPECT_CALL(callbackMock, Call(Eq(Sqlite::ChangeType::Insert), _, _, _));
Sqlite::WriteStatement("INSERT INTO test(name) VALUES (?)", database).write(42);
}
TEST_F(SqliteDatabase, UpdateUpdateHookCall)
{
database.setUpdateHook(callback);
EXPECT_CALL(callbackMock, Call(Eq(Sqlite::ChangeType::Insert), _, _, _));
Sqlite::WriteStatement("INSERT INTO test(name) VALUES (?)", database).write(42);
}
TEST_F(SqliteDatabase, RowIdUpdateHookCall)
{
database.setUpdateHook(callback);
EXPECT_CALL(callbackMock, Call(_, _, _, Eq(42)));
Sqlite::WriteStatement("INSERT INTO test(rowid, name) VALUES (?,?)", database).write(42, "foo");
}
TEST_F(SqliteDatabase, DatabaseUpdateHookCall)
{
database.setUpdateHook(callback);
EXPECT_CALL(callbackMock, Call(_, StrEq("main"), _, _));
Sqlite::WriteStatement("INSERT INTO test(name) VALUES (?)", database).write(42);
}
TEST_F(SqliteDatabase, TableUpdateHookCall)
{
database.setUpdateHook(callback);
EXPECT_CALL(callbackMock, Call(_, _, StrEq("test"), _));
Sqlite::WriteStatement("INSERT INTO test(name) VALUES (?)", database).write(42);
}
} // namespace