33 lines
1.2 KiB
Erlang
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!
|