Bug 1448044 - kinto-storage-adapter.js chokes on large updates r?glasserc
MozReview-Commit-ID: ncHwROrfHV
--- a/services/common/kinto-storage-adapter.js
+++ b/services/common/kinto-storage-adapter.js
@@ -261,30 +261,42 @@ class FirefoxAdapter extends Kinto.adapt
execute(callback, options = { preload: [] }) {
let result;
const conn = this._connection;
const collection = this.collection;
return conn.executeTransaction(async function doExecuteTransaction() {
// Preload specified records from DB, within transaction.
- const parameters = [
- collection,
- ...options.preload,
- ];
- const placeholders = options.preload.map(_ => "?");
- const stmt = statements.listRecordsById + "(" + placeholders.join(",") + ");";
- const rows = await conn.execute(stmt, parameters);
+
+ // if options.preload has more elements than the sqlite variable
+ // limit, split it up.
+ const limit = 100;
+ let preloaded = {};
+ let preload;
+ let more = options.preload;
+
+ while (more.length > 0) {
+ preload = more.slice(0, limit);
+ more = more.slice(limit, more.length);
- const preloaded = rows.reduce((acc, row) => {
- const record = JSON.parse(row.getResultByName("record"));
- acc[row.getResultByName("record_id")] = record;
- return acc;
- }, {});
+ const parameters = [
+ collection,
+ ...preload,
+ ];
+ const placeholders = preload.map(_ => "?");
+ const stmt = statements.listRecordsById + "(" + placeholders.join(",") + ");";
+ const rows = await conn.execute(stmt, parameters);
+ rows.reduce((acc, row) => {
+ const record = JSON.parse(row.getResultByName("record"));
+ acc[row.getResultByName("record_id")] = record;
+ return acc;
+ }, preloaded);
+ }
const proxy = transactionProxy(collection, preloaded);
result = callback(proxy);
for (let { statement, params } of proxy.operations) {
await conn.executeCached(statement, params);
}
}, conn.TRANSACTION_EXCLUSIVE).then(_ => result);
}