Fix 'too many terms in compound SELECT' sync error

This commit is contained in:
Dan Stillman 2017-07-12 04:20:18 -04:00
parent 8f2508e167
commit aad12db2ff

View File

@ -593,15 +593,22 @@ Zotero.Sync.Data.Local = {
getCacheObjects: Zotero.Promise.coroutine(function* (objectType, libraryID, keyVersionPairs) {
if (!keyVersionPairs.length) return [];
var sql = "SELECT data FROM syncCache SC JOIN (SELECT "
+ keyVersionPairs.map(function (pair) {
Zotero.DataObjectUtilities.checkKey(pair[0]);
return "'" + pair[0] + "' AS key, " + parseInt(pair[1]) + " AS version";
}).join(" UNION SELECT ")
+ ") AS pairs ON (pairs.key=SC.key AND pairs.version=SC.version) "
+ "WHERE libraryID=? AND "
+ "syncObjectTypeID IN (SELECT syncObjectTypeID FROM syncObjectTypes WHERE name=?)";
var rows = yield Zotero.DB.columnQueryAsync(sql, [libraryID, objectType]);
var rows = [];
yield Zotero.Utilities.Internal.forEachChunkAsync(
keyVersionPairs,
240, // SQLITE_MAX_COMPOUND_SELECT defaults to 500
async function (chunk) {
var sql = "SELECT data FROM syncCache SC JOIN (SELECT "
+ chunk.map((pair) => {
Zotero.DataObjectUtilities.checkKey(pair[0]);
return "'" + pair[0] + "' AS key, " + parseInt(pair[1]) + " AS version";
}).join(" UNION SELECT ")
+ ") AS pairs ON (pairs.key=SC.key AND pairs.version=SC.version) "
+ "WHERE libraryID=? AND "
+ "syncObjectTypeID IN (SELECT syncObjectTypeID FROM syncObjectTypes WHERE name=?)";
rows.push(...await Zotero.DB.columnQueryAsync(sql, [libraryID, objectType]));
}
)
return rows.map(row => JSON.parse(row));
}),