32d3e7378e
Use bag table for recurrence_exception so canceling several WEEKLY occurrences keeps all exceptions (set key was only master_id). Refs EventHub/EventHubFront#42
46 lines
1.6 KiB
Erlang
46 lines
1.6 KiB
Erlang
%% @doc recurrence_exception: set → bag, чтобы хранить несколько cancel на один master.
|
|
-module('20260730120000_recurrence_exception_bag').
|
|
|
|
-export([up/0, down/0]).
|
|
|
|
-include("records.hrl").
|
|
|
|
up() ->
|
|
case lists:member(recurrence_exception, mnesia:system_info(tables)) of
|
|
false ->
|
|
case mnesia:create_table(recurrence_exception, [
|
|
{disc_copies, [node()]},
|
|
{type, bag},
|
|
{attributes, record_info(fields, recurrence_exception)}
|
|
]) of
|
|
{atomic, ok} -> ok;
|
|
{aborted, {already_exists, recurrence_exception}} -> ok;
|
|
{aborted, Reason} -> error({create_table_failed, Reason})
|
|
end;
|
|
true ->
|
|
case mnesia:table_info(recurrence_exception, type) of
|
|
bag ->
|
|
ok;
|
|
_ ->
|
|
Rows = mnesia:dirty_match_object(#recurrence_exception{_ = '_'}),
|
|
case mnesia:delete_table(recurrence_exception) of
|
|
{atomic, ok} -> ok;
|
|
{aborted, Reason1} -> error({delete_table_failed, Reason1})
|
|
end,
|
|
case mnesia:create_table(recurrence_exception, [
|
|
{disc_copies, [node()]},
|
|
{type, bag},
|
|
{attributes, record_info(fields, recurrence_exception)}
|
|
]) of
|
|
{atomic, ok} -> ok;
|
|
{aborted, Reason2} -> error({create_table_failed, Reason2})
|
|
end,
|
|
lists:foreach(fun(R) -> mnesia:dirty_write(R) end, Rows),
|
|
ok
|
|
end
|
|
end.
|
|
|
|
down() ->
|
|
%% Откат в set потерял бы все кроме одного exception на master — не делаем.
|
|
ok.
|