From 696278ce80c7613e39c24e138dd6c99116080adb Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 25 Aug 2021 17:23:35 +0200 Subject: complete implementation of #6956: long polling triggers via database backend --- src/backenddb/plugin_merchantdb_postgres.c | 69 +++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) (limited to 'src/backenddb') diff --git a/src/backenddb/plugin_merchantdb_postgres.c b/src/backenddb/plugin_merchantdb_postgres.c index 3036a439..d56c4b8b 100644 --- a/src/backenddb/plugin_merchantdb_postgres.c +++ b/src/backenddb/plugin_merchantdb_postgres.c @@ -2500,6 +2500,56 @@ postgres_lookup_order_status (void *cls, } +/** + * Retrieve contract terms given its @a order_serial + * + * @param cls closure + * @param instance_id instance's identifier + * @param order_serial serial ID of the order to look up + * @param[out] order_id set to ID of the order + * @param[out] h_contract_terms set to the hash of the contract. + * @param[out] paid set to the payment status of the contract + * @return transaction status + */ +static enum GNUNET_DB_QueryStatus +postgres_lookup_order_status_by_serial (void *cls, + const char *instance_id, + uint64_t order_serial, + char **order_id, + struct GNUNET_HashCode *h_contract_terms, + bool *paid) +{ + struct PostgresClosure *pg = cls; + uint8_t paid8; + enum GNUNET_DB_QueryStatus qs; + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_string (instance_id), + GNUNET_PQ_query_param_uint64 (&order_serial), + GNUNET_PQ_query_param_end + }; + struct GNUNET_PQ_ResultSpec rs[] = { + GNUNET_PQ_result_spec_auto_from_type ("h_contract_terms", + h_contract_terms), + GNUNET_PQ_result_spec_auto_from_type ("paid", + &paid8), + GNUNET_PQ_result_spec_string ("order_id", + order_id), + GNUNET_PQ_result_spec_end + }; + + check_connection (pg); + qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn, + "lookup_order_status_by_serial", + params, + rs); + if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs) + *paid = (0 != paid8); + else + *paid = false; /* just to be safe(r) */ + return qs; +} + + /** * Retrieve payment and wire status for a given @a order_serial and session ID. * @@ -7898,12 +7948,27 @@ postgres_connect (void *cls) " h_contract_terms" ",paid" " FROM merchant_contract_terms" - " WHERE merchant_contract_terms.merchant_serial=" + " WHERE merchant_serial=" " (SELECT merchant_serial " " FROM merchant_instances" " WHERE merchant_id=$1)" " AND order_id=$2", 2), + + /* for postgres_lookup_order_status_by_serial() */ + GNUNET_PQ_make_prepare ("lookup_order_status_by_serial", + "SELECT" + " h_contract_terms" + ",order_id" + ",paid" + " FROM merchant_contract_terms" + " WHERE merchant_serial=" + " (SELECT merchant_serial " + " FROM merchant_instances" + " WHERE merchant_id=$1)" + " AND order_serial=$2", + 2), + /* for postgres_lookup_payment_status() */ GNUNET_PQ_make_prepare ("lookup_payment_status", "SELECT" @@ -9046,6 +9111,8 @@ libtaler_plugin_merchantdb_postgres_init (void *cls) plugin->mark_contract_paid = &postgres_mark_contract_paid; plugin->refund_coin = &postgres_refund_coin; plugin->lookup_order_status = &postgres_lookup_order_status; + plugin->lookup_order_status_by_serial = + &postgres_lookup_order_status_by_serial; plugin->lookup_payment_status = &postgres_lookup_payment_status; plugin->lookup_deposits_by_order = &postgres_lookup_deposits_by_order; plugin->lookup_transfer_details_by_order = -- cgit v1.2.3