From b1d9745545ff528729b53312947ba768c336a1d8 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 30 Dec 2022 21:28:19 +0100 Subject: -work on new DB queries --- src/exchangedb/pg_select_aml_history.c | 130 ++++++++++++++++++++++++++++++++- 1 file changed, 128 insertions(+), 2 deletions(-) (limited to 'src/exchangedb/pg_select_aml_history.c') diff --git a/src/exchangedb/pg_select_aml_history.c b/src/exchangedb/pg_select_aml_history.c index 2e3108787..9638df5cd 100644 --- a/src/exchangedb/pg_select_aml_history.c +++ b/src/exchangedb/pg_select_aml_history.c @@ -25,6 +25,96 @@ #include "pg_select_aml_history.h" #include "pg_helper.h" + +/** + * Closure for #handle_aml_result. + */ +struct AmlHistoryResultContext +{ + /** + * Function to call on each result. + */ + TALER_EXCHANGEDB_AmlHistoryCallback cb; + + /** + * Closure for @e cb. + */ + void *cb_cls; + + /** + * Plugin context. + */ + struct PostgresClosure *pg; + + /** + * Set to #GNUNET_SYSERR on serious errors. + */ + enum GNUNET_GenericReturnValue status; +}; + + +/** + * Function to be called with the results of a SELECT statement + * that has returned @a num_results results. Helper function + * for #TEH_PG_select_aml_history(). + * + * @param cls closure of type `struct AmlHistoryResultContext *` + * @param result the postgres result + * @param num_results the number of results in @a result + */ +static void +handle_aml_result (void *cls, + PGresult *result, + unsigned int num_results) +{ + struct AmlHistoryResultContext *ctx = cls; + struct PostgresClosure *pg = ctx->pg; + + for (unsigned int i = 0; istatus = GNUNET_SYSERR; + return; + } + ctx->cb (ctx->cb_cls, + &new_threshold, + (enum TALER_AmlDecisionState) ns, + decision_time, + justification, + &decider_pub, + &decider_sig); + GNUNET_PQ_cleanup_result (rs); + } +} + + enum GNUNET_DB_QueryStatus TEH_PG_select_aml_history ( void *cls, @@ -32,6 +122,42 @@ TEH_PG_select_aml_history ( TALER_EXCHANGEDB_AmlHistoryCallback cb, void *cb_cls) { - GNUNET_break (0); // FIXME: not implemeted! - return GNUNET_DB_STATUS_HARD_ERROR; + struct PostgresClosure *pg = cls; + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_auto_from_type (h_payto), + GNUNET_PQ_query_param_end + }; + struct AmlHistoryResultContext ctx = { + .cb = cb, + .cb_cls = cb_cls, + .pg = pg, + .status = GNUNET_OK + }; + enum GNUNET_DB_QueryStatus qs; + + PREPARE (pg, + "lookup_aml_history", + "SELECT" + " aggregation_serial_id" + ",deposits.h_contract_terms" + ",payto_uri" + ",wire_targets.wire_target_h_payto" + ",kc.coin_pub" + ",deposits.merchant_pub" + ",wire_out.execution_date" + ",deposits.amount_with_fee_val" + ",deposits.amount_with_fee_frac" + ",denom.fee_deposit_val" + ",denom.fee_deposit_frac" + ",denom.denom_pub" + " FROM aml_history" + " WHERE h_payto=$1;"); + qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, + "lookup_aml_history", + params, + &handle_aml_result, + &ctx); + if (GNUNET_OK != ctx.status) + return GNUNET_DB_STATUS_HARD_ERROR; + return qs; } -- cgit v1.2.3