diff --git a/src/libs/sqlite/sqlitebasestatement.cpp b/src/libs/sqlite/sqlitebasestatement.cpp index 91b417bea12..d9d677c3959 100644 --- a/src/libs/sqlite/sqlitebasestatement.cpp +++ b/src/libs/sqlite/sqlitebasestatement.cpp @@ -274,6 +274,9 @@ void BaseStatement::bind(int index, ValueView value) void BaseStatement::prepare(Utils::SmallStringView sqlStatement) { + if (!m_database.isLocked()) + throw DatabaseIsNotLocked{}; + int resultCode; do { diff --git a/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h b/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h index 37131012d69..c5c7b61160b 100644 --- a/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h +++ b/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h @@ -30,6 +30,7 @@ public: : database(database) { transaction.commit(); + database.walCheckpointFull(); } ImageEntry fetchImage(Utils::SmallStringView name, Sqlite::TimeStamp minimumTimeStamp) const override @@ -157,16 +158,10 @@ private: Initializer(DatabaseType &database) { if (!database.isInitialized()) { - Sqlite::ExclusiveTransaction transaction{database}; - createImagesTable(database); database.setVersion(1); - transaction.commit(); - database.setIsInitialized(true); - - database.walCheckpointFull(); } else if (database.version() < 1) { updateTableToVersion1(database); } @@ -277,8 +272,8 @@ private: public: DatabaseType &database; + Sqlite::ExclusiveNonThrowingDestructorTransaction transaction{database}; Initializer initializer{database}; - Sqlite::ImmediateNonThrowingDestructorTransaction transaction{database}; mutable ReadStatement<1, 2> selectImageStatement{ "SELECT image FROM images WHERE name=?1 AND mtime >= ?2", database}; mutable ReadStatement<1, 2> selectMidSizeImageStatement{ diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h index ae11e98f363..4288cd5cbb1 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h @@ -38,8 +38,13 @@ public: ProjectStorage(Database &database, bool isInitialized) : database{database} + , exclusiveTransaction{database} , initializer{database, isInitialized} { + exclusiveTransaction.commit(); + + database.walCheckpointFull(); + moduleCache.populate(); } @@ -2242,8 +2247,6 @@ private: Initializer(Database &database, bool isInitialized) { if (!isInitialized) { - Sqlite::ExclusiveTransaction transaction{database}; - auto moduleIdColumn = createModulesTable(database); createSourceContextsTable(database); createSourcesTable(database); @@ -2257,10 +2260,6 @@ private: createDocumentImportsTable(database, moduleIdColumn); createFileStatusesTable(database); createProjectDatasTable(database); - - transaction.commit(); - - database.walCheckpointFull(); } database.setIsInitialized(true); } @@ -2598,6 +2597,7 @@ private: public: Database &database; + Sqlite::ExclusiveNonThrowingDestructorTransaction exclusiveTransaction; Initializer initializer; mutable ModuleCache moduleCache{ModuleStorageAdapter{*this}}; Storage::Info::CommonTypeCache commonTypeCache_{*this}; diff --git a/tests/unit/unittest/sqlitedatabase-test.cpp b/tests/unit/unittest/sqlitedatabase-test.cpp index a7a8585db53..f5fe435b813 100644 --- a/tests/unit/unittest/sqlitedatabase-test.cpp +++ b/tests/unit/unittest/sqlitedatabase-test.cpp @@ -95,7 +95,8 @@ TEST_F(SqliteDatabase, CreateDatabaseWithLockingModeNormal) Sqlite::Database database{path, JournalMode::Wal, Sqlite::LockingMode::Normal}; - ASSERT_THAT(database.lockingMode(), Sqlite::LockingMode::Normal); + ASSERT_THAT(Sqlite::withImmediateTransaction(database, [&] { return database.lockingMode(); }), + Sqlite::LockingMode::Normal); } TEST_F(SqliteDatabase, ExclusivelyLockedDatabaseIsLockedForSecondConnection)