Skip to content

Commit

Permalink
[#63] Implemented rollback and added test case.
Browse files Browse the repository at this point in the history
  • Loading branch information
jfacorro committed Sep 17, 2014
1 parent 4d7a4d4 commit 03c1b50
Showing 1 changed file with 29 additions and 7 deletions.
36 changes: 29 additions & 7 deletions src/sumo_migration.erl
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
-export([
init_test/0,
migrate_update_list_test/0,
migrate_test/0
migrate_test/0,
rollback_test/0
]).

%%% sumo_db callbacks
Expand Down Expand Up @@ -36,7 +37,11 @@ migrate() ->
-spec rollback() -> ok.
rollback() ->
ensure_sumo_migration_doc(),
ok.
case last_migration_version() of
undefined -> ok;
LastVersion ->
run_rollback(LastVersion)
end.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% sumo_doc callbacks
Expand Down Expand Up @@ -69,25 +74,25 @@ sumo_wakeup(Migration) ->
ensure_sumo_migration_doc() ->
sumo:create_schema(?MODULE).

-spec last_migration_version() -> version().
-spec last_migration_version() -> version() | undefined.
last_migration_version() ->
case sumo:find_all(?MODULE) of
[] -> '0';
[] -> undefined;
Migrations ->
FunVersion = fun (M) -> M#migration.version end,
Versions = lists:map(FunVersion, Migrations),
lists:max(Versions)
end.

-spec migration_update_list(version()) -> [version()].
-spec migration_update_list(version() | undefined) -> [version()].
migration_update_list(LastVersion) ->
MigrationsDir = migrations_dir(),
Files = filelib:wildcard("*.erl", MigrationsDir),

F = compose([fun filename:rootname/1, fun list_to_atom/1]),
AvailableVersion = lists:map(F, lists:sort(Files)),

FunFilter = fun(X) -> X > LastVersion end,
FunFilter = fun(X) -> (LastVersion == undefined) or (X > LastVersion) end,
lists:filter(FunFilter, AvailableVersion).

-spec migrations_dir() -> string().
Expand All @@ -103,6 +108,11 @@ run_migration(Version) ->
Migration = #migration{version = Version},
sumo:persist(sumo_migration, Migration).

-spec run_rollback(version()) -> ok.
run_rollback(Version) ->
Version:down(),
sumo:delete_by(sumo_migration, [{version, Version}]).

-spec compose([fun()]) -> fun().
compose(Funs) ->
Compose = fun(F, X) -> F(X) end,
Expand All @@ -126,4 +136,16 @@ migrate_update_list_test() ->
[] = migration_update_list('20140904').

migrate_test() ->
migrate().
migrate(),
[_, _, _] = sumo:find_all(sumo_migration).

rollback_test() ->
[_, _, _] = sumo:find_all(sumo_migration),
rollback(),
[_, _] = sumo:find_all(sumo_migration),
rollback(),
[_] = sumo:find_all(sumo_migration),
rollback(),
[] = sumo:find_all(sumo_migration),
rollback(),
rollback().

0 comments on commit 03c1b50

Please sign in to comment.