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