[core] support moving Database object during a Transaction
This commit is contained in:
@@ -72,6 +72,9 @@ public:
|
||||
checkDatabaseError(db);
|
||||
}
|
||||
|
||||
void setBusyTimeout(std::chrono::milliseconds timeout);
|
||||
void exec(const std::string& sql);
|
||||
|
||||
QString connectionName;
|
||||
};
|
||||
|
||||
@@ -156,12 +159,15 @@ Database::~Database() {
|
||||
|
||||
void Database::setBusyTimeout(std::chrono::milliseconds timeout) {
|
||||
assert(impl);
|
||||
impl->setBusyTimeout(timeout);
|
||||
}
|
||||
|
||||
void DatabaseImpl::setBusyTimeout(std::chrono::milliseconds timeout) {
|
||||
// std::chrono::milliseconds.count() is a long and Qt will cast
|
||||
// internally to int, so we need to make sure the limits apply.
|
||||
std::string timeoutStr = mbgl::util::toString(timeout.count() & INT_MAX);
|
||||
|
||||
auto db = QSqlDatabase::database(impl->connectionName);
|
||||
auto db = QSqlDatabase::database(connectionName);
|
||||
QString connectOptions = db.connectOptions();
|
||||
if (connectOptions.isEmpty()) {
|
||||
if (!connectOptions.isEmpty()) connectOptions.append(';');
|
||||
@@ -180,13 +186,17 @@ void Database::setBusyTimeout(std::chrono::milliseconds timeout) {
|
||||
|
||||
void Database::exec(const std::string &sql) {
|
||||
assert(impl);
|
||||
impl->exec(sql);
|
||||
}
|
||||
|
||||
void DatabaseImpl::exec(const std::string& sql) {
|
||||
QStringList statements = QString::fromStdString(sql).split(';', QString::SkipEmptyParts);
|
||||
statements.removeAll("\n");
|
||||
for (QString statement : statements) {
|
||||
if (!statement.endsWith(';')) {
|
||||
statement.append(';');
|
||||
}
|
||||
QSqlQuery query(QSqlDatabase::database(impl->connectionName));
|
||||
QSqlQuery query(QSqlDatabase::database(connectionName));
|
||||
query.prepare(statement);
|
||||
|
||||
if (!query.exec()) {
|
||||
@@ -433,16 +443,16 @@ uint64_t Query::changes() const {
|
||||
}
|
||||
|
||||
Transaction::Transaction(Database& db_, Mode mode)
|
||||
: db(db_) {
|
||||
: dbImpl(*db_.impl) {
|
||||
switch (mode) {
|
||||
case Deferred:
|
||||
db.exec("BEGIN DEFERRED TRANSACTION");
|
||||
dbImpl.exec("BEGIN DEFERRED TRANSACTION");
|
||||
break;
|
||||
case Immediate:
|
||||
db.exec("BEGIN IMMEDIATE TRANSACTION");
|
||||
dbImpl.exec("BEGIN IMMEDIATE TRANSACTION");
|
||||
break;
|
||||
case Exclusive:
|
||||
db.exec("BEGIN EXCLUSIVE TRANSACTION");
|
||||
dbImpl.exec("BEGIN EXCLUSIVE TRANSACTION");
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -459,12 +469,12 @@ Transaction::~Transaction() {
|
||||
|
||||
void Transaction::commit() {
|
||||
needRollback = false;
|
||||
db.exec("COMMIT TRANSACTION");
|
||||
dbImpl.exec("COMMIT TRANSACTION");
|
||||
}
|
||||
|
||||
void Transaction::rollback() {
|
||||
needRollback = false;
|
||||
db.exec("ROLLBACK TRANSACTION");
|
||||
dbImpl.exec("ROLLBACK TRANSACTION");
|
||||
}
|
||||
|
||||
} // namespace sqlite
|
||||
|
||||
Reference in New Issue
Block a user