From 157b5039c1aa58cf4b84ddafa63c9267c7af369b Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 14 Mar 2023 11:12:58 +0100 Subject: [PATCH] Sqlite: Improve database opening Change-Id: I9074cda4d9da12a061f094ca72fa156d89ca0f87 Reviewed-by: Qt CI Bot Reviewed-by: Tim Jenssen --- src/libs/sqlite/sqlitedatabase.cpp | 2 +- src/libs/sqlite/sqlitedatabasebackend.cpp | 26 ++++++++++++------- src/libs/sqlite/sqlitedatabasebackend.h | 4 +-- .../unittest/sqlitedatabasebackend-test.cpp | 25 +++++++++++++----- 4 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/libs/sqlite/sqlitedatabase.cpp b/src/libs/sqlite/sqlitedatabase.cpp index 6c437572257..7bb0d9b70c1 100644 --- a/src/libs/sqlite/sqlitedatabase.cpp +++ b/src/libs/sqlite/sqlitedatabase.cpp @@ -69,7 +69,7 @@ void Database::activateLogging() void Database::open(LockingMode lockingMode) { - m_databaseBackend.open(m_databaseFilePath, m_openMode); + m_databaseBackend.open(m_databaseFilePath, m_openMode, m_journalMode); if (m_busyTimeout > 0ms) m_databaseBackend.setBusyTimeout(m_busyTimeout); else diff --git a/src/libs/sqlite/sqlitedatabasebackend.cpp b/src/libs/sqlite/sqlitedatabasebackend.cpp index 05642524595..bafc9f7d8d3 100644 --- a/src/libs/sqlite/sqlitedatabasebackend.cpp +++ b/src/libs/sqlite/sqlitedatabasebackend.cpp @@ -84,18 +84,19 @@ void DatabaseBackend::checkpointFullWalLog() checkIfLogCouldBeCheckpointed(resultCode); } -void DatabaseBackend::open(Utils::SmallStringView databaseFilePath, OpenMode mode) +void DatabaseBackend::open(Utils::SmallStringView databaseFilePath, + OpenMode openMode, + JournalMode journalMode) { checkCanOpenDatabase(databaseFilePath); int resultCode = sqlite3_open_v2(std::string(databaseFilePath).c_str(), &m_databaseHandle, - openMode(mode), + createOpenFlags(openMode, journalMode), nullptr); checkDatabaseCouldBeOpened(resultCode); - sqlite3_extended_result_codes(m_databaseHandle, true); resultCode = sqlite3_carray_init(m_databaseHandle, nullptr, nullptr); checkCarrayCannotBeIntialized(resultCode); @@ -392,16 +393,23 @@ JournalMode DatabaseBackend::pragmaToJournalMode(Utils::SmallStringView pragma) return static_cast(index); } -int DatabaseBackend::openMode(OpenMode mode) +int DatabaseBackend::createOpenFlags(OpenMode openMode, JournalMode journalMode) { - int sqliteMode = SQLITE_OPEN_CREATE; + int sqliteOpenFlags = SQLITE_OPEN_CREATE | SQLITE_OPEN_EXRESCODE; - switch (mode) { - case OpenMode::ReadOnly: sqliteMode |= SQLITE_OPEN_READONLY; break; - case OpenMode::ReadWrite: sqliteMode |= SQLITE_OPEN_READWRITE; break; + if (journalMode == JournalMode::Memory) + sqliteOpenFlags |= SQLITE_OPEN_MEMORY; + + switch (openMode) { + case OpenMode::ReadOnly: + sqliteOpenFlags |= SQLITE_OPEN_READONLY; + break; + case OpenMode::ReadWrite: + sqliteOpenFlags |= SQLITE_OPEN_READWRITE; + break; } - return sqliteMode; + return sqliteOpenFlags; } void DatabaseBackend::setBusyTimeout(std::chrono::milliseconds timeout) diff --git a/src/libs/sqlite/sqlitedatabasebackend.h b/src/libs/sqlite/sqlitedatabasebackend.h index 861cb1ee540..e42a58a412d 100644 --- a/src/libs/sqlite/sqlitedatabasebackend.h +++ b/src/libs/sqlite/sqlitedatabasebackend.h @@ -39,7 +39,7 @@ public: static void shutdownSqliteLibrary(); void checkpointFullWalLog(); - void open(Utils::SmallStringView databaseFilePath, OpenMode openMode); + void open(Utils::SmallStringView databaseFilePath, OpenMode openMode, JournalMode journalMode); void close(); void closeWithoutException(); @@ -67,7 +67,7 @@ public: template Type toValue(Utils::SmallStringView sqlStatement) const; - static int openMode(OpenMode); + static int createOpenFlags(OpenMode openMode, JournalMode journalMode); void setBusyTimeout(std::chrono::milliseconds timeout); diff --git a/tests/unit/unittest/sqlitedatabasebackend-test.cpp b/tests/unit/unittest/sqlitedatabasebackend-test.cpp index 743d964f9da..0baaaa0f565 100644 --- a/tests/unit/unittest/sqlitedatabasebackend-test.cpp +++ b/tests/unit/unittest/sqlitedatabasebackend-test.cpp @@ -31,7 +31,7 @@ protected: { database.lock(); QDir::temp().remove(QStringLiteral("SqliteDatabaseBackendTest.db")); - databaseBackend.open(databaseFilePath, OpenMode::ReadWrite); + databaseBackend.open(databaseFilePath, OpenMode::ReadWrite, Sqlite::JournalMode::Wal); } ~SqliteDatabaseBackend() noexcept(true) @@ -49,7 +49,7 @@ using SqliteDatabaseBackendSlowTest = SqliteDatabaseBackend; TEST_F(SqliteDatabaseBackend, OpenAlreadyOpenDatabase) { - ASSERT_THROW(databaseBackend.open(databaseFilePath, OpenMode::ReadWrite), + ASSERT_THROW(databaseBackend.open(databaseFilePath, OpenMode::ReadWrite, Sqlite::JournalMode::Wal), Sqlite::DatabaseIsAlreadyOpen); } @@ -62,7 +62,9 @@ TEST_F(SqliteDatabaseBackend, CloseAlreadyClosedDatabase) TEST_F(SqliteDatabaseBackend, OpenWithWrongPath) { - ASSERT_THROW(databaseBackend.open("/xxx/SqliteDatabaseBackendTest.db", OpenMode::ReadWrite), + ASSERT_THROW(databaseBackend.open("/xxx/SqliteDatabaseBackendTest.db", + OpenMode::ReadWrite, + Sqlite::JournalMode::Wal), Sqlite::WrongFilePath); } @@ -101,15 +103,24 @@ TEST_F(SqliteDatabaseBackend, PersistJournalMode) TEST_F(SqliteDatabaseBackend, OpenModeReadOnly) { - auto mode = Backend::openMode(OpenMode::ReadOnly); + auto mode = Backend::createOpenFlags(OpenMode::ReadOnly, Sqlite::JournalMode::Wal); - ASSERT_THAT(mode, SQLITE_OPEN_CREATE | SQLITE_OPEN_READONLY); + ASSERT_THAT(mode, SQLITE_OPEN_CREATE | SQLITE_OPEN_READONLY | SQLITE_OPEN_EXRESCODE); } TEST_F(SqliteDatabaseBackend, OpenModeReadWrite) { - auto mode = Backend::openMode(OpenMode::ReadWrite); + auto mode = Backend::createOpenFlags(OpenMode::ReadWrite, Sqlite::JournalMode::Wal); - ASSERT_THAT(mode, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE); + ASSERT_THAT(mode, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_EXRESCODE); +} + +TEST_F(SqliteDatabaseBackend, OpenModeReadWriteAndMemoryJournal) +{ + auto mode = Backend::createOpenFlags(OpenMode::ReadWrite, Sqlite::JournalMode::Memory); + + ASSERT_THAT(mode, + SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_EXRESCODE + | SQLITE_OPEN_MEMORY); } } // namespace