Rework DB transaction handling
Rollback callbacks weren't being properly called, and some other things were in the wrong place, particularly with nested transactions.
This commit is contained in:
parent
4cb5e7e4d5
commit
9e3e680be8
2 changed files with 158 additions and 67 deletions
83
test/tests/dbTest.js
Normal file
83
test/tests/dbTest.js
Normal file
|
@ -0,0 +1,83 @@
|
|||
describe("Zotero.DB", function() {
|
||||
describe("#executeTransaction()", function () {
|
||||
it("should roll back on error", function* () {
|
||||
yield Zotero.DB.queryAsync("CREATE TABLE tmpRollbackOnError (foo INT)");
|
||||
yield Zotero.DB.queryAsync("INSERT INTO tmpRollbackOnError VALUES (1)");
|
||||
try {
|
||||
yield Zotero.DB.executeTransaction(function* () {
|
||||
yield Zotero.DB.queryAsync("INSERT INTO tmpRollbackOnError VALUES (2)");
|
||||
throw 'Aborting transaction -- ignore';
|
||||
});
|
||||
}
|
||||
catch (e) {
|
||||
if (typeof e != 'string' || !e.startsWith('Aborting transaction')) throw e;
|
||||
}
|
||||
var count = yield Zotero.DB.valueQueryAsync("SELECT COUNT(*) FROM tmpRollbackOnError");
|
||||
assert.equal(count, 1);
|
||||
|
||||
var conn = yield Zotero.DB._getConnectionAsync();
|
||||
assert.isFalse(conn.transactionInProgress);
|
||||
|
||||
yield Zotero.DB.queryAsync("DROP TABLE tmpRollbackOnError");
|
||||
});
|
||||
|
||||
it("should run onRollback callbacks", function* () {
|
||||
var callbackRan = false;
|
||||
yield Zotero.DB.queryAsync("CREATE TABLE tmpOnRollback (foo INT)");
|
||||
try {
|
||||
yield Zotero.DB.executeTransaction(
|
||||
function* () {
|
||||
yield Zotero.DB.queryAsync("INSERT INTO tmpOnRollback VALUES (1)");
|
||||
throw 'Aborting transaction -- ignore';
|
||||
},
|
||||
{
|
||||
onRollback: function () {
|
||||
callbackRan = true;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
catch (e) {
|
||||
if (typeof e != 'string' || !e.startsWith('Aborting transaction')) throw e;
|
||||
}
|
||||
assert.ok(callbackRan);
|
||||
|
||||
yield Zotero.DB.queryAsync("DROP TABLE tmpOnRollback");
|
||||
});
|
||||
|
||||
it("should run onRollback callbacks for nested transactions", function* () {
|
||||
var callback1Ran = false;
|
||||
var callback2Ran = false;
|
||||
yield Zotero.DB.queryAsync("CREATE TABLE tmpOnNestedRollback (foo INT)");
|
||||
try {
|
||||
yield Zotero.DB.executeTransaction(function* () {
|
||||
yield Zotero.DB.queryAsync("INSERT INTO tmpOnNestedRollback VALUES (1)");
|
||||
yield Zotero.DB.executeTransaction(
|
||||
function* () {
|
||||
yield Zotero.DB.queryAsync("INSERT INTO tmpOnNestedRollback VALUES (2)");
|
||||
|
||||
throw 'Aborting transaction -- ignore';
|
||||
},
|
||||
{
|
||||
onRollback: function () {
|
||||
callback1Ran = true;
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
{
|
||||
onRollback: function () {
|
||||
callback2Ran = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
catch (e) {
|
||||
if (typeof e != 'string' || !e.startsWith('Aborting transaction')) throw e;
|
||||
}
|
||||
assert.ok(callback1Ran);
|
||||
assert.ok(callback2Ran);
|
||||
|
||||
yield Zotero.DB.queryAsync("DROP TABLE tmpOnNestedRollback");
|
||||
});
|
||||
})
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue