-towards p2p auditor sync implementation: SQL still missing

This commit is contained in:
Christian Grothoff 2022-05-30 23:55:55 +02:00
parent d55b093de8
commit 300194f42a
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
5 changed files with 1071 additions and 24 deletions

View File

@ -1186,7 +1186,7 @@ BEGIN
table_name = concat_ws('_', table_name, shard_suffix);
-- FIXME: change to materialized index by marge_pub!
-- FIXME: change to materialized index by merge_pub!
EXECUTE FORMAT (
'CREATE INDEX IF NOT EXISTS ' || table_name || '_merge_pub '
'ON ' || table_name || ' '

View File

@ -1,6 +1,6 @@
/*
This file is part of GNUnet
Copyright (C) 2020, 2021 Taler Systems SA
Copyright (C) 2020, 2021, 2022 Taler Systems SA
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
@ -150,7 +150,6 @@ irbt_cb_table_reserves (struct PostgresClosure *pg,
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (&td->details.reserves.reserve_pub),
TALER_PQ_query_param_amount (&td->details.reserves.current_balance),
GNUNET_PQ_query_param_timestamp (&td->details.reserves.expiration_date),
GNUNET_PQ_query_param_timestamp (&td->details.reserves.gc_date),
GNUNET_PQ_query_param_end
@ -383,8 +382,6 @@ irbt_cb_table_known_coins (struct PostgresClosure *pg,
&td->details.known_coins.denom_sig),
GNUNET_PQ_query_param_uint64 (
&td->details.known_coins.denominations_serial),
TALER_PQ_query_param_amount (
&td->details.known_coins.remaining),
GNUNET_PQ_query_param_end
};
@ -526,7 +523,6 @@ irbt_cb_table_deposits (struct PostgresClosure *pg,
GNUNET_PQ_query_param_auto_from_type (&td->details.deposits.wire_salt),
GNUNET_PQ_query_param_auto_from_type (
&td->details.deposits.wire_target_h_payto),
GNUNET_PQ_query_param_bool (td->details.deposits.done),
GNUNET_PQ_query_param_bool (td->details.deposits.extension_blocked),
0 == td->details.deposits.extension_details_serial_id
? GNUNET_PQ_query_param_null ()
@ -801,4 +797,301 @@ irbt_cb_table_extension_details (struct PostgresClosure *pg,
}
/**
* Function called with purse_requests records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_purse_requests (struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (
&td->details.purse_requests.merge_pub),
GNUNET_PQ_query_param_timestamp (
&td->details.purse_requests.purse_creation),
GNUNET_PQ_query_param_timestamp (
&td->details.purse_requests.purse_expiration),
GNUNET_PQ_query_param_auto_from_type (
&td->details.purse_requests.h_contract_terms),
GNUNET_PQ_query_param_uint32 (&td->details.purse_requests.age_limit),
GNUNET_PQ_query_param_uint32 (&td->details.purse_requests.flags),
TALER_PQ_query_param_amount (&td->details.purse_requests.amount_with_fee),
TALER_PQ_query_param_amount (&td->details.purse_requests.purse_fee),
GNUNET_PQ_query_param_auto_from_type (
&td->details.purse_requests.purse_sig),
GNUNET_PQ_query_param_end
};
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_purse_requests",
params);
}
/**
* Function called with purse_merges records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_purse_merges (struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (
&td->details.purse_merges.reserve_pub),
GNUNET_PQ_query_param_auto_from_type (&td->details.purse_merges.purse_pub),
GNUNET_PQ_query_param_auto_from_type (&td->details.purse_merges.merge_sig),
GNUNET_PQ_query_param_timestamp (&td->details.purse_merges.merge_timestamp),
GNUNET_PQ_query_param_end
};
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_purse_merges",
params);
}
/**
* Function called with purse_deposits records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_purse_deposits (struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (
&td->details.purse_deposits.purse_pub),
GNUNET_PQ_query_param_auto_from_type (&td->details.purse_deposits.coin_pub),
TALER_PQ_query_param_amount (&td->details.purse_deposits.amount_with_fee),
GNUNET_PQ_query_param_auto_from_type (&td->details.purse_deposits.coin_sig),
GNUNET_PQ_query_param_end
};
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_purse_deposits",
params);
}
/**
* Function called with account_mergers records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_account_mergers (struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (
&td->details.account_merges.reserve_pub),
GNUNET_PQ_query_param_auto_from_type (
&td->details.account_merges.reserve_sig),
GNUNET_PQ_query_param_auto_from_type (
&td->details.account_merges.purse_pub),
GNUNET_PQ_query_param_end
};
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_account_mergers",
params);
}
/**
* Function called with history_requests records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_history_requests (struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (
&td->details.history_requests.reserve_pub),
GNUNET_PQ_query_param_timestamp (
&td->details.history_requests.request_timestamp),
GNUNET_PQ_query_param_auto_from_type (
&td->details.history_requests.reserve_sig),
GNUNET_PQ_query_param_end
};
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_history_requests",
params);
}
/**
* Function called with close_requests records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_close_requests (struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (
&td->details.close_requests.reserve_pub),
GNUNET_PQ_query_param_timestamp (
&td->details.close_requests.close_timestamp),
GNUNET_PQ_query_param_auto_from_type (
&td->details.close_requests.reserve_sig),
GNUNET_PQ_query_param_end
};
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_close_requests",
params);
}
/**
* Function called with wads_out records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_wads_out (struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (&td->details.wads_out.wad_id),
TALER_PQ_query_param_amount (&td->details.wads_out.amount),
GNUNET_PQ_query_param_timestamp (&td->details.wads_out.execution_time),
GNUNET_PQ_query_param_end
};
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_wads_out",
params);
}
/**
* Function called with wads_out_entries records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_wads_out_entries (struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (
&td->details.wads_out_entries.reserve_pub),
GNUNET_PQ_query_param_auto_from_type (
&td->details.wads_out_entries.purse_pub),
GNUNET_PQ_query_param_auto_from_type (
&td->details.wads_out_entries.h_contract),
GNUNET_PQ_query_param_timestamp (
&td->details.wads_out_entries.purse_expiration),
GNUNET_PQ_query_param_timestamp (
&td->details.wads_out_entries.merge_timestamp),
TALER_PQ_query_param_amount (
&td->details.wads_out_entries.amount_with_fee),
TALER_PQ_query_param_amount (
&td->details.wads_out_entries.deposit_fees),
GNUNET_PQ_query_param_auto_from_type (
&td->details.wads_out_entries.reserve_sig),
GNUNET_PQ_query_param_auto_from_type (
&td->details.wads_out_entries.purse_sig),
GNUNET_PQ_query_param_end
};
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_wads_out_entries",
params);
}
/**
* Function called with wads_in records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_wads_in (struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (&td->details.wads_in.wad_id),
GNUNET_PQ_query_param_string (td->details.wads_in.origin_exchange_url),
TALER_PQ_query_param_amount (&td->details.wads_in.amount),
GNUNET_PQ_query_param_timestamp (&td->details.wads_in.arrival_time),
GNUNET_PQ_query_param_end
};
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_wads_in",
params);
}
/**
* Function called with wads_in_entries records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_wads_in_entries (struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (
&td->details.wads_in_entries.reserve_pub),
GNUNET_PQ_query_param_auto_from_type (
&td->details.wads_in_entries.purse_pub),
GNUNET_PQ_query_param_auto_from_type (
&td->details.wads_in_entries.h_contract),
GNUNET_PQ_query_param_timestamp (
&td->details.wads_in_entries.purse_expiration),
GNUNET_PQ_query_param_timestamp (
&td->details.wads_in_entries.merge_timestamp),
TALER_PQ_query_param_amount (
&td->details.wads_in_entries.amount_with_fee),
TALER_PQ_query_param_amount (
&td->details.wads_in_entries.wad_fee),
TALER_PQ_query_param_amount (
&td->details.wads_in_entries.deposit_fees),
GNUNET_PQ_query_param_auto_from_type (
&td->details.wads_in_entries.reserve_sig),
GNUNET_PQ_query_param_auto_from_type (
&td->details.wads_in_entries.purse_sig),
GNUNET_PQ_query_param_end
};
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_wads_in_entries",
params);
}
/* end of irbt_callbacks.c */

View File

@ -1,6 +1,6 @@
/*
This file is part of GNUnet
Copyright (C) 2020, 2021 Taler Systems SA
Copyright (C) 2020, 2021, 2022 Taler Systems SA
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
@ -219,7 +219,6 @@ lrbt_cb_table_reserves (void *cls,
unsigned int num_results)
{
struct LookupRecordsByTableContext *ctx = cls;
struct PostgresClosure *pg = ctx->pg;
struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_RESERVES
};
@ -231,8 +230,6 @@ lrbt_cb_table_reserves (void *cls,
&td.serial),
GNUNET_PQ_result_spec_auto_from_type ("reserve_pub",
&td.details.reserves.reserve_pub),
TALER_PQ_RESULT_SPEC_AMOUNT ("current_balance",
&td.details.reserves.current_balance),
GNUNET_PQ_result_spec_timestamp ("expiration_date",
&td.details.reserves.expiration_date),
GNUNET_PQ_result_spec_timestamp ("gc_date",
@ -659,7 +656,6 @@ lrbt_cb_table_known_coins (void *cls,
unsigned int num_results)
{
struct LookupRecordsByTableContext *ctx = cls;
struct PostgresClosure *pg = ctx->pg;
struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_KNOWN_COINS
};
@ -679,9 +675,6 @@ lrbt_cb_table_known_coins (void *cls,
GNUNET_PQ_result_spec_uint64 (
"denominations_serial",
&td.details.known_coins.denominations_serial),
TALER_PQ_RESULT_SPEC_AMOUNT (
"remaining",
&td.details.known_coins.remaining),
GNUNET_PQ_result_spec_end
};
@ -953,9 +946,6 @@ lrbt_cb_table_deposits (void *cls,
GNUNET_PQ_result_spec_auto_from_type (
"wire_target_h_payto",
&td.details.deposits.wire_target_h_payto),
GNUNET_PQ_result_spec_bool (
"done",
&td.details.deposits.done),
GNUNET_PQ_result_spec_auto_from_type (
"extension_blocked",
&td.details.deposits.extension_blocked),
@ -1455,10 +1445,10 @@ lrbt_cb_table_extension_details (void *cls,
struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_EXTENSION_DETAILS
};
bool no_config = false;
for (unsigned int i = 0; i<num_results; i++)
{
bool no_config = false;
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 ("extension_details_serial_id",
&td.serial),
@ -1486,4 +1476,594 @@ lrbt_cb_table_extension_details (void *cls,
}
/**
* Function called with purse_requests table entries.
*
* @param cls closure
* @param result the postgres result
* @param num_results the number of results in @a result
*/
static void
lrbt_cb_table_purse_requests (void *cls,
PGresult *result,
unsigned int num_results)
{
struct LookupRecordsByTableContext *ctx = cls;
struct PostgresClosure *pg = ctx->pg;
struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_PURSE_REQUESTS
};
for (unsigned int i = 0; i<num_results; i++)
{
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 (
"extension_details_serial_id",
&td.serial),
GNUNET_PQ_result_spec_auto_from_type (
"purse_pub",
&td.details.purse_requests.purse_pub),
GNUNET_PQ_result_spec_auto_from_type (
"merge_pub",
&td.details.purse_requests.merge_pub),
GNUNET_PQ_result_spec_timestamp (
"purse_creation",
&td.details.purse_requests.purse_creation),
GNUNET_PQ_result_spec_timestamp (
"purse_expiration",
&td.details.purse_requests.purse_expiration),
GNUNET_PQ_result_spec_auto_from_type (
"h_contract_terms",
&td.details.purse_requests.h_contract_terms),
GNUNET_PQ_result_spec_uint32 (
"age_limit",
&td.details.purse_requests.age_limit),
GNUNET_PQ_result_spec_uint32 (
"flags",
&td.details.purse_requests.flags),
TALER_PQ_RESULT_SPEC_AMOUNT (
"amount_with_fee",
&td.details.purse_requests.amount_with_fee),
TALER_PQ_RESULT_SPEC_AMOUNT (
"purse_fee",
&td.details.purse_requests.purse_fee),
GNUNET_PQ_result_spec_auto_from_type (
"purse_sig",
&td.details.purse_requests.purse_sig),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
i))
{
GNUNET_break (0);
ctx->error = true;
return;
}
ctx->cb (ctx->cb_cls,
&td);
GNUNET_PQ_cleanup_result (rs);
}
}
/**
* Function called with purse_merges table entries.
*
* @param cls closure
* @param result the postgres result
* @param num_results the number of results in @a result
*/
static void
lrbt_cb_table_purse_merges (void *cls,
PGresult *result,
unsigned int num_results)
{
struct LookupRecordsByTableContext *ctx = cls;
struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_PURSE_MERGES
};
for (unsigned int i = 0; i<num_results; i++)
{
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 (
"extension_details_serial_id",
&td.serial),
GNUNET_PQ_result_spec_auto_from_type (
"reserve_pub",
&td.details.purse_merges.reserve_pub),
GNUNET_PQ_result_spec_auto_from_type (
"purse_pub",
&td.details.purse_merges.purse_pub),
GNUNET_PQ_result_spec_auto_from_type (
"merge_sig",
&td.details.purse_merges.merge_sig),
GNUNET_PQ_result_spec_timestamp (
"purse_expiration",
&td.details.purse_merges.merge_timestamp),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
i))
{
GNUNET_break (0);
ctx->error = true;
return;
}
ctx->cb (ctx->cb_cls,
&td);
GNUNET_PQ_cleanup_result (rs);
}
}
/**
* Function called with purse_deposits table entries.
*
* @param cls closure
* @param result the postgres result
* @param num_results the number of results in @a result
*/
static void
lrbt_cb_table_purse_deposits (void *cls,
PGresult *result,
unsigned int num_results)
{
struct LookupRecordsByTableContext *ctx = cls;
struct PostgresClosure *pg = ctx->pg;
struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_PURSE_DEPOSITS
};
for (unsigned int i = 0; i<num_results; i++)
{
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 (
"extension_details_serial_id",
&td.serial),
GNUNET_PQ_result_spec_auto_from_type (
"purse_pub",
&td.details.purse_deposits.purse_pub),
GNUNET_PQ_result_spec_auto_from_type (
"coin_pub",
&td.details.purse_deposits.coin_pub),
TALER_PQ_RESULT_SPEC_AMOUNT (
"amount_with_fee",
&td.details.purse_deposits.amount_with_fee),
GNUNET_PQ_result_spec_auto_from_type (
"coin_sig",
&td.details.purse_deposits.coin_sig),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
i))
{
GNUNET_break (0);
ctx->error = true;
return;
}
ctx->cb (ctx->cb_cls,
&td);
GNUNET_PQ_cleanup_result (rs);
}
}
/**
* Function called with account_merges table entries.
*
* @param cls closure
* @param result the postgres result
* @param num_results the number of results in @a result
*/
static void
lrbt_cb_table_account_merges (void *cls,
PGresult *result,
unsigned int num_results)
{
struct LookupRecordsByTableContext *ctx = cls;
struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_ACCOUNT_MERGES
};
for (unsigned int i = 0; i<num_results; i++)
{
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 (
"extension_details_serial_id",
&td.serial),
GNUNET_PQ_result_spec_auto_from_type (
"reserve_pub",
&td.details.account_merges.reserve_pub),
GNUNET_PQ_result_spec_auto_from_type (
"reserve_sig",
&td.details.account_merges.reserve_sig),
GNUNET_PQ_result_spec_auto_from_type (
"purse_pub",
&td.details.account_merges.purse_pub),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
i))
{
GNUNET_break (0);
ctx->error = true;
return;
}
ctx->cb (ctx->cb_cls,
&td);
GNUNET_PQ_cleanup_result (rs);
}
}
/**
* Function called with history_requests table entries.
*
* @param cls closure
* @param result the postgres result
* @param num_results the number of results in @a result
*/
static void
lrbt_cb_table_history_requests (void *cls,
PGresult *result,
unsigned int num_results)
{
struct LookupRecordsByTableContext *ctx = cls;
struct PostgresClosure *pg = ctx->pg;
struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_HISTORY_REQUESTS
};
for (unsigned int i = 0; i<num_results; i++)
{
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 (
"extension_details_serial_id",
&td.serial),
GNUNET_PQ_result_spec_auto_from_type (
"reserve_pub",
&td.details.history_requests.reserve_pub),
GNUNET_PQ_result_spec_auto_from_type (
"reserve_sig",
&td.details.history_requests.reserve_sig),
TALER_PQ_RESULT_SPEC_AMOUNT (
"history_fee",
&td.details.history_requests.history_fee),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
i))
{
GNUNET_break (0);
ctx->error = true;
return;
}
ctx->cb (ctx->cb_cls,
&td);
GNUNET_PQ_cleanup_result (rs);
}
}
/**
* Function called with close_requests table entries.
*
* @param cls closure
* @param result the postgres result
* @param num_results the number of results in @a result
*/
static void
lrbt_cb_table_close_requests (void *cls,
PGresult *result,
unsigned int num_results)
{
struct LookupRecordsByTableContext *ctx = cls;
struct PostgresClosure *pg = ctx->pg;
struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_CLOSE_REQUESTS
};
for (unsigned int i = 0; i<num_results; i++)
{
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 (
"extension_details_serial_id",
&td.serial),
GNUNET_PQ_result_spec_auto_from_type (
"reserve_pub",
&td.details.close_requests.reserve_pub),
GNUNET_PQ_result_spec_auto_from_type (
"reserve_sig",
&td.details.close_requests.reserve_sig),
TALER_PQ_RESULT_SPEC_AMOUNT (
"close",
&td.details.close_requests.close),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
i))
{
GNUNET_break (0);
ctx->error = true;
return;
}
ctx->cb (ctx->cb_cls,
&td);
GNUNET_PQ_cleanup_result (rs);
}
}
/**
* Function called with wads_out table entries.
*
* @param cls closure
* @param result the postgres result
* @param num_results the number of results in @a result
*/
static void
lrbt_cb_table_wads_out (void *cls,
PGresult *result,
unsigned int num_results)
{
struct LookupRecordsByTableContext *ctx = cls;
struct PostgresClosure *pg = ctx->pg;
struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_WADS_OUT
};
for (unsigned int i = 0; i<num_results; i++)
{
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 (
"extension_details_serial_id",
&td.serial),
GNUNET_PQ_result_spec_auto_from_type (
"wad_id",
&td.details.wads_out.wad_id),
GNUNET_PQ_result_spec_uint64 (
"partner_serial_id",
&td.details.wads_out.partner_serial_id),
TALER_PQ_RESULT_SPEC_AMOUNT (
"amount",
&td.details.wads_out.amount),
GNUNET_PQ_result_spec_timestamp (
"execution_time",
&td.details.wads_out.execution_time),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
i))
{
GNUNET_break (0);
ctx->error = true;
return;
}
ctx->cb (ctx->cb_cls,
&td);
GNUNET_PQ_cleanup_result (rs);
}
}
/**
* Function called with wads_out_entries table entries.
*
* @param cls closure
* @param result the postgres result
* @param num_results the number of results in @a result
*/
static void
lrbt_cb_table_wads_out_entries (void *cls,
PGresult *result,
unsigned int num_results)
{
struct LookupRecordsByTableContext *ctx = cls;
struct PostgresClosure *pg = ctx->pg;
struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_WADS_OUT_ENTRIES
};
for (unsigned int i = 0; i<num_results; i++)
{
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 (
"extension_details_serial_id",
&td.serial),
GNUNET_PQ_result_spec_auto_from_type (
"reserve_pub",
&td.details.wads_out_entries.reserve_pub),
GNUNET_PQ_result_spec_auto_from_type (
"purse_pub",
&td.details.wads_out_entries.purse_pub),
GNUNET_PQ_result_spec_auto_from_type (
"h_contract",
&td.details.wads_out_entries.h_contract),
GNUNET_PQ_result_spec_timestamp (
"purse_expiration",
&td.details.wads_out_entries.purse_expiration),
GNUNET_PQ_result_spec_timestamp (
"merge_timestamp",
&td.details.wads_out_entries.merge_timestamp),
TALER_PQ_RESULT_SPEC_AMOUNT (
"amount_with_fee",
&td.details.wads_out_entries.amount_with_fee),
TALER_PQ_RESULT_SPEC_AMOUNT (
"deposit_fees",
&td.details.wads_out_entries.deposit_fees),
GNUNET_PQ_result_spec_auto_from_type (
"reserve_sig",
&td.details.wads_out_entries.reserve_sig),
GNUNET_PQ_result_spec_auto_from_type (
"purse_sig",
&td.details.wads_out_entries.purse_sig),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
i))
{
GNUNET_break (0);
ctx->error = true;
return;
}
ctx->cb (ctx->cb_cls,
&td);
GNUNET_PQ_cleanup_result (rs);
}
}
/**
* Function called with wads_in table entries.
*
* @param cls closure
* @param result the postgres result
* @param num_results the number of results in @a result
*/
static void
lrbt_cb_table_wads_in (void *cls,
PGresult *result,
unsigned int num_results)
{
struct LookupRecordsByTableContext *ctx = cls;
struct PostgresClosure *pg = ctx->pg;
struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_WADS_IN
};
for (unsigned int i = 0; i<num_results; i++)
{
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 (
"extension_details_serial_id",
&td.serial),
GNUNET_PQ_result_spec_auto_from_type (
"wad_id",
&td.details.wads_in.wad_id),
GNUNET_PQ_result_spec_string (
"origin_exchange_url",
&td.details.wads_in.origin_exchange_url),
TALER_PQ_RESULT_SPEC_AMOUNT (
"amount",
&td.details.wads_in.amount),
GNUNET_PQ_result_spec_timestamp (
"arrival_time",
&td.details.wads_in.arrival_time),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
i))
{
GNUNET_break (0);
ctx->error = true;
return;
}
ctx->cb (ctx->cb_cls,
&td);
GNUNET_PQ_cleanup_result (rs);
}
}
/**
* Function called with wads_in_entries table entries.
*
* @param cls closure
* @param result the postgres result
* @param num_results the number of results in @a result
*/
static void
lrbt_cb_table_wads_in_entries (void *cls,
PGresult *result,
unsigned int num_results)
{
struct LookupRecordsByTableContext *ctx = cls;
struct PostgresClosure *pg = ctx->pg;
struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_WADS_IN_ENTRIES
};
for (unsigned int i = 0; i<num_results; i++)
{
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 (
"extension_details_serial_id",
&td.serial),
GNUNET_PQ_result_spec_auto_from_type (
"reserve_pub",
&td.details.wads_in_entries.reserve_pub),
GNUNET_PQ_result_spec_auto_from_type (
"purse_pub",
&td.details.wads_in_entries.purse_pub),
GNUNET_PQ_result_spec_auto_from_type (
"h_contract",
&td.details.wads_in_entries.h_contract),
GNUNET_PQ_result_spec_timestamp (
"purse_expiration",
&td.details.wads_in_entries.purse_expiration),
GNUNET_PQ_result_spec_timestamp (
"merge_timestamp",
&td.details.wads_in_entries.merge_timestamp),
TALER_PQ_RESULT_SPEC_AMOUNT (
"amount_with_fee",
&td.details.wads_in_entries.amount_with_fee),
TALER_PQ_RESULT_SPEC_AMOUNT (
"wad_fee",
&td.details.wads_in_entries.wad_fee),
TALER_PQ_RESULT_SPEC_AMOUNT (
"deposit_fees",
&td.details.wads_in_entries.deposit_fees),
GNUNET_PQ_result_spec_auto_from_type (
"reserve_sig",
&td.details.wads_in_entries.reserve_sig),
GNUNET_PQ_result_spec_auto_from_type (
"purse_sig",
&td.details.wads_in_entries.purse_sig),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
i))
{
GNUNET_break (0);
ctx->error = true;
return;
}
ctx->cb (ctx->cb_cls,
&td);
GNUNET_PQ_cleanup_result (rs);
}
}
/* end of lrbt_callbacks.c */

View File

@ -12738,6 +12738,46 @@ postgres_lookup_records_by_table (void *cls,
statement = "select_above_serial_by_table_extension_details";
rh = &lrbt_cb_table_extension_details;
break;
case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
statement = "select_above_serial_by_table_purse_requests";
rh = &lrbt_cb_table_purse_requests;
break;
case TALER_EXCHANGEDB_RT_PURSE_MERGES:
statement = "select_above_serial_by_table_purse_merges";
rh = &lrbt_cb_table_purse_merges;
break;
case TALER_EXCHANGEDB_RT_PURSE_DEPOSITS:
statement = "select_above_serial_by_table_purse_deposits";
rh = &lrbt_cb_table_purse_deposits;
break;
case TALER_EXCHANGEDB_RT_ACCOUNT_MERGES:
statement = "select_above_serial_by_table_account_merges";
rh = &lrbt_cb_table_account_merges;
break;
case TALER_EXCHANGEDB_RT_HISTORY_REQUESTS:
statement = "select_above_serial_by_table_history_requests";
rh = &lrbt_cb_table_history_requests;
break;
case TALER_EXCHANGEDB_RT_CLOSE_REQUESTS:
statement = "select_above_serial_by_table_close_requests";
rh = &lrbt_cb_table_close_requests;
break;
case TALER_EXCHANGEDB_RT_WADS_OUT:
statement = "select_above_serial_by_table_wads_out";
rh = &lrbt_cb_table_wads_out;
break;
case TALER_EXCHANGEDB_RT_WADS_OUT_ENTRIES:
statement = "select_above_serial_by_table_wads_out_entries";
rh = &lrbt_cb_table_wads_out_entries;
break;
case TALER_EXCHANGEDB_RT_WADS_IN:
statement = "select_above_serial_by_table_wads_in";
rh = &lrbt_cb_table_wads_in;
break;
case TALER_EXCHANGEDB_RT_WADS_IN_ENTRIES:
statement = "select_above_serial_by_table_wads_in_entries";
rh = &lrbt_cb_table_wads_in_entries;
break;
default:
GNUNET_break (0);
return GNUNET_DB_STATUS_HARD_ERROR;
@ -12872,6 +12912,36 @@ postgres_insert_records_by_table (void *cls,
case TALER_EXCHANGEDB_RT_EXTENSION_DETAILS:
rh = &irbt_cb_table_extension_details;
break;
case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
rh = &irbt_cb_table_purse_requests;
break;
case TALER_EXCHANGEDB_RT_PURSE_MERGES:
rh = &irbt_cb_table_purse_merges;
break;
case TALER_EXCHANGEDB_RT_PURSE_DEPOSITS:
rh = &irbt_cb_table_purse_deposits;
break;
case TALER_EXCHANGEDB_RT_ACCOUNT_MERGES:
rh = &irbt_cb_table_account_mergers;
break;
case TALER_EXCHANGEDB_RT_HISTORY_REQUESTS:
rh = &irbt_cb_table_history_requests;
break;
case TALER_EXCHANGEDB_RT_CLOSE_REQUESTS:
rh = &irbt_cb_table_close_requests;
break;
case TALER_EXCHANGEDB_RT_WADS_OUT:
rh = &irbt_cb_table_wads_out;
break;
case TALER_EXCHANGEDB_RT_WADS_OUT_ENTRIES:
rh = &irbt_cb_table_wads_out_entries;
break;
case TALER_EXCHANGEDB_RT_WADS_IN:
rh = &irbt_cb_table_wads_in;
break;
case TALER_EXCHANGEDB_RT_WADS_IN_ENTRIES:
rh = &irbt_cb_table_wads_in_entries;
break;
default:
GNUNET_break (0);
return GNUNET_DB_STATUS_HARD_ERROR;

View File

@ -216,6 +216,16 @@ enum TALER_EXCHANGEDB_ReplicatedTable
TALER_EXCHANGEDB_RT_RECOUP_REFRESH,
TALER_EXCHANGEDB_RT_EXTENSIONS,
TALER_EXCHANGEDB_RT_EXTENSION_DETAILS,
TALER_EXCHANGEDB_RT_PURSE_REQUESTS,
TALER_EXCHANGEDB_RT_PURSE_MERGES,
TALER_EXCHANGEDB_RT_PURSE_DEPOSITS,
TALER_EXCHANGEDB_RT_ACCOUNT_MERGES,
TALER_EXCHANGEDB_RT_HISTORY_REQUESTS,
TALER_EXCHANGEDB_RT_CLOSE_REQUESTS,
TALER_EXCHANGEDB_RT_WADS_OUT,
TALER_EXCHANGEDB_RT_WADS_OUT_ENTRIES,
TALER_EXCHANGEDB_RT_WADS_IN,
TALER_EXCHANGEDB_RT_WADS_IN_ENTRIES,
};
@ -273,10 +283,6 @@ struct TALER_EXCHANGEDB_TableData
struct
{
struct TALER_ReservePublicKeyP reserve_pub;
/**
* Note: not useful for auditor, because not UPDATEd!
*/
struct TALER_Amount current_balance;
struct GNUNET_TIME_Timestamp expiration_date;
struct GNUNET_TIME_Timestamp gc_date;
} reserves;
@ -347,7 +353,6 @@ struct TALER_EXCHANGEDB_TableData
struct TALER_AgeCommitmentHash age_hash;
uint64_t denominations_serial;
struct TALER_DenominationSignature denom_sig;
struct TALER_Amount remaining;
} known_coins;
struct
@ -394,7 +399,6 @@ struct TALER_EXCHANGEDB_TableData
struct TALER_CoinSpendSignatureP coin_sig;
struct TALER_WireSaltP wire_salt;
struct TALER_PaytoHashP wire_target_h_payto;
bool done;
bool extension_blocked;
uint64_t extension_details_serial_id;
} deposits;
@ -476,6 +480,106 @@ struct TALER_EXCHANGEDB_TableData
char *extension_options;
} extension_details;
struct
{
struct TALER_PurseContractPublicKeyP purse_pub;
struct TALER_PurseMergePublicKeyP merge_pub;
struct GNUNET_TIME_Timestamp purse_creation;
struct GNUNET_TIME_Timestamp purse_expiration;
struct TALER_PrivateContractHashP h_contract_terms;
uint32_t age_limit;
uint32_t flags;
struct TALER_Amount amount_with_fee;
struct TALER_Amount purse_fee;
struct TALER_PurseContractSignatureP purse_sig;
} purse_requests;
struct
{
uint64_t partner_serial_id;
struct TALER_ReservePublicKeyP reserve_pub;
struct TALER_PurseContractPublicKeyP purse_pub;
struct TALER_PurseMergeSignatureP merge_sig;
struct GNUNET_TIME_Timestamp merge_timestamp;
} purse_merges;
struct
{
uint64_t partner_serial_id;
struct TALER_PurseContractPublicKeyP purse_pub;
struct TALER_CoinSpendPublicKeyP coin_pub;
struct TALER_Amount amount_with_fee;
struct TALER_CoinSpendSignatureP coin_sig;
} purse_deposits;
struct
{
struct TALER_ReservePublicKeyP reserve_pub;
struct TALER_ReserveSignatureP reserve_sig;
struct TALER_PurseContractPublicKeyP purse_pub;
} account_merges;
struct
{
struct TALER_ReservePublicKeyP reserve_pub;
struct TALER_ReserveSignatureP reserve_sig;
struct GNUNET_TIME_Timestamp request_timestamp;
struct TALER_Amount history_fee;
} history_requests;
struct
{
struct TALER_ReservePublicKeyP reserve_pub;
struct GNUNET_TIME_Timestamp close_timestamp;
struct TALER_ReserveSignatureP reserve_sig;
struct TALER_Amount close;
} close_requests;
struct
{
struct TALER_WadIdentifierP wad_id;
uint64_t partner_serial_id;
struct TALER_Amount amount;
struct GNUNET_TIME_Timestamp execution_time;
} wads_out;
struct
{
uint64_t wad_out_serial_id;
struct TALER_ReservePublicKeyP reserve_pub;
struct TALER_PurseContractPublicKeyP purse_pub;
struct TALER_PrivateContractHashP h_contract;
struct GNUNET_TIME_Timestamp purse_expiration;
struct GNUNET_TIME_Timestamp merge_timestamp;
struct TALER_Amount amount_with_fee;
struct TALER_Amount deposit_fees;
struct TALER_ReserveSignatureP reserve_sig;
struct TALER_PurseContractSignatureP purse_sig;
} wads_out_entries;
struct
{
struct TALER_WadIdentifierP wad_id;
char *origin_exchange_url;
struct TALER_Amount amount;
struct GNUNET_TIME_Timestamp arrival_time;
} wads_in;
struct
{
uint64_t wad_in_serial_id;
struct TALER_ReservePublicKeyP reserve_pub;
struct TALER_PurseContractPublicKeyP purse_pub;
struct TALER_PrivateContractHashP h_contract;
struct GNUNET_TIME_Timestamp purse_expiration;
struct GNUNET_TIME_Timestamp merge_timestamp;
struct TALER_Amount amount_with_fee;
struct TALER_Amount wad_fee;
struct TALER_Amount deposit_fees;
struct TALER_ReserveSignatureP reserve_sig;
struct TALER_PurseContractSignatureP purse_sig;
} wads_in_entries;
} details;
};