fsm and networks
Vance Shipley
vances@REDACTED
Sat May 1 19:09:05 CEST 2004
On Sat, May 01, 2004 at 02:09:26AM -0700, Dustin Sallings wrote:
}
} I don't quite know how to tell (or preferably wait until) I'm in the
} right state to issue queries. I am not ready after init is finished.
} The server will send me an authentication request of some sort, I
} respond (via a handle_packet/5), and the server sends a few more things
} over and eventually a command letting me know it's ready to accept
} queries. Ideally, init could block while this stuff occurs, but a
} variety of commands could arrive before the server's ready.
Your FSM isn't really an FSM when you don't track state.
The following may seem inefficient but it solves your problem:
init(Args) ->
...
{ok, wait_for_auth, StateData}.
wait_for_auth(Packet, StateData) ->
...
{next_state, wait_for_queries, StateData}.
wait_for_queries(Packet, StateData) ->
...
{next_state, wait_for_queries, StateData}.
handle_info({tcp, _Port, Packet}, StateName, StateData) ->
gen_fsm:send_event(self(), Packet),
{next_state, StateName, StateData}.
} Similarly, I have the following:
}
} execute(Fsm, Query) ->
} gen_fsm:sync_send_event(Fsm,{execute,Query}).
}
} and its corresponding
}
} ready_for_query({execute, Query}, Pid, Info) ->
} io:format("Executing query: ~p~n", [Query]),
} ok = gen_tcp:send(Info#pginfo.socket, [$Q|makeString(Query ++
} "\0")]),
} {reply, ok, query_pending, Info}.
}
} I'm not sure how to go about getting the results from this query.
} Right now, I just return, and let the handle_packet/5 print out the
} various stuff the DB sends back.
execute(Fsm, Query) ->
gen_fsm:sync_send_event(Fsm, Query).
wait_for_queries(Query, From, StateData) ->
gen_tcp:send(...),
% store From in NewStateData
{next_state, wait_for_queries, NewStateData}.
wait_for_queries(ReplyPacket, StateData) ->
...
% find appropriate From in StateData
gen_fsm:reply(From, Reply),
{next_state, wait_for_queries, StateData};
-Vance
More information about the erlang-questions
mailing list