summaryrefslogtreecommitdiff
path: root/src/exchangedb/pg_select_refunds_by_coin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/exchangedb/pg_select_refunds_by_coin.c')
-rw-r--r--src/exchangedb/pg_select_refunds_by_coin.c224
1 files changed, 17 insertions, 207 deletions
diff --git a/src/exchangedb/pg_select_refunds_by_coin.c b/src/exchangedb/pg_select_refunds_by_coin.c
index 7325b3597..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,219 +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_val"
- ",ref.amount_with_fee_frac"
- " 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_val"
- ",ref.amount_with_fee_frac"
- " 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_val"
- ",amount_with_fee_frac"
- ",coin_pub"
- ",deposit_serial_id"
- " FROM refunds ref"
- " WHERE ref.coin_pub=$1)"
- "SELECT"
- " rc.amount_with_fee_val"
- " ,rc.amount_with_fee_frac"
- " 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_val"
- ",amount_with_fee_frac"
- ",deposit_serial_id"
- " FROM refunds"
- " WHERE coin_pub=$1)"
- "SELECT"
- " rc.amount_with_fee_val"
- " ,rc.amount_with_fee_frac"
- " FROM ("
- "SELECT"
- " amount_with_fee_val"
- ",amount_with_fee_frac"
- " 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_val"
- ",amount_with_fee_frac"
- ",coin_pub"
- ",deposit_serial_id"
- " FROM refunds ref"
- " WHERE ref.coin_pub=$1)"
- "SELECT"
- " rc.amount_with_fee_val"
- " ,rc.amount_with_fee_frac"
- " ,deposit_serial_id"
- " FROM ("
- "SELECT"
- " amount_with_fee_val"
- ",amount_with_fee_frac"
- " 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_val"
- ",amount_with_fee_frac"
- ",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_val"
- " ,amount_with_fee_frac"
- " ,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_val"
- " ,rc.amount_with_fee_frac"
- " 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_val"
- " ,ref.amount_with_fee_frac"
- " 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_val INT8, amount_with_fee_frac INT4);");
- 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)