simplify DB access: do not fetch fields we do not need

This commit is contained in:
Christian Grothoff 2020-07-08 12:35:01 +02:00
parent 575c10027b
commit 81fec09268
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
4 changed files with 79 additions and 52 deletions

View File

@ -507,44 +507,24 @@ deposit_cb (void *cls,
* *
* @param cls a `struct AggregationUnit` * @param cls a `struct AggregationUnit`
* @param row_id identifies database entry * @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 coin_pub public key of the coin
* @param amount_with_fee amount that was deposited including fee * @param amount_with_fee amount that was deposited including fee
* @param deposit_fee amount the exchange gets to keep as transaction fees * @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 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 * @return transaction status code
*/ */
static enum GNUNET_DB_QueryStatus static enum GNUNET_DB_QueryStatus
aggregate_cb (void *cls, aggregate_cb (void *cls,
uint64_t row_id, 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_CoinSpendPublicKeyP *coin_pub,
const struct TALER_Amount *amount_with_fee, const struct TALER_Amount *amount_with_fee,
const struct TALER_Amount *deposit_fee, const struct TALER_Amount *deposit_fee,
const struct GNUNET_HashCode *h_contract_terms, const struct GNUNET_HashCode *h_contract_terms)
struct GNUNET_TIME_Absolute wire_deadline,
const json_t *wire)
{ {
struct AggregationUnit *au = cls; struct AggregationUnit *au = cls;
struct TALER_Amount old; struct TALER_Amount old;
enum GNUNET_DB_QueryStatus qs; 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) if (au->rows_offset >= TALER_EXCHANGEDB_MATCHING_DEPOSITS_LIMIT)
{ {
/* Bug: we asked for at most #TALER_EXCHANGEDB_MATCHING_DEPOSITS_LIMIT results! */ /* Bug: we asked for at most #TALER_EXCHANGEDB_MATCHING_DEPOSITS_LIMIT results! */

View File

@ -908,9 +908,6 @@ postgres_get_session (void *cls)
",amount_with_fee_frac" ",amount_with_fee_frac"
",denom.fee_deposit_val" ",denom.fee_deposit_val"
",denom.fee_deposit_frac" ",denom.fee_deposit_frac"
",wire_deadline"
",exchange_timestamp"
",wallet_timestamp"
",h_contract_terms" ",h_contract_terms"
",coin_pub" ",coin_pub"
" FROM deposits" " FROM deposits"
@ -2868,7 +2865,7 @@ struct MatchingDepositContext
/** /**
* Function to call for each result * Function to call for each result
*/ */
TALER_EXCHANGEDB_DepositIterator deposit_cb; TALER_EXCHANGEDB_MatchingDepositIterator deposit_cb;
/** /**
* Closure for @e 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 amount_with_fee;
struct TALER_Amount deposit_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 GNUNET_HashCode h_contract_terms;
struct TALER_CoinSpendPublicKeyP coin_pub; struct TALER_CoinSpendPublicKeyP coin_pub;
uint64_t serial_id; uint64_t serial_id;
@ -2943,12 +2937,6 @@ match_deposit_cb (void *cls,
&amount_with_fee), &amount_with_fee),
TALER_PQ_RESULT_SPEC_AMOUNT ("fee_deposit", TALER_PQ_RESULT_SPEC_AMOUNT ("fee_deposit",
&deposit_fee), &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", GNUNET_PQ_result_spec_auto_from_type ("h_contract_terms",
&h_contract_terms), &h_contract_terms),
GNUNET_PQ_result_spec_auto_from_type ("coin_pub", 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, qs = mdc->deposit_cb (mdc->deposit_cb_cls,
serial_id, serial_id,
exchange_timestamp,
wallet_timestamp,
mdc->merchant_pub,
&coin_pub, &coin_pub,
&amount_with_fee, &amount_with_fee,
&deposit_fee, &deposit_fee,
&h_contract_terms, &h_contract_terms);
wire_deadline,
NULL);
GNUNET_PQ_cleanup_result (rs); GNUNET_PQ_cleanup_result (rs);
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs) if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
break; break;
@ -3003,7 +2986,7 @@ postgres_iterate_matching_deposits (
struct TALER_EXCHANGEDB_Session *session, struct TALER_EXCHANGEDB_Session *session,
const struct GNUNET_HashCode *h_wire, const struct GNUNET_HashCode *h_wire,
const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_MerchantPublicKeyP *merchant_pub,
TALER_EXCHANGEDB_DepositIterator deposit_cb, TALER_EXCHANGEDB_MatchingDepositIterator deposit_cb,
void *deposit_cb_cls, void *deposit_cb_cls,
uint32_t limit) uint32_t limit)
{ {

View File

@ -842,7 +842,7 @@ static uint64_t deposit_rowid;
* @param h_contract_terms hash of the proposal data known to merchant and customer * @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 * @param wire_deadline by which the merchant advised that he would like the
* wire transfer to be executed * 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 * @return transaction status code, #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT to continue to iterate
*/ */
static enum GNUNET_DB_QueryStatus static enum GNUNET_DB_QueryStatus
@ -862,10 +862,9 @@ deposit_cb (void *cls,
struct GNUNET_HashCode h_wire; struct GNUNET_HashCode h_wire;
deposit_rowid = rowid; deposit_rowid = rowid;
if (NULL != wire) GNUNET_assert (GNUNET_OK ==
GNUNET_assert (GNUNET_OK == TALER_JSON_merchant_wire_signature_hash (wire,
TALER_JSON_merchant_wire_signature_hash (wire, &h_wire));
&h_wire));
if ( (0 != GNUNET_memcmp (merchant_pub, if ( (0 != GNUNET_memcmp (merchant_pub,
&deposit->merchant_pub)) || &deposit->merchant_pub)) ||
(0 != TALER_amount_cmp (amount_with_fee, (0 != TALER_amount_cmp (amount_with_fee,
@ -877,9 +876,51 @@ deposit_cb (void *cls,
(0 != memcmp (coin_pub, (0 != memcmp (coin_pub,
&deposit->coin.coin_pub, &deposit->coin.coin_pub,
sizeof (struct TALER_CoinSpendPublicKeyP))) || sizeof (struct TALER_CoinSpendPublicKeyP))) ||
( (NULL != wire) && (0 != GNUNET_memcmp (&h_wire,
(0 != GNUNET_memcmp (&h_wire, &deposit->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); GNUNET_break (0);
return GNUNET_DB_STATUS_HARD_ERROR; return GNUNET_DB_STATUS_HARD_ERROR;
@ -1936,7 +1977,7 @@ run (void *cls)
session, session,
&deposit.h_wire, &deposit.h_wire,
&deposit.merchant_pub, &deposit.merchant_pub,
&deposit_cb, &matching_deposit_cb,
&deposit, &deposit,
2)); 2));
sleep (2); /* giv deposit time to be ready */ sleep (2); /* giv deposit time to be ready */

View File

@ -968,6 +968,29 @@ struct TALER_EXCHANGEDB_TransactionList
struct TALER_EXCHANGEDB_Session; 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, * Function called with details about deposits that have been made,
* with the goal of executing the corresponding wire transaction. * 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 * @param wire_deadline by which the merchant advised that he would like the
* wire transfer to be executed * wire transfer to be executed
* @param receiver_wire_account wire details for the merchant, includes * @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 * @return transaction status code, #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT to continue to iterate
*/ */
typedef enum GNUNET_DB_QueryStatus typedef enum GNUNET_DB_QueryStatus
@ -2019,7 +2042,7 @@ struct TALER_EXCHANGEDB_Plugin
struct TALER_EXCHANGEDB_Session *session, struct TALER_EXCHANGEDB_Session *session,
const struct GNUNET_HashCode *h_wire, const struct GNUNET_HashCode *h_wire,
const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_MerchantPublicKeyP *merchant_pub,
TALER_EXCHANGEDB_DepositIterator deposit_cb, TALER_EXCHANGEDB_MatchingDepositIterator deposit_cb,
void *deposit_cb_cls, void *deposit_cb_cls,
uint32_t limit); uint32_t limit);