-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); 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 ( EXECUTE FORMAT (
'CREATE INDEX IF NOT EXISTS ' || table_name || '_merge_pub ' 'CREATE INDEX IF NOT EXISTS ' || table_name || '_merge_pub '
'ON ' || table_name || ' ' 'ON ' || table_name || ' '

View File

@ -1,6 +1,6 @@
/* /*
This file is part of GNUnet 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 GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published 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[] = { struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial), GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (&td->details.reserves.reserve_pub), 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.expiration_date),
GNUNET_PQ_query_param_timestamp (&td->details.reserves.gc_date), GNUNET_PQ_query_param_timestamp (&td->details.reserves.gc_date),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
@ -383,8 +382,6 @@ irbt_cb_table_known_coins (struct PostgresClosure *pg,
&td->details.known_coins.denom_sig), &td->details.known_coins.denom_sig),
GNUNET_PQ_query_param_uint64 ( GNUNET_PQ_query_param_uint64 (
&td->details.known_coins.denominations_serial), &td->details.known_coins.denominations_serial),
TALER_PQ_query_param_amount (
&td->details.known_coins.remaining),
GNUNET_PQ_query_param_end 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_salt),
GNUNET_PQ_query_param_auto_from_type ( GNUNET_PQ_query_param_auto_from_type (
&td->details.deposits.wire_target_h_payto), &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), GNUNET_PQ_query_param_bool (td->details.deposits.extension_blocked),
0 == td->details.deposits.extension_details_serial_id 0 == td->details.deposits.extension_details_serial_id
? GNUNET_PQ_query_param_null () ? 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 */ /* end of irbt_callbacks.c */

View File

@ -1,6 +1,6 @@
/* /*
This file is part of GNUnet 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 GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published 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) unsigned int num_results)
{ {
struct LookupRecordsByTableContext *ctx = cls; struct LookupRecordsByTableContext *ctx = cls;
struct PostgresClosure *pg = ctx->pg;
struct TALER_EXCHANGEDB_TableData td = { struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_RESERVES .table = TALER_EXCHANGEDB_RT_RESERVES
}; };
@ -231,8 +230,6 @@ lrbt_cb_table_reserves (void *cls,
&td.serial), &td.serial),
GNUNET_PQ_result_spec_auto_from_type ("reserve_pub", GNUNET_PQ_result_spec_auto_from_type ("reserve_pub",
&td.details.reserves.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", GNUNET_PQ_result_spec_timestamp ("expiration_date",
&td.details.reserves.expiration_date), &td.details.reserves.expiration_date),
GNUNET_PQ_result_spec_timestamp ("gc_date", GNUNET_PQ_result_spec_timestamp ("gc_date",
@ -659,7 +656,6 @@ lrbt_cb_table_known_coins (void *cls,
unsigned int num_results) unsigned int num_results)
{ {
struct LookupRecordsByTableContext *ctx = cls; struct LookupRecordsByTableContext *ctx = cls;
struct PostgresClosure *pg = ctx->pg;
struct TALER_EXCHANGEDB_TableData td = { struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_KNOWN_COINS .table = TALER_EXCHANGEDB_RT_KNOWN_COINS
}; };
@ -679,9 +675,6 @@ lrbt_cb_table_known_coins (void *cls,
GNUNET_PQ_result_spec_uint64 ( GNUNET_PQ_result_spec_uint64 (
"denominations_serial", "denominations_serial",
&td.details.known_coins.denominations_serial), &td.details.known_coins.denominations_serial),
TALER_PQ_RESULT_SPEC_AMOUNT (
"remaining",
&td.details.known_coins.remaining),
GNUNET_PQ_result_spec_end GNUNET_PQ_result_spec_end
}; };
@ -953,9 +946,6 @@ lrbt_cb_table_deposits (void *cls,
GNUNET_PQ_result_spec_auto_from_type ( GNUNET_PQ_result_spec_auto_from_type (
"wire_target_h_payto", "wire_target_h_payto",
&td.details.deposits.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 ( GNUNET_PQ_result_spec_auto_from_type (
"extension_blocked", "extension_blocked",
&td.details.deposits.extension_blocked), &td.details.deposits.extension_blocked),
@ -1455,10 +1445,10 @@ lrbt_cb_table_extension_details (void *cls,
struct TALER_EXCHANGEDB_TableData td = { struct TALER_EXCHANGEDB_TableData td = {
.table = TALER_EXCHANGEDB_RT_EXTENSION_DETAILS .table = TALER_EXCHANGEDB_RT_EXTENSION_DETAILS
}; };
bool no_config = false;
for (unsigned int i = 0; i<num_results; i++) for (unsigned int i = 0; i<num_results; i++)
{ {
bool no_config = false;
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_uint64 ("extension_details_serial_id", GNUNET_PQ_result_spec_uint64 ("extension_details_serial_id",
&td.serial), &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 */ /* 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"; statement = "select_above_serial_by_table_extension_details";
rh = &lrbt_cb_table_extension_details; rh = &lrbt_cb_table_extension_details;
break; 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: default:
GNUNET_break (0); GNUNET_break (0);
return GNUNET_DB_STATUS_HARD_ERROR; return GNUNET_DB_STATUS_HARD_ERROR;
@ -12872,6 +12912,36 @@ postgres_insert_records_by_table (void *cls,
case TALER_EXCHANGEDB_RT_EXTENSION_DETAILS: case TALER_EXCHANGEDB_RT_EXTENSION_DETAILS:
rh = &irbt_cb_table_extension_details; rh = &irbt_cb_table_extension_details;
break; 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: default:
GNUNET_break (0); GNUNET_break (0);
return GNUNET_DB_STATUS_HARD_ERROR; return GNUNET_DB_STATUS_HARD_ERROR;

View File

@ -216,6 +216,16 @@ enum TALER_EXCHANGEDB_ReplicatedTable
TALER_EXCHANGEDB_RT_RECOUP_REFRESH, TALER_EXCHANGEDB_RT_RECOUP_REFRESH,
TALER_EXCHANGEDB_RT_EXTENSIONS, TALER_EXCHANGEDB_RT_EXTENSIONS,
TALER_EXCHANGEDB_RT_EXTENSION_DETAILS, 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
{ {
struct TALER_ReservePublicKeyP reserve_pub; 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 expiration_date;
struct GNUNET_TIME_Timestamp gc_date; struct GNUNET_TIME_Timestamp gc_date;
} reserves; } reserves;
@ -347,7 +353,6 @@ struct TALER_EXCHANGEDB_TableData
struct TALER_AgeCommitmentHash age_hash; struct TALER_AgeCommitmentHash age_hash;
uint64_t denominations_serial; uint64_t denominations_serial;
struct TALER_DenominationSignature denom_sig; struct TALER_DenominationSignature denom_sig;
struct TALER_Amount remaining;
} known_coins; } known_coins;
struct struct
@ -394,7 +399,6 @@ struct TALER_EXCHANGEDB_TableData
struct TALER_CoinSpendSignatureP coin_sig; struct TALER_CoinSpendSignatureP coin_sig;
struct TALER_WireSaltP wire_salt; struct TALER_WireSaltP wire_salt;
struct TALER_PaytoHashP wire_target_h_payto; struct TALER_PaytoHashP wire_target_h_payto;
bool done;
bool extension_blocked; bool extension_blocked;
uint64_t extension_details_serial_id; uint64_t extension_details_serial_id;
} deposits; } deposits;
@ -476,6 +480,106 @@ struct TALER_EXCHANGEDB_TableData
char *extension_options; char *extension_options;
} extension_details; } 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; } details;
}; };