-
-
Notifications
You must be signed in to change notification settings - Fork 360
/
migration.js
123 lines (106 loc) · 3.15 KB
/
migration.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
var fs = require('fs');
var path = require('path');
var inflection = require('./inflection');
var lpad = require('./util').lpad;
function formatPath(name) {
return process.cwd() + '/migrations/' + name + '.js';
}
function formatName(title, date) {
return formatDate(date) + '-' + formatTitle(title);
}
function formatDate(date) {
return [
date.getUTCFullYear(),
lpad(date.getUTCMonth() + 1, '0', 2),
lpad(date.getUTCDate(), '0', 2),
lpad(date.getUTCHours(), '0', 2),
lpad(date.getUTCMinutes(), '0', 2),
lpad(date.getUTCSeconds(), '0', 2)
].join('');
}
function formatTitle(title) {
return inflection.dasherize(title);
}
function parseDate(name) {
var date = new Date();
var match = name.match(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})-[^\.]+/);
date.setUTCFullYear(match[1]);
date.setUTCMonth(match[2] - 1);
date.setUTCDate(match[3]);
date.setUTCHours(match[4]);
date.setUTCMinutes(match[5]);
date.setUTCSeconds(match[6]);
return date;
}
function parseTitle(name) {
var match = name.match(/\d{14}-([^\.]+)/);
var dashed = match[1];
return inflection.humanize(dashed, true);
}
function writeMigrationRecord(db, migration, callback) {
db._runSql('INSERT INTO migrations (name, run_on) VALUES (?, ?)', [migration.name, new Date()], callback);
}
var migrationTemplate = [
"var dbm = require('db-migrate');",
"var type = dbm.dataType;",
"",
"exports.up = function(db, callback) {",
"",
"};",
"",
"exports.down = function(db, callback) {",
"",
"};",
""
].join("\n");
Migration = function() {
if (arguments.length == 2) {
this.title = arguments[0];
this.date = arguments[1];
this.name = formatName(this.title, this.date);
this.path = formatPath(this.name);
} else if (arguments.length == 1) {
this.path = arguments[0];
this.name = Migration.parseName(this.path);
this.date = parseDate(this.name);
this.title = parseTitle(this.name);
var migrationFile = require(this.path);
this._up = migrationFile.up;
this._down = migrationFile.down;
}
};
Migration.prototype.write = function(callback) {
fs.writeFile(this.path, migrationTemplate, callback);
};
Migration.prototype.up = function(db, callback) {
this._up(db, callback);
};
Migration.prototype.down = function(db, callback) {
this._down(db, callback);
};
Migration.parseName = function(path) {
var match = path.match(/(\d{14}-[^.]+)\.js/);
return match[1];
};
Migration.loadFromFilesystem = function(dir, callback) {
fs.readdir(dir, function(err, files) {
if (err) { callback(err); return; }
files = files.filter(function(file) {
return /\.js$/.test(file);
})
var migrations = files.sort().map(function(file) {
return new Migration(path.join(dir, file));
});
callback(null, migrations);
});
};
Migration.loadFromDatabase = function(dir, driver, callback) {
driver.all('SELECT * FROM migrations ORDER BY name DESC', function(err, dbResults) {
if (err) { callback(err); return; }
var migrations = dbResults.map(function(result) {
return new Migration(path.join(dir, result.name + '.js'));
});
callback(null, migrations);
});
};
module.exports = Migration;