merchant

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

commit c582f423500e9a914990e4840479f5da88b7dcf5
parent 1337680d5f3771dc11d520037e239676ab5cdbfa
Author: bohdan-potuzhnyi <bohdan.potuzhnyi@gmail.com>
Date:   Wed, 23 Jul 2025 12:09:18 +0200

defining filtered select donau

Diffstat:
Msrc/backenddb/Makefile.am | 1+
Csrc/backenddb/pg_select_donau_instances_filtered.c -> src/backenddb/pg_select_donau_instances.c | 0
Csrc/backenddb/pg_select_donau_instances_filtered.h -> src/backenddb/pg_select_donau_instances.h | 0
Msrc/backenddb/pg_select_donau_instances_filtered.c | 64++++++++++++++--------------------------------------------------
Msrc/backenddb/pg_select_donau_instances_filtered.h | 7++++---
Msrc/backenddb/plugin_merchantdb_postgres.c | 3+++
Msrc/include/taler_merchant_donau.h | 15+++++++++++++++
Msrc/include/taler_merchantdb_plugin.h | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
8 files changed, 103 insertions(+), 55 deletions(-)

diff --git a/src/backenddb/Makefile.am b/src/backenddb/Makefile.am @@ -223,6 +223,7 @@ libtaler_plugin_merchantdb_postgres_la_SOURCES += \ pg_upsert_donau_keys.h pg_upsert_donau_keys.c \ pg_insert_donau_instance.h pg_insert_donau_instance.c \ pg_select_donau_instances.h pg_select_donau_instances.c \ + pg_select_donau_instances_filtered.h pg_select_donau_instances_filtered.c \ pg_delete_donau_instance.h pg_delete_donau_instance.c endif diff --git a/src/backenddb/pg_select_donau_instances_filtered.c b/src/backenddb/pg_select_donau_instances.c diff --git a/src/backenddb/pg_select_donau_instances_filtered.h b/src/backenddb/pg_select_donau_instances.h diff --git a/src/backenddb/pg_select_donau_instances_filtered.c b/src/backenddb/pg_select_donau_instances_filtered.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2024 Taler Systems SA + 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 @@ -14,7 +14,7 @@ TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ /** - * @file backenddb/pg_select_donau_instances.c + * @file backenddb/pg_select_donau_instances_filtered.c * @brief Implementation of the select_donau_instance function for Postgres * @author Bohdan Potuzhnyi * @author Vlada Svirsh @@ -23,19 +23,19 @@ #include <taler/taler_error_codes.h> #include <taler/taler_dbevents.h> #include <taler/taler_pq_lib.h> -#include "pg_select_donau_instances.h" +#include "pg_select_donau_instances_filtered.h" #include "taler_merchant_donau.h" #include "pg_helper.h" /** - * Context for select_donau_instances(). + * Context for select_donau_instances_filtered(). */ struct SelectDonauInstanceContext { /** * Function to call with the results. */ - TALER_MERCHANTDB_DonauInstanceCallback cb; + TALER_MERCHANTDB_DonauInstanceFilteredCallback cb; /** * Closure for @e cb. @@ -67,66 +67,38 @@ select_donau_instance_cb (void *cls, for (unsigned int i = 0; i < num_results; i++) { char *donau_url; - char *charity_name; - struct DONAU_CharityPublicKeyP charity_pub_key; - uint64_t charity_id; struct TALER_Amount charity_max_per_year; - struct TALER_Amount charity_receipts_to_date; - int64_t current_year; - json_t *donau_keys_json; struct GNUNET_PQ_ResultSpec rs[] = { GNUNET_PQ_result_spec_string ("donau_url", &donau_url), - GNUNET_PQ_result_spec_string ("charity_name", - &charity_name), - GNUNET_PQ_result_spec_auto_from_type ("charity_pub_key", - &charity_pub_key), - GNUNET_PQ_result_spec_uint64 ("charity_id", - &charity_id), TALER_PQ_result_spec_amount_with_currency ("charity_max_per_year", &charity_max_per_year), - TALER_PQ_result_spec_amount_with_currency ("charity_receipts_to_date", - &charity_receipts_to_date), - GNUNET_PQ_result_spec_int64 ("current_year", - &current_year), - TALER_PQ_result_spec_json ("keys_json", - &donau_keys_json), GNUNET_PQ_result_spec_end }; - // Extract result for each row if (GNUNET_OK != GNUNET_PQ_extract_result (result, rs, i)) { - GNUNET_break (0); // Break on failure + GNUNET_break (0); sdc->extract_failed = true; return; } - - // Call the callback function with the individual values sdc->cb (sdc->cb_cls, donau_url, - charity_name, - &charity_pub_key, - charity_id, - &charity_max_per_year, - &charity_receipts_to_date, - current_year, - donau_keys_json); - - // Clean up any dynamically allocated results in the result spec + &charity_max_per_year); GNUNET_PQ_cleanup_result (rs); } } enum GNUNET_DB_QueryStatus -TMH_PG_select_donau_instances (void *cls, - TALER_MERCHANTDB_DonauInstanceCallback cb, - void *cb_cls) +TMH_PG_select_donau_instances_filtered ( + void *cls, + TALER_MERCHANTDB_DonauInstanceFilteredCallback cb, + void *cb_cls) { struct PostgresClosure *pg = cls; struct SelectDonauInstanceContext sdc = { @@ -143,22 +115,14 @@ TMH_PG_select_donau_instances (void *cls, check_connection (pg); PREPARE (pg, - "select_donau_instances", + "select_donau_instances_filtered", "SELECT" " di.donau_url" - ",di.charity_name" - ",di.charity_pub_key" - ",di.charity_id" ",di.charity_max_per_year" - ",di.charity_receipts_to_date" - ",di.current_year" - ",dk.keys_json" - " FROM merchant_donau_instances di" - " JOIN merchant_donau_keys dk" - " ON di.donau_url = dk.donau_url"); + " FROM merchant_donau_instances di"); qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, - "select_donau_instances", + "select_donau_instances_filtered", params, &select_donau_instance_cb, &sdc); diff --git a/src/backenddb/pg_select_donau_instances_filtered.h b/src/backenddb/pg_select_donau_instances_filtered.h @@ -37,8 +37,9 @@ * @return status of the PG */ enum GNUNET_DB_QueryStatus -TMH_PG_select_donau_instances (void *cls, - TALER_MERCHANTDB_DonauInstanceCallback cb, - void *cb_cls); +TMH_PG_select_donau_instances_filtered ( + void *cls, + TALER_MERCHANTDB_DonauInstanceFilteredCallback cb, + void *cb_cls); #endif diff --git a/src/backenddb/plugin_merchantdb_postgres.c b/src/backenddb/plugin_merchantdb_postgres.c @@ -166,6 +166,7 @@ #include "donau/donau_service.h" #include "pg_insert_donau_instance.h" #include "pg_select_donau_instances.h" +#include "pg_select_donau_instances_filtered.h" #include "pg_delete_donau_instance.h" #include "pg_lookup_donau_keys.h" #include "pg_lookup_order_charity.h" @@ -667,6 +668,8 @@ libtaler_plugin_merchantdb_postgres_init (void *cls) = &TMH_PG_insert_donau_instance; plugin->select_donau_instances = &TMH_PG_select_donau_instances; + plugin->select_donau_instances_filtered + = &TMH_PG_select_donau_instances_filtered; plugin->delete_donau_instance = &TMH_PG_delete_donau_instance; plugin->lookup_donau_keys diff --git a/src/include/taler_merchant_donau.h b/src/include/taler_merchant_donau.h @@ -151,6 +151,21 @@ typedef void ); /** + * Callback function typically used by `select_donau_instances` to handle + * the details of each Donau instance retrieved from the database. + * + * @param cls Closure to pass additional context or data to the callback function. + * @param donau_url The URL of the Donau instance. + * @param charity_max_per_year Maximum allowed donations to the charity for the current year. + */ +typedef void +(*TALER_MERCHANTDB_DonauInstanceFilteredCallback)( + void *cls, + const char *donau_url, + const struct TALER_Amount *charity_max_per_year + ); + +/** * SPECIFICATION FOR REQUESTS /donau */ diff --git a/src/include/taler_merchantdb_plugin.h b/src/include/taler_merchantdb_plugin.h @@ -4094,13 +4094,26 @@ struct TALER_MERCHANTDB_Plugin const char *last_detail); - #ifdef HAVE_DONAU_DONAU_SERVICE_H +#ifdef HAVE_DONAU_DONAU_SERVICE_H + /** + * Upsert Donau keys into the database. + * + * @param cls closure + * @param keys Donau keys to insert or update + */ enum GNUNET_DB_QueryStatus (*upsert_donau_keys)( void *cls, const struct DONAU_Keys *keys ); + /** + * Lookup Donau keys by URL. + * + * @param cls closure + * @param donau_url URL of the Donau instance + * @param[out] keys set to the Donau keys on success + */ enum GNUNET_DB_QueryStatus (*lookup_donau_keys)( void *cls, @@ -4108,6 +4121,21 @@ struct TALER_MERCHANTDB_Plugin struct DONAU_Keys **keys ); + /** + * Lookup a Donau instance by its instance ID and URL. + * + * @param cls closure + * @param instance_id instance ID of the Donau instance + * @param donau_url URL of the Donau instance + * @param charity_id set to the charity ID of the Donau instance + * @param charity_priv set to the private key of the charity + * @param charity_max_per_year set to the maximum amount + * the charity can receive per year + * @param charity_receipts_to_date set to the total amount + * the charity has received to date + * @param donau_keys_json set to the JSON representation of the + * Donau keys + */ enum GNUNET_DB_QueryStatus (*lookup_order_charity)( void *cls, @@ -4120,6 +4148,14 @@ struct TALER_MERCHANTDB_Plugin json_t **donau_keys_json ); + /** + * Insert information about a Donau instance. + * + * @param cls closure + * @param donau_url URL of the Donau instance + * @param charity details of the charity + * @param charity_id charity ID of the Donau instance + */ enum GNUNET_DB_QueryStatus (*insert_donau_instance)( void *cls, @@ -4128,6 +4164,13 @@ struct TALER_MERCHANTDB_Plugin const uint64_t charity_id ); + /** + * Select all Donau instances. + * + * @param cls closure + * @param cb function to call on all Donau instances found + * @param cb_cls closure for @a cb + */ enum GNUNET_DB_QueryStatus (*select_donau_instances)( void *cls, @@ -4135,12 +4178,33 @@ struct TALER_MERCHANTDB_Plugin void *cb_cls ); + /** + * Select all Donau instances, but only the donau_url + * and charity_max_per_year. + * + * @param cls closure + * @param cb function to call on all Donau instances found + * @param cb_cls closure for @a cb + */ + enum GNUNET_DB_QueryStatus + (*select_donau_instances_filtered)( + void *cls, + TALER_MERCHANTDB_DonauInstanceFilteredCallback cb, + void *cb_cls + ); + + /** + * Delete information about a Donau instance. + * + * @param cls closure + * @param charity_id charity ID of the Donau instance to delete + */ enum GNUNET_DB_QueryStatus (*delete_donau_instance)( void *cls, const uint64_t charity_id ); - #endif +#endif /** * Lookup amount statistics for instance and slug by bucket. *