From bca41fa9f66fb1fe60d738c807f5cb56118687e6 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 25 Sep 2018 15:42:52 +0200 Subject: [PATCH] ClangRefactoring: Initialize sqlite database only once Initializing the database is not cheap so it is better to initializing it only once. We simply check if the database file already exists and then skip the initializing step. Task-number: QTCREATORBUG-21174 Change-Id: I151090c5081c009f7913a30517065be2833791d8 Reviewed-by: Ivan Donchevskii --- .../refactoringdatabaseinitializer.h | 28 +++++++------ src/libs/sqlite/sqlitedatabase.cpp | 13 ++++++ src/libs/sqlite/sqlitedatabase.h | 6 ++- tests/unit/unittest/data/sqlite_database.db | Bin 0 -> 4096 bytes tests/unit/unittest/mocksqlitedatabase.h | 6 +++ .../refactoringdatabaseinitializer-test.cpp | 38 +++++++++++++++++- tests/unit/unittest/sqlitedatabase-test.cpp | 27 +++++++++++++ 7 files changed, 104 insertions(+), 14 deletions(-) create mode 100644 tests/unit/unittest/data/sqlite_database.db diff --git a/src/libs/clangsupport/refactoringdatabaseinitializer.h b/src/libs/clangsupport/refactoringdatabaseinitializer.h index 0b212c3a58a..ab15cf81e0f 100644 --- a/src/libs/clangsupport/refactoringdatabaseinitializer.h +++ b/src/libs/clangsupport/refactoringdatabaseinitializer.h @@ -39,20 +39,24 @@ public: RefactoringDatabaseInitializer(DatabaseType &database) : database(database) { - Sqlite::ImmediateTransaction transaction{database}; + if (!database.isInitialized()) { + Sqlite::ExclusiveTransaction transaction{database}; - createSymbolsTable(); - createLocationsTable(); - createSourcesTable(); - createDirectoriesTable(); - createProjectPartsTable(); - createProjectPartsSourcesTable(); - createUsedMacrosTable(); - createFileStatusesTable(); - createSourceDependenciesTable(); - createPrecompiledHeadersTable(); + createSymbolsTable(); + createLocationsTable(); + createSourcesTable(); + createDirectoriesTable(); + createProjectPartsTable(); + createProjectPartsSourcesTable(); + createUsedMacrosTable(); + createFileStatusesTable(); + createSourceDependenciesTable(); + createPrecompiledHeadersTable(); - transaction.commit(); + transaction.commit(); + + database.setIsInitialized(true); + } } void createSymbolsTable() diff --git a/src/libs/sqlite/sqlitedatabase.cpp b/src/libs/sqlite/sqlitedatabase.cpp index a90c8caff0f..1ddaf2cfbcb 100644 --- a/src/libs/sqlite/sqlitedatabase.cpp +++ b/src/libs/sqlite/sqlitedatabase.cpp @@ -29,6 +29,8 @@ #include "sqlitetransaction.h" #include "sqlitereadwritestatement.h" +#include + #include using namespace std::chrono_literals; @@ -85,6 +87,7 @@ void Database::open() void Database::open(Utils::PathString &&databaseFilePath) { + m_isInitialized = QFileInfo::exists(QString(databaseFilePath)); setDatabaseFilePath(std::move(databaseFilePath)); open(); } @@ -96,6 +99,16 @@ void Database::close() m_databaseBackend.close(); } +bool Database::isInitialized() const +{ + return m_isInitialized; +} + +void Database::setIsInitialized(bool isInitialized) +{ + m_isInitialized = isInitialized; +} + bool Database::isOpen() const { return m_isOpen; diff --git a/src/libs/sqlite/sqlitedatabase.h b/src/libs/sqlite/sqlitedatabase.h index ad82f6eaa62..d0eae28f790 100644 --- a/src/libs/sqlite/sqlitedatabase.h +++ b/src/libs/sqlite/sqlitedatabase.h @@ -56,7 +56,7 @@ public: Database(); Database(Utils::PathString &&databaseFilePath, - JournalMode journalMode=JournalMode::Wal); + JournalMode journalMode); Database(Utils::PathString &&databaseFilePath, std::chrono::milliseconds busyTimeout = 1000ms, JournalMode journalMode=JournalMode::Wal); @@ -69,6 +69,9 @@ public: void open(Utils::PathString &&databaseFilePath); void close(); + bool isInitialized() const; + void setIsInitialized(bool isInitialized); + bool isOpen() const; Table &addTable(); @@ -133,6 +136,7 @@ private: JournalMode m_journalMode = JournalMode::Wal; OpenMode m_openMode = OpenMode::ReadWrite; bool m_isOpen = false; + bool m_isInitialized = false; }; } // namespace Sqlite diff --git a/tests/unit/unittest/data/sqlite_database.db b/tests/unit/unittest/data/sqlite_database.db new file mode 100644 index 0000000000000000000000000000000000000000..9c5879579e55a731615ad4ea4725f6c658f17751 GIT binary patch literal 4096 zcmWFz^vNtqRY=P(%1ta$FlG>7U}9o$P*7lCU|@t|1_}TpgPz0*UXTF-AYv4chQMeD mjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb22M2mk #include +#include #include namespace { @@ -105,6 +106,32 @@ TEST_F(SqliteDatabase, CloseDatabase) ASSERT_FALSE(database.isOpen()); } +TEST_F(SqliteDatabase, DatabaseIsNotInitializedAfterOpening) +{ + ASSERT_FALSE(database.isInitialized()); +} + +TEST_F(SqliteDatabase, DatabaseIsIntializedAfterSettingItBeforeOpening) +{ + database.setIsInitialized(true); + + ASSERT_TRUE(database.isInitialized()); +} + +TEST_F(SqliteDatabase, DatabaseIsInitializedIfDatabasePathExistsAtOpening) +{ + Sqlite::Database database{TESTDATA_DIR "/sqlite_database.db"}; + + ASSERT_TRUE(database.isInitialized()); +} + +TEST_F(SqliteDatabase, DatabaseIsNotInitializedIfDatabasePathDoesNotExistAtOpening) +{ + Sqlite::Database database{Utils::PathString{QDir::tempPath() + "/database_does_not_exist.db"}}; + + ASSERT_FALSE(database.isInitialized()); +} + TEST_F(SqliteDatabase, AddTable) { auto sqliteTable = database.addTable();