Auto-indexing service and GraphQL API for AT Protocol Records
at main 48 lines 1.6 kB view raw
1-module(did_cache_ffi). 2-export([new_table/0, insert/4, lookup/2, delete/2, cleanup_expired/1, stats/1]). 3 4%% Create a new ETS table for DID document caching 5new_table() -> 6 ets:new(did_cache, [set, public, {read_concurrency, true}]). 7 8%% Insert a DID document with expiration timestamp 9%% Args: Table, DID (binary), Document (binary), ExpiresAt (integer, unix timestamp) 10insert(Table, DID, Document, ExpiresAt) -> 11 true = ets:insert(Table, {DID, Document, ExpiresAt}), 12 ok. 13 14%% Lookup a DID document, checking expiration 15%% Returns: {ok, Document} | {error, not_found} | {error, expired} 16lookup(Table, DID) -> 17 case ets:lookup(Table, DID) of 18 [] -> 19 {error, not_found}; 20 [{_DID, Document, ExpiresAt}] -> 21 Now = erlang:system_time(second), 22 case Now < ExpiresAt of 23 true -> {ok, Document}; 24 false -> 25 ets:delete(Table, DID), 26 {error, expired} 27 end 28 end. 29 30%% Delete a DID from the cache 31delete(Table, DID) -> 32 ets:delete(Table, DID), 33 ok. 34 35%% Remove all expired entries from the cache 36cleanup_expired(Table) -> 37 Now = erlang:system_time(second), 38 %% Select and delete expired entries 39 ets:select_delete(Table, [{{{'$1', '$2', '$3'}, [], [{'<', '$3', Now}]}}]), 40 ok. 41 42%% Get cache statistics 43%% Returns: {EntryCount, MemoryBytes} 44stats(Table) -> 45 Info = ets:info(Table), 46 Size = proplists:get_value(size, Info, 0), 47 Memory = proplists:get_value(memory, Info, 0) * erlang:system_info(wordsize), 48 {Size, Memory}.