-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 = \
plugin_exchangedb_postgres.c pg_helper.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 = \
$(LTLIBINTL)
libtaler_plugin_exchangedb_postgres_la_LDFLAGS = \

View File

@ -26,6 +26,75 @@
#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
TEH_PG_iterate_kyc_reference (
void *cls,
@ -38,21 +107,23 @@ TEH_PG_iterate_kyc_reference (
GNUNET_PQ_query_param_auto_from_type (h_payto),
GNUNET_PQ_query_param_end
};
// FIXME: everything from here is copy*paste
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_bool ("insufficient_funds",
insufficient_funds),
GNUNET_PQ_result_spec_end
struct IteratorContext ic = {
.cb = lpc,
.cb_cls = lpc_cls,
.pg = pg
};
PREPARE (pg,
"iterate_kyc_reference",
"SELECT "
" insufficient_funds"
" FROM exchange_do_reserve_open_deposit"
" ($1,$2,$3,$4,$5,$6);");
return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
" section_name"
",provider_user_id"
",legi_id"
" FROM FIXME"
" WHERE h_payto=$1;");
return GNUNET_PQ_eval_prepared_multi_select (pg->conn,
"iterate_kyc_reference",
params,
rs);
&iterate_kyc_reference_cb,
&ic);
}

View File

@ -25,6 +25,70 @@
#include "pg_insert_reserve_open_deposit.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
TEH_PG_iterate_reserve_close_info (
@ -35,29 +99,30 @@ TEH_PG_iterate_reserve_close_info (
void *kac_cls)
{
struct PostgresClosure *pg = cls;
// FIXME: everything from here is copy&paste
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (&cpi->coin_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_auto_from_type (h_payto),
GNUNET_PQ_query_param_absolute_time (&time_limit),
GNUNET_PQ_query_param_end
};
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_bool ("insufficient_funds",
insufficient_funds),
GNUNET_PQ_result_spec_end
struct IteratorContext ic = {
.cb = kac,
.cb_cls = kac_cls,
.pg = pg
};
PREPARE (pg,
"insert_reserve_open_deposit",
"SELECT "
" insufficient_funds"
" FROM exchange_do_reserve_open_deposit"
" ($1,$2,$3,$4,$5,$6);");
return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
"insert_reserve_open_deposit",
"iterate_reserve_close_info",
"SELECT"
" amount_val"
",amount_frac"
",timestamp"
" FROM FIXME"
" WHERE h_payto=$1"
" AND timestamp >= $2"
" ORDER BY timestamp DESC");
return GNUNET_PQ_eval_prepared_multi_select (pg->conn,
"iterate_reserve_close_info",
params,
rs);
&iterate_reserve_close_info_cb,
&ic);
}

View File

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