commit 7488381babb7ceee14a89b01fee748e9c4ab4a90
parent 4fa367bbcb35bc369df92787eac3fd6ac03e4d8e
Author: Christian Grothoff <christian@grothoff.org>
Date: Fri, 26 Dec 2025 14:58:02 +0100
implement select_money_pots
Diffstat:
2 files changed, 135 insertions(+), 2 deletions(-)
diff --git a/src/backenddb/pg_select_money_pots.c b/src/backenddb/pg_select_money_pots.c
@@ -26,6 +26,80 @@
#include "pg_helper.h"
+/**
+ * Context used for TMH_PG_lookup_money_pots().
+ */
+struct LookupMoneyPotsContext
+{
+ /**
+ * Function to call with the results.
+ */
+ TALER_MERCHANTDB_MoneyPotsCallback cb;
+
+ /**
+ * Closure for @a 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 money pots.
+ *
+ * @param[in,out] cls of type `struct LookupMoneyPotsContext *`
+ * @param result the postgres result
+ * @param num_results the number of results in @a result
+ */
+static void
+lookup_money_pots_cb (void *cls,
+ PGresult *result,
+ unsigned int num_results)
+{
+ struct LookupMoneyPotsContext *plc = cls;
+
+ for (unsigned int i = 0; i < num_results; i++)
+ {
+ uint64_t money_pot_serial;
+ char *money_pot_name;
+ char *money_pot_description;
+ struct TALER_Amount pot_total;
+ struct GNUNET_PQ_ResultSpec rs[] = {
+ GNUNET_PQ_result_spec_uint64 ("money_pot_serial",
+ &money_pot_serial),
+ GNUNET_PQ_result_spec_string ("money_pot_name",
+ &money_pot_name),
+ GNUNET_PQ_result_spec_string ("money_pot_description",
+ &money_pot_description),
+ TALER_PQ_result_spec_amount_with_currency ("pot_total",
+ &pot_total),
+ GNUNET_PQ_result_spec_end
+ };
+
+ if (GNUNET_OK !=
+ GNUNET_PQ_extract_result (result,
+ rs,
+ i))
+ {
+ GNUNET_break (0);
+ plc->extract_failed = true;
+ return;
+ }
+ plc->cb (plc->cb_cls,
+ money_pot_serial,
+ money_pot_name,
+ money_pot_description,
+ &pot_total);
+ GNUNET_PQ_cleanup_result (rs);
+ }
+}
+
+
enum GNUNET_DB_QueryStatus
TMH_PG_select_money_pots (void *cls,
const char *instance_id,
@@ -34,4 +108,64 @@ TMH_PG_select_money_pots (void *cls,
TALER_MERCHANTDB_MoneyPotsCallback cb,
void *cb_cls)
{
+ struct PostgresClosure *pg = cls;
+ uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit);
+ struct LookupMoneyPotsContext plc = {
+ .cb = cb,
+ .cb_cls = cb_cls,
+ /* Can be overwritten by the lookup_money_pots_cb */
+ .extract_failed = false,
+ };
+ struct GNUNET_PQ_QueryParam params[] = {
+ GNUNET_PQ_query_param_string (instance_id),
+ GNUNET_PQ_query_param_uint64 (&offset),
+ GNUNET_PQ_query_param_uint64 (&plimit),
+ GNUNET_PQ_query_param_end
+ };
+ enum GNUNET_DB_QueryStatus qs;
+
+ check_connection (pg);
+ PREPARE (pg,
+ "lookup_money_pots_asc",
+ "SELECT"
+ " money_pot_serial"
+ " ,money_pot_name"
+ " ,money_pot_description"
+ " ,pot_total"
+ " FROM merchant_money_pots"
+ " JOIN merchant_instances"
+ " USING (merchant_serial)"
+ " WHERE merchant_instances.merchant_id=$1"
+ " AND money_pot_serial > $2"
+ " ORDER BY money_pot_serial ASC"
+ " LIMIT $3");
+ PREPARE (pg,
+ "lookup_money_pots_desc",
+ "SELECT"
+ " money_pot_serial"
+ " ,money_pot_name"
+ " ,money_pot_description"
+ " ,pot_total"
+ " FROM merchant_money_pots"
+ " JOIN merchant_instances"
+ " USING (merchant_serial)"
+ " WHERE merchant_instances.merchant_id=$1"
+ " AND money_pot_serial < $2"
+ " ORDER BY money_pot_serial DESC"
+ " LIMIT $3");
+ qs = GNUNET_PQ_eval_prepared_multi_select (
+ pg->conn,
+ (limit > 0)
+ ? "lookup_money_pots_asc"
+ : "lookup_money_pots_desc",
+ params,
+ &lookup_money_pots_cb,
+ &plc);
+ /* If there was an error inside lookup_money_pots_cb, return a hard error. */
+ if (plc.extract_failed)
+ {
+ GNUNET_break (0);
+ return GNUNET_DB_STATUS_HARD_ERROR;
+ }
+ return qs;
}
diff --git a/src/include/taler_merchantdb_plugin.h b/src/include/taler_merchantdb_plugin.h
@@ -1346,8 +1346,7 @@ typedef void
uint64_t money_pot_id,
const char *name,
const char *description,
- const struct TALER_Amount *pot_total,
- const struct TALER_Amount *new_pot_total);
+ const struct TALER_Amount *pot_total);
/**