/*
This file is part of GNUnet
Copyright (C) 2020-2023 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
by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.
GNUnet is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
SPDX-License-Identifier: AGPL3.0-or-later
*/
/**
* @file exchangedb/pg_insert_records_by_table.c
* @brief replicate_records_by_table implementation
* @author Christian Grothoff
* @author Özgür Kesim
*/
#include "platform.h"
#include "taler_error_codes.h"
#include "taler_dbevents.h"
#include "taler_pq_lib.h"
#include "pg_insert_records_by_table.h"
#include "pg_helper.h"
#include
/**
* Signature of helper functions of #TEH_PG_insert_records_by_table().
*
* @param pg plugin context
* @param td record to insert
* @return transaction status code
*/
typedef enum GNUNET_DB_QueryStatus
(*InsertRecordCallback)(struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td);
/**
* Function called with denominations records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_denominations (struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct TALER_DenominationHashP denom_hash;
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (&denom_hash),
GNUNET_PQ_query_param_uint32 (
&td->details.denominations.denom_type),
GNUNET_PQ_query_param_uint32 (
&td->details.denominations.age_mask),
TALER_PQ_query_param_denom_pub (
&td->details.denominations.denom_pub),
GNUNET_PQ_query_param_auto_from_type (
&td->details.denominations.master_sig),
GNUNET_PQ_query_param_timestamp (
&td->details.denominations.valid_from),
GNUNET_PQ_query_param_timestamp (
&td->details.denominations.expire_withdraw),
GNUNET_PQ_query_param_timestamp (
&td->details.denominations.expire_deposit),
GNUNET_PQ_query_param_timestamp (
&td->details.denominations.expire_legal),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.denominations.coin),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.denominations.fees.withdraw),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.denominations.fees.deposit),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.denominations.fees.refresh),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.denominations.fees.refund),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_denominations",
"INSERT INTO denominations"
"(denominations_serial"
",denom_pub_hash"
",denom_type"
",age_mask"
",denom_pub"
",master_sig"
",valid_from"
",expire_withdraw"
",expire_deposit"
",expire_legal"
",coin"
",fee_withdraw"
",fee_deposit"
",fee_refresh"
",fee_refund"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10,"
" $11, $12, $13, $14, $15);");
TALER_denom_pub_hash (
&td->details.denominations.denom_pub,
&denom_hash);
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_denominations",
params);
}
/**
* Function called with denomination_revocations records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_denomination_revocations (
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.denomination_revocations.master_sig),
GNUNET_PQ_query_param_uint64 (
&td->details.denomination_revocations.denominations_serial),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_denomination_revocations",
"INSERT INTO denomination_revocations"
"(denom_revocations_serial_id"
",master_sig"
",denominations_serial"
") VALUES "
"($1, $2, $3);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_denomination_revocations",
params);
}
/**
* Function called with denominations records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_wire_targets (struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct TALER_PaytoHashP payto_hash;
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (&payto_hash),
GNUNET_PQ_query_param_string (
td->details.wire_targets.payto_uri),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_wire_targets",
"INSERT INTO wire_targets"
"(wire_target_serial_id"
",wire_target_h_payto"
",payto_uri"
") VALUES "
"($1, $2, $3);");
TALER_payto_hash (
td->details.wire_targets.payto_uri,
&payto_hash);
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_wire_targets",
params);
}
/**
* Function called with records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_legitimization_processes (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.legitimization_processes.h_payto),
GNUNET_PQ_query_param_timestamp (
&td->details.legitimization_processes.expiration_time),
GNUNET_PQ_query_param_string (
td->details.legitimization_processes.provider_section),
GNUNET_PQ_query_param_string (
td->details.legitimization_processes.provider_user_id),
GNUNET_PQ_query_param_string (
td->details.legitimization_processes.provider_legitimization_id),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_legitimization_processes",
"INSERT INTO legitimization_processes"
"(legitimization_process_serial_id"
",h_payto"
",expiration_time"
",provider_section"
",provider_user_id"
",provider_legitimization_id"
") VALUES "
"($1, $3, $4, $5, $6, %7);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_legitimization_processes",
params);
}
/**
* Function called with records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_legitimization_requirements (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.legitimization_requirements.h_payto),
td->details.legitimization_requirements.no_reserve_pub
? GNUNET_PQ_query_param_null ()
: GNUNET_PQ_query_param_auto_from_type (
&td->details.legitimization_requirements.reserve_pub),
GNUNET_PQ_query_param_string (
td->details.legitimization_requirements.required_checks),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_legitimization_requirements",
"INSERT INTO legitimization_requirements"
"(legitimization_requirement_serial_id"
",h_payto"
",reserve_pub"
",required_checks"
") VALUES "
"($1, $2, $3);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_legitimization_requirements",
params);
}
/**
* Function called with reserves records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_reserves (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.reserves.reserve_pub),
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
};
PREPARE (pg,
"insert_into_table_reserves",
"INSERT INTO reserves"
"(reserve_uuid"
",reserve_pub"
",expiration_date"
",gc_date"
") VALUES "
"($1, $2, $3, $4);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_reserves",
params);
}
/**
* Function called with reserves_in records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_reserves_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_uint64 (&td->details.reserves_in.wire_reference),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.reserves_in.credit),
GNUNET_PQ_query_param_auto_from_type (
&td->details.reserves_in.sender_account_h_payto),
GNUNET_PQ_query_param_string (
td->details.reserves_in.exchange_account_section),
GNUNET_PQ_query_param_timestamp (
&td->details.reserves_in.execution_date),
GNUNET_PQ_query_param_auto_from_type (&td->details.reserves_in.reserve_pub),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_reserves_in",
"INSERT INTO reserves_in"
"(reserve_in_serial_id"
",wire_reference"
",credit"
",wire_source_h_payto"
",exchange_account_section"
",execution_date"
",reserve_pub"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_reserves_in",
params);
}
/**
* Function called with reserves_open_requests records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_reserves_open_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_timestamp (
&td->details.reserves_open_requests.expiration_date),
GNUNET_PQ_query_param_auto_from_type (
&td->details.reserves_open_requests.reserve_sig),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.reserves_open_requests.reserve_payment),
GNUNET_PQ_query_param_uint32 (
&td->details.reserves_open_requests.requested_purse_limit),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_reserves_open_requests",
"INSERT INTO reserves_open_requests"
"(open_request_uuid"
",reserve_pub"
",request_timestamp"
",expiration_date"
",reserve_sig"
",reserve_payment"
",requested_purse_limit"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_reserves_open_requests",
params);
}
/**
* Function called with reserves_open_requests records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_reserves_open_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.reserves_open_deposits.coin_pub),
GNUNET_PQ_query_param_auto_from_type (
&td->details.reserves_open_deposits.coin_sig),
GNUNET_PQ_query_param_auto_from_type (
&td->details.reserves_open_deposits.reserve_sig),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.reserves_open_deposits.contribution),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_reserves_open_deposits",
"INSERT INTO reserves_open_deposits"
"(reserve_open_deposit_uuid"
",reserve_sig"
",reserve_pub"
",coin_pub"
",coin_sig"
",contribution"
") VALUES "
"($1, $2, $3, $4, $5, $6);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_reserves_open_deposits",
params);
}
/**
* Function called with reserves_close records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_reserves_close (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_timestamp (
&td->details.reserves_close.execution_date),
GNUNET_PQ_query_param_auto_from_type (
&td->details.reserves_close.wtid),
GNUNET_PQ_query_param_auto_from_type (
&td->details.reserves_close.sender_account_h_payto),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.reserves_close.amount),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.reserves_close.closing_fee),
GNUNET_PQ_query_param_auto_from_type (
&td->details.reserves_close.reserve_pub),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_reserves_close",
"INSERT INTO reserves_close"
"(close_uuid"
",execution_date"
",wtid"
",wire_target_h_payto"
",amount"
",closing_fee"
",reserve_pub"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_reserves_close",
params);
}
/**
* Function called with reserves_out records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_reserves_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.reserves_out.h_blind_ev),
GNUNET_PQ_query_param_uint64 (
&td->details.reserves_out.denominations_serial),
TALER_PQ_query_param_blinded_denom_sig (
&td->details.reserves_out.denom_sig),
GNUNET_PQ_query_param_uint64 (
&td->details.reserves_out.reserve_uuid),
GNUNET_PQ_query_param_auto_from_type (
&td->details.reserves_out.reserve_sig),
GNUNET_PQ_query_param_timestamp (
&td->details.reserves_out.execution_date),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.reserves_out.amount_with_fee),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_reserves_out",
"INSERT INTO reserves_out"
"(reserve_out_serial_id"
",h_blind_ev"
",denominations_serial"
",denom_sig"
",reserve_uuid"
",reserve_sig"
",execution_date"
",amount_with_fee"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_reserves_out",
params);
}
/**
* Function called with auditors records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_auditors (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.auditors.auditor_pub),
GNUNET_PQ_query_param_string (td->details.auditors.auditor_name),
GNUNET_PQ_query_param_string (td->details.auditors.auditor_url),
GNUNET_PQ_query_param_bool (td->details.auditors.is_active),
GNUNET_PQ_query_param_timestamp (&td->details.auditors.last_change),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_auditors",
"INSERT INTO auditors"
"(auditor_uuid"
",auditor_pub"
",auditor_name"
",auditor_url"
",is_active"
",last_change"
") VALUES "
"($1, $2, $3, $4, $5, $6);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_auditors",
params);
}
/**
* Function called with auditor_denom_sigs records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_auditor_denom_sigs (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_uint64 (&td->details.auditor_denom_sigs.auditor_uuid),
GNUNET_PQ_query_param_uint64 (
&td->details.auditor_denom_sigs.denominations_serial),
GNUNET_PQ_query_param_auto_from_type (
&td->details.auditor_denom_sigs.auditor_sig),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_auditor_denom_sigs",
"INSERT INTO auditor_denom_sigs"
"(auditor_denom_serial"
",auditor_uuid"
",denominations_serial"
",auditor_sig"
") VALUES "
"($1, $2, $3, $4);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_auditor_denom_sigs",
params);
}
/**
* Function called with exchange_sign_keys records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_exchange_sign_keys (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.exchange_sign_keys.exchange_pub),
GNUNET_PQ_query_param_auto_from_type (
&td->details.exchange_sign_keys.master_sig),
GNUNET_PQ_query_param_timestamp (
&td->details.exchange_sign_keys.meta.start),
GNUNET_PQ_query_param_timestamp (
&td->details.exchange_sign_keys.meta.expire_sign),
GNUNET_PQ_query_param_timestamp (
&td->details.exchange_sign_keys.meta.expire_legal),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_exchange_sign_keys",
"INSERT INTO exchange_sign_keys"
"(esk_serial"
",exchange_pub"
",master_sig"
",valid_from"
",expire_sign"
",expire_legal"
") VALUES "
"($1, $2, $3, $4, $5, $6);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_exchange_sign_keys",
params);
}
/**
* Function called with signkey_revocations records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_signkey_revocations (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_uint64 (&td->details.signkey_revocations.esk_serial),
GNUNET_PQ_query_param_auto_from_type (
&td->details.signkey_revocations.master_sig),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_signkey_revocations",
"INSERT INTO signkey_revocations"
"(signkey_revocations_serial_id"
",esk_serial"
",master_sig"
") VALUES "
"($1, $2, $3);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_signkey_revocations",
params);
}
/**
* Function called with known_coins records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_known_coins (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.known_coins.coin_pub),
TALER_PQ_query_param_denom_sig (
&td->details.known_coins.denom_sig),
GNUNET_PQ_query_param_uint64 (
&td->details.known_coins.denominations_serial),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_known_coins",
"INSERT INTO known_coins"
"(known_coin_id"
",coin_pub"
",denom_sig"
",denominations_serial"
") VALUES "
"($1, $2, $3, $4);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_known_coins",
params);
}
/**
* Function called with refresh_commitments records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_refresh_commitments (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.refresh_commitments.rc),
GNUNET_PQ_query_param_auto_from_type (
&td->details.refresh_commitments.old_coin_sig),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.refresh_commitments.amount_with_fee),
GNUNET_PQ_query_param_uint32 (
&td->details.refresh_commitments.noreveal_index),
GNUNET_PQ_query_param_auto_from_type (
&td->details.refresh_commitments.old_coin_pub),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_refresh_commitments",
"INSERT INTO refresh_commitments"
"(melt_serial_id"
",rc"
",old_coin_sig"
",amount_with_fee"
",noreveal_index"
",old_coin_pub"
") VALUES "
"($1, $2, $3, $4, $5, $6);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_refresh_commitments",
params);
}
/**
* Function called with refresh_revealed_coins records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_refresh_revealed_coins (
struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct GNUNET_HashCode h_coin_ev;
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_uint32 (
&td->details.refresh_revealed_coins.freshcoin_index),
GNUNET_PQ_query_param_auto_from_type (
&td->details.refresh_revealed_coins.link_sig),
GNUNET_PQ_query_param_fixed_size (
td->details.refresh_revealed_coins.coin_ev,
td->details.refresh_revealed_coins.
coin_ev_size),
GNUNET_PQ_query_param_auto_from_type (&h_coin_ev),
TALER_PQ_query_param_blinded_denom_sig (
&td->details.refresh_revealed_coins.ev_sig),
TALER_PQ_query_param_exchange_withdraw_values (
&td->details.refresh_revealed_coins.ewv),
GNUNET_PQ_query_param_uint64 (
&td->details.refresh_revealed_coins.denominations_serial),
GNUNET_PQ_query_param_uint64 (
&td->details.refresh_revealed_coins.melt_serial_id),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_refresh_revealed_coins",
"INSERT INTO refresh_revealed_coins"
"(rrc_serial"
",freshcoin_index"
",link_sig"
",coin_ev"
",h_coin_ev"
",ev_sig"
",ewv"
",denominations_serial"
",melt_serial_id"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8, $9);");
GNUNET_CRYPTO_hash (td->details.refresh_revealed_coins.coin_ev,
td->details.refresh_revealed_coins.coin_ev_size,
&h_coin_ev);
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_refresh_revealed_coins",
params);
}
/**
* Function called with refresh_transfer_keys records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_refresh_transfer_keys (
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.refresh_transfer_keys.tp),
GNUNET_PQ_query_param_fixed_size (
&td->details.refresh_transfer_keys.tprivs[0],
(TALER_CNC_KAPPA - 1)
* sizeof (struct TALER_TransferPrivateKeyP)),
GNUNET_PQ_query_param_uint64 (
&td->details.refresh_transfer_keys.melt_serial_id),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_refresh_transfer_keys",
"INSERT INTO refresh_transfer_keys"
"(rtc_serial"
",transfer_pub"
",transfer_privs"
",melt_serial_id"
") VALUES "
"($1, $2, $3, $4);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_refresh_transfer_keys",
params);
}
/**
* Function called with deposits records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_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_uint64 (&td->details.deposits.shard),
GNUNET_PQ_query_param_uint64 (&td->details.deposits.known_coin_id),
GNUNET_PQ_query_param_auto_from_type (
&td->details.deposits.coin_pub),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.deposits.amount_with_fee),
GNUNET_PQ_query_param_timestamp (&td->details.deposits.wallet_timestamp),
GNUNET_PQ_query_param_timestamp (
&td->details.deposits.exchange_timestamp),
GNUNET_PQ_query_param_timestamp (&td->details.deposits.refund_deadline),
GNUNET_PQ_query_param_timestamp (&td->details.deposits.wire_deadline),
GNUNET_PQ_query_param_auto_from_type (&td->details.deposits.merchant_pub),
GNUNET_PQ_query_param_auto_from_type (
&td->details.deposits.h_contract_terms),
GNUNET_PQ_query_param_auto_from_type (&td->details.deposits.coin_sig),
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.policy_blocked),
0 == td->details.deposits.policy_details_serial_id
? GNUNET_PQ_query_param_null ()
: GNUNET_PQ_query_param_uint64 (
&td->details.deposits.policy_details_serial_id),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_deposits",
"INSERT INTO deposits"
"(deposit_serial_id"
",shard"
",known_coin_id"
",coin_pub"
",amount_with_fee"
",wallet_timestamp"
",exchange_timestamp"
",refund_deadline"
",wire_deadline"
",merchant_pub"
",h_contract_terms"
",coin_sig"
",wire_salt"
",wire_target_h_payto"
",policy_blocked"
",policy_details_serial_id"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10,"
" $11, $12, $13, $14, $15, $16);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_deposits",
params);
}
/**
* Function called with refunds records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_refunds (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.refunds.coin_pub),
GNUNET_PQ_query_param_auto_from_type (&td->details.refunds.merchant_sig),
GNUNET_PQ_query_param_uint64 (&td->details.refunds.rtransaction_id),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.refunds.amount_with_fee),
GNUNET_PQ_query_param_uint64 (&td->details.refunds.deposit_serial_id),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_refunds",
"INSERT INTO refunds"
"(refund_serial_id"
",coin_pub"
",merchant_sig"
",rtransaction_id"
",amount_with_fee"
",deposit_serial_id"
") VALUES "
"($1, $2, $3, $4, $5, $6);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_refunds",
params);
}
/**
* Function called with wire_out records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_wire_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_timestamp (&td->details.wire_out.execution_date),
GNUNET_PQ_query_param_auto_from_type (&td->details.wire_out.wtid_raw),
GNUNET_PQ_query_param_auto_from_type (
&td->details.wire_out.wire_target_h_payto),
GNUNET_PQ_query_param_string (
td->details.wire_out.exchange_account_section),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.wire_out.amount),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_wire_out",
"INSERT INTO wire_out"
"(wireout_uuid"
",execution_date"
",wtid_raw"
",wire_target_h_payto"
",exchange_account_section"
",amount"
") VALUES "
"($1, $2, $3, $4, $5, $6);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_wire_out",
params);
}
/**
* Function called with aggregation_tracking records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_aggregation_tracking (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_uint64 (
&td->details.aggregation_tracking.deposit_serial_id),
GNUNET_PQ_query_param_auto_from_type (
&td->details.aggregation_tracking.wtid_raw),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_aggregation_tracking",
"INSERT INTO aggregation_tracking"
"(aggregation_serial_id"
",deposit_serial_id"
",wtid_raw"
") VALUES "
"($1, $2, $3);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_aggregation_tracking",
params);
}
/**
* Function called with wire_fee records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_wire_fee (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_string (td->details.wire_fee.wire_method),
GNUNET_PQ_query_param_timestamp (&td->details.wire_fee.start_date),
GNUNET_PQ_query_param_timestamp (&td->details.wire_fee.end_date),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.wire_fee.fees.wire),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.wire_fee.fees.closing),
GNUNET_PQ_query_param_auto_from_type (&td->details.wire_fee.master_sig),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_wire_fee",
"INSERT INTO wire_fee"
"(wire_fee_serial"
",wire_method"
",start_date"
",end_date"
",wire_fee"
",closing_fee"
",master_sig"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_wire_fee",
params);
}
/**
* Function called with wire_fee records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_global_fee (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_timestamp (
&td->details.global_fee.start_date),
GNUNET_PQ_query_param_timestamp (
&td->details.global_fee.end_date),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.global_fee.fees.history),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.global_fee.fees.account),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.global_fee.fees.purse),
GNUNET_PQ_query_param_relative_time (
&td->details.global_fee.purse_timeout),
GNUNET_PQ_query_param_relative_time (
&td->details.global_fee.history_expiration),
GNUNET_PQ_query_param_uint32 (
&td->details.global_fee.purse_account_limit),
GNUNET_PQ_query_param_auto_from_type (
&td->details.global_fee.master_sig),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_global_fee",
"INSERT INTO global_fee"
"(global_fee_serial"
",start_date"
",end_date"
",history_fee"
",account_fee"
",purse_fee"
",purse_timeout"
",history_expiration"
",purse_account_limit"
",master_sig"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_global_fee",
params);
}
/**
* Function called with recoup records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_recoup (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.recoup.coin_sig),
GNUNET_PQ_query_param_auto_from_type (&td->details.recoup.coin_blind),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.recoup.amount),
GNUNET_PQ_query_param_timestamp (&td->details.recoup.timestamp),
GNUNET_PQ_query_param_auto_from_type (
&td->details.recoup.coin_pub),
GNUNET_PQ_query_param_uint64 (&td->details.recoup.reserve_out_serial_id),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_recoup",
"INSERT INTO recoup"
"(recoup_uuid"
",coin_sig"
",coin_blind"
",amount"
",recoup_timestamp"
",coin_pub"
",reserve_out_serial_id"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_recoup",
params);
}
/**
* Function called with recoup_refresh records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_recoup_refresh (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.recoup_refresh.coin_sig),
GNUNET_PQ_query_param_auto_from_type (
&td->details.recoup_refresh.coin_blind),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.recoup_refresh.amount),
GNUNET_PQ_query_param_timestamp (&td->details.recoup_refresh.timestamp),
GNUNET_PQ_query_param_uint64 (&td->details.recoup_refresh.known_coin_id),
GNUNET_PQ_query_param_auto_from_type (
&td->details.recoup.coin_pub),
GNUNET_PQ_query_param_uint64 (&td->details.recoup_refresh.rrc_serial),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_recoup_refresh",
"INSERT INTO recoup_refresh"
"(recoup_refresh_uuid"
",coin_sig"
",coin_blind"
",amount"
",recoup_timestamp"
",known_coin_id"
",coin_pub"
",rrc_serial"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_recoup_refresh",
params);
}
/**
* Function called with extensions records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_extensions (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_string (td->details.extensions.name),
NULL == td->details.extensions.manifest ?
GNUNET_PQ_query_param_null () :
GNUNET_PQ_query_param_string (td->details.extensions.manifest),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_extensions",
"INSERT INTO extensions"
"(extension_id"
",name"
",manifest"
") VALUES "
"($1, $2, $3);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_extensions",
params);
}
/**
* Function called with policy_details records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_policy_details (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.policy_details.hash_code),
(td->details.policy_details.no_policy_json)
? GNUNET_PQ_query_param_null ()
: TALER_PQ_query_param_json (td->details.policy_details.policy_json),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.policy_details.commitment),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.policy_details.accumulated_total),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.policy_details.fee),
TALER_PQ_query_param_amount_tuple (pg->conn,
&td->details.policy_details.transferable),
GNUNET_PQ_query_param_timestamp (&td->details.policy_details.deadline),
GNUNET_PQ_query_param_uint16 (
&td->details.policy_details.fulfillment_state),
(td->details.policy_details.no_fulfillment_id)
? GNUNET_PQ_query_param_null ()
: GNUNET_PQ_query_param_uint64 (
&td->details.policy_details.fulfillment_id),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_policy_details",
"INSERT INTO policy_details"
"(policy_details_serial_id"
",policy_hash_code"
",policy_json"
",deadline"
",commitment"
",accumulated_total"
",fee"
",transferable"
",fulfillment_state"
",fulfillment_id"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_policy_details",
params);
}
/**
* Function called with policy_fulfillment records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_policy_fulfillments (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_timestamp (
&td->details.policy_fulfillments.fulfillment_timestamp),
(NULL == td->details.policy_fulfillments.fulfillment_proof)
? GNUNET_PQ_query_param_null ()
: GNUNET_PQ_query_param_string (
td->details.policy_fulfillments.fulfillment_proof),
GNUNET_PQ_query_param_auto_from_type (
&td->details.policy_fulfillments.h_fulfillment_proof),
GNUNET_PQ_query_param_fixed_size (
td->details.policy_fulfillments.policy_hash_codes,
td->details.policy_fulfillments.policy_hash_codes_count),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_policy_fulfillments",
"INSERT INTO policy_fulfillments "
"(fulfillment_id"
",fulfillment_timestamp"
",fulfillment_proof"
",h_fulfillment_proof"
",policy_hash_codes"
") VALUES "
"($1, $2, $3, $4, $5);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_policy_fulfillments",
params);
}
/**
* 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.purse_pub),
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_tuple (
pg->conn,
&td->details.purse_requests.amount_with_fee),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.purse_requests.purse_fee),
GNUNET_PQ_query_param_auto_from_type (
&td->details.purse_requests.purse_sig),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_purse_requests",
"INSERT INTO purse_requests"
"(purse_requests_serial_id"
",purse_pub"
",merge_pub"
",purse_creation"
",purse_expiration"
",h_contract_terms"
",age_limit"
",flags"
",amount_with_fee"
",purse_fee"
",purse_sig"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_purse_requests",
params);
}
/**
* Function called with purse_decision records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_purse_decision (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_decision.purse_pub),
GNUNET_PQ_query_param_timestamp (
&td->details.purse_decision.action_timestamp),
GNUNET_PQ_query_param_bool (
td->details.purse_decision.refunded),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_purse_refunds",
"INSERT INTO purse_refunds"
"(purse_refunds_serial_id"
",purse_pub"
",action_timestamp"
",refunded"
") VALUES "
"($1, $2, $3, $4);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_purse_decision",
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_uint64 (&td->details.purse_merges.partner_serial_id),
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
};
PREPARE (pg,
"insert_into_table_purse_merges",
"INSERT INTO purse_merges"
"(purse_merge_request_serial_id"
",partner_serial_id"
",reserve_pub"
",purse_pub"
",merge_sig"
",merge_timestamp"
") VALUES "
"($1, $2, $3, $4, $5, $6);");
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_uint64 (
&td->details.purse_deposits.partner_serial_id),
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_tuple (
pg->conn,
&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
};
PREPARE (pg,
"insert_into_table_purse_deposits",
"INSERT INTO purse_deposits"
"(purse_deposit_serial_id"
",partner_serial_id"
",purse_pub"
",coin_pub"
",amount_with_fee"
",coin_sig"
") VALUES "
"($1, $2, $3, $4, $5, $6);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_purse_deposits",
params);
}
/**
x * 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_auto_from_type (
&td->details.account_merges.wallet_h_payto),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_account_merges",
"INSERT INTO account_merges"
"(account_merge_request_serial_id"
",reserve_pub"
",reserve_sig"
",purse_pub"
",wallet_h_payto"
") VALUES "
"($1, $2, $3, $4, $5);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_account_merges",
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),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.history_requests.history_fee),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_history_requests",
"INSERT INTO history_requests"
"(history_request_serial_id"
",reserve_pub"
",request_timestamp"
",reserve_sig"
",history_fee"
") VALUES "
"($1, $2, $3, $4, $5);");
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),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.close_requests.close),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.close_requests.close_fee),
GNUNET_PQ_query_param_string (
td->details.close_requests.payto_uri),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_close_requests",
"INSERT INTO close_requests"
"(close_request_serial_id"
",reserve_pub"
",close_timestamp"
",reserve_sig"
",close"
",close_fee"
",payto_uri"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7);");
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),
GNUNET_PQ_query_param_uint64 (&td->details.wads_out.partner_serial_id),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.wads_out.amount),
GNUNET_PQ_query_param_timestamp (&td->details.wads_out.execution_time),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_wads_out",
"INSERT INTO wads_out"
"(wad_out_serial_id"
",wad_id"
",partner_serial_id"
",amount"
",execution_time"
") VALUES "
"($1, $2, $3, $4, $5);");
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_uint64 (
&td->details.wads_out_entries.wad_out_serial_id),
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_tuple (
pg->conn,
&td->details.wads_out_entries.amount_with_fee),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.wads_out_entries.wad_fee),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&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
};
PREPARE (pg,
"insert_into_table_wad_out_entries",
"INSERT INTO wad_out_entries"
"(wad_out_entry_serial_id"
",wad_out_serial_id"
",reserve_pub"
",purse_pub"
",h_contract"
",purse_expiration"
",merge_timestamp"
",amount_with_fee"
",wad_fee"
",deposit_fees"
",reserve_sig"
",purse_sig"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12);");
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_tuple (
pg->conn,
&td->details.wads_in.amount),
GNUNET_PQ_query_param_timestamp (&td->details.wads_in.arrival_time),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_wads_in",
"INSERT INTO wads_in"
"(wad_in_serial_id"
",wad_id"
",origin_exchange_url"
",amount"
",arrival_time"
") VALUES "
"($1, $2, $3, $4, $5);");
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_tuple (
pg->conn,
&td->details.wads_in_entries.amount_with_fee),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.wads_in_entries.wad_fee),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&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
};
PREPARE (pg,
"insert_into_table_wad_in_entries",
"INSERT INTO wad_in_entries"
"(wad_in_entry_serial_id"
",wad_in_serial_id"
",reserve_pub"
",purse_pub"
",h_contract"
",purse_expiration"
",merge_timestamp"
",amount_with_fee"
",wad_fee"
",deposit_fees"
",reserve_sig"
",purse_sig"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_wads_in_entries",
params);
}
/**
* Function called with profit_drains records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_profit_drains (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.profit_drains.wtid),
GNUNET_PQ_query_param_string (
td->details.profit_drains.account_section),
GNUNET_PQ_query_param_string (
td->details.profit_drains.payto_uri),
GNUNET_PQ_query_param_timestamp (
&td->details.profit_drains.trigger_date),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.profit_drains.amount),
GNUNET_PQ_query_param_auto_from_type (
&td->details.profit_drains.master_sig),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_profit_drains",
"INSERT INTO profit_drains"
"(profit_drain_serial_id"
",wtid"
",account_section"
",payto_uri"
",trigger_date"
",amount"
",master_sig"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_profit_drains",
params);
}
/**
* Function called with aml_staff records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_aml_staff (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.aml_staff.decider_pub),
GNUNET_PQ_query_param_auto_from_type (
&td->details.aml_staff.master_sig),
GNUNET_PQ_query_param_string (
td->details.aml_staff.decider_name),
GNUNET_PQ_query_param_bool (
td->details.aml_staff.is_active),
GNUNET_PQ_query_param_bool (
td->details.aml_staff.read_only),
GNUNET_PQ_query_param_timestamp (
&td->details.aml_staff.last_change),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_aml_staff",
"INSERT INTO aml_staff"
"(aml_staff_uuid"
",decider_pub"
",master_sig"
",decider_name"
",is_active"
",read_only"
",last_change"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_aml_staff",
params);
}
/**
* Function called with aml_history records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_aml_history (struct PostgresClosure *pg,
const struct TALER_EXCHANGEDB_TableData *td)
{
uint32_t status32 = td->details.aml_history.new_status;
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&td->serial),
GNUNET_PQ_query_param_auto_from_type (
&td->details.aml_history.h_payto),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.aml_history.new_threshold),
GNUNET_PQ_query_param_uint32 (
&status32),
GNUNET_PQ_query_param_timestamp (
&td->details.aml_history.decision_time),
GNUNET_PQ_query_param_string (
td->details.aml_history.justification),
(NULL == td->details.aml_history.kyc_requirements)
? GNUNET_PQ_query_param_null ()
: GNUNET_PQ_query_param_string (
td->details.aml_history.kyc_requirements),
GNUNET_PQ_query_param_uint64 (
&td->details.aml_history.kyc_req_row),
GNUNET_PQ_query_param_auto_from_type (
&td->details.aml_history.decider_pub),
GNUNET_PQ_query_param_auto_from_type (
&td->details.aml_history.decider_sig),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_aml_history",
"INSERT INTO aml_history"
"(aml_history_serial_id"
",h_payto"
",new_threshold"
",new_status"
",decision_time"
",justification"
",kyc_requirements"
",kyc_req_row"
",decider_pub"
",decider_sig"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_aml_history",
params);
}
/**
* Function called with kyc_attributes records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_kyc_attributes (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.kyc_attributes.h_payto),
GNUNET_PQ_query_param_auto_from_type (
&td->details.kyc_attributes.kyc_prox),
GNUNET_PQ_query_param_string (
td->details.kyc_attributes.provider),
GNUNET_PQ_query_param_timestamp (
&td->details.kyc_attributes.collection_time),
GNUNET_PQ_query_param_timestamp (
&td->details.kyc_attributes.expiration_time),
GNUNET_PQ_query_param_fixed_size (
&td->details.kyc_attributes.encrypted_attributes,
td->details.kyc_attributes.encrypted_attributes_size),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_kyc_attributes",
"INSERT INTO kyc_attributes"
"(kyc_attributes_serial_id"
",h_payto"
",kyc_prox"
",provider"
",collection_time"
",expiration_time"
",encrypted_attributes"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_kyc_attributes",
params);
}
/**
* Function called with purse_deletion records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_purse_deletion (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_deletion.purse_pub),
GNUNET_PQ_query_param_auto_from_type (
&td->details.purse_deletion.purse_sig),
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_purse_deletion",
"INSERT INTO purse_deletion"
"(purse_deletion_serial_id"
",purse_pub"
",purse_sig"
") VALUES "
"($1, $2, $3);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_purse_deletion",
params);
}
/**
* Function called with age_withdraw records to insert into table.
*
* @param pg plugin context
* @param td record to insert
*/
static enum GNUNET_DB_QueryStatus
irbt_cb_table_age_withdraw (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.age_withdraw.h_commitment),
TALER_PQ_query_param_amount_tuple (
pg->conn,
&td->details.age_withdraw.amount_with_fee),
GNUNET_PQ_query_param_uint16 (
&td->details.age_withdraw.max_age),
GNUNET_PQ_query_param_auto_from_type (
&td->details.age_withdraw.reserve_pub),
GNUNET_PQ_query_param_auto_from_type (
&td->details.age_withdraw.reserve_sig),
GNUNET_PQ_query_param_uint32 (
&td->details.age_withdraw.noreveal_index),
/* TODO: other fields, too! */
GNUNET_PQ_query_param_end
};
PREPARE (pg,
"insert_into_table_age_withdraw",
"INSERT INTO age_withdraw"
"(age_withdraw_commitment_id"
",h_commitment"
",amount_with_fee"
",max_age"
",reserve_pub"
",reserve_sig"
",noreveal_index"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8);");
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
"insert_into_table_age_withdraw",
params);
}
enum GNUNET_DB_QueryStatus
TEH_PG_insert_records_by_table (void *cls,
const struct TALER_EXCHANGEDB_TableData *td)
{
struct PostgresClosure *pg = cls;
InsertRecordCallback rh = NULL;
switch (td->table)
{
case TALER_EXCHANGEDB_RT_DENOMINATIONS:
rh = &irbt_cb_table_denominations;
break;
case TALER_EXCHANGEDB_RT_DENOMINATION_REVOCATIONS:
rh = &irbt_cb_table_denomination_revocations;
break;
case TALER_EXCHANGEDB_RT_WIRE_TARGETS:
rh = &irbt_cb_table_wire_targets;
break;
case TALER_EXCHANGEDB_RT_LEGITIMIZATION_PROCESSES:
rh = &irbt_cb_table_legitimization_processes;
break;
case TALER_EXCHANGEDB_RT_LEGITIMIZATION_REQUIREMENTS:
rh = &irbt_cb_table_legitimization_requirements;
break;
case TALER_EXCHANGEDB_RT_RESERVES:
rh = &irbt_cb_table_reserves;
break;
case TALER_EXCHANGEDB_RT_RESERVES_IN:
rh = &irbt_cb_table_reserves_in;
break;
case TALER_EXCHANGEDB_RT_RESERVES_CLOSE:
rh = &irbt_cb_table_reserves_close;
break;
case TALER_EXCHANGEDB_RT_RESERVES_OPEN_REQUESTS:
rh = &irbt_cb_table_reserves_open_requests;
break;
case TALER_EXCHANGEDB_RT_RESERVES_OPEN_DEPOSITS:
rh = &irbt_cb_table_reserves_open_deposits;
break;
case TALER_EXCHANGEDB_RT_RESERVES_OUT:
rh = &irbt_cb_table_reserves_out;
break;
case TALER_EXCHANGEDB_RT_AUDITORS:
rh = &irbt_cb_table_auditors;
break;
case TALER_EXCHANGEDB_RT_AUDITOR_DENOM_SIGS:
rh = &irbt_cb_table_auditor_denom_sigs;
break;
case TALER_EXCHANGEDB_RT_EXCHANGE_SIGN_KEYS:
rh = &irbt_cb_table_exchange_sign_keys;
break;
case TALER_EXCHANGEDB_RT_SIGNKEY_REVOCATIONS:
rh = &irbt_cb_table_signkey_revocations;
break;
case TALER_EXCHANGEDB_RT_KNOWN_COINS:
rh = &irbt_cb_table_known_coins;
break;
case TALER_EXCHANGEDB_RT_REFRESH_COMMITMENTS:
rh = &irbt_cb_table_refresh_commitments;
break;
case TALER_EXCHANGEDB_RT_REFRESH_REVEALED_COINS:
rh = &irbt_cb_table_refresh_revealed_coins;
break;
case TALER_EXCHANGEDB_RT_REFRESH_TRANSFER_KEYS:
rh = &irbt_cb_table_refresh_transfer_keys;
break;
case TALER_EXCHANGEDB_RT_DEPOSITS:
rh = &irbt_cb_table_deposits;
break;
case TALER_EXCHANGEDB_RT_REFUNDS:
rh = &irbt_cb_table_refunds;
break;
case TALER_EXCHANGEDB_RT_WIRE_OUT:
rh = &irbt_cb_table_wire_out;
break;
case TALER_EXCHANGEDB_RT_AGGREGATION_TRACKING:
rh = &irbt_cb_table_aggregation_tracking;
break;
case TALER_EXCHANGEDB_RT_WIRE_FEE:
rh = &irbt_cb_table_wire_fee;
break;
case TALER_EXCHANGEDB_RT_GLOBAL_FEE:
rh = &irbt_cb_table_global_fee;
break;
case TALER_EXCHANGEDB_RT_RECOUP:
rh = &irbt_cb_table_recoup;
break;
case TALER_EXCHANGEDB_RT_RECOUP_REFRESH:
rh = &irbt_cb_table_recoup_refresh;
break;
case TALER_EXCHANGEDB_RT_EXTENSIONS:
rh = &irbt_cb_table_extensions;
break;
case TALER_EXCHANGEDB_RT_POLICY_DETAILS:
rh = &irbt_cb_table_policy_details;
break;
case TALER_EXCHANGEDB_RT_POLICY_FULFILLMENTS:
rh = &irbt_cb_table_policy_fulfillments;
break;
case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
rh = &irbt_cb_table_purse_requests;
break;
case TALER_EXCHANGEDB_RT_PURSE_DECISION:
rh = &irbt_cb_table_purse_decision;
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;
case TALER_EXCHANGEDB_RT_PROFIT_DRAINS:
rh = &irbt_cb_table_profit_drains;
break;
case TALER_EXCHANGEDB_RT_AML_STAFF:
rh = &irbt_cb_table_aml_staff;
break;
case TALER_EXCHANGEDB_RT_AML_HISTORY:
rh = &irbt_cb_table_aml_history;
break;
case TALER_EXCHANGEDB_RT_KYC_ATTRIBUTES:
rh = &irbt_cb_table_kyc_attributes;
break;
case TALER_EXCHANGEDB_RT_PURSE_DELETION:
rh = &irbt_cb_table_purse_deletion;
break;
case TALER_EXCHANGEDB_RT_AGE_WITHDRAW:
rh = &irbt_cb_table_age_withdraw;
break;
}
if (NULL == rh)
{
GNUNET_break (0);
return GNUNET_DB_STATUS_HARD_ERROR;
}
return rh (pg,
td);
}
/* end of pg_insert_records_by_table.c */