Sqlite: Use compiled statements for transactions

So we don't recompile them again and again.

Change-Id: I54c95e9d81df86f4944b9e3d45a7277f93f37312
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Marco Bubke
2018-03-29 18:33:59 +02:00
parent 549aa7ee02
commit 28da1261c8
3 changed files with 101 additions and 35 deletions

View File

@@ -40,6 +40,7 @@ namespace Sqlite {
class ReadStatement;
class WriteStatement;
class ReadWriteStatement;
class SQLITE_EXPORT Database final : public TransactionInterface
{
@@ -54,10 +55,11 @@ public:
Database();
Database(Utils::PathString &&databaseFilePath,
JournalMode journalMode=JournalMode::Wal);
JournalMode journalMode=JournalMode::Delete);
Database(Utils::PathString &&databaseFilePath,
std::chrono::milliseconds busyTimeout = {},
JournalMode journalMode=JournalMode::Wal);
JournalMode journalMode=JournalMode::Delete);
~Database();
Database(const Database &) = delete;
Database &operator=(const Database &) = delete;
@@ -104,44 +106,26 @@ public:
return m_databaseBackend.totalChangesCount();
}
void deferredBegin()
{
m_databaseMutex.lock();
execute("BEGIN");
}
void immediateBegin()
{
m_databaseMutex.lock();
execute("BEGIN IMMEDIATE");
}
void exclusiveBegin()
{
m_databaseMutex.lock();
execute("BEGIN EXCLUSIVE");
}
void commit()
{
execute("COMMIT");
m_databaseMutex.unlock();
}
void rollback()
{
execute("ROLLBACK");
m_databaseMutex.unlock();
}
void deferredBegin();
void immediateBegin();
void exclusiveBegin();
void commit();
void rollback();
private:
void initializeTables();
void registerTransactionStatements();
std::mutex &databaseMutex() { return m_databaseMutex; }
private:
Utils::PathString m_databaseFilePath;
DatabaseBackend m_databaseBackend;
std::vector<Table> m_sqliteTables;
std::unique_ptr<ReadWriteStatement> m_deferredBeginStatement;
std::unique_ptr<ReadWriteStatement> m_immediateBeginStatement;
std::unique_ptr<ReadWriteStatement> m_exclusiveBeginStatement;
std::unique_ptr<ReadWriteStatement> m_commitBeginStatement;
std::unique_ptr<ReadWriteStatement> m_rollbackBeginStatement;
std::mutex m_databaseMutex;
std::chrono::milliseconds m_busyTimeout;
JournalMode m_journalMode = JournalMode::Wal;