1 |
|
-module(mongoose_wpool_rdbms). |
2 |
|
-behaviour(mongoose_wpool). |
3 |
|
|
4 |
|
-export([init/0]). |
5 |
|
-export([start/4]). |
6 |
|
-export([default_opts/0]). |
7 |
|
-export([stop/2]). |
8 |
|
|
9 |
|
%% -------------------------------------------------------------- |
10 |
|
%% mongoose_wpool callbacks |
11 |
|
init() -> |
12 |
73 |
case ets:info(prepared_statements) of |
13 |
|
undefined -> |
14 |
73 |
Heir = case whereis(ejabberd_sup) of |
15 |
:-( |
undefined -> []; |
16 |
73 |
Pid -> [{heir, Pid, undefined}] |
17 |
|
end, |
18 |
73 |
ets:new(prepared_statements, |
19 |
|
[named_table, public, {read_concurrency, true} | Heir]), |
20 |
73 |
ok; |
21 |
|
_ -> |
22 |
:-( |
ok |
23 |
|
end. |
24 |
|
|
25 |
|
start(HostType, Tag, WpoolOpts, RdbmsOpts) -> |
26 |
73 |
try do_start(HostType, Tag, WpoolOpts, RdbmsOpts) |
27 |
|
catch |
28 |
:-( |
Err -> {error, Err} |
29 |
|
end. |
30 |
|
|
31 |
|
default_opts() -> |
32 |
73 |
[{call_timeout, 60000}]. |
33 |
|
|
34 |
|
stop(_, _) -> |
35 |
70 |
ok. |
36 |
|
|
37 |
|
%% -------------------------------------------------------------- |
38 |
|
%% Helper functions |
39 |
|
do_start(HostType, Tag, WpoolOpts0, RdbmsOpts) when is_list(WpoolOpts0) and is_list(RdbmsOpts) -> |
40 |
73 |
BackendName = backend_name(RdbmsOpts), |
41 |
73 |
BackendOpts = RdbmsOpts ++ [{backend, BackendName}], |
42 |
73 |
mongoose_backend:init(global, mongoose_rdbms, [query, execute], BackendOpts), |
43 |
|
|
44 |
73 |
mongoose_metrics:ensure_db_pool_metric({rdbms, HostType, Tag}), |
45 |
73 |
WpoolOpts = make_wpool_opts(WpoolOpts0, RdbmsOpts), |
46 |
73 |
ProcName = mongoose_wpool:make_pool_name(rdbms, HostType, Tag), |
47 |
73 |
mongoose_wpool:start_sup_pool(rdbms, ProcName, WpoolOpts). |
48 |
|
|
49 |
|
make_wpool_opts(WpoolOpts0, RdbmsOpts) -> |
50 |
73 |
Worker = {mongoose_rdbms, RdbmsOpts}, |
51 |
73 |
[{worker, Worker}, {pool_sup_shutdown, infinity} | WpoolOpts0]. |
52 |
|
|
53 |
|
-spec backend_name(proplist:proplists()) -> odbc | pgsql | mysql. |
54 |
|
backend_name(RdbmsOpts) -> |
55 |
73 |
case lists:keyfind(server, 1, RdbmsOpts) of |
56 |
73 |
{_, ConnStr} when is_list(ConnStr) -> odbc; |
57 |
:-( |
{_, Tuple} when is_tuple(Tuple) -> element(1, Tuple) |
58 |
|
end. |