Eugen Dubrovin
Eugen Dubrovin

Reputation: 906

gen_server:call - how to send message

Now Im playing with the gen_server

I have two modules - one is Gen Server mod, second - logic module

and would like to send the message to the PID through the gen_server:call

here is the snip of code:

lookup_by_date(FromTime, ToTime) ->
    gen_server:call({global, ?MODULE}, {lookup_by_date,FromTime,ToTime}).

here is the handle_call func:

handle_call({lookup_by_date, FromTime, ToTime}, _From, _State) ->
    FromSec = calendar:datetime_to_gregorian_seconds(FromTime),
    ToSec = calendar:datetime_to_gregorian_seconds(ToTime),
    Pid = spawn(fun()-> logic:handler() end),
    {reply, Pid !{lookup_by_date, FromSec, ToSec}, _State};

aand the logic mod code:

lookup_by_date(FromTime, ToTime) -> lookup_by_date(FromTime, ToTime, ets:first(auth), []).
lookup_by_date(_FromTime, _ToTime, '$end_of_table', Acc) -> {reply, Acc, ok};
lookup_by_date(FromTime, ToTime, Key, Acc) ->
    case ets:lookup(auth, Key) of
        [{Login, Pass, TTL, Unix, Unix2}] ->
            F = calendar:datetime_to_gregorian_seconds(Unix2),
        T = calendar:datetime_to_gregorian_seconds(Unix2),
        if
            F >= FromTime, T =< ToTime -> NewAcc = [{Login, Pass, TTL, Unix, Unix2}|Acc],
        N = ets:next(auth, Key),
            lookup_by_date(FromTime, ToTime, N, NewAcc);
        true -> N = ets:next(auth, Key),
                    lookup_by_date(FromTime, ToTime, N, Acc)
         end
        end.

handler() ->
  receive
      {lookup_by_date, FromTime, ToTime}->
          lookup_by_date(FromTime, ToTime),
            handler();
      Other->
        io:format("Error message for ~p~n" ,[Other]),
      handler()
  end.

but i am getting the error (actually not an error)

2> c(cache_server).

{ok,cache_server}

3> c(logic).

{ok,logic}

4> cache_server:start([{ttl, 15000}]).

{ok,<0.73.0>}

5> cache_server:insert(test, root, 15000).

{auth,test,root,15000,1484309726435, {{2017,1,13},{14,15,11}}}

6> cache_server:lookup_by_date({{2017,1,13},{14,15,11}},{{2017,1,13},{14,15,11}}).

{lookup_by_date,63651536111,63651536111}


I am receiving data from - {reply, Pid !{lookup_by_date, FromSec, ToSec}, _State};

but dont receive data from the "logic:lookup_by_date" function

Is there anyway you show me the right direction because Im stuck a little bit. Thx...

Upvotes: 0

Views: 1153

Answers (1)

Pascal
Pascal

Reputation: 14042

In your code, the reply to the gen_server call is:

Pid !{lookup_by_date, FromSec, ToSec}

In Erlang messages are asynchronous, they are just sent to the process, so this code doesn't wait for a response, and it simply returns, immediatly, the message you are sending. It is why you get the reply {lookup_by_date, FromSec, ToSec}.

In your case you don't have to spawn a process, but simply call the lookup_by_date function:

handle_call({lookup_by_date, FromTime, ToTime}, _From, _State) ->
    FromSec = calendar:datetime_to_gregorian_seconds(FromTime),
    ToSec = calendar:datetime_to_gregorian_seconds(ToTime),
    {reply, logic:lookup_by_date(FromSec, ToSec), _State};

Note: Your gen_server doesn't use the result, its state is not modified by the request, so you could directly call the function lookup_by_date and include the time conversion in it.

Upvotes: 4

Related Questions