merchant

Merchant backend to process payments, run by merchants
Log | Files | Refs | Submodules | README | LICENSE

commit 680ca868541c10151cf99b8600e76683a877c6b3
parent d7b8d4e498ba6834945ca45f479c828e859da61c
Author: bohdan-potuzhnyi <bohdan.potuzhnyi@gmail.com>
Date:   Sun, 13 Apr 2025 14:59:25 +0200

Merge branch 'master' into dev/bohdan-potuzhnyi/donau-integration

Diffstat:
Msrc/backend/taler-merchant-kyccheck.c | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
Asrc/backenddb/merchant-0015.sql | 35+++++++++++++++++++++++++++++++++++
Msrc/backenddb/pg_account_kyc_set_status.c | 4+++-
Msrc/backenddb/pg_account_kyc_set_status.h | 3+++
Msrc/backenddb/pg_account_kyc_set_status.sql | 8++++++--
Msrc/backenddb/pg_get_kyc_status.c | 4++++
Msrc/backenddb/pg_get_kyc_status.h | 4++++
Msrc/backenddb/test_merchantdb.c | 3+++
Msrc/include/taler_merchantdb_plugin.h | 749++++++++++++++++++++++++++++++++++++++++---------------------------------------
9 files changed, 492 insertions(+), 380 deletions(-)

diff --git a/src/backend/taler-merchant-kyccheck.c b/src/backend/taler-merchant-kyccheck.c @@ -142,6 +142,7 @@ struct Account * was last active. */ uint64_t account_gen; + }; @@ -212,6 +213,12 @@ struct Inquiry struct GNUNET_TIME_Relative backoff; /** + * Rule generation known to the client, 0 for none. + * Corresponds to the decision row in the exchange. + */ + uint64_t rule_gen; + + /** * Last HTTP status returned by the exchange from * the /kyc-check endpoint. */ @@ -499,6 +506,7 @@ exchange_check_cb ( i->kyc = NULL; i->last_http_status = ks->hr.http_status; i->last_ec = ks->hr.ec; + i->rule_gen = 0; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Checking KYC status of `%s' at `%s' is %u\n", i->a->merchant_account_uri.full_payto, @@ -509,6 +517,7 @@ exchange_check_cb ( case MHD_HTTP_OK: if (! i->kyc_ok) progress = true; + i->rule_gen = ks->details.ok.rule_gen; i->last_kyc_check = GNUNET_TIME_timestamp_get (); /* exchange says KYC is OK, gives status information */ store_kyc_status (i, @@ -527,6 +536,7 @@ exchange_check_cb ( break; case MHD_HTTP_ACCEPTED: progress = ! i->auth_ok; + i->rule_gen = ks->details.ok.rule_gen; i->last_kyc_check = GNUNET_TIME_timestamp_get (); /* exchange says KYC is required */ @@ -611,6 +621,7 @@ exchange_check_cb ( i->last_kyc_check, i->last_http_status, i->last_ec, + i->rule_gen, (i->auth_ok) ? &i->access_token : NULL, @@ -655,6 +666,13 @@ inquiry_work (void *cls) i->task = NULL; if (! GNUNET_TIME_absolute_is_past (i->due)) { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Will start inquiry on %s for %s in %s\n", + i->a->merchant_account_uri.full_payto, + i->e->keys->exchange_url, + GNUNET_TIME_relative2s ( + GNUNET_TIME_absolute_get_remaining (i->due), + true)); i->task = GNUNET_SCHEDULER_add_at (i->due, &inquiry_work, @@ -692,6 +710,7 @@ inquiry_work (void *cls) i->e->keys->exchange_url, &i->a->h_payto, &i->a->ap, + i->rule_gen, lpt, i->not_first_time ? EXCHANGE_TIMEOUT @@ -772,6 +791,7 @@ start_inquiry (struct Exchange *e, &i->kyc_ok, &i->last_http_status, &i->last_ec, + &i->rule_gen, &i->last_kyc_check, &i->aml_review, &i->jlimits); @@ -791,15 +811,27 @@ start_inquiry (struct Exchange *e, so let's check, but slowly within the next minute so that we do not overdo it if this process happens to be restarted a lot. */ - i->due = GNUNET_TIME_relative_to_absolute ( - GNUNET_TIME_randomize (GNUNET_TIME_UNIT_MINUTES)); + if (GNUNET_YES != test_mode) + { + i->due = GNUNET_TIME_relative_to_absolute ( + GNUNET_TIME_randomize (GNUNET_TIME_UNIT_MINUTES)); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Previous KYC status is OK, randomizing inquiry to start at %s\n", + GNUNET_TIME_absolute2s (i->due)); + } break; case MHD_HTTP_ACCEPTED: /* KYC required, due immediately */ break; case MHD_HTTP_NO_CONTENT: /* KYC is OFF, only check again if triggered */ - i->due = GNUNET_TIME_relative_to_absolute (AML_LOW_FREQ); + if (GNUNET_YES != test_mode) + { + i->due = GNUNET_TIME_relative_to_absolute (AML_LOW_FREQ); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "KYC was disabled, randomizing inquiry to start at %s\n", + GNUNET_TIME_absolute2s (i->due)); + } break; case MHD_HTTP_FORBIDDEN: /* bad signature */ case MHD_HTTP_NOT_FOUND: /* account unknown */ @@ -808,8 +840,15 @@ start_inquiry (struct Exchange *e, break; default: /* start with decent back-off after hard failure */ - i->backoff - = GNUNET_TIME_randomize (GNUNET_TIME_UNIT_MINUTES); + if (GNUNET_YES != test_mode) + { + i->backoff + = GNUNET_TIME_randomize (GNUNET_TIME_UNIT_MINUTES); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Last KYC check failed, starting with backoff %s\n", + GNUNET_TIME_relative2s (i->backoff, + true)); + } break; } inquiry_work (i); @@ -884,10 +923,17 @@ start_inquiries (struct Account *a) for (struct Exchange *e = e_head; NULL != e; e = e->next) + { if (is_eligible (e->keys, a)) start_inquiry (e, a); + else + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Account %s not eligible at exchange %s\n", + a->merchant_account_uri.full_payto, + e->keys->exchange_url); + } } @@ -951,7 +997,11 @@ account_cb ( = *merchant_priv; TALER_full_payto_normalize_and_hash (a->merchant_account_uri, &a->h_payto); - + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Found account %s of instance %s with H_PAYTO %s\n", + ad->payto_uri.full_payto, + ad->instance_id, + GNUNET_sh2s (&a->h_payto.hash)); GNUNET_CONTAINER_DLL_insert (a_head, a_tail, a); diff --git a/src/backenddb/merchant-0015.sql b/src/backenddb/merchant-0015.sql @@ -0,0 +1,35 @@ +-- +-- This file is part of TALER +-- Copyright (C) 2025 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 +-- Foundation; either version 3, or (at your option) any later version. +-- +-- TALER is distributed in the hope that it will be useful, but WITHOUT ANY +-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +-- A PARTICULAR PURPOSE. See the GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License along with +-- TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> +-- + +-- @file merchant-0015.sql +-- @brief Tables for statistics +-- @author Christian Grothoff + + +BEGIN; + +-- Check patch versioning is in place. +SELECT _v.register_patch('merchant-0015', NULL, NULL); + +SET search_path TO merchant; + +ALTER TABLE merchant_kyc + ADD last_rule_gen INT8 NOT NULL DEFAULT (0); + +COMMENT ON COLUMN merchant_kyc.last_rule_gen + IS 'Row ID from the exchange identifying the last decision change to KYC rules on this account. To be used when long-polling to ask for changes. 0 if no custom decisions were taken for the account'; + +COMMIT; diff --git a/src/backenddb/pg_account_kyc_set_status.c b/src/backenddb/pg_account_kyc_set_status.c @@ -36,6 +36,7 @@ TMH_PG_account_kyc_set_status ( struct GNUNET_TIME_Timestamp timestamp, unsigned int exchange_http_status, enum TALER_ErrorCode exchange_ec_code, + uint64_t rule_gen, const struct TALER_AccountAccessTokenP *access_token, const json_t *jlimits, bool in_aml_review, @@ -74,6 +75,7 @@ TMH_PG_account_kyc_set_status ( GNUNET_PQ_query_param_bool (kyc_ok), GNUNET_PQ_query_param_string (notify_s), GNUNET_PQ_query_param_string (notify2_s), + GNUNET_PQ_query_param_uint64 (&rule_gen), GNUNET_PQ_query_param_end }; bool no_instance; @@ -94,7 +96,7 @@ TMH_PG_account_kyc_set_status ( " out_no_instance AS no_instance" " ,out_no_account AS no_account" " FROM merchant_do_account_kyc_set_status" - "($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12);"); + "($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13);"); qs = GNUNET_PQ_eval_prepared_singleton_select ( pg->conn, "account_kyc_set_status", diff --git a/src/backenddb/pg_account_kyc_set_status.h b/src/backenddb/pg_account_kyc_set_status.h @@ -35,6 +35,8 @@ * @param timestamp timestamp to store * @param exchange_http_status HTTP status code returned last by the exchange * @param exchange_ec_code Taler error code returned last by the exchange + * @param rule_gen generation of the rule in the exchange database + * (useful for long-polling to wait for rule changes) * @param access_token access token for the KYC process, NULL for none * @param jlimits JSON array with AccountLimits returned by the exchange * @param in_aml_review true if the exchange says the account is under review @@ -50,6 +52,7 @@ TMH_PG_account_kyc_set_status ( struct GNUNET_TIME_Timestamp timestamp, unsigned int exchange_http_status, enum TALER_ErrorCode exchange_ec_code, + uint64_t rule_gen, const struct TALER_AccountAccessTokenP *access_token, const json_t *jlimits, bool in_aml_review, diff --git a/src/backenddb/pg_account_kyc_set_status.sql b/src/backenddb/pg_account_kyc_set_status.sql @@ -30,6 +30,7 @@ CREATE FUNCTION merchant_do_account_kyc_set_status ( IN in_kyc_ok BOOL, IN in_notify_str TEXT, IN in_notify2_str TEXT, + IN in_rule_gen INT8, OUT out_no_instance BOOL, OUT out_no_account BOOL) LANGUAGE plpgsql @@ -74,6 +75,7 @@ UPDATE merchant_kyc ,exchange_http_status=in_exchange_http_status ,exchange_ec_code=in_exchange_ec_code ,access_token=in_access_token + ,last_rule_gen=in_rule_gen WHERE account_serial=my_account_serial AND exchange_url=in_exchange_url; @@ -89,7 +91,8 @@ THEN ,aml_review ,exchange_http_status ,exchange_ec_code - ,access_token) + ,access_token + ,last_rule_gen) VALUES (in_timestamp ,in_kyc_ok @@ -99,7 +102,8 @@ THEN ,in_aml_active ,in_exchange_http_status ,in_exchange_ec_code - ,in_access_token); + ,in_access_token + ,in_rule_gen); END IF; EXECUTE FORMAT ( diff --git a/src/backenddb/pg_get_kyc_status.c b/src/backenddb/pg_get_kyc_status.c @@ -37,6 +37,7 @@ TMH_PG_get_kyc_status ( bool *kyc_ok, unsigned int *last_http_status, enum TALER_ErrorCode *last_ec, + uint64_t *rule_gen, struct GNUNET_TIME_Timestamp *last_kyc_check, bool *aml_review, json_t **jlimits) @@ -60,6 +61,8 @@ TMH_PG_get_kyc_status ( &h32), GNUNET_PQ_result_spec_uint32 ("exchange_ec_code", &e32), + GNUNET_PQ_result_spec_uint64 ("last_rule_gen", + rule_gen), GNUNET_PQ_result_spec_bool ("kyc_ok", kyc_ok), GNUNET_PQ_result_spec_timestamp ("kyc_timestamp", @@ -82,6 +85,7 @@ TMH_PG_get_kyc_status ( ",mk.exchange_http_status" ",mk.exchange_ec_code" ",mk.kyc_ok" + ",mk.last_rule_gen" ",mk.kyc_timestamp" ",mk.aml_review" ",mk.jaccount_limits" diff --git a/src/backenddb/pg_get_kyc_status.h b/src/backenddb/pg_get_kyc_status.h @@ -38,6 +38,9 @@ * @param[out] kyc_ok true if no urgent KYC work must be done for this account * @param[out] last_http_status set to last HTTP status from exchange on /kyc-check * @param[out] last_ec set to last Taler error code from exchange on /kyc-check + * @param[out] rule_gen set to decision row at the exchange, 0 if no + * known decision of the exchange exists for this record; used + * for long-polling for changes to exchange decisions * @param[out] last_kyc_check set to time of last KYC check * @param[out] aml_review set to true if the account is under AML review (if this exposed) * @param[out] jlimits set to JSON array with AccountLimits, NULL if unknown (and likely defaults apply or KYC auth is urgently needed, see @a auth_ok) @@ -54,6 +57,7 @@ TMH_PG_get_kyc_status ( bool *kyc_ok, unsigned int *last_http_status, enum TALER_ErrorCode *last_ec, + uint64_t *rule_gen, struct GNUNET_TIME_Timestamp *last_kyc_check, bool *aml_review, json_t **jlimits); diff --git a/src/backenddb/test_merchantdb.c b/src/backenddb/test_merchantdb.c @@ -5675,6 +5675,7 @@ test_kyc (void) now, MHD_HTTP_OK, TALER_EC_NONE, + 42, NULL, NULL, false, @@ -5687,6 +5688,7 @@ test_kyc (void) now, MHD_HTTP_OK, TALER_EC_NONE, + 42, NULL, NULL, false, @@ -5699,6 +5701,7 @@ test_kyc (void) now, MHD_HTTP_OK, TALER_EC_NONE, + 42, NULL, NULL, false, diff --git a/src/include/taler_merchantdb_plugin.h b/src/include/taler_merchantdb_plugin.h @@ -1363,7 +1363,7 @@ struct TALER_MERCHANTDB_Plugin * @param cls closure */ enum GNUNET_GenericReturnValue - (*connect)(void *cls); + (*connect)(void *cls); /** * Drop merchant tables. Used for testcases and to reset the DB. @@ -1372,7 +1372,7 @@ struct TALER_MERCHANTDB_Plugin * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure */ enum GNUNET_GenericReturnValue - (*drop_tables)(void *cls); + (*drop_tables)(void *cls); /** * Garbage collect database. Removes unnecessary data. @@ -1381,7 +1381,7 @@ struct TALER_MERCHANTDB_Plugin * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure */ enum GNUNET_GenericReturnValue - (*gc)(void *cls); + (*gc)(void *cls); /** * Initialize merchant tables @@ -1390,7 +1390,7 @@ struct TALER_MERCHANTDB_Plugin * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure */ enum GNUNET_GenericReturnValue - (*create_tables)(void *cls); + (*create_tables)(void *cls); /** * Register callback to be invoked on events of type @a es. @@ -1453,8 +1453,8 @@ struct TALER_MERCHANTDB_Plugin * @return #GNUNET_OK on success */ enum GNUNET_GenericReturnValue - (*start)(void *cls, - const char *name); + (*start)(void *cls, + const char *name); /** * Start a transaction with isolation level 'read committed'. @@ -1465,8 +1465,8 @@ struct TALER_MERCHANTDB_Plugin * @return #GNUNET_OK on success */ enum GNUNET_GenericReturnValue - (*start_read_committed)(void *cls, - const char *name); + (*start_read_committed)(void *cls, + const char *name); /** * Roll back the current transaction of a database connection. @@ -1483,7 +1483,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*commit)(void *cls); + (*commit)(void *cls); /** * Lookup all of the instances this backend has configured. @@ -1494,10 +1494,10 @@ struct TALER_MERCHANTDB_Plugin * @param cb_cls closure for @a cb */ enum GNUNET_DB_QueryStatus - (*lookup_instances)(void *cls, - bool active_only, - TALER_MERCHANTDB_InstanceCallback cb, - void *cb_cls); + (*lookup_instances)(void *cls, + bool active_only, + TALER_MERCHANTDB_InstanceCallback cb, + void *cb_cls); /** * Lookup one of the instances this backend has configured. @@ -1509,11 +1509,11 @@ struct TALER_MERCHANTDB_Plugin * @param cb_cls closure for @a cb */ enum GNUNET_DB_QueryStatus - (*lookup_instance)(void *cls, - const char *id, - bool active_only, - TALER_MERCHANTDB_InstanceCallback cb, - void *cb_cls); + (*lookup_instance)(void *cls, + const char *id, + bool active_only, + TALER_MERCHANTDB_InstanceCallback cb, + void *cb_cls); /** * Lookup authentication data of an instance. @@ -1523,9 +1523,9 @@ struct TALER_MERCHANTDB_Plugin * @param[out] ias where to store the auth data */ enum GNUNET_DB_QueryStatus - (*lookup_instance_auth)(void *cls, - const char *instance_id, - struct TALER_MERCHANTDB_InstanceAuthSettings *ias); + (*lookup_instance_auth)(void *cls, + const char *instance_id, + struct TALER_MERCHANTDB_InstanceAuthSettings *ias); /** @@ -1538,11 +1538,11 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*insert_instance)(void *cls, - const struct TALER_MerchantPublicKeyP *merchant_pub, - const struct TALER_MerchantPrivateKeyP *merchant_priv, - const struct TALER_MERCHANTDB_InstanceSettings *is, - const struct TALER_MERCHANTDB_InstanceAuthSettings *ias); + (*insert_instance)(void *cls, + const struct TALER_MerchantPublicKeyP *merchant_pub, + const struct TALER_MerchantPrivateKeyP *merchant_priv, + const struct TALER_MERCHANTDB_InstanceSettings *is, + const struct TALER_MERCHANTDB_InstanceAuthSettings *ias); /** * Insert information about an instance's account into our database. @@ -1552,7 +1552,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*insert_account)( + (*insert_account)( void *cls, const struct TALER_MERCHANTDB_AccountDetails *account_details); @@ -1569,7 +1569,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*insert_login_token)( + (*insert_login_token)( void *cls, const char *id, const struct TALER_MERCHANTDB_LoginTokenP *token, @@ -1589,7 +1589,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*select_login_token)( + (*select_login_token)( void *cls, const char *id, const struct TALER_MERCHANTDB_LoginTokenP *token, @@ -1606,7 +1606,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*delete_login_token)( + (*delete_login_token)( void *cls, const char *id, const struct TALER_MERCHANTDB_LoginTokenP *token); @@ -1623,7 +1623,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*update_account)( + (*update_account)( void *cls, const char *id, const struct TALER_MerchantWireHashP *h_wire, @@ -1641,7 +1641,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*select_accounts)( + (*select_accounts)( void *cls, const char *id, TALER_MERCHANTDB_AccountCallback cb, @@ -1658,7 +1658,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*select_account)( + (*select_account)( void *cls, const char *id, const struct TALER_MerchantWireHashP *h_wire, @@ -1675,7 +1675,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*select_account_by_uri)( + (*select_account_by_uri)( void *cls, const char *id, struct TALER_FullPayto payto_uri, @@ -1690,7 +1690,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*delete_instance_private_key)( + (*delete_instance_private_key)( void *cls, const char *merchant_id); @@ -1703,8 +1703,8 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*purge_instance)(void *cls, - const char *merchant_id); + (*purge_instance)(void *cls, + const char *merchant_id); /** * Update information about an instance into our database. @@ -1714,8 +1714,8 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*update_instance)(void *cls, - const struct TALER_MERCHANTDB_InstanceSettings *is); + (*update_instance)(void *cls, + const struct TALER_MERCHANTDB_InstanceSettings *is); /** * Update information about an instance's authentication settings @@ -1727,7 +1727,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*update_instance_auth)( + (*update_instance_auth)( void *cls, const char *merchant_id, const struct TALER_MERCHANTDB_InstanceAuthSettings *ias); @@ -1741,9 +1741,9 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*inactivate_account)(void *cls, - const char *merchant_id, - const struct TALER_MerchantWireHashP *h_wire); + (*inactivate_account)(void *cls, + const char *merchant_id, + const struct TALER_MerchantWireHashP *h_wire); /** @@ -1755,9 +1755,9 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*activate_account)(void *cls, - const char *merchant_id, - const struct TALER_MerchantWireHashP *h_wire); + (*activate_account)(void *cls, + const char *merchant_id, + const struct TALER_MerchantWireHashP *h_wire); /** @@ -1774,7 +1774,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*account_kyc_get_status)( + (*account_kyc_get_status)( void *cls, const char *merchant_id, const struct TALER_MerchantWireHashP *h_wire, @@ -1794,13 +1794,16 @@ struct TALER_MERCHANTDB_Plugin * @param[out] kyc_ok true if no urgent KYC work must be done for this account * @param[out] last_http_status set to last HTTP status from exchange on /kyc-check * @param[out] last_ec set to last Taler error code from exchange on /kyc-check + * @param[out] rule_gen set to decision row at the exchange, 0 if no + * known decision of the exchange exists for this record; used + * for long-polling for changes to exchange decisions * @param[out] last_kyc_check set to time of last KYC check * @param[out] aml_review set to true if the account is under AML review (if this exposed) * @param[out] jlimits set to JSON array with AccountLimits, NULL if unknown (and likely defaults apply or KYC auth is urgently needed, see @a auth_ok) * @return database result code */ enum GNUNET_DB_QueryStatus - (*get_kyc_status)( + (*get_kyc_status)( void *cls, struct TALER_FullPayto merchant_account_uri, const char *instance_id, @@ -1810,6 +1813,7 @@ struct TALER_MERCHANTDB_Plugin bool *kyc_ok, unsigned int *last_http_status, enum TALER_ErrorCode *last_ec, + uint64_t *rule_gen, struct GNUNET_TIME_Timestamp *last_kyc_check, bool *aml_review, json_t **jlimits); @@ -1828,7 +1832,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*get_kyc_limits)( + (*get_kyc_limits)( void *cls, struct TALER_FullPayto merchant_account_uri, const char *instance_id, @@ -1848,6 +1852,8 @@ struct TALER_MERCHANTDB_Plugin * @param timestamp timestamp to store * @param exchange_http_status HTTP status code returned last by the exchange * @param exchange_ec_code Taler error code returned last by the exchange + * @param rule_gen generation of the rule in the exchange database + * (useful for long-polling to wait for rule changes) * @param access_token access token for the KYC process, NULL for none * @param jlimits JSON array with AccountLimits returned by the exchange * @param in_aml_review true if the exchange says the account is under review @@ -1855,7 +1861,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*account_kyc_set_status)( + (*account_kyc_set_status)( void *cls, const char *merchant_id, const struct TALER_MerchantWireHashP *h_wire, @@ -1863,6 +1869,7 @@ struct TALER_MERCHANTDB_Plugin struct GNUNET_TIME_Timestamp timestamp, unsigned int exchange_http_status, enum TALER_ErrorCode exchange_ec_code, + uint64_t rule_gen, const struct TALER_AccountAccessTokenP *access_token, const json_t *jlimits, bool in_aml_review, @@ -1882,7 +1889,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*account_kyc_set_failed)( + (*account_kyc_set_failed)( void *cls, const char *merchant_id, const struct TALER_MerchantWireHashP *h_wire, @@ -1905,12 +1912,12 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*lookup_products)(void *cls, - const char *instance_id, - uint64_t offset, - int64_t limit, - TALER_MERCHANTDB_ProductsCallback cb, - void *cb_cls); + (*lookup_products)(void *cls, + const char *instance_id, + uint64_t offset, + int64_t limit, + TALER_MERCHANTDB_ProductsCallback cb, + void *cb_cls); /** @@ -1923,10 +1930,10 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*lookup_all_products)(void *cls, - const char *instance_id, - TALER_MERCHANTDB_ProductCallback cb, - void *cb_cls); + (*lookup_all_products)(void *cls, + const char *instance_id, + TALER_MERCHANTDB_ProductCallback cb, + void *cb_cls); /** * Lookup details about a particular product. @@ -1942,12 +1949,12 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*lookup_product)(void *cls, - const char *instance_id, - const char *product_id, - struct TALER_MERCHANTDB_ProductDetails *pd, - size_t *num_categories, - uint64_t **categories); + (*lookup_product)(void *cls, + const char *instance_id, + const char *product_id, + struct TALER_MERCHANTDB_ProductDetails *pd, + size_t *num_categories, + uint64_t **categories); /** * Delete information about a product. Note that the transaction must @@ -1960,9 +1967,9 @@ struct TALER_MERCHANTDB_Plugin * if locks prevent deletion OR product unknown */ enum GNUNET_DB_QueryStatus - (*delete_product)(void *cls, - const char *instance_id, - const char *product_id); + (*delete_product)(void *cls, + const char *instance_id, + const char *product_id); /** * Insert details about a particular product. @@ -1980,15 +1987,15 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*insert_product)(void *cls, - const char *instance_id, - const char *product_id, - const struct TALER_MERCHANTDB_ProductDetails *pd, - size_t num_cats, - const uint64_t *cats, - bool *no_instance, - bool *conflict, - ssize_t *no_cat); + (*insert_product)(void *cls, + const char *instance_id, + const char *product_id, + const struct TALER_MERCHANTDB_ProductDetails *pd, + size_t num_cats, + const uint64_t *cats, + bool *no_instance, + bool *conflict, + ssize_t *no_cat); /** * Update details about a particular product. Note that the @@ -2012,18 +2019,18 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*update_product)(void *cls, - const char *instance_id, - const char *product_id, - const struct TALER_MERCHANTDB_ProductDetails *pd, - size_t num_cats, - const uint64_t *cats, - bool *no_instance, - ssize_t *no_cat, - bool *no_product, - bool *lost_reduced, - bool *sold_reduced, - bool *stocked_reduced); + (*update_product)(void *cls, + const char *instance_id, + const char *product_id, + const struct TALER_MERCHANTDB_ProductDetails *pd, + size_t num_cats, + const uint64_t *cats, + bool *no_instance, + ssize_t *no_cat, + bool *no_product, + bool *lost_reduced, + bool *sold_reduced, + bool *stocked_reduced); /** * Lock stocks of a particular product. Note that the transaction must @@ -2039,12 +2046,12 @@ struct TALER_MERCHANTDB_Plugin * product is unknown OR if there insufficient stocks remaining */ enum GNUNET_DB_QueryStatus - (*lock_product)(void *cls, - const char *instance_id, - const char *product_id, - const struct GNUNET_Uuid *uuid, - uint64_t quantity, - struct GNUNET_TIME_Timestamp expiration_time); + (*lock_product)(void *cls, + const char *instance_id, + const char *product_id, + const struct GNUNET_Uuid *uuid, + uint64_t quantity, + struct GNUNET_TIME_Timestamp expiration_time); /** @@ -2056,7 +2063,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*expire_locks)(void *cls); + (*expire_locks)(void *cls); /** @@ -2071,10 +2078,10 @@ struct TALER_MERCHANTDB_Plugin * if locks prevent deletion OR order unknown */ enum GNUNET_DB_QueryStatus - (*delete_order)(void *cls, - const char *instance_id, - const char *order_id, - bool force); + (*delete_order)(void *cls, + const char *instance_id, + const char *order_id, + bool force); /** @@ -2091,12 +2098,12 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_order)(void *cls, - const char *instance_id, - const char *order_id, - struct TALER_ClaimTokenP *claim_token, - struct TALER_MerchantPostDataHashP *h_post_data, - json_t **contract_terms); + (*lookup_order)(void *cls, + const char *instance_id, + const char *order_id, + struct TALER_ClaimTokenP *claim_token, + struct TALER_MerchantPostDataHashP *h_post_data, + json_t **contract_terms); /** @@ -2110,11 +2117,11 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_order_summary)(void *cls, - const char *instance_id, - const char *order_id, - struct GNUNET_TIME_Timestamp *timestamp, - uint64_t *order_serial); + (*lookup_order_summary)(void *cls, + const char *instance_id, + const char *order_id, + struct GNUNET_TIME_Timestamp *timestamp, + uint64_t *order_serial); /** @@ -2128,11 +2135,11 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_orders)(void *cls, - const char *instance_id, - const struct TALER_MERCHANTDB_OrderFilter *of, - TALER_MERCHANTDB_OrdersCallback cb, - void *cb_cls); + (*lookup_orders)(void *cls, + const char *instance_id, + const struct TALER_MERCHANTDB_OrderFilter *of, + TALER_MERCHANTDB_OrdersCallback cb, + void *cb_cls); /** @@ -2151,16 +2158,16 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*insert_order)(void *cls, - const char *instance_id, - const char *order_id, - const char *session_id, - const struct TALER_MerchantPostDataHashP *h_post_data, - struct GNUNET_TIME_Timestamp pay_deadline, - const struct TALER_ClaimTokenP *claim_token, - const json_t *contract_terms, - const char *pos_key, - enum TALER_MerchantConfirmationAlgorithm pos_algorithm); + (*insert_order)(void *cls, + const char *instance_id, + const char *order_id, + const char *session_id, + const struct TALER_MerchantPostDataHashP *h_post_data, + struct GNUNET_TIME_Timestamp pay_deadline, + const struct TALER_ClaimTokenP *claim_token, + const json_t *contract_terms, + const char *pos_key, + enum TALER_MerchantConfirmationAlgorithm pos_algorithm); /** @@ -2184,8 +2191,8 @@ struct TALER_MERCHANTDB_Plugin * #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT indicates success */ enum GNUNET_DB_QueryStatus - (*unlock_inventory)(void *cls, - const struct GNUNET_Uuid *uuid); + (*unlock_inventory)(void *cls, + const struct GNUNET_Uuid *uuid); /** @@ -2201,11 +2208,11 @@ struct TALER_MERCHANTDB_Plugin * #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT indicates success */ enum GNUNET_DB_QueryStatus - (*insert_order_lock)(void *cls, - const char *instance_id, - const char *order_id, - const char *product_id, - uint64_t quantity); + (*insert_order_lock)(void *cls, + const char *instance_id, + const char *order_id, + const char *product_id, + uint64_t quantity); /** @@ -2223,7 +2230,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_contract_terms2)( + (*lookup_contract_terms2)( void *cls, const char *instance_id, const char *order_id, @@ -2252,7 +2259,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_contract_terms3)( + (*lookup_contract_terms3)( void *cls, const char *instance_id, const char *order_id, @@ -2278,7 +2285,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_contract_terms)( + (*lookup_contract_terms)( void *cls, const char *instance_id, const char *order_id, @@ -2304,7 +2311,7 @@ struct TALER_MERCHANTDB_Plugin * is malformed */ enum GNUNET_DB_QueryStatus - (*insert_contract_terms)( + (*insert_contract_terms)( void *cls, const char *instance_id, const char *order_id, @@ -2328,10 +2335,10 @@ struct TALER_MERCHANTDB_Plugin * is malformed */ enum GNUNET_DB_QueryStatus - (*update_contract_terms)(void *cls, - const char *instance_id, - const char *order_id, - json_t *contract_terms); + (*update_contract_terms)(void *cls, + const char *instance_id, + const char *order_id, + json_t *contract_terms); /** @@ -2348,10 +2355,10 @@ struct TALER_MERCHANTDB_Plugin * if locks prevent deletion OR order unknown */ enum GNUNET_DB_QueryStatus - (*delete_contract_terms)(void *cls, - const char *instance_id, - const char *order_id, - struct GNUNET_TIME_Relative legal_expiration); + (*delete_contract_terms)(void *cls, + const char *instance_id, + const char *order_id, + struct GNUNET_TIME_Relative legal_expiration); /** @@ -2366,12 +2373,12 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_deposits)(void *cls, - const char *instance_id, - const struct TALER_PrivateContractHashP *h_contract_terms - , - TALER_MERCHANTDB_DepositsCallback cb, - void *cb_cls); + (*lookup_deposits)(void *cls, + const char *instance_id, + const struct TALER_PrivateContractHashP *h_contract_terms + , + TALER_MERCHANTDB_DepositsCallback cb, + void *cb_cls); /** @@ -2386,7 +2393,7 @@ struct TALER_MERCHANTDB_Plugin * @param master_sig signature of @a master_pub over the @a exchange_pub and the dates */ enum GNUNET_DB_QueryStatus - (*insert_exchange_signkey)( + (*insert_exchange_signkey)( void *cls, const struct TALER_MasterPublicKeyP *master_pub, const struct TALER_ExchangePublicKeyP *exchange_pub, @@ -2414,7 +2421,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*insert_deposit_confirmation)( + (*insert_deposit_confirmation)( void *cls, const char *instance_id, struct GNUNET_TIME_Timestamp deposit_timestamp, @@ -2444,7 +2451,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*insert_deposit)( + (*insert_deposit)( void *cls, uint32_t offset, uint64_t deposit_confirmation_serial_id, @@ -2466,11 +2473,11 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_refunds)(void *cls, - const char *instance_id, - const struct TALER_PrivateContractHashP *h_contract_terms, - TALER_MERCHANTDB_RefundCallback rc, - void *rc_cls); + (*lookup_refunds)(void *cls, + const char *instance_id, + const struct TALER_PrivateContractHashP *h_contract_terms, + TALER_MERCHANTDB_RefundCallback rc, + void *rc_cls); /** @@ -2483,10 +2490,10 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_spent_tokens_by_order)(void *cls, - uint64_t order_serial, - TALER_MERCHANTDB_UsedTokensCallback cb, - void *cb_cls); + (*lookup_spent_tokens_by_order)(void *cls, + uint64_t order_serial, + TALER_MERCHANTDB_UsedTokensCallback cb, + void *cb_cls); /** @@ -2501,7 +2508,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*mark_contract_paid)( + (*mark_contract_paid)( void *cls, const char *instance_id, const struct TALER_PrivateContractHashP *h_contract_terms, @@ -2525,12 +2532,12 @@ struct TALER_MERCHANTDB_Plugin * regardless of whether it actually increased the refund */ enum GNUNET_DB_QueryStatus - (*refund_coin)(void *cls, - const char *instance_id, - const struct TALER_PrivateContractHashP *h_contract_terms, - struct GNUNET_TIME_Timestamp refund_timestamp, - const struct TALER_CoinSpendPublicKeyP *coin_pub, - const char *reason); + (*refund_coin)(void *cls, + const char *instance_id, + const struct TALER_PrivateContractHashP *h_contract_terms, + struct GNUNET_TIME_Timestamp refund_timestamp, + const struct TALER_CoinSpendPublicKeyP *coin_pub, + const char *reason); /** @@ -2544,11 +2551,11 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_order_status)(void *cls, - const char *instance_id, - const char *order_id, - struct TALER_PrivateContractHashP *h_contract_terms, - bool *paid); + (*lookup_order_status)(void *cls, + const char *instance_id, + const char *order_id, + struct TALER_PrivateContractHashP *h_contract_terms, + bool *paid); /** * Retrieve contract terms given its @a order_serial @@ -2562,13 +2569,13 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_order_status_by_serial)(void *cls, - const char *instance_id, - uint64_t order_serial, - char **order_id, - struct TALER_PrivateContractHashP * - h_contract_terms, - bool *paid); + (*lookup_order_status_by_serial)(void *cls, + const char *instance_id, + uint64_t order_serial, + char **order_id, + struct TALER_PrivateContractHashP * + h_contract_terms, + bool *paid); /** @@ -2581,10 +2588,10 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_deposits_by_order)(void *cls, - uint64_t order_serial, - TALER_MERCHANTDB_DepositedCoinsCallback cb, - void *cb_cls); + (*lookup_deposits_by_order)(void *cls, + uint64_t order_serial, + TALER_MERCHANTDB_DepositedCoinsCallback cb, + void *cb_cls); /** @@ -2598,7 +2605,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_transfer_details_by_order)( + (*lookup_transfer_details_by_order)( void *cls, uint64_t order_serial, TALER_MERCHANTDB_OrderTransferDetailsCallback cb, @@ -2618,7 +2625,7 @@ struct TALER_MERCHANTDB_Plugin * @return database transaction status */ enum GNUNET_DB_QueryStatus - (*update_transfer_status)( + (*update_transfer_status)( void *cls, const char *exchange_url, const struct TALER_WireTransferIdentifierRawP *wtid, @@ -2639,7 +2646,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*select_open_transfers)( + (*select_open_transfers)( void *cls, uint64_t limit, TALER_MERCHANTDB_OpenTransferCallback cb, @@ -2656,10 +2663,10 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*insert_deposit_to_transfer)(void *cls, - uint64_t deposit_serial, - const struct TALER_EXCHANGE_DepositData *dd, - bool *wpc); + (*insert_deposit_to_transfer)(void *cls, + uint64_t deposit_serial, + const struct TALER_EXCHANGE_DepositData *dd, + bool *wpc); /** @@ -2670,8 +2677,8 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*mark_order_wired)(void *cls, - uint64_t order_serial); + (*mark_order_wired)(void *cls, + uint64_t order_serial); /** @@ -2697,7 +2704,7 @@ struct TALER_MERCHANTDB_Plugin * what was already refunded (idempotency!) */ enum TALER_MERCHANTDB_RefundStatus - (*increase_refund)( + (*increase_refund)( void *cls, const char *instance_id, const char *order_id, @@ -2718,7 +2725,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_refunds_detailed)( + (*lookup_refunds_detailed)( void *cls, const char *instance_id, const struct TALER_PrivateContractHashP *h_contract_terms, @@ -2735,7 +2742,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*insert_refund_proof)( + (*insert_refund_proof)( void *cls, uint64_t refund_serial, const struct TALER_ExchangeSignatureP *exchange_sig, @@ -2754,7 +2761,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*insert_spent_token)( + (*insert_spent_token)( void *cls, const struct TALER_PrivateContractHashP * h_contract_terms, @@ -2774,7 +2781,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*insert_issued_token)( + (*insert_issued_token)( void *cls, const struct TALER_PrivateContractHashP *h_contract_terms, const struct TALER_TokenIssuePublicKeyHashP *h_issue_pub, @@ -2791,7 +2798,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_refund_proof)( + (*lookup_refund_proof)( void *cls, uint64_t refund_serial, struct TALER_ExchangeSignatureP *exchange_sig, @@ -2812,7 +2819,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_order_by_fulfillment)( + (*lookup_order_by_fulfillment)( void *cls, const char *instance_id, const char *fulfillment_url, @@ -2830,7 +2837,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*update_wirewatch_progress)( + (*update_wirewatch_progress)( void *cls, const char *instance, struct TALER_FullPayto payto_uri, @@ -2846,7 +2853,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*select_wirewatch_accounts)( + (*select_wirewatch_accounts)( void *cls, TALER_MERCHANTDB_WirewatchWorkCallback cb, void *cb_cls); @@ -2866,7 +2873,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*insert_transfer)( + (*insert_transfer)( void *cls, const char *instance_id, const char *exchange_url, @@ -2887,9 +2894,9 @@ struct TALER_MERCHANTDB_Plugin * if deletion is prohibited OR transfer is unknown */ enum GNUNET_DB_QueryStatus - (*delete_transfer)(void *cls, - const char *instance_id, - uint64_t transfer_serial_id); + (*delete_transfer)(void *cls, + const char *instance_id, + uint64_t transfer_serial_id); /** @@ -2903,9 +2910,9 @@ struct TALER_MERCHANTDB_Plugin * if the transfer record exists */ enum GNUNET_DB_QueryStatus - (*check_transfer_exists)(void *cls, - const char *instance_id, - uint64_t transfer_serial_id); + (*check_transfer_exists)(void *cls, + const char *instance_id, + uint64_t transfer_serial_id); /** @@ -2918,10 +2925,10 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_account)(void *cls, - const char *instance_id, - struct TALER_FullPayto payto_uri, - uint64_t *account_serial); + (*lookup_account)(void *cls, + const char *instance_id, + struct TALER_FullPayto payto_uri, + uint64_t *account_serial); /** @@ -2938,7 +2945,7 @@ struct TALER_MERCHANTDB_Plugin * #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT on success */ enum GNUNET_DB_QueryStatus - (*insert_transfer_details)( + (*insert_transfer_details)( void *cls, const char *instance_id, const char *exchange_url, @@ -2962,7 +2969,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status code */ enum GNUNET_DB_QueryStatus - (*lookup_wire_fee)( + (*lookup_wire_fee)( void *cls, const struct TALER_MasterPublicKeyP *master_pub, const char *wire_method, @@ -2986,7 +2993,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_deposits_by_contract_and_coin)( + (*lookup_deposits_by_contract_and_coin)( void *cls, const char *instance_id, const struct TALER_PrivateContractHashP *h_contract_terms, @@ -3013,7 +3020,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_transfer)( + (*lookup_transfer)( void *cls, const char *instance_id, const char *exchange_url, @@ -3037,7 +3044,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*set_transfer_status_to_confirmed)( + (*set_transfer_status_to_confirmed)( void *cls, const char *instance_id, const char *exchange_url, @@ -3056,7 +3063,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_transfer_summary)( + (*lookup_transfer_summary)( void *cls, const char *exchange_url, const struct TALER_WireTransferIdentifierRawP *wtid, @@ -3075,7 +3082,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_transfer_details)( + (*lookup_transfer_details)( void *cls, const char *exchange_url, const struct TALER_WireTransferIdentifierRawP *wtid, @@ -3100,7 +3107,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_transfers)( + (*lookup_transfers)( void *cls, const char *instance_id, struct TALER_FullPayto payto_uri, @@ -3127,7 +3134,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status code */ enum GNUNET_DB_QueryStatus - (*store_wire_fee_by_exchange)( + (*store_wire_fee_by_exchange)( void *cls, const struct TALER_MasterPublicKeyP *master_pub, const struct GNUNET_HashCode *h_wire_method, @@ -3145,7 +3152,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status code */ enum GNUNET_DB_QueryStatus - (*delete_exchange_accounts)( + (*delete_exchange_accounts)( void *cls, const struct TALER_MasterPublicKeyP *master_pub); @@ -3160,7 +3167,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status code */ enum GNUNET_DB_QueryStatus - (*select_accounts_by_exchange)( + (*select_accounts_by_exchange)( void *cls, const struct TALER_MasterPublicKeyP *master_pub, TALER_MERCHANTDB_ExchangeAccountCallback cb, @@ -3180,7 +3187,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status code */ enum GNUNET_DB_QueryStatus - (*insert_exchange_account)( + (*insert_exchange_account)( void *cls, const struct TALER_MasterPublicKeyP *master_pub, const struct TALER_FullPayto payto_uri, @@ -3200,10 +3207,10 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*lookup_templates)(void *cls, - const char *instance_id, - TALER_MERCHANTDB_TemplatesCallback cb, - void *cb_cls); + (*lookup_templates)(void *cls, + const char *instance_id, + TALER_MERCHANTDB_TemplatesCallback cb, + void *cb_cls); /** @@ -3217,10 +3224,10 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*lookup_template)(void *cls, - const char *instance_id, - const char *template_id, - struct TALER_MERCHANTDB_TemplateDetails *td); + (*lookup_template)(void *cls, + const char *instance_id, + const char *template_id, + struct TALER_MERCHANTDB_TemplateDetails *td); /** * Delete information about a template. @@ -3232,9 +3239,9 @@ struct TALER_MERCHANTDB_Plugin * if template unknown. */ enum GNUNET_DB_QueryStatus - (*delete_template)(void *cls, - const char *instance_id, - const char *template_id); + (*delete_template)(void *cls, + const char *instance_id, + const char *template_id); /** @@ -3248,11 +3255,11 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*insert_template)(void *cls, - const char *instance_id, - const char *template_id, - uint64_t otp_serial_id, - const struct TALER_MERCHANTDB_TemplateDetails *td); + (*insert_template)(void *cls, + const char *instance_id, + const char *template_id, + uint64_t otp_serial_id, + const struct TALER_MERCHANTDB_TemplateDetails *td); /** @@ -3267,10 +3274,10 @@ struct TALER_MERCHANTDB_Plugin * does not yet exist. */ enum GNUNET_DB_QueryStatus - (*update_template)(void *cls, - const char *instance_id, - const char *template_id, - const struct TALER_MERCHANTDB_TemplateDetails *td); + (*update_template)(void *cls, + const char *instance_id, + const char *template_id, + const struct TALER_MERCHANTDB_TemplateDetails *td); /** @@ -3283,9 +3290,9 @@ struct TALER_MERCHANTDB_Plugin * if template unknown. */ enum GNUNET_DB_QueryStatus - (*delete_otp)(void *cls, - const char *instance_id, - const char *otp_id); + (*delete_otp)(void *cls, + const char *instance_id, + const char *otp_id); /** * Insert details about a particular OTP device. @@ -3297,10 +3304,10 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*insert_otp)(void *cls, - const char *instance_id, - const char *otp_id, - const struct TALER_MERCHANTDB_OtpDeviceDetails *td); + (*insert_otp)(void *cls, + const char *instance_id, + const char *otp_id, + const struct TALER_MERCHANTDB_OtpDeviceDetails *td); /** @@ -3315,10 +3322,10 @@ struct TALER_MERCHANTDB_Plugin * does not yet exist. */ enum GNUNET_DB_QueryStatus - (*update_otp)(void *cls, - const char *instance_id, - const char *otp_id, - const struct TALER_MERCHANTDB_OtpDeviceDetails *td); + (*update_otp)(void *cls, + const char *instance_id, + const char *otp_id, + const struct TALER_MERCHANTDB_OtpDeviceDetails *td); /** * Lookup all of the OTP devices the given instance has configured. @@ -3330,10 +3337,10 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*lookup_otp_devices)(void *cls, - const char *instance_id, - TALER_MERCHANTDB_OtpDeviceCallback cb, - void *cb_cls); + (*lookup_otp_devices)(void *cls, + const char *instance_id, + TALER_MERCHANTDB_OtpDeviceCallback cb, + void *cb_cls); /** @@ -3347,10 +3354,10 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*select_otp)(void *cls, - const char *instance_id, - const char *otp_id, - struct TALER_MERCHANTDB_OtpDeviceDetails *td); + (*select_otp)(void *cls, + const char *instance_id, + const char *otp_id, + struct TALER_MERCHANTDB_OtpDeviceDetails *td); /** @@ -3362,10 +3369,10 @@ struct TALER_MERCHANTDB_Plugin * @param[out] serial set to the OTP device serial number * @return database result code */ enum GNUNET_DB_QueryStatus - (*select_otp_serial)(void *cls, - const char *instance_id, - const char *otp_id, - uint64_t *serial); + (*select_otp_serial)(void *cls, + const char *instance_id, + const char *otp_id, + uint64_t *serial); /** @@ -3378,9 +3385,9 @@ struct TALER_MERCHANTDB_Plugin * if template unknown. */ enum GNUNET_DB_QueryStatus - (*delete_category)(void *cls, - const char *instance_id, - uint64_t category_id); + (*delete_category)(void *cls, + const char *instance_id, + uint64_t category_id); /** * Insert new product category. @@ -3393,11 +3400,11 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*insert_category)(void *cls, - const char *instance_id, - const char *category_name, - const json_t *category_name_i18n, - uint64_t *category_id); + (*insert_category)(void *cls, + const char *instance_id, + const char *category_name, + const json_t *category_name_i18n, + uint64_t *category_id); /** @@ -3412,11 +3419,11 @@ struct TALER_MERCHANTDB_Plugin * does not yet exist. */ enum GNUNET_DB_QueryStatus - (*update_category)(void *cls, - const char *instance_id, - uint64_t category_id, - const char *category_name, - const json_t *category_name_i18n); + (*update_category)(void *cls, + const char *instance_id, + uint64_t category_id, + const char *category_name, + const json_t *category_name_i18n); /** * Lookup all of the product categories the given instance has configured. @@ -3428,10 +3435,10 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*lookup_categories)(void *cls, - const char *instance_id, - TALER_MERCHANTDB_CategoriesCallback cb, - void *cb_cls); + (*lookup_categories)(void *cls, + const char *instance_id, + TALER_MERCHANTDB_CategoriesCallback cb, + void *cb_cls); /** @@ -3447,12 +3454,12 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*select_category)(void *cls, - const char *instance_id, - uint64_t category_id, - struct TALER_MERCHANTDB_CategoryDetails *cd, - size_t *num_products, - char **products); + (*select_category)(void *cls, + const char *instance_id, + uint64_t category_id, + struct TALER_MERCHANTDB_CategoryDetails *cd, + size_t *num_products, + char **products); /** @@ -3466,11 +3473,11 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*select_category_by_name)(void *cls, - const char *instance_id, - const char *category_name, - json_t **name_i18n, - uint64_t *category_id); + (*select_category_by_name)(void *cls, + const char *instance_id, + const char *category_name, + json_t **name_i18n, + uint64_t *category_id); /** @@ -3483,10 +3490,10 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*lookup_webhooks)(void *cls, - const char *instance_id, - TALER_MERCHANTDB_WebhooksCallback cb, - void *cb_cls); + (*lookup_webhooks)(void *cls, + const char *instance_id, + TALER_MERCHANTDB_WebhooksCallback cb, + void *cb_cls); /** @@ -3500,10 +3507,10 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*lookup_webhook)(void *cls, - const char *instance_id, - const char *webhook_id, - struct TALER_MERCHANTDB_WebhookDetails *wb); + (*lookup_webhook)(void *cls, + const char *instance_id, + const char *webhook_id, + struct TALER_MERCHANTDB_WebhookDetails *wb); /** * Delete information about a webhook. @@ -3515,9 +3522,9 @@ struct TALER_MERCHANTDB_Plugin * if webhook unknown. */ enum GNUNET_DB_QueryStatus - (*delete_webhook)(void *cls, - const char *instance_id, - const char *webhook_id); + (*delete_webhook)(void *cls, + const char *instance_id, + const char *webhook_id); /** @@ -3530,10 +3537,10 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*insert_webhook)(void *cls, - const char *instance_id, - const char *webhook_id, - const struct TALER_MERCHANTDB_WebhookDetails *wb); + (*insert_webhook)(void *cls, + const char *instance_id, + const char *webhook_id, + const struct TALER_MERCHANTDB_WebhookDetails *wb); /** @@ -3548,10 +3555,10 @@ struct TALER_MERCHANTDB_Plugin * does not yet exist. */ enum GNUNET_DB_QueryStatus - (*update_webhook)(void *cls, - const char *instance_id, - const char *webhook_id, - const struct TALER_MERCHANTDB_WebhookDetails *wb); + (*update_webhook)(void *cls, + const char *instance_id, + const char *webhook_id, + const struct TALER_MERCHANTDB_WebhookDetails *wb); /** * Lookup webhook by event @@ -3564,11 +3571,11 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*lookup_webhook_by_event)(void *cls, - const char *instance_id, - const char *event_type, - TALER_MERCHANTDB_WebhookDetailCallback cb, - void *cb_cls); + (*lookup_webhook_by_event)(void *cls, + const char *instance_id, + const char *event_type, + TALER_MERCHANTDB_WebhookDetailCallback cb, + void *cb_cls); /** * Insert webhook in the pending webhook. @@ -3583,13 +3590,13 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*insert_pending_webhook)(void *cls, - const char *instance_id, - uint64_t webhook_serial, - const char *url, - const char *http_method, - const char *header, - const char *body); + (*insert_pending_webhook)(void *cls, + const char *instance_id, + uint64_t webhook_serial, + const char *url, + const char *http_method, + const char *header, + const char *body); /** * Lookup the webhook that need to be send in priority. These webhooks are not successfully * send. @@ -3600,9 +3607,9 @@ struct TALER_MERCHANTDB_Plugin */ // WHERE next_attempt <= now ORDER BY next_attempt ASC enum GNUNET_DB_QueryStatus - (*lookup_pending_webhooks)(void *cls, - TALER_MERCHANTDB_PendingWebhooksCallback cb, - void *cb_cls); + (*lookup_pending_webhooks)(void *cls, + TALER_MERCHANTDB_PendingWebhooksCallback cb, + void *cb_cls); /** * Lookup future webhook in the pending webhook that need to be send. @@ -3614,9 +3621,9 @@ struct TALER_MERCHANTDB_Plugin */ // ORDER BY next_attempt ASC LIMIT 1 enum GNUNET_DB_QueryStatus - (*lookup_future_webhook)(void *cls, - TALER_MERCHANTDB_PendingWebhooksCallback cb, - void *cb_cls); + (*lookup_future_webhook)(void *cls, + TALER_MERCHANTDB_PendingWebhooksCallback cb, + void *cb_cls); /** * Lookup all the webhooks in the pending webhook. @@ -3631,12 +3638,12 @@ struct TALER_MERCHANTDB_Plugin */ // WHERE webhook_pending_serial > min_row ORDER BY webhook_pending_serial ASC LIMIT max_results enum GNUNET_DB_QueryStatus - (*lookup_all_webhooks)(void *cls, - const char *instance_id, - uint64_t min_row, - uint32_t max_results, - TALER_MERCHANTDB_PendingWebhooksCallback cb, - void *cb_cls); + (*lookup_all_webhooks)(void *cls, + const char *instance_id, + uint64_t min_row, + uint32_t max_results, + TALER_MERCHANTDB_PendingWebhooksCallback cb, + void *cb_cls); /** @@ -3648,9 +3655,9 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*update_pending_webhook)(void *cls, - uint64_t webhook_pending_serial, - struct GNUNET_TIME_Absolute next_attempt); + (*update_pending_webhook)(void *cls, + uint64_t webhook_pending_serial, + struct GNUNET_TIME_Absolute next_attempt); // maybe add: http status of failure? @@ -3663,8 +3670,8 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*delete_pending_webhook)(void *cls, - uint64_t webhook_pending_serial); + (*delete_pending_webhook)(void *cls, + uint64_t webhook_pending_serial); /** @@ -3676,9 +3683,9 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*select_exchange_keys)(void *cls, - const char *exchange_url, - struct TALER_EXCHANGE_Keys **keys); + (*select_exchange_keys)(void *cls, + const char *exchange_url, + struct TALER_EXCHANGE_Keys **keys); /** @@ -3689,8 +3696,8 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*insert_exchange_keys)(void *cls, - const struct TALER_EXCHANGE_Keys *keys); + (*insert_exchange_keys)(void *cls, + const struct TALER_EXCHANGE_Keys *keys); /** @@ -3703,10 +3710,10 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*lookup_token_families)(void *cls, - const char *instance_id, - TALER_MERCHANTDB_TokenFamiliesCallback cb, - void *cb_cls); + (*lookup_token_families)(void *cls, + const char *instance_id, + TALER_MERCHANTDB_TokenFamiliesCallback cb, + void *cb_cls); /** * Lookup details about a particular token family. @@ -3719,10 +3726,10 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*lookup_token_family)(void *cls, - const char *instance_id, - const char *token_family_slug, - struct TALER_MERCHANTDB_TokenFamilyDetails *details); + (*lookup_token_family)(void *cls, + const char *instance_id, + const char *token_family_slug, + struct TALER_MERCHANTDB_TokenFamilyDetails *details); /** * Delete information about a token family. @@ -3733,9 +3740,9 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*delete_token_family)(void *cls, - const char *instance_id, - const char *token_family_slug); + (*delete_token_family)(void *cls, + const char *instance_id, + const char *token_family_slug); /** * Update details about a particular token family. @@ -3748,7 +3755,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*update_token_family)( + (*update_token_family)( void *cls, const char *instance_id, const char *token_family_slug, @@ -3765,7 +3772,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*insert_token_family)( + (*insert_token_family)( void *cls, const char *instance_id, const char *token_family_slug, @@ -3785,7 +3792,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*lookup_token_family_key)( + (*lookup_token_family_key)( void *cls, const char *instance_id, const char *token_family_slug, @@ -3807,7 +3814,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*lookup_token_family_keys)( + (*lookup_token_family_keys)( void *cls, const char *instance_id, const char *token_family_slug, @@ -3832,7 +3839,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*insert_token_family_key)( + (*insert_token_family_key)( void *cls, const char *merchant_id, const char *token_family_slug, @@ -3854,7 +3861,7 @@ struct TALER_MERCHANTDB_Plugin * @return transaction status */ enum GNUNET_DB_QueryStatus - (*lookup_pending_deposits)( + (*lookup_pending_deposits)( void *cls, const char *exchange_url, uint64_t limit, @@ -3876,7 +3883,7 @@ struct TALER_MERCHANTDB_Plugin * @return database result code */ enum GNUNET_DB_QueryStatus - (*update_deposit_confirmation_status)( + (*update_deposit_confirmation_status)( void *cls, uint64_t deposit_serial, bool wire_pending,