forked from qt-creator/qt-creator
Sqlite: Improve database opening
Change-Id: I9074cda4d9da12a061f094ca72fa156d89ca0f87 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
@@ -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
|
||||
|
@@ -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<JournalMode>(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)
|
||||
|
@@ -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<typename Type>
|
||||
Type toValue(Utils::SmallStringView sqlStatement) const;
|
||||
|
||||
static int openMode(OpenMode);
|
||||
static int createOpenFlags(OpenMode openMode, JournalMode journalMode);
|
||||
|
||||
void setBusyTimeout(std::chrono::milliseconds timeout);
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user