diff options
author | Marco Bubke <marco.bubke@qt.io> | 2023-03-22 01:28:46 +0100 |
---|---|---|
committer | Marco Bubke <marco.bubke@qt.io> | 2023-03-27 14:36:24 +0000 |
commit | 4cb99eb73768b3dc354d6f67eea0fc120cfea0b7 (patch) | |
tree | ff3d3f3600b294c313ab302cd1075764b7c0f8d7 | |
parent | 8ba06e68653d24099c23664075e0beb5b604db4d (diff) | |
download | qt-creator-4cb99eb73768b3dc354d6f67eea0fc120cfea0b7.tar.gz |
Sqlite: Improve ownership
Using the compile option instead of a function pointer makes the code
less brittle.
Change-Id: Id7f3b42c044d47f13e099f50c5bb33b72c05cde1
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r-- | src/libs/sqlite/sqlitebasestatement.cpp | 13 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitebasestatement.h | 10 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitedatabasebackend.cpp | 38 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitedatabasebackend.h | 8 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitesessions.cpp | 5 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitesessions.h | 12 |
6 files changed, 53 insertions, 33 deletions
diff --git a/src/libs/sqlite/sqlitebasestatement.cpp b/src/libs/sqlite/sqlitebasestatement.cpp index dbcd9dc0ec..91b417bea1 100644 --- a/src/libs/sqlite/sqlitebasestatement.cpp +++ b/src/libs/sqlite/sqlitebasestatement.cpp @@ -27,17 +27,11 @@ extern "C" int sqlite3_carray_bind( namespace Sqlite { BaseStatement::BaseStatement(Utils::SmallStringView sqlStatement, Database &database) - : m_compiledStatement(nullptr, deleteCompiledStatement) - , m_database(database) + : m_database(database) { prepare(sqlStatement); } -void BaseStatement::deleteCompiledStatement(sqlite3_stmt *compiledStatement) -{ - sqlite3_finalize(compiledStatement); -} - class UnlockNotification { public: @@ -485,4 +479,9 @@ ValueView BaseStatement::fetchValueView(int column) const return ValueView::create(NullValue{}); } +void BaseStatement::Deleter::operator()(sqlite3_stmt *statement) +{ + sqlite3_finalize(statement); +} + } // namespace Sqlite diff --git a/src/libs/sqlite/sqlitebasestatement.h b/src/libs/sqlite/sqlitebasestatement.h index 7721a80937..1178b97f3a 100644 --- a/src/libs/sqlite/sqlitebasestatement.h +++ b/src/libs/sqlite/sqlitebasestatement.h @@ -50,8 +50,6 @@ public: BaseStatement(const BaseStatement &) = delete; BaseStatement &operator=(const BaseStatement &) = delete; - static void deleteCompiledStatement(sqlite3_stmt *m_compiledStatement); - bool next() const; void step() const; void reset() const noexcept; @@ -123,7 +121,13 @@ protected: ~BaseStatement() = default; private: - std::unique_ptr<sqlite3_stmt, void (*)(sqlite3_stmt *)> m_compiledStatement; + struct Deleter + { + SQLITE_EXPORT void operator()(sqlite3_stmt *statement); + }; + +private: + std::unique_ptr<sqlite3_stmt, Deleter> m_compiledStatement; Database &m_database; }; diff --git a/src/libs/sqlite/sqlitedatabasebackend.cpp b/src/libs/sqlite/sqlitedatabasebackend.cpp index 9934b5da34..0fd18dfaa1 100644 --- a/src/libs/sqlite/sqlitedatabasebackend.cpp +++ b/src/libs/sqlite/sqlitedatabasebackend.cpp @@ -90,14 +90,16 @@ void DatabaseBackend::open(Utils::SmallStringView databaseFilePath, { checkCanOpenDatabase(databaseFilePath); + sqlite3 *handle = m_databaseHandle.get(); int resultCode = sqlite3_open_v2(std::string(databaseFilePath).c_str(), - &m_databaseHandle, + &handle, createOpenFlags(openMode, journalMode), nullptr); + m_databaseHandle.reset(handle); checkDatabaseCouldBeOpened(resultCode); - resultCode = sqlite3_carray_init(m_databaseHandle, nullptr, nullptr); + resultCode = sqlite3_carray_init(m_databaseHandle.get(), nullptr, nullptr); checkCarrayCannotBeIntialized(resultCode); } @@ -105,7 +107,7 @@ void DatabaseBackend::open(Utils::SmallStringView databaseFilePath, sqlite3 *DatabaseBackend::sqliteDatabaseHandle() const { checkDatabaseHandleIsNotNull(); - return m_databaseHandle; + return m_databaseHandle.get(); } void DatabaseBackend::setPragmaValue(Utils::SmallStringView pragmaKey, Utils::SmallStringView newPragmaValue) @@ -216,12 +218,11 @@ void DatabaseBackend::close() { checkForOpenDatabaseWhichCanBeClosed(); - int resultCode = sqlite3_close(m_databaseHandle); + int resultCode = sqlite3_close(m_databaseHandle.get()); checkDatabaseClosing(resultCode); - m_databaseHandle = nullptr; - + m_databaseHandle.release(); } bool DatabaseBackend::databaseIsOpen() const @@ -231,12 +232,7 @@ bool DatabaseBackend::databaseIsOpen() const void DatabaseBackend::closeWithoutException() { - if (m_databaseHandle) { - int resultCode = sqlite3_close_v2(m_databaseHandle); - m_databaseHandle = nullptr; - if (resultCode != SQLITE_OK) - qWarning() << "SqliteDatabaseBackend::closeWithoutException: Unexpected error at closing the database!"; - } + m_databaseHandle.reset(); } namespace { @@ -414,12 +410,12 @@ int DatabaseBackend::createOpenFlags(OpenMode openMode, JournalMode journalMode) void DatabaseBackend::setBusyTimeout(std::chrono::milliseconds timeout) { - sqlite3_busy_timeout(m_databaseHandle, int(timeout.count())); + sqlite3_busy_timeout(m_databaseHandle.get(), int(timeout.count())); } void DatabaseBackend::walCheckpointFull() { - int resultCode = sqlite3_wal_checkpoint_v2(m_databaseHandle, + int resultCode = sqlite3_wal_checkpoint_v2(m_databaseHandle.get(), nullptr, SQLITE_CHECKPOINT_TRUNCATE, nullptr, @@ -433,12 +429,12 @@ void DatabaseBackend::setUpdateHook( void *object, void (*callback)(void *object, int, char const *database, char const *, long long rowId)) { - sqlite3_update_hook(m_databaseHandle, callback, object); + sqlite3_update_hook(m_databaseHandle.get(), callback, object); } void DatabaseBackend::resetUpdateHook() { - sqlite3_update_hook(m_databaseHandle, nullptr, nullptr); + sqlite3_update_hook(m_databaseHandle.get(), nullptr, nullptr); } void DatabaseBackend::setBusyHandler(DatabaseBackend::BusyHandler &&busyHandler) @@ -491,4 +487,14 @@ Type DatabaseBackend::toValue(Utils::SmallStringView sqlStatement) const } } +void DatabaseBackend::Deleter::operator()(sqlite3 *database) +{ + if (database) { + int resultCode = sqlite3_close_v2(database); + if (resultCode != SQLITE_OK) + qWarning() << "SqliteDatabaseBackend::closeWithoutException: Unexpected error at " + "closing the database!"; + } +} + } // namespace Sqlite diff --git a/src/libs/sqlite/sqlitedatabasebackend.h b/src/libs/sqlite/sqlitedatabasebackend.h index 92a19c3cc0..9a1caa92d6 100644 --- a/src/libs/sqlite/sqlitedatabasebackend.h +++ b/src/libs/sqlite/sqlitedatabasebackend.h @@ -109,8 +109,14 @@ protected: static JournalMode pragmaToJournalMode(Utils::SmallStringView pragma); private: + struct Deleter + { + SQLITE_EXPORT void operator()(sqlite3 *database); + }; + +private: Database &m_database; - sqlite3 *m_databaseHandle; + std::unique_ptr<sqlite3, Deleter> m_databaseHandle; BusyHandler m_busyHandler; ProgressHandler m_progressHandler; }; diff --git a/src/libs/sqlite/sqlitesessions.cpp b/src/libs/sqlite/sqlitesessions.cpp index 45bc99e4c3..0dea908e5f 100644 --- a/src/libs/sqlite/sqlitesessions.cpp +++ b/src/libs/sqlite/sqlitesessions.cpp @@ -173,4 +173,9 @@ SessionChangeSets Sessions::changeSets() const return selectChangeSets.values<SessionChangeSet>(1024); } +void Sessions::Deleter::operator()(sqlite3_session *session) +{ + sqlite3session_delete(session); +} + } // namespace Sqlite diff --git a/src/libs/sqlite/sqlitesessions.h b/src/libs/sqlite/sqlitesessions.h index 33ce267a97..151155d417 100644 --- a/src/libs/sqlite/sqlitesessions.h +++ b/src/libs/sqlite/sqlitesessions.h @@ -8,10 +8,6 @@ #include "sqlitesessionchangeset.h" #include "sqlitewritestatement.h" -extern "C" { -void sqlite3session_delete(sqlite3_session *pSession); -}; - namespace Sqlite { namespace Internal { @@ -44,7 +40,6 @@ public: {"INSERT INTO ", sessionsTableName, "(changeset) VALUES(?)"}), database} , databaseName(databaseName) - , session{nullptr, sqlite3session_delete} {} ~Sessions(); @@ -64,12 +59,17 @@ public: private: void attachTables(const Utils::SmallStringVector &tables); + struct Deleter + { + SQLITE_EXPORT void operator()(sqlite3_session *statement); + }; + public: Database &database; WriteStatement<1> insertSession; Utils::SmallString databaseName; Utils::SmallStringVector tableNames; - std::unique_ptr<sqlite3_session, decltype(&sqlite3session_delete)> session; + std::unique_ptr<sqlite3_session, Deleter> session; }; } // namespace Sqlite |