-work on DB logic

This commit is contained in:
Christian Grothoff 2022-10-03 17:05:29 +02:00
parent f4c8eb6a9c
commit 2dbf8cefe0
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
5 changed files with 184 additions and 46 deletions

@ -1 +1 @@
Subproject commit 57d96e8e123df90c804a821874fc6cb88671ab75 Subproject commit d402af78f6d360841db53baa46dddae13590ec33

View File

@ -70,7 +70,10 @@ endif
libtaler_plugin_exchangedb_postgres_la_SOURCES = \ libtaler_plugin_exchangedb_postgres_la_SOURCES = \
plugin_exchangedb_postgres.c pg_helper.h \ plugin_exchangedb_postgres.c pg_helper.h \
pg_insert_close_request.c pg_insert_close_request.h \ pg_insert_close_request.c pg_insert_close_request.h \
pg_insert_reserve_open_deposit.c pg_insert_reserve_open_deposit.h pg_insert_reserve_open_deposit.c pg_insert_reserve_open_deposit.h \
pg_iterate_kyc_reference.c pg_iterate_kyc_reference.h \
pg_iterate_reserve_close_info.c pg_iterate_reserve_close_info.h \
pg_select_reserve_close_info.c pg_select_reserve_close_info.h
libtaler_plugin_exchangedb_postgres_la_LIBADD = \ libtaler_plugin_exchangedb_postgres_la_LIBADD = \
$(LTLIBINTL) $(LTLIBINTL)
libtaler_plugin_exchangedb_postgres_la_LDFLAGS = \ libtaler_plugin_exchangedb_postgres_la_LDFLAGS = \

View File

@ -26,6 +26,75 @@
#include "pg_helper.h" #include "pg_helper.h"
/**
* Closure for #iterate_kyc_reference_cb()
*/
struct IteratorContext
{
/**
* Function to call with the results.
*/
TALER_EXCHANGEDB_LegitimizationProcessCallback cb;
/**
* Closure to pass to @e cb
*/
void *cb_cls;
/**
* Plugin context.
*/
struct PostgresClosure *pg;
};
/**
* Helper function for #TEH_PG_iterate_kyc_reference().
* Calls the callback with each denomination key.
*
* @param cls a `struct IteratorContext`
* @param result db results
* @param num_results number of results in @a result
*/
static void
iterate_kyc_reference_cb (void *cls,
PGresult *result,
unsigned int num_results)
{
struct IteratorContext *ic = cls;
for (unsigned int i = 0; i<num_results; i++)
{
char *kyc_provider_section_name;
char *provider_user_id;
char *legitimization_id;
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_string ("section_name",
&kyc_provider_section_name),
GNUNET_PQ_result_spec_string ("provider_user_id",
&provider_user_id),
GNUNET_PQ_result_spec_string ("legi_id",
&legitimization_id),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
i))
{
GNUNET_break (0);
return;
}
ic->cb (ic->cb_cls,
kyc_provider_section_name,
provider_user_id,
legitimization_id);
GNUNET_PQ_cleanup_result (rs);
}
}
enum GNUNET_DB_QueryStatus enum GNUNET_DB_QueryStatus
TEH_PG_iterate_kyc_reference ( TEH_PG_iterate_kyc_reference (
void *cls, void *cls,
@ -38,21 +107,23 @@ TEH_PG_iterate_kyc_reference (
GNUNET_PQ_query_param_auto_from_type (h_payto), GNUNET_PQ_query_param_auto_from_type (h_payto),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
// FIXME: everything from here is copy*paste struct IteratorContext ic = {
struct GNUNET_PQ_ResultSpec rs[] = { .cb = lpc,
GNUNET_PQ_result_spec_bool ("insufficient_funds", .cb_cls = lpc_cls,
insufficient_funds), .pg = pg
GNUNET_PQ_result_spec_end
}; };
PREPARE (pg, PREPARE (pg,
"iterate_kyc_reference", "iterate_kyc_reference",
"SELECT " "SELECT "
" insufficient_funds" " section_name"
" FROM exchange_do_reserve_open_deposit" ",provider_user_id"
" ($1,$2,$3,$4,$5,$6);"); ",legi_id"
return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, " FROM FIXME"
"iterate_kyc_reference", " WHERE h_payto=$1;");
params, return GNUNET_PQ_eval_prepared_multi_select (pg->conn,
rs); "iterate_kyc_reference",
params,
&iterate_kyc_reference_cb,
&ic);
} }

View File

@ -25,6 +25,70 @@
#include "pg_insert_reserve_open_deposit.h" #include "pg_insert_reserve_open_deposit.h"
#include "pg_helper.h" #include "pg_helper.h"
/**
* Closure for #iterate_reserve_close_info_cb()
*/
struct IteratorContext
{
/**
* Function to call with the results.
*/
TALER_EXCHANGEDB_KycAmountCallback cb;
/**
* Closure to pass to @e cb
*/
void *cb_cls;
/**
* Plugin context.
*/
struct PostgresClosure *pg;
};
/**
* Helper function for #TEH_PG_iterate_reserve_close_info().
* Calls the callback with each denomination key.
*
* @param cls a `struct IteratorContext`
* @param result db results
* @param num_results number of results in @a result
*/
static void
iterate_reserve_close_info_cb (void *cls,
PGresult *result,
unsigned int num_results)
{
struct IteratorContext *ic = cls;
struct PostgresClosure *pg = ic->pg;
for (unsigned int i = 0; i<num_results; i++)
{
struct TALER_Amount amount;
struct GNUNET_TIME_Absolute ts;
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_absolute_time ("timestamp",
&ts),
TALER_PQ_RESULT_SPEC_AMOUNT ("amount",
&amount),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
i))
{
GNUNET_break (0);
return;
}
ic->cb (ic->cb_cls,
&amount,
ts);
}
}
enum GNUNET_DB_QueryStatus enum GNUNET_DB_QueryStatus
TEH_PG_iterate_reserve_close_info ( TEH_PG_iterate_reserve_close_info (
@ -35,29 +99,30 @@ TEH_PG_iterate_reserve_close_info (
void *kac_cls) void *kac_cls)
{ {
struct PostgresClosure *pg = cls; struct PostgresClosure *pg = cls;
// FIXME: everything from here is copy&paste
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (&cpi->coin_pub), GNUNET_PQ_query_param_auto_from_type (h_payto),
GNUNET_PQ_query_param_uint64 (&known_coin_id), GNUNET_PQ_query_param_absolute_time (&time_limit),
GNUNET_PQ_query_param_auto_from_type (coin_sig),
GNUNET_PQ_query_param_auto_from_type (reserve_sig),
TALER_PQ_query_param_amount (coin_total),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
struct GNUNET_PQ_ResultSpec rs[] = { struct IteratorContext ic = {
GNUNET_PQ_result_spec_bool ("insufficient_funds", .cb = kac,
insufficient_funds), .cb_cls = kac_cls,
GNUNET_PQ_result_spec_end .pg = pg
}; };
PREPARE (pg, PREPARE (pg,
"insert_reserve_open_deposit", "iterate_reserve_close_info",
"SELECT " "SELECT"
" insufficient_funds" " amount_val"
" FROM exchange_do_reserve_open_deposit" ",amount_frac"
" ($1,$2,$3,$4,$5,$6);"); ",timestamp"
return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, " FROM FIXME"
"insert_reserve_open_deposit", " WHERE h_payto=$1"
params, " AND timestamp >= $2"
rs); " ORDER BY timestamp DESC");
return GNUNET_PQ_eval_prepared_multi_select (pg->conn,
"iterate_reserve_close_info",
params,
&iterate_reserve_close_info_cb,
&ic);
} }

View File

@ -34,29 +34,28 @@ TEH_PG_select_reserve_close_info (
char **payto_uri) char **payto_uri)
{ {
struct PostgresClosure *pg = cls; struct PostgresClosure *pg = cls;
// FIXME: everything from here is copy*paste!
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (&cpi->coin_pub), GNUNET_PQ_query_param_auto_from_type (reserve_pub),
GNUNET_PQ_query_param_uint64 (&known_coin_id),
GNUNET_PQ_query_param_auto_from_type (coin_sig),
GNUNET_PQ_query_param_auto_from_type (reserve_sig),
TALER_PQ_query_param_amount (coin_total),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_bool ("insufficient_funds", TALER_PQ_RESULT_SPEC_AMOUNT ("balance",
insufficient_funds), balance),
GNUNET_PQ_result_spec_string ("payto_uri",
payto_uri),
GNUNET_PQ_result_spec_end GNUNET_PQ_result_spec_end
}; };
PREPARE (pg, PREPARE (pg,
"insert_reserve_open_deposit", "select_reserve_close_info",
"SELECT " "SELECT "
" insufficient_funds" " balance_frac"
" FROM exchange_do_reserve_open_deposit" ",balance_val"
" ($1,$2,$3,$4,$5,$6);"); ",payto_uri"
" FROM FIXME"
" WHERE reserve_pub=$1;");
return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
"insert_reserve_open_deposit", "select_reserve_close_info",
params, params,
rs); rs);
} }