Accept driver that don't support transactions

Improve report of transaction errors.
This commit is contained in:
Christian Hohnstaedt 2018-03-22 20:24:01 +01:00
parent 0fa37430a4
commit e3349aefb0
3 changed files with 28 additions and 2 deletions

View File

@ -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<quint64> 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)

View File

@ -22,6 +22,7 @@ class DbTransaction
static int mutex;
static int error;
static QList<quint64> 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

View File

@ -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;