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:
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",
- ¤t_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.
*