diff options
| author | 2025-01-16 01:57:37 -0500 | |
|---|---|---|
| committer | 2025-01-16 01:57:37 -0500 | |
| commit | 81a21e6ce040e7740de86340c8ea4dba30e69bc3 (patch) | |
| tree | 95fc1741b907d5ba6d029a42d80092cb7c056c5e /SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp | |
| parent | 3565aad630864ecdbe53fdaa501ea708555b3c7c (diff) | |
New upstream version 3.4.13+dfsg.upstream/3.4.13+dfsgupstream
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp')
| -rw-r--r-- | SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp | 112 |
1 files changed, 71 insertions, 41 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp index b137c1f..199b11d 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp @@ -67,9 +67,10 @@ bool AbstractDb::openQuiet() bool AbstractDb::closeQuiet() { - QWriteLocker locker(&dbOperLock); QWriteLocker connectionLocker(&connectionStateLock); interruptExecution(); + + QWriteLocker locker(&dbOperLock); bool res = closeInternal(); clearAttaches(); registeredFunctions.clear(); @@ -509,6 +510,51 @@ bool AbstractDb::isCollationRegistered(const QString& name) return registeredCollations.contains(name); } +bool AbstractDb::beginNoLock() +{ + if (!isOpenInternal()) + return false; + + SqlQueryPtr results = exec("BEGIN;", Flag::NO_LOCK); + if (results->isError()) + { + qCritical() << "Error while starting a transaction: " << results->getErrorCode() << results->getErrorText(); + return false; + } + + return true; +} + +bool AbstractDb::commitNoLock() +{ + if (!isOpenInternal()) + return false; + + SqlQueryPtr results = exec("COMMIT;", Flag::NO_LOCK); + if (results->isError()) + { + qCritical() << "Error while committing a transaction: " << results->getErrorCode() << results->getErrorText(); + return false; + } + + return true; +} + +bool AbstractDb::rollbackNoLock() +{ + if (!isOpenInternal()) + return false; + + SqlQueryPtr results = exec("ROLLBACK;", Flag::NO_LOCK); + if (results->isError()) + { + qCritical() << "Error while rolling back a transaction: " << results->getErrorCode() << results->getErrorText(); + return false; + } + + return true; +} + QHash<QString, QVariant> AbstractDb::getAggregateContext(void* memPtr) { if (!memPtr) @@ -792,55 +838,31 @@ quint32 AbstractDb::generateAsyncId() return asyncId++; } -bool AbstractDb::begin() +bool AbstractDb::begin(bool noLock) { - QWriteLocker locker(&dbOperLock); - - if (!isOpenInternal()) - return false; - - SqlQueryPtr results = exec("BEGIN;", Flag::NO_LOCK); - if (results->isError()) - { - qCritical() << "Error while starting a transaction: " << results->getErrorCode() << results->getErrorText(); - return false; - } + if (noLock) + return beginNoLock(); - return true; + QWriteLocker locker(&dbOperLock); + return beginNoLock(); } -bool AbstractDb::commit() +bool AbstractDb::commit(bool noLock) { - QWriteLocker locker(&dbOperLock); - - if (!isOpenInternal()) - return false; - - SqlQueryPtr results = exec("COMMIT;", Flag::NO_LOCK); - if (results->isError()) - { - qCritical() << "Error while committing a transaction: " << results->getErrorCode() << results->getErrorText(); - return false; - } + if (noLock) + return commitNoLock(); - return true; + QWriteLocker locker(&dbOperLock); + return commitNoLock(); } -bool AbstractDb::rollback() +bool AbstractDb::rollback(bool noLock) { - QWriteLocker locker(&dbOperLock); - - if (!isOpenInternal()) - return false; - - SqlQueryPtr results = exec("ROLLBACK;", Flag::NO_LOCK); - if (results->isError()) - { - qCritical() << "Error while rolling back a transaction: " << results->getErrorCode() << results->getErrorText(); - return false; - } + if (noLock) + return rollbackNoLock(); - return true; + QWriteLocker locker(&dbOperLock); + return rollbackNoLock(); } void AbstractDb::interrupt() @@ -915,7 +937,15 @@ void AbstractDb::registerFunction(const AbstractDb::RegisteredFunction& function void AbstractDb::flushWal() { - if (!flushWalInternal()) + if (flushWalInternal()) + { + if (exec("PRAGMA journal_mode")->getSingleCell().toString() == "wal") + { + exec("PRAGMA journal_mode = delete;", Flag::ZERO_TIMEOUT); + exec("PRAGMA journal_mode = wal;", Flag::ZERO_TIMEOUT); + } + } + else notifyWarn(tr("Failed to make full WAL checkpoint on database '%1'. Error returned from SQLite engine: %2").arg(name, getErrorTextInternal())); } |
