Conditionally run post-attachment migrations
Introduce placeholder migrations for Backbone models so they never implicitly run migrations whenever they are `fetch`ed. We prefer to run our migrations explicitly upon app startup and then let Backbone models be (slightly) dumb(er) models, without inadvertently triggering migrations.pull/1/head
parent
887bd83852
commit
805031ade8
@ -0,0 +1,23 @@
|
|||||||
|
const Migrations0DatabaseWithAttachmentData =
|
||||||
|
require('./migrations_0_database_with_attachment_data');
|
||||||
|
const Migrations1DatabaseWithoutAttachmentData =
|
||||||
|
require('./migrations_1_database_without_attachment_data');
|
||||||
|
|
||||||
|
|
||||||
|
exports.getPlaceholderMigrations = () => {
|
||||||
|
const last0MigrationVersion =
|
||||||
|
Migrations0DatabaseWithAttachmentData.getLatestVersion();
|
||||||
|
const last1MigrationVersion =
|
||||||
|
Migrations1DatabaseWithoutAttachmentData.getLatestVersion();
|
||||||
|
|
||||||
|
const lastMigrationVersion = last1MigrationVersion || last0MigrationVersion;
|
||||||
|
|
||||||
|
return [{
|
||||||
|
version: lastMigrationVersion,
|
||||||
|
migrate() {
|
||||||
|
throw new Error('Unexpected invocation of placeholder migration!' +
|
||||||
|
'\n\nMigrations must explicitly be run upon application startup instead' +
|
||||||
|
' of implicitly via Backbone IndexedDB adapter at any time.');
|
||||||
|
},
|
||||||
|
}];
|
||||||
|
};
|
@ -1,15 +1,50 @@
|
|||||||
|
const last = require('lodash/last');
|
||||||
|
|
||||||
|
const db = require('../database');
|
||||||
|
const settings = require('../settings');
|
||||||
const { runMigrations } = require('./run_migrations');
|
const { runMigrations } = require('./run_migrations');
|
||||||
|
|
||||||
|
|
||||||
exports.migrations = [
|
// NOTE: Add new migrations that need to traverse entire database, e.g. messages
|
||||||
|
// store, here. These will only run after attachment migration has completed in
|
||||||
|
// the background:
|
||||||
|
const migrations = [
|
||||||
// {
|
// {
|
||||||
// version: 18,
|
// version: 0,
|
||||||
// async migrate(transaction, next) {
|
// migrate(transaction, next) {
|
||||||
// console.log('Migration 18');
|
|
||||||
// console.log('Attachments stored on disk');
|
|
||||||
// next();
|
// next();
|
||||||
// },
|
// },
|
||||||
// },
|
// },
|
||||||
];
|
];
|
||||||
|
|
||||||
exports.run = runMigrations;
|
exports.run = async ({ Backbone, database } = {}) => {
|
||||||
|
const { canRun } = await exports.getStatus({ database });
|
||||||
|
if (!canRun) {
|
||||||
|
throw new Error('Cannot run migrations on database without attachment data');
|
||||||
|
}
|
||||||
|
|
||||||
|
await runMigrations({ Backbone, database });
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.getStatus = async ({ database } = {}) => {
|
||||||
|
const connection = await db.open(database.id, database.version);
|
||||||
|
const isAttachmentMigrationComplete =
|
||||||
|
await settings.isAttachmentMigrationComplete(connection);
|
||||||
|
const hasMigrations = migrations.length > 0;
|
||||||
|
|
||||||
|
const canRun = isAttachmentMigrationComplete && hasMigrations;
|
||||||
|
return {
|
||||||
|
isAttachmentMigrationComplete,
|
||||||
|
hasMigrations,
|
||||||
|
canRun,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.getLatestVersion = () => {
|
||||||
|
const lastMigration = last(migrations);
|
||||||
|
if (!lastMigration) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return lastMigration.version;
|
||||||
|
};
|
||||||
|
Loading…
Reference in New Issue