finish implementation for #7808

This commit is contained in:
Christian Grothoff 2023-05-04 17:36:43 +02:00
parent 7c0de44a2b
commit 1e88796045
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
6 changed files with 70 additions and 46 deletions

View File

@ -1,6 +1,6 @@
/* /*
This file is part of TALER This file is part of TALER
Copyright (C) 2014-2017, 2021 Taler Systems SA Copyright (C) 2014-2023 Taler Systems SA
TALER is free software; you can redistribute it and/or modify it under the TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License as published by the Free Software terms of the GNU Affero General Public License as published by the Free Software
@ -347,9 +347,7 @@ handle_track_transaction_request (
struct TALER_CoinDepositEventP rep = { struct TALER_CoinDepositEventP rep = {
.header.size = htons (sizeof (rep)), .header.size = htons (sizeof (rep)),
.header.type = htons (TALER_DBEVENT_EXCHANGE_DEPOSIT_STATUS_CHANGED), .header.type = htons (TALER_DBEVENT_EXCHANGE_DEPOSIT_STATUS_CHANGED),
.coin_pub = ctx->coin_pub, .merchant_pub = ctx->merchant
.merchant_pub = ctx->merchant,
.h_wire = ctx->h_wire
}; };
ctx->eh = TEH_plugin->event_listen ( ctx->eh = TEH_plugin->event_listen (

View File

@ -22,6 +22,7 @@
#include "taler_error_codes.h" #include "taler_error_codes.h"
#include "taler_dbevents.h" #include "taler_dbevents.h"
#include "taler_pq_lib.h" #include "taler_pq_lib.h"
#include "pg_event_notify.h"
#include "pg_aggregate.h" #include "pg_aggregate.h"
#include "pg_helper.h" #include "pg_helper.h"
@ -35,34 +36,12 @@ TEH_PG_aggregate (
{ {
struct PostgresClosure *pg = cls; struct PostgresClosure *pg = cls;
struct GNUNET_TIME_Absolute now = {0}; struct GNUNET_TIME_Absolute now = {0};
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_absolute_time (&now),
GNUNET_PQ_query_param_auto_from_type (merchant_pub),
GNUNET_PQ_query_param_auto_from_type (h_payto),
GNUNET_PQ_query_param_auto_from_type (wtid),
GNUNET_PQ_query_param_end
};
uint64_t sum_deposit_value; uint64_t sum_deposit_value;
uint64_t sum_deposit_frac; uint64_t sum_deposit_frac;
uint64_t sum_refund_value; uint64_t sum_refund_value;
uint64_t sum_refund_frac; uint64_t sum_refund_frac;
uint64_t sum_fee_value; uint64_t sum_fee_value;
uint64_t sum_fee_frac; uint64_t sum_fee_frac;
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 ("sum_deposit_value",
&sum_deposit_value),
GNUNET_PQ_result_spec_uint64 ("sum_deposit_fraction",
&sum_deposit_frac),
GNUNET_PQ_result_spec_uint64 ("sum_refund_value",
&sum_refund_value),
GNUNET_PQ_result_spec_uint64 ("sum_refund_fraction",
&sum_refund_frac),
GNUNET_PQ_result_spec_uint64 ("sum_fee_value",
&sum_fee_value),
GNUNET_PQ_result_spec_uint64 ("sum_fee_fraction",
&sum_fee_frac),
GNUNET_PQ_result_spec_end
};
enum GNUNET_DB_QueryStatus qs; enum GNUNET_DB_QueryStatus qs;
struct TALER_Amount sum_deposit; struct TALER_Amount sum_deposit;
struct TALER_Amount sum_refund; struct TALER_Amount sum_refund;
@ -71,8 +50,6 @@ TEH_PG_aggregate (
now = GNUNET_TIME_absolute_round_down (GNUNET_TIME_absolute_get (), now = GNUNET_TIME_absolute_round_down (GNUNET_TIME_absolute_get (),
pg->aggregator_shift); pg->aggregator_shift);
/* Used in #postgres_aggregate() */
PREPARE (pg, PREPARE (pg,
"aggregate", "aggregate",
"WITH dep AS (" /* restrict to our merchant and account and mark as done */ "WITH dep AS (" /* restrict to our merchant and account and mark as done */
@ -148,11 +125,35 @@ TEH_PG_aggregate (
" FULL OUTER JOIN ref ON (FALSE)" /* We just want all sums */ " FULL OUTER JOIN ref ON (FALSE)" /* We just want all sums */
" FULL OUTER JOIN fees ON (FALSE);"); " FULL OUTER JOIN fees ON (FALSE);");
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_absolute_time (&now),
GNUNET_PQ_query_param_auto_from_type (merchant_pub),
GNUNET_PQ_query_param_auto_from_type (h_payto),
GNUNET_PQ_query_param_auto_from_type (wtid),
GNUNET_PQ_query_param_end
};
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 ("sum_deposit_value",
&sum_deposit_value),
GNUNET_PQ_result_spec_uint64 ("sum_deposit_fraction",
&sum_deposit_frac),
GNUNET_PQ_result_spec_uint64 ("sum_refund_value",
&sum_refund_value),
GNUNET_PQ_result_spec_uint64 ("sum_refund_fraction",
&sum_refund_frac),
GNUNET_PQ_result_spec_uint64 ("sum_fee_value",
&sum_fee_value),
GNUNET_PQ_result_spec_uint64 ("sum_fee_fraction",
&sum_fee_frac),
GNUNET_PQ_result_spec_end
};
qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn, qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
"aggregate", "aggregate",
params, params,
rs); rs);
}
if (qs < 0) if (qs < 0)
{ {
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
@ -165,6 +166,18 @@ TEH_PG_aggregate (
total)); total));
return qs; return qs;
} }
{
struct TALER_CoinDepositEventP rep = {
.header.size = htons (sizeof (rep)),
.header.type = htons (TALER_DBEVENT_EXCHANGE_DEPOSIT_STATUS_CHANGED),
.merchant_pub = *merchant_pub
};
TEH_PG_event_notify (pg,
&rep.header,
NULL,
0);
}
GNUNET_assert (GNUNET_OK == GNUNET_assert (GNUNET_OK ==
TALER_amount_set_zero (pg->currency, TALER_amount_set_zero (pg->currency,
&sum_deposit)); &sum_deposit));

View File

@ -3546,6 +3546,7 @@ typedef void
* @param h_wire hash of merchant's wire transfer details * @param h_wire hash of merchant's wire transfer details
* @param h_contract_terms hash of the proposal data * @param h_contract_terms hash of the proposal data
* @param coin_pub public key of the coin * @param coin_pub public key of the coin
* @param timeout timeout to use for long-polling, 0 for no long polling
* @param cb function to call with the result * @param cb function to call with the result
* @param cb_cls closure for @a cb * @param cb_cls closure for @a cb
* @return handle to abort request * @return handle to abort request
@ -3557,6 +3558,7 @@ TALER_EXCHANGE_deposits_get (
const struct TALER_MerchantWireHashP *h_wire, const struct TALER_MerchantWireHashP *h_wire,
const struct TALER_PrivateContractHashP *h_contract_terms, const struct TALER_PrivateContractHashP *h_contract_terms,
const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub,
struct GNUNET_TIME_Relative timeout,
TALER_EXCHANGE_DepositGetCallback cb, TALER_EXCHANGE_DepositGetCallback cb,
void *cb_cls); void *cb_cls);

View File

@ -160,20 +160,10 @@ struct TALER_CoinDepositEventP
struct GNUNET_DB_EventHeaderP header; struct GNUNET_DB_EventHeaderP header;
/** /**
* The coin's public key. * Public key of the merchant.
*/
struct TALER_CoinSpendPublicKeyP coin_pub;
/**
* The Merchant's public key.
*/ */
struct TALER_MerchantPublicKeyP merchant_pub; struct TALER_MerchantPublicKeyP merchant_pub;
/**
* Hash over the wiring information of the merchant.
*/
struct TALER_MerchantWireHashP h_wire;
}; };
/** /**

View File

@ -1,6 +1,6 @@
/* /*
This file is part of TALER This file is part of TALER
Copyright (C) 2014-2021 Taler Systems SA Copyright (C) 2014-2023 Taler Systems SA
TALER is free software; you can redistribute it and/or modify it under the 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 terms of the GNU General Public License as published by the Free Software
@ -260,6 +260,7 @@ TALER_EXCHANGE_deposits_get (
const struct TALER_MerchantWireHashP *h_wire, const struct TALER_MerchantWireHashP *h_wire,
const struct TALER_PrivateContractHashP *h_contract_terms, const struct TALER_PrivateContractHashP *h_contract_terms,
const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub,
struct GNUNET_TIME_Relative timeout,
TALER_EXCHANGE_DepositGetCallback cb, TALER_EXCHANGE_DepositGetCallback cb,
void *cb_cls) void *cb_cls)
{ {
@ -293,6 +294,7 @@ TALER_EXCHANGE_deposits_get (
char msig_str[sizeof (struct TALER_MerchantSignatureP) * 2]; char msig_str[sizeof (struct TALER_MerchantSignatureP) * 2];
char chash_str[sizeof (struct TALER_PrivateContractHashP) * 2]; char chash_str[sizeof (struct TALER_PrivateContractHashP) * 2];
char whash_str[sizeof (struct TALER_MerchantWireHashP) * 2]; char whash_str[sizeof (struct TALER_MerchantWireHashP) * 2];
char timeout_str[24];
char *end; char *end;
end = GNUNET_STRINGS_data_to_string (h_wire, end = GNUNET_STRINGS_data_to_string (h_wire,
@ -320,15 +322,33 @@ TALER_EXCHANGE_deposits_get (
msig_str, msig_str,
sizeof (msig_str)); sizeof (msig_str));
*end = '\0'; *end = '\0';
if (GNUNET_TIME_relative_is_zero (timeout))
{
timeout_str[0] = '\0';
}
else
{
GNUNET_snprintf (
timeout_str,
sizeof (timeout_str),
"%llu",
(unsigned long long) (
timeout.rel_value_us
/ GNUNET_TIME_UNIT_MILLISECONDS.rel_value_us));
}
GNUNET_snprintf (arg_str, GNUNET_snprintf (arg_str,
sizeof (arg_str), sizeof (arg_str),
"/deposits/%s/%s/%s/%s?merchant_sig=%s", "/deposits/%s/%s/%s/%s?merchant_sig=%s%s%s",
whash_str, whash_str,
mpub_str, mpub_str,
chash_str, chash_str,
cpub_str, cpub_str,
msig_str); msig_str,
GNUNET_TIME_relative_is_zero (timeout)
? ""
: "&timeout_ms=",
timeout_str);
} }
dwh = GNUNET_new (struct TALER_EXCHANGE_DepositGetHandle); dwh = GNUNET_new (struct TALER_EXCHANGE_DepositGetHandle);

View File

@ -281,6 +281,7 @@ track_transaction_run (void *cls,
&h_wire_details, &h_wire_details,
&h_contract_terms, &h_contract_terms,
&coin_pub, &coin_pub,
GNUNET_TIME_UNIT_ZERO,
&deposit_wtid_cb, &deposit_wtid_cb,
tts); tts);
GNUNET_assert (NULL != tts->tth); GNUNET_assert (NULL != tts->tth);