diff options
author | Christian Grothoff <christian@grothoff.org> | 2024-01-06 14:50:19 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2024-01-06 14:50:19 +0100 |
commit | f9647f4f000556909ec1f5b5c3e6872fe2453647 (patch) | |
tree | c202fcfeac8639d4b2a3181baf641cb444e94507 | |
parent | 2f7108a75b9bbd1d1542d4a7843010edc02e1267 (diff) | |
download | merchant-f9647f4f000556909ec1f5b5c3e6872fe2453647.tar.gz merchant-f9647f4f000556909ec1f5b5c3e6872fe2453647.tar.bz2 merchant-f9647f4f000556909ec1f5b5c3e6872fe2453647.zip |
work on lookup_pending_deposits (unfinished)
m--------- | contrib/wallet-core | 0 | ||||
-rw-r--r-- | src/backenddb/pg_lookup_pending_deposits.c | 139 |
2 files changed, 137 insertions, 2 deletions
diff --git a/contrib/wallet-core b/contrib/wallet-core -Subproject 0c211082e0b8372f8fa1cef8102e477c7363d9b +Subproject a675c94085cfa90052c9ebacd2cebccfab2c4f1 diff --git a/src/backenddb/pg_lookup_pending_deposits.c b/src/backenddb/pg_lookup_pending_deposits.c index 411b7eb5..8f12d5ea 100644 --- a/src/backenddb/pg_lookup_pending_deposits.c +++ b/src/backenddb/pg_lookup_pending_deposits.c @@ -26,6 +26,104 @@ #include "pg_helper.h" +/** + * Context for lookup_pending_deposits(). + */ +struct LookupDepositsContext +{ + /** + * Function to call with the results. + */ + TALER_MERCHANTDB_PendingDepositsCallback cb; + + /** + * Closure for @e cb. + */ + void *cb_cls; + + /** + * Database context. + */ + struct PostgresClosure *pg; + + /** + * Set to the return value on errors. + */ + enum GNUNET_DB_QueryStatus qs; + +}; + + +/** + * Function to be called with the results of a SELECT statement + * that has returned @a num_results results about instances. + * + * @param cls of type `struct LookupDepositsContext *` + * @param result the postgres result + * @param num_results the number of results in @a result + */ +static void +lookup_deposits_cb (void *cls, + PGresult *result, + unsigned int num_results) +{ + struct LookupDepositsContext *ldc = cls; + + for (unsigned int i = 0; i < num_results; i++) + { + uint64_t deposit_serial; + struct GNUNET_TIME_Absolute wire_deadline; + struct TALER_PrivateContractHashP h_contract_terms; + struct TALER_MerchantPrivateKeyP merchant_priv; + char *instance_id; + struct TALER_MerchantWireHashP h_wire; + struct TALER_Amount amount_with_fee; + struct TALER_Amount deposit_fee; + struct TALER_CoinSpendPublicKeyP coin_pub; + struct GNUNET_PQ_ResultSpec rs[] = { + GNUNET_PQ_result_spec_uint64 ("deposit_serial", + &deposit_serial), + GNUNET_PQ_result_spec_auto_from_type ("h_contract_terms", + &h_contract_terms), + GNUNET_PQ_result_spec_auto_from_type ("merchant_priv", + &merchant_priv), + GNUNET_PQ_result_spec_string ("instance_id", + &instance_id), + GNUNET_PQ_result_spec_auto_from_type ("h_wire", + &h_wire), + TALER_PQ_result_spec_amount_with_currency ("amount_with_fee", + &amount_with_fee), + TALER_PQ_result_spec_amount_with_currency ("deposit_fee", + &deposit_fee), + GNUNET_PQ_result_spec_auto_from_type ("coin_pub", + &coin_pub), + GNUNET_PQ_result_spec_end + }; + + if (GNUNET_OK != + GNUNET_PQ_extract_result (result, + rs, + i)) + { + GNUNET_break (0); + ldc->qs = GNUNET_DB_STATUS_HARD_ERROR; + return; + } + ldc->cb (ldc->cb_cls, + deposit_serial, + wire_deadline, + &h_contract_terms, + &merchant_priv, + instance_id, + &h_wire, + &amount_with_fee, + &deposit_fee, + &coin_pub); + GNUNET_PQ_cleanup_result (rs); + } +} + + enum GNUNET_DB_QueryStatus TMH_PG_lookup_pending_deposits ( void *cls, @@ -35,6 +133,43 @@ TMH_PG_lookup_pending_deposits ( TALER_MERCHANTDB_PendingDepositsCallback cb, void *cb_cls) { - GNUNET_break (0); - return -2; // FIXME! + struct PostgresClosure *pg = cls; + struct LookupDepositsContext ldc = { + .cb = cb, + .cb_cls = cb_cls, + .pg = pg + }; + struct GNUNET_TIME_Absolute now + = GNUNET_TIME_absolute_get (); + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_string (exchange_url), + GNUNET_PQ_query_param_absolute_time (&now), + GNUNET_PQ_query_param_uint32 (&limit), + GNUNET_PQ_query_param_bool (allow_future), + GNUNET_PQ_query_param_end + }; + enum GNUNET_DB_QueryStatus qs; + + check_connection (pg); + PREPARE (pg, + "lookup_pending_deposits", + "SELECT" + " deposit_serial" + ",h_contract_terms" + ",merchant_priv" + ",instance_id" + ",h_wire" + ",amount_with_fee" + ",deposit_fee" + ",coin_pub" + " FROM merchant_deposits" + " FIXME"); + qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, + "lookup_pending_deposits", + params, + &lookup_deposits_cb, + &ldc); + if (0 > ldc.qs) + return ldc.qs; + return qs; } |