diff options
Diffstat (limited to 'lib/src/mysqlerl_connection.erl')
-rw-r--r-- | lib/src/mysqlerl_connection.erl | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/src/mysqlerl_connection.erl b/lib/src/mysqlerl_connection.erl new file mode 100644 index 0000000..1a3d900 --- /dev/null +++ b/lib/src/mysqlerl_connection.erl @@ -0,0 +1,64 @@ +-module(mysqlerl_connection). +-author('bjc@kublai.com'). + +-include("mysqlerl.hrl"). +-include("mysqlerl_port.hrl"). + +-behavior(gen_server). + +-export([start_link/7, stop/1]). + +-export([init/1, terminate/2, code_change/3, + handle_call/3, handle_cast/2, handle_info/2]). + +-record(state, {sup, owner}). + +start_link(Owner, Host, Port, Database, User, Password, Options) -> + gen_server:start_link(?MODULE, [Owner, Host, Port, Database, + User, Password, Options], []). + +stop(Pid) -> + gen_server:call(Pid, stop). + +init([Owner, Host, Port, Database, User, Password, Options]) -> + process_flag(trap_exit, true), + link(Owner), + {ok, Sup} = mysqlerl_port_sup:start_link(helper(), Host, Port, Database, + User, Password, Options), + {ok, #state{sup = Sup, owner = Owner}}. + +terminate(Reason, _State) -> + io:format("DEBUG: connection got terminate: ~p~n", [Reason]), + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +handle_call(Request, From, #state{owner = Owner} = State) + when Owner /= element(1, From) -> + error_logger:warning_msg("Request from ~p (owner: ~p): ~p", + [element(1, From), Owner, Request]), + {reply, {error, process_not_owner_of_odbc_connection}, State}; +handle_call(stop, _From, State) -> + {stop, normal, State}; +handle_call(Request, _From, State) -> + {reply, gen_server:call(port_ref(State#state.sup), + #req{request = Request}, infinity), State}. + +handle_cast(_Request, State) -> + {noreply, State}. + +handle_info({'EXIT', Pid, _Reason}, #state{owner = Pid} = State) -> + io:format("DEBUG: owner ~p shut down.~n", [Pid]), + {stop, normal, State}. + +helper() -> + case code:priv_dir(mysqlerl) of + PrivDir when is_list(PrivDir) -> ok; + {error, bad_name} -> PrivDir = filename:join(["..", "priv"]) + end, + filename:join([PrivDir, "mysqlerl"]). + +port_ref(Sup) -> + [{mysqlerl_port, Ref, worker, _}] = supervisor:which_children(Sup), + Ref. |