Line data Source code
1 : /*
2 : This file is part of GNUnet
3 : Copyright (C) 2020-2025 Taler Systems SA
4 :
5 : GNUnet is free software: you can redistribute it and/or modify it
6 : under the terms of the GNU Affero General Public License as published
7 : by the Free Software Foundation, either version 3 of the License,
8 : or (at your option) any later version.
9 :
10 : GNUnet is distributed in the hope that it will be useful, but
11 : WITHOUT ANY WARRANTY; without even the implied warranty of
12 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 : Affero General Public License for more details.
14 :
15 : You should have received a copy of the GNU Affero General Public License
16 : along with this program. If not, see <http://www.gnu.org/licenses/>.
17 :
18 : SPDX-License-Identifier: AGPL3.0-or-later
19 : */
20 : /**
21 : * @file exchangedb/pg_lookup_records_by_table.c
22 : * @brief implementation of lookup_records_by_table
23 : * @author Christian Grothoff
24 : * @author Özgür Kesim
25 : */
26 : #include "taler/platform.h"
27 : #include "taler/taler_error_codes.h"
28 : #include "taler/taler_dbevents.h"
29 : #include "taler/taler_pq_lib.h"
30 : #include "pg_lookup_records_by_table.h"
31 : #include "pg_helper.h"
32 : #include <gnunet/gnunet_pq_lib.h>
33 :
34 :
35 : /**
36 : * Closure for callbacks used by #postgres_lookup_records_by_table.
37 : */
38 : struct LookupRecordsByTableContext
39 : {
40 : /**
41 : * Plugin context.
42 : */
43 : struct PostgresClosure *pg;
44 :
45 : /**
46 : * Function to call with the results.
47 : */
48 : TALER_EXCHANGEDB_ReplicationCallback cb;
49 :
50 : /**
51 : * Closure for @a cb.
52 : */
53 : void *cb_cls;
54 :
55 : /**
56 : * Set to true on errors.
57 : */
58 : bool error;
59 : };
60 :
61 :
62 : /**
63 : * Function called with denominations table entries.
64 : *
65 : * @param cls closure
66 : * @param result the postgres result
67 : * @param num_results the number of results in @a result
68 : */
69 : static void
70 0 : lrbt_cb_table_denominations (void *cls,
71 : PGresult *result,
72 : unsigned int num_results)
73 : {
74 0 : struct LookupRecordsByTableContext *ctx = cls;
75 0 : struct PostgresClosure *pg = ctx->pg;
76 0 : struct TALER_EXCHANGEDB_TableData td = {
77 : .table = TALER_EXCHANGEDB_RT_DENOMINATIONS
78 : };
79 :
80 0 : for (unsigned int i = 0; i<num_results; i++)
81 : {
82 0 : struct GNUNET_PQ_ResultSpec rs[] = {
83 0 : GNUNET_PQ_result_spec_uint64 (
84 : "serial",
85 : &td.serial),
86 0 : GNUNET_PQ_result_spec_uint32 (
87 : "denom_type",
88 : &td.details.denominations.denom_type),
89 0 : GNUNET_PQ_result_spec_uint32 (
90 : "age_mask",
91 : &td.details.denominations.age_mask),
92 0 : TALER_PQ_result_spec_denom_pub (
93 : "denom_pub",
94 : &td.details.denominations.denom_pub),
95 0 : GNUNET_PQ_result_spec_auto_from_type (
96 : "master_sig",
97 : &td.details.denominations.master_sig),
98 0 : GNUNET_PQ_result_spec_timestamp (
99 : "valid_from",
100 : &td.details.denominations.valid_from),
101 0 : GNUNET_PQ_result_spec_timestamp (
102 : "expire_withdraw",
103 : &td.details.denominations.
104 : expire_withdraw),
105 0 : GNUNET_PQ_result_spec_timestamp (
106 : "expire_deposit",
107 : &td.details.denominations.
108 : expire_deposit),
109 0 : GNUNET_PQ_result_spec_timestamp (
110 : "expire_legal",
111 : &td.details.denominations.expire_legal),
112 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
113 : "coin",
114 : &td.details.denominations.coin),
115 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
116 : "fee_withdraw",
117 : &td.details.denominations.fees.withdraw),
118 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
119 : "fee_deposit",
120 : &td.details.denominations.fees.deposit),
121 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
122 : "fee_refresh",
123 : &td.details.denominations.fees.refresh),
124 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
125 : "fee_refund",
126 : &td.details.denominations.fees.refund),
127 : GNUNET_PQ_result_spec_end
128 : };
129 :
130 0 : if (GNUNET_OK !=
131 0 : GNUNET_PQ_extract_result (result,
132 : rs,
133 : i))
134 : {
135 0 : GNUNET_break (0);
136 0 : ctx->error = true;
137 0 : return;
138 : }
139 0 : ctx->cb (ctx->cb_cls,
140 : &td);
141 0 : GNUNET_PQ_cleanup_result (rs);
142 : }
143 : }
144 :
145 :
146 : /**
147 : * Function called with denomination_revocations table entries.
148 : *
149 : * @param cls closure
150 : * @param result the postgres result
151 : * @param num_results the number of results in @a result
152 : */
153 : static void
154 0 : lrbt_cb_table_denomination_revocations (void *cls,
155 : PGresult *result,
156 : unsigned int num_results)
157 : {
158 0 : struct LookupRecordsByTableContext *ctx = cls;
159 0 : struct TALER_EXCHANGEDB_TableData td = {
160 : .table = TALER_EXCHANGEDB_RT_DENOMINATION_REVOCATIONS
161 : };
162 :
163 0 : for (unsigned int i = 0; i<num_results; i++)
164 : {
165 0 : struct GNUNET_PQ_ResultSpec rs[] = {
166 0 : GNUNET_PQ_result_spec_uint64 ("serial",
167 : &td.serial),
168 0 : GNUNET_PQ_result_spec_uint64 (
169 : "denominations_serial",
170 : &td.details.denomination_revocations.denominations_serial),
171 0 : GNUNET_PQ_result_spec_auto_from_type (
172 : "master_sig",
173 : &td.details.denomination_revocations.master_sig),
174 : GNUNET_PQ_result_spec_end
175 : };
176 :
177 0 : if (GNUNET_OK !=
178 0 : GNUNET_PQ_extract_result (result,
179 : rs,
180 : i))
181 : {
182 0 : GNUNET_break (0);
183 0 : ctx->error = true;
184 0 : return;
185 : }
186 0 : ctx->cb (ctx->cb_cls,
187 : &td);
188 0 : GNUNET_PQ_cleanup_result (rs);
189 : }
190 : }
191 :
192 :
193 : /**
194 : * Function called with wire_targets table entries.
195 : *
196 : * @param cls closure
197 : * @param result the postgres result
198 : * @param num_results the number of results in @a result
199 : */
200 : static void
201 0 : lrbt_cb_table_wire_targets (void *cls,
202 : PGresult *result,
203 : unsigned int num_results)
204 : {
205 0 : struct LookupRecordsByTableContext *ctx = cls;
206 0 : struct TALER_EXCHANGEDB_TableData td = {
207 : .table = TALER_EXCHANGEDB_RT_WIRE_TARGETS
208 : };
209 :
210 0 : for (unsigned int i = 0; i<num_results; i++)
211 : {
212 0 : struct GNUNET_PQ_ResultSpec rs[] = {
213 0 : GNUNET_PQ_result_spec_uint64 (
214 : "serial",
215 : &td.serial),
216 0 : GNUNET_PQ_result_spec_string (
217 : "payto_uri",
218 : &td.details.wire_targets.full_payto_uri.full_payto),
219 : GNUNET_PQ_result_spec_end
220 : };
221 :
222 0 : if (GNUNET_OK !=
223 0 : GNUNET_PQ_extract_result (result,
224 : rs,
225 : i))
226 : {
227 0 : GNUNET_break (0);
228 0 : ctx->error = true;
229 0 : return;
230 : }
231 0 : ctx->cb (ctx->cb_cls,
232 : &td);
233 0 : GNUNET_PQ_cleanup_result (rs);
234 : }
235 : }
236 :
237 :
238 : /**
239 : * Function called with wire_targets table entries.
240 : *
241 : * @param cls closure
242 : * @param result the postgres result
243 : * @param num_results the number of results in @a result
244 : */
245 : static void
246 0 : lrbt_cb_table_kyc_targets (void *cls,
247 : PGresult *result,
248 : unsigned int num_results)
249 : {
250 0 : struct LookupRecordsByTableContext *ctx = cls;
251 0 : struct TALER_EXCHANGEDB_TableData td = {
252 : .table = TALER_EXCHANGEDB_RT_KYC_TARGETS
253 : };
254 :
255 0 : for (unsigned int i = 0; i<num_results; i++)
256 : {
257 0 : struct GNUNET_PQ_ResultSpec rs[] = {
258 0 : GNUNET_PQ_result_spec_uint64 (
259 : "serial",
260 : &td.serial),
261 0 : GNUNET_PQ_result_spec_auto_from_type (
262 : "h_normalized_payto",
263 : &td.details.kyc_targets.h_normalized_payto),
264 0 : GNUNET_PQ_result_spec_auto_from_type (
265 : "access_token",
266 : &td.details.kyc_targets.access_token),
267 0 : GNUNET_PQ_result_spec_allow_null (
268 : GNUNET_PQ_result_spec_auto_from_type (
269 : "target_pub",
270 : &td.details.kyc_targets.target_pub),
271 : &td.details.kyc_targets.no_account),
272 0 : GNUNET_PQ_result_spec_bool (
273 : "is_wallet",
274 : &td.details.kyc_targets.is_wallet),
275 : GNUNET_PQ_result_spec_end
276 : };
277 :
278 0 : if (GNUNET_OK !=
279 0 : GNUNET_PQ_extract_result (result,
280 : rs,
281 : i))
282 : {
283 0 : GNUNET_break (0);
284 0 : ctx->error = true;
285 0 : return;
286 : }
287 0 : ctx->cb (ctx->cb_cls,
288 : &td);
289 0 : GNUNET_PQ_cleanup_result (rs);
290 : }
291 : }
292 :
293 :
294 : /**
295 : * Function called with reserves table entries.
296 : *
297 : * @param cls closure
298 : * @param result the postgres result
299 : * @param num_results the number of results in @a result
300 : */
301 : static void
302 0 : lrbt_cb_table_reserves (void *cls,
303 : PGresult *result,
304 : unsigned int num_results)
305 : {
306 0 : struct LookupRecordsByTableContext *ctx = cls;
307 0 : struct TALER_EXCHANGEDB_TableData td = {
308 : .table = TALER_EXCHANGEDB_RT_RESERVES
309 : };
310 :
311 0 : for (unsigned int i = 0; i<num_results; i++)
312 : {
313 0 : struct GNUNET_PQ_ResultSpec rs[] = {
314 0 : GNUNET_PQ_result_spec_uint64 ("serial",
315 : &td.serial),
316 0 : GNUNET_PQ_result_spec_auto_from_type ("reserve_pub",
317 : &td.details.reserves.reserve_pub),
318 0 : GNUNET_PQ_result_spec_timestamp ("expiration_date",
319 : &td.details.reserves.expiration_date),
320 0 : GNUNET_PQ_result_spec_timestamp ("gc_date",
321 : &td.details.reserves.gc_date),
322 : GNUNET_PQ_result_spec_end
323 : };
324 :
325 0 : if (GNUNET_OK !=
326 0 : GNUNET_PQ_extract_result (result,
327 : rs,
328 : i))
329 : {
330 0 : GNUNET_break (0);
331 0 : ctx->error = true;
332 0 : return;
333 : }
334 0 : ctx->cb (ctx->cb_cls,
335 : &td);
336 0 : GNUNET_PQ_cleanup_result (rs);
337 : }
338 : }
339 :
340 :
341 : /**
342 : * Function called with reserves_in table entries.
343 : *
344 : * @param cls closure
345 : * @param result the postgres result
346 : * @param num_results the number of results in @a result
347 : */
348 : static void
349 0 : lrbt_cb_table_reserves_in (void *cls,
350 : PGresult *result,
351 : unsigned int num_results)
352 : {
353 0 : struct LookupRecordsByTableContext *ctx = cls;
354 0 : struct PostgresClosure *pg = ctx->pg;
355 0 : struct TALER_EXCHANGEDB_TableData td = {
356 : .table = TALER_EXCHANGEDB_RT_RESERVES_IN
357 : };
358 :
359 0 : for (unsigned int i = 0; i<num_results; i++)
360 : {
361 0 : struct GNUNET_PQ_ResultSpec rs[] = {
362 0 : GNUNET_PQ_result_spec_uint64 (
363 : "serial",
364 : &td.serial),
365 0 : GNUNET_PQ_result_spec_auto_from_type (
366 : "reserve_pub",
367 : &td.details.reserves_in.reserve_pub),
368 0 : GNUNET_PQ_result_spec_uint64 (
369 : "wire_reference",
370 : &td.details.reserves_in.wire_reference),
371 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
372 : "credit",
373 : &td.details.reserves_in.credit),
374 0 : GNUNET_PQ_result_spec_auto_from_type (
375 : "wire_source_h_payto",
376 : &td.details.reserves_in.sender_account_h_payto),
377 0 : GNUNET_PQ_result_spec_string (
378 : "exchange_account_section",
379 : &td.details.reserves_in.exchange_account_section),
380 0 : GNUNET_PQ_result_spec_timestamp (
381 : "execution_date",
382 : &td.details.reserves_in.execution_date),
383 : GNUNET_PQ_result_spec_end
384 : };
385 :
386 0 : if (GNUNET_OK !=
387 0 : GNUNET_PQ_extract_result (result,
388 : rs,
389 : i))
390 : {
391 0 : GNUNET_break (0);
392 0 : ctx->error = true;
393 0 : return;
394 : }
395 0 : ctx->cb (ctx->cb_cls,
396 : &td);
397 0 : GNUNET_PQ_cleanup_result (rs);
398 : }
399 : }
400 :
401 :
402 : /**
403 : * Function called with kycauth_in table entries.
404 : *
405 : * @param cls closure
406 : * @param result the postgres result
407 : * @param num_results the number of results in @a result
408 : */
409 : static void
410 0 : lrbt_cb_table_kycauth_in (void *cls,
411 : PGresult *result,
412 : unsigned int num_results)
413 : {
414 0 : struct LookupRecordsByTableContext *ctx = cls;
415 0 : struct PostgresClosure *pg = ctx->pg;
416 0 : struct TALER_EXCHANGEDB_TableData td = {
417 : .table = TALER_EXCHANGEDB_RT_KYCAUTHS_IN
418 : };
419 :
420 0 : for (unsigned int i = 0; i<num_results; i++)
421 : {
422 0 : struct GNUNET_PQ_ResultSpec rs[] = {
423 0 : GNUNET_PQ_result_spec_uint64 (
424 : "serial",
425 : &td.serial),
426 0 : GNUNET_PQ_result_spec_auto_from_type (
427 : "account_pub",
428 : &td.details.kycauth_in.account_pub),
429 0 : GNUNET_PQ_result_spec_uint64 (
430 : "wire_reference",
431 : &td.details.kycauth_in.wire_reference),
432 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
433 : "credit",
434 : &td.details.kycauth_in.credit),
435 0 : GNUNET_PQ_result_spec_auto_from_type (
436 : "wire_source_h_payto",
437 : &td.details.kycauth_in.sender_account_h_payto),
438 0 : GNUNET_PQ_result_spec_string (
439 : "exchange_account_section",
440 : &td.details.kycauth_in.exchange_account_section),
441 0 : GNUNET_PQ_result_spec_timestamp (
442 : "execution_date",
443 : &td.details.kycauth_in.execution_date),
444 : GNUNET_PQ_result_spec_end
445 : };
446 :
447 0 : if (GNUNET_OK !=
448 0 : GNUNET_PQ_extract_result (result,
449 : rs,
450 : i))
451 : {
452 0 : GNUNET_break (0);
453 0 : ctx->error = true;
454 0 : return;
455 : }
456 0 : ctx->cb (ctx->cb_cls,
457 : &td);
458 0 : GNUNET_PQ_cleanup_result (rs);
459 : }
460 : }
461 :
462 :
463 : /**
464 : * Function called with reserves_close table entries.
465 : *
466 : * @param cls closure
467 : * @param result the postgres result
468 : * @param num_results the number of results in @a result
469 : */
470 : static void
471 0 : lrbt_cb_table_reserves_close (void *cls,
472 : PGresult *result,
473 : unsigned int num_results)
474 : {
475 0 : struct LookupRecordsByTableContext *ctx = cls;
476 0 : struct PostgresClosure *pg = ctx->pg;
477 0 : struct TALER_EXCHANGEDB_TableData td = {
478 : .table = TALER_EXCHANGEDB_RT_RESERVES_CLOSE
479 : };
480 :
481 0 : for (unsigned int i = 0; i<num_results; i++)
482 : {
483 0 : struct GNUNET_PQ_ResultSpec rs[] = {
484 0 : GNUNET_PQ_result_spec_uint64 (
485 : "serial",
486 : &td.serial),
487 0 : GNUNET_PQ_result_spec_auto_from_type (
488 : "reserve_pub",
489 : &td.details.reserves_close.reserve_pub),
490 0 : GNUNET_PQ_result_spec_timestamp (
491 : "execution_date",
492 : &td.details.reserves_close.execution_date),
493 0 : GNUNET_PQ_result_spec_auto_from_type (
494 : "wtid",
495 : &td.details.reserves_close.wtid),
496 0 : GNUNET_PQ_result_spec_auto_from_type (
497 : "wire_target_h_payto",
498 : &td.details.reserves_close.sender_account_h_payto),
499 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
500 : "amount",
501 : &td.details.reserves_close.amount),
502 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
503 : "closing_fee",
504 : &td.details.reserves_close.closing_fee),
505 : GNUNET_PQ_result_spec_end
506 : };
507 :
508 0 : if (GNUNET_OK !=
509 0 : GNUNET_PQ_extract_result (result,
510 : rs,
511 : i))
512 : {
513 0 : GNUNET_break (0);
514 0 : ctx->error = true;
515 0 : return;
516 : }
517 0 : ctx->cb (ctx->cb_cls,
518 : &td);
519 0 : GNUNET_PQ_cleanup_result (rs);
520 : }
521 : }
522 :
523 :
524 : /**
525 : * Function called with reserves_open_requests table entries.
526 : *
527 : * @param cls closure
528 : * @param result the postgres result
529 : * @param num_results the number of results in @a result
530 : */
531 : static void
532 0 : lrbt_cb_table_reserves_open_requests (void *cls,
533 : PGresult *result,
534 : unsigned int num_results)
535 : {
536 0 : struct LookupRecordsByTableContext *ctx = cls;
537 0 : struct PostgresClosure *pg = ctx->pg;
538 0 : struct TALER_EXCHANGEDB_TableData td = {
539 : .table = TALER_EXCHANGEDB_RT_RESERVES_OPEN_REQUESTS
540 : };
541 :
542 0 : for (unsigned int i = 0; i<num_results; i++)
543 : {
544 0 : struct GNUNET_PQ_ResultSpec rs[] = {
545 0 : GNUNET_PQ_result_spec_uint64 ("serial",
546 : &td.serial),
547 0 : GNUNET_PQ_result_spec_auto_from_type (
548 : "reserve_pub",
549 : &td.details.reserves_open_requests.reserve_pub),
550 0 : GNUNET_PQ_result_spec_timestamp (
551 : "request_timestamp",
552 : &td.details.reserves_open_requests.request_timestamp),
553 0 : GNUNET_PQ_result_spec_timestamp (
554 : "expiration_date",
555 : &td.details.reserves_open_requests.expiration_date),
556 0 : GNUNET_PQ_result_spec_auto_from_type (
557 : "reserve_sig",
558 : &td.details.reserves_open_requests.reserve_sig),
559 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
560 : "reserve_payment",
561 : &td.details.reserves_open_requests.reserve_payment),
562 0 : GNUNET_PQ_result_spec_uint32 (
563 : "requested_purse_limit",
564 : &td.details.reserves_open_requests.requested_purse_limit),
565 : GNUNET_PQ_result_spec_end
566 : };
567 :
568 0 : if (GNUNET_OK !=
569 0 : GNUNET_PQ_extract_result (result,
570 : rs,
571 : i))
572 : {
573 0 : GNUNET_break (0);
574 0 : ctx->error = true;
575 0 : return;
576 : }
577 0 : ctx->cb (ctx->cb_cls,
578 : &td);
579 0 : GNUNET_PQ_cleanup_result (rs);
580 : }
581 : }
582 :
583 :
584 : /**
585 : * Function called with reserves_open_deposits table entries.
586 : *
587 : * @param cls closure
588 : * @param result the postgres result
589 : * @param num_results the number of results in @a result
590 : */
591 : static void
592 0 : lrbt_cb_table_reserves_open_deposits (void *cls,
593 : PGresult *result,
594 : unsigned int num_results)
595 : {
596 0 : struct LookupRecordsByTableContext *ctx = cls;
597 0 : struct PostgresClosure *pg = ctx->pg;
598 0 : struct TALER_EXCHANGEDB_TableData td = {
599 : .table = TALER_EXCHANGEDB_RT_RESERVES_OPEN_DEPOSITS
600 : };
601 :
602 0 : for (unsigned int i = 0; i<num_results; i++)
603 : {
604 0 : struct GNUNET_PQ_ResultSpec rs[] = {
605 0 : GNUNET_PQ_result_spec_uint64 ("serial",
606 : &td.serial),
607 0 : GNUNET_PQ_result_spec_auto_from_type (
608 : "reserve_sig",
609 : &td.details.reserves_open_deposits.reserve_sig),
610 0 : GNUNET_PQ_result_spec_auto_from_type (
611 : "reserve_pub",
612 : &td.details.reserves_open_deposits.reserve_pub),
613 0 : GNUNET_PQ_result_spec_auto_from_type (
614 : "coin_pub",
615 : &td.details.reserves_open_deposits.coin_pub),
616 0 : GNUNET_PQ_result_spec_auto_from_type (
617 : "coin_sig",
618 : &td.details.reserves_open_deposits.coin_sig),
619 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
620 : "contribution",
621 : &td.details.reserves_open_deposits.contribution),
622 : GNUNET_PQ_result_spec_end
623 : };
624 :
625 0 : if (GNUNET_OK !=
626 0 : GNUNET_PQ_extract_result (result,
627 : rs,
628 : i))
629 : {
630 0 : GNUNET_break (0);
631 0 : ctx->error = true;
632 0 : return;
633 : }
634 0 : ctx->cb (ctx->cb_cls,
635 : &td);
636 0 : GNUNET_PQ_cleanup_result (rs);
637 : }
638 : }
639 :
640 :
641 : /**
642 : * Function called with auditors table entries.
643 : *
644 : * @param cls closure
645 : * @param result the postgres result
646 : * @param num_results the number of results in @a result
647 : */
648 : static void
649 0 : lrbt_cb_table_auditors (void *cls,
650 : PGresult *result,
651 : unsigned int num_results)
652 : {
653 0 : struct LookupRecordsByTableContext *ctx = cls;
654 0 : struct TALER_EXCHANGEDB_TableData td = {
655 : .table = TALER_EXCHANGEDB_RT_AUDITORS
656 : };
657 :
658 0 : for (unsigned int i = 0; i<num_results; i++)
659 : {
660 0 : struct GNUNET_PQ_ResultSpec rs[] = {
661 0 : GNUNET_PQ_result_spec_uint64 ("serial",
662 : &td.serial),
663 0 : GNUNET_PQ_result_spec_auto_from_type ("auditor_pub",
664 : &td.details.auditors.auditor_pub),
665 0 : GNUNET_PQ_result_spec_string ("auditor_url",
666 : &td.details.auditors.auditor_url),
667 0 : GNUNET_PQ_result_spec_string ("auditor_name",
668 : &td.details.auditors.auditor_name),
669 0 : GNUNET_PQ_result_spec_bool ("is_active",
670 : &td.details.auditors.is_active),
671 0 : GNUNET_PQ_result_spec_timestamp ("last_change",
672 : &td.details.auditors.last_change),
673 : GNUNET_PQ_result_spec_end
674 : };
675 :
676 0 : if (GNUNET_OK !=
677 0 : GNUNET_PQ_extract_result (result,
678 : rs,
679 : i))
680 : {
681 0 : GNUNET_break (0);
682 0 : ctx->error = true;
683 0 : return;
684 : }
685 0 : ctx->cb (ctx->cb_cls,
686 : &td);
687 0 : GNUNET_PQ_cleanup_result (rs);
688 : }
689 : }
690 :
691 :
692 : /**
693 : * Function called with auditor_denom_sigs table entries.
694 : *
695 : * @param cls closure
696 : * @param result the postgres result
697 : * @param num_results the number of results in @a result
698 : */
699 : static void
700 0 : lrbt_cb_table_auditor_denom_sigs (void *cls,
701 : PGresult *result,
702 : unsigned int num_results)
703 : {
704 0 : struct LookupRecordsByTableContext *ctx = cls;
705 0 : struct TALER_EXCHANGEDB_TableData td = {
706 : .table = TALER_EXCHANGEDB_RT_AUDITOR_DENOM_SIGS
707 : };
708 :
709 0 : for (unsigned int i = 0; i<num_results; i++)
710 : {
711 0 : struct GNUNET_PQ_ResultSpec rs[] = {
712 0 : GNUNET_PQ_result_spec_uint64 (
713 : "serial",
714 : &td.serial),
715 0 : GNUNET_PQ_result_spec_uint64 (
716 : "auditor_uuid",
717 : &td.details.auditor_denom_sigs.auditor_uuid),
718 0 : GNUNET_PQ_result_spec_uint64 (
719 : "denominations_serial",
720 : &td.details.auditor_denom_sigs.denominations_serial),
721 0 : GNUNET_PQ_result_spec_auto_from_type (
722 : "auditor_sig",
723 : &td.details.auditor_denom_sigs.auditor_sig),
724 : GNUNET_PQ_result_spec_end
725 : };
726 :
727 0 : if (GNUNET_OK !=
728 0 : GNUNET_PQ_extract_result (result,
729 : rs,
730 : i))
731 : {
732 0 : GNUNET_break (0);
733 0 : ctx->error = true;
734 0 : return;
735 : }
736 0 : ctx->cb (ctx->cb_cls,
737 : &td);
738 0 : GNUNET_PQ_cleanup_result (rs);
739 : }
740 : }
741 :
742 :
743 : /**
744 : * Function called with exchange_sign_keys table entries.
745 : *
746 : * @param cls closure
747 : * @param result the postgres result
748 : * @param num_results the number of results in @a result
749 : */
750 : static void
751 0 : lrbt_cb_table_exchange_sign_keys (void *cls,
752 : PGresult *result,
753 : unsigned int num_results)
754 : {
755 0 : struct LookupRecordsByTableContext *ctx = cls;
756 0 : struct TALER_EXCHANGEDB_TableData td = {
757 : .table = TALER_EXCHANGEDB_RT_EXCHANGE_SIGN_KEYS
758 : };
759 :
760 0 : for (unsigned int i = 0; i<num_results; i++)
761 : {
762 0 : struct GNUNET_PQ_ResultSpec rs[] = {
763 0 : GNUNET_PQ_result_spec_uint64 ("serial",
764 : &td.serial),
765 0 : GNUNET_PQ_result_spec_auto_from_type ("exchange_pub",
766 : &td.details.exchange_sign_keys.
767 : exchange_pub),
768 0 : GNUNET_PQ_result_spec_auto_from_type ("master_sig",
769 : &td.details.exchange_sign_keys.
770 : master_sig),
771 0 : GNUNET_PQ_result_spec_timestamp ("valid_from",
772 : &td.details.exchange_sign_keys.meta.
773 : start),
774 0 : GNUNET_PQ_result_spec_timestamp ("expire_sign",
775 : &td.details.exchange_sign_keys.meta.
776 : expire_sign),
777 0 : GNUNET_PQ_result_spec_timestamp ("expire_legal",
778 : &td.details.exchange_sign_keys.meta.
779 : expire_legal),
780 : GNUNET_PQ_result_spec_end
781 : };
782 :
783 0 : if (GNUNET_OK !=
784 0 : GNUNET_PQ_extract_result (result,
785 : rs,
786 : i))
787 : {
788 0 : GNUNET_break (0);
789 0 : ctx->error = true;
790 0 : return;
791 : }
792 0 : ctx->cb (ctx->cb_cls,
793 : &td);
794 0 : GNUNET_PQ_cleanup_result (rs);
795 : }
796 : }
797 :
798 :
799 : /**
800 : * Function called with signkey_revocations table entries.
801 : *
802 : * @param cls closure
803 : * @param result the postgres result
804 : * @param num_results the number of results in @a result
805 : */
806 : static void
807 0 : lrbt_cb_table_signkey_revocations (void *cls,
808 : PGresult *result,
809 : unsigned int num_results)
810 : {
811 0 : struct LookupRecordsByTableContext *ctx = cls;
812 0 : struct TALER_EXCHANGEDB_TableData td = {
813 : .table = TALER_EXCHANGEDB_RT_SIGNKEY_REVOCATIONS
814 : };
815 :
816 0 : for (unsigned int i = 0; i<num_results; i++)
817 : {
818 0 : struct GNUNET_PQ_ResultSpec rs[] = {
819 0 : GNUNET_PQ_result_spec_uint64 ("serial",
820 : &td.serial),
821 0 : GNUNET_PQ_result_spec_uint64 ("esk_serial",
822 : &td.details.signkey_revocations.esk_serial),
823 0 : GNUNET_PQ_result_spec_auto_from_type ("master_sig",
824 : &td.details.signkey_revocations.
825 : master_sig),
826 : GNUNET_PQ_result_spec_end
827 : };
828 :
829 0 : if (GNUNET_OK !=
830 0 : GNUNET_PQ_extract_result (result,
831 : rs,
832 : i))
833 : {
834 0 : GNUNET_break (0);
835 0 : ctx->error = true;
836 0 : return;
837 : }
838 0 : ctx->cb (ctx->cb_cls,
839 : &td);
840 0 : GNUNET_PQ_cleanup_result (rs);
841 : }
842 : }
843 :
844 :
845 : /**
846 : * Function called with known_coins table entries.
847 : *
848 : * @param cls closure
849 : * @param result the postgres result
850 : * @param num_results the number of results in @a result
851 : */
852 : static void
853 0 : lrbt_cb_table_known_coins (void *cls,
854 : PGresult *result,
855 : unsigned int num_results)
856 : {
857 0 : struct LookupRecordsByTableContext *ctx = cls;
858 0 : struct TALER_EXCHANGEDB_TableData td = {
859 : .table = TALER_EXCHANGEDB_RT_KNOWN_COINS
860 : };
861 :
862 0 : for (unsigned int i = 0; i<num_results; i++)
863 : {
864 0 : struct GNUNET_PQ_ResultSpec rs[] = {
865 0 : GNUNET_PQ_result_spec_uint64 (
866 : "serial",
867 : &td.serial),
868 0 : GNUNET_PQ_result_spec_auto_from_type (
869 : "coin_pub",
870 : &td.details.known_coins.coin_pub),
871 0 : TALER_PQ_result_spec_denom_sig (
872 : "denom_sig",
873 : &td.details.known_coins.denom_sig),
874 0 : GNUNET_PQ_result_spec_uint64 (
875 : "denominations_serial",
876 : &td.details.known_coins.denominations_serial),
877 : GNUNET_PQ_result_spec_end
878 : };
879 :
880 0 : if (GNUNET_OK !=
881 0 : GNUNET_PQ_extract_result (result,
882 : rs,
883 : i))
884 : {
885 0 : GNUNET_break (0);
886 0 : ctx->error = true;
887 0 : return;
888 : }
889 0 : ctx->cb (ctx->cb_cls,
890 : &td);
891 0 : GNUNET_PQ_cleanup_result (rs);
892 : }
893 : }
894 :
895 :
896 : /**
897 : * Function called with refresh table entries.
898 : *
899 : * @param cls closure
900 : * @param result the postgres result
901 : * @param num_results the number of results in @a result
902 : */
903 : static void
904 0 : lrbt_cb_table_refresh (void *cls,
905 : PGresult *result,
906 : unsigned int num_results)
907 : {
908 0 : struct LookupRecordsByTableContext *ctx = cls;
909 0 : struct PostgresClosure *pg = ctx->pg;
910 0 : struct TALER_EXCHANGEDB_TableData td = {
911 : .table = TALER_EXCHANGEDB_RT_REFRESH
912 : };
913 :
914 0 : for (unsigned int i = 0; i<num_results; i++)
915 : {
916 : bool no_cs_r_values;
917 : bool no_cs_r_choices;
918 : size_t num_denom_sigs;
919 0 : struct GNUNET_PQ_ResultSpec rs[] = {
920 0 : GNUNET_PQ_result_spec_uint64 (
921 : "serial",
922 : &td.serial),
923 0 : GNUNET_PQ_result_spec_auto_from_type (
924 : "rc",
925 : &td.details.refresh.rc),
926 0 : GNUNET_PQ_result_spec_auto_from_type (
927 : "execution_date",
928 : &td.details.refresh.execution_date),
929 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
930 : "amount_with_fee",
931 : &td.details.refresh.amount_with_fee),
932 0 : GNUNET_PQ_result_spec_auto_from_type (
933 : "old_coin_pub",
934 : &td.details.refresh.old_coin_pub),
935 0 : GNUNET_PQ_result_spec_auto_from_type (
936 : "old_coin_sig",
937 : &td.details.refresh.old_coin_sig),
938 0 : GNUNET_PQ_result_spec_auto_from_type (
939 : "refresh_seed",
940 : &td.details.refresh.refresh_seed),
941 0 : GNUNET_PQ_result_spec_uint32 (
942 : "noreveal_index",
943 : &td.details.refresh.noreveal_index),
944 0 : GNUNET_PQ_result_spec_auto_from_type (
945 : "planchets_h",
946 : &td.details.refresh.planchets_h),
947 0 : GNUNET_PQ_result_spec_auto_from_type (
948 : "selected_h",
949 : &td.details.refresh.selected_h),
950 0 : GNUNET_PQ_result_spec_allow_null (
951 : GNUNET_PQ_result_spec_auto_from_type (
952 : "blinding_seed",
953 : &td.details.refresh.blinding_seed),
954 : &td.details.refresh.no_blinding_seed),
955 0 : GNUNET_PQ_result_spec_allow_null (
956 : TALER_PQ_result_spec_array_cs_r_pub (
957 : pg->conn,
958 : "cs_r_values",
959 : &td.details.refresh.num_cs_r_values,
960 : &td.details.refresh.cs_r_values),
961 : &no_cs_r_values),
962 0 : GNUNET_PQ_result_spec_allow_null (
963 : GNUNET_PQ_result_spec_uint64 (
964 : "cs_r_choices",
965 : &td.details.refresh.cs_r_choices),
966 : &no_cs_r_choices),
967 0 : GNUNET_PQ_result_spec_array_uint64 (
968 : pg->conn,
969 : "denom_serials",
970 : &td.details.refresh.num_coins,
971 : &td.details.refresh.denom_serials),
972 0 : TALER_PQ_result_spec_array_blinded_denom_sig (
973 : pg->conn,
974 : "denom_sigs",
975 : &num_denom_sigs,
976 : &td.details.refresh.denom_sigs),
977 : GNUNET_PQ_result_spec_end
978 : };
979 :
980 0 : if (GNUNET_OK !=
981 0 : GNUNET_PQ_extract_result (result,
982 : rs,
983 : i))
984 : {
985 0 : GNUNET_break (0);
986 0 : ctx->error = true;
987 0 : GNUNET_PQ_cleanup_result (rs);
988 0 : return;
989 : }
990 0 : ctx->cb (ctx->cb_cls,
991 : &td);
992 0 : GNUNET_PQ_cleanup_result (rs);
993 : }
994 : }
995 :
996 :
997 : /**
998 : * Function called with batch deposits table entries.
999 : *
1000 : * @param cls closure
1001 : * @param result the postgres result
1002 : * @param num_results the number of results in @a result
1003 : */
1004 : static void
1005 0 : lrbt_cb_table_batch_deposits (void *cls,
1006 : PGresult *result,
1007 : unsigned int num_results)
1008 : {
1009 0 : struct LookupRecordsByTableContext *ctx = cls;
1010 0 : struct PostgresClosure *pg = ctx->pg;
1011 0 : struct TALER_EXCHANGEDB_TableData td = {
1012 : .table = TALER_EXCHANGEDB_RT_BATCH_DEPOSITS
1013 : };
1014 :
1015 0 : for (unsigned int i = 0; i<num_results; i++)
1016 : {
1017 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1018 0 : GNUNET_PQ_result_spec_uint64 (
1019 : "serial",
1020 : &td.serial),
1021 0 : GNUNET_PQ_result_spec_uint64 (
1022 : "shard",
1023 : &td.details.batch_deposits.shard),
1024 0 : GNUNET_PQ_result_spec_auto_from_type (
1025 : "merchant_pub",
1026 : &td.details.batch_deposits.merchant_pub),
1027 0 : GNUNET_PQ_result_spec_timestamp (
1028 : "wallet_timestamp",
1029 : &td.details.batch_deposits.wallet_timestamp),
1030 0 : GNUNET_PQ_result_spec_timestamp (
1031 : "exchange_timestamp",
1032 : &td.details.batch_deposits.exchange_timestamp),
1033 0 : GNUNET_PQ_result_spec_timestamp (
1034 : "refund_deadline",
1035 : &td.details.batch_deposits.refund_deadline),
1036 0 : GNUNET_PQ_result_spec_timestamp (
1037 : "wire_deadline",
1038 : &td.details.batch_deposits.wire_deadline),
1039 0 : GNUNET_PQ_result_spec_auto_from_type (
1040 : "h_contract_terms",
1041 : &td.details.batch_deposits.h_contract_terms),
1042 0 : GNUNET_PQ_result_spec_allow_null (
1043 : GNUNET_PQ_result_spec_auto_from_type (
1044 : "wallet_data_hash",
1045 : &td.details.batch_deposits.wallet_data_hash),
1046 : &td.details.batch_deposits.no_wallet_data_hash),
1047 0 : GNUNET_PQ_result_spec_auto_from_type (
1048 : "wire_salt",
1049 : &td.details.batch_deposits.wire_salt),
1050 0 : GNUNET_PQ_result_spec_auto_from_type (
1051 : "wire_target_h_payto",
1052 : &td.details.batch_deposits.wire_target_h_payto),
1053 0 : GNUNET_PQ_result_spec_allow_null (
1054 : GNUNET_PQ_result_spec_uint64 (
1055 : "policy_details_serial_id",
1056 : &td.details.batch_deposits.policy_details_serial_id),
1057 : &td.details.batch_deposits.no_policy_details),
1058 0 : GNUNET_PQ_result_spec_bool (
1059 : "policy_blocked",
1060 : &td.details.batch_deposits.policy_blocked),
1061 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
1062 : "total_amount",
1063 : &td.details.batch_deposits.total_amount),
1064 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
1065 : "total_without_fee",
1066 : &td.details.batch_deposits.total_without_fee),
1067 0 : GNUNET_PQ_result_spec_auto_from_type (
1068 : "merchant_sig",
1069 : &td.details.batch_deposits.merchant_sig),
1070 0 : GNUNET_PQ_result_spec_bool (
1071 : "done",
1072 : &td.details.batch_deposits.done),
1073 : GNUNET_PQ_result_spec_end
1074 : };
1075 :
1076 0 : td.details.batch_deposits.policy_details_serial_id = 0;
1077 0 : if (GNUNET_OK !=
1078 0 : GNUNET_PQ_extract_result (result,
1079 : rs,
1080 : i))
1081 : {
1082 0 : GNUNET_break (0);
1083 0 : ctx->error = true;
1084 0 : return;
1085 : }
1086 0 : ctx->cb (ctx->cb_cls,
1087 : &td);
1088 0 : GNUNET_PQ_cleanup_result (rs);
1089 : }
1090 : }
1091 :
1092 :
1093 : /**
1094 : * Function called with coin deposits table entries.
1095 : *
1096 : * @param cls closure
1097 : * @param result the postgres result
1098 : * @param num_results the number of results in @a result
1099 : */
1100 : static void
1101 0 : lrbt_cb_table_coin_deposits (void *cls,
1102 : PGresult *result,
1103 : unsigned int num_results)
1104 : {
1105 0 : struct LookupRecordsByTableContext *ctx = cls;
1106 0 : struct PostgresClosure *pg = ctx->pg;
1107 0 : struct TALER_EXCHANGEDB_TableData td = {
1108 : .table = TALER_EXCHANGEDB_RT_COIN_DEPOSITS
1109 : };
1110 :
1111 0 : for (unsigned int i = 0; i<num_results; i++)
1112 : {
1113 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1114 0 : GNUNET_PQ_result_spec_uint64 (
1115 : "serial",
1116 : &td.serial),
1117 0 : GNUNET_PQ_result_spec_uint64 (
1118 : "batch_deposit_serial_id",
1119 : &td.details.coin_deposits.batch_deposit_serial_id),
1120 0 : GNUNET_PQ_result_spec_auto_from_type (
1121 : "coin_pub",
1122 : &td.details.coin_deposits.coin_pub),
1123 0 : GNUNET_PQ_result_spec_auto_from_type (
1124 : "coin_sig",
1125 : &td.details.coin_deposits.coin_sig),
1126 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
1127 : "amount_with_fee",
1128 : &td.details.coin_deposits.amount_with_fee),
1129 : GNUNET_PQ_result_spec_end
1130 : };
1131 :
1132 0 : if (GNUNET_OK !=
1133 0 : GNUNET_PQ_extract_result (result,
1134 : rs,
1135 : i))
1136 : {
1137 0 : GNUNET_break (0);
1138 0 : ctx->error = true;
1139 0 : return;
1140 : }
1141 0 : ctx->cb (ctx->cb_cls,
1142 : &td);
1143 0 : GNUNET_PQ_cleanup_result (rs);
1144 : }
1145 : }
1146 :
1147 :
1148 : /**
1149 : * Function called with refunds table entries.
1150 : *
1151 : * @param cls closure
1152 : * @param result the postgres result
1153 : * @param num_results the number of results in @a result
1154 : */
1155 : static void
1156 0 : lrbt_cb_table_refunds (void *cls,
1157 : PGresult *result,
1158 : unsigned int num_results)
1159 : {
1160 0 : struct LookupRecordsByTableContext *ctx = cls;
1161 0 : struct PostgresClosure *pg = ctx->pg;
1162 0 : struct TALER_EXCHANGEDB_TableData td = {
1163 : .table = TALER_EXCHANGEDB_RT_REFUNDS
1164 : };
1165 :
1166 0 : for (unsigned int i = 0; i<num_results; i++)
1167 : {
1168 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1169 0 : GNUNET_PQ_result_spec_uint64 (
1170 : "serial",
1171 : &td.serial),
1172 0 : GNUNET_PQ_result_spec_auto_from_type (
1173 : "coin_pub",
1174 : &td.details.refunds.coin_pub),
1175 0 : GNUNET_PQ_result_spec_auto_from_type (
1176 : "merchant_sig",
1177 : &td.details.refunds.merchant_sig),
1178 0 : GNUNET_PQ_result_spec_uint64 (
1179 : "rtransaction_id",
1180 : &td.details.refunds.rtransaction_id),
1181 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
1182 : "amount_with_fee",
1183 : &td.details.refunds.amount_with_fee),
1184 0 : GNUNET_PQ_result_spec_uint64 (
1185 : "batch_deposit_serial_id",
1186 : &td.details.refunds.batch_deposit_serial_id),
1187 : GNUNET_PQ_result_spec_end
1188 : };
1189 :
1190 0 : if (GNUNET_OK !=
1191 0 : GNUNET_PQ_extract_result (result,
1192 : rs,
1193 : i))
1194 : {
1195 0 : GNUNET_break (0);
1196 0 : ctx->error = true;
1197 0 : return;
1198 : }
1199 0 : ctx->cb (ctx->cb_cls,
1200 : &td);
1201 0 : GNUNET_PQ_cleanup_result (rs);
1202 : }
1203 : }
1204 :
1205 :
1206 : /**
1207 : * Function called with wire_out table entries.
1208 : *
1209 : * @param cls closure
1210 : * @param result the postgres result
1211 : * @param num_results the number of results in @a result
1212 : */
1213 : static void
1214 0 : lrbt_cb_table_wire_out (void *cls,
1215 : PGresult *result,
1216 : unsigned int num_results)
1217 : {
1218 0 : struct LookupRecordsByTableContext *ctx = cls;
1219 0 : struct PostgresClosure *pg = ctx->pg;
1220 0 : struct TALER_EXCHANGEDB_TableData td = {
1221 : .table = TALER_EXCHANGEDB_RT_WIRE_OUT
1222 : };
1223 :
1224 0 : for (unsigned int i = 0; i<num_results; i++)
1225 : {
1226 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1227 0 : GNUNET_PQ_result_spec_uint64 ("serial",
1228 : &td.serial),
1229 0 : GNUNET_PQ_result_spec_timestamp (
1230 : "execution_date",
1231 : &td.details.wire_out.execution_date),
1232 0 : GNUNET_PQ_result_spec_auto_from_type (
1233 : "wtid_raw",
1234 : &td.details.wire_out.wtid_raw),
1235 0 : GNUNET_PQ_result_spec_auto_from_type (
1236 : "wire_target_h_payto",
1237 : &td.details.wire_out.wire_target_h_payto),
1238 0 : GNUNET_PQ_result_spec_string (
1239 : "exchange_account_section",
1240 : &td.details.wire_out.exchange_account_section),
1241 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
1242 : "amount",
1243 : &td.details.wire_out.amount),
1244 : GNUNET_PQ_result_spec_end
1245 : };
1246 :
1247 0 : if (GNUNET_OK !=
1248 0 : GNUNET_PQ_extract_result (result,
1249 : rs,
1250 : i))
1251 : {
1252 0 : GNUNET_break (0);
1253 0 : ctx->error = true;
1254 0 : return;
1255 : }
1256 0 : ctx->cb (ctx->cb_cls,
1257 : &td);
1258 0 : GNUNET_PQ_cleanup_result (rs);
1259 : }
1260 : }
1261 :
1262 :
1263 : /**
1264 : * Function called with aggregation_tracking table entries.
1265 : *
1266 : * @param cls closure
1267 : * @param result the postgres result
1268 : * @param num_results the number of results in @a result
1269 : */
1270 : static void
1271 0 : lrbt_cb_table_aggregation_tracking (void *cls,
1272 : PGresult *result,
1273 : unsigned int num_results)
1274 : {
1275 0 : struct LookupRecordsByTableContext *ctx = cls;
1276 0 : struct TALER_EXCHANGEDB_TableData td = {
1277 : .table = TALER_EXCHANGEDB_RT_AGGREGATION_TRACKING
1278 : };
1279 :
1280 0 : for (unsigned int i = 0; i<num_results; i++)
1281 : {
1282 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1283 0 : GNUNET_PQ_result_spec_uint64 (
1284 : "serial",
1285 : &td.serial),
1286 0 : GNUNET_PQ_result_spec_uint64 (
1287 : "batch_deposit_serial_id",
1288 : &td.details.aggregation_tracking.batch_deposit_serial_id),
1289 0 : GNUNET_PQ_result_spec_auto_from_type (
1290 : "wtid_raw",
1291 : &td.details.aggregation_tracking.wtid_raw),
1292 : GNUNET_PQ_result_spec_end
1293 : };
1294 :
1295 0 : if (GNUNET_OK !=
1296 0 : GNUNET_PQ_extract_result (result,
1297 : rs,
1298 : i))
1299 : {
1300 0 : GNUNET_break (0);
1301 0 : ctx->error = true;
1302 0 : return;
1303 : }
1304 0 : ctx->cb (ctx->cb_cls,
1305 : &td);
1306 0 : GNUNET_PQ_cleanup_result (rs);
1307 : }
1308 : }
1309 :
1310 :
1311 : /**
1312 : * Function called with wire_fee table entries.
1313 : *
1314 : * @param cls closure
1315 : * @param result the postgres result
1316 : * @param num_results the number of results in @a result
1317 : */
1318 : static void
1319 0 : lrbt_cb_table_wire_fee (void *cls,
1320 : PGresult *result,
1321 : unsigned int num_results)
1322 : {
1323 0 : struct LookupRecordsByTableContext *ctx = cls;
1324 0 : struct PostgresClosure *pg = ctx->pg;
1325 0 : struct TALER_EXCHANGEDB_TableData td = {
1326 : .table = TALER_EXCHANGEDB_RT_WIRE_FEE
1327 : };
1328 :
1329 0 : for (unsigned int i = 0; i<num_results; i++)
1330 : {
1331 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1332 0 : GNUNET_PQ_result_spec_uint64 ("serial",
1333 : &td.serial),
1334 0 : GNUNET_PQ_result_spec_string ("wire_method",
1335 : &td.details.wire_fee.wire_method),
1336 0 : GNUNET_PQ_result_spec_timestamp ("start_date",
1337 : &td.details.wire_fee.start_date),
1338 0 : GNUNET_PQ_result_spec_timestamp ("end_date",
1339 : &td.details.wire_fee.end_date),
1340 0 : TALER_PQ_RESULT_SPEC_AMOUNT ("wire_fee",
1341 : &td.details.wire_fee.fees.wire),
1342 0 : TALER_PQ_RESULT_SPEC_AMOUNT ("closing_fee",
1343 : &td.details.wire_fee.fees.closing),
1344 0 : GNUNET_PQ_result_spec_auto_from_type ("master_sig",
1345 : &td.details.wire_fee.master_sig),
1346 : GNUNET_PQ_result_spec_end
1347 : };
1348 :
1349 0 : if (GNUNET_OK !=
1350 0 : GNUNET_PQ_extract_result (result,
1351 : rs,
1352 : i))
1353 : {
1354 0 : GNUNET_break (0);
1355 0 : ctx->error = true;
1356 0 : return;
1357 : }
1358 0 : ctx->cb (ctx->cb_cls,
1359 : &td);
1360 0 : GNUNET_PQ_cleanup_result (rs);
1361 : }
1362 : }
1363 :
1364 :
1365 : /**
1366 : * Function called with wire_fee table entries.
1367 : *
1368 : * @param cls closure
1369 : * @param result the postgres result
1370 : * @param num_results the number of results in @a result
1371 : */
1372 : static void
1373 0 : lrbt_cb_table_global_fee (void *cls,
1374 : PGresult *result,
1375 : unsigned int num_results)
1376 : {
1377 0 : struct LookupRecordsByTableContext *ctx = cls;
1378 0 : struct PostgresClosure *pg = ctx->pg;
1379 0 : struct TALER_EXCHANGEDB_TableData td = {
1380 : .table = TALER_EXCHANGEDB_RT_GLOBAL_FEE
1381 : };
1382 :
1383 0 : for (unsigned int i = 0; i<num_results; i++)
1384 : {
1385 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1386 0 : GNUNET_PQ_result_spec_uint64 (
1387 : "serial",
1388 : &td.serial),
1389 0 : GNUNET_PQ_result_spec_timestamp (
1390 : "start_date",
1391 : &td.details.global_fee.start_date),
1392 0 : GNUNET_PQ_result_spec_timestamp (
1393 : "end_date",
1394 : &td.details.global_fee.end_date),
1395 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
1396 : "history_fee",
1397 : &td.details.global_fee.fees.history),
1398 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
1399 : "account_fee",
1400 : &td.details.global_fee.fees.account),
1401 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
1402 : "purse_fee",
1403 : &td.details.global_fee.fees.purse),
1404 0 : GNUNET_PQ_result_spec_relative_time (
1405 : "purse_timeout",
1406 : &td.details.global_fee.purse_timeout),
1407 0 : GNUNET_PQ_result_spec_relative_time (
1408 : "history_expiration",
1409 : &td.details.global_fee.history_expiration),
1410 0 : GNUNET_PQ_result_spec_uint32 (
1411 : "purse_account_limit",
1412 : &td.details.global_fee.purse_account_limit),
1413 0 : GNUNET_PQ_result_spec_auto_from_type (
1414 : "master_sig",
1415 : &td.details.global_fee.master_sig),
1416 : GNUNET_PQ_result_spec_end
1417 : };
1418 :
1419 0 : if (GNUNET_OK !=
1420 0 : GNUNET_PQ_extract_result (result,
1421 : rs,
1422 : i))
1423 : {
1424 0 : GNUNET_break (0);
1425 0 : ctx->error = true;
1426 0 : return;
1427 : }
1428 0 : ctx->cb (ctx->cb_cls,
1429 : &td);
1430 0 : GNUNET_PQ_cleanup_result (rs);
1431 : }
1432 : }
1433 :
1434 :
1435 : /**
1436 : * Function called with recoup table entries.
1437 : *
1438 : * @param cls closure
1439 : * @param result the postgres result
1440 : * @param num_results the number of results in @a result
1441 : */
1442 : static void
1443 0 : lrbt_cb_table_recoup (void *cls,
1444 : PGresult *result,
1445 : unsigned int num_results)
1446 : {
1447 0 : struct LookupRecordsByTableContext *ctx = cls;
1448 0 : struct PostgresClosure *pg = ctx->pg;
1449 0 : struct TALER_EXCHANGEDB_TableData td = {
1450 : .table = TALER_EXCHANGEDB_RT_RECOUP
1451 : };
1452 :
1453 0 : for (unsigned int i = 0; i<num_results; i++)
1454 : {
1455 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1456 0 : GNUNET_PQ_result_spec_uint64 ("serial",
1457 : &td.serial),
1458 0 : GNUNET_PQ_result_spec_auto_from_type ("coin_sig",
1459 : &td.details.recoup.coin_sig),
1460 0 : GNUNET_PQ_result_spec_auto_from_type ("coin_blind",
1461 : &td.details.recoup.coin_blind),
1462 0 : TALER_PQ_RESULT_SPEC_AMOUNT ("amount",
1463 : &td.details.recoup.amount),
1464 0 : GNUNET_PQ_result_spec_timestamp ("recoup_timestamp",
1465 : &td.details.recoup.timestamp),
1466 0 : GNUNET_PQ_result_spec_auto_from_type (
1467 : "coin_pub",
1468 : &td.details.recoup.coin_pub),
1469 0 : GNUNET_PQ_result_spec_uint64 ("withdraw_serial_id",
1470 : &td.details.recoup.withdraw_serial_id),
1471 : GNUNET_PQ_result_spec_end
1472 : };
1473 :
1474 0 : if (GNUNET_OK !=
1475 0 : GNUNET_PQ_extract_result (result,
1476 : rs,
1477 : i))
1478 : {
1479 0 : GNUNET_break (0);
1480 0 : ctx->error = true;
1481 0 : return;
1482 : }
1483 0 : ctx->cb (ctx->cb_cls,
1484 : &td);
1485 0 : GNUNET_PQ_cleanup_result (rs);
1486 : }
1487 : }
1488 :
1489 :
1490 : /**
1491 : * Function called with recoup_refresh table entries.
1492 : *
1493 : * @param cls closure
1494 : * @param result the postgres result
1495 : * @param num_results the number of results in @a result
1496 : */
1497 : static void
1498 0 : lrbt_cb_table_recoup_refresh (void *cls,
1499 : PGresult *result,
1500 : unsigned int num_results)
1501 : {
1502 0 : struct LookupRecordsByTableContext *ctx = cls;
1503 0 : struct PostgresClosure *pg = ctx->pg;
1504 0 : struct TALER_EXCHANGEDB_TableData td = {
1505 : .table = TALER_EXCHANGEDB_RT_RECOUP_REFRESH
1506 : };
1507 :
1508 0 : for (unsigned int i = 0; i<num_results; i++)
1509 : {
1510 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1511 0 : GNUNET_PQ_result_spec_uint64 ("serial",
1512 : &td.serial),
1513 0 : GNUNET_PQ_result_spec_auto_from_type ("coin_sig",
1514 : &td.details.recoup_refresh.coin_sig)
1515 : ,
1516 0 : GNUNET_PQ_result_spec_auto_from_type (
1517 : "coin_blind",
1518 : &td.details.recoup_refresh.coin_blind),
1519 0 : TALER_PQ_RESULT_SPEC_AMOUNT ("amount",
1520 : &td.details.recoup_refresh.amount),
1521 0 : GNUNET_PQ_result_spec_timestamp ("recoup_timestamp",
1522 : &td.details.recoup_refresh.timestamp),
1523 0 : GNUNET_PQ_result_spec_uint64 ("known_coin_id",
1524 : &td.details.recoup_refresh.known_coin_id),
1525 0 : GNUNET_PQ_result_spec_auto_from_type (
1526 : "coin_pub",
1527 : &td.details.recoup_refresh.coin_pub),
1528 0 : GNUNET_PQ_result_spec_uint64 ("rrc_serial",
1529 : &td.details.recoup_refresh.rrc_serial),
1530 : GNUNET_PQ_result_spec_end
1531 : };
1532 :
1533 0 : if (GNUNET_OK !=
1534 0 : GNUNET_PQ_extract_result (result,
1535 : rs,
1536 : i))
1537 : {
1538 0 : GNUNET_break (0);
1539 0 : ctx->error = true;
1540 0 : return;
1541 : }
1542 0 : ctx->cb (ctx->cb_cls,
1543 : &td);
1544 0 : GNUNET_PQ_cleanup_result (rs);
1545 : }
1546 : }
1547 :
1548 :
1549 : /**
1550 : * Function called with extensions table entries.
1551 : *
1552 : * @param cls closure
1553 : * @param result the postgres result
1554 : * @param num_results the number of results in @a result
1555 : */
1556 : static void
1557 0 : lrbt_cb_table_extensions (void *cls,
1558 : PGresult *result,
1559 : unsigned int num_results)
1560 : {
1561 0 : struct LookupRecordsByTableContext *ctx = cls;
1562 0 : struct TALER_EXCHANGEDB_TableData td = {
1563 : .table = TALER_EXCHANGEDB_RT_EXTENSIONS
1564 : };
1565 0 : bool no_manifest = false;
1566 :
1567 0 : for (unsigned int i = 0; i<num_results; i++)
1568 : {
1569 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1570 0 : GNUNET_PQ_result_spec_uint64 ("extension_id",
1571 : &td.serial),
1572 0 : GNUNET_PQ_result_spec_string ("name",
1573 : &td.details.extensions.name),
1574 0 : GNUNET_PQ_result_spec_allow_null (
1575 : GNUNET_PQ_result_spec_string ("manifest",
1576 : &td.details.extensions.manifest),
1577 : &no_manifest),
1578 : GNUNET_PQ_result_spec_end
1579 : };
1580 :
1581 0 : if (GNUNET_OK !=
1582 0 : GNUNET_PQ_extract_result (result,
1583 : rs,
1584 : i))
1585 : {
1586 0 : GNUNET_break (0);
1587 0 : ctx->error = true;
1588 0 : return;
1589 : }
1590 0 : ctx->cb (ctx->cb_cls,
1591 : &td);
1592 0 : GNUNET_PQ_cleanup_result (rs);
1593 : }
1594 : }
1595 :
1596 :
1597 : /**
1598 : * Function called with policy_details table entries.
1599 : *
1600 : * @param cls closure
1601 : * @param result the postgres result
1602 : * @param num_results the number of results in @a result
1603 : */
1604 : static void
1605 0 : lrbt_cb_table_policy_details (void *cls,
1606 : PGresult *result,
1607 : unsigned int num_results)
1608 : {
1609 0 : struct LookupRecordsByTableContext *ctx = cls;
1610 0 : struct PostgresClosure *pg = ctx->pg;
1611 0 : struct TALER_EXCHANGEDB_TableData td = {
1612 : .table = TALER_EXCHANGEDB_RT_POLICY_DETAILS
1613 : };
1614 :
1615 0 : for (unsigned int i = 0; i<num_results; i++)
1616 : {
1617 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1618 0 : GNUNET_PQ_result_spec_uint64 ("policy_details_serial_id",
1619 : &td.serial),
1620 0 : GNUNET_PQ_result_spec_auto_from_type ("hash_code",
1621 : &td.details.policy_details.
1622 : hash_code),
1623 0 : GNUNET_PQ_result_spec_allow_null (
1624 : TALER_PQ_result_spec_json ("policy_json",
1625 : &td.details.policy_details.
1626 : policy_json),
1627 : &td.details.policy_details.no_policy_json),
1628 0 : GNUNET_PQ_result_spec_timestamp ("deadline",
1629 : &td.details.policy_details.
1630 : deadline),
1631 0 : TALER_PQ_RESULT_SPEC_AMOUNT ("commitment",
1632 : &td.details.policy_details.
1633 : commitment),
1634 0 : TALER_PQ_RESULT_SPEC_AMOUNT ("accumulated_total",
1635 : &td.details.policy_details.
1636 : accumulated_total),
1637 0 : TALER_PQ_RESULT_SPEC_AMOUNT ("fee",
1638 : &td.details.policy_details.
1639 : fee),
1640 0 : TALER_PQ_RESULT_SPEC_AMOUNT ("transferable",
1641 : &td.details.policy_details.
1642 : transferable),
1643 0 : GNUNET_PQ_result_spec_uint16 ("fulfillment_state",
1644 : &td.details.policy_details.
1645 : fulfillment_state),
1646 0 : GNUNET_PQ_result_spec_allow_null (
1647 : GNUNET_PQ_result_spec_uint64 ("fulfillment_id",
1648 : &td.details.policy_details.
1649 : fulfillment_id),
1650 : &td.details.policy_details.no_fulfillment_id),
1651 : GNUNET_PQ_result_spec_end
1652 : };
1653 :
1654 0 : if (GNUNET_OK !=
1655 0 : GNUNET_PQ_extract_result (result,
1656 : rs,
1657 : i))
1658 : {
1659 0 : GNUNET_break (0);
1660 0 : ctx->error = true;
1661 0 : return;
1662 : }
1663 0 : ctx->cb (ctx->cb_cls,
1664 : &td);
1665 0 : GNUNET_PQ_cleanup_result (rs);
1666 : }
1667 : }
1668 :
1669 :
1670 : /**
1671 : * Function called with policy_fulfillments table entries.
1672 : *
1673 : * @param cls closure
1674 : * @param result the postgres result
1675 : * @param num_results the number of results in @a result
1676 : */
1677 : static void
1678 0 : lrbt_cb_table_policy_fulfillments (void *cls,
1679 : PGresult *result,
1680 : unsigned int num_results)
1681 : {
1682 0 : struct LookupRecordsByTableContext *ctx = cls;
1683 0 : struct TALER_EXCHANGEDB_TableData td = {
1684 : .table = TALER_EXCHANGEDB_RT_POLICY_FULFILLMENTS
1685 : };
1686 :
1687 0 : for (unsigned int i = 0; i<num_results; i++)
1688 : {
1689 0 : bool no_proof = false;
1690 0 : bool no_timestamp = false;
1691 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1692 0 : GNUNET_PQ_result_spec_uint64 ("fulfillment_id",
1693 : &td.serial),
1694 0 : GNUNET_PQ_result_spec_allow_null (
1695 : GNUNET_PQ_result_spec_timestamp ("fulfillment_timestamp",
1696 : &td.details.policy_fulfillments.
1697 : fulfillment_timestamp),
1698 : &no_timestamp),
1699 0 : GNUNET_PQ_result_spec_allow_null (
1700 : GNUNET_PQ_result_spec_string ("fulfillment_proof",
1701 : &td.details.policy_fulfillments.
1702 : fulfillment_proof),
1703 : &no_proof),
1704 : GNUNET_PQ_result_spec_end
1705 : };
1706 :
1707 0 : if (GNUNET_OK !=
1708 0 : GNUNET_PQ_extract_result (result,
1709 : rs,
1710 : i))
1711 : {
1712 0 : GNUNET_break (0);
1713 0 : ctx->error = true;
1714 0 : return;
1715 : }
1716 0 : ctx->cb (ctx->cb_cls,
1717 : &td);
1718 0 : GNUNET_PQ_cleanup_result (rs);
1719 : }
1720 : }
1721 :
1722 :
1723 : /**
1724 : * Function called with purse_requests table entries.
1725 : *
1726 : * @param cls closure
1727 : * @param result the postgres result
1728 : * @param num_results the number of results in @a result
1729 : */
1730 : static void
1731 0 : lrbt_cb_table_purse_requests (void *cls,
1732 : PGresult *result,
1733 : unsigned int num_results)
1734 : {
1735 0 : struct LookupRecordsByTableContext *ctx = cls;
1736 0 : struct PostgresClosure *pg = ctx->pg;
1737 0 : struct TALER_EXCHANGEDB_TableData td = {
1738 : .table = TALER_EXCHANGEDB_RT_PURSE_REQUESTS
1739 : };
1740 :
1741 0 : for (unsigned int i = 0; i<num_results; i++)
1742 : {
1743 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1744 0 : GNUNET_PQ_result_spec_uint64 (
1745 : "purse_requests_serial_id",
1746 : &td.serial),
1747 0 : GNUNET_PQ_result_spec_auto_from_type (
1748 : "purse_pub",
1749 : &td.details.purse_requests.purse_pub),
1750 0 : GNUNET_PQ_result_spec_auto_from_type (
1751 : "merge_pub",
1752 : &td.details.purse_requests.merge_pub),
1753 0 : GNUNET_PQ_result_spec_timestamp (
1754 : "purse_creation",
1755 : &td.details.purse_requests.purse_creation),
1756 0 : GNUNET_PQ_result_spec_timestamp (
1757 : "purse_expiration",
1758 : &td.details.purse_requests.purse_expiration),
1759 0 : GNUNET_PQ_result_spec_auto_from_type (
1760 : "h_contract_terms",
1761 : &td.details.purse_requests.h_contract_terms),
1762 0 : GNUNET_PQ_result_spec_uint32 (
1763 : "age_limit",
1764 : &td.details.purse_requests.age_limit),
1765 0 : GNUNET_PQ_result_spec_uint32 (
1766 : "flags",
1767 : &td.details.purse_requests.flags),
1768 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
1769 : "amount_with_fee",
1770 : &td.details.purse_requests.amount_with_fee),
1771 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
1772 : "purse_fee",
1773 : &td.details.purse_requests.purse_fee),
1774 0 : GNUNET_PQ_result_spec_auto_from_type (
1775 : "purse_sig",
1776 : &td.details.purse_requests.purse_sig),
1777 : GNUNET_PQ_result_spec_end
1778 : };
1779 :
1780 0 : if (GNUNET_OK !=
1781 0 : GNUNET_PQ_extract_result (result,
1782 : rs,
1783 : i))
1784 : {
1785 0 : GNUNET_break (0);
1786 0 : ctx->error = true;
1787 0 : return;
1788 : }
1789 0 : ctx->cb (ctx->cb_cls,
1790 : &td);
1791 0 : GNUNET_PQ_cleanup_result (rs);
1792 : }
1793 : }
1794 :
1795 :
1796 : /**
1797 : * Function called with purse_decision table entries.
1798 : *
1799 : * @param cls closure
1800 : * @param result the postgres result
1801 : * @param num_results the number of results in @a result
1802 : */
1803 : static void
1804 0 : lrbt_cb_table_purse_decision (void *cls,
1805 : PGresult *result,
1806 : unsigned int num_results)
1807 : {
1808 0 : struct LookupRecordsByTableContext *ctx = cls;
1809 0 : struct TALER_EXCHANGEDB_TableData td = {
1810 : .table = TALER_EXCHANGEDB_RT_PURSE_DECISION
1811 : };
1812 :
1813 0 : for (unsigned int i = 0; i<num_results; i++)
1814 : {
1815 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1816 0 : GNUNET_PQ_result_spec_uint64 (
1817 : "purse_refunds_serial_id",
1818 : &td.serial),
1819 0 : GNUNET_PQ_result_spec_auto_from_type (
1820 : "purse_pub",
1821 : &td.details.purse_decision.purse_pub),
1822 0 : GNUNET_PQ_result_spec_timestamp (
1823 : "action_timestamp",
1824 : &td.details.purse_decision.action_timestamp),
1825 0 : GNUNET_PQ_result_spec_bool (
1826 : "refunded",
1827 : &td.details.purse_decision.refunded),
1828 : GNUNET_PQ_result_spec_end
1829 : };
1830 :
1831 0 : if (GNUNET_OK !=
1832 0 : GNUNET_PQ_extract_result (result,
1833 : rs,
1834 : i))
1835 : {
1836 0 : GNUNET_break (0);
1837 0 : ctx->error = true;
1838 0 : return;
1839 : }
1840 0 : ctx->cb (ctx->cb_cls,
1841 : &td);
1842 0 : GNUNET_PQ_cleanup_result (rs);
1843 : }
1844 : }
1845 :
1846 :
1847 : /**
1848 : * Function called with purse_merges table entries.
1849 : *
1850 : * @param cls closure
1851 : * @param result the postgres result
1852 : * @param num_results the number of results in @a result
1853 : */
1854 : static void
1855 0 : lrbt_cb_table_purse_merges (void *cls,
1856 : PGresult *result,
1857 : unsigned int num_results)
1858 : {
1859 0 : struct LookupRecordsByTableContext *ctx = cls;
1860 0 : struct TALER_EXCHANGEDB_TableData td = {
1861 : .table = TALER_EXCHANGEDB_RT_PURSE_MERGES
1862 : };
1863 :
1864 0 : for (unsigned int i = 0; i<num_results; i++)
1865 : {
1866 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1867 0 : GNUNET_PQ_result_spec_uint64 (
1868 : "purse_merge_request_serial_id",
1869 : &td.serial),
1870 0 : GNUNET_PQ_result_spec_uint64 (
1871 : "partner_serial_id",
1872 : &td.details.purse_merges.partner_serial_id),
1873 0 : GNUNET_PQ_result_spec_auto_from_type (
1874 : "reserve_pub",
1875 : &td.details.purse_merges.reserve_pub),
1876 0 : GNUNET_PQ_result_spec_auto_from_type (
1877 : "purse_pub",
1878 : &td.details.purse_merges.purse_pub),
1879 0 : GNUNET_PQ_result_spec_auto_from_type (
1880 : "merge_sig",
1881 : &td.details.purse_merges.merge_sig),
1882 0 : GNUNET_PQ_result_spec_timestamp (
1883 : "merge_timestamp",
1884 : &td.details.purse_merges.merge_timestamp),
1885 : GNUNET_PQ_result_spec_end
1886 : };
1887 :
1888 0 : if (GNUNET_OK !=
1889 0 : GNUNET_PQ_extract_result (result,
1890 : rs,
1891 : i))
1892 : {
1893 0 : GNUNET_break (0);
1894 0 : ctx->error = true;
1895 0 : return;
1896 : }
1897 0 : ctx->cb (ctx->cb_cls,
1898 : &td);
1899 0 : GNUNET_PQ_cleanup_result (rs);
1900 : }
1901 : }
1902 :
1903 :
1904 : /**
1905 : * Function called with purse_deposits table entries.
1906 : *
1907 : * @param cls closure
1908 : * @param result the postgres result
1909 : * @param num_results the number of results in @a result
1910 : */
1911 : static void
1912 0 : lrbt_cb_table_purse_deposits (void *cls,
1913 : PGresult *result,
1914 : unsigned int num_results)
1915 : {
1916 0 : struct LookupRecordsByTableContext *ctx = cls;
1917 0 : struct PostgresClosure *pg = ctx->pg;
1918 0 : struct TALER_EXCHANGEDB_TableData td = {
1919 : .table = TALER_EXCHANGEDB_RT_PURSE_DEPOSITS
1920 : };
1921 :
1922 0 : for (unsigned int i = 0; i<num_results; i++)
1923 : {
1924 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1925 0 : GNUNET_PQ_result_spec_uint64 (
1926 : "purse_deposit_serial_id",
1927 : &td.serial),
1928 0 : GNUNET_PQ_result_spec_uint64 (
1929 : "partner_serial_id",
1930 : &td.details.purse_deposits.partner_serial_id),
1931 0 : GNUNET_PQ_result_spec_auto_from_type (
1932 : "purse_pub",
1933 : &td.details.purse_deposits.purse_pub),
1934 0 : GNUNET_PQ_result_spec_auto_from_type (
1935 : "coin_pub",
1936 : &td.details.purse_deposits.coin_pub),
1937 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
1938 : "amount_with_fee",
1939 : &td.details.purse_deposits.amount_with_fee),
1940 0 : GNUNET_PQ_result_spec_auto_from_type (
1941 : "coin_sig",
1942 : &td.details.purse_deposits.coin_sig),
1943 : GNUNET_PQ_result_spec_end
1944 : };
1945 :
1946 0 : if (GNUNET_OK !=
1947 0 : GNUNET_PQ_extract_result (result,
1948 : rs,
1949 : i))
1950 : {
1951 0 : GNUNET_break (0);
1952 0 : ctx->error = true;
1953 0 : return;
1954 : }
1955 0 : ctx->cb (ctx->cb_cls,
1956 : &td);
1957 0 : GNUNET_PQ_cleanup_result (rs);
1958 : }
1959 : }
1960 :
1961 :
1962 : /**
1963 : * Function called with account_merges table entries.
1964 : *
1965 : * @param cls closure
1966 : * @param result the postgres result
1967 : * @param num_results the number of results in @a result
1968 : */
1969 : static void
1970 0 : lrbt_cb_table_account_merges (void *cls,
1971 : PGresult *result,
1972 : unsigned int num_results)
1973 : {
1974 0 : struct LookupRecordsByTableContext *ctx = cls;
1975 0 : struct TALER_EXCHANGEDB_TableData td = {
1976 : .table = TALER_EXCHANGEDB_RT_ACCOUNT_MERGES
1977 : };
1978 :
1979 0 : for (unsigned int i = 0; i<num_results; i++)
1980 : {
1981 0 : struct GNUNET_PQ_ResultSpec rs[] = {
1982 0 : GNUNET_PQ_result_spec_uint64 (
1983 : "account_merge_request_serial_id",
1984 : &td.serial),
1985 0 : GNUNET_PQ_result_spec_auto_from_type (
1986 : "reserve_pub",
1987 : &td.details.account_merges.reserve_pub),
1988 0 : GNUNET_PQ_result_spec_auto_from_type (
1989 : "reserve_sig",
1990 : &td.details.account_merges.reserve_sig),
1991 0 : GNUNET_PQ_result_spec_auto_from_type (
1992 : "purse_pub",
1993 : &td.details.account_merges.purse_pub),
1994 0 : GNUNET_PQ_result_spec_auto_from_type (
1995 : "wallet_h_payto",
1996 : &td.details.account_merges.wallet_h_payto),
1997 : GNUNET_PQ_result_spec_end
1998 : };
1999 :
2000 0 : if (GNUNET_OK !=
2001 0 : GNUNET_PQ_extract_result (result,
2002 : rs,
2003 : i))
2004 : {
2005 0 : GNUNET_break (0);
2006 0 : ctx->error = true;
2007 0 : return;
2008 : }
2009 0 : ctx->cb (ctx->cb_cls,
2010 : &td);
2011 0 : GNUNET_PQ_cleanup_result (rs);
2012 : }
2013 : }
2014 :
2015 :
2016 : /**
2017 : * Function called with history_requests table entries.
2018 : *
2019 : * @param cls closure
2020 : * @param result the postgres result
2021 : * @param num_results the number of results in @a result
2022 : */
2023 : static void
2024 0 : lrbt_cb_table_history_requests (void *cls,
2025 : PGresult *result,
2026 : unsigned int num_results)
2027 : {
2028 0 : struct LookupRecordsByTableContext *ctx = cls;
2029 0 : struct PostgresClosure *pg = ctx->pg;
2030 0 : struct TALER_EXCHANGEDB_TableData td = {
2031 : .table = TALER_EXCHANGEDB_RT_HISTORY_REQUESTS
2032 : };
2033 :
2034 0 : for (unsigned int i = 0; i<num_results; i++)
2035 : {
2036 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2037 0 : GNUNET_PQ_result_spec_uint64 (
2038 : "history_request_serial_id",
2039 : &td.serial),
2040 0 : GNUNET_PQ_result_spec_auto_from_type (
2041 : "reserve_pub",
2042 : &td.details.history_requests.reserve_pub),
2043 0 : GNUNET_PQ_result_spec_auto_from_type (
2044 : "reserve_sig",
2045 : &td.details.history_requests.reserve_sig),
2046 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
2047 : "history_fee",
2048 : &td.details.history_requests.history_fee),
2049 : GNUNET_PQ_result_spec_end
2050 : };
2051 :
2052 0 : if (GNUNET_OK !=
2053 0 : GNUNET_PQ_extract_result (result,
2054 : rs,
2055 : i))
2056 : {
2057 0 : GNUNET_break (0);
2058 0 : ctx->error = true;
2059 0 : return;
2060 : }
2061 0 : ctx->cb (ctx->cb_cls,
2062 : &td);
2063 0 : GNUNET_PQ_cleanup_result (rs);
2064 : }
2065 : }
2066 :
2067 :
2068 : /**
2069 : * Function called with close_requests table entries.
2070 : *
2071 : * @param cls closure
2072 : * @param result the postgres result
2073 : * @param num_results the number of results in @a result
2074 : */
2075 : static void
2076 0 : lrbt_cb_table_close_requests (void *cls,
2077 : PGresult *result,
2078 : unsigned int num_results)
2079 : {
2080 0 : struct LookupRecordsByTableContext *ctx = cls;
2081 0 : struct PostgresClosure *pg = ctx->pg;
2082 0 : struct TALER_EXCHANGEDB_TableData td = {
2083 : .table = TALER_EXCHANGEDB_RT_CLOSE_REQUESTS
2084 : };
2085 :
2086 0 : for (unsigned int i = 0; i<num_results; i++)
2087 : {
2088 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2089 0 : GNUNET_PQ_result_spec_uint64 (
2090 : "close_request_serial_id",
2091 : &td.serial),
2092 0 : GNUNET_PQ_result_spec_auto_from_type (
2093 : "reserve_pub",
2094 : &td.details.close_requests.reserve_pub),
2095 0 : GNUNET_PQ_result_spec_timestamp (
2096 : "close_timestamp",
2097 : &td.details.close_requests.close_timestamp),
2098 0 : GNUNET_PQ_result_spec_auto_from_type (
2099 : "reserve_sig",
2100 : &td.details.close_requests.reserve_sig),
2101 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
2102 : "close",
2103 : &td.details.close_requests.close),
2104 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
2105 : "close_fee",
2106 : &td.details.close_requests.close_fee),
2107 0 : GNUNET_PQ_result_spec_string (
2108 : "payto_uri",
2109 : &td.details.close_requests.payto_uri.full_payto),
2110 : GNUNET_PQ_result_spec_end
2111 : };
2112 :
2113 0 : if (GNUNET_OK !=
2114 0 : GNUNET_PQ_extract_result (result,
2115 : rs,
2116 : i))
2117 : {
2118 0 : GNUNET_break (0);
2119 0 : ctx->error = true;
2120 0 : return;
2121 : }
2122 0 : ctx->cb (ctx->cb_cls,
2123 : &td);
2124 0 : GNUNET_PQ_cleanup_result (rs);
2125 : }
2126 : }
2127 :
2128 :
2129 : /**
2130 : * Function called with wads_out table entries.
2131 : *
2132 : * @param cls closure
2133 : * @param result the postgres result
2134 : * @param num_results the number of results in @a result
2135 : */
2136 : static void
2137 0 : lrbt_cb_table_wads_out (void *cls,
2138 : PGresult *result,
2139 : unsigned int num_results)
2140 : {
2141 0 : struct LookupRecordsByTableContext *ctx = cls;
2142 0 : struct PostgresClosure *pg = ctx->pg;
2143 0 : struct TALER_EXCHANGEDB_TableData td = {
2144 : .table = TALER_EXCHANGEDB_RT_WADS_OUT
2145 : };
2146 :
2147 0 : for (unsigned int i = 0; i<num_results; i++)
2148 : {
2149 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2150 0 : GNUNET_PQ_result_spec_uint64 (
2151 : "wad_out_serial_id",
2152 : &td.serial),
2153 0 : GNUNET_PQ_result_spec_auto_from_type (
2154 : "wad_id",
2155 : &td.details.wads_out.wad_id),
2156 0 : GNUNET_PQ_result_spec_uint64 (
2157 : "partner_serial_id",
2158 : &td.details.wads_out.partner_serial_id),
2159 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
2160 : "amount",
2161 : &td.details.wads_out.amount),
2162 0 : GNUNET_PQ_result_spec_timestamp (
2163 : "execution_time",
2164 : &td.details.wads_out.execution_time),
2165 : GNUNET_PQ_result_spec_end
2166 : };
2167 :
2168 0 : if (GNUNET_OK !=
2169 0 : GNUNET_PQ_extract_result (result,
2170 : rs,
2171 : i))
2172 : {
2173 0 : GNUNET_break (0);
2174 0 : ctx->error = true;
2175 0 : return;
2176 : }
2177 0 : ctx->cb (ctx->cb_cls,
2178 : &td);
2179 0 : GNUNET_PQ_cleanup_result (rs);
2180 : }
2181 : }
2182 :
2183 :
2184 : /**
2185 : * Function called with wads_out_entries table entries.
2186 : *
2187 : * @param cls closure
2188 : * @param result the postgres result
2189 : * @param num_results the number of results in @a result
2190 : */
2191 : static void
2192 0 : lrbt_cb_table_wads_out_entries (void *cls,
2193 : PGresult *result,
2194 : unsigned int num_results)
2195 : {
2196 0 : struct LookupRecordsByTableContext *ctx = cls;
2197 0 : struct PostgresClosure *pg = ctx->pg;
2198 0 : struct TALER_EXCHANGEDB_TableData td = {
2199 : .table = TALER_EXCHANGEDB_RT_WADS_OUT_ENTRIES
2200 : };
2201 :
2202 0 : for (unsigned int i = 0; i<num_results; i++)
2203 : {
2204 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2205 0 : GNUNET_PQ_result_spec_uint64 (
2206 : "wad_out_entry_serial_id",
2207 : &td.serial),
2208 0 : GNUNET_PQ_result_spec_auto_from_type (
2209 : "reserve_pub",
2210 : &td.details.wads_out_entries.reserve_pub),
2211 0 : GNUNET_PQ_result_spec_auto_from_type (
2212 : "purse_pub",
2213 : &td.details.wads_out_entries.purse_pub),
2214 0 : GNUNET_PQ_result_spec_auto_from_type (
2215 : "h_contract",
2216 : &td.details.wads_out_entries.h_contract),
2217 0 : GNUNET_PQ_result_spec_timestamp (
2218 : "purse_expiration",
2219 : &td.details.wads_out_entries.purse_expiration),
2220 0 : GNUNET_PQ_result_spec_timestamp (
2221 : "merge_timestamp",
2222 : &td.details.wads_out_entries.merge_timestamp),
2223 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
2224 : "amount_with_fee",
2225 : &td.details.wads_out_entries.amount_with_fee),
2226 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
2227 : "wad_fee",
2228 : &td.details.wads_out_entries.wad_fee),
2229 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
2230 : "deposit_fees",
2231 : &td.details.wads_out_entries.deposit_fees),
2232 0 : GNUNET_PQ_result_spec_auto_from_type (
2233 : "reserve_sig",
2234 : &td.details.wads_out_entries.reserve_sig),
2235 0 : GNUNET_PQ_result_spec_auto_from_type (
2236 : "purse_sig",
2237 : &td.details.wads_out_entries.purse_sig),
2238 : GNUNET_PQ_result_spec_end
2239 : };
2240 :
2241 0 : if (GNUNET_OK !=
2242 0 : GNUNET_PQ_extract_result (result,
2243 : rs,
2244 : i))
2245 : {
2246 0 : GNUNET_break (0);
2247 0 : ctx->error = true;
2248 0 : return;
2249 : }
2250 0 : ctx->cb (ctx->cb_cls,
2251 : &td);
2252 0 : GNUNET_PQ_cleanup_result (rs);
2253 : }
2254 : }
2255 :
2256 :
2257 : /**
2258 : * Function called with wads_in table entries.
2259 : *
2260 : * @param cls closure
2261 : * @param result the postgres result
2262 : * @param num_results the number of results in @a result
2263 : */
2264 : static void
2265 0 : lrbt_cb_table_wads_in (void *cls,
2266 : PGresult *result,
2267 : unsigned int num_results)
2268 : {
2269 0 : struct LookupRecordsByTableContext *ctx = cls;
2270 0 : struct PostgresClosure *pg = ctx->pg;
2271 0 : struct TALER_EXCHANGEDB_TableData td = {
2272 : .table = TALER_EXCHANGEDB_RT_WADS_IN
2273 : };
2274 :
2275 0 : for (unsigned int i = 0; i<num_results; i++)
2276 : {
2277 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2278 0 : GNUNET_PQ_result_spec_uint64 (
2279 : "wad_in_serial_id",
2280 : &td.serial),
2281 0 : GNUNET_PQ_result_spec_auto_from_type (
2282 : "wad_id",
2283 : &td.details.wads_in.wad_id),
2284 0 : GNUNET_PQ_result_spec_string (
2285 : "origin_exchange_url",
2286 : &td.details.wads_in.origin_exchange_url),
2287 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
2288 : "amount",
2289 : &td.details.wads_in.amount),
2290 0 : GNUNET_PQ_result_spec_timestamp (
2291 : "arrival_time",
2292 : &td.details.wads_in.arrival_time),
2293 : GNUNET_PQ_result_spec_end
2294 : };
2295 :
2296 0 : if (GNUNET_OK !=
2297 0 : GNUNET_PQ_extract_result (result,
2298 : rs,
2299 : i))
2300 : {
2301 0 : GNUNET_break (0);
2302 0 : ctx->error = true;
2303 0 : return;
2304 : }
2305 0 : ctx->cb (ctx->cb_cls,
2306 : &td);
2307 0 : GNUNET_PQ_cleanup_result (rs);
2308 : }
2309 : }
2310 :
2311 :
2312 : /**
2313 : * Function called with wads_in_entries table entries.
2314 : *
2315 : * @param cls closure
2316 : * @param result the postgres result
2317 : * @param num_results the number of results in @a result
2318 : */
2319 : static void
2320 0 : lrbt_cb_table_wads_in_entries (void *cls,
2321 : PGresult *result,
2322 : unsigned int num_results)
2323 : {
2324 0 : struct LookupRecordsByTableContext *ctx = cls;
2325 0 : struct PostgresClosure *pg = ctx->pg;
2326 0 : struct TALER_EXCHANGEDB_TableData td = {
2327 : .table = TALER_EXCHANGEDB_RT_WADS_IN_ENTRIES
2328 : };
2329 :
2330 0 : for (unsigned int i = 0; i<num_results; i++)
2331 : {
2332 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2333 0 : GNUNET_PQ_result_spec_uint64 (
2334 : "wad_in_entry_serial_id",
2335 : &td.serial),
2336 0 : GNUNET_PQ_result_spec_auto_from_type (
2337 : "reserve_pub",
2338 : &td.details.wads_in_entries.reserve_pub),
2339 0 : GNUNET_PQ_result_spec_auto_from_type (
2340 : "purse_pub",
2341 : &td.details.wads_in_entries.purse_pub),
2342 0 : GNUNET_PQ_result_spec_auto_from_type (
2343 : "h_contract",
2344 : &td.details.wads_in_entries.h_contract),
2345 0 : GNUNET_PQ_result_spec_timestamp (
2346 : "purse_expiration",
2347 : &td.details.wads_in_entries.purse_expiration),
2348 0 : GNUNET_PQ_result_spec_timestamp (
2349 : "merge_timestamp",
2350 : &td.details.wads_in_entries.merge_timestamp),
2351 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
2352 : "amount_with_fee",
2353 : &td.details.wads_in_entries.amount_with_fee),
2354 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
2355 : "wad_fee",
2356 : &td.details.wads_in_entries.wad_fee),
2357 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
2358 : "deposit_fees",
2359 : &td.details.wads_in_entries.deposit_fees),
2360 0 : GNUNET_PQ_result_spec_auto_from_type (
2361 : "reserve_sig",
2362 : &td.details.wads_in_entries.reserve_sig),
2363 0 : GNUNET_PQ_result_spec_auto_from_type (
2364 : "purse_sig",
2365 : &td.details.wads_in_entries.purse_sig),
2366 : GNUNET_PQ_result_spec_end
2367 : };
2368 :
2369 0 : if (GNUNET_OK !=
2370 0 : GNUNET_PQ_extract_result (result,
2371 : rs,
2372 : i))
2373 : {
2374 0 : GNUNET_break (0);
2375 0 : ctx->error = true;
2376 0 : return;
2377 : }
2378 0 : ctx->cb (ctx->cb_cls,
2379 : &td);
2380 0 : GNUNET_PQ_cleanup_result (rs);
2381 : }
2382 : }
2383 :
2384 :
2385 : /**
2386 : * Function called with profit_drains table entries.
2387 : *
2388 : * @param cls closure
2389 : * @param result the postgres result
2390 : * @param num_results the number of results in @a result
2391 : */
2392 : static void
2393 0 : lrbt_cb_table_profit_drains (void *cls,
2394 : PGresult *result,
2395 : unsigned int num_results)
2396 : {
2397 0 : struct LookupRecordsByTableContext *ctx = cls;
2398 0 : struct PostgresClosure *pg = ctx->pg;
2399 0 : struct TALER_EXCHANGEDB_TableData td = {
2400 : .table = TALER_EXCHANGEDB_RT_PROFIT_DRAINS
2401 : };
2402 :
2403 0 : for (unsigned int i = 0; i<num_results; i++)
2404 : {
2405 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2406 0 : GNUNET_PQ_result_spec_uint64 (
2407 : "profit_drain_serial_id",
2408 : &td.serial),
2409 0 : GNUNET_PQ_result_spec_auto_from_type (
2410 : "wtid",
2411 : &td.details.profit_drains.wtid),
2412 0 : GNUNET_PQ_result_spec_string (
2413 : "account_section",
2414 : &td.details.profit_drains.account_section),
2415 0 : GNUNET_PQ_result_spec_string (
2416 : "payto_uri",
2417 : &td.details.profit_drains.payto_uri.full_payto),
2418 0 : GNUNET_PQ_result_spec_timestamp (
2419 : "trigger_date",
2420 : &td.details.profit_drains.trigger_date),
2421 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
2422 : "amount",
2423 : &td.details.profit_drains.amount),
2424 0 : GNUNET_PQ_result_spec_auto_from_type (
2425 : "master_sig",
2426 : &td.details.profit_drains.master_sig),
2427 : GNUNET_PQ_result_spec_end
2428 : };
2429 :
2430 0 : if (GNUNET_OK !=
2431 0 : GNUNET_PQ_extract_result (result,
2432 : rs,
2433 : i))
2434 : {
2435 0 : GNUNET_break (0);
2436 0 : ctx->error = true;
2437 0 : return;
2438 : }
2439 0 : ctx->cb (ctx->cb_cls,
2440 : &td);
2441 0 : GNUNET_PQ_cleanup_result (rs);
2442 : }
2443 : }
2444 :
2445 :
2446 : /**
2447 : * Function called with aml_staff table entries.
2448 : *
2449 : * @param cls closure
2450 : * @param result the postgres result
2451 : * @param num_results the number of results in @a result
2452 : */
2453 : static void
2454 0 : lrbt_cb_table_aml_staff (void *cls,
2455 : PGresult *result,
2456 : unsigned int num_results)
2457 : {
2458 0 : struct LookupRecordsByTableContext *ctx = cls;
2459 0 : struct TALER_EXCHANGEDB_TableData td = {
2460 : .table = TALER_EXCHANGEDB_RT_AML_STAFF
2461 : };
2462 :
2463 0 : for (unsigned int i = 0; i<num_results; i++)
2464 : {
2465 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2466 0 : GNUNET_PQ_result_spec_uint64 (
2467 : "aml_staff_uuid",
2468 : &td.serial),
2469 0 : GNUNET_PQ_result_spec_auto_from_type (
2470 : "decider_pub",
2471 : &td.details.aml_staff.decider_pub),
2472 0 : GNUNET_PQ_result_spec_auto_from_type (
2473 : "master_sig",
2474 : &td.details.aml_staff.master_sig),
2475 0 : GNUNET_PQ_result_spec_string (
2476 : "decider_name",
2477 : &td.details.aml_staff.decider_name),
2478 0 : GNUNET_PQ_result_spec_bool (
2479 : "is_active",
2480 : &td.details.aml_staff.is_active),
2481 0 : GNUNET_PQ_result_spec_bool (
2482 : "read_only",
2483 : &td.details.aml_staff.read_only),
2484 0 : GNUNET_PQ_result_spec_timestamp (
2485 : "last_change",
2486 : &td.details.aml_staff.last_change),
2487 : GNUNET_PQ_result_spec_end
2488 : };
2489 :
2490 0 : if (GNUNET_OK !=
2491 0 : GNUNET_PQ_extract_result (result,
2492 : rs,
2493 : i))
2494 : {
2495 0 : GNUNET_break (0);
2496 0 : ctx->error = true;
2497 0 : return;
2498 : }
2499 0 : ctx->cb (ctx->cb_cls,
2500 : &td);
2501 0 : GNUNET_PQ_cleanup_result (rs);
2502 : }
2503 : }
2504 :
2505 :
2506 : /**
2507 : * Function called with purse_deletion table entries.
2508 : *
2509 : * @param cls closure
2510 : * @param result the postgres result
2511 : * @param num_results the number of results in @a result
2512 : */
2513 : static void
2514 0 : lrbt_cb_table_purse_deletion (void *cls,
2515 : PGresult *result,
2516 : unsigned int num_results)
2517 : {
2518 0 : struct LookupRecordsByTableContext *ctx = cls;
2519 0 : struct TALER_EXCHANGEDB_TableData td = {
2520 : .table = TALER_EXCHANGEDB_RT_PURSE_DELETION
2521 : };
2522 :
2523 0 : for (unsigned int i = 0; i<num_results; i++)
2524 : {
2525 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2526 0 : GNUNET_PQ_result_spec_uint64 (
2527 : "purse_deletion_serial_id",
2528 : &td.serial),
2529 0 : GNUNET_PQ_result_spec_auto_from_type (
2530 : "purse_sig",
2531 : &td.details.purse_deletion.purse_sig),
2532 0 : GNUNET_PQ_result_spec_auto_from_type (
2533 : "purse_pub",
2534 : &td.details.purse_deletion.purse_pub),
2535 : GNUNET_PQ_result_spec_end
2536 : };
2537 :
2538 0 : if (GNUNET_OK !=
2539 0 : GNUNET_PQ_extract_result (result,
2540 : rs,
2541 : i))
2542 : {
2543 0 : GNUNET_break (0);
2544 0 : ctx->error = true;
2545 0 : return;
2546 : }
2547 0 : ctx->cb (ctx->cb_cls,
2548 : &td);
2549 0 : GNUNET_PQ_cleanup_result (rs);
2550 : }
2551 : }
2552 :
2553 :
2554 : /**
2555 : * Function called with withdraw table entries.
2556 : *
2557 : * @param cls closure
2558 : * @param result the postgres result
2559 : * @param num_results the number of results in @a result
2560 : */
2561 : static void
2562 0 : lrbt_cb_table_withdraw (void *cls,
2563 : PGresult *result,
2564 : unsigned int num_results)
2565 : {
2566 0 : struct LookupRecordsByTableContext *ctx = cls;
2567 0 : struct PostgresClosure *pg = ctx->pg;
2568 0 : struct TALER_EXCHANGEDB_TableData td = {
2569 : .table = TALER_EXCHANGEDB_RT_WITHDRAW
2570 : };
2571 :
2572 0 : for (unsigned int i = 0; i<num_results; i++)
2573 : {
2574 : bool no_max_age;
2575 : bool no_noreveal_index;
2576 : bool no_selected_h;
2577 : bool no_cs_r_values;
2578 : bool no_cs_r_choices;
2579 : size_t num_sigs;
2580 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2581 0 : GNUNET_PQ_result_spec_uint64 (
2582 : "withdraw_id",
2583 : &td.serial),
2584 0 : GNUNET_PQ_result_spec_auto_from_type (
2585 : "planchets_h",
2586 : &td.details.withdraw.planchets_h),
2587 0 : GNUNET_PQ_result_spec_timestamp (
2588 : "execution_date",
2589 : &td.details.withdraw.execution_date),
2590 0 : TALER_PQ_RESULT_SPEC_AMOUNT (
2591 : "amount_with_fee",
2592 : &td.details.withdraw.amount_with_fee),
2593 0 : GNUNET_PQ_result_spec_auto_from_type (
2594 : "reserve_pub",
2595 : &td.details.withdraw.reserve_pub),
2596 0 : GNUNET_PQ_result_spec_auto_from_type (
2597 : "reserve_sig",
2598 : &td.details.withdraw.reserve_sig),
2599 0 : GNUNET_PQ_result_spec_allow_null (
2600 : GNUNET_PQ_result_spec_uint16 (
2601 : "max_age",
2602 : &td.details.withdraw.max_age),
2603 : &no_max_age),
2604 0 : GNUNET_PQ_result_spec_allow_null (
2605 : GNUNET_PQ_result_spec_uint16 (
2606 : "noreveal_index",
2607 : &td.details.withdraw.noreveal_index),
2608 : &no_noreveal_index),
2609 0 : GNUNET_PQ_result_spec_allow_null (
2610 : GNUNET_PQ_result_spec_auto_from_type (
2611 : "selected_h",
2612 : &td.details.withdraw.selected_h),
2613 : &no_selected_h),
2614 0 : GNUNET_PQ_result_spec_allow_null (
2615 : GNUNET_PQ_result_spec_auto_from_type (
2616 : "blinding_seed",
2617 : &td.details.withdraw.blinding_seed),
2618 : &td.details.withdraw.no_blinding_seed),
2619 0 : GNUNET_PQ_result_spec_allow_null (
2620 : TALER_PQ_result_spec_array_cs_r_pub (
2621 : pg->conn,
2622 : "cs_r_values",
2623 : &td.details.withdraw.num_cs_r_values,
2624 : &td.details.withdraw.cs_r_values),
2625 : &no_cs_r_values),
2626 0 : GNUNET_PQ_result_spec_allow_null (
2627 : GNUNET_PQ_result_spec_uint64 (
2628 : "cs_r_choices",
2629 : &td.details.withdraw.cs_r_choices),
2630 : &no_cs_r_choices),
2631 0 : GNUNET_PQ_result_spec_array_uint64 (
2632 : pg->conn,
2633 : "denom_serials",
2634 : &td.details.withdraw.num_coins,
2635 : &td.details.withdraw.denom_serials),
2636 0 : TALER_PQ_result_spec_array_blinded_denom_sig (
2637 : pg->conn,
2638 : "denom_sigs",
2639 : &num_sigs,
2640 : &td.details.withdraw.denom_sigs),
2641 : GNUNET_PQ_result_spec_end
2642 : };
2643 :
2644 0 : if (GNUNET_OK !=
2645 0 : GNUNET_PQ_extract_result (result,
2646 : rs,
2647 : i))
2648 : {
2649 0 : GNUNET_break (0);
2650 0 : ctx->error = true;
2651 0 : GNUNET_PQ_cleanup_result (rs);
2652 0 : return;
2653 : }
2654 0 : if (num_sigs != td.details.withdraw.num_coins)
2655 : {
2656 0 : GNUNET_break (0);
2657 0 : ctx->error = true;
2658 0 : GNUNET_PQ_cleanup_result (rs);
2659 0 : return;
2660 : }
2661 0 : if (no_max_age != no_noreveal_index)
2662 : {
2663 0 : GNUNET_break (0);
2664 0 : ctx->error = true;
2665 0 : GNUNET_PQ_cleanup_result (rs);
2666 0 : return;
2667 : }
2668 0 : if (no_max_age != no_selected_h)
2669 : {
2670 0 : GNUNET_break (0);
2671 0 : ctx->error = true;
2672 0 : GNUNET_PQ_cleanup_result (rs);
2673 0 : return;
2674 : }
2675 0 : if (no_cs_r_values != no_cs_r_choices)
2676 : {
2677 0 : GNUNET_break (0);
2678 0 : ctx->error = true;
2679 0 : GNUNET_PQ_cleanup_result (rs);
2680 0 : return;
2681 : }
2682 0 : if (no_cs_r_values != td.details.withdraw.no_blinding_seed)
2683 : {
2684 0 : GNUNET_break (0);
2685 0 : ctx->error = true;
2686 0 : GNUNET_PQ_cleanup_result (rs);
2687 0 : return;
2688 : }
2689 0 : td.details.withdraw.age_proof_required = ! no_max_age;
2690 0 : ctx->cb (ctx->cb_cls,
2691 : &td);
2692 0 : GNUNET_PQ_cleanup_result (rs);
2693 : }
2694 : }
2695 :
2696 :
2697 : /**
2698 : * Function called with legitimization_measures table entries.
2699 : *
2700 : * @param cls closure
2701 : * @param result the postgres result
2702 : * @param num_results the number of results in @a result
2703 : */
2704 : static void
2705 0 : lrbt_cb_table_legitimization_measures (void *cls,
2706 : PGresult *result,
2707 : unsigned int num_results)
2708 : {
2709 0 : struct LookupRecordsByTableContext *ctx = cls;
2710 0 : struct TALER_EXCHANGEDB_TableData td = {
2711 : .table = TALER_EXCHANGEDB_RT_LEGITIMIZATION_MEASURES
2712 : };
2713 :
2714 0 : for (unsigned int i = 0; i<num_results; i++)
2715 : {
2716 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2717 0 : GNUNET_PQ_result_spec_uint64 ("serial",
2718 : &td.serial),
2719 0 : GNUNET_PQ_result_spec_auto_from_type (
2720 : "access_token",
2721 : &td.details.legitimization_measures.target_token),
2722 0 : GNUNET_PQ_result_spec_timestamp (
2723 : "start_time",
2724 : &td.details.legitimization_measures.start_time),
2725 0 : TALER_PQ_result_spec_json (
2726 : "jmeasures",
2727 : &td.details.legitimization_measures.measures),
2728 0 : GNUNET_PQ_result_spec_uint32 (
2729 : "display_priority",
2730 : &td.details.legitimization_measures.display_priority),
2731 : GNUNET_PQ_result_spec_end
2732 : };
2733 :
2734 0 : if (GNUNET_OK !=
2735 0 : GNUNET_PQ_extract_result (result,
2736 : rs,
2737 : i))
2738 : {
2739 0 : GNUNET_break (0);
2740 0 : ctx->error = true;
2741 0 : return;
2742 : }
2743 0 : ctx->cb (ctx->cb_cls,
2744 : &td);
2745 0 : GNUNET_PQ_cleanup_result (rs);
2746 : }
2747 : }
2748 :
2749 :
2750 : /**
2751 : * Function called with legitimization_outcomes table entries.
2752 : *
2753 : * @param cls closure
2754 : * @param result the postgres result
2755 : * @param num_results the number of results in @a result
2756 : */
2757 : static void
2758 0 : lrbt_cb_table_legitimization_outcomes (void *cls,
2759 : PGresult *result,
2760 : unsigned int num_results)
2761 : {
2762 0 : struct LookupRecordsByTableContext *ctx = cls;
2763 0 : struct TALER_EXCHANGEDB_TableData td = {
2764 : .table = TALER_EXCHANGEDB_RT_LEGITIMIZATION_OUTCOMES
2765 : };
2766 :
2767 0 : for (unsigned int i = 0; i<num_results; i++)
2768 : {
2769 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2770 0 : GNUNET_PQ_result_spec_uint64 ("serial",
2771 : &td.serial),
2772 0 : GNUNET_PQ_result_spec_auto_from_type (
2773 : "h_payto",
2774 : &td.details.legitimization_outcomes.h_payto),
2775 0 : GNUNET_PQ_result_spec_timestamp (
2776 : "decision_time",
2777 : &td.details.legitimization_outcomes.decision_time),
2778 0 : GNUNET_PQ_result_spec_timestamp (
2779 : "expiration_time",
2780 : &td.details.legitimization_outcomes.expiration_time),
2781 0 : GNUNET_PQ_result_spec_allow_null (
2782 : TALER_PQ_result_spec_json (
2783 : "jproperties",
2784 : &td.details.legitimization_outcomes.properties),
2785 : NULL),
2786 0 : GNUNET_PQ_result_spec_bool (
2787 : "to_investigate_id",
2788 : &td.details.legitimization_outcomes.to_investigate),
2789 0 : TALER_PQ_result_spec_json (
2790 : "jnew_rules",
2791 : &td.details.legitimization_outcomes.new_rules),
2792 : GNUNET_PQ_result_spec_end
2793 : };
2794 :
2795 0 : if (GNUNET_OK !=
2796 0 : GNUNET_PQ_extract_result (result,
2797 : rs,
2798 : i))
2799 : {
2800 0 : GNUNET_break (0);
2801 0 : ctx->error = true;
2802 0 : return;
2803 : }
2804 0 : ctx->cb (ctx->cb_cls,
2805 : &td);
2806 0 : GNUNET_PQ_cleanup_result (rs);
2807 : }
2808 : }
2809 :
2810 :
2811 : /**
2812 : * Function called with legitimization_processes table entries.
2813 : *
2814 : * @param cls closure
2815 : * @param result the postgres result
2816 : * @param num_results the number of results in @a result
2817 : */
2818 : static void
2819 0 : lrbt_cb_table_legitimization_processes (void *cls,
2820 : PGresult *result,
2821 : unsigned int num_results)
2822 : {
2823 0 : struct LookupRecordsByTableContext *ctx = cls;
2824 0 : struct TALER_EXCHANGEDB_TableData td = {
2825 : .table = TALER_EXCHANGEDB_RT_LEGITIMIZATION_PROCESSES
2826 : };
2827 :
2828 0 : for (unsigned int i = 0; i<num_results; i++)
2829 : {
2830 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2831 0 : GNUNET_PQ_result_spec_uint64 ("serial",
2832 : &td.serial),
2833 0 : GNUNET_PQ_result_spec_auto_from_type (
2834 : "h_payto",
2835 : &td.details.legitimization_processes.h_payto),
2836 0 : GNUNET_PQ_result_spec_timestamp (
2837 : "start_time",
2838 : &td.details.legitimization_processes.start_time),
2839 0 : GNUNET_PQ_result_spec_timestamp (
2840 : "expiration_time",
2841 : &td.details.legitimization_processes.expiration_time),
2842 0 : GNUNET_PQ_result_spec_uint64 (
2843 : "legitimization_measure_serial_id",
2844 : &td.details.legitimization_processes.legitimization_measure_serial_id),
2845 0 : GNUNET_PQ_result_spec_uint32 (
2846 : "measure_index",
2847 : &td.details.legitimization_processes.measure_index),
2848 0 : GNUNET_PQ_result_spec_string (
2849 : "provider_name",
2850 : &td.details.legitimization_processes.provider_name),
2851 0 : GNUNET_PQ_result_spec_string (
2852 : "provider_user_id",
2853 : &td.details.legitimization_processes.provider_user_id),
2854 0 : GNUNET_PQ_result_spec_string (
2855 : "provider_legitimization_id",
2856 : &td.details.legitimization_processes.provider_legitimization_id),
2857 0 : GNUNET_PQ_result_spec_string (
2858 : "redirect_url",
2859 : &td.details.legitimization_processes.redirect_url),
2860 : GNUNET_PQ_result_spec_end
2861 : };
2862 :
2863 0 : if (GNUNET_OK !=
2864 0 : GNUNET_PQ_extract_result (result,
2865 : rs,
2866 : i))
2867 : {
2868 0 : GNUNET_break (0);
2869 0 : ctx->error = true;
2870 0 : return;
2871 : }
2872 0 : ctx->cb (ctx->cb_cls,
2873 : &td);
2874 0 : GNUNET_PQ_cleanup_result (rs);
2875 : }
2876 : }
2877 :
2878 :
2879 : /**
2880 : * Function called with kyc_attributes table entries.
2881 : *
2882 : * @param cls closure
2883 : * @param result the postgres result
2884 : * @param num_results the number of results in @a result
2885 : */
2886 : static void
2887 0 : lrbt_cb_table_kyc_attributes (void *cls,
2888 : PGresult *result,
2889 : unsigned int num_results)
2890 : {
2891 0 : struct LookupRecordsByTableContext *ctx = cls;
2892 0 : struct TALER_EXCHANGEDB_TableData td = {
2893 : .table = TALER_EXCHANGEDB_RT_KYC_ATTRIBUTES
2894 : };
2895 :
2896 0 : for (unsigned int i = 0; i<num_results; i++)
2897 : {
2898 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2899 0 : GNUNET_PQ_result_spec_uint64 (
2900 : "kyc_attributes_serial_id",
2901 : &td.serial),
2902 0 : GNUNET_PQ_result_spec_auto_from_type (
2903 : "h_payto",
2904 : &td.details.kyc_attributes.h_payto),
2905 0 : GNUNET_PQ_result_spec_uint64 (
2906 : "legitimization_serial",
2907 : &td.details.kyc_attributes.legitimization_serial),
2908 0 : GNUNET_PQ_result_spec_timestamp (
2909 : "collection_time",
2910 : &td.details.kyc_attributes.collection_time),
2911 0 : GNUNET_PQ_result_spec_timestamp (
2912 : "expiration_time",
2913 : &td.details.kyc_attributes.expiration_time),
2914 0 : GNUNET_PQ_result_spec_uint64 (
2915 : "trigger_outcome_serial",
2916 : &td.details.kyc_attributes.trigger_outcome_serial),
2917 0 : GNUNET_PQ_result_spec_variable_size (
2918 : "encrypted_attributes",
2919 : &td.details.kyc_attributes.encrypted_attributes,
2920 : &td.details.kyc_attributes.encrypted_attributes_size),
2921 : GNUNET_PQ_result_spec_end
2922 : };
2923 :
2924 0 : if (GNUNET_OK !=
2925 0 : GNUNET_PQ_extract_result (result,
2926 : rs,
2927 : i))
2928 : {
2929 0 : GNUNET_break (0);
2930 0 : ctx->error = true;
2931 0 : return;
2932 : }
2933 0 : ctx->cb (ctx->cb_cls,
2934 : &td);
2935 0 : GNUNET_PQ_cleanup_result (rs);
2936 : }
2937 : }
2938 :
2939 :
2940 : /**
2941 : * Function called with aml_history table entries.
2942 : *
2943 : * @param cls closure
2944 : * @param result the postgres result
2945 : * @param num_results the number of results in @a result
2946 : */
2947 : static void
2948 0 : lrbt_cb_table_aml_history (void *cls,
2949 : PGresult *result,
2950 : unsigned int num_results)
2951 : {
2952 0 : struct LookupRecordsByTableContext *ctx = cls;
2953 0 : struct TALER_EXCHANGEDB_TableData td = {
2954 : .table = TALER_EXCHANGEDB_RT_AML_HISTORY
2955 : };
2956 :
2957 0 : for (unsigned int i = 0; i<num_results; i++)
2958 : {
2959 0 : struct GNUNET_PQ_ResultSpec rs[] = {
2960 0 : GNUNET_PQ_result_spec_uint64 (
2961 : "aml_history_serial_id",
2962 : &td.serial),
2963 0 : GNUNET_PQ_result_spec_auto_from_type (
2964 : "h_payto",
2965 : &td.details.aml_history.h_payto),
2966 0 : GNUNET_PQ_result_spec_uint64 (
2967 : "outcome_serial_id",
2968 : &td.details.aml_history.outcome_serial_id),
2969 0 : GNUNET_PQ_result_spec_string (
2970 : "justification",
2971 : &td.details.aml_history.justification),
2972 0 : GNUNET_PQ_result_spec_auto_from_type (
2973 : "decider_pub",
2974 : &td.details.aml_history.decider_pub),
2975 0 : GNUNET_PQ_result_spec_auto_from_type (
2976 : "decider_sig",
2977 : &td.details.aml_history.decider_sig),
2978 : GNUNET_PQ_result_spec_end
2979 : };
2980 :
2981 0 : if (GNUNET_OK !=
2982 0 : GNUNET_PQ_extract_result (result,
2983 : rs,
2984 : i))
2985 : {
2986 0 : GNUNET_break (0);
2987 0 : ctx->error = true;
2988 0 : return;
2989 : }
2990 0 : ctx->cb (ctx->cb_cls,
2991 : &td);
2992 0 : GNUNET_PQ_cleanup_result (rs);
2993 : }
2994 : }
2995 :
2996 :
2997 : /**
2998 : * Function called with kyc_events table entries.
2999 : *
3000 : * @param cls closure
3001 : * @param result the postgres result
3002 : * @param num_results the number of results in @a result
3003 : */
3004 : static void
3005 0 : lrbt_cb_table_kyc_events (void *cls,
3006 : PGresult *result,
3007 : unsigned int num_results)
3008 : {
3009 0 : struct LookupRecordsByTableContext *ctx = cls;
3010 0 : struct TALER_EXCHANGEDB_TableData td = {
3011 : .table = TALER_EXCHANGEDB_RT_KYC_EVENTS
3012 : };
3013 :
3014 0 : for (unsigned int i = 0; i<num_results; i++)
3015 : {
3016 0 : struct GNUNET_PQ_ResultSpec rs[] = {
3017 0 : GNUNET_PQ_result_spec_uint64 (
3018 : "kyc_event_serial_id",
3019 : &td.serial),
3020 0 : GNUNET_PQ_result_spec_timestamp (
3021 : "event_timestamp",
3022 : &td.details.kyc_events.event_timestamp),
3023 0 : GNUNET_PQ_result_spec_string (
3024 : "event_type",
3025 : &td.details.kyc_events.event_type),
3026 : GNUNET_PQ_result_spec_end
3027 : };
3028 :
3029 0 : if (GNUNET_OK !=
3030 0 : GNUNET_PQ_extract_result (result,
3031 : rs,
3032 : i))
3033 : {
3034 0 : GNUNET_break (0);
3035 0 : ctx->error = true;
3036 0 : return;
3037 : }
3038 0 : ctx->cb (ctx->cb_cls,
3039 : &td);
3040 0 : GNUNET_PQ_cleanup_result (rs);
3041 : }
3042 : }
3043 :
3044 :
3045 : /**
3046 : * Assign statement to @a n and PREPARE
3047 : * @a sql under name @a n.
3048 : */
3049 : #define XPREPARE(n,sql) \
3050 : statement = n; \
3051 : PREPARE (pg, n, sql);
3052 :
3053 :
3054 : enum GNUNET_DB_QueryStatus
3055 0 : TEH_PG_lookup_records_by_table (void *cls,
3056 : enum TALER_EXCHANGEDB_ReplicatedTable table,
3057 : uint64_t serial,
3058 : TALER_EXCHANGEDB_ReplicationCallback cb,
3059 : void *cb_cls)
3060 : {
3061 0 : struct PostgresClosure *pg = cls;
3062 0 : struct GNUNET_PQ_QueryParam params[] = {
3063 0 : GNUNET_PQ_query_param_uint64 (&serial),
3064 : GNUNET_PQ_query_param_end
3065 : };
3066 0 : struct LookupRecordsByTableContext ctx = {
3067 : .pg = pg,
3068 : .cb = cb,
3069 : .cb_cls = cb_cls
3070 : };
3071 0 : GNUNET_PQ_PostgresResultHandler rh = NULL;
3072 0 : const char *statement = NULL;
3073 : enum GNUNET_DB_QueryStatus qs;
3074 :
3075 0 : switch (table)
3076 : {
3077 0 : case TALER_EXCHANGEDB_RT_DENOMINATIONS:
3078 0 : XPREPARE ("select_above_serial_by_table_denominations",
3079 : "SELECT"
3080 : " denominations_serial AS serial"
3081 : ",denom_type"
3082 : ",denom_pub"
3083 : ",master_sig"
3084 : ",valid_from"
3085 : ",expire_withdraw"
3086 : ",expire_deposit"
3087 : ",expire_legal"
3088 : ",coin"
3089 : ",fee_withdraw"
3090 : ",fee_deposit"
3091 : ",fee_refresh"
3092 : ",fee_refund"
3093 : ",age_mask"
3094 : " FROM denominations"
3095 : " WHERE denominations_serial > $1"
3096 : " ORDER BY denominations_serial ASC;");
3097 0 : rh = &lrbt_cb_table_denominations;
3098 0 : break;
3099 0 : case TALER_EXCHANGEDB_RT_DENOMINATION_REVOCATIONS:
3100 0 : XPREPARE ("select_above_serial_by_table_denomination_revocations",
3101 : "SELECT"
3102 : " denom_revocations_serial_id AS serial"
3103 : ",master_sig"
3104 : ",denominations_serial"
3105 : " FROM denomination_revocations"
3106 : " WHERE denom_revocations_serial_id > $1"
3107 : " ORDER BY denom_revocations_serial_id ASC;");
3108 0 : rh = &lrbt_cb_table_denomination_revocations;
3109 0 : break;
3110 0 : case TALER_EXCHANGEDB_RT_WIRE_TARGETS:
3111 0 : XPREPARE ("select_above_serial_by_table_wire_targets",
3112 : "SELECT"
3113 : " wire_target_serial_id AS serial"
3114 : ",payto_uri"
3115 : " FROM wire_targets"
3116 : " WHERE wire_target_serial_id > $1"
3117 : " ORDER BY wire_target_serial_id ASC;");
3118 0 : rh = &lrbt_cb_table_wire_targets;
3119 0 : break;
3120 0 : case TALER_EXCHANGEDB_RT_KYC_TARGETS:
3121 0 : XPREPARE ("select_above_serial_by_table_kyc_targets",
3122 : "SELECT"
3123 : " kyc_target_serial_id AS serial"
3124 : ",h_normalized_payto"
3125 : ",access_token"
3126 : ",target_pub"
3127 : ",is_wallet"
3128 : " FROM kyc_targets"
3129 : " WHERE kyc_target_serial_id > $1"
3130 : " ORDER BY kyc_target_serial_id ASC;");
3131 0 : rh = &lrbt_cb_table_kyc_targets;
3132 0 : break;
3133 0 : case TALER_EXCHANGEDB_RT_RESERVES:
3134 0 : XPREPARE ("select_above_serial_by_table_reserves",
3135 : "SELECT"
3136 : " reserve_uuid AS serial"
3137 : ",reserve_pub"
3138 : ",expiration_date"
3139 : ",gc_date"
3140 : " FROM reserves"
3141 : " WHERE reserve_uuid > $1"
3142 : " ORDER BY reserve_uuid ASC;");
3143 0 : rh = &lrbt_cb_table_reserves;
3144 0 : break;
3145 0 : case TALER_EXCHANGEDB_RT_RESERVES_IN:
3146 0 : XPREPARE ("select_above_serial_by_table_reserves_in",
3147 : "SELECT"
3148 : " reserve_in_serial_id AS serial"
3149 : ",reserve_pub"
3150 : ",wire_reference"
3151 : ",credit"
3152 : ",wire_source_h_payto"
3153 : ",exchange_account_section"
3154 : ",execution_date"
3155 : " FROM reserves_in"
3156 : " WHERE reserve_in_serial_id > $1"
3157 : " ORDER BY reserve_in_serial_id ASC;");
3158 0 : rh = &lrbt_cb_table_reserves_in;
3159 0 : break;
3160 0 : case TALER_EXCHANGEDB_RT_KYCAUTHS_IN:
3161 0 : XPREPARE ("select_above_serial_by_table_kycauth_in",
3162 : "SELECT"
3163 : " kycauth_in_serial_id AS serial"
3164 : ",account_pub"
3165 : ",wire_reference"
3166 : ",credit"
3167 : ",wire_source_h_payto"
3168 : ",exchange_account_section"
3169 : ",execution_date"
3170 : " FROM kycauths_in"
3171 : " WHERE kycauth_in_serial_id > $1"
3172 : " ORDER BY kycauth_in_serial_id ASC;");
3173 0 : rh = &lrbt_cb_table_kycauth_in;
3174 0 : break;
3175 0 : case TALER_EXCHANGEDB_RT_RESERVES_CLOSE:
3176 0 : XPREPARE ("select_above_serial_by_table_reserves_close",
3177 : "SELECT"
3178 : " close_uuid AS serial"
3179 : ",reserve_pub"
3180 : ",execution_date"
3181 : ",wtid"
3182 : ",wire_target_h_payto"
3183 : ",amount"
3184 : ",closing_fee"
3185 : " FROM reserves_close"
3186 : " WHERE close_uuid > $1"
3187 : " ORDER BY close_uuid ASC;");
3188 0 : rh = &lrbt_cb_table_reserves_close;
3189 0 : break;
3190 0 : case TALER_EXCHANGEDB_RT_RESERVES_OPEN_REQUESTS:
3191 0 : XPREPARE ("select_above_serial_by_table_reserves_open_requests",
3192 : "SELECT"
3193 : " open_request_uuid AS serial"
3194 : ",reserve_pub"
3195 : ",request_timestamp"
3196 : ",expiration_date"
3197 : ",reserve_sig"
3198 : ",reserve_payment"
3199 : ",requested_purse_limit"
3200 : " FROM reserves_open_requests"
3201 : " WHERE open_request_uuid > $1"
3202 : " ORDER BY open_request_uuid ASC;");
3203 0 : rh = &lrbt_cb_table_reserves_open_requests;
3204 0 : break;
3205 0 : case TALER_EXCHANGEDB_RT_RESERVES_OPEN_DEPOSITS:
3206 0 : XPREPARE ("select_above_serial_by_table_reserves_open_deposits",
3207 : "SELECT"
3208 : " reserves_open_deposit_uuid AS serial"
3209 : ",reserve_sig"
3210 : ",reserve_pub"
3211 : ",coin_pub"
3212 : ",coin_sig"
3213 : ",contribution"
3214 : " FROM reserves_open_deposits"
3215 : " WHERE reserves_open_deposit_uuid > $1"
3216 : " ORDER BY reserves_open_deposit_uuid ASC;");
3217 0 : rh = &lrbt_cb_table_reserves_open_deposits;
3218 0 : break;
3219 0 : case TALER_EXCHANGEDB_RT_AUDITORS:
3220 0 : XPREPARE ("select_above_serial_by_table_auditors",
3221 : "SELECT"
3222 : " auditor_uuid AS serial"
3223 : ",auditor_pub"
3224 : ",auditor_name"
3225 : ",auditor_url"
3226 : ",is_active"
3227 : ",last_change"
3228 : " FROM auditors"
3229 : " WHERE auditor_uuid > $1"
3230 : " ORDER BY auditor_uuid ASC;");
3231 0 : rh = &lrbt_cb_table_auditors;
3232 0 : break;
3233 0 : case TALER_EXCHANGEDB_RT_AUDITOR_DENOM_SIGS:
3234 0 : XPREPARE ("select_above_serial_by_table_auditor_denom_sigs",
3235 : "SELECT"
3236 : " auditor_denom_serial AS serial"
3237 : ",auditor_uuid"
3238 : ",denominations_serial"
3239 : ",auditor_sig"
3240 : " FROM auditor_denom_sigs"
3241 : " WHERE auditor_denom_serial > $1"
3242 : " ORDER BY auditor_denom_serial ASC;");
3243 0 : rh = &lrbt_cb_table_auditor_denom_sigs;
3244 0 : break;
3245 0 : case TALER_EXCHANGEDB_RT_EXCHANGE_SIGN_KEYS:
3246 0 : XPREPARE ("select_above_serial_by_table_exchange_sign_keys",
3247 : "SELECT"
3248 : " esk_serial AS serial"
3249 : ",exchange_pub"
3250 : ",master_sig"
3251 : ",valid_from"
3252 : ",expire_sign"
3253 : ",expire_legal"
3254 : " FROM exchange_sign_keys"
3255 : " WHERE esk_serial > $1"
3256 : " ORDER BY esk_serial ASC;");
3257 0 : rh = &lrbt_cb_table_exchange_sign_keys;
3258 0 : break;
3259 0 : case TALER_EXCHANGEDB_RT_SIGNKEY_REVOCATIONS:
3260 0 : XPREPARE ("select_above_serial_by_table_signkey_revocations",
3261 : "SELECT"
3262 : " signkey_revocations_serial_id AS serial"
3263 : ",esk_serial"
3264 : ",master_sig"
3265 : " FROM signkey_revocations"
3266 : " WHERE signkey_revocations_serial_id > $1"
3267 : " ORDER BY signkey_revocations_serial_id ASC;");
3268 0 : rh = &lrbt_cb_table_signkey_revocations;
3269 0 : break;
3270 0 : case TALER_EXCHANGEDB_RT_KNOWN_COINS:
3271 0 : XPREPARE ("select_above_serial_by_table_known_coins",
3272 : "SELECT"
3273 : " known_coin_id AS serial"
3274 : ",coin_pub"
3275 : ",denom_sig"
3276 : ",denominations_serial"
3277 : " FROM known_coins"
3278 : " WHERE known_coin_id > $1"
3279 : " ORDER BY known_coin_id ASC;");
3280 0 : rh = &lrbt_cb_table_known_coins;
3281 0 : break;
3282 0 : case TALER_EXCHANGEDB_RT_REFRESH:
3283 0 : XPREPARE ("select_above_serial_by_table_refresh",
3284 : "SELECT"
3285 : " refresh_id AS serial"
3286 : ",rc"
3287 : ",execution_date"
3288 : ",amount_with_fee"
3289 : ",old_coin_pub"
3290 : ",old_coin_sig"
3291 : ",refresh_seed"
3292 : ",noreveal_index"
3293 : ",planchets_h"
3294 : ",selected_h"
3295 : ",blinding_seed"
3296 : ",cs_r_values"
3297 : ",cs_r_choices"
3298 : ",denom_serials"
3299 : ",denom_sigs"
3300 : " FROM refresh"
3301 : " WHERE refresh_id > $1"
3302 : " ORDER BY refresh_id ASC;");
3303 0 : rh = &lrbt_cb_table_refresh;
3304 0 : break;
3305 0 : case TALER_EXCHANGEDB_RT_BATCH_DEPOSITS:
3306 0 : XPREPARE ("select_above_serial_by_table_batch_deposits",
3307 : "SELECT"
3308 : " batch_deposit_serial_id AS serial"
3309 : ",shard"
3310 : ",merchant_pub"
3311 : ",wallet_timestamp"
3312 : ",exchange_timestamp"
3313 : ",refund_deadline"
3314 : ",wire_deadline"
3315 : ",h_contract_terms"
3316 : ",wallet_data_hash"
3317 : ",wire_salt"
3318 : ",wire_target_h_payto"
3319 : ",policy_details_serial_id"
3320 : ",policy_blocked"
3321 : ",total_amount"
3322 : ",total_without_fee"
3323 : ",merchant_sig"
3324 : ",done"
3325 : " FROM batch_deposits"
3326 : " WHERE batch_deposit_serial_id > $1"
3327 : " ORDER BY batch_deposit_serial_id ASC;");
3328 0 : rh = &lrbt_cb_table_batch_deposits;
3329 0 : break;
3330 0 : case TALER_EXCHANGEDB_RT_COIN_DEPOSITS:
3331 0 : XPREPARE ("select_above_serial_by_table_coin_deposits",
3332 : "SELECT"
3333 : " coin_deposit_serial_id AS serial"
3334 : ",batch_deposit_serial_id"
3335 : ",coin_pub"
3336 : ",coin_sig"
3337 : ",amount_with_fee"
3338 : " FROM coin_deposits"
3339 : " WHERE coin_deposit_serial_id > $1"
3340 : " ORDER BY coin_deposit_serial_id ASC;");
3341 0 : rh = &lrbt_cb_table_coin_deposits;
3342 0 : break;
3343 0 : case TALER_EXCHANGEDB_RT_REFUNDS:
3344 0 : XPREPARE ("select_above_serial_by_table_refunds",
3345 : "SELECT"
3346 : " refund_serial_id AS serial"
3347 : ",coin_pub"
3348 : ",merchant_sig"
3349 : ",rtransaction_id"
3350 : ",amount_with_fee"
3351 : ",batch_deposit_serial_id"
3352 : " FROM refunds"
3353 : " WHERE refund_serial_id > $1"
3354 : " ORDER BY refund_serial_id ASC;");
3355 0 : rh = &lrbt_cb_table_refunds;
3356 0 : break;
3357 0 : case TALER_EXCHANGEDB_RT_WIRE_OUT:
3358 0 : XPREPARE ("select_above_serial_by_table_wire_out",
3359 : "SELECT"
3360 : " wireout_uuid AS serial"
3361 : ",execution_date"
3362 : ",wtid_raw"
3363 : ",wire_target_h_payto"
3364 : ",exchange_account_section"
3365 : ",amount"
3366 : " FROM wire_out"
3367 : " WHERE wireout_uuid > $1"
3368 : " ORDER BY wireout_uuid ASC;");
3369 0 : rh = &lrbt_cb_table_wire_out;
3370 0 : break;
3371 0 : case TALER_EXCHANGEDB_RT_AGGREGATION_TRACKING:
3372 0 : XPREPARE ("select_above_serial_by_table_aggregation_tracking",
3373 : "SELECT"
3374 : " aggregation_serial_id AS serial"
3375 : ",batch_deposit_serial_id"
3376 : ",wtid_raw"
3377 : " FROM aggregation_tracking"
3378 : " WHERE aggregation_serial_id > $1"
3379 : " ORDER BY aggregation_serial_id ASC;");
3380 0 : rh = &lrbt_cb_table_aggregation_tracking;
3381 0 : break;
3382 0 : case TALER_EXCHANGEDB_RT_WIRE_FEE:
3383 0 : XPREPARE ("select_above_serial_by_table_wire_fee",
3384 : "SELECT"
3385 : " wire_fee_serial AS serial"
3386 : ",wire_method"
3387 : ",start_date"
3388 : ",end_date"
3389 : ",wire_fee"
3390 : ",closing_fee"
3391 : ",master_sig"
3392 : " FROM wire_fee"
3393 : " WHERE wire_fee_serial > $1"
3394 : " ORDER BY wire_fee_serial ASC;");
3395 0 : rh = &lrbt_cb_table_wire_fee;
3396 0 : break;
3397 0 : case TALER_EXCHANGEDB_RT_GLOBAL_FEE:
3398 0 : XPREPARE ("select_above_serial_by_table_global_fee",
3399 : "SELECT"
3400 : " global_fee_serial AS serial"
3401 : ",start_date"
3402 : ",end_date"
3403 : ",history_fee"
3404 : ",account_fee"
3405 : ",purse_fee"
3406 : ",purse_timeout"
3407 : ",history_expiration"
3408 : ",purse_account_limit"
3409 : ",master_sig"
3410 : " FROM global_fee"
3411 : " WHERE global_fee_serial > $1"
3412 : " ORDER BY global_fee_serial ASC;");
3413 0 : rh = &lrbt_cb_table_global_fee;
3414 0 : break;
3415 0 : case TALER_EXCHANGEDB_RT_RECOUP:
3416 0 : XPREPARE ("select_above_serial_by_table_recoup",
3417 : "SELECT"
3418 : " recoup_uuid AS serial"
3419 : ",coin_sig"
3420 : ",coin_blind"
3421 : ",amount"
3422 : ",recoup_timestamp"
3423 : ",coin_pub"
3424 : ",reserve_out_serial_id"
3425 : " FROM recoup"
3426 : " WHERE recoup_uuid > $1"
3427 : " ORDER BY recoup_uuid ASC;");
3428 0 : rh = &lrbt_cb_table_recoup;
3429 0 : break;
3430 0 : case TALER_EXCHANGEDB_RT_RECOUP_REFRESH:
3431 0 : XPREPARE ("select_above_serial_by_table_recoup_refresh",
3432 : "SELECT"
3433 : " recoup_refresh_uuid AS serial"
3434 : ",coin_sig"
3435 : ",coin_blind"
3436 : ",amount"
3437 : ",recoup_timestamp"
3438 : ",coin_pub"
3439 : ",known_coin_id"
3440 : ",rrc_serial"
3441 : " FROM recoup_refresh"
3442 : " WHERE recoup_refresh_uuid > $1"
3443 : " ORDER BY recoup_refresh_uuid ASC;");
3444 0 : rh = &lrbt_cb_table_recoup_refresh;
3445 0 : break;
3446 0 : case TALER_EXCHANGEDB_RT_EXTENSIONS:
3447 : // FIXME: this seems broken! -- where is the SQL!?
3448 0 : statement = "select_above_serial_by_table_extensions";
3449 0 : rh = &lrbt_cb_table_extensions;
3450 0 : break;
3451 0 : case TALER_EXCHANGEDB_RT_POLICY_DETAILS:
3452 : // FIXME: this seems broken! -- where is the SQL!?
3453 0 : statement = "select_above_serial_by_table_policy_details";
3454 0 : rh = &lrbt_cb_table_policy_details;
3455 0 : break;
3456 0 : case TALER_EXCHANGEDB_RT_POLICY_FULFILLMENTS:
3457 : // FIXME: this seems broken! -- where is the SQL!?
3458 0 : statement = "select_above_serial_by_table_policy_fulfillments";
3459 0 : rh = &lrbt_cb_table_policy_fulfillments;
3460 0 : break;
3461 0 : case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
3462 0 : XPREPARE ("select_above_serial_by_table_purse_requests",
3463 : "SELECT"
3464 : " purse_requests_serial_id"
3465 : ",purse_pub"
3466 : ",merge_pub"
3467 : ",purse_creation"
3468 : ",purse_expiration"
3469 : ",h_contract_terms"
3470 : ",age_limit"
3471 : ",flags"
3472 : ",amount_with_fee"
3473 : ",purse_fee"
3474 : ",purse_sig"
3475 : " FROM purse_requests"
3476 : " WHERE purse_requests_serial_id > $1"
3477 : " ORDER BY purse_requests_serial_id ASC;");
3478 0 : rh = &lrbt_cb_table_purse_requests;
3479 0 : break;
3480 0 : case TALER_EXCHANGEDB_RT_PURSE_DECISION:
3481 0 : XPREPARE ("select_above_serial_by_table_purse_decision",
3482 : "SELECT"
3483 : " purse_decision_serial_id"
3484 : ",action_timestamp"
3485 : ",refunded"
3486 : ",purse_pub"
3487 : " FROM purse_decision"
3488 : " WHERE purse_decision_serial_id > $1"
3489 : " ORDER BY purse_decision_serial_id ASC;");
3490 0 : rh = &lrbt_cb_table_purse_decision;
3491 0 : break;
3492 0 : case TALER_EXCHANGEDB_RT_PURSE_MERGES:
3493 0 : XPREPARE ("select_above_serial_by_table_purse_merges",
3494 : "SELECT"
3495 : " purse_merge_request_serial_id"
3496 : ",partner_serial_id"
3497 : ",reserve_pub"
3498 : ",purse_pub"
3499 : ",merge_sig"
3500 : ",merge_timestamp"
3501 : " FROM purse_merges"
3502 : " WHERE purse_merge_request_serial_id > $1"
3503 : " ORDER BY purse_merge_request_serial_id ASC;");
3504 0 : rh = &lrbt_cb_table_purse_merges;
3505 0 : break;
3506 0 : case TALER_EXCHANGEDB_RT_PURSE_DEPOSITS:
3507 0 : XPREPARE ("select_above_serial_by_table_purse_deposits",
3508 : "SELECT"
3509 : " purse_deposit_serial_id"
3510 : ",partner_serial_id"
3511 : ",purse_pub"
3512 : ",coin_pub"
3513 : ",amount_with_fee"
3514 : ",coin_sig"
3515 : " FROM purse_deposits"
3516 : " WHERE purse_deposit_serial_id > $1"
3517 : " ORDER BY purse_deposit_serial_id ASC;");
3518 0 : rh = &lrbt_cb_table_purse_deposits;
3519 0 : break;
3520 0 : case TALER_EXCHANGEDB_RT_ACCOUNT_MERGES:
3521 0 : XPREPARE ("select_above_serial_by_table_account_merges",
3522 : "SELECT"
3523 : " account_merge_request_serial_id"
3524 : ",reserve_pub"
3525 : ",reserve_sig"
3526 : ",purse_pub"
3527 : ",wallet_h_payto"
3528 : " FROM account_merges"
3529 : " WHERE account_merge_request_serial_id > $1"
3530 : " ORDER BY account_merge_request_serial_id ASC;");
3531 0 : rh = &lrbt_cb_table_account_merges;
3532 0 : break;
3533 0 : case TALER_EXCHANGEDB_RT_HISTORY_REQUESTS:
3534 0 : XPREPARE ("select_above_serial_by_table_history_requests",
3535 : "SELECT"
3536 : " history_request_serial_id"
3537 : ",reserve_pub"
3538 : ",request_timestamp"
3539 : ",reserve_sig"
3540 : ",history_fee"
3541 : " FROM history_requests"
3542 : " WHERE history_request_serial_id > $1"
3543 : " ORDER BY history_request_serial_id ASC;");
3544 0 : rh = &lrbt_cb_table_history_requests;
3545 0 : break;
3546 0 : case TALER_EXCHANGEDB_RT_CLOSE_REQUESTS:
3547 0 : XPREPARE ("select_above_serial_by_table_close_requests",
3548 : "SELECT"
3549 : " close_request_serial_id"
3550 : ",reserve_pub"
3551 : ",close_timestamp"
3552 : ",reserve_sig"
3553 : ",close"
3554 : " FROM close_requests"
3555 : " WHERE close_request_serial_id > $1"
3556 : " ORDER BY close_request_serial_id ASC;");
3557 0 : rh = &lrbt_cb_table_close_requests;
3558 0 : break;
3559 0 : case TALER_EXCHANGEDB_RT_WADS_OUT:
3560 0 : XPREPARE ("select_above_serial_by_table_wads_out",
3561 : "SELECT"
3562 : " wad_out_serial_id"
3563 : ",wad_id"
3564 : ",partner_serial_id"
3565 : ",amount"
3566 : ",execution_time"
3567 : " FROM wads_out"
3568 : " WHERE wad_out_serial_id > $1"
3569 : " ORDER BY wad_out_serial_id ASC;");
3570 0 : rh = &lrbt_cb_table_wads_out;
3571 0 : break;
3572 0 : case TALER_EXCHANGEDB_RT_WADS_OUT_ENTRIES:
3573 0 : XPREPARE ("select_above_serial_by_table_wads_out_entries",
3574 : "SELECT"
3575 : " wad_out_entry_serial_id"
3576 : ",reserve_pub"
3577 : ",purse_pub"
3578 : ",h_contract"
3579 : ",purse_expiration"
3580 : ",merge_timestamp"
3581 : ",amount_with_fee"
3582 : ",wad_fee"
3583 : ",deposit_fees"
3584 : ",reserve_sig"
3585 : ",purse_sig"
3586 : " FROM wad_out_entries"
3587 : " WHERE wad_out_entry_serial_id > $1"
3588 : " ORDER BY wad_out_entry_serial_id ASC;");
3589 0 : rh = &lrbt_cb_table_wads_out_entries;
3590 0 : break;
3591 0 : case TALER_EXCHANGEDB_RT_WADS_IN:
3592 0 : XPREPARE ("select_above_serial_by_table_wads_in",
3593 : "SELECT"
3594 : " wad_in_serial_id"
3595 : ",wad_id"
3596 : ",origin_exchange_url"
3597 : ",amount"
3598 : ",arrival_time"
3599 : " FROM wads_in"
3600 : " WHERE wad_in_serial_id > $1"
3601 : " ORDER BY wad_in_serial_id ASC;");
3602 0 : rh = &lrbt_cb_table_wads_in;
3603 0 : break;
3604 0 : case TALER_EXCHANGEDB_RT_WADS_IN_ENTRIES:
3605 0 : XPREPARE ("select_above_serial_by_table_wads_in_entries",
3606 : "SELECT"
3607 : " wad_in_entry_serial_id"
3608 : ",reserve_pub"
3609 : ",purse_pub"
3610 : ",h_contract"
3611 : ",purse_expiration"
3612 : ",merge_timestamp"
3613 : ",amount_with_fee"
3614 : ",wad_fee"
3615 : ",deposit_fees"
3616 : ",reserve_sig"
3617 : ",purse_sig"
3618 : " FROM wad_in_entries"
3619 : " WHERE wad_in_entry_serial_id > $1"
3620 : " ORDER BY wad_in_entry_serial_id ASC;");
3621 0 : rh = &lrbt_cb_table_wads_in_entries;
3622 0 : break;
3623 0 : case TALER_EXCHANGEDB_RT_PROFIT_DRAINS:
3624 0 : XPREPARE ("select_above_serial_by_table_profit_drains",
3625 : "SELECT"
3626 : " profit_drain_serial_id"
3627 : ",wtid"
3628 : ",account_section"
3629 : ",payto_uri"
3630 : ",trigger_date"
3631 : ",amount"
3632 : ",master_sig"
3633 : " FROM profit_drains"
3634 : " WHERE profit_drain_serial_id > $1"
3635 : " ORDER BY profit_drain_serial_id ASC;");
3636 0 : rh = &lrbt_cb_table_profit_drains;
3637 0 : break;
3638 :
3639 0 : case TALER_EXCHANGEDB_RT_AML_STAFF:
3640 0 : XPREPARE ("select_above_serial_by_table_aml_staff",
3641 : "SELECT"
3642 : " aml_staff_uuid"
3643 : ",decider_pub"
3644 : ",master_sig"
3645 : ",decider_name"
3646 : ",is_active"
3647 : ",read_only"
3648 : ",last_change"
3649 : " FROM aml_staff"
3650 : " WHERE aml_staff_uuid > $1"
3651 : " ORDER BY aml_staff_uuid ASC;");
3652 0 : rh = &lrbt_cb_table_aml_staff;
3653 0 : break;
3654 0 : case TALER_EXCHANGEDB_RT_PURSE_DELETION:
3655 0 : XPREPARE ("select_above_serial_by_table_purse_deletion",
3656 : "SELECT"
3657 : " purse_deletion_serial_id"
3658 : ",purse_pub"
3659 : ",purse_sig"
3660 : " FROM purse_deletion"
3661 : " WHERE purse_deletion_serial_id > $1"
3662 : " ORDER BY purse_deletion_serial_id ASC;");
3663 0 : rh = &lrbt_cb_table_purse_deletion;
3664 0 : break;
3665 0 : case TALER_EXCHANGEDB_RT_WITHDRAW:
3666 0 : XPREPARE ("select_above_serial_by_table_withdraw",
3667 : "SELECT"
3668 : " withdraw_id"
3669 : ",planchets_h"
3670 : ",execution_date"
3671 : ",amount_with_fee"
3672 : ",reserve_pub"
3673 : ",reserve_sig"
3674 : ",max_age"
3675 : ",noreveal_index"
3676 : ",selected_h"
3677 : ",blinding_seed"
3678 : ",cs_r_values"
3679 : ",cs_r_choices"
3680 : ",denom_serials"
3681 : ",denom_sigs"
3682 : " FROM withdraw"
3683 : " WHERE withdraw_id > $1"
3684 : " ORDER BY withdraw_id ASC;");
3685 0 : rh = &lrbt_cb_table_withdraw;
3686 0 : break;
3687 0 : case TALER_EXCHANGEDB_RT_LEGITIMIZATION_MEASURES:
3688 0 : XPREPARE ("select_above_serial_by_table_legitimization_measures",
3689 : "SELECT"
3690 : " legitimization_measure_serial_id AS serial"
3691 : ",access_token"
3692 : ",start_time"
3693 : ",jmeasures::TEXT"
3694 : ",display_priority"
3695 : " FROM legitimization_measures"
3696 : " WHERE legitimization_measure_serial_id > $1"
3697 : " ORDER BY legitimization_measure_serial_id ASC;");
3698 0 : rh = &lrbt_cb_table_legitimization_measures;
3699 0 : break;
3700 0 : case TALER_EXCHANGEDB_RT_LEGITIMIZATION_OUTCOMES:
3701 0 : XPREPARE ("select_above_serial_by_table_legitimization_outcomes",
3702 : "SELECT"
3703 : " outcome_serial_id AS serial"
3704 : ",h_payto"
3705 : ",decision_time"
3706 : ",expiration_time"
3707 : ",jproperties::TEXT"
3708 : ",to_investigate"
3709 : ",jnew_rules::TEXT"
3710 : " FROM legitimization_outcomes"
3711 : " WHERE outcome_serial_id > $1"
3712 : " ORDER BY outcome_serial_id ASC;");
3713 0 : rh = &lrbt_cb_table_legitimization_outcomes;
3714 0 : break;
3715 0 : case TALER_EXCHANGEDB_RT_LEGITIMIZATION_PROCESSES:
3716 0 : XPREPARE ("select_above_serial_by_table_legitimization_processes",
3717 : "SELECT"
3718 : " legitimization_process_serial_id AS serial"
3719 : ",h_payto"
3720 : ",start_time"
3721 : ",expiration_time"
3722 : ",legitimization_measure_serial_id"
3723 : ",measure_index"
3724 : ",provider_name"
3725 : ",provider_user_id"
3726 : ",provider_legitimization_id"
3727 : ",redirect_url"
3728 : " FROM legitimization_processes"
3729 : " WHERE legitimization_process_serial_id > $1"
3730 : " ORDER BY legitimization_process_serial_id ASC;");
3731 0 : rh = &lrbt_cb_table_legitimization_processes;
3732 0 : break;
3733 0 : case TALER_EXCHANGEDB_RT_KYC_ATTRIBUTES:
3734 0 : XPREPARE ("select_above_serial_by_table_kyc_attributes",
3735 : "SELECT"
3736 : " kyc_attributes_serial_id"
3737 : ",h_payto"
3738 : ",legitimization_serial"
3739 : ",collection_time"
3740 : ",expiration_time"
3741 : ",trigger_outcome_serial"
3742 : ",encrypted_attributes"
3743 : " FROM kyc_attributes"
3744 : " WHERE kyc_attributes_serial_id > $1"
3745 : " ORDER BY kyc_attributes_serial_id ASC;");
3746 0 : rh = &lrbt_cb_table_kyc_attributes;
3747 0 : break;
3748 0 : case TALER_EXCHANGEDB_RT_AML_HISTORY:
3749 0 : XPREPARE ("select_above_serial_by_table_aml_history",
3750 : "SELECT"
3751 : " aml_history_serial_id"
3752 : ",h_payto"
3753 : ",outcome_serial_id"
3754 : ",justification"
3755 : ",decider_pub"
3756 : ",decider_sig"
3757 : " FROM aml_history"
3758 : " WHERE aml_history_serial_id > $1"
3759 : " ORDER BY aml_history_serial_id ASC;");
3760 0 : rh = &lrbt_cb_table_aml_history;
3761 0 : break;
3762 0 : case TALER_EXCHANGEDB_RT_KYC_EVENTS:
3763 0 : XPREPARE ("select_above_serial_by_table_kyc_events",
3764 : "SELECT"
3765 : " kyc_event_serial_id AS serial"
3766 : ",event_timestamp"
3767 : ",event_type"
3768 : " FROM kyc_events"
3769 : " WHERE kyc_event_serial_id > $1"
3770 : " ORDER BY kyc_event_serial_id ASC;");
3771 0 : rh = &lrbt_cb_table_kyc_events;
3772 0 : break;
3773 : }
3774 0 : if (NULL == rh)
3775 : {
3776 0 : GNUNET_break (0);
3777 0 : return GNUNET_DB_STATUS_HARD_ERROR;
3778 : }
3779 :
3780 0 : qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn,
3781 : statement,
3782 : params,
3783 : rh,
3784 : &ctx);
3785 0 : if (qs < 0)
3786 : {
3787 0 : GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
3788 : "Failed to run `%s'\n",
3789 : statement);
3790 0 : return qs;
3791 : }
3792 0 : if (ctx.error)
3793 : {
3794 0 : GNUNET_break (0);
3795 0 : return GNUNET_DB_STATUS_HARD_ERROR;
3796 : }
3797 0 : return qs;
3798 : }
3799 :
3800 :
3801 : #undef XPREPARE
3802 :
3803 : /* end of pg_lookup_records_by_table.c */
|