-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!