From 2060118e85223d3f3b8f38e7679e3fdf7553d295 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Thu, 25 Oct 2018 15:44:59 -0700 Subject: [PATCH] Remove messages/conversations/unprocessed IndexedDB object stores --- js/background.js | 22 ++++++++++++- ...ions_1_database_without_attachment_data.js | 32 +++++++++++++------ 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/js/background.js b/js/background.js index 714af3f24..5dcede75f 100644 --- a/js/background.js +++ b/js/background.js @@ -131,7 +131,10 @@ deleteAttachmentData, getCurrentVersion, } = window.Signal.Migrations; - const { Migrations0DatabaseWithAttachmentData } = window.Signal.Migrations; + const { + Migrations0DatabaseWithAttachmentData, + Migrations1DatabaseWithoutAttachmentData, + } = window.Signal.Migrations; const { Views } = window.Signal; // Implicitly used in `indexeddb-backbonejs-adapter`: @@ -388,6 +391,23 @@ Views.Initialization.setMessage(window.i18n('optimizingApplication')); + window.log.info('Running cleanup IndexedDB migrations...'); + // Close all previous connections to the database first + await Whisper.Database.close(); + + // Now we clean up IndexedDB database after extracting data from it + await Migrations1DatabaseWithoutAttachmentData.run({ + Backbone, + logger: window.log, + }); + + await Whisper.Database.close(); + + const latestDBVersion = _.last( + Migrations1DatabaseWithoutAttachmentData.migrations + ).version; + Whisper.Database.migrations[0].version = latestDBVersion; + window.log.info('Cleanup: starting...'); const messagesForCleanup = await window.Signal.Data.getOutgoingWithoutExpiresAt( { diff --git a/js/modules/migrations/migrations_1_database_without_attachment_data.js b/js/modules/migrations/migrations_1_database_without_attachment_data.js index 5377a67a8..2f2154201 100644 --- a/js/modules/migrations/migrations_1_database_without_attachment_data.js +++ b/js/modules/migrations/migrations_1_database_without_attachment_data.js @@ -1,25 +1,37 @@ /* global window */ -const { last } = require('lodash'); +const { last, includes } = require('lodash'); -const db = require('../database'); +const { open } = require('../database'); const settings = require('../settings'); const { runMigrations } = require('./run_migrations'); -// These are migrations for after the SQLCipher migration, currently not running +// These are cleanup migrations, to be run after migration to SQLCipher exports.migrations = [ { version: 20, migrate(transaction, next) { window.log.info('Migration 20'); - window.log.info( - 'Removing messages, unprocessed, and conversations object stores' - ); + + const { db } = transaction; // This should be run after things are migrated to SQLCipher - transaction.db.deleteObjectStore('messages'); - transaction.db.deleteObjectStore('unprocessed'); - transaction.db.deleteObjectStore('conversations'); + + // We check for existence first, because this removal was present in v1.17.0.beta.1, + // but reverted in v1.17.0-beta.3 + + if (includes(db.objectStoreNames, 'messages')) { + window.log.info('Removing messages store'); + db.deleteObjectStore('messages'); + } + if (includes(db.objectStoreNames, 'unprocessed')) { + window.log.info('Removing unprocessed store'); + db.deleteObjectStore('unprocessed'); + } + if (includes(db.objectStoreNames, 'conversations')) { + window.log.info('Removing conversations store'); + db.deleteObjectStore('conversations'); + } next(); }, @@ -48,7 +60,7 @@ exports.run = async ({ Backbone, logger } = {}) => { }; exports.getStatus = async ({ database } = {}) => { - const connection = await db.open(database.id, database.version); + const connection = await open(database.id, database.version); const isAttachmentMigrationComplete = await settings.isAttachmentMigrationComplete( connection );