alterSchema: function(builder, trx) {
var connection = trx.connection;
var currentCol, command;
return when.all([
nodefn.call(connection.all.bind(connection), 'PRAGMA table_info(' + builder.table + ')', []),
nodefn.call(connection.all.bind(connection), 'SELECT name, sql FROM sqlite_master WHERE type="table" AND name="' + builder.table + '"', [])
])
.tap(function(resp) {
var pragma = resp[0];
var sql = resp[1][0];
command = builder.commands[builder.currentIndex];
if (!(currentCol = _.findWhere(pragma, {name: command.from}))) {
throw new Error('The column ' + command.from + ' is not in the current table');
}
return nodefn.call(connection.all.bind(connection), 'ALTER TABLE ' + sql.name + ' RENAME TO __migrate__' + sql.name);
}).spread(function(pragma, sql) {
sql = sql[0];
var currentColumn = '"' + command.from + '" ' + currentCol.type;
var newColumn = '"' + command.to + '" ' + currentCol.type;
if (sql.sql.indexOf(currentColumn) === -1) {
return trx.reject('Unable to find the column to change');
}
return when.all([
nodefn.call(connection.all.bind(connection), sql.sql.replace(currentColumn, newColumn)),
nodefn.call(connection.all.bind(connection), 'SELECT * FROM "__migrate__' + sql.name + '"'),
]);
}).spread(function(createTable, selected) {
var qb = new Builder(builder.knex).transacting(trx);
qb.table = builder.table;
return when.all([
qb.insert(_.map(selected, function(row) {
row[command.to] = row[command.from];
return _.omit(row, command.from);
})),
nodefn.call(connection.all.bind(connection), 'DROP TABLE "__migrate__' + builder.table + '"')
]);
}).then(trx.commit, trx.rollback);
}
});
exports.grammar = _.defaults({
handleResponse: function(builder, resp) {
var ctx = resp[1]; resp = resp[0];
if (builder.type === 'select') {
resp = Helpers.skim(resp);
} else if (builder.type === 'insert') {
resp = [ctx.lastID];
} else if (builder.type === 'delete' || builder.type === 'update') {
resp = ctx.changes;
}
return resp;
}
}, SQLite3Base.grammar);
exports.schemaGrammar = _.defaults({
handleResponse: function(builder, resp) {
SQLite3