不要怂,就是干,撸起袖子干!

Commit 60a43179 by sdepold

successfully observing queryInterface for making async handling in migrations unnecessary

1 parent 8704a6e1
Showing with 76 additions and 43 deletions
var moment = require("moment") var moment = require("moment")
, Utils = require("./utils") , Utils = require("./utils")
, DataTypes = require("./data-types")
, QueryInterface = require("./query-interface")
module.exports = (function() { module.exports = (function() {
var Migration = function(path) { var Migration = function(migrator, path) {
var split = path.split('/') var split = path.split('/')
this.path = path this.migrator = migrator
this.filename = Utils._.last(this.path.split('/')) this.path = path
this.date = Migration.stringToDate(split[split.length - 1]) this.filename = Utils._.last(this.path.split('/'))
this.date = Migration.stringToDate(split[split.length - 1])
this.queryInterface = this.migrator.queryInterface
this.undoneMethods = 0
} }
/////////////// ///////////////
...@@ -34,8 +39,21 @@ module.exports = (function() { ...@@ -34,8 +39,21 @@ module.exports = (function() {
// member ///// // member /////
/////////////// ///////////////
Migration.prototype.execute = function() { Migration.prototype.execute = function(options) {
var self = this
return new Utils.CustomEventEmitter(function(emitter) {
options = Utils._.extend({
method: 'up'
}, options || {})
extendMigrationWithQueryInterfaceMethods.call(self, function allMethodsDone() {
emitter.emit('success', null)
})
var methods = require(self.path)
methods[options.method].call(null, self, DataTypes)
}).run()
} }
Migration.prototype.isBefore = function(dateString, options) { Migration.prototype.isBefore = function(dateString, options) {
...@@ -58,5 +76,35 @@ module.exports = (function() { ...@@ -58,5 +76,35 @@ module.exports = (function() {
return options.withoutEqual ? (date < this.date) : (date <= this.date) return options.withoutEqual ? (date < this.date) : (date <= this.date)
} }
// extends the Migration prototype with all methods of QueryInterface.prototype
// with additional tracking of start and finish. this is done in order to minimize
// asynchronous handling in migrations
var extendMigrationWithQueryInterfaceMethods = function(callback) {
var self = this
for(var method in QueryInterface.prototype) {
(function(_method) {
self[_method] = function() {
var emitter = self.QueryInterface
, args = Utils._.map(arguments, function(arg, _) { return arg })
self.undoneMethods++
// bind listeners to the query interface
// the event will have the same name like the method
self.queryInterface.on(_method, function(err) {
self.undoneMethods--
if(err)
throw new Error(err)
else
(self.undoneMethods == 0) && callback && callback()
})
self.queryInterface[_method].apply(self.queryInterface, args)
}
})(method)
}
}
return Migration return Migration
})() })()
...@@ -3,14 +3,12 @@ const fs = require("fs") ...@@ -3,14 +3,12 @@ const fs = require("fs")
, moment = require("moment") , moment = require("moment")
var Utils = require("./utils") var Utils = require("./utils")
, DataTypes = require("./data-types")
, QueryInterface = require("./query-interface")
, Migration = require("./migration") , Migration = require("./migration")
, DataTypes = require("./data-types")
module.exports = (function() { module.exports = (function() {
var Migrator = function(sequelize, options) { var Migrator = function(sequelize, options) {
this.sequelize = sequelize this.sequelize = sequelize
this.queryInterface = sequelize.getQueryInterface()
this.options = Utils._.extend({ this.options = Utils._.extend({
path: __dirname + '/../migrations', path: __dirname + '/../migrations',
from: null, from: null,
...@@ -18,13 +16,30 @@ module.exports = (function() { ...@@ -18,13 +16,30 @@ module.exports = (function() {
}, options || {}) }, options || {})
} }
Object.defineProperty(Migrator.prototype, "queryInterface", {
get: function() {
return this.sequelize.getQueryInterface()
}
})
Migrator.prototype.migrate = function() { Migrator.prototype.migrate = function() {
var self = this var self = this
return new Utils.CustomEventEmitter(function(emitter) { return new Utils.CustomEventEmitter(function(emitter) {
self.getUndoneMigrations(function(migrations) { self.getUndoneMigrations(function(migrations) {
console.log(migrations) var chainer = new Utils.QueryChainer
emitter.emit('success')
migrations.forEach(function(migration) {
chainer.add(migration.execute())
})
chainer
.run()
.success(function() {
emitter.emit('success', null)
}).error(function(err) {
emitter.emit('failure', err)
})
}) })
}).run() }).run()
} }
...@@ -44,7 +59,7 @@ module.exports = (function() { ...@@ -44,7 +59,7 @@ module.exports = (function() {
var migrationFiles = fs.readdirSync(this.options.path) var migrationFiles = fs.readdirSync(this.options.path)
var migrations = migrationFiles.map(function(file) { var migrations = migrationFiles.map(function(file) {
return new Migration(self.options.path + '/' + file) return new Migration(self, self.options.path + '/' + file)
}) })
if(this.options.from) { if(this.options.from) {
...@@ -91,12 +106,6 @@ module.exports = (function() { ...@@ -91,12 +106,6 @@ module.exports = (function() {
}).run() }).run()
} }
Migrator.prototype.executeMigration = function(path, method) {
console.log(path)
var migration = require(path)
migration[method || 'up'](this.queryInterface, DataTypes)
}
// private // private
var getLastMigrationIdFromDatabase = function() { var getLastMigrationIdFromDatabase = function() {
...@@ -127,29 +136,5 @@ module.exports = (function() { ...@@ -127,29 +136,5 @@ module.exports = (function() {
return moment(getFormattedDateString(s), "YYYYMMDDHHmmss") return moment(getFormattedDateString(s), "YYYYMMDDHHmmss")
} }
var observeQueryInterfaceForSuccess = function(callback) {
var self = this
for(var method in QueryInterface.prototype) {
self[method] = function() {
var emitter = self.queryInterface
// bind listeners to the query interface
// the event will have the same name like the method
self.queryInterface.on(method, function(err) {
if(err) {
throw new Error(err)
} else {
}
})
}
}
console.log(proto)
//this.queryInterface.prototype.each ...
}
return Migrator return Migrator
})() })()
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!