From e3349aefb0472751d75643bacf5667835824786f Mon Sep 17 00:00:00 2001 From: Christian Hohnstaedt Date: Thu, 22 Mar 2018 20:24:01 +0100 Subject: [PATCH] Accept driver that don't support transactions Improve report of transaction errors. --- lib/sql.cpp | 17 +++++++++++++++-- lib/sql.h | 5 +++++ widgets/OpenDb.cpp | 8 ++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/sql.cpp b/lib/sql.cpp index f3535e38..09fe5a78 100644 --- a/lib/sql.cpp +++ b/lib/sql.cpp @@ -10,9 +10,11 @@ #include "base.h" #include "sql.h" #include "settings.h" +#include "widgets/MainWindow.h" int DbTransaction::mutex; int DbTransaction::error; +bool DbTransaction::hasTransaction; QList DbTransaction::items; quint64 DatabaseStamp; @@ -40,7 +42,14 @@ bool DbTransaction::begin(const char *file, int line) mutex++; has_begun = true; debug("Begin", file, line); - return mutex > 1 ? true : QSqlDatabase::database().transaction(); + if (mutex > 1 || !hasTransaction) + return true; + + QSqlDatabase db = QSqlDatabase::database(); + bool ret = db.transaction(); + if (!ret) + MainWindow::dbSqlError(db.lastError()); + return ret; } bool DbTransaction::finish(const char *oper, const char *file, int line) @@ -81,7 +90,11 @@ bool DbTransaction::finish(const char *oper, const char *file, int line) } mutex--; items.clear(); - return db.commit(); + + bool ret = db.commit(); + if (!ret) + MainWindow::dbSqlError(db.lastError()); + return ret; } bool DbTransaction::commit(const char *file, int line) diff --git a/lib/sql.h b/lib/sql.h index 3e26a2f3..87239af8 100644 --- a/lib/sql.h +++ b/lib/sql.h @@ -22,6 +22,7 @@ class DbTransaction static int mutex; static int error; static QList items; + static bool hasTransaction; bool has_begun; void debug(const char *func, const char *file, int line); bool finish(const char *oper, const char *file, int line); @@ -41,6 +42,10 @@ class DbTransaction { items << v.toULongLong(); } + static void setHasTransaction(bool trans) + { + hasTransaction = trans; + } }; #define Transaction DbTransaction __trans diff --git a/widgets/OpenDb.cpp b/widgets/OpenDb.cpp index e3d0bfc6..4ca6f8a4 100644 --- a/widgets/OpenDb.cpp +++ b/widgets/OpenDb.cpp @@ -197,7 +197,15 @@ bool OpenDb::_openDatabase(QString connName, QString pass) const QSqlError e = db.lastError(); if (!e.isValid() || e.type() != QSqlError::ConnectionError || db.isOpen()) + { + bool hasTrans = QSqlDatabase::database() + .driver()->hasFeature(QSqlDriver::Transactions); + DbTransaction::setHasTransaction(hasTrans); + if (!hasTrans) { + XCA_WARN(tr("The database driver does not support transactions. This may happen if the client and server have different versions. Continue with care.")); + } return true; + } XSqlQuery::clearTablePrefix(); db.close(); return false;