diff options
Diffstat (limited to 'src/auditordb/pg_get_deposit_confirmations.c')
-rw-r--r-- | src/auditordb/pg_get_deposit_confirmations.c | 70 |
1 files changed, 42 insertions, 28 deletions
diff --git a/src/auditordb/pg_get_deposit_confirmations.c b/src/auditordb/pg_get_deposit_confirmations.c index 3f0bd1e2f..b8055a296 100644 --- a/src/auditordb/pg_get_deposit_confirmations.c +++ b/src/auditordb/pg_get_deposit_confirmations.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2022 Taler Systems SA + Copyright (C) 2022-2023 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -33,11 +33,6 @@ struct DepositConfirmationContext { /** - * Master public key that is being used. - */ - const struct TALER_MasterPublicKeyP *master_pub; - - /** * Function to call for each deposit confirmation. */ TALER_AUDITORDB_DepositConfirmationCallback cb; @@ -79,9 +74,11 @@ deposit_confirmation_cb (void *cls, for (unsigned int i = 0; i < num_results; i++) { uint64_t serial_id; - struct TALER_AUDITORDB_DepositConfirmation dc = { - .master_public_key = *dcc->master_pub - }; + struct TALER_AUDITORDB_DepositConfirmation dc = { 0}; + struct TALER_CoinSpendPublicKeyP *coin_pubs = NULL; + struct TALER_CoinSpendSignatureP *coin_sigs = NULL; + size_t num_pubs = 0; + size_t num_sigs = 0; struct GNUNET_PQ_ResultSpec rs[] = { GNUNET_PQ_result_spec_uint64 ("serial_id", &serial_id), @@ -97,10 +94,16 @@ deposit_confirmation_cb (void *cls, &dc.refund_deadline), GNUNET_PQ_result_spec_timestamp ("wire_deadline", &dc.wire_deadline), - TALER_PQ_RESULT_SPEC_AMOUNT ("amount_without_fee", - &dc.amount_without_fee), - GNUNET_PQ_result_spec_auto_from_type ("coin_pub", - &dc.coin_pub), + TALER_PQ_RESULT_SPEC_AMOUNT ("total_without_fee", + &dc.total_without_fee), + GNUNET_PQ_result_spec_auto_array_from_type (pg->conn, + "coin_pubs", + &num_pubs, + coin_pubs), + GNUNET_PQ_result_spec_auto_array_from_type (pg->conn, + "coin_sigs", + &num_sigs, + coin_sigs), GNUNET_PQ_result_spec_auto_from_type ("merchant_pub", &dc.merchant), GNUNET_PQ_result_spec_auto_from_type ("exchange_sig", @@ -111,6 +114,7 @@ deposit_confirmation_cb (void *cls, &dc.master_sig), GNUNET_PQ_result_spec_end }; + enum GNUNET_GenericReturnValue rval; if (GNUNET_OK != GNUNET_PQ_extract_result (result, @@ -121,11 +125,22 @@ deposit_confirmation_cb (void *cls, dcc->qs = GNUNET_DB_STATUS_HARD_ERROR; return; } + if (num_sigs != num_pubs) + { + GNUNET_break (0); + dcc->qs = GNUNET_DB_STATUS_HARD_ERROR; + GNUNET_PQ_cleanup_result (rs); + return; + } dcc->qs = i + 1; - if (GNUNET_OK != - dcc->cb (dcc->cb_cls, - serial_id, - &dc)) + dc.coin_pubs = coin_pubs; + dc.coin_sigs = coin_sigs; + dc.num_coins = num_sigs; + rval = dcc->cb (dcc->cb_cls, + serial_id, + &dc); + GNUNET_PQ_cleanup_result (rs); + if (GNUNET_OK != rval) break; } } @@ -134,19 +149,18 @@ deposit_confirmation_cb (void *cls, enum GNUNET_DB_QueryStatus TAH_PG_get_deposit_confirmations ( void *cls, - const struct TALER_MasterPublicKeyP *master_public_key, uint64_t start_id, + bool return_suppressed, TALER_AUDITORDB_DepositConfirmationCallback cb, void *cb_cls) { struct PostgresClosure *pg = cls; struct GNUNET_PQ_QueryParam params[] = { - GNUNET_PQ_query_param_auto_from_type (master_public_key), GNUNET_PQ_query_param_uint64 (&start_id), + GNUNET_PQ_query_param_bool (return_suppressed), GNUNET_PQ_query_param_end }; struct DepositConfirmationContext dcc = { - .master_pub = master_public_key, .cb = cb, .cb_cls = cb_cls, .pg = pg @@ -156,23 +170,23 @@ TAH_PG_get_deposit_confirmations ( PREPARE (pg, "auditor_deposit_confirmation_select", "SELECT" - " serial_id" + " deposit_confirmation_serial_id" ",h_contract_terms" ",h_policy" ",h_wire" ",exchange_timestamp" ",wire_deadline" ",refund_deadline" - ",amount_without_fee_val" - ",amount_without_fee_frac" - ",coin_pub" + ",total_without_fee" + ",coin_pubs" + ",coin_sigs" ",merchant_pub" ",exchange_sig" ",exchange_pub" - ",master_sig" /* master_sig could be normalized... */ - " FROM deposit_confirmations" - " WHERE master_pub=$1" - " AND serial_id>$2"); + ",master_sig" + " FROM auditor_deposit_confirmations" + " WHERE deposit_confirmation_serial_id>$1" + " AND ($2 OR NOT suppressed);"); qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, "auditor_deposit_confirmation_select", params, |