X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Finitializers%2Fmigrator.js;h=9a6415b1ad6b9207ffbc6e1028198accc9a994d0;hb=2d7653dc8726185615bab66353c4e3fb8fbb5a5f;hp=9e5350e60a27dc44bb9fb63eba7d66553d5bab53;hpb=feb4bdfd9b46e87aadfa7c0d5338cde887d1f58c;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/initializers/migrator.js b/server/initializers/migrator.js index 9e5350e60..9a6415b1a 100644 --- a/server/initializers/migrator.js +++ b/server/initializers/migrator.js @@ -1,6 +1,8 @@ 'use strict' +const waterfall = require('async/waterfall') const eachSeries = require('async/eachSeries') +const fs = require('fs') const path = require('path') const constants = require('./constants') @@ -11,44 +13,127 @@ const migrator = { migrate: migrate } -function migrate (callback) { - db.Application.loadSqlSchemaVersion(function (err, actualVersion) { - if (err) return callback(err) - - // If there are a new mongo schemas - if (!actualVersion || actualVersion < constants.LAST_SQL_SCHEMA_VERSION) { - logger.info('Begin migrations.') +function migrate (finalCallback) { + waterfall([ - eachSeries(constants.MONGO_MIGRATION_SCRIPTS, function (entity, callbackEach) { - const versionScript = entity.version + function checkApplicationTableExists (callback) { + db.sequelize.getQueryInterface().showAllTables().asCallback(function (err, tables) { + if (err) return callback(err) - // Do not execute old migration scripts - if (versionScript <= actualVersion) return callbackEach(null) + // No tables, we don't need to migrate anything + // The installer will do that + if (tables.length === 0) return finalCallback(null) - // Load the migration module and run it - const migrationScriptName = entity.script - logger.info('Executing %s migration script.', migrationScriptName) + return callback(null) + }) + }, - const migrationScript = require(path.join(__dirname, 'migrations', migrationScriptName)) - migrationScript.up(function (err) { - if (err) return callbackEach(err) + function loadMigrationVersion (callback) { + db.Application.loadMigrationVersion(callback) + }, - // Update the new mongo version schema - db.Application.updateSqlSchemaVersion(versionScript, callbackEach) + function createMigrationRowIfNotExists (actualVersion, callback) { + if (actualVersion === null) { + db.Application.create({ + migrationVersion: 0 + }, function (err) { + return callback(err, 0) }) + } + + return callback(null, actualVersion) + }, + + function abortMigrationIfNotNeeded (actualVersion, callback) { + // No need migrations + if (actualVersion >= constants.LAST_MIGRATION_VERSION) return finalCallback(null) + + return callback(null, actualVersion) + }, + + function getMigrations (actualVersion, callback) { + // If there are a new migration scripts + logger.info('Begin migrations.') + + getMigrationScripts(function (err, migrationScripts) { + return callback(err, actualVersion, migrationScripts) + }) + }, + + function doMigrations (actualVersion, migrationScripts, callback) { + eachSeries(migrationScripts, function (entity, callbackEach) { + executeMigration(actualVersion, entity, callbackEach) }, function (err) { if (err) return callback(err) - logger.info('Migrations finished. New SQL version schema: %s', constants.LAST_SQL_SCHEMA_VERSION) + logger.info('Migrations finished. New migration version schema: %s', constants.LAST_MIGRATION_VERSION) return callback(null) }) - } else { - return callback(null) } - }) + ], finalCallback) } // --------------------------------------------------------------------------- module.exports = migrator +// --------------------------------------------------------------------------- + +function getMigrationScripts (callback) { + fs.readdir(path.join(__dirname, 'migrations'), function (err, files) { + if (err) return callback(err) + + const filesToMigrate = [] + + files.forEach(function (file) { + // Filename is something like 'version-blabla.js' + const version = file.split('-')[0] + filesToMigrate.push({ + version, + script: file + }) + }) + + return callback(err, filesToMigrate) + }) +} + +function executeMigration (actualVersion, entity, callback) { + const versionScript = parseInt(entity.version) + + // Do not execute old migration scripts + if (versionScript <= actualVersion) return callback(null) + + // Load the migration module and run it + const migrationScriptName = entity.script + logger.info('Executing %s migration script.', migrationScriptName) + + const migrationScript = require(path.join(__dirname, 'migrations', migrationScriptName)) + + db.sequelize.transaction().asCallback(function (err, t) { + if (err) return callback(err) + + const options = { + transaction: t, + queryInterface: db.sequelize.getQueryInterface(), + sequelize: db.sequelize, + Sequelize: db.Sequelize + } + migrationScript.up(options, function (err) { + if (err) { + t.rollback() + return callback(err) + } + + // Update the new migration version + db.Application.updateMigrationVersion(versionScript, t, function (err) { + if (err) { + t.rollback() + return callback(err) + } + + t.commit().asCallback(callback) + }) + }) + }) +}