1 |
|
%% Copyright (c) 2022 Peter Morgan <peter.james.morgan@gmail.com> |
2 |
|
%% |
3 |
|
%% Licensed under the Apache License, Version 2.0 (the "License"); |
4 |
|
%% you may not use this file except in compliance with the License. |
5 |
|
%% You may obtain a copy of the License at |
6 |
|
%% |
7 |
|
%% http://www.apache.org/licenses/LICENSE-2.0 |
8 |
|
%% |
9 |
|
%% Unless required by applicable law or agreed to in writing, software |
10 |
|
%% distributed under the License is distributed on an "AS IS" BASIS, |
11 |
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 |
|
%% See the License for the specific language governing permissions and |
13 |
|
%% limitations under the License. |
14 |
|
|
15 |
|
|
16 |
|
-module(pgmp_config). |
17 |
|
|
18 |
|
|
19 |
|
-export([backoff/1]). |
20 |
|
-export([codec/1]). |
21 |
|
-export([database/1]). |
22 |
|
-export([enabled/1]). |
23 |
|
-export([pg/1]). |
24 |
|
-export([pgoutput/2]). |
25 |
|
-export([pool/1]). |
26 |
|
-export([protocol/1]). |
27 |
|
-export([rep_log_ets/1]). |
28 |
|
-export([replication/2]). |
29 |
|
-export([sup_flags/1]). |
30 |
|
-export([telemetry/1]). |
31 |
|
-export([timeout/1]). |
32 |
|
-import(envy, [envy/1]). |
33 |
|
|
34 |
|
|
35 |
|
sup_flags(Supervisor) -> |
36 |
131 |
lists:foldl( |
37 |
|
fun |
38 |
|
(Name, A) -> |
39 |
262 |
A#{Name => restart(Supervisor, Name)} |
40 |
|
end, |
41 |
|
#{}, |
42 |
|
[intensity, period]). |
43 |
|
|
44 |
|
|
45 |
|
restart(Supervisor, Name) when Name == intensity; Name == period -> |
46 |
262 |
envy(#{caller => ?MODULE, |
47 |
|
names => [Supervisor, ?FUNCTION_NAME, Name], |
48 |
|
default => restart(Name)}). |
49 |
|
|
50 |
|
restart(intensity) -> |
51 |
131 |
1; |
52 |
|
restart(period) -> |
53 |
131 |
5. |
54 |
|
|
55 |
|
|
56 |
|
backoff(rand_increment = Name) -> |
57 |
:-( |
envy(#{caller => ?MODULE, |
58 |
|
names => [?FUNCTION_NAME, Name], |
59 |
|
default => 1}). |
60 |
|
|
61 |
|
timeout(Name) -> |
62 |
370 |
envy(#{caller => ?MODULE, |
63 |
|
names => [Name, ?FUNCTION_NAME], |
64 |
|
default => infinity}). |
65 |
|
|
66 |
|
|
67 |
|
enabled(rep_log_ets_schema_in_table_name = Name) -> |
68 |
176 |
envy(#{caller => ?MODULE, |
69 |
|
names => [Name, ?FUNCTION_NAME], |
70 |
|
default => false}); |
71 |
|
|
72 |
|
enabled(rep_log_ets_pub_in_table_name = Name) -> |
73 |
176 |
envy(#{caller => ?MODULE, |
74 |
|
names => [Name, ?FUNCTION_NAME], |
75 |
|
default => false}); |
76 |
|
|
77 |
|
enabled(Name) -> |
78 |
30 |
envy(#{caller => ?MODULE, |
79 |
|
names => [Name, ?FUNCTION_NAME], |
80 |
|
default => true}). |
81 |
|
|
82 |
|
|
83 |
|
codec(Type) -> |
84 |
18 |
envy(#{caller => ?MODULE, |
85 |
|
names => [?FUNCTION_NAME, Type], |
86 |
|
default => pgmp_identity}). |
87 |
|
|
88 |
|
|
89 |
|
pg(scope = Name) -> |
90 |
10 |
envy(#{caller => ?MODULE, |
91 |
|
names => [?FUNCTION_NAME, Name], |
92 |
|
default => pgmp}); |
93 |
|
|
94 |
|
pg(group = Name) -> |
95 |
:-( |
envy(#{caller => ?MODULE, |
96 |
|
names => [?FUNCTION_NAME, Name], |
97 |
|
default => mm}). |
98 |
|
|
99 |
|
|
100 |
|
protocol(major = Name) -> |
101 |
66 |
envy(#{caller => ?MODULE, |
102 |
|
names => [?FUNCTION_NAME, Name], |
103 |
|
default => 3}); |
104 |
|
|
105 |
|
protocol(minor = Name) -> |
106 |
66 |
envy(#{caller => ?MODULE, |
107 |
|
names => [?FUNCTION_NAME, Name], |
108 |
|
default => 0}). |
109 |
|
|
110 |
|
rep_log_ets(prefix_table_name = Name) -> |
111 |
176 |
envy(#{caller => ?MODULE, |
112 |
|
names => [?FUNCTION_NAME, Name], |
113 |
|
default => []}). |
114 |
|
|
115 |
|
replication(logical = Type, module = Name) -> |
116 |
10 |
envy(#{caller => ?MODULE, |
117 |
|
names => [?FUNCTION_NAME, Type, Name], |
118 |
|
default => pgmp_rep_log_ets}); |
119 |
|
|
120 |
|
replication(logical = Type, slot_prefix = Name) -> |
121 |
10 |
envy(#{caller => ?MODULE, |
122 |
|
names => [?FUNCTION_NAME, Type, Name], |
123 |
|
default => <<"pgmp">>}); |
124 |
|
|
125 |
|
replication(logical = Type, max_rows = Name) -> |
126 |
5 |
envy(#{caller => ?MODULE, |
127 |
|
names => [?FUNCTION_NAME, Type, Name], |
128 |
|
default => 5_000}); |
129 |
|
|
130 |
|
replication(logical = Type, temporary = Name) -> |
131 |
5 |
envy(#{caller => ?MODULE, |
132 |
|
names => [?FUNCTION_NAME, Type, Name], |
133 |
|
default => true}); |
134 |
|
|
135 |
|
replication(logical = Type, two_phase = Name) -> |
136 |
10 |
envy(#{caller => ?MODULE, |
137 |
|
names => [?FUNCTION_NAME, Type, Name], |
138 |
|
default => false}); |
139 |
|
|
140 |
|
replication(logical = Type, reserve_wal = Name) -> |
141 |
5 |
envy(#{caller => ?MODULE, |
142 |
|
names => [?FUNCTION_NAME, Type, Name], |
143 |
|
default => false}); |
144 |
|
|
145 |
|
replication(logical = Type, snapshot = Name) -> |
146 |
5 |
envy(#{caller => ?MODULE, |
147 |
|
names => [?FUNCTION_NAME, Type, Name], |
148 |
|
default => export}); |
149 |
|
|
150 |
|
replication(logical = Type, publication_names = Name) -> |
151 |
:-( |
binary:split( |
152 |
|
envy(#{caller => ?MODULE, |
153 |
|
names => [?FUNCTION_NAME, Type, Name], |
154 |
|
default => <<"pub">>}), |
155 |
|
<<",">>, |
156 |
|
[global, trim_all]). |
157 |
|
|
158 |
|
|
159 |
|
pgoutput(two_phase = Name, _Version) -> |
160 |
5 |
replication(logical, Name); |
161 |
|
|
162 |
|
pgoutput(origin = Name, _Version) -> |
163 |
5 |
envy(#{caller => ?MODULE, |
164 |
|
names => [?FUNCTION_NAME, Name], |
165 |
|
default => "any"}); |
166 |
|
|
167 |
|
pgoutput(binary = Name, _Version) -> |
168 |
5 |
envy(#{caller => ?MODULE, |
169 |
|
names => [?FUNCTION_NAME, Name], |
170 |
|
default => true}); |
171 |
|
|
172 |
|
pgoutput(messages = Name, _Version) -> |
173 |
5 |
envy(#{caller => ?MODULE, |
174 |
|
names => [?FUNCTION_NAME, Name], |
175 |
|
default => true}); |
176 |
|
|
177 |
|
pgoutput(streaming = Name, Version) when Version >= 4 -> |
178 |
5 |
envy(#{caller => ?MODULE, |
179 |
|
names => [?FUNCTION_NAME, Name], |
180 |
|
default => "parallel"}); |
181 |
|
|
182 |
|
pgoutput(streaming = Name, _Version) -> |
183 |
:-( |
envy(#{caller => ?MODULE, |
184 |
|
names => [?FUNCTION_NAME, Name], |
185 |
|
default => true}). |
186 |
|
|
187 |
|
|
188 |
|
database(options = Name) -> |
189 |
:-( |
envy(#{type => list, |
190 |
|
caller => ?MODULE, |
191 |
|
names => [?FUNCTION_NAME, Name]}); |
192 |
|
|
193 |
|
%% URI used to connect to the database; multiple URIs are separarated |
194 |
|
%% with database(uri_separator) [default ";"] |
195 |
|
%% |
196 |
|
database(uri = Name) -> |
197 |
10 |
envy(#{type => binary, |
198 |
|
caller => ?MODULE, |
199 |
|
names => [?FUNCTION_NAME, Name]}); |
200 |
|
|
201 |
|
%% with multiple databases the separator used between each PostgreSQL |
202 |
|
%% connection URI |
203 |
|
%% |
204 |
|
database(uri_separator = Name) -> |
205 |
:-( |
envy(#{type => list, |
206 |
|
caller => ?MODULE, |
207 |
|
default => ";", |
208 |
|
names => [?FUNCTION_NAME, Name]}); |
209 |
|
|
210 |
|
database(application_name = Name) -> |
211 |
12272 |
envy(#{caller => ?MODULE, |
212 |
|
names => [?FUNCTION_NAME, Name], |
213 |
|
default => <<"default_application_name">>}); |
214 |
|
|
215 |
|
database(hostname = Name) -> |
216 |
10 |
envy(#{caller => ?MODULE, |
217 |
|
names => [?FUNCTION_NAME, Name], |
218 |
|
default => <<"localhost">>}); |
219 |
|
|
220 |
|
database(port = Name) -> |
221 |
10 |
envy(#{caller => ?MODULE, |
222 |
|
names => [?FUNCTION_NAME, Name], |
223 |
|
default => 5432}); |
224 |
|
|
225 |
|
database(user = Name) -> |
226 |
20 |
envy(#{type => binary, |
227 |
|
caller => ?MODULE, |
228 |
|
names => [?FUNCTION_NAME, Name], |
229 |
|
default => os:getenv("USER")}); |
230 |
|
|
231 |
|
database(password = Name) -> |
232 |
66 |
envy(#{caller => ?MODULE, |
233 |
|
names => [?FUNCTION_NAME, Name], |
234 |
|
default => <<"">>}); |
235 |
|
|
236 |
|
database(replication = Name) -> |
237 |
:-( |
envy(#{caller => ?MODULE, |
238 |
|
names => [?FUNCTION_NAME, Name], |
239 |
|
default => <<"false">>}); |
240 |
|
|
241 |
|
database(name = Name) -> |
242 |
10 |
envy(#{caller => ?MODULE, |
243 |
|
names => [?FUNCTION_NAME, Name], |
244 |
|
default => ?FUNCTION_NAME(user)}). |
245 |
|
|
246 |
|
|
247 |
|
pool(max = Name) -> |
248 |
10 |
envy(#{caller => ?MODULE, |
249 |
|
names => [?FUNCTION_NAME, Name], |
250 |
|
default => 5}). |
251 |
|
|
252 |
|
|
253 |
|
telemetry(Name) when Name == module; Name == function -> |
254 |
10 |
envy(#{caller => ?MODULE, |
255 |
|
type => atom, |
256 |
|
names =>[?FUNCTION_NAME, Name]}); |
257 |
|
|
258 |
|
telemetry(event_names = Name) -> |
259 |
:-( |
envy(#{caller => ?MODULE, |
260 |
|
names => [?FUNCTION_NAME, Name], |
261 |
|
default => filename:join(pgmp:priv_dir(), "telemetry.terms")}); |
262 |
|
|
263 |
|
telemetry(config = Name) -> |
264 |
:-( |
envy:get_env(pgmp, |
265 |
|
pgmp_util:snake_case([?FUNCTION_NAME, Name]), |
266 |
|
[app_env, {default, []}]). |