From 81fec09268d08762e85583650d7bd02fdd7e7de4 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 8 Jul 2020 12:35:01 +0200 Subject: [PATCH] simplify DB access: do not fetch fields we do not need --- src/exchange/taler-exchange-aggregator.c | 22 +------- src/exchangedb/plugin_exchangedb_postgres.c | 23 ++------ src/exchangedb/test_exchangedb.c | 59 +++++++++++++++++---- src/include/taler_exchangedb_plugin.h | 27 +++++++++- 4 files changed, 79 insertions(+), 52 deletions(-) diff --git a/src/exchange/taler-exchange-aggregator.c b/src/exchange/taler-exchange-aggregator.c index 69c73746c..270a13301 100644 --- a/src/exchange/taler-exchange-aggregator.c +++ b/src/exchange/taler-exchange-aggregator.c @@ -507,44 +507,24 @@ deposit_cb (void *cls, * * @param cls a `struct AggregationUnit` * @param row_id identifies database entry - * @param exchange_timestamp when did the exchange receive the deposit - * @param wallet_timestamp when did the wallet sign the contract - * @param merchant_pub public key of the merchant * @param coin_pub public key of the coin * @param amount_with_fee amount that was deposited including fee * @param deposit_fee amount the exchange gets to keep as transaction fees * @param h_contract_terms hash of the proposal data known to merchant and customer - * @param wire_deadline by which the merchant advised that he would like the - * wire transfer to be executed - * @param wire wire details for the merchant * @return transaction status code */ static enum GNUNET_DB_QueryStatus aggregate_cb (void *cls, uint64_t row_id, - struct GNUNET_TIME_Absolute exchange_timestamp, - struct GNUNET_TIME_Absolute wallet_timestamp, - const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_Amount *amount_with_fee, const struct TALER_Amount *deposit_fee, - const struct GNUNET_HashCode *h_contract_terms, - struct GNUNET_TIME_Absolute wire_deadline, - const json_t *wire) + const struct GNUNET_HashCode *h_contract_terms) { struct AggregationUnit *au = cls; struct TALER_Amount old; enum GNUNET_DB_QueryStatus qs; - /* NOTE: potential optimization: use custom SQL API to not - fetch these: */ - (void) wire_deadline; /* checked by SQL */ - (void) exchange_timestamp; - (void) wallet_timestamp; - (void) wire; /* must match */ - GNUNET_break (0 == GNUNET_memcmp (&au->merchant_pub, - merchant_pub)); - if (au->rows_offset >= TALER_EXCHANGEDB_MATCHING_DEPOSITS_LIMIT) { /* Bug: we asked for at most #TALER_EXCHANGEDB_MATCHING_DEPOSITS_LIMIT results! */ diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index dede901f9..98b3c170b 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -908,9 +908,6 @@ postgres_get_session (void *cls) ",amount_with_fee_frac" ",denom.fee_deposit_val" ",denom.fee_deposit_frac" - ",wire_deadline" - ",exchange_timestamp" - ",wallet_timestamp" ",h_contract_terms" ",coin_pub" " FROM deposits" @@ -2868,7 +2865,7 @@ struct MatchingDepositContext /** * Function to call for each result */ - TALER_EXCHANGEDB_DepositIterator deposit_cb; + TALER_EXCHANGEDB_MatchingDepositIterator deposit_cb; /** * Closure for @e deposit_cb. @@ -2929,9 +2926,6 @@ match_deposit_cb (void *cls, { struct TALER_Amount amount_with_fee; struct TALER_Amount deposit_fee; - struct GNUNET_TIME_Absolute exchange_timestamp; - struct GNUNET_TIME_Absolute wallet_timestamp; - struct GNUNET_TIME_Absolute wire_deadline; struct GNUNET_HashCode h_contract_terms; struct TALER_CoinSpendPublicKeyP coin_pub; uint64_t serial_id; @@ -2943,12 +2937,6 @@ match_deposit_cb (void *cls, &amount_with_fee), TALER_PQ_RESULT_SPEC_AMOUNT ("fee_deposit", &deposit_fee), - TALER_PQ_result_spec_absolute_time ("wire_deadline", - &wire_deadline), - TALER_PQ_result_spec_absolute_time ("exchange_timestamp", - &exchange_timestamp), - TALER_PQ_result_spec_absolute_time ("wallet_timestamp", - &wallet_timestamp), GNUNET_PQ_result_spec_auto_from_type ("h_contract_terms", &h_contract_terms), GNUNET_PQ_result_spec_auto_from_type ("coin_pub", @@ -2967,15 +2955,10 @@ match_deposit_cb (void *cls, } qs = mdc->deposit_cb (mdc->deposit_cb_cls, serial_id, - exchange_timestamp, - wallet_timestamp, - mdc->merchant_pub, &coin_pub, &amount_with_fee, &deposit_fee, - &h_contract_terms, - wire_deadline, - NULL); + &h_contract_terms); GNUNET_PQ_cleanup_result (rs); if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs) break; @@ -3003,7 +2986,7 @@ postgres_iterate_matching_deposits ( struct TALER_EXCHANGEDB_Session *session, const struct GNUNET_HashCode *h_wire, const struct TALER_MerchantPublicKeyP *merchant_pub, - TALER_EXCHANGEDB_DepositIterator deposit_cb, + TALER_EXCHANGEDB_MatchingDepositIterator deposit_cb, void *deposit_cb_cls, uint32_t limit) { diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c index 043095e7b..8567c87cb 100644 --- a/src/exchangedb/test_exchangedb.c +++ b/src/exchangedb/test_exchangedb.c @@ -842,7 +842,7 @@ static uint64_t deposit_rowid; * @param h_contract_terms hash of the proposal data known to merchant and customer * @param wire_deadline by which the merchant advised that he would like the * wire transfer to be executed - * @param wire wire details for the merchant, NULL from iterate_matching_deposits() + * @param wire wire details for the merchant * @return transaction status code, #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT to continue to iterate */ static enum GNUNET_DB_QueryStatus @@ -862,10 +862,9 @@ deposit_cb (void *cls, struct GNUNET_HashCode h_wire; deposit_rowid = rowid; - if (NULL != wire) - GNUNET_assert (GNUNET_OK == - TALER_JSON_merchant_wire_signature_hash (wire, - &h_wire)); + GNUNET_assert (GNUNET_OK == + TALER_JSON_merchant_wire_signature_hash (wire, + &h_wire)); if ( (0 != GNUNET_memcmp (merchant_pub, &deposit->merchant_pub)) || (0 != TALER_amount_cmp (amount_with_fee, @@ -877,9 +876,51 @@ deposit_cb (void *cls, (0 != memcmp (coin_pub, &deposit->coin.coin_pub, sizeof (struct TALER_CoinSpendPublicKeyP))) || - ( (NULL != wire) && - (0 != GNUNET_memcmp (&h_wire, - &deposit->h_wire)) ) ) + (0 != GNUNET_memcmp (&h_wire, + &deposit->h_wire)) ) + { + GNUNET_break (0); + return GNUNET_DB_STATUS_HARD_ERROR; + } + + return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT; +} + + +/** + * Function called with details about deposits that + * have been made. Called in the test on the + * deposit given in @a cls. + * + * @param cls closure a `struct TALER_EXCHANGEDB_Deposit *` + * @param rowid unique ID for the deposit in our DB, used for marking + * it as 'tiny' or 'done' + * @param coin_pub public key of the coin + * @param amount_with_fee amount that was deposited including fee + * @param deposit_fee amount the exchange gets to keep as transaction fees + * @param h_contract_terms hash of the proposal data known to merchant and customer + * @return transaction status code, #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT to continue to iterate + */ +static enum GNUNET_DB_QueryStatus +matching_deposit_cb (void *cls, + uint64_t rowid, + const struct TALER_CoinSpendPublicKeyP *coin_pub, + const struct TALER_Amount *amount_with_fee, + const struct TALER_Amount *deposit_fee, + const struct GNUNET_HashCode *h_contract_terms) +{ + struct TALER_EXCHANGEDB_Deposit *deposit = cls; + + deposit_rowid = rowid; + if ( (0 != TALER_amount_cmp (amount_with_fee, + &deposit->amount_with_fee)) || + (0 != TALER_amount_cmp (deposit_fee, + &deposit->deposit_fee)) || + (0 != GNUNET_memcmp (h_contract_terms, + &deposit->h_contract_terms)) || + (0 != memcmp (coin_pub, + &deposit->coin.coin_pub, + sizeof (struct TALER_CoinSpendPublicKeyP))) ) { GNUNET_break (0); return GNUNET_DB_STATUS_HARD_ERROR; @@ -1936,7 +1977,7 @@ run (void *cls) session, &deposit.h_wire, &deposit.merchant_pub, - &deposit_cb, + &matching_deposit_cb, &deposit, 2)); sleep (2); /* giv deposit time to be ready */ diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h index 9fb932362..d069bd2ec 100644 --- a/src/include/taler_exchangedb_plugin.h +++ b/src/include/taler_exchangedb_plugin.h @@ -968,6 +968,29 @@ struct TALER_EXCHANGEDB_TransactionList struct TALER_EXCHANGEDB_Session; +/** + * Function called with details about deposits that have been made, + * with the goal of executing the corresponding wire transaction. + * + * @param cls closure + * @param rowid unique ID for the deposit in our DB, used for marking + * it as 'tiny' or 'done' + * @param coin_pub public key of the coin + * @param amount_with_fee amount that was deposited including fee + * @param deposit_fee amount the exchange gets to keep as transaction fees + * @param h_contract_terms hash of the proposal data known to merchant and customer + * @return transaction status code, #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT to continue to iterate + */ +typedef enum GNUNET_DB_QueryStatus +(*TALER_EXCHANGEDB_MatchingDepositIterator)( + void *cls, + uint64_t rowid, + const struct TALER_CoinSpendPublicKeyP *coin_pub, + const struct TALER_Amount *amount_with_fee, + const struct TALER_Amount *deposit_fee, + const struct GNUNET_HashCode *h_contract_terms); + + /** * Function called with details about deposits that have been made, * with the goal of executing the corresponding wire transaction. @@ -985,7 +1008,7 @@ struct TALER_EXCHANGEDB_Session; * @param wire_deadline by which the merchant advised that he would like the * wire transfer to be executed * @param receiver_wire_account wire details for the merchant, includes - * 'url' in payto://-format; NULL from iterate_matching_deposits() + * 'url' in payto://-format; * @return transaction status code, #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT to continue to iterate */ typedef enum GNUNET_DB_QueryStatus @@ -2019,7 +2042,7 @@ struct TALER_EXCHANGEDB_Plugin struct TALER_EXCHANGEDB_Session *session, const struct GNUNET_HashCode *h_wire, const struct TALER_MerchantPublicKeyP *merchant_pub, - TALER_EXCHANGEDB_DepositIterator deposit_cb, + TALER_EXCHANGEDB_MatchingDepositIterator deposit_cb, void *deposit_cb_cls, uint32_t limit);