BSISJB2O2HKYGSCX6HIIMLBIXCZ66BRCZH3622G2NOQJRJ5S3HLAC ST7Y5WTYIQNKUOVXW6T5PQZL6R3VUYC37BAEQOA2FL6AYVPR4OLAC R4JDMB7LL3FLA4NJEAV2DQEXII5XS5KIMG3H4YS5P6W7ZZUE7FIQC CBHKQGLDCAH2E4ZNACITBSMADOKPERFCWQPUGMH7UN5TLJXLYI4QC QHK3BXHEC6IAAI7HK76Y7W3IQQIEFH7TD7AYMBCLOE7U2L7BT2LQC JVURIEXR72OUGZ2EHP5HB6OMXUNPHMAV66YUUP2444TPOG5XGASQC RZB6HZ2NI5PIUIWQL63CSKXZGGUG4L6XCSCGR3TI723OO57NDT3AC OJ6KWAG7XUCYNQ6T3FRJK2QOP7DBO26PZEWDVH3Q2MJKIBMNWRPQC 7CB7WD2VQGU2ZZV3CWXAOFLPM5SY6RADIXRSFLUVXKQXC5472UOAC JMYRP5MUPSBHABHBPIO45F6RC7QSQSNO2EJDUDUIQXX3MEEFDOAQC J32TNYTRQJ3YTGFSI5FXW63R5ACT5SZQ6C4YSHLAZ4HXYAHAN7YQC 55WLMLEEVBRSTAFRZ5RGF7TOGUF5OPVCPA2TMHAQK45OUO7PA3YQC IHBNW3GI2XB6KAWUYRLL6KDOBUNUOU3N7RRLS6BFNW6SE7ZDHLWQC DZZ4B3UGIYTN3OHAKS2HNCLK7KM2ZSHPZ4JC6YVQL6I2H4KCD5PAC YDZ3R5NY7II7WX4Q5O2UQ72TMCABDPPRLEMTTIBH5DGKOLAOPOPAC YWCRGWVDIMCPXBQFM23MKCYZCXJJSD733NJEPB6WUU4G4BSREILAC MONVI5STEDKY5ALVMEXJJXDUX6XQRKTFLP7BBNOQML3VSJEM2JAAC {ok, [Header, Body, Bin]} = db:loadPost(Db, Id),{ok, [Header, Body, Bin]} = db:loadPost(Db, Hash),?assertEqual(true, db:hasPost(Db, Hash)),
{ok, [Header, Body, Bin]} = db:load_post(Db, Id),{ok, [Header, Body, Bin]} = db:load_post(Db, Hash),?assertEqual(true, db:has_post(Db, Hash)),
{writeTextToChannel, From, Chan, Text} ->case maps:is_key(Chan, Chans) offalse -> % already joinedgen_server:reply(From, {error, notInChannel}),event_loop(State);true ->%% TODO: get most recent links state for channelLinks = [],Bin = posts:encode(KeyPair, Links, {text, Chan, Text}),{ok, _, PostHash} = db:save_post(Db, Bin),SentPeers = lists:foldl(fun({received, ReqId, Peer}, AccPeers) ->{Peer, [Header, _]} = maps:get(ReqId, ActiveIn),case proplists:get_value(type, Header) of_ -> AccPeers; % ignored4 ->{ok, {_, _, Size}} = send_hash_response(Peer, ReqId, [PostHash]),update_peer_sent(AccPeers, Peer, Size)endend, Peers, maps:get(Chan, Chans)),gen_server:reply(From, ok),event_loop(State#state{peers = SentPeers})end;
io:format("[DEBUG] Received incoming chan time req for ~p from ~p~n", [RequestedChan, Peer]),%% TODO: send posts
io:format("[DEBUG] Received incoming chan time req(~p) for ~p from ~p~n",[ReqIdStr, RequestedChan, Peer]),[Start, End, Limit] = [proplists:get_value(F, Body) ||F <- [timestart, timeend, limit]],{ok, Hashes} = db:get_text_hashes_by_time_range(Db, RequestedChan, Start, End, Limit),{ok, {_, _, RespSize}} = send_hash_response(Peer, ReqId, Hashes),%% TODO: only track if 'end' is in the future
io:format("[DEBUG] Received incoming state req for ~p from ~p~n", [RequestedChan, Peer]),%% TODO: send recent channel state hashes
io:format("[DEBUG] Received incoming state req for ~p from ~p~n",[RequestedChan, Peer]),{ok, Hashes} = db:get_channel_state(Db, RequestedChan),{ok, {_, _, RespSize}} = send_hash_response(Peer, ReqId, Hashes),%% TODO: only track if future is set to 1
send_hash_response(Peer, ReqId, Hashes) ->io:format("[DEBUG] sending hash response(~p) for ~p hashes to ~p~n", [hex:bin_to_hexstr(ReqId), length(Hashes), Peer]),Header = [{requestId, ReqId},{circuitId, <<0,0,0,0>>}],Binary = wire:encode_hash_response(Header, Hashes),send_binary_to_peer(Peer, Binary).
-export([start_link/1, close/1, savePost/3, savePost/2, loadPost/2, hasPost/2]).-export([channelsJoin/2, channelsLeave/2, channelsList/1]).
-export([start_link/1, close/1, save_post/3, save_post/2, load_post/2]).-export([has_post/2, get_text_hashes_by_time_range/5]).-export([channels_join/2, channels_leave/2, channels_list/1, get_channel_state/2]).
handle_call({hashesByTimeRange, Chan, Start, End, Limit}, _From, [{sql, Db}, _] = State) ->Qry = "SELECT hash from posts where channel = ? and timestamp >= ? and timestamp <= ? limit ?",QryChan = {blob, list_to_binary(Chan)},[{columns, ["hash"]}, {rows, Rows}] = sqlite3:sql_exec(Db, Qry, [QryChan, Start, End, Limit]),Result = [Hash || {{blob, Hash}} <- Rows],{reply, {ok, Result}, State};
%% TODO: obviously incompletehandle_call({channelsState, Chan}, _, [{sql, Db}, _] = State) ->Qry = "SELECT hash from posts where channel = ? and type > 1 order by timestamp asc",QryChan = {blob, list_to_binary(Chan)},[{columns, ["hash"]}, {rows, Rows}] = sqlite3:sql_exec(Db, Qry, [QryChan]),Result = [Hash || {{blob, Hash}} <- Rows],{reply, {ok, Result}, State};