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

Commit 2c5b46e9 by Mick Hansen

Merge pull request #2056 from komola/fix/1409

Fix #1409
2 parents 47aa2f86 b81c158c
Showing with 98 additions and 15 deletions
...@@ -97,6 +97,12 @@ module.exports = (function() { ...@@ -97,6 +97,12 @@ module.exports = (function() {
callback && callback(null, result); callback && callback(null, result);
}; };
var filterByMigrationId = function(migrations, migrationIds, callback) {
var result = migrations.filter(function(migration) { return migrationIds.indexOf(migration.migrationId) === -1;
});
callback && callback(null, result);
};
var migrationFiles = fs.readdirSync(this.options.path).filter(function(file) { var migrationFiles = fs.readdirSync(this.options.path).filter(function(file) {
return self.options.filesFilter.test(file); return self.options.filesFilter.test(file);
}); });
...@@ -109,6 +115,22 @@ module.exports = (function() { ...@@ -109,6 +115,22 @@ module.exports = (function() {
return parseInt(a.filename.split('-')[0]) - parseInt(b.filename.split('-')[0]); return parseInt(a.filename.split('-')[0]) - parseInt(b.filename.split('-')[0]);
}); });
var existingMigrationIds = migrations.map(function(migration) {
return migration.migrationId;
});
var getPendingMigrations = function(callback) {
getAllMigrationIdsFromDatabase.call(self).success(function(allMigrationIds) {
allMigrationIds = allMigrationIds.map(function(migration) {
return parseInt(migration.to);
});
if (allMigrationIds) {
filterByMigrationId(migrations, allMigrationIds, callback);
}
});
};
if (this.options.from) { if (this.options.from) {
filterFrom(migrations, this.options.from, function(err, migrations) { filterFrom(migrations, this.options.from, function(err, migrations) {
if (self.options.to) { if (self.options.to) {
...@@ -118,24 +140,13 @@ module.exports = (function() { ...@@ -118,24 +140,13 @@ module.exports = (function() {
} }
}); });
} else { } else {
getLastMigrationIdFromDatabase.call(this).success(function(lastMigrationId) { getPendingMigrations(function(err, pendingMigrations) {
if (lastMigrationId) {
filterFrom(migrations, lastMigrationId, function(err, migrations) {
if (self.options.to) {
filterTo(migrations, self.options.to, callback);
} else {
callback && callback(null, migrations);
}
}, { withoutEqual: true });
} else {
if (self.options.to) { if (self.options.to) {
filterTo(migrations, self.options.to, callback); filterTo(pendingMigrations, self.options.to, callback);
} else {
callback && callback(null, migrations);
} }
else {
callback && callback(err, pendingMigrations);
} }
}).error(function(err) {
callback && callback(err, null);
}); });
} }
}; };
...@@ -222,6 +233,31 @@ module.exports = (function() { ...@@ -222,6 +233,31 @@ module.exports = (function() {
// private // private
var getAllMigrationIdsFromDatabase = Migrator.prototype.getAllMigrationIdsFromDatabase = function() {
var self = this;
return new Utils.CustomEventEmitter(function(emitter) {
self
.findOrCreateSequelizeMetaDAO()
.success(function(SequelizeMeta) {
SequelizeMeta
.findAll({
order: 'id DESC',
attributes: ['to']
})
.success(function(meta) {
emitter.emit('success', meta ? meta : null);
})
.error(function(err) {
emitter.emit('error', err);
});
})
.error(function(err) {
emitter.emit('error', err);
});
}).run();
};
var getLastMigrationFromDatabase = Migrator.prototype.getLastMigrationFromDatabase = function() { var getLastMigrationFromDatabase = Migrator.prototype.getLastMigrationFromDatabase = function() {
var self = this; var self = this;
......
...@@ -107,6 +107,21 @@ describe(Support.getTestDialectTeaser("Migrator"), function() { ...@@ -107,6 +107,21 @@ describe(Support.getTestDialectTeaser("Migrator"), function() {
}) })
}) })
}) })
it("returns pending migrations", function(done) {
this.init(undefined, function(migrator, SequelizeMeta) {
SequelizeMeta.create({ from: 20111117063700, to: 20111117063700 }).success(function() {
SequelizeMeta.create({ from: 20111117063700, to: 20130909185621 }).success(function() {
migrator.getUndoneMigrations(function(err, migrations) {
expect(err).to.be.null
expect(migrations).to.have.length(14)
expect(migrations[0].filename).to.equal('20111130161100-emptyMigration.js')
done()
})
})
})
})
})
}) })
describe('migrations', function() { describe('migrations', function() {
...@@ -184,6 +199,38 @@ describe(Support.getTestDialectTeaser("Migrator"), function() { ...@@ -184,6 +199,38 @@ describe(Support.getTestDialectTeaser("Migrator"), function() {
.error(function(err) { console.log(err) }) .error(function(err) { console.log(err) })
}) })
}) })
it("executes pending migrations", function(done) {
var self = this;
var options = {
path: __dirname + '/assets/migrations',
to: 20111117063700
};
var migrator = new Migrator(this.sequelize, options)
migrator
.migrate()
.success(function() {
self.init({ to: 20111205064000 }, function(migrator, SequelizeMeta) {
SequelizeMeta.create({ from: 20111205064000, to: 20111205064000 }).success(function() {
migrator
.migrate()
.success(function() {
SequelizeMeta.findAll().success(function(meta) {
expect(meta.length).to.equal(3);
done();
});
})
.error(function(err) { console.log(err) })
})
})
})
.error(function(err) { console.log(err) })
})
}) })
describe('renameTable', function() { describe('renameTable', function() {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!