diff options
Diffstat (limited to 'src/imports/localstorage/plugin.cpp')
-rw-r--r-- | src/imports/localstorage/plugin.cpp | 55 |
1 files changed, 36 insertions, 19 deletions
diff --git a/src/imports/localstorage/plugin.cpp b/src/imports/localstorage/plugin.cpp index 84bcb756e8..9a0528a28f 100644 --- a/src/imports/localstorage/plugin.cpp +++ b/src/imports/localstorage/plugin.cpp @@ -322,6 +322,35 @@ static ReturnedValue qmlsqldatabase_executeSql(SimpleCallContext *ctx) return result.asReturnedValue(); } +struct TransactionRollback { + QSqlDatabase *db; + bool *inTransactionFlag; + + TransactionRollback(QSqlDatabase *database, bool *transactionFlag) + : db(database) + , inTransactionFlag(transactionFlag) + { + if (inTransactionFlag) + *inTransactionFlag = true; + } + + ~TransactionRollback() + { + if (inTransactionFlag) + *inTransactionFlag = false; + if (db) + db->rollback(); + } + + void clear() { + db = 0; + if (inTransactionFlag) + *inTransactionFlag = false; + inTransactionFlag = 0; + } +}; + + static ReturnedValue qmlsqldatabase_changeVersion(SimpleCallContext *ctx) { if (ctx->callData->argc < 2) @@ -349,7 +378,6 @@ static ReturnedValue qmlsqldatabase_changeVersion(SimpleCallContext *ctx) w->type = QQmlSqlDatabaseWrapper::Query; w->database = db; w->version = r->version; - w->inTransaction = true; bool ok = true; if (!!callback) { @@ -359,12 +387,10 @@ static ReturnedValue qmlsqldatabase_changeVersion(SimpleCallContext *ctx) ScopedCallData callData(scope, 1); callData->thisObject = engine->global(); callData->args[0] = w; - try { - callback->call(callData); - } catch (...) { - db.rollback(); - ctx->rethrowException(); - } + + TransactionRollback rollbackOnException(&db, &w->inTransaction); + callback->call(callData); + rollbackOnException.clear(); if (!db.commit()) { db.rollback(); V4THROW_SQL(SQLEXCEPTION_UNKNOWN_ERR,QQmlEngine::tr("SQL transaction failed")); @@ -373,8 +399,6 @@ static ReturnedValue qmlsqldatabase_changeVersion(SimpleCallContext *ctx) } } - w->inTransaction = false; - if (ok) { w->version = to_version; #ifndef QT_NO_SETTINGS @@ -408,22 +432,15 @@ static ReturnedValue qmlsqldatabase_transaction_shared(SimpleCallContext *ctx, b w->database = db; w->version = r->version; w->readonly = readOnly; - w->inTransaction = true; db.transaction(); if (callback) { ScopedCallData callData(scope, 1); callData->thisObject = engine->global(); callData->args[0] = w; - try { - callback->call(callData); - } catch (...) { - w->inTransaction = false; - db.rollback(); - ctx->rethrowException(); - } - - w->inTransaction = false; + TransactionRollback rollbackOnException(&db, &w->inTransaction); + callback->call(callData); + rollbackOnException.clear(); if (!db.commit()) db.rollback(); |