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

@@ -43,14 +43,8 @@
namespace Sqlite {
SqliteStatement::SqliteStatement(Utils::SmallStringView sqlStatement, SqliteDatabase &database)
: SqliteStatement(sqlStatement, database.backend())
{
}
SqliteStatement::SqliteStatement(Utils::SmallStringView sqlStatement, SqliteDatabaseBackend &databaseBackend)
: m_compiledStatement(nullptr, deleteCompiledStatement),
m_databaseBackend(databaseBackend),
m_database(database),
m_bindingParameterCount(0),
m_columnCount(0),
m_isReadyToFetchValues(false)
@@ -146,6 +140,11 @@ void SqliteStatement::step() const
next();
}
void SqliteStatement::execute() const
{
next();
}
int SqliteStatement::columnCount() const
{
return m_columnCount;
@@ -203,7 +202,7 @@ template SQLITE_EXPORT void SqliteStatement::bind(Utils::SmallStringView name, q
template SQLITE_EXPORT void SqliteStatement::bind(Utils::SmallStringView name, double value);
template SQLITE_EXPORT void SqliteStatement::bind(Utils::SmallStringView name, Utils::SmallStringView text);
int SqliteStatement::bindingIndexForName(Utils::SmallStringView name)
int SqliteStatement::bindingIndexForName(Utils::SmallStringView name) const
{
return sqlite3_bind_parameter_index(m_compiledStatement.get(), name.data());
}
@@ -241,12 +240,12 @@ void SqliteStatement::prepare(Utils::SmallStringView sqlStatement)
sqlite3 *SqliteStatement::sqliteDatabaseHandle() const
{
return m_databaseBackend.sqliteDatabaseHandle();
return m_database.backend().sqliteDatabaseHandle();
}
TextEncoding SqliteStatement::databaseTextEncoding()
{
return m_databaseBackend.textEncoding();
return m_database.backend().textEncoding();
}
bool SqliteStatement::checkForStepError(int resultCode) const
@@ -359,6 +358,11 @@ QString SqliteStatement::columnName(int column) const
return QString::fromUtf8(sqlite3_column_name(m_compiledStatement.get(), column));
}
SqliteDatabase &SqliteStatement::database() const
{
return m_database;
}
static Utils::SmallString textForColumn(sqlite3_stmt *sqlStatment, int column)
{
const char *text = reinterpret_cast<const char*>(sqlite3_column_text(sqlStatment, column));