Revert "Remove legacy iterator protocol use in Zotero.DB"

Reverting this until we can use Fx60 for testing.

This reverts commit dfe412d448.
This commit is contained in:
Sylvester Keil 2018-07-30 10:18:11 +02:00
parent 2dce5f4842
commit 143fdd5f2b
No known key found for this signature in database
GPG key ID: 878933BCEAB25A10
2 changed files with 16 additions and 12 deletions

View file

@ -584,18 +584,22 @@ Zotero.DBConnection.prototype.queryAsync = Zotero.Promise.coroutine(function* (s
} }
var failed = false; var failed = false;
if (options && options.onRow) { if (options && options.onRow) {
// Wrap onRow to cancel iteration by default and reject the promise // Errors in onRow don't stop the query unless StopIteration is thrown
// on any error, which Sqlite.jsm does not do. onRow = function (row) {
onRow = function (row, cancel) {
try { try {
options.onRow(row, () => { options.onRow(row);
Zotero.debug("Query cancelled", 3);
cancel();
});
} }
catch (e) { catch (e) {
failed = e; // If the onRow throws a StopIteration, stop gracefully
cancel(); if (e instanceof StopIteration) {
Zotero.debug("Query cancelled", 3);
}
// Otherwise, mark the promise as rejected, which Sqlite.jsm doesn't do
// on a StopIteration by default
else {
failed = e;
}
throw StopIteration;
} }
} }
} }

View file

@ -151,16 +151,16 @@ describe("Zotero.DB", function() {
assert.equal(e.message, "Failed"); assert.equal(e.message, "Failed");
}); });
it("should stop gracefully if onRow is cancelled", function* () { it("should stop gracefully if onRow throws a StopIteration", function* () {
var i = 0; var i = 0;
var rows = []; var rows = [];
yield Zotero.DB.queryAsync( yield Zotero.DB.queryAsync(
"SELECT * FROM " + tmpTable, "SELECT * FROM " + tmpTable,
false, false,
{ {
onRow: function (row, cancel) { onRow: function (row) {
if (i > 0) { if (i > 0) {
return cancel(); throw StopIteration;
} }
rows.push(row.getResultByIndex(0)); rows.push(row.getResultByIndex(0));
i++; i++;