summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2020-01-17 15:43:04 +0100
committerChristian Grothoff <christian@grothoff.org>2020-01-17 15:43:04 +0100
commit0328ab313b9194f10c154f74518089df9509fe09 (patch)
tree4088179075b4d8f063307c0180c2f4e5615ec3be
parentcdd8d14f76de8d0abdbe90f75820cc0dadab9751 (diff)
downloadexchange-0328ab313b9194f10c154f74518089df9509fe09.tar.gz
exchange-0328ab313b9194f10c154f74518089df9509fe09.tar.bz2
exchange-0328ab313b9194f10c154f74518089df9509fe09.zip
use more specific SELECT in exchange aggregator on refunds instead of filtering in application logic later
-rw-r--r--src/exchange/taler-exchange-aggregator.c38
-rw-r--r--src/exchangedb/plugin_exchangedb_postgres.c47
-rw-r--r--src/exchangedb/test_exchangedb.c43
-rw-r--r--src/include/taler_exchangedb_plugin.h22
4 files changed, 39 insertions, 111 deletions
diff --git a/src/exchange/taler-exchange-aggregator.c b/src/exchange/taler-exchange-aggregator.c
index df201d69..9032cd5e 100644
--- a/src/exchange/taler-exchange-aggregator.c
+++ b/src/exchange/taler-exchange-aggregator.c
@@ -134,11 +134,6 @@ struct AggregationUnit
struct GNUNET_HashCode h_wire;
/**
- * Hash code of contract we are currently looking into.
- */
- const struct GNUNET_HashCode *h_contract;
-
- /**
* Wire transfer identifier we use.
*/
struct TALER_WireTransferIdentifierRawP wtid;
@@ -678,36 +673,15 @@ exchange_serve_process_config ()
* the aggregation unit's total amount.
*
* @param cls closure with a `struct AggregationUnit *`
- * @param merchant_pub public key of merchant who authorized refund
- * @param merchant_sig signature of merchant authorizing refund
- * @param h_contract hash of contract being refunded
- * @param rtransaction_id refund transaction ID
- * @param amount_with_fee amount being refunded
- * @param refund_fee fee the exchange keeps for the refund processing
+ * @param amount_with_fee what was the refunded amount with the fee
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
*/
static int
refund_by_coin_cb (void *cls,
- const struct TALER_MerchantPublicKeyP *merchant_pub,
- const struct TALER_MerchantSignatureP *merchant_sig,
- const struct GNUNET_HashCode *h_contract,
- uint64_t rtransaction_id,
- const struct TALER_Amount *amount_with_fee,
- const struct TALER_Amount *refund_fee)
+ const struct TALER_Amount *amount_with_fee)
{
struct AggregationUnit *aux = cls;
- (void) merchant_sig;
- (void) rtransaction_id;
- (void) refund_fee;
- /* TODO: potential optimization: include these conditions
- in the SELECT, and avoid fetching the values we do not need! */
- if (0 != GNUNET_memcmp (merchant_pub,
- &aux->merchant_pub))
- return GNUNET_OK; /* different merchant */
- if (0 != GNUNET_memcmp (h_contract,
- aux->h_contract))
- return GNUNET_OK; /* different contract */
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Aggregator subtracts applicable refund of amount %s\n",
TALER_amount2s (amount_with_fee));
@@ -776,13 +750,13 @@ deposit_cb (void *cls,
TALER_B2S (coin_pub),
TALER_amount2s (&au->total_amount));
au->row_id = row_id;
- au->h_contract = h_contract_terms;
qs = db_plugin->select_refunds_by_coin (db_plugin->cls,
au->session,
coin_pub,
+ &au->merchant_pub,
+ h_contract_terms,
&refund_by_coin_cb,
au);
- au->h_contract = NULL;
if (0 > qs)
{
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
@@ -938,13 +912,13 @@ aggregate_cb (void *cls,
return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
}
- au->h_contract = h_contract_terms;
qs = db_plugin->select_refunds_by_coin (db_plugin->cls,
au->session,
coin_pub,
+ &au->merchant_pub,
+ h_contract_terms,
&refund_by_coin_cb,
au);
- au->h_contract = NULL;
if (0 > qs)
{
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c
index 925f2853..8a013c40 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -736,6 +736,17 @@ postgres_get_session (void *cls)
" JOIN denominations denom USING (denom_pub_hash)"
" WHERE coin_pub=$1;",
1),
+ /* Query the 'refunds' by coin public key, merchant_pub and contract hash */
+ GNUNET_PQ_make_prepare ("get_refunds_by_coin_and_contract",
+ "SELECT"
+ " amount_with_fee_val"
+ ",amount_with_fee_frac"
+ " FROM refunds"
+ " WHERE"
+ " coin_pub=$1"
+ " AND merchant_pub=$2"
+ " AND h_contract_terms=$3;",
+ 3),
/* Fetch refunds with rowid '\geq' the given parameter */
GNUNET_PQ_make_prepare ("audit_get_refunds_incr",
"SELECT"
@@ -3296,25 +3307,10 @@ get_refunds_cb (void *cls,
for (unsigned int i = 0; i<num_results; i++)
{
- struct TALER_MerchantPublicKeyP merchant_pub;
- struct TALER_MerchantSignatureP merchant_sig;
- struct GNUNET_HashCode h_contract;
- uint64_t rtransaction_id;
struct TALER_Amount amount_with_fee;
- struct TALER_Amount refund_fee;
struct GNUNET_PQ_ResultSpec rs[] = {
- GNUNET_PQ_result_spec_auto_from_type ("merchant_pub",
- &merchant_pub),
- GNUNET_PQ_result_spec_auto_from_type ("merchant_sig",
- &merchant_sig),
- GNUNET_PQ_result_spec_auto_from_type ("h_contract_terms",
- &h_contract),
- GNUNET_PQ_result_spec_uint64 ("rtransaction_id",
- &rtransaction_id),
TALER_PQ_RESULT_SPEC_AMOUNT ("amount_with_fee",
&amount_with_fee),
- TALER_PQ_RESULT_SPEC_AMOUNT ("fee_refund",
- &refund_fee),
GNUNET_PQ_result_spec_end
};
@@ -3329,23 +3325,20 @@ get_refunds_cb (void *cls,
}
if (GNUNET_OK !=
srctx->cb (srctx->cb_cls,
- &merchant_pub,
- &merchant_sig,
- &h_contract,
- rtransaction_id,
- &amount_with_fee,
- &refund_fee))
+ &amount_with_fee))
return;
}
}
/**
- * Select refunds by @a coin_pub.
+ * Select refunds by @a coin_pub, @a merchant_pub and @a h_contract.
*
* @param cls closure of plugin
* @param session database handle to use
* @param coin_pub coin to get refunds for
+ * @param merchant_pub merchant to get refunds for
+ * @param h_contract_pub contract (hash) to get refunds for
* @param cb function to call for each refund found
* @param cb_cls closure for @a cb
* @return query result status
@@ -3355,13 +3348,19 @@ postgres_select_refunds_by_coin (void *cls,
struct TALER_EXCHANGEDB_Session *session,
const struct
TALER_CoinSpendPublicKeyP *coin_pub,
- TALER_EXCHANGEDB_RefundCoinCallback cb,
+ const struct
+ TALER_MerchantPublicKeyP *merchant_pub,
+ const struct GNUNET_HashCode *h_contract,
+ TALER_EXCHANGEDB_RefundCoinCallback
+ cb,
void *cb_cls)
{
struct PostgresClosure *pg = cls;
enum GNUNET_DB_QueryStatus qs;
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (coin_pub),
+ GNUNET_PQ_query_param_auto_from_type (merchant_pub),
+ GNUNET_PQ_query_param_auto_from_type (h_contract),
GNUNET_PQ_query_param_end
};
struct SelectRefundContext srctx = {
@@ -3372,7 +3371,7 @@ postgres_select_refunds_by_coin (void *cls,
};
qs = GNUNET_PQ_eval_prepared_multi_select (session->conn,
- "get_refunds_by_coin",
+ "get_refunds_by_coin_and_contract",
params,
&get_refunds_cb,
&srctx);
diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c
index e9fe67b4..a880ce62 100644
--- a/src/exchangedb/test_exchangedb.c
+++ b/src/exchangedb/test_exchangedb.c
@@ -1412,60 +1412,21 @@ wire_missing_cb (void *cls,
* to a particular coin.
*
* @param cls closure with the `struct TALER_EXCHANGEDB_Refund *` we expect to get
- * @param merchant_pub public key of merchant who authorized refund
- * @param merchant_sig signature of merchant authorizing refund
- * @param h_contract hash of contract being refunded
- * @param rtransaction_id refund transaction ID
* @param amount_with_fee amount being refunded
- * @param refund_fee fee the exchange keeps for the refund processing
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
*/
static int
check_refund_cb (void *cls,
- const struct TALER_MerchantPublicKeyP *merchant_pub,
- const struct TALER_MerchantSignatureP *merchant_sig,
- const struct GNUNET_HashCode *h_contract,
- uint64_t rtransaction_id,
- const struct TALER_Amount *amount_with_fee,
- const struct TALER_Amount *refund_fee)
+ const struct TALER_Amount *amount_with_fee)
{
const struct TALER_EXCHANGEDB_Refund *refund = cls;
- if (0 != GNUNET_memcmp (merchant_pub,
- &refund->details.merchant_pub))
- {
- GNUNET_break (0);
- result = 66;
- }
- if (0 != GNUNET_memcmp (merchant_sig,
- &refund->details.merchant_sig))
- {
- GNUNET_break (0);
- result = 66;
- }
- if (0 != GNUNET_memcmp (h_contract,
- &refund->details.h_contract_terms))
- {
- GNUNET_break (0);
- result = 66;
- }
- if (rtransaction_id != refund->details.rtransaction_id)
- {
- GNUNET_break (0);
- result = 66;
- }
if (0 != TALER_amount_cmp (amount_with_fee,
&refund->details.refund_amount))
{
GNUNET_break (0);
result = 66;
}
- if (0 != TALER_amount_cmp (refund_fee,
- &refund->details.refund_fee))
- {
- GNUNET_break (0);
- result = 66;
- }
return GNUNET_OK;
}
@@ -1988,6 +1949,8 @@ run (void *cls)
plugin->select_refunds_by_coin (plugin->cls,
session,
&refund.coin.coin_pub,
+ &refund.details.merchant_pub,
+ &refund.details.h_contract_terms,
&check_refund_cb,
&refund));
diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h
index 633640e0..83c18d63 100644
--- a/src/include/taler_exchangedb_plugin.h
+++ b/src/include/taler_exchangedb_plugin.h
@@ -1094,28 +1094,16 @@ typedef int
/**
* Callback invoked with information about refunds applicable
- * to a particular coin.
+ * to a particular coin and contract.
*
* @param cls closure
- * @param merchant_pub public key of merchant who authorized refund
- * @param merchant_sig signature of merchant authorizing refund
- * @param h_contract hash of contract being refunded
- * @param rtransaction_id refund transaction ID
* @param amount_with_fee amount being refunded
- * @param refund_fee fee the exchange keeps for the refund processing
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
*/
typedef int
(*TALER_EXCHANGEDB_RefundCoinCallback)(void *cls,
const struct
- TALER_MerchantPublicKeyP *merchant_pub,
- const struct
- TALER_MerchantSignatureP *merchant_sig,
- const struct GNUNET_HashCode *h_contract,
- uint64_t rtransaction_id,
- const struct
- TALER_Amount *amount_with_fee,
- const struct TALER_Amount *refund_fee);
+ TALER_Amount *amount_with_fee);
/**
@@ -1947,11 +1935,13 @@ struct TALER_EXCHANGEDB_Plugin
const struct TALER_EXCHANGEDB_Refund *refund);
/**
- * Select refunds by @a coin_pub.
+ * Select refunds by @a coin_pub, @a merchant_pub and @a h_contract.
*
* @param cls closure of plugin
* @param session database handle to use
* @param coin_pub coin to get refunds for
+ * @param merchant_pub merchant to get refunds for
+ * @param h_contract_pub contract (hash) to get refunds for
* @param cb function to call for each refund found
* @param cb_cls closure for @a cb
* @return query result status
@@ -1960,6 +1950,8 @@ struct TALER_EXCHANGEDB_Plugin
(*select_refunds_by_coin)(void *cls,
struct TALER_EXCHANGEDB_Session *session,
const struct TALER_CoinSpendPublicKeyP *coin_pub,
+ const struct TALER_MerchantPublicKeyP *merchant_pub,
+ const struct GNUNET_HashCode *h_contract,
TALER_EXCHANGEDB_RefundCoinCallback cb,
void *cb_cls);