Delete before forced bulk insert to fix broken migrations

This commit is contained in:
Scott Nonnenberg 2018-07-31 19:51:17 -07:00
parent 4d5894bf04
commit 0d13d437fe
2 changed files with 23 additions and 1 deletions

View file

@ -37,6 +37,7 @@ module.exports = {
saveMessage, saveMessage,
saveMessages, saveMessages,
removeMessage, removeMessage,
_removeMessages,
getUnreadByConversation, getUnreadByConversation,
removeAllMessagesInConversation, removeAllMessagesInConversation,
@ -220,6 +221,11 @@ async function removeMessage(id, { Message }) {
} }
} }
// Note: this method will not clean up external files, just delete from SQL
async function _removeMessages(ids) {
await channels.removeMessage(ids);
}
async function getMessageById(id, { Message }) { async function getMessageById(id, { Message }) {
const message = await channels.getMessageById(id); const message = await channels.getMessageById(id);
return new Message(message); return new Message(message);

View file

@ -1,7 +1,12 @@
/* global window, IDBKeyRange */ /* global window, IDBKeyRange */
const { includes, isFunction, isString, last } = require('lodash'); const { includes, isFunction, isString, last } = require('lodash');
const { saveMessages, saveUnprocesseds } = require('./data'); const {
saveMessages,
_removeMessages,
saveUnprocesseds,
removeUnprocessed,
} = require('./data');
const { const {
getMessageExportLastIndex, getMessageExportLastIndex,
setMessageExportLastIndex, setMessageExportLastIndex,
@ -34,6 +39,7 @@ async function migrateToSQL({ db, clearStores, handleDOMException }) {
const status = await migrateStoreToSQLite({ const status = await migrateStoreToSQLite({
db, db,
save: saveMessages, save: saveMessages,
remove: _removeMessages,
storeName: 'messages', storeName: 'messages',
handleDOMException, handleDOMException,
lastIndex, lastIndex,
@ -54,6 +60,7 @@ async function migrateToSQL({ db, clearStores, handleDOMException }) {
const status = await migrateStoreToSQLite({ const status = await migrateStoreToSQLite({
db, db,
save: saveUnprocesseds, save: saveUnprocesseds,
remove: removeUnprocessed,
storeName: 'unprocessed', storeName: 'unprocessed',
handleDOMException, handleDOMException,
lastIndex, lastIndex,
@ -74,6 +81,7 @@ async function migrateToSQL({ db, clearStores, handleDOMException }) {
async function migrateStoreToSQLite({ async function migrateStoreToSQLite({
db, db,
save, save,
remove,
storeName, storeName,
handleDOMException, handleDOMException,
lastIndex = null, lastIndex = null,
@ -85,6 +93,9 @@ async function migrateStoreToSQLite({
if (!isFunction(save)) { if (!isFunction(save)) {
throw new Error('Need save function!'); throw new Error('Need save function!');
} }
if (!isFunction(remove)) {
throw new Error('Need remove function!');
}
if (!isString(storeName)) { if (!isString(storeName)) {
throw new Error('Need storeName!'); throw new Error('Need storeName!');
} }
@ -151,6 +162,11 @@ async function migrateStoreToSQLite({
const { items, complete } = await queryPromise; const { items, complete } = await queryPromise;
if (items.length) { if (items.length) {
// Because of the force save and some failed imports, we're going to delete before
// we attempt to insert.
const ids = items.map(item => item.id);
await remove(ids);
// We need to pass forceSave parameter, because these items already have an // We need to pass forceSave parameter, because these items already have an
// id key. Normally, this call would be interpreted as an update request. // id key. Normally, this call would be interpreted as an update request.
await save(items, { forceSave: true }); await save(items, { forceSave: true });