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 |
|
-spec init() -> ok. |
11 |
|
init() -> |
12 |
:-( |
case ets:info(prepared_statements) of |
13 |
|
undefined -> |
14 |
:-( |
Heir = case whereis(ejabberd_sup) of |
15 |
:-( |
undefined -> []; |
16 |
:-( |
Pid -> [{heir, Pid, undefined}] |
17 |
|
end, |
18 |
:-( |
ets:new(prepared_statements, |
19 |
|
[named_table, public, {read_concurrency, true} | Heir]), |
20 |
:-( |
ok; |
21 |
|
_ -> |
22 |
:-( |
ok |
23 |
|
end. |
24 |
|
|
25 |
|
-spec start(mongooseim:host_type_or_global(), mongoose_wpool:tag(), |
26 |
|
mongoose_wpool:pool_opts(), mongoose_wpool:conn_opts()) -> {ok, pid()} | {error, any()}. |
27 |
|
start(HostType, Tag, WpoolOpts, RdbmsOpts) -> |
28 |
:-( |
try do_start(HostType, Tag, WpoolOpts, RdbmsOpts) |
29 |
|
catch |
30 |
:-( |
Err -> {error, Err} |
31 |
|
end. |
32 |
|
|
33 |
|
-spec stop(mongooseim:host_type_or_global(), mongoose_wpool:tag()) -> ok. |
34 |
|
stop(_, _) -> |
35 |
:-( |
ok. |
36 |
|
|
37 |
|
%% -------------------------------------------------------------- |
38 |
|
%% Helper functions |
39 |
|
do_start(HostType, Tag, WpoolOpts0, RdbmsOpts) when is_list(WpoolOpts0) and is_map(RdbmsOpts) -> |
40 |
:-( |
#{driver := BackendName} = RdbmsOpts, |
41 |
:-( |
mongoose_backend:init(global, mongoose_rdbms, [query, execute], #{backend => BackendName}), |
42 |
:-( |
mongoose_metrics:ensure_db_pool_metric({rdbms, HostType, Tag}), |
43 |
:-( |
WpoolOpts = make_wpool_opts(WpoolOpts0, RdbmsOpts), |
44 |
:-( |
ProcName = mongoose_wpool:make_pool_name(rdbms, HostType, Tag), |
45 |
:-( |
mongoose_wpool:start_sup_pool(rdbms, ProcName, WpoolOpts). |
46 |
|
|
47 |
|
make_wpool_opts(WpoolOpts0, RdbmsOpts) -> |
48 |
:-( |
Worker = {mongoose_rdbms, RdbmsOpts}, |
49 |
:-( |
[{worker, Worker}, {pool_sup_shutdown, infinity} | WpoolOpts0]. |