Bug 1448044 - kinto-storage-adapter.js chokes on large updates r?glasserc draft
authorMark Goodwin <mgoodwin@mozilla.com>
Thu, 12 Apr 2018 15:56:52 +0100
changeset 781146 7388afbb81f9aff58eb62d1184ef678374c7fd7c
parent 771705 9f0acb32263cb463975a1820307edc7149a2dd0c
push id106218
push userbmo:mgoodwin@mozilla.com
push dateThu, 12 Apr 2018 15:09:57 +0000
reviewersglasserc
bugs1448044
milestone61.0a1
Bug 1448044 - kinto-storage-adapter.js chokes on large updates r?glasserc MozReview-Commit-ID: ncHwROrfHV
services/common/kinto-storage-adapter.js
--- 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);
   }