Sqlite: Add variadic bind and write functions

You can now write

SqliteWriteStatement statement("UPDATE test SET name=?, number=?
                                WHERE rowid=?", database);

statement.write("see", 7.23, 1);

and

SqliteWriteStatement statement("UPDATE test SET name=@name, number=@number
                                WHERE rowid=@id", database);

statement.writeNamed("@name", "see", "@number", 7.23, "@id", 1);

This is more type safe than using variants and performant too.

Change-Id: Ie1ed2a6d326b956be5c4ec056214f3f5b1531f45
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2017-07-31 19:44:39 +02:00
parent 71e1f66284
commit a41183f6c7
12 changed files with 166 additions and 39 deletions

View File

@@ -48,8 +48,9 @@
namespace Sqlite {
SqliteDatabaseBackend::SqliteDatabaseBackend()
: m_databaseHandle(nullptr),
SqliteDatabaseBackend::SqliteDatabaseBackend(SqliteDatabase &database)
: m_database(database),
m_databaseHandle(nullptr),
m_cachedTextEncoding(Utf8)
{
}
@@ -124,8 +125,7 @@ sqlite3 *SqliteDatabaseBackend::sqliteDatabaseHandle()
void SqliteDatabaseBackend::setPragmaValue(Utils::SmallStringView pragmaKey, Utils::SmallStringView newPragmaValue)
{
SqliteReadWriteStatement statement(Utils::SmallString{"PRAGMA ", pragmaKey, "='", newPragmaValue, "'"}, *this);
statement.step();
execute(Utils::SmallString{"PRAGMA ", pragmaKey, "='", newPragmaValue, "'"});
Utils::SmallString pragmeValueInDatabase = toValue<Utils::SmallString>("PRAGMA " + pragmaKey);
checkPragmaValue(pragmeValueInDatabase, newPragmaValue);
@@ -160,7 +160,7 @@ TextEncoding SqliteDatabaseBackend::textEncoding()
Utils::SmallStringVector SqliteDatabaseBackend::columnNames(Utils::SmallStringView tableName)
{
SqliteReadWriteStatement statement("SELECT * FROM " + tableName, *this);
SqliteReadWriteStatement statement("SELECT * FROM " + tableName, m_database);
return statement.columnNames();
}
@@ -176,7 +176,7 @@ int SqliteDatabaseBackend::totalChangesCount()
void SqliteDatabaseBackend::execute(Utils::SmallStringView sqlStatement)
{
SqliteReadWriteStatement statement(sqlStatement, *this);
SqliteReadWriteStatement statement(sqlStatement, m_database);
statement.step();
}
@@ -391,7 +391,7 @@ void SqliteDatabaseBackend::throwException(const char *whatHasHappens) const
template <typename Type>
Type SqliteDatabaseBackend::toValue(Utils::SmallStringView sqlStatement)
{
SqliteReadWriteStatement statement(sqlStatement, *this);
SqliteReadWriteStatement statement(sqlStatement, m_database);
statement.next();