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