Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added dry-run option #64

Merged
merged 1 commit into from Jan 22, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Expand Up @@ -21,6 +21,7 @@ Options:
--env, -e The environment to run the migrations under. [default: "dev"]
--migrations-dir, -m The directory containing your migration files. [default: "./migrations"]
--count, -c Max number of migrations to run.
--dry-run Prints the SQL but doesn't run it. [boolean]
--verbose, -v Verbose mode. [default: false]
--config Location of the database.json file. [default: "./database.json"]
```
Expand Down
10 changes: 9 additions & 1 deletion bin/db-migrate
Expand Up @@ -11,7 +11,7 @@ var index = require('../index');
var log = require('../lib/log');

process.on('uncaughtException', function(err) {
log.error(err);
log.error(err.stack);
process.exit(1);
});

Expand All @@ -34,6 +34,9 @@ var argv = optimist
.alias('c', 'count')
.string('c')

.describe('dry-run', "Prints the SQL but doesn't run it.")
.boolean('dry-run')

.describe('verbose', 'Verbose mode.')
.alias('v', 'verbose')
.boolean('v')
Expand All @@ -53,6 +56,10 @@ if (argv.help || argv._.length == 0) {
}

global.verbose = argv.verbose;
global.dryRun = argv['dry-run'];
if(global.dryRun) {
log.info('dry run');
}

function createMigrationDir(dir, callback) {
fs.stat(dir, function(err, stat) {
Expand Down Expand Up @@ -102,6 +109,7 @@ function executeUp() {
migrator.migrationsDir = path.resolve(argv['migrations-dir']);
migrator.driver.createMigrationsTable(function(err) {
assert.ifError(err);
log.verbose('migration table created');
migrator.up(argv, onComplete.bind(this, migrator));
});
});
Expand Down
5 changes: 3 additions & 2 deletions lib/driver/base.js
Expand Up @@ -61,6 +61,7 @@ module.exports = Base = Class.extend({
},

createTable: function(tableName, options, callback) {
log.verbose('creating table:', tableName);
var columnSpecs = options;
var tableOptions = {};

Expand Down Expand Up @@ -206,11 +207,11 @@ module.exports = Base = Class.extend({
// sql, params, callback
// sql, callback
runSql: function() {
throw new Error('not yet implemented');
throw new Error('not implemented');
},

all: function(sql, params, callback) {
throw new Error('not yet implemented');
throw new Error('not implemented');
},

escape: function(str) {
Expand Down
8 changes: 7 additions & 1 deletion lib/driver/index.js
@@ -1,11 +1,17 @@
var log = require('../log');

exports.connect = function(config, callback) {
if (config.driver === undefined) {
throw new Error('config must include a driver key specifing which driver to use');
}

var driver = require('./' + config.driver);
var req = './' + config.driver;
log.verbose('require:', req);
var driver = require(req);
log.verbose('connecting');
driver.connect(config, function(err, db) {
if (err) { callback(err); return; }
log.verbose('connected');
callback(null, db);
});
};
10 changes: 8 additions & 2 deletions lib/driver/mysql.js
Expand Up @@ -3,6 +3,7 @@ var moment = require('moment');
var mysql = require('mysql');
var Base = require('./base');
var type = require('../data_type');
var log = require('../log');

var MysqlDriver = Base.extend({
init: function(connection) {
Expand Down Expand Up @@ -120,11 +121,16 @@ var MysqlDriver = Base.extend({
},

runSql: function() {
this.connection.query.apply(this.connection, arguments);
var callback = arguments[arguments.length - 1];
log.sql.apply(null, arguments);
if(global.dryRun) {
return callback();
}
return this.connection.query.apply(this.connection, arguments);
},

all: function() {
this.connection.query.apply(this.connection, arguments);
return this.connection.query.apply(this.connection, arguments);
},

close: function() {
Expand Down
8 changes: 7 additions & 1 deletion lib/driver/pg.js
Expand Up @@ -162,6 +162,8 @@ var PgDriver = Base.extend({
},

runSql: function() {
var callback = arguments[arguments.length - 1];

params = arguments;
if (params.length > 2){
// We have parameters, but db-migrate uses "?" for param substitutions.
Expand All @@ -174,7 +176,11 @@ var PgDriver = Base.extend({
new_param.push(param[param.length-1]);
params[0] = new_param.join('');
}
log.verbose('pg.runSql', params);

log.sql.apply(null, params);
if(global.dryRun) {
return callback();
}
this.connection.query.apply(this.connection, params);
},

Expand Down
7 changes: 7 additions & 0 deletions lib/driver/sqlite3.js
@@ -1,6 +1,7 @@
var util = require('util');
var sqlite3 = require('sqlite3').verbose();
var Base = require('./base');
var log = require('../log');
var type = require('../data_type');

var defaultMode = sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE;
Expand Down Expand Up @@ -51,6 +52,12 @@ var Sqlite3Driver = Base.extend({
//},

runSql: function() {
var callback = arguments[arguments.length - 1];
log.sql.apply(null, arguments);
if(global.dryRun) {
return callback();
}

this.connection.run.apply(this.connection, arguments);
},

Expand Down
20 changes: 20 additions & 0 deletions lib/log.js
@@ -1,6 +1,26 @@
exports.info = console.info.bind(console, '[INFO]');
exports.warn = console.warn.bind(console, '[WARN]');
exports.error = console.error.bind(console, '[ERROR]');
exports.sql = function(sql) {
if (global.dryRun || global.verbose) {
var args = Array.prototype.slice.call(arguments).slice(1);
args = args.slice(0, args.length - 1);
if(global.verbose) {
if(args.length > 0) {
console.log('[SQL]', sql, args);
} else {
console.log('[SQL]', sql);
}
}
if (global.dryRun) {
if(args.length > 0) {
console.log(sql, args);
} else {
console.log(sql);
}
}
}
};
exports.verbose = function() {
if (global.verbose) {
console.log.bind(console, '[INFO]').apply(console, arguments);
Expand Down
3 changes: 3 additions & 0 deletions lib/migration.js
Expand Up @@ -3,6 +3,7 @@ var path = require('path');
var inflection = require('./inflection');
var lpad = require('./util').lpad;
var config = require('./config');
var log = require('./log');

function formatPath(dir, name) {
return path.join(dir, name + '.js');
Expand Down Expand Up @@ -99,6 +100,7 @@ Migration.parseName = function(path) {
};

Migration.loadFromFilesystem = function(dir, callback) {
log.verbose('loading migrations from dir', dir);
fs.readdir(dir, function(err, files) {
if (err) { callback(err); return; }
files = files.filter(function(file) {
Expand All @@ -112,6 +114,7 @@ Migration.loadFromFilesystem = function(dir, callback) {
};

Migration.loadFromDatabase = function(dir, driver, callback) {
log.verbose('loading migrations from database');
driver.all('SELECT * FROM migrations ORDER BY name DESC', function(err, dbResults) {
if (err) { callback(err); return; }
var migrations = dbResults.map(function(result) {
Expand Down
10 changes: 6 additions & 4 deletions lib/migrator.js
Expand Up @@ -108,10 +108,10 @@ Migrator.prototype = {

upToBy: function(partialName, count, callback) {
var self = this;
var all = Migration.loadFromFilesystem(self.migrationsDir, function(err, allMigrations) {
Migration.loadFromFilesystem(self.migrationsDir, function(err, allMigrations) {
if (err) { callback(err); return; }

var complete = Migration.loadFromDatabase(self.migrationsDir, self.driver, function(err, completedMigrations) {
Migration.loadFromDatabase(self.migrationsDir, self.driver, function(err, completedMigrations) {
if (err) { callback(err); return; }
var toRun = filterUp(allMigrations, completedMigrations, partialName, count);

Expand All @@ -122,6 +122,7 @@ Migrator.prototype = {
}

async.forEachSeries(toRun, function(migration, next) {
log.verbose('preparing to run up migration:', migration.name);
self.driver.startMigration(function() {
self.up(migration.up.bind(migration), function(err) {
if (err) { callback(err); return; }
Expand All @@ -143,8 +144,8 @@ Migrator.prototype = {

downToBy: function(partialName, count, callback) {
var self = this;
var complete = Migration.loadFromDatabase(self.migrationsDir, self.driver, function(err, completedMigrations) {
if (err) { callback(err); return; }
Migration.loadFromDatabase(self.migrationsDir, self.driver, function(err, completedMigrations) {
if (err) { return callback(err); }

var toRun = filterDown(completedMigrations, partialName, count);

Expand All @@ -155,6 +156,7 @@ Migrator.prototype = {
}

async.forEachSeries(toRun, function(migration, next) {
log.verbose('preparing to run down migration:', migration.name);
self.down(migration.down.bind(migration), function(err) {
if (err) { callback(err); return; }
self.deleteMigrationRecord(migration, next);
Expand Down