'use strict'; var async = require('async'); exports.up = function(db, callback) { async.series([ db.runSql.bind(db, 'ALTER TABLE mailboxes ADD COLUMN aliasDomain VARCHAR(128)'), function setAliasDomain(done) { db.all('SELECT * FROM mailboxes', function (error, mailboxes) { async.eachSeries(mailboxes, function (mailbox, iteratorDone) { if (!mailbox.aliasTarget) return iteratorDone(); db.runSql('UPDATE mailboxes SET aliasDomain=? WHERE name=? AND domain=?', [ mailbox.domain, mailbox.name, mailbox.domain ], iteratorDone); }, done); }); }, db.runSql.bind(db, 'ALTER TABLE mailboxes ADD CONSTRAINT mailboxes_aliasDomain_constraint FOREIGN KEY(aliasDomain) REFERENCES mail(domain)'), db.runSql.bind(db, 'ALTER TABLE mailboxes CHANGE aliasTarget aliasName VARCHAR(128)') ], callback); }; exports.down = function(db, callback) { async.series([ db.runSql.bind(db, 'ALTER TABLE mailboxes DROP FOREIGN KEY mailboxes_aliasDomain_constraint'), db.runSql.bind(db, 'ALTER TABLE mailboxes DROP COLUMN aliasDomain'), db.runSql.bind(db, 'ALTER TABLE mailboxes CHANGE aliasName aliasTarget VARCHAR(128)') ], callback); };