merchant

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

commit 1337680d5f3771dc11d520037e239676ab5cdbfa
parent f2b5027ba37abbbfe7ff0711aa9aff2c0e08ac6c
Author: bohdan-potuzhnyi <bohdan.potuzhnyi@gmail.com>
Date:   Wed, 23 Jul 2025 11:26:56 +0200

new select donau instances template files

Diffstat:
Msrc/backend/taler-merchant-httpd_private-get-donau-instances.c | 6+++---
Msrc/backend/taler-merchant-httpd_private-post-orders.c | 11++++++-----
Msrc/backenddb/Makefile.am | 2+-
Dsrc/backenddb/pg_select_donau_instance.c | 172-------------------------------------------------------------------------------
Dsrc/backenddb/pg_select_donau_instance.h | 44--------------------------------------------
Asrc/backenddb/pg_select_donau_instances_filtered.c | 172+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/backenddb/pg_select_donau_instances_filtered.h | 44++++++++++++++++++++++++++++++++++++++++++++
Msrc/backenddb/plugin_merchantdb_postgres.c | 26+++++++++++++-------------
Msrc/include/taler_merchantdb_plugin.h | 2+-
9 files changed, 240 insertions(+), 239 deletions(-)

diff --git a/src/backend/taler-merchant-httpd_private-get-donau-instances.c b/src/backend/taler-merchant-httpd_private-get-donau-instances.c @@ -96,9 +96,9 @@ TMH_private_get_donau_instances (const struct TMH_RequestHandler *rh, GNUNET_assert (NULL != json_donau_instances); TMH_db->preflight (TMH_db->cls); - qs = TMH_db->select_donau_instance (TMH_db->cls, - &add_donau_instance, - json_donau_instances); + qs = TMH_db->select_donau_instances (TMH_db->cls, + &add_donau_instance, + json_donau_instances); if (0 > qs) { diff --git a/src/backend/taler-merchant-httpd_private-post-orders.c b/src/backend/taler-merchant-httpd_private-post-orders.c @@ -3226,7 +3226,8 @@ phase_merge_inventory (struct OrderContext *oc) * Callback function that is called for each donau instance. * It simply adds the provided donau_url to the json. */ -/* FIXME: very-very bad */ +/* FIXME: Change the function to postgresql to only receive back the donau_url, + * and maybe charity max per year so we can compare it with amount from the output*/ static void add_donau_url (void *cls, const char *donau_url, @@ -3253,10 +3254,10 @@ parse_donau_instances (struct OrderContext *oc, enum GNUNET_DB_QueryStatus qs; /* Invoke the database call, accumulating URLs in a JSON array */ - /* FIXME: select_donau_instanceS */ - qs = TMH_db->select_donau_instance (TMH_db->cls, - &add_donau_url, - output); + /* FIXME: select_donau_instances by currency */ + qs = TMH_db->select_donau_instances (TMH_db->cls, + &add_donau_url, + output); /* REVIEW: If no switch */ if (qs < 0) diff --git a/src/backenddb/Makefile.am b/src/backenddb/Makefile.am @@ -222,7 +222,7 @@ libtaler_plugin_merchantdb_postgres_la_SOURCES += \ pg_lookup_order_charity.h pg_lookup_order_charity.c \ pg_upsert_donau_keys.h pg_upsert_donau_keys.c \ pg_insert_donau_instance.h pg_insert_donau_instance.c \ - pg_select_donau_instance.h pg_select_donau_instance.c \ + pg_select_donau_instances.h pg_select_donau_instances.c \ pg_delete_donau_instance.h pg_delete_donau_instance.c endif diff --git a/src/backenddb/pg_select_donau_instance.c b/src/backenddb/pg_select_donau_instance.c @@ -1,171 +0,0 @@ -/* - This file is part of TALER - Copyright (C) 2024 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 backenddb/pg_select_donau_instance.c - * @brief Implementation of the select_donau_instance function for Postgres - * @author Bohdan Potuzhnyi - * @author Vlada Svirsh - */ -#include "platform.h" -#include <taler/taler_error_codes.h> -#include <taler/taler_dbevents.h> -#include <taler/taler_pq_lib.h> -#include "pg_select_donau_instance.h" -#include "taler_merchant_donau.h" -#include "pg_helper.h" - -/** - * Context for select_donau_instances(). - */ -struct SelectDonauInstanceContext -{ - /** - * Function to call with the results. - */ - TALER_MERCHANTDB_DonauInstanceCallback cb; - - /** - * Closure for @e cb. - */ - void *cb_cls; - - /** - * Did database result extraction fail? - */ - bool extract_failed; -}; - - -/** - * Function to be called with the results of a SELECT statement - * that has returned @a num_results results about donau instances. - * - * @param[in, out] cls of type `struct SelectDonauInstanceContext *` - * @param result the postgres result - * @param num_results the number of results in @a result - */ -static void -select_donau_instance_cb (void *cls, - PGresult *result, - unsigned int num_results) -{ - struct SelectDonauInstanceContext *sdc = 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 - 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 - GNUNET_PQ_cleanup_result (rs); - } -} - - -enum GNUNET_DB_QueryStatus -TMH_PG_select_donau_instance (void *cls, - TALER_MERCHANTDB_DonauInstanceCallback cb, - void *cb_cls) -{ - struct PostgresClosure *pg = cls; - struct SelectDonauInstanceContext sdc = { - .cb = cb, - .cb_cls = cb_cls, - /* Can be overwritten by the select_donau_instance_cb */ - .extract_failed = false, - }; - - struct GNUNET_PQ_QueryParam params[] = { - GNUNET_PQ_query_param_end - }; - enum GNUNET_DB_QueryStatus qs; - - check_connection (pg); - PREPARE (pg, - "select_donau_instances", - "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"); - - qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, - "select_donau_instances", - params, - &select_donau_instance_cb, - &sdc); - - /* If there was an error inside select_donau_instance_cb, return a hard error. */ - if (sdc.extract_failed) - return GNUNET_DB_STATUS_HARD_ERROR; - - return qs; -} -\ No newline at end of file diff --git a/src/backenddb/pg_select_donau_instance.h b/src/backenddb/pg_select_donau_instance.h @@ -1,44 +0,0 @@ -/* - This file is part of TALER - Copyright (C) 2024 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 backenddb/pg_select_donau_instance.h - * @brief implementation of the select_donau_instance function for Postgres - * @author Bohdan Potuzhnyi - * @author Vlada Svirsh - */ -#ifndef PG_SELECT_DONAU_INSTANCE_H -#define PG_SELECT_DONAU_INSTANCE_H - -#include <taler/taler_util.h> -#include <taler/taler_json_lib.h> -#include "taler_merchantdb_plugin.h" -#include "taler_merchant_donau.h" -#include "donau/donau_util.h" - -/** - * Select multiple Donau instances from the database. - * - * @param cls the closure for the database context - * @param cb callback function to call with each result - * @param cb_cls closure for the callback - * @return status of the PG - */ -enum GNUNET_DB_QueryStatus -TMH_PG_select_donau_instance (void *cls, - TALER_MERCHANTDB_DonauInstanceCallback cb, - void *cb_cls); - -#endif diff --git a/src/backenddb/pg_select_donau_instances_filtered.c b/src/backenddb/pg_select_donau_instances_filtered.c @@ -0,0 +1,171 @@ +/* + This file is part of TALER + Copyright (C) 2024 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 backenddb/pg_select_donau_instances.c + * @brief Implementation of the select_donau_instance function for Postgres + * @author Bohdan Potuzhnyi + * @author Vlada Svirsh + */ +#include "platform.h" +#include <taler/taler_error_codes.h> +#include <taler/taler_dbevents.h> +#include <taler/taler_pq_lib.h> +#include "pg_select_donau_instances.h" +#include "taler_merchant_donau.h" +#include "pg_helper.h" + +/** + * Context for select_donau_instances(). + */ +struct SelectDonauInstanceContext +{ + /** + * Function to call with the results. + */ + TALER_MERCHANTDB_DonauInstanceCallback cb; + + /** + * Closure for @e cb. + */ + void *cb_cls; + + /** + * Did database result extraction fail? + */ + bool extract_failed; +}; + + +/** + * Function to be called with the results of a SELECT statement + * that has returned @a num_results results about donau instances. + * + * @param[in, out] cls of type `struct SelectDonauInstanceContext *` + * @param result the postgres result + * @param num_results the number of results in @a result + */ +static void +select_donau_instance_cb (void *cls, + PGresult *result, + unsigned int num_results) +{ + struct SelectDonauInstanceContext *sdc = 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 + 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 + GNUNET_PQ_cleanup_result (rs); + } +} + + +enum GNUNET_DB_QueryStatus +TMH_PG_select_donau_instances (void *cls, + TALER_MERCHANTDB_DonauInstanceCallback cb, + void *cb_cls) +{ + struct PostgresClosure *pg = cls; + struct SelectDonauInstanceContext sdc = { + .cb = cb, + .cb_cls = cb_cls, + /* Can be overwritten by the select_donau_instance_cb */ + .extract_failed = false, + }; + + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_end + }; + enum GNUNET_DB_QueryStatus qs; + + check_connection (pg); + PREPARE (pg, + "select_donau_instances", + "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"); + + qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, + "select_donau_instances", + params, + &select_donau_instance_cb, + &sdc); + + /* If there was an error inside select_donau_instance_cb, return a hard error. */ + if (sdc.extract_failed) + return GNUNET_DB_STATUS_HARD_ERROR; + + return qs; +} +\ No newline at end of file diff --git a/src/backenddb/pg_select_donau_instances_filtered.h b/src/backenddb/pg_select_donau_instances_filtered.h @@ -0,0 +1,44 @@ +/* + This file is part of TALER + Copyright (C) 2024 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 backenddb/pg_select_donau_instances.h + * @brief implementation of the select_donau_instance function for Postgres + * @author Bohdan Potuzhnyi + * @author Vlada Svirsh + */ +#ifndef PG_SELECT_DONAU_INSTANCE_H +#define PG_SELECT_DONAU_INSTANCE_H + +#include <taler/taler_util.h> +#include <taler/taler_json_lib.h> +#include "taler_merchantdb_plugin.h" +#include "taler_merchant_donau.h" +#include "donau/donau_util.h" + +/** + * Select multiple Donau instances from the database. + * + * @param cls the closure for the database context + * @param cb callback function to call with each result + * @param cb_cls closure for the callback + * @return status of the PG + */ +enum GNUNET_DB_QueryStatus +TMH_PG_select_donau_instances (void *cls, + TALER_MERCHANTDB_DonauInstanceCallback cb, + void *cb_cls); + +#endif diff --git a/src/backenddb/plugin_merchantdb_postgres.c b/src/backenddb/plugin_merchantdb_postgres.c @@ -165,7 +165,7 @@ #ifdef HAVE_DONAU_DONAU_SERVICE_H #include "donau/donau_service.h" #include "pg_insert_donau_instance.h" -#include "pg_select_donau_instance.h" +#include "pg_select_donau_instances.h" #include "pg_delete_donau_instance.h" #include "pg_lookup_donau_keys.h" #include "pg_lookup_order_charity.h" @@ -663,18 +663,18 @@ libtaler_plugin_merchantdb_postgres_init (void *cls) plugin->gc = &TMH_PG_gc; #ifdef HAVE_DONAU_DONAU_SERVICE_H - plugin->insert_donau_instance - = &TMH_PG_insert_donau_instance; - plugin->select_donau_instance - = &TMH_PG_select_donau_instance; - plugin->delete_donau_instance - = &TMH_PG_delete_donau_instance; - plugin->lookup_donau_keys - = &TMH_PG_lookup_donau_keys; - plugin->lookup_order_charity - = &TMH_PG_lookup_order_charity; - plugin->upsert_donau_keys - = &TMH_PG_upsert_donau_keys; + plugin->insert_donau_instance + = &TMH_PG_insert_donau_instance; + plugin->select_donau_instances + = &TMH_PG_select_donau_instances; + plugin->delete_donau_instance + = &TMH_PG_delete_donau_instance; + plugin->lookup_donau_keys + = &TMH_PG_lookup_donau_keys; + plugin->lookup_order_charity + = &TMH_PG_lookup_order_charity; + plugin->upsert_donau_keys + = &TMH_PG_upsert_donau_keys; #endif return plugin; } diff --git a/src/include/taler_merchantdb_plugin.h b/src/include/taler_merchantdb_plugin.h @@ -4129,7 +4129,7 @@ struct TALER_MERCHANTDB_Plugin ); enum GNUNET_DB_QueryStatus - (*select_donau_instance)( + (*select_donau_instances)( void *cls, TALER_MERCHANTDB_DonauInstanceCallback cb, void *cb_cls