XENOS/src/db_safe_insert.erl

33 lines
1.2 KiB
Erlang

-module(db_safe_insert).
-include_lib("include/db_safe_insert.hrl").
-export([safe_insert/2]).
safe_insert(Tab, Record) ->
case mnesia:transaction(fun() -> mnesia:write(Record) end) of
{atomic, ok} ->
ok;
{aborted, {file_size, _}} ->
cleanup_and_retry(Tab, Record);
{aborted, {no_disk_space, _}} ->
cleanup_and_retry(Tab, Record);
Other ->
Other
end.
cleanup_and_retry(Tab, Record) ->
remove_oldest(Tab, 0.2),
mnesia:transaction(fun() -> mnesia:write(Record) end).
remove_oldest(Tab, Fraction) ->
Records = mnesia:dirty_match_object(make_pattern(Tab)),
N = trunc(length(Records) * Fraction),
Sorted = lists:sort(fun(A, B) -> get_timestamp(A) =< get_timestamp(B) end, Records),
ToDelete = lists:sublist(Sorted, N),
lists:foreach(fun(Rec) -> mnesia:dirty_delete_object(Rec) end, ToDelete).
make_pattern(global_message) -> #global_message{id='_', activity='_', timestamp='_'};
make_pattern(ap_users) -> #ap_users{id='_', username='_', email='_', created_at='_'}. %% <-- PUNTO QUI DIOCANE!
get_timestamp(#global_message{timestamp=T}) -> T;
get_timestamp(#ap_users{created_at=T}) -> T. %% <-- PUNTO SOLO ALLA FINE, DIOCANE!