diff options
Diffstat (limited to 'src/exchangedb/pg_select_refunds_by_coin.c')
-rw-r--r-- | src/exchangedb/pg_select_refunds_by_coin.c | 210 |
1 files changed, 17 insertions, 193 deletions
diff --git a/src/exchangedb/pg_select_refunds_by_coin.c b/src/exchangedb/pg_select_refunds_by_coin.c index 44a505791..d9cd6dd3c 100644 --- a/src/exchangedb/pg_select_refunds_by_coin.c +++ b/src/exchangedb/pg_select_refunds_by_coin.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 @@ -49,7 +49,7 @@ struct SelectRefundContext /** * Set to #GNUNET_SYSERR on error. */ - int status; + enum GNUNET_GenericReturnValue status; }; @@ -112,205 +112,29 @@ TEH_PG_select_refunds_by_coin ( GNUNET_PQ_query_param_auto_from_type (h_contract), GNUNET_PQ_query_param_end }; - struct GNUNET_PQ_QueryParam params5[] = { - GNUNET_PQ_query_param_auto_from_type (coin_pub), - GNUNET_PQ_query_param_end - }; - struct SelectRefundContext srctx = { .cb = cb, .cb_cls = cb_cls, .pg = pg, .status = GNUNET_OK }; - static int percent_refund = -2; - const char *query; - struct GNUNET_PQ_QueryParam *xparams = params; - - if (-2 == percent_refund) - { - const char *mode = getenv ("TALER_POSTGRES_SELECT_REFUNDS_BY_COIN_LOGIC"); - char dummy; - - if ( (NULL==mode) || - (1 != sscanf (mode, - "%d%c", - &percent_refund, - &dummy)) ) - { - if (NULL != mode) - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Bad mode `%s' specified\n", - mode); - percent_refund = 0; - } - } - - switch (percent_refund) - { - case 0: - query = "get_refunds_by_coin_and_contract-v0"; - PREPARE (pg, - query, - "SELECT" - " ref.amount_with_fee" - " FROM refunds ref" - " JOIN deposits dep" - " USING (coin_pub,deposit_serial_id)" - " WHERE ref.coin_pub=$1" - " AND dep.merchant_pub=$2" - " AND dep.h_contract_terms=$3;"); - break; - case 1: - query = "get_refunds_by_coin_and_contract-v1"; - PREPARE (pg, - query, - "SELECT" - " ref.amount_with_fee" - " FROM refunds ref" - " LEFT JOIN deposits dep" - " ON dep.coin_pub = ref.coin_pub" - " AND ref.deposit_serial_id = dep.deposit_serial_id" - " WHERE ref.coin_pub=$1" - " AND dep.merchant_pub=$2" - " AND dep.h_contract_terms=$3;"); - break; - case 2: - query = "get_refunds_by_coin_and_contract-v2"; - PREPARE (pg, - query, - "WITH rc AS MATERIALIZED(" - "SELECT" - " amount_with_fee" - ",coin_pub" - ",deposit_serial_id" - " FROM refunds ref" - " WHERE ref.coin_pub=$1)" - "SELECT" - " rc.amount_with_fee" - " FROM deposits dep" - " JOIN rc" - " ON rc.deposit_serial_id = dep.deposit_serial_id" - " WHERE" - " dep.coin_pub = $1" - " AND dep.merchant_pub = $2" - " AND dep.h_contract_terms = $3"); - break; - case 3: - query = "get_refunds_by_coin_and_contract-v3"; - PREPARE (pg, - query, - "WITH rc AS MATERIALIZED(" - "SELECT" - " amount_with_fee" - ",deposit_serial_id" - " FROM refunds" - " WHERE coin_pub=$1)" - "SELECT" - " rc.amount_with_fee" - " FROM (" - "SELECT" - " amount_with_fee" - " FROM deposits depos" - " WHERE" - " depos.coin_pub = $1" - " AND depos.merchant_pub = $2" - " AND depos.h_contract_terms = $3) dep, rc;"); - break; - case 4: - query = "get_refunds_by_coin_and_contract-v4"; - PREPARE (pg, - query, - "WITH rc AS MATERIALIZED(" - "SELECT" - " amount_with_fee" - ",coin_pub" - ",deposit_serial_id" - " FROM refunds ref" - " WHERE ref.coin_pub=$1)" - "SELECT" - " rc.amount_with_fee" - " ,deposit_serial_id" - " FROM (" - "SELECT" - " amount_with_fee" - " FROM deposits depos" - " WHERE" - " depos.merchant_pub = $2" - " AND depos.h_contract_terms = $3) dep JOIN rc " - "USING(deposit_serial_id, coin_pub);"); - break; - case 5: - query = "get_refunds_by_coin_and_contract-v-broken"; - xparams = params5; - PREPARE (pg, - query, - "SELECT" - " amount_with_fee" - ",coin_pub" - ",deposit_serial_id" - " FROM refunds" - " WHERE coin_pub=$1;"); - break; - case 8: - query = "get_refunds_by_coin_and_contract-v8"; - PREPARE (pg, - query, - "WITH" - " rc AS MATERIALIZED(" - " SELECT" - " amount_with_fee" - " ,coin_pub" - " ,deposit_serial_id" - " FROM refunds" - " WHERE coin_pub=$1)," - " dep AS MATERIALIZED(" - " SELECT" - " deposit_serial_id" - " FROM deposits" - " WHERE coin_pub = $1" - " AND merchant_pub = $2" - " AND h_contract_terms = $3" - ")" - "SELECT" - " rc.amount_with_fee" - " FROM " - " rc JOIN dep USING (deposit_serial_id);"); - break; - case 9: - query = "get_refunds_by_coin_and_contract-v9-broken"; - PREPARE (pg, - query, - "SELECT" - " ref.amount_with_fee" - " FROM deposits dep" - " JOIN refunds ref USING(deposit_serial_id)" - " WHERE dep.coin_pub IN (" - " SELECT coin_pub" - " FROM refunds" - " WHERE coin_pub=$1)" - " AND merchant_pub = $2" - " AND h_contract_terms = $3;"); - break; - case 10: - query = "get_refunds_by_coin_and_contract-v10-broken"; - PREPARE (pg, - query, - "SELECT" - " *" - " FROM" - " exchange_do_refund_by_coin" - " ($1, $2, $3) " - " AS (amount_with_fee taler_amount);"); - break; - default: - GNUNET_break (0); - return GNUNET_DB_STATUS_HARD_ERROR; - } - + const char *query = "get_refunds_by_coin_and_contract"; + + PREPARE (pg, + query, + "SELECT" + " ref.amount_with_fee" + " FROM refunds ref" + " JOIN coin_deposits cdep" + " USING (coin_pub,batch_deposit_serial_id)" + " JOIN batch_deposits bdep" + " ON (ref.batch_deposit_serial_id = bdep.batch_deposit_serial_id)" + " WHERE ref.coin_pub=$1" + " AND bdep.merchant_pub=$2" + " AND bdep.h_contract_terms=$3;"); qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, query, - xparams, + params, &get_refunds_cb, &srctx); if (GNUNET_SYSERR == srctx.status) |