From 4d5894bf046b31eabd71b3cc6a892a9f97056760 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Tue, 31 Jul 2018 19:29:51 -0700 Subject: [PATCH] Ensure that all multi-statement sql functionss are serialized --- app/sql.js | 54 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/app/sql.js b/app/sql.js index 000230c86..1347a049d 100644 --- a/app/sql.js +++ b/app/sql.js @@ -376,11 +376,17 @@ async function saveMessage(data, { forceSave } = {}) { } async function saveMessages(arrayOfMessages, { forceSave } = {}) { - await Promise.all([ - db.run('BEGIN TRANSACTION;'), - ...map(arrayOfMessages, message => saveMessage(message, { forceSave })), - db.run('COMMIT TRANSACTION;'), - ]); + let promise; + + db.serialize(() => { + promise = Promise.all([ + db.run('BEGIN TRANSACTION;'), + ...map(arrayOfMessages, message => saveMessage(message, { forceSave })), + db.run('COMMIT TRANSACTION;'), + ]); + }); + + await promise; } async function removeMessage(id) { @@ -569,13 +575,19 @@ async function saveUnprocessed(data, { forceSave } = {}) { } async function saveUnprocesseds(arrayOfUnprocessed, { forceSave } = {}) { - await Promise.all([ - db.run('BEGIN TRANSACTION;'), - ...map(arrayOfUnprocessed, unprocessed => - saveUnprocessed(unprocessed, { forceSave }) - ), - db.run('COMMIT TRANSACTION;'), - ]); + let promise; + + db.serialize(() => { + promise = Promise.all([ + db.run('BEGIN TRANSACTION;'), + ...map(arrayOfUnprocessed, unprocessed => + saveUnprocessed(unprocessed, { forceSave }) + ), + db.run('COMMIT TRANSACTION;'), + ]); + }); + + await promise; } async function getUnprocessedById(id) { @@ -624,12 +636,18 @@ async function removeAllUnprocessed() { } async function removeAll() { - await Promise.all([ - db.run('BEGIN TRANSACTION;'), - db.run('DELETE FROM messages;'), - db.run('DELETE FROM unprocessed;'), - db.run('COMMIT TRANSACTION;'), - ]); + let promise; + + db.serialize(() => { + promise = Promise.all([ + db.run('BEGIN TRANSACTION;'), + db.run('DELETE FROM messages;'), + db.run('DELETE FROM unprocessed;'), + db.run('COMMIT TRANSACTION;'), + ]); + }); + + await promise; } async function getMessagesNeedingUpgrade(limit, { maxVersion }) {