Packages

Persistent ETS tables backed by DETS — fast in-memory access with automatic disk persistence for the BEAM

Current section

Files

Jump to
shelf src shelf@internal.erl
Raw

src/shelf@internal.erl

-module(shelf@internal).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/shelf/internal.gleam").
-export([build_entry_decoder/2, stream_validate_and_load/3, generic_reload/3, rescue/1, generic_with_table/3, open_no_load/3, cleanup/3, generic_open/4, close/3, insert/3, insert_list/3, member/2, to_list/1, fold/3, generic_fold/3, size/1, delete_key/2, delete_object/3, delete_all/1, save/2, sync_dets/2, dets_insert/2, generic_insert/5, dets_insert_list/2, generic_insert_list/4, dets_delete_key/2, generic_delete_key/4, dets_delete_object/3, generic_delete_object/5, dets_delete_all/1, generic_delete_all/3]).
-export_type([ets_ref/0, dets_ref/0, guardian_ref/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-type ets_ref() :: any().
-type dets_ref() :: any().
-type guardian_ref() :: any().
-file("src/shelf/internal.gleam", 26).
?DOC(false).
-spec build_entry_decoder(
gleam@dynamic@decode:decoder(LNL),
gleam@dynamic@decode:decoder(LNN)
) -> gleam@dynamic@decode:decoder({LNL, LNN}).
build_entry_decoder(Key_decoder, Value_decoder) ->
gleam@dynamic@decode:field(
0,
Key_decoder,
fun(Key) ->
gleam@dynamic@decode:field(
1,
Value_decoder,
fun(Value) -> gleam@dynamic@decode:success({Key, Value}) end
)
end
).
-file("src/shelf/internal.gleam", 41).
?DOC(false).
-spec stream_validate_and_load(
ets_ref(),
dets_ref(),
gleam@dynamic@decode:decoder({any(), any()})
) -> {ok, nil} | {error, shelf:shelf_error()}.
stream_validate_and_load(Ets, Dets, Entry_decoder) ->
Decoder_fn = fun(Entry) ->
gleam@dynamic@decode:run(Entry, Entry_decoder)
end,
shelf_ffi:dets_fold_into_ets_strict(Dets, Ets, Decoder_fn).
-file("src/shelf/internal.gleam", 186).
?DOC(false).
-spec generic_reload(
ets_ref(),
dets_ref(),
gleam@dynamic@decode:decoder({any(), any()})
) -> {ok, nil} | {error, shelf:shelf_error()}.
generic_reload(Ets, Dets, Entry_decoder) ->
Decoder_fn = fun(Entry) ->
gleam@dynamic@decode:run(Entry, Entry_decoder)
end,
shelf_ffi:reload_atomic(Ets, Dets, Decoder_fn).
-file("src/shelf/internal.gleam", 231).
?DOC(false).
-spec rescue(fun(() -> LPX)) -> {ok, LPX} | {error, binary()}.
rescue(Fun) ->
shelf_rescue_ffi:rescue(Fun).
-file("src/shelf/internal.gleam", 210).
?DOC(false).
-spec generic_with_table(
fun(() -> {ok, LPN} | {error, shelf:shelf_error()}),
fun((LPN) -> {ok, nil} | {error, shelf:shelf_error()}),
fun((LPN) -> {ok, LPS} | {error, shelf:shelf_error()})
) -> {ok, LPS} | {error, shelf:shelf_error()}.
generic_with_table(Open_fn, Close_fn, Fun) ->
gleam@result:'try'(
Open_fn(),
fun(Table) ->
Callback_result = case shelf_rescue_ffi:rescue(
fun() -> Fun(Table) end
) of
{ok, Result} ->
Result;
{error, Crash_detail} ->
{error, {erlang_error, Crash_detail}}
end,
case Close_fn(Table) of
{ok, nil} ->
Callback_result;
{error, Close_err} ->
case Callback_result of
{ok, _} ->
{error, Close_err};
{error, _} ->
Callback_result
end
end
end
).
-file("src/shelf/internal.gleam", 250).
?DOC(false).
-spec open_no_load(binary(), binary(), binary()) -> {ok,
{ets_ref(), dets_ref(), guardian_ref()}} |
{error, shelf:shelf_error()}.
open_no_load(Name, Path, Table_type) ->
shelf_ffi:open_no_load(Name, Path, Table_type).
-file("src/shelf/internal.gleam", 258).
?DOC(false).
-spec cleanup(ets_ref(), dets_ref(), guardian_ref()) -> {ok, nil} |
{error, shelf:shelf_error()}.
cleanup(Ets, Dets, Guardian) ->
shelf_ffi:cleanup(Ets, Dets, Guardian).
-file("src/shelf/internal.gleam", 67).
?DOC(false).
-spec generic_open(
shelf:config(),
binary(),
gleam@dynamic@decode:decoder(LOC),
gleam@dynamic@decode:decoder(LOE)
) -> {ok,
{ets_ref(),
dets_ref(),
guardian_ref(),
shelf:write_mode(),
gleam@dynamic@decode:decoder({LOC, LOE})}} |
{error, shelf:shelf_error()}.
generic_open(Config, Table_type, Key_decoder, Value_decoder) ->
Name = shelf:get_name(Config),
Path = shelf:get_path(Config),
Base_directory = shelf:get_base_directory(Config),
Write_mode = shelf:get_write_mode(Config),
gleam@result:'try'(
shelf:validate_path(Path, Base_directory),
fun(Resolved_path) ->
gleam@result:'try'(
shelf_ffi:open_no_load(Name, Resolved_path, Table_type),
fun(Refs) ->
Ets = erlang:element(1, Refs),
Dets = erlang:element(2, Refs),
Guardian = erlang:element(3, Refs),
Entry_decoder = build_entry_decoder(
Key_decoder,
Value_decoder
),
case stream_validate_and_load(Ets, Dets, Entry_decoder) of
{ok, nil} ->
{ok,
{Ets, Dets, Guardian, Write_mode, Entry_decoder}};
{error, E} ->
_ = shelf_ffi:cleanup(Ets, Dets, Guardian),
{error, E}
end
end
)
end
).
-file("src/shelf/internal.gleam", 266).
?DOC(false).
-spec close(ets_ref(), dets_ref(), guardian_ref()) -> {ok, nil} |
{error, shelf:shelf_error()}.
close(Ets, Dets, Guardian) ->
shelf_ffi:close(Ets, Dets, Guardian).
-file("src/shelf/internal.gleam", 274).
?DOC(false).
-spec insert(ets_ref(), dets_ref(), {any(), any()}) -> {ok, nil} |
{error, shelf:shelf_error()}.
insert(Ets, Dets, Object) ->
shelf_ffi:insert(Ets, Dets, Object).
-file("src/shelf/internal.gleam", 282).
?DOC(false).
-spec insert_list(ets_ref(), dets_ref(), list({any(), any()})) -> {ok, nil} |
{error, shelf:shelf_error()}.
insert_list(Ets, Dets, Objects) ->
shelf_ffi:insert_list(Ets, Dets, Objects).
-file("src/shelf/internal.gleam", 290).
?DOC(false).
-spec member(ets_ref(), any()) -> {ok, boolean()} | {error, shelf:shelf_error()}.
member(Ets, Key) ->
shelf_ffi:member(Ets, Key).
-file("src/shelf/internal.gleam", 294).
?DOC(false).
-spec to_list(ets_ref()) -> {ok, list({any(), any()})} |
{error, shelf:shelf_error()}.
to_list(Ets) ->
shelf_ffi:to_list(Ets).
-file("src/shelf/internal.gleam", 298).
?DOC(false).
-spec fold(ets_ref(), fun(({any(), any()}, LRE) -> LRE), LRE) -> {ok, LRE} |
{error, shelf:shelf_error()}.
fold(Ets, Fun, Acc) ->
shelf_ffi:fold(Ets, Fun, Acc).
-file("src/shelf/internal.gleam", 235).
?DOC(false).
-spec generic_fold(ets_ref(), LQA, fun((LQA, any(), any()) -> LQA)) -> {ok, LQA} |
{error, shelf:shelf_error()}.
generic_fold(Ets, Initial, Fun) ->
Wrapper = fun(Entry, Acc) ->
Fun(Acc, erlang:element(1, Entry), erlang:element(2, Entry))
end,
shelf_ffi:fold(Ets, Wrapper, Initial).
-file("src/shelf/internal.gleam", 306).
?DOC(false).
-spec size(ets_ref()) -> {ok, integer()} | {error, shelf:shelf_error()}.
size(Ets) ->
shelf_ffi:size(Ets).
-file("src/shelf/internal.gleam", 310).
?DOC(false).
-spec delete_key(ets_ref(), any()) -> {ok, nil} | {error, shelf:shelf_error()}.
delete_key(Ets, Key) ->
shelf_ffi:delete_key(Ets, Key).
-file("src/shelf/internal.gleam", 314).
?DOC(false).
-spec delete_object(ets_ref(), any(), any()) -> {ok, nil} |
{error, shelf:shelf_error()}.
delete_object(Ets, Key, Value) ->
shelf_ffi:delete_object(Ets, Key, Value).
-file("src/shelf/internal.gleam", 318).
?DOC(false).
-spec delete_all(ets_ref()) -> {ok, nil} | {error, shelf:shelf_error()}.
delete_all(Ets) ->
shelf_ffi:delete_all(Ets).
-file("src/shelf/internal.gleam", 322).
?DOC(false).
-spec save(ets_ref(), dets_ref()) -> {ok, nil} | {error, shelf:shelf_error()}.
save(Ets, Dets) ->
shelf_ffi:save(Ets, Dets).
-file("src/shelf/internal.gleam", 326).
?DOC(false).
-spec sync_dets(ets_ref(), dets_ref()) -> {ok, nil} |
{error, shelf:shelf_error()}.
sync_dets(Ets, Dets) ->
shelf_ffi:sync_dets(Ets, Dets).
-file("src/shelf/internal.gleam", 332).
?DOC(false).
-spec dets_insert(dets_ref(), {any(), any()}) -> {ok, nil} |
{error, shelf:shelf_error()}.
dets_insert(Dets, Object) ->
shelf_ffi:dets_insert(Dets, Object).
-file("src/shelf/internal.gleam", 99).
?DOC(false).
-spec generic_insert(ets_ref(), dets_ref(), shelf:write_mode(), any(), any()) -> {ok,
nil} |
{error, shelf:shelf_error()}.
generic_insert(Ets, Dets, Write_mode, Key, Value) ->
case Write_mode of
write_through ->
gleam@result:'try'(
shelf_ffi:dets_insert(Dets, {Key, Value}),
fun(_) -> shelf_ffi:insert(Ets, Dets, {Key, Value}) end
);
write_back ->
shelf_ffi:insert(Ets, Dets, {Key, Value})
end.
-file("src/shelf/internal.gleam", 336).
?DOC(false).
-spec dets_insert_list(dets_ref(), list({any(), any()})) -> {ok, nil} |
{error, shelf:shelf_error()}.
dets_insert_list(Dets, Objects) ->
shelf_ffi:dets_insert_list(Dets, Objects).
-file("src/shelf/internal.gleam", 117).
?DOC(false).
-spec generic_insert_list(
ets_ref(),
dets_ref(),
shelf:write_mode(),
list({any(), any()})
) -> {ok, nil} | {error, shelf:shelf_error()}.
generic_insert_list(Ets, Dets, Write_mode, Entries) ->
case Write_mode of
write_through ->
gleam@result:'try'(
shelf_ffi:dets_insert_list(Dets, Entries),
fun(_) -> shelf_ffi:insert_list(Ets, Dets, Entries) end
);
write_back ->
shelf_ffi:insert_list(Ets, Dets, Entries)
end.
-file("src/shelf/internal.gleam", 343).
?DOC(false).
-spec dets_delete_key(dets_ref(), any()) -> {ok, nil} |
{error, shelf:shelf_error()}.
dets_delete_key(Dets, Key) ->
shelf_ffi:dets_delete_key(Dets, Key).
-file("src/shelf/internal.gleam", 134).
?DOC(false).
-spec generic_delete_key(ets_ref(), dets_ref(), shelf:write_mode(), any()) -> {ok,
nil} |
{error, shelf:shelf_error()}.
generic_delete_key(Ets, Dets, Write_mode, Key) ->
case Write_mode of
write_through ->
gleam@result:'try'(
shelf_ffi:dets_delete_key(Dets, Key),
fun(_) -> shelf_ffi:delete_key(Ets, Key) end
);
write_back ->
shelf_ffi:delete_key(Ets, Key)
end.
-file("src/shelf/internal.gleam", 347).
?DOC(false).
-spec dets_delete_object(dets_ref(), any(), any()) -> {ok, nil} |
{error, shelf:shelf_error()}.
dets_delete_object(Dets, Key, Value) ->
shelf_ffi:dets_delete_object(Dets, Key, Value).
-file("src/shelf/internal.gleam", 151).
?DOC(false).
-spec generic_delete_object(
ets_ref(),
dets_ref(),
shelf:write_mode(),
any(),
any()
) -> {ok, nil} | {error, shelf:shelf_error()}.
generic_delete_object(Ets, Dets, Write_mode, Key, Value) ->
case Write_mode of
write_through ->
gleam@result:'try'(
shelf_ffi:dets_delete_object(Dets, Key, Value),
fun(_) -> shelf_ffi:delete_object(Ets, Key, Value) end
);
write_back ->
shelf_ffi:delete_object(Ets, Key, Value)
end.
-file("src/shelf/internal.gleam", 355).
?DOC(false).
-spec dets_delete_all(dets_ref()) -> {ok, nil} | {error, shelf:shelf_error()}.
dets_delete_all(Dets) ->
shelf_ffi:dets_delete_all(Dets).
-file("src/shelf/internal.gleam", 169).
?DOC(false).
-spec generic_delete_all(ets_ref(), dets_ref(), shelf:write_mode()) -> {ok, nil} |
{error, shelf:shelf_error()}.
generic_delete_all(Ets, Dets, Write_mode) ->
case Write_mode of
write_through ->
gleam@result:'try'(
shelf_ffi:dets_delete_all(Dets),
fun(_) -> shelf_ffi:delete_all(Ets) end
);
write_back ->
shelf_ffi:delete_all(Ets)
end.