55 lines
1.5 KiB
Erlang
55 lines
1.5 KiB
Erlang
-module(bloom_gen_server).
|
|
|
|
-behaviour(gen_server).
|
|
|
|
-include("logger.hrl").
|
|
|
|
-import(etbloom, [bloom/1, member/2]).
|
|
-export([member/1]).
|
|
|
|
%% gen_server callbacks
|
|
-export([start/1, stop/0, init/1, handle_call/3, handle_cast/2, handle_info/2,
|
|
terminate/2, code_change/3]).
|
|
|
|
serverName(Lang) ->
|
|
list_to_atom(lists:flatten([atom_to_list(?MODULE), "_", atom_to_list(Lang)])).
|
|
|
|
member({Lang, Word} = _MessageToken) ->
|
|
gen_server:call(serverName(Lang), {member, Word}).
|
|
|
|
start({Lang, BlacklistFile} = _Opts) ->
|
|
gen_server:start_link({local, serverName(Lang)}, ?MODULE, [BlacklistFile], []).
|
|
|
|
stop() ->
|
|
ok.
|
|
|
|
init([BlacklistFile]) ->
|
|
?INFO_MSG("Building bloom ~p~n", [BlacklistFile]),
|
|
Bloom = etbloom:sbf(10000000),
|
|
{ok, loadWordList(Bloom, BlacklistFile)}.
|
|
|
|
handle_call({member, Word}, _From, Bloom) ->
|
|
Reply = etbloom:member(Word, Bloom),
|
|
{reply, Reply, Bloom}.
|
|
|
|
handle_cast(_Msg, State) -> {noreply, State}.
|
|
handle_info(_Info, State) -> {noreply, State}.
|
|
terminate(_Reason, _State) -> ok.
|
|
code_change(_OldVsn, State, _Extra) -> {ok, State}.
|
|
|
|
loadWordList(Bloom, BlacklistFile) ->
|
|
BlacklistExists = filelib:is_file(BlacklistFile),
|
|
if
|
|
BlacklistExists ->
|
|
{ok, S} = file:open(BlacklistFile, read),
|
|
loadWordList(io:get_line(S, ''), Bloom, S);
|
|
true ->
|
|
?ERROR_MSG("Blacklist file not found: ~p~n", [BlacklistFile]),
|
|
loadWordList(eof, Bloom, BlacklistFile)
|
|
end.
|
|
|
|
loadWordList(eof, Bloom, _S) ->
|
|
Bloom;
|
|
loadWordList(Line, Bloom, S) ->
|
|
loadWordList(io:get_line(S, ''), etbloom:add(lists:droplast(Line), Bloom), S).
|