def _task((vers,desc)): sql = ( """ INSERT INTO `%s` (version, description) VALUES ('%s','%s'); """ ) % (table, vers, desc) task = tempfile(sql) >> db_task(dbcmd) return logtask("Reverting database version to %s" % vers, logger, task)
def undo(logger, dbcmd, schema_dir, table="_version_"): def _exec(file): return ( (openfile(file) >> db_task(dbcmd)) >> always(db_revert_for_schema_file(logger,dbcmd,file)) ) def _execfiles(files): return Task.all([_exec(f) for f in files]) listtask = schema_version_undo_files(logger, dbcmd, schema_dir, table) task = listtask >> _execfiles return logtask("Undo last migration", logger, task)
def do(logger, dbcmd, schema_dir, table="_version_" ): def _exec(file): return ( (openfile(file) >> db_task(dbcmd)) >> always(db_update_for_schema_file(logger,dbcmd,file)) ) def _execfiles(files): return Task.all([_exec(f) for f in files]) inittask = init(logger, dbcmd, table) checktask = check(logger, dbcmd, schema_dir, table) task = (inittask >> always(checktask)) >> _execfiles return logtask("Running local migrations", logger, task)
def init(logger, dbcmd, table="_version_" ): sql = ( """ CREATE TABLE IF NOT EXISTS `%s` ( id INT(11) AUTO_INCREMENT PRIMARY KEY, version CHAR(14), description TEXT NULL, commit CHAR(40), revert BIT DEFAULT 0 ); """ ) % (table) return logtask("Preparing database", logger, tempfile(sql) >> db_task(dbcmd) )
def check(logger, dbcmd, schema_dir, table="_version_" ): matcher = flip(applyf)(split_schema_files_at_version) snd = lambda (_,x): x task = Task.all([ db_current_version(logger,dbcmd,table), schema_files(logger,schema_dir) ]).fmap( matcher ) msgs = lambda (previous,pending): ( [ "no schema migrations applied" if len(previous) == 0 else ( "schema migrations applied: %d\nlatest: %s" % ( len(previous), previous[-1] ) ), "no pending schema migrations found" if len(pending) == 0 else ( "pending schema migrations found: %d\n%s" % ( len(pending), "\n".join([os.path.basename(f) for f in pending]) ) ) ] ) return logtask("Checking current state", logger, logresult_info(msgs, logger, task).fmap(snd) )