diff options
Diffstat (limited to 'src/mysqlerl_port.erl')
-rw-r--r-- | src/mysqlerl_port.erl | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/src/mysqlerl_port.erl b/src/mysqlerl_port.erl index 3593119..74fe177 100644 --- a/src/mysqlerl_port.erl +++ b/src/mysqlerl_port.erl @@ -1,23 +1,35 @@ -module(mysqlerl_port). -author('bjc@kublai.com'). +-include("mysqlerl.hrl"). -include("mysqlerl_port.hrl"). -behavior(gen_server). --export([start_link/1]). +-export([start_link/7]). -export([init/1, terminate/2, code_change/3, handle_call/3, handle_cast/2, handle_info/2]). +-define(CONNECT_TIMEOUT, 30000). + -record(state, {ref}). -record(port_closed, {reason}). -start_link(Cmd) -> - gen_server:start_link(?MODULE, [Cmd], []). +start_link(Cmd, Host, Port, Database, User, Password, Options) -> + gen_server:start_link(?MODULE, + [Cmd, Host, Port, Database, User, Password, Options], + []). -init([Cmd]) -> +init([Cmd, Host, Port, Database, User, Password, Options]) -> process_flag(trap_exit, true), Ref = open_port({spawn, Cmd}, [{packet, 4}, binary]), + {data, ok} = send_port_cmd(Ref, #sql_connect{host = Host, + port = Port, + database = Database, + user = User, + password = Password, + options = Options}, + ?CONNECT_TIMEOUT), {ok, #state{ref = Ref}}. terminate(#port_closed{reason = Reason}, #state{ref = Ref}) -> @@ -34,27 +46,38 @@ code_change(_OldVsn, State, _Extra) -> handle_call(#req{request = {Request, Timeout}}, From, #state{ref = Ref} = State) -> - io:format("DEBUG: Sending request: ~p~n", [Request]), - port_command(Ref, term_to_binary(Request)), - receive - {Ref, {data, Res}} -> - {reply, binary_to_term(Res), State}; + case send_port_cmd(Ref, Request, Timeout) of + {data, Res} -> + {reply, Res, State}; {'EXIT', Ref, Reason} -> gen_server:reply(From, {error, connection_closed}), {stop, #port_closed{reason = Reason}, State}; + timeout -> + gen_server:reply(From, timeout), + {stop, timeout, State}; Other -> error_logger:warning_msg("Got unknown query response: ~p~n", [Other]), gen_server:reply(From, {error, connection_closed}), {stop, {unknownreply, Other}, State} - after Timeout -> - gen_server:reply(From, timeout), - {stop, timeout, State} end. + handle_cast(_Request, State) -> {noreply, State}. handle_info({'EXIT', Ref, Reason}, #state{ref = Ref} = State) -> io:format("DEBUG: Port ~p closed on ~p.~n", [Ref, State]), {stop, #port_closed{reason = Reason}, State}. + + +send_port_cmd(Ref, Request, Timeout) -> + io:format("DEBUG: Sending request: ~p~n", [Request]), + port_command(Ref, term_to_binary(Request)), + receive + {Ref, {data, Res}} -> + {data, binary_to_term(Res)}; + Other -> Other + after Timeout -> + timeout + end. |