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