aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2025-01-16 01:57:37 -0500
committerLibravatarUnit 193 <unit193@unit193.net>2025-01-16 01:57:37 -0500
commit81a21e6ce040e7740de86340c8ea4dba30e69bc3 (patch)
tree95fc1741b907d5ba6d029a42d80092cb7c056c5e /SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp
parent3565aad630864ecdbe53fdaa501ea708555b3c7c (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.cpp112
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()));
}