Line data Source code
1 : /*
2 : This file is part of TALER
3 : Copyright (C) 2022-2024 Taler Systems SA
4 :
5 : TALER is free software; you can redistribute it and/or modify it under the
6 : terms of the GNU General Public License as published by the Free Software
7 : Foundation; either version 3, or (at your option) any later version.
8 :
9 : TALER is distributed in the hope that it will be useful, but WITHOUT ANY
10 : WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11 : A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12 :
13 : You should have received a copy of the GNU General Public License along with
14 : TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
15 : */
16 : /**
17 : * @file pg_lookup_serial_by_table.c
18 : * @brief Low-level (statement-level) Postgres database access for the exchange
19 : * @author Christian Grothoff
20 : */
21 : #include "platform.h"
22 : #include "taler_error_codes.h"
23 : #include "taler_dbevents.h"
24 : #include "taler_pq_lib.h"
25 : #include "pg_lookup_serial_by_table.h"
26 : #include "pg_helper.h"
27 :
28 :
29 : /**
30 : * Assign statement to @a n and PREPARE
31 : * @a sql under name @a n.
32 : */
33 : #define XPREPARE(n,sql) \
34 : statement = n; \
35 : PREPARE (pg, n, sql);
36 :
37 :
38 : enum GNUNET_DB_QueryStatus
39 172 : TEH_PG_lookup_serial_by_table (void *cls,
40 : enum TALER_EXCHANGEDB_ReplicatedTable table,
41 : uint64_t *serial)
42 : {
43 172 : struct PostgresClosure *pg = cls;
44 172 : struct GNUNET_PQ_QueryParam params[] = {
45 : GNUNET_PQ_query_param_end
46 : };
47 172 : struct GNUNET_PQ_ResultSpec rs[] = {
48 172 : GNUNET_PQ_result_spec_uint64 ("serial",
49 : serial),
50 : GNUNET_PQ_result_spec_end
51 : };
52 172 : const char *statement = NULL;
53 :
54 172 : switch (table)
55 : {
56 4 : case TALER_EXCHANGEDB_RT_DENOMINATIONS:
57 6 : XPREPARE ("select_serial_by_table_denominations",
58 : "SELECT"
59 : " denominations_serial AS serial"
60 : " FROM denominations"
61 : " ORDER BY denominations_serial DESC"
62 : " LIMIT 1;");
63 4 : break;
64 4 : case TALER_EXCHANGEDB_RT_DENOMINATION_REVOCATIONS:
65 6 : XPREPARE ("select_serial_by_table_denomination_revocations",
66 : "SELECT"
67 : " denom_revocations_serial_id AS serial"
68 : " FROM denomination_revocations"
69 : " ORDER BY denom_revocations_serial_id DESC"
70 : " LIMIT 1;");
71 4 : break;
72 4 : case TALER_EXCHANGEDB_RT_WIRE_TARGETS:
73 6 : XPREPARE ("select_serial_by_table_wire_targets",
74 : "SELECT"
75 : " wire_target_serial_id AS serial"
76 : " FROM wire_targets"
77 : " ORDER BY wire_target_serial_id DESC"
78 : " LIMIT 1;");
79 4 : break;
80 4 : case TALER_EXCHANGEDB_RT_KYC_TARGETS:
81 6 : XPREPARE ("select_serial_by_table_kyc_targets",
82 : "SELECT"
83 : " kyc_target_serial_id AS serial"
84 : " FROM kyc_targets"
85 : " ORDER BY kyc_target_serial_id DESC"
86 : " LIMIT 1;");
87 4 : break;
88 4 : case TALER_EXCHANGEDB_RT_RESERVES:
89 6 : XPREPARE ("select_serial_by_table_reserves",
90 : "SELECT"
91 : " reserve_uuid AS serial"
92 : " FROM reserves"
93 : " ORDER BY reserve_uuid DESC"
94 : " LIMIT 1;");
95 4 : break;
96 4 : case TALER_EXCHANGEDB_RT_RESERVES_IN:
97 6 : XPREPARE ("select_serial_by_table_reserves_in",
98 : "SELECT"
99 : " reserve_in_serial_id AS serial"
100 : " FROM reserves_in"
101 : " ORDER BY reserve_in_serial_id DESC"
102 : " LIMIT 1;");
103 4 : break;
104 0 : case TALER_EXCHANGEDB_RT_KYCAUTHS_IN:
105 0 : XPREPARE ("select_serial_by_table_kycauths_in",
106 : "SELECT"
107 : " kycauth_in_serial_id AS serial"
108 : " FROM kycauths_in"
109 : " ORDER BY kycauths_in_serial_id DESC"
110 : " LIMIT 1;");
111 0 : break;
112 4 : case TALER_EXCHANGEDB_RT_RESERVES_CLOSE:
113 6 : XPREPARE ("select_serial_by_table_reserves_close",
114 : "SELECT"
115 : " close_uuid AS serial"
116 : " FROM reserves_close"
117 : " ORDER BY close_uuid DESC"
118 : " LIMIT 1;");
119 4 : break;
120 4 : case TALER_EXCHANGEDB_RT_RESERVES_OPEN_REQUESTS:
121 6 : XPREPARE ("select_serial_by_table_reserves_open_requests",
122 : "SELECT"
123 : " open_request_uuid AS serial"
124 : " FROM reserves_open_requests"
125 : " ORDER BY open_request_uuid DESC"
126 : " LIMIT 1;");
127 4 : break;
128 4 : case TALER_EXCHANGEDB_RT_RESERVES_OPEN_DEPOSITS:
129 6 : XPREPARE ("select_serial_by_table_reserves_open_deposits",
130 : "SELECT"
131 : " reserve_open_deposit_uuid AS serial"
132 : " FROM reserves_open_deposits"
133 : " ORDER BY reserve_open_deposit_uuid DESC"
134 : " LIMIT 1;");
135 4 : break;
136 4 : case TALER_EXCHANGEDB_RT_AUDITORS:
137 6 : XPREPARE ("select_serial_by_table_auditors",
138 : "SELECT"
139 : " auditor_uuid AS serial"
140 : " FROM auditors"
141 : " ORDER BY auditor_uuid DESC"
142 : " LIMIT 1;");
143 4 : break;
144 4 : case TALER_EXCHANGEDB_RT_AUDITOR_DENOM_SIGS:
145 6 : XPREPARE ("select_serial_by_table_auditor_denom_sigs",
146 : "SELECT"
147 : " auditor_denom_serial AS serial"
148 : " FROM auditor_denom_sigs"
149 : " ORDER BY auditor_denom_serial DESC"
150 : " LIMIT 1;");
151 4 : break;
152 4 : case TALER_EXCHANGEDB_RT_EXCHANGE_SIGN_KEYS:
153 6 : XPREPARE ("select_serial_by_table_exchange_sign_keys",
154 : "SELECT"
155 : " esk_serial AS serial"
156 : " FROM exchange_sign_keys"
157 : " ORDER BY esk_serial DESC"
158 : " LIMIT 1;");
159 4 : break;
160 4 : case TALER_EXCHANGEDB_RT_SIGNKEY_REVOCATIONS:
161 6 : XPREPARE ("select_serial_by_table_signkey_revocations",
162 : "SELECT"
163 : " signkey_revocations_serial_id AS serial"
164 : " FROM signkey_revocations"
165 : " ORDER BY signkey_revocations_serial_id DESC"
166 : " LIMIT 1;");
167 4 : break;
168 4 : case TALER_EXCHANGEDB_RT_KNOWN_COINS:
169 6 : XPREPARE ("select_serial_by_table_known_coins",
170 : "SELECT"
171 : " known_coin_id AS serial"
172 : " FROM known_coins"
173 : " ORDER BY known_coin_id DESC"
174 : " LIMIT 1;");
175 4 : break;
176 4 : case TALER_EXCHANGEDB_RT_REFRESH:
177 6 : XPREPARE ("select_serial_by_table_refresh",
178 : "SELECT"
179 : " refresh_id AS serial"
180 : " FROM refresh"
181 : " ORDER BY refresh_id DESC"
182 : " LIMIT 1;");
183 4 : break;
184 4 : case TALER_EXCHANGEDB_RT_BATCH_DEPOSITS:
185 6 : XPREPARE ("select_serial_by_table_batch_deposits",
186 : "SELECT"
187 : " batch_deposit_serial_id AS serial"
188 : " FROM batch_deposits"
189 : " ORDER BY batch_deposit_serial_id DESC"
190 : " LIMIT 1;");
191 4 : break;
192 4 : case TALER_EXCHANGEDB_RT_COIN_DEPOSITS:
193 6 : XPREPARE ("select_serial_by_table_coin_deposits",
194 : "SELECT"
195 : " coin_deposit_serial_id AS serial"
196 : " FROM coin_deposits"
197 : " ORDER BY coin_deposit_serial_id DESC"
198 : " LIMIT 1;");
199 4 : break;
200 4 : case TALER_EXCHANGEDB_RT_REFUNDS:
201 6 : XPREPARE ("select_serial_by_table_refunds",
202 : "SELECT"
203 : " refund_serial_id AS serial"
204 : " FROM refunds"
205 : " ORDER BY refund_serial_id DESC"
206 : " LIMIT 1;");
207 4 : break;
208 4 : case TALER_EXCHANGEDB_RT_WIRE_OUT:
209 6 : XPREPARE ("select_serial_by_table_wire_out",
210 : "SELECT"
211 : " wireout_uuid AS serial"
212 : " FROM wire_out"
213 : " ORDER BY wireout_uuid DESC"
214 : " LIMIT 1;");
215 4 : break;
216 4 : case TALER_EXCHANGEDB_RT_AGGREGATION_TRACKING:
217 6 : XPREPARE ("select_serial_by_table_aggregation_tracking",
218 : "SELECT"
219 : " aggregation_serial_id AS serial"
220 : " FROM aggregation_tracking"
221 : " ORDER BY aggregation_serial_id DESC"
222 : " LIMIT 1;");
223 4 : break;
224 4 : case TALER_EXCHANGEDB_RT_WIRE_FEE:
225 6 : XPREPARE ("select_serial_by_table_wire_fee",
226 : "SELECT"
227 : " wire_fee_serial AS serial"
228 : " FROM wire_fee"
229 : " ORDER BY wire_fee_serial DESC"
230 : " LIMIT 1;");
231 4 : break;
232 4 : case TALER_EXCHANGEDB_RT_GLOBAL_FEE:
233 6 : XPREPARE ("select_serial_by_table_global_fee",
234 : "SELECT"
235 : " global_fee_serial AS serial"
236 : " FROM global_fee"
237 : " ORDER BY global_fee_serial DESC"
238 : " LIMIT 1;");
239 4 : break;
240 4 : case TALER_EXCHANGEDB_RT_RECOUP:
241 6 : XPREPARE ("select_serial_by_table_recoup",
242 : "SELECT"
243 : " recoup_uuid AS serial"
244 : " FROM recoup"
245 : " ORDER BY recoup_uuid DESC"
246 : " LIMIT 1;");
247 4 : break;
248 4 : case TALER_EXCHANGEDB_RT_RECOUP_REFRESH:
249 6 : XPREPARE ("select_serial_by_table_recoup_refresh",
250 : "SELECT"
251 : " recoup_refresh_uuid AS serial"
252 : " FROM recoup_refresh"
253 : " ORDER BY recoup_refresh_uuid DESC"
254 : " LIMIT 1;");
255 4 : break;
256 4 : case TALER_EXCHANGEDB_RT_EXTENSIONS:
257 6 : XPREPARE ("select_serial_by_table_extensions",
258 : "SELECT"
259 : " extension_id AS serial"
260 : " FROM extensions"
261 : " ORDER BY extension_id DESC"
262 : " LIMIT 1;");
263 4 : break;
264 4 : case TALER_EXCHANGEDB_RT_POLICY_DETAILS:
265 6 : XPREPARE ("select_serial_by_table_policy_details",
266 : "SELECT"
267 : " policy_details_serial_id AS serial"
268 : " FROM policy_details"
269 : " ORDER BY policy_details_serial_id DESC"
270 : " LIMIT 1;");
271 4 : break;
272 4 : case TALER_EXCHANGEDB_RT_POLICY_FULFILLMENTS:
273 6 : XPREPARE ("select_serial_by_table_policy_fulfillments",
274 : "SELECT"
275 : " fulfillment_id AS serial"
276 : " FROM policy_fulfillments"
277 : " ORDER BY fulfillment_id DESC"
278 : " LIMIT 1;");
279 4 : break;
280 4 : case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
281 6 : XPREPARE ("select_serial_by_table_purse_requests",
282 : "SELECT"
283 : " purse_requests_serial_id AS serial"
284 : " FROM purse_requests"
285 : " ORDER BY purse_requests_serial_id DESC"
286 : " LIMIT 1;")
287 4 : break;
288 4 : case TALER_EXCHANGEDB_RT_PURSE_DECISION:
289 6 : XPREPARE ("select_serial_by_table_purse_decision",
290 : "SELECT"
291 : " purse_decision_serial_id AS serial"
292 : " FROM purse_decision"
293 : " ORDER BY purse_decision_serial_id DESC"
294 : " LIMIT 1;");
295 4 : break;
296 4 : case TALER_EXCHANGEDB_RT_PURSE_MERGES:
297 6 : XPREPARE ("select_serial_by_table_purse_merges",
298 : "SELECT"
299 : " purse_merge_request_serial_id AS serial"
300 : " FROM purse_merges"
301 : " ORDER BY purse_merge_request_serial_id DESC"
302 : " LIMIT 1;");
303 4 : break;
304 4 : case TALER_EXCHANGEDB_RT_PURSE_DEPOSITS:
305 6 : XPREPARE ("select_serial_by_table_purse_deposits",
306 : "SELECT"
307 : " purse_deposit_serial_id AS serial"
308 : " FROM purse_deposits"
309 : " ORDER BY purse_deposit_serial_id DESC"
310 : " LIMIT 1;");
311 4 : break;
312 4 : case TALER_EXCHANGEDB_RT_ACCOUNT_MERGES:
313 6 : XPREPARE ("select_serial_by_table_account_merges",
314 : "SELECT"
315 : " account_merge_request_serial_id AS serial"
316 : " FROM account_merges"
317 : " ORDER BY account_merge_request_serial_id DESC"
318 : " LIMIT 1;");
319 4 : break;
320 4 : case TALER_EXCHANGEDB_RT_HISTORY_REQUESTS:
321 6 : XPREPARE ("select_serial_by_table_history_requests",
322 : "SELECT"
323 : " history_request_serial_id AS serial"
324 : " FROM history_requests"
325 : " ORDER BY history_request_serial_id DESC"
326 : " LIMIT 1;");
327 4 : break;
328 4 : case TALER_EXCHANGEDB_RT_CLOSE_REQUESTS:
329 6 : XPREPARE ("select_serial_by_table_close_requests",
330 : "SELECT"
331 : " close_request_serial_id AS serial"
332 : " FROM close_requests"
333 : " ORDER BY close_request_serial_id DESC"
334 : " LIMIT 1;");
335 4 : break;
336 4 : case TALER_EXCHANGEDB_RT_WADS_OUT:
337 6 : XPREPARE ("select_serial_by_table_wads_out",
338 : "SELECT"
339 : " wad_out_serial_id AS serial"
340 : " FROM wads_out"
341 : " ORDER BY wad_out_serial_id DESC"
342 : " LIMIT 1;");
343 4 : break;
344 4 : case TALER_EXCHANGEDB_RT_WADS_OUT_ENTRIES:
345 6 : XPREPARE ("select_serial_by_table_wads_out_entries",
346 : "SELECT"
347 : " wad_out_entry_serial_id AS serial"
348 : " FROM wad_out_entries"
349 : " ORDER BY wad_out_entry_serial_id DESC"
350 : " LIMIT 1;");
351 4 : break;
352 4 : case TALER_EXCHANGEDB_RT_WADS_IN:
353 6 : XPREPARE ("select_serial_by_table_wads_in",
354 : "SELECT"
355 : " wad_in_serial_id AS serial"
356 : " FROM wads_in"
357 : " ORDER BY wad_in_serial_id DESC"
358 : " LIMIT 1;");
359 4 : break;
360 4 : case TALER_EXCHANGEDB_RT_WADS_IN_ENTRIES:
361 6 : XPREPARE ("select_serial_by_table_wads_in_entries",
362 : "SELECT"
363 : " wad_in_entry_serial_id AS serial"
364 : " FROM wad_in_entries"
365 : " ORDER BY wad_in_entry_serial_id DESC"
366 : " LIMIT 1;");
367 4 : break;
368 4 : case TALER_EXCHANGEDB_RT_PROFIT_DRAINS:
369 6 : XPREPARE ("select_serial_by_table_profit_drains",
370 : "SELECT"
371 : " profit_drain_serial_id AS serial"
372 : " FROM profit_drains"
373 : " ORDER BY profit_drain_serial_id DESC"
374 : " LIMIT 1;");
375 4 : statement = "select_serial_by_table_profit_drains";
376 4 : break;
377 0 : case TALER_EXCHANGEDB_RT_AML_STAFF:
378 0 : XPREPARE ("select_serial_by_table_aml_staff",
379 : "SELECT"
380 : " aml_staff_uuid AS serial"
381 : " FROM aml_staff"
382 : " ORDER BY aml_staff_uuid DESC"
383 : " LIMIT 1;");
384 0 : statement = "select_serial_by_table_aml_staff";
385 0 : break;
386 0 : case TALER_EXCHANGEDB_RT_PURSE_DELETION:
387 0 : XPREPARE ("select_serial_by_table_purse_deletion",
388 : "SELECT"
389 : " purse_deletion_serial_id AS serial"
390 : " FROM purse_deletion"
391 : " ORDER BY purse_deletion_serial_id DESC"
392 : " LIMIT 1;");
393 0 : statement = "select_serial_by_table_purse_deletion";
394 0 : break;
395 4 : case TALER_EXCHANGEDB_RT_WITHDRAW:
396 6 : XPREPARE ("select_serial_by_table_withdraw",
397 : "SELECT"
398 : " withdraw_id AS serial"
399 : " FROM withdraw"
400 : " ORDER BY withdraw_id DESC"
401 : " LIMIT 1;");
402 4 : statement = "select_serial_by_table_withdraw";
403 4 : break;
404 4 : case TALER_EXCHANGEDB_RT_LEGITIMIZATION_MEASURES:
405 6 : XPREPARE ("select_serial_by_table_legitimization_measures",
406 : "SELECT"
407 : " legitimization_measure_serial_id AS serial"
408 : " FROM legitimization_measures"
409 : " ORDER BY legitimization_measure_serial_id DESC"
410 : " LIMIT 1;");
411 4 : break;
412 4 : case TALER_EXCHANGEDB_RT_LEGITIMIZATION_OUTCOMES:
413 6 : XPREPARE ("select_serial_by_table_legitimization_outcomes",
414 : "SELECT"
415 : " outcome_serial_id AS serial"
416 : " FROM legitimization_outcomes"
417 : " ORDER BY outcome_serial_id DESC"
418 : " LIMIT 1;");
419 4 : break;
420 4 : case TALER_EXCHANGEDB_RT_LEGITIMIZATION_PROCESSES:
421 6 : XPREPARE ("select_serial_by_table_legitimization_processes",
422 : "SELECT"
423 : " legitimization_process_serial_id AS serial"
424 : " FROM legitimization_processes"
425 : " ORDER BY legitimization_process_serial_id DESC"
426 : " LIMIT 1;");
427 4 : break;
428 0 : case TALER_EXCHANGEDB_RT_KYC_ATTRIBUTES:
429 0 : XPREPARE ("select_serial_by_table_kyc_attributes",
430 : "SELECT"
431 : " kyc_attributes_serial_id AS serial"
432 : " FROM kyc_attributes"
433 : " ORDER BY kyc_attributes_serial_id DESC"
434 : " LIMIT 1;");
435 0 : statement = "select_serial_by_table_kyc_attributes";
436 0 : break;
437 0 : case TALER_EXCHANGEDB_RT_AML_HISTORY:
438 0 : XPREPARE ("select_serial_by_table_aml_history",
439 : "SELECT"
440 : " aml_history_serial_id AS serial"
441 : " FROM aml_history"
442 : " ORDER BY aml_history_serial_id DESC"
443 : " LIMIT 1;");
444 0 : statement = "select_serial_by_table_aml_history";
445 0 : break;
446 0 : case TALER_EXCHANGEDB_RT_KYC_EVENTS:
447 0 : XPREPARE ("select_serial_by_table_kyc_events",
448 : "SELECT"
449 : " kyc_event_serial_id AS serial"
450 : " FROM kyc_events"
451 : " ORDER BY kyc_event_serial_id DESC"
452 : " LIMIT 1;");
453 0 : break;
454 : }
455 172 : if (NULL == statement)
456 : {
457 0 : GNUNET_break (0);
458 0 : return GNUNET_DB_STATUS_HARD_ERROR;
459 : }
460 172 : return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
461 : statement,
462 : params,
463 : rs);
464 : }
465 :
466 :
467 : #undef XPREPARE
|