remove currency field from databases

This commit is contained in:
Christian Grothoff 2019-08-17 21:35:21 +02:00
parent cbf6281ca2
commit 4bf425c902
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
17 changed files with 1608 additions and 2043 deletions

View File

@ -30,6 +30,25 @@
#define LOG(kind,...) GNUNET_log_from (kind, "taler-auditordb-postgres", __VA_ARGS__) #define LOG(kind,...) GNUNET_log_from (kind, "taler-auditordb-postgres", __VA_ARGS__)
/**
* Wrapper macro to add the currency from the plugin's state
* when fetching amounts from the database.
*
* @param field name of the database field to fetch amount from
* @param amountp[out] pointer to amount to set
*/
#define TALER_PQ_RESULT_SPEC_AMOUNT(field,amountp) TALER_PQ_result_spec_amount(field,pg->currency,amountp)
/**
* Wrapper macro to add the currency from the plugin's state
* when fetching amounts from the database. NBO variant.
*
* @param field name of the database field to fetch amount from
* @param amountp[out] pointer to amount to set
*/
#define TALER_PQ_RESULT_SPEC_AMOUNT_NBO(field,amountp) TALER_PQ_result_spec_amount_nbo(field,pg->currency,amountp)
/** /**
* Handle for a database session (per-thread, for transactions). * Handle for a database session (per-thread, for transactions).
*/ */
@ -60,6 +79,11 @@ struct PostgresClosure
* the configuration. * the configuration.
*/ */
char *connection_cfg_str; char *connection_cfg_str;
/**
* Which currency should we assume all amounts to be in?
*/
char *currency;
}; };
@ -219,19 +243,14 @@ postgres_create_tables (void *cls)
",expire_legal INT8 NOT NULL" ",expire_legal INT8 NOT NULL"
",coin_val INT8 NOT NULL" /* value of this denom */ ",coin_val INT8 NOT NULL" /* value of this denom */
",coin_frac INT4 NOT NULL" /* fractional value of this denom */ ",coin_frac INT4 NOT NULL" /* fractional value of this denom */
",coin_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL" /* assuming same currency for fees */
",fee_withdraw_val INT8 NOT NULL" ",fee_withdraw_val INT8 NOT NULL"
",fee_withdraw_frac INT4 NOT NULL" ",fee_withdraw_frac INT4 NOT NULL"
",fee_withdraw_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",fee_deposit_val INT8 NOT NULL" ",fee_deposit_val INT8 NOT NULL"
",fee_deposit_frac INT4 NOT NULL" ",fee_deposit_frac INT4 NOT NULL"
",fee_deposit_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",fee_refresh_val INT8 NOT NULL" ",fee_refresh_val INT8 NOT NULL"
",fee_refresh_frac INT4 NOT NULL" ",fee_refresh_frac INT4 NOT NULL"
",fee_refresh_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",fee_refund_val INT8 NOT NULL" ",fee_refund_val INT8 NOT NULL"
",fee_refund_frac INT4 NOT NULL" ",fee_refund_frac INT4 NOT NULL"
",fee_refund_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
")"), ")"),
/* Table indicating up to which transactions the auditor has /* Table indicating up to which transactions the auditor has
processed the exchange database. Used for SELECTing the processed the exchange database. Used for SELECTing the
@ -284,10 +303,8 @@ postgres_create_tables (void *cls)
",master_pub BYTEA CONSTRAINT master_pub_ref REFERENCES auditor_exchanges(master_pub) ON DELETE CASCADE" ",master_pub BYTEA CONSTRAINT master_pub_ref REFERENCES auditor_exchanges(master_pub) ON DELETE CASCADE"
",reserve_balance_val INT8 NOT NULL" ",reserve_balance_val INT8 NOT NULL"
",reserve_balance_frac INT4 NOT NULL" ",reserve_balance_frac INT4 NOT NULL"
",reserve_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",withdraw_fee_balance_val INT8 NOT NULL" ",withdraw_fee_balance_val INT8 NOT NULL"
",withdraw_fee_balance_frac INT4 NOT NULL" ",withdraw_fee_balance_frac INT4 NOT NULL"
",withdraw_fee_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",expiration_date INT8 NOT NULL" ",expiration_date INT8 NOT NULL"
",auditor_reserves_rowid BIGSERIAL UNIQUE" ",auditor_reserves_rowid BIGSERIAL UNIQUE"
")"), ")"),
@ -299,10 +316,8 @@ postgres_create_tables (void *cls)
"(master_pub BYTEA CONSTRAINT master_pub_ref REFERENCES auditor_exchanges(master_pub) ON DELETE CASCADE" "(master_pub BYTEA CONSTRAINT master_pub_ref REFERENCES auditor_exchanges(master_pub) ON DELETE CASCADE"
",reserve_balance_val INT8 NOT NULL" ",reserve_balance_val INT8 NOT NULL"
",reserve_balance_frac INT4 NOT NULL" ",reserve_balance_frac INT4 NOT NULL"
",reserve_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",withdraw_fee_balance_val INT8 NOT NULL" ",withdraw_fee_balance_val INT8 NOT NULL"
",withdraw_fee_balance_frac INT4 NOT NULL" ",withdraw_fee_balance_frac INT4 NOT NULL"
",withdraw_fee_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
")"), ")"),
/* Table with the sum of the balances of all wire fees /* Table with the sum of the balances of all wire fees
(by exchange's master public key) */ (by exchange's master public key) */
@ -310,7 +325,6 @@ postgres_create_tables (void *cls)
"(master_pub BYTEA CONSTRAINT master_pub_ref REFERENCES auditor_exchanges(master_pub) ON DELETE CASCADE" "(master_pub BYTEA CONSTRAINT master_pub_ref REFERENCES auditor_exchanges(master_pub) ON DELETE CASCADE"
",wire_fee_balance_val INT8 NOT NULL" ",wire_fee_balance_val INT8 NOT NULL"
",wire_fee_balance_frac INT4 NOT NULL" ",wire_fee_balance_frac INT4 NOT NULL"
",wire_fee_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
")"), ")"),
/* Table with all of the outstanding denomination coins that the /* Table with all of the outstanding denomination coins that the
exchange is aware of and what the respective balances are exchange is aware of and what the respective balances are
@ -323,14 +337,11 @@ postgres_create_tables (void *cls)
" REFERENCES auditor_denominations (denom_pub_hash) ON DELETE CASCADE" " REFERENCES auditor_denominations (denom_pub_hash) ON DELETE CASCADE"
",denom_balance_val INT8 NOT NULL" ",denom_balance_val INT8 NOT NULL"
",denom_balance_frac INT4 NOT NULL" ",denom_balance_frac INT4 NOT NULL"
",denom_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",num_issued INT8 NOT NULL" ",num_issued INT8 NOT NULL"
",denom_risk_val INT8 NOT NULL" ",denom_risk_val INT8 NOT NULL"
",denom_risk_frac INT4 NOT NULL" ",denom_risk_frac INT4 NOT NULL"
",denom_risk_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",payback_loss_val INT8 NOT NULL" ",payback_loss_val INT8 NOT NULL"
",payback_loss_frac INT4 NOT NULL" ",payback_loss_frac INT4 NOT NULL"
",payback_loss_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
")"), ")"),
/* Table with the sum of the outstanding coins from /* Table with the sum of the outstanding coins from
"auditor_denomination_pending" (denom_pubs must belong to the "auditor_denomination_pending" (denom_pubs must belong to the
@ -342,22 +353,16 @@ postgres_create_tables (void *cls)
"(master_pub BYTEA CONSTRAINT master_pub_ref REFERENCES auditor_exchanges(master_pub) ON DELETE CASCADE" "(master_pub BYTEA CONSTRAINT master_pub_ref REFERENCES auditor_exchanges(master_pub) ON DELETE CASCADE"
",denom_balance_val INT8 NOT NULL" ",denom_balance_val INT8 NOT NULL"
",denom_balance_frac INT4 NOT NULL" ",denom_balance_frac INT4 NOT NULL"
",denom_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",deposit_fee_balance_val INT8 NOT NULL" ",deposit_fee_balance_val INT8 NOT NULL"
",deposit_fee_balance_frac INT4 NOT NULL" ",deposit_fee_balance_frac INT4 NOT NULL"
",deposit_fee_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",melt_fee_balance_val INT8 NOT NULL" ",melt_fee_balance_val INT8 NOT NULL"
",melt_fee_balance_frac INT4 NOT NULL" ",melt_fee_balance_frac INT4 NOT NULL"
",melt_fee_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",refund_fee_balance_val INT8 NOT NULL" ",refund_fee_balance_val INT8 NOT NULL"
",refund_fee_balance_frac INT4 NOT NULL" ",refund_fee_balance_frac INT4 NOT NULL"
",refund_fee_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",risk_val INT8 NOT NULL" ",risk_val INT8 NOT NULL"
",risk_frac INT4 NOT NULL" ",risk_frac INT4 NOT NULL"
",risk_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",loss_val INT8 NOT NULL" ",loss_val INT8 NOT NULL"
",loss_frac INT4 NOT NULL" ",loss_frac INT4 NOT NULL"
",loss_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
")"), ")"),
/* Table with historic profits; basically, when a denom_pub has /* Table with historic profits; basically, when a denom_pub has
expired and everything associated with it is garbage collected, expired and everything associated with it is garbage collected,
@ -374,10 +379,8 @@ postgres_create_tables (void *cls)
",revenue_timestamp INT8 NOT NULL" ",revenue_timestamp INT8 NOT NULL"
",revenue_balance_val INT8 NOT NULL" ",revenue_balance_val INT8 NOT NULL"
",revenue_balance_frac INT4 NOT NULL" ",revenue_balance_frac INT4 NOT NULL"
",revenue_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",loss_balance_val INT8 NOT NULL" ",loss_balance_val INT8 NOT NULL"
",loss_balance_frac INT4 NOT NULL" ",loss_balance_frac INT4 NOT NULL"
",loss_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
")"), ")"),
/* Table with historic profits from reserves; we eventually /* Table with historic profits from reserves; we eventually
GC "auditor_historic_reserve_revenue", and then store the totals GC "auditor_historic_reserve_revenue", and then store the totals
@ -388,7 +391,6 @@ postgres_create_tables (void *cls)
",end_date INT8 NOT NULL" ",end_date INT8 NOT NULL"
",reserve_profits_val INT8 NOT NULL" ",reserve_profits_val INT8 NOT NULL"
",reserve_profits_frac INT4 NOT NULL" ",reserve_profits_frac INT4 NOT NULL"
",reserve_profits_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
")"), ")"),
GNUNET_PQ_make_try_execute ("CREATE INDEX auditor_historic_reserve_summary_by_master_pub_start_date " GNUNET_PQ_make_try_execute ("CREATE INDEX auditor_historic_reserve_summary_by_master_pub_start_date "
"ON auditor_historic_reserve_summary(master_pub,start_date)"), "ON auditor_historic_reserve_summary(master_pub,start_date)"),
@ -404,7 +406,6 @@ postgres_create_tables (void *cls)
",refund_deadline INT8 NOT NULL" ",refund_deadline INT8 NOT NULL"
",amount_without_fee_val INT8 NOT NULL" ",amount_without_fee_val INT8 NOT NULL"
",amount_without_fee_frac INT4 NOT NULL" ",amount_without_fee_frac INT4 NOT NULL"
",amount_without_fee_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",coin_pub BYTEA CHECK (LENGTH(coin_pub)=32)" ",coin_pub BYTEA CHECK (LENGTH(coin_pub)=32)"
",merchant_pub BYTEA CHECK (LENGTH(merchant_pub)=32)" ",merchant_pub BYTEA CHECK (LENGTH(merchant_pub)=32)"
",exchange_sig BYTEA CHECK (LENGTH(exchange_sig)=64)" ",exchange_sig BYTEA CHECK (LENGTH(exchange_sig)=64)"
@ -431,7 +432,6 @@ postgres_create_tables (void *cls)
",timestamp INT8 NOT NULL" ",timestamp INT8 NOT NULL"
",balance_val INT8 NOT NULL" ",balance_val INT8 NOT NULL"
",balance_frac INT4 NOT NULL" ",balance_frac INT4 NOT NULL"
",balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
")"), ")"),
GNUNET_PQ_make_try_execute ("CREATE INDEX history_ledger_by_master_pub_and_time " GNUNET_PQ_make_try_execute ("CREATE INDEX history_ledger_by_master_pub_and_time "
"ON auditor_historic_ledger(master_pub,timestamp)"), "ON auditor_historic_ledger(master_pub,timestamp)"),
@ -443,7 +443,6 @@ postgres_create_tables (void *cls)
"(master_pub BYTEA CONSTRAINT master_pub_ref REFERENCES auditor_exchanges(master_pub) ON DELETE CASCADE" "(master_pub BYTEA CONSTRAINT master_pub_ref REFERENCES auditor_exchanges(master_pub) ON DELETE CASCADE"
",balance_val INT8 NOT NULL" ",balance_val INT8 NOT NULL"
",balance_frac INT4 NOT NULL" ",balance_frac INT4 NOT NULL"
",balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
")"), ")"),
GNUNET_PQ_EXECUTE_STATEMENT_END GNUNET_PQ_EXECUTE_STATEMENT_END
}; };
@ -516,21 +515,16 @@ postgres_prepare (PGconn *db_conn)
",expire_legal" ",expire_legal"
",coin_val" ",coin_val"
",coin_frac" ",coin_frac"
",coin_curr"
",fee_withdraw_val" ",fee_withdraw_val"
",fee_withdraw_frac" ",fee_withdraw_frac"
",fee_withdraw_curr"
",fee_deposit_val" ",fee_deposit_val"
",fee_deposit_frac" ",fee_deposit_frac"
",fee_deposit_curr"
",fee_refresh_val" ",fee_refresh_val"
",fee_refresh_frac" ",fee_refresh_frac"
",fee_refresh_curr"
",fee_refund_val" ",fee_refund_val"
",fee_refund_frac" ",fee_refund_frac"
",fee_refund_curr" ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16);",
") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21);", 16),
21),
/* Used in #postgres_insert_denomination_info() */ /* Used in #postgres_insert_denomination_info() */
GNUNET_PQ_make_prepare ("auditor_denominations_select", GNUNET_PQ_make_prepare ("auditor_denominations_select",
"SELECT" "SELECT"
@ -541,19 +535,14 @@ postgres_prepare (PGconn *db_conn)
",expire_legal" ",expire_legal"
",coin_val" ",coin_val"
",coin_frac" ",coin_frac"
",coin_curr"
",fee_withdraw_val" ",fee_withdraw_val"
",fee_withdraw_frac" ",fee_withdraw_frac"
",fee_withdraw_curr"
",fee_deposit_val" ",fee_deposit_val"
",fee_deposit_frac" ",fee_deposit_frac"
",fee_deposit_curr"
",fee_refresh_val" ",fee_refresh_val"
",fee_refresh_frac" ",fee_refresh_frac"
",fee_refresh_curr"
",fee_refund_val" ",fee_refund_val"
",fee_refund_frac" ",fee_refund_frac"
",fee_refund_curr"
" FROM auditor_denominations" " FROM auditor_denominations"
" WHERE master_pub=$1;", " WHERE master_pub=$1;",
1), 1),
@ -567,14 +556,13 @@ postgres_prepare (PGconn *db_conn)
",refund_deadline" ",refund_deadline"
",amount_without_fee_val" ",amount_without_fee_val"
",amount_without_fee_frac" ",amount_without_fee_frac"
",amount_without_fee_curr"
",coin_pub" ",coin_pub"
",merchant_pub" ",merchant_pub"
",exchange_sig" ",exchange_sig"
",exchange_pub" ",exchange_pub"
",master_sig" /* master_sig could be normalized... */ ",master_sig" /* master_sig could be normalized... */
") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13);", ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12);",
13), 12),
/* Used in #postgres_get_deposit_confirmations() */ /* Used in #postgres_get_deposit_confirmations() */
GNUNET_PQ_make_prepare ("auditor_deposit_confirmation_select", GNUNET_PQ_make_prepare ("auditor_deposit_confirmation_select",
"SELECT" "SELECT"
@ -585,7 +573,6 @@ postgres_prepare (PGconn *db_conn)
",refund_deadline" ",refund_deadline"
",amount_without_fee_val" ",amount_without_fee_val"
",amount_without_fee_frac" ",amount_without_fee_frac"
",amount_without_fee_curr"
",coin_pub" ",coin_pub"
",merchant_pub" ",merchant_pub"
",exchange_sig" ",exchange_sig"
@ -739,34 +726,28 @@ postgres_prepare (PGconn *db_conn)
",master_pub" ",master_pub"
",reserve_balance_val" ",reserve_balance_val"
",reserve_balance_frac" ",reserve_balance_frac"
",reserve_balance_curr"
",withdraw_fee_balance_val" ",withdraw_fee_balance_val"
",withdraw_fee_balance_frac" ",withdraw_fee_balance_frac"
",withdraw_fee_balance_curr"
",expiration_date" ",expiration_date"
") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9);", ") VALUES ($1,$2,$3,$4,$5,$6,$7);",
9), 7),
/* Used in #postgres_update_reserve_info() */ /* Used in #postgres_update_reserve_info() */
GNUNET_PQ_make_prepare ("auditor_reserves_update", GNUNET_PQ_make_prepare ("auditor_reserves_update",
"UPDATE auditor_reserves SET" "UPDATE auditor_reserves SET"
" reserve_balance_val=$1" " reserve_balance_val=$1"
",reserve_balance_frac=$2" ",reserve_balance_frac=$2"
",reserve_balance_curr=$3" ",withdraw_fee_balance_val=$3"
",withdraw_fee_balance_val=$4" ",withdraw_fee_balance_frac=$4"
",withdraw_fee_balance_frac=$5" ",expiration_date=$5"
",withdraw_fee_balance_curr=$6" " WHERE reserve_pub=$6 AND master_pub=$7;",
",expiration_date=$7" 7),
" WHERE reserve_pub=$8 AND master_pub=$9;",
9),
/* Used in #postgres_get_reserve_info() */ /* Used in #postgres_get_reserve_info() */
GNUNET_PQ_make_prepare ("auditor_reserves_select", GNUNET_PQ_make_prepare ("auditor_reserves_select",
"SELECT" "SELECT"
" reserve_balance_val" " reserve_balance_val"
",reserve_balance_frac" ",reserve_balance_frac"
",reserve_balance_curr"
",withdraw_fee_balance_val" ",withdraw_fee_balance_val"
",withdraw_fee_balance_frac" ",withdraw_fee_balance_frac"
",withdraw_fee_balance_curr"
",expiration_date" ",expiration_date"
",auditor_reserves_rowid" ",auditor_reserves_rowid"
" FROM auditor_reserves" " FROM auditor_reserves"
@ -784,32 +765,26 @@ postgres_prepare (PGconn *db_conn)
"(master_pub" "(master_pub"
",reserve_balance_val" ",reserve_balance_val"
",reserve_balance_frac" ",reserve_balance_frac"
",reserve_balance_curr"
",withdraw_fee_balance_val" ",withdraw_fee_balance_val"
",withdraw_fee_balance_frac" ",withdraw_fee_balance_frac"
",withdraw_fee_balance_curr" ") VALUES ($1,$2,$3,$4,$5)",
") VALUES ($1,$2,$3,$4,$5,$6,$7)", 5),
7),
/* Used in #postgres_update_reserve_summary() */ /* Used in #postgres_update_reserve_summary() */
GNUNET_PQ_make_prepare ("auditor_reserve_balance_update", GNUNET_PQ_make_prepare ("auditor_reserve_balance_update",
"UPDATE auditor_reserve_balance SET" "UPDATE auditor_reserve_balance SET"
" reserve_balance_val=$1" " reserve_balance_val=$1"
",reserve_balance_frac=$2" ",reserve_balance_frac=$2"
",reserve_balance_curr=$3" ",withdraw_fee_balance_val=$3"
",withdraw_fee_balance_val=$4" ",withdraw_fee_balance_frac=$4"
",withdraw_fee_balance_frac=$5" " WHERE master_pub=$5;",
",withdraw_fee_balance_curr=$6" 5),
" WHERE master_pub=$7;",
7),
/* Used in #postgres_get_reserve_summary() */ /* Used in #postgres_get_reserve_summary() */
GNUNET_PQ_make_prepare ("auditor_reserve_balance_select", GNUNET_PQ_make_prepare ("auditor_reserve_balance_select",
"SELECT" "SELECT"
" reserve_balance_val" " reserve_balance_val"
",reserve_balance_frac" ",reserve_balance_frac"
",reserve_balance_curr"
",withdraw_fee_balance_val" ",withdraw_fee_balance_val"
",withdraw_fee_balance_frac" ",withdraw_fee_balance_frac"
",withdraw_fee_balance_curr"
" FROM auditor_reserve_balance" " FROM auditor_reserve_balance"
" WHERE master_pub=$1;", " WHERE master_pub=$1;",
1), 1),
@ -819,23 +794,20 @@ postgres_prepare (PGconn *db_conn)
"(master_pub" "(master_pub"
",wire_fee_balance_val" ",wire_fee_balance_val"
",wire_fee_balance_frac" ",wire_fee_balance_frac"
",wire_fee_balance_curr" ") VALUES ($1,$2,$3)",
") VALUES ($1,$2,$3,$4)", 3),
4),
/* Used in #postgres_update_wire_fee_summary() */ /* Used in #postgres_update_wire_fee_summary() */
GNUNET_PQ_make_prepare ("auditor_wire_fee_balance_update", GNUNET_PQ_make_prepare ("auditor_wire_fee_balance_update",
"UPDATE auditor_wire_fee_balance SET" "UPDATE auditor_wire_fee_balance SET"
" wire_fee_balance_val=$1" " wire_fee_balance_val=$1"
",wire_fee_balance_frac=$2" ",wire_fee_balance_frac=$2"
",wire_fee_balance_curr=$3" " WHERE master_pub=$3;",
" WHERE master_pub=$4;", 3),
4),
/* Used in #postgres_get_wire_fee_summary() */ /* Used in #postgres_get_wire_fee_summary() */
GNUNET_PQ_make_prepare ("auditor_wire_fee_balance_select", GNUNET_PQ_make_prepare ("auditor_wire_fee_balance_select",
"SELECT" "SELECT"
" wire_fee_balance_val" " wire_fee_balance_val"
",wire_fee_balance_frac" ",wire_fee_balance_frac"
",wire_fee_balance_curr"
" FROM auditor_wire_fee_balance" " FROM auditor_wire_fee_balance"
" WHERE master_pub=$1;", " WHERE master_pub=$1;",
1), 1),
@ -845,44 +817,35 @@ postgres_prepare (PGconn *db_conn)
"(denom_pub_hash" "(denom_pub_hash"
",denom_balance_val" ",denom_balance_val"
",denom_balance_frac" ",denom_balance_frac"
",denom_balance_curr"
",num_issued" ",num_issued"
",denom_risk_val" ",denom_risk_val"
",denom_risk_frac" ",denom_risk_frac"
",denom_risk_curr"
",payback_loss_val" ",payback_loss_val"
",payback_loss_frac" ",payback_loss_frac"
",payback_loss_curr" ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8);",
") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11);", 8),
11),
/* Used in #postgres_update_denomination_balance() */ /* Used in #postgres_update_denomination_balance() */
GNUNET_PQ_make_prepare ("auditor_denomination_pending_update", GNUNET_PQ_make_prepare ("auditor_denomination_pending_update",
"UPDATE auditor_denomination_pending SET" "UPDATE auditor_denomination_pending SET"
" denom_balance_val=$1" " denom_balance_val=$1"
",denom_balance_frac=$2" ",denom_balance_frac=$2"
",denom_balance_curr=$3" ",num_issued=$3"
",num_issued=$4" ",denom_risk_val=$4"
",denom_risk_val=$5" ",denom_risk_frac=$5"
",denom_risk_frac=$6" ",payback_loss_val=$6"
",denom_risk_curr=$7" ",payback_loss_frac=$7"
",payback_loss_val=$8" " WHERE denom_pub_hash=$8",
",payback_loss_frac=$9" 8),
",payback_loss_curr=$10"
" WHERE denom_pub_hash=$11",
11),
/* Used in #postgres_get_denomination_balance() */ /* Used in #postgres_get_denomination_balance() */
GNUNET_PQ_make_prepare ("auditor_denomination_pending_select", GNUNET_PQ_make_prepare ("auditor_denomination_pending_select",
"SELECT" "SELECT"
" denom_balance_val" " denom_balance_val"
",denom_balance_frac" ",denom_balance_frac"
",denom_balance_curr"
",num_issued" ",num_issued"
",denom_risk_val" ",denom_risk_val"
",denom_risk_frac" ",denom_risk_frac"
",denom_risk_curr"
",payback_loss_val" ",payback_loss_val"
",payback_loss_frac" ",payback_loss_frac"
",payback_loss_curr"
" FROM auditor_denomination_pending" " FROM auditor_denomination_pending"
" WHERE denom_pub_hash=$1", " WHERE denom_pub_hash=$1",
1), 1),
@ -892,69 +855,51 @@ postgres_prepare (PGconn *db_conn)
"(master_pub" "(master_pub"
",denom_balance_val" ",denom_balance_val"
",denom_balance_frac" ",denom_balance_frac"
",denom_balance_curr"
",deposit_fee_balance_val" ",deposit_fee_balance_val"
",deposit_fee_balance_frac" ",deposit_fee_balance_frac"
",deposit_fee_balance_curr"
",melt_fee_balance_val" ",melt_fee_balance_val"
",melt_fee_balance_frac" ",melt_fee_balance_frac"
",melt_fee_balance_curr"
",refund_fee_balance_val" ",refund_fee_balance_val"
",refund_fee_balance_frac" ",refund_fee_balance_frac"
",refund_fee_balance_curr"
",risk_val" ",risk_val"
",risk_frac" ",risk_frac"
",risk_curr"
",loss_val" ",loss_val"
",loss_frac" ",loss_frac"
",loss_curr"
") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10," ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,"
" $11,$12,$13,$14,$15,$16,$17,$18,$19);", " $11,$12,$13);",
19), 13),
/* Used in #postgres_update_balance_summary() */ /* Used in #postgres_update_balance_summary() */
GNUNET_PQ_make_prepare ("auditor_balance_summary_update", GNUNET_PQ_make_prepare ("auditor_balance_summary_update",
"UPDATE auditor_balance_summary SET" "UPDATE auditor_balance_summary SET"
" denom_balance_val=$1" " denom_balance_val=$1"
",denom_balance_frac=$2" ",denom_balance_frac=$2"
",denom_balance_curr=$3" ",deposit_fee_balance_val=$3"
",deposit_fee_balance_val=$4" ",deposit_fee_balance_frac=$4"
",deposit_fee_balance_frac=$5" ",melt_fee_balance_val=$5"
",deposit_fee_balance_curr=$6" ",melt_fee_balance_frac=$6"
",melt_fee_balance_val=$7" ",refund_fee_balance_val=$7"
",melt_fee_balance_frac=$8" ",refund_fee_balance_frac=$8"
",melt_fee_balance_curr=$9" ",risk_val=$9"
",refund_fee_balance_val=$10" ",risk_frac=$10"
",refund_fee_balance_frac=$11" ",loss_val=$11"
",refund_fee_balance_curr=$12" ",loss_frac=$12"
",risk_val=$13" " WHERE master_pub=$13;",
",risk_frac=$14" 13),
",risk_curr=$15"
",loss_val=$16"
",loss_frac=$17"
",loss_curr=$18"
" WHERE master_pub=$19;",
19),
/* Used in #postgres_get_balance_summary() */ /* Used in #postgres_get_balance_summary() */
GNUNET_PQ_make_prepare ("auditor_balance_summary_select", GNUNET_PQ_make_prepare ("auditor_balance_summary_select",
"SELECT" "SELECT"
" denom_balance_val" " denom_balance_val"
",denom_balance_frac" ",denom_balance_frac"
",denom_balance_curr"
",deposit_fee_balance_val" ",deposit_fee_balance_val"
",deposit_fee_balance_frac" ",deposit_fee_balance_frac"
",deposit_fee_balance_curr"
",melt_fee_balance_val" ",melt_fee_balance_val"
",melt_fee_balance_frac" ",melt_fee_balance_frac"
",melt_fee_balance_curr"
",refund_fee_balance_val" ",refund_fee_balance_val"
",refund_fee_balance_frac" ",refund_fee_balance_frac"
",refund_fee_balance_curr"
",risk_val" ",risk_val"
",risk_frac" ",risk_frac"
",risk_curr"
",loss_val" ",loss_val"
",loss_frac" ",loss_frac"
",loss_curr"
" FROM auditor_balance_summary" " FROM auditor_balance_summary"
" WHERE master_pub=$1;", " WHERE master_pub=$1;",
1), 1),
@ -966,12 +911,10 @@ postgres_prepare (PGconn *db_conn)
",revenue_timestamp" ",revenue_timestamp"
",revenue_balance_val" ",revenue_balance_val"
",revenue_balance_frac" ",revenue_balance_frac"
",revenue_balance_curr"
",loss_balance_val" ",loss_balance_val"
",loss_balance_frac" ",loss_balance_frac"
",loss_balance_curr" ") VALUES ($1,$2,$3,$4,$5,$6,$7);",
") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9);", 7),
9),
/* Used in #postgres_select_historic_denom_revenue() */ /* Used in #postgres_select_historic_denom_revenue() */
GNUNET_PQ_make_prepare ("auditor_historic_denomination_revenue_select", GNUNET_PQ_make_prepare ("auditor_historic_denomination_revenue_select",
"SELECT" "SELECT"
@ -979,10 +922,8 @@ postgres_prepare (PGconn *db_conn)
",revenue_timestamp" ",revenue_timestamp"
",revenue_balance_val" ",revenue_balance_val"
",revenue_balance_frac" ",revenue_balance_frac"
",revenue_balance_curr"
",loss_balance_val" ",loss_balance_val"
",loss_balance_frac" ",loss_balance_frac"
",loss_balance_curr"
" FROM auditor_historic_denomination_revenue" " FROM auditor_historic_denomination_revenue"
" WHERE master_pub=$1;", " WHERE master_pub=$1;",
1), 1),
@ -994,9 +935,8 @@ postgres_prepare (PGconn *db_conn)
",end_date" ",end_date"
",reserve_profits_val" ",reserve_profits_val"
",reserve_profits_frac" ",reserve_profits_frac"
",reserve_profits_curr" ") VALUES ($1,$2,$3,$4,$5);",
") VALUES ($1,$2,$3,$4,$5,$6);", 5),
6),
/* Used in #postgres_select_historic_reserve_revenue() */ /* Used in #postgres_select_historic_reserve_revenue() */
GNUNET_PQ_make_prepare ("auditor_historic_reserve_summary_select", GNUNET_PQ_make_prepare ("auditor_historic_reserve_summary_select",
"SELECT" "SELECT"
@ -1004,7 +944,6 @@ postgres_prepare (PGconn *db_conn)
",end_date" ",end_date"
",reserve_profits_val" ",reserve_profits_val"
",reserve_profits_frac" ",reserve_profits_frac"
",reserve_profits_curr"
" FROM auditor_historic_reserve_summary" " FROM auditor_historic_reserve_summary"
" WHERE master_pub=$1;", " WHERE master_pub=$1;",
1), 1),
@ -1014,23 +953,20 @@ postgres_prepare (PGconn *db_conn)
"(master_pub" "(master_pub"
",balance_val" ",balance_val"
",balance_frac" ",balance_frac"
",balance_curr" ") VALUES ($1,$2,$3);",
") VALUES ($1,$2,$3,$4);", 3),
4),
/* Used in #postgres_update_predicted_result() */ /* Used in #postgres_update_predicted_result() */
GNUNET_PQ_make_prepare ("auditor_predicted_result_update", GNUNET_PQ_make_prepare ("auditor_predicted_result_update",
"UPDATE auditor_predicted_result SET" "UPDATE auditor_predicted_result SET"
" balance_val=$1" " balance_val=$1"
",balance_frac=$2" ",balance_frac=$2"
",balance_curr=$3" " WHERE master_pub=$3;",
" WHERE master_pub=$4;", 3),
4),
/* Used in #postgres_get_predicted_balance() */ /* Used in #postgres_get_predicted_balance() */
GNUNET_PQ_make_prepare ("auditor_predicted_result_select", GNUNET_PQ_make_prepare ("auditor_predicted_result_select",
"SELECT" "SELECT"
" balance_val" " balance_val"
",balance_frac" ",balance_frac"
",balance_curr"
" FROM auditor_predicted_result" " FROM auditor_predicted_result"
" WHERE master_pub=$1;", " WHERE master_pub=$1;",
1), 1),
@ -1474,6 +1410,11 @@ struct DepositConfirmationContext
*/ */
void *cb_cls; void *cb_cls;
/**
* Plugin context.
*/
struct PostgresClosure *pg;
/** /**
* Query status to return. * Query status to return.
*/ */
@ -1496,6 +1437,7 @@ deposit_confirmation_cb (void *cls,
unsigned int num_results) unsigned int num_results)
{ {
struct DepositConfirmationContext *dcc = cls; struct DepositConfirmationContext *dcc = cls;
struct PostgresClosure *pg = dcc->pg;
for (unsigned int i = 0; i < num_results; i++) for (unsigned int i = 0; i < num_results; i++)
{ {
@ -1514,7 +1456,7 @@ deposit_confirmation_cb (void *cls,
&dc.timestamp), &dc.timestamp),
GNUNET_PQ_result_spec_absolute_time ("refund_deadline", GNUNET_PQ_result_spec_absolute_time ("refund_deadline",
&dc.refund_deadline), &dc.refund_deadline),
TALER_PQ_result_spec_amount ("amount_without_fee", TALER_PQ_RESULT_SPEC_AMOUNT ("amount_without_fee",
&dc.amount_without_fee), &dc.amount_without_fee),
GNUNET_PQ_result_spec_auto_from_type ("coin_pub", GNUNET_PQ_result_spec_auto_from_type ("coin_pub",
&dc.coin_pub), &dc.coin_pub),
@ -1566,6 +1508,7 @@ postgres_get_deposit_confirmations (void *cls,
TALER_AUDITORDB_DepositConfirmationCallback cb, TALER_AUDITORDB_DepositConfirmationCallback cb,
void *cb_cls) void *cb_cls)
{ {
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (master_public_key), GNUNET_PQ_query_param_auto_from_type (master_public_key),
GNUNET_PQ_query_param_uint64 (&start_id), GNUNET_PQ_query_param_uint64 (&start_id),
@ -1574,7 +1517,8 @@ postgres_get_deposit_confirmations (void *cls,
struct DepositConfirmationContext dcc = { struct DepositConfirmationContext dcc = {
.master_pub = master_public_key, .master_pub = master_public_key,
.cb = cb, .cb = cb,
.cb_cls = cb_cls .cb_cls = cb_cls,
.pg = pg
}; };
enum GNUNET_DB_QueryStatus qs; enum GNUNET_DB_QueryStatus qs;
@ -1661,6 +1605,11 @@ struct DenominationInfoContext
*/ */
void *cb_cls; void *cb_cls;
/**
* Plugin context.
*/
struct PostgresClosure *pg;
/** /**
* Query status to return. * Query status to return.
*/ */
@ -1683,6 +1632,7 @@ denomination_info_cb (void *cls,
unsigned int num_results) unsigned int num_results)
{ {
struct DenominationInfoContext *dic = cls; struct DenominationInfoContext *dic = cls;
struct PostgresClosure *pg = dic->pg;
for (unsigned int i = 0; i < num_results; i++) for (unsigned int i = 0; i < num_results; i++)
{ {
@ -1695,11 +1645,11 @@ denomination_info_cb (void *cls,
TALER_PQ_result_spec_absolute_time_nbo ("expire_withdraw", &issue.expire_withdraw), TALER_PQ_result_spec_absolute_time_nbo ("expire_withdraw", &issue.expire_withdraw),
TALER_PQ_result_spec_absolute_time_nbo ("expire_deposit", &issue.expire_deposit), TALER_PQ_result_spec_absolute_time_nbo ("expire_deposit", &issue.expire_deposit),
TALER_PQ_result_spec_absolute_time_nbo ("expire_legal", &issue.expire_legal), TALER_PQ_result_spec_absolute_time_nbo ("expire_legal", &issue.expire_legal),
TALER_PQ_result_spec_amount_nbo ("coin", &issue.value), TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("coin", &issue.value),
TALER_PQ_result_spec_amount_nbo ("fee_withdraw", &issue.fee_withdraw), TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("fee_withdraw", &issue.fee_withdraw),
TALER_PQ_result_spec_amount_nbo ("fee_deposit", &issue.fee_deposit), TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("fee_deposit", &issue.fee_deposit),
TALER_PQ_result_spec_amount_nbo ("fee_refresh", &issue.fee_refresh), TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("fee_refresh", &issue.fee_refresh),
TALER_PQ_result_spec_amount_nbo ("fee_refund", &issue.fee_refund), TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("fee_refund", &issue.fee_refund),
GNUNET_PQ_result_spec_end GNUNET_PQ_result_spec_end
}; };
@ -1738,6 +1688,7 @@ postgres_select_denomination_info (void *cls,
TALER_AUDITORDB_DenominationInfoDataCallback cb, TALER_AUDITORDB_DenominationInfoDataCallback cb,
void *cb_cls) void *cb_cls)
{ {
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (master_pub), GNUNET_PQ_query_param_auto_from_type (master_pub),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
@ -1745,7 +1696,8 @@ postgres_select_denomination_info (void *cls,
struct DenominationInfoContext dic = { struct DenominationInfoContext dic = {
.master_pub = master_pub, .master_pub = master_pub,
.cb = cb, .cb = cb,
.cb_cls = cb_cls .cb_cls = cb_cls,
.pg = pg
}; };
enum GNUNET_DB_QueryStatus qs; enum GNUNET_DB_QueryStatus qs;
@ -2417,14 +2369,15 @@ postgres_get_reserve_info (void *cls,
struct TALER_Amount *withdraw_fee_balance, struct TALER_Amount *withdraw_fee_balance,
struct GNUNET_TIME_Absolute *expiration_date) struct GNUNET_TIME_Absolute *expiration_date)
{ {
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (reserve_pub), GNUNET_PQ_query_param_auto_from_type (reserve_pub),
GNUNET_PQ_query_param_auto_from_type (master_pub), GNUNET_PQ_query_param_auto_from_type (master_pub),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
TALER_PQ_result_spec_amount ("reserve_balance", reserve_balance), TALER_PQ_RESULT_SPEC_AMOUNT ("reserve_balance", reserve_balance),
TALER_PQ_result_spec_amount ("withdraw_fee_balance", withdraw_fee_balance), TALER_PQ_RESULT_SPEC_AMOUNT ("withdraw_fee_balance", withdraw_fee_balance),
TALER_PQ_result_spec_absolute_time ("expiration_date", expiration_date), TALER_PQ_result_spec_absolute_time ("expiration_date", expiration_date),
GNUNET_PQ_result_spec_uint64 ("auditor_reserves_rowid", rowid), GNUNET_PQ_result_spec_uint64 ("auditor_reserves_rowid", rowid),
GNUNET_PQ_result_spec_end GNUNET_PQ_result_spec_end
@ -2523,13 +2476,14 @@ postgres_get_reserve_summary (void *cls,
struct TALER_Amount *reserve_balance, struct TALER_Amount *reserve_balance,
struct TALER_Amount *withdraw_fee_balance) struct TALER_Amount *withdraw_fee_balance)
{ {
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (master_pub), GNUNET_PQ_query_param_auto_from_type (master_pub),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
TALER_PQ_result_spec_amount ("reserve_balance", reserve_balance), TALER_PQ_RESULT_SPEC_AMOUNT ("reserve_balance", reserve_balance),
TALER_PQ_result_spec_amount ("withdraw_fee_balance", withdraw_fee_balance), TALER_PQ_RESULT_SPEC_AMOUNT ("withdraw_fee_balance", withdraw_fee_balance),
GNUNET_PQ_result_spec_end GNUNET_PQ_result_spec_end
}; };
@ -2612,13 +2566,14 @@ postgres_get_wire_fee_summary (void *cls,
const struct TALER_MasterPublicKeyP *master_pub, const struct TALER_MasterPublicKeyP *master_pub,
struct TALER_Amount *wire_fee_balance) struct TALER_Amount *wire_fee_balance)
{ {
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (master_pub), GNUNET_PQ_query_param_auto_from_type (master_pub),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
TALER_PQ_result_spec_amount ("wire_fee_balance", wire_fee_balance), TALER_PQ_RESULT_SPEC_AMOUNT ("wire_fee_balance",
wire_fee_balance),
GNUNET_PQ_result_spec_end GNUNET_PQ_result_spec_end
}; };
@ -2724,14 +2679,15 @@ postgres_get_denomination_balance (void *cls,
struct TALER_Amount *payback_loss, struct TALER_Amount *payback_loss,
uint64_t *num_issued) uint64_t *num_issued)
{ {
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (denom_pub_hash), GNUNET_PQ_query_param_auto_from_type (denom_pub_hash),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
TALER_PQ_result_spec_amount ("denom_balance", denom_balance), TALER_PQ_RESULT_SPEC_AMOUNT ("denom_balance", denom_balance),
TALER_PQ_result_spec_amount ("denom_risk", denom_risk), TALER_PQ_RESULT_SPEC_AMOUNT ("denom_risk", denom_risk),
TALER_PQ_result_spec_amount ("payback_loss", payback_loss), TALER_PQ_RESULT_SPEC_AMOUNT ("payback_loss", payback_loss),
GNUNET_PQ_result_spec_uint64 ("num_issued", num_issued), GNUNET_PQ_result_spec_uint64 ("num_issued", num_issued),
GNUNET_PQ_result_spec_end GNUNET_PQ_result_spec_end
}; };
@ -2866,17 +2822,18 @@ postgres_get_balance_summary (void *cls,
struct TALER_Amount *risk, struct TALER_Amount *risk,
struct TALER_Amount *loss) struct TALER_Amount *loss)
{ {
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (master_pub), GNUNET_PQ_query_param_auto_from_type (master_pub),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
TALER_PQ_result_spec_amount ("denom_balance", denom_balance), TALER_PQ_RESULT_SPEC_AMOUNT ("denom_balance", denom_balance),
TALER_PQ_result_spec_amount ("deposit_fee_balance", deposit_fee_balance), TALER_PQ_RESULT_SPEC_AMOUNT ("deposit_fee_balance", deposit_fee_balance),
TALER_PQ_result_spec_amount ("melt_fee_balance", melt_fee_balance), TALER_PQ_RESULT_SPEC_AMOUNT ("melt_fee_balance", melt_fee_balance),
TALER_PQ_result_spec_amount ("refund_fee_balance", refund_fee_balance), TALER_PQ_RESULT_SPEC_AMOUNT ("refund_fee_balance", refund_fee_balance),
TALER_PQ_result_spec_amount ("risk", risk), TALER_PQ_RESULT_SPEC_AMOUNT ("risk", risk),
TALER_PQ_result_spec_amount ("loss", loss), TALER_PQ_RESULT_SPEC_AMOUNT ("loss", loss),
GNUNET_PQ_result_spec_end GNUNET_PQ_result_spec_end
}; };
@ -2940,6 +2897,11 @@ struct HistoricDenomRevenueContext
*/ */
void *cb_cls; void *cb_cls;
/**
* Plugin context.
*/
struct PostgresClosure *pg;
/** /**
* Number of results processed. * Number of results processed.
*/ */
@ -2962,6 +2924,7 @@ historic_denom_revenue_cb (void *cls,
unsigned int num_results) unsigned int num_results)
{ {
struct HistoricDenomRevenueContext *hrc = cls; struct HistoricDenomRevenueContext *hrc = cls;
struct PostgresClosure *pg = hrc->pg;
for (unsigned int i = 0; i < num_results; i++) for (unsigned int i = 0; i < num_results; i++)
{ {
@ -2972,8 +2935,8 @@ historic_denom_revenue_cb (void *cls,
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_auto_from_type ("denom_pub_hash", &denom_pub_hash), GNUNET_PQ_result_spec_auto_from_type ("denom_pub_hash", &denom_pub_hash),
TALER_PQ_result_spec_absolute_time ("revenue_timestamp", &revenue_timestamp), TALER_PQ_result_spec_absolute_time ("revenue_timestamp", &revenue_timestamp),
TALER_PQ_result_spec_amount ("revenue_balance", &revenue_balance), TALER_PQ_RESULT_SPEC_AMOUNT ("revenue_balance", &revenue_balance),
TALER_PQ_result_spec_amount ("loss_balance", &loss), TALER_PQ_RESULT_SPEC_AMOUNT ("loss_balance", &loss),
GNUNET_PQ_result_spec_end GNUNET_PQ_result_spec_end
}; };
@ -3017,13 +2980,15 @@ postgres_select_historic_denom_revenue (void *cls,
TALER_AUDITORDB_HistoricDenominationRevenueDataCallback cb, TALER_AUDITORDB_HistoricDenominationRevenueDataCallback cb,
void *cb_cls) void *cb_cls)
{ {
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (master_pub), GNUNET_PQ_query_param_auto_from_type (master_pub),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
struct HistoricDenomRevenueContext hrc = { struct HistoricDenomRevenueContext hrc = {
.cb = cb, .cb = cb,
.cb_cls = cb_cls .cb_cls = cb_cls,
.pg = pg
}; };
enum GNUNET_DB_QueryStatus qs; enum GNUNET_DB_QueryStatus qs;
@ -3086,6 +3051,11 @@ struct HistoricReserveRevenueContext
*/ */
void *cb_cls; void *cb_cls;
/**
* Plugin context.
*/
struct PostgresClosure *pg;
/** /**
* Number of results processed. * Number of results processed.
*/ */
@ -3108,6 +3078,7 @@ historic_reserve_revenue_cb (void *cls,
unsigned int num_results) unsigned int num_results)
{ {
struct HistoricReserveRevenueContext *hrc = cls; struct HistoricReserveRevenueContext *hrc = cls;
struct PostgresClosure *pg = hrc->pg;
for (unsigned int i = 0; i < num_results; i++) for (unsigned int i = 0; i < num_results; i++)
{ {
@ -3117,7 +3088,7 @@ historic_reserve_revenue_cb (void *cls,
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
TALER_PQ_result_spec_absolute_time ("start_date", &start_date), TALER_PQ_result_spec_absolute_time ("start_date", &start_date),
TALER_PQ_result_spec_absolute_time ("end_date", &end_date), TALER_PQ_result_spec_absolute_time ("end_date", &end_date),
TALER_PQ_result_spec_amount ("reserve_profits", &reserve_profits), TALER_PQ_RESULT_SPEC_AMOUNT ("reserve_profits", &reserve_profits),
GNUNET_PQ_result_spec_end GNUNET_PQ_result_spec_end
}; };
@ -3158,6 +3129,7 @@ postgres_select_historic_reserve_revenue (void *cls,
TALER_AUDITORDB_HistoricReserveRevenueDataCallback cb, TALER_AUDITORDB_HistoricReserveRevenueDataCallback cb,
void *cb_cls) void *cb_cls)
{ {
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (master_pub), GNUNET_PQ_query_param_auto_from_type (master_pub),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
@ -3165,7 +3137,8 @@ postgres_select_historic_reserve_revenue (void *cls,
enum GNUNET_DB_QueryStatus qs; enum GNUNET_DB_QueryStatus qs;
struct HistoricReserveRevenueContext hrc = { struct HistoricReserveRevenueContext hrc = {
.cb = cb, .cb = cb,
.cb_cls = cb_cls .cb_cls = cb_cls,
.pg = pg
}; };
qs = GNUNET_PQ_eval_prepared_multi_select (session->conn, qs = GNUNET_PQ_eval_prepared_multi_select (session->conn,
@ -3250,13 +3223,14 @@ postgres_get_predicted_balance (void *cls,
const struct TALER_MasterPublicKeyP *master_pub, const struct TALER_MasterPublicKeyP *master_pub,
struct TALER_Amount *balance) struct TALER_Amount *balance)
{ {
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (master_pub), GNUNET_PQ_query_param_auto_from_type (master_pub),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
TALER_PQ_result_spec_amount ("balance", balance), TALER_PQ_RESULT_SPEC_AMOUNT ("balance",
balance),
GNUNET_PQ_result_spec_end GNUNET_PQ_result_spec_end
}; };
@ -3309,6 +3283,19 @@ libtaler_plugin_auditordb_postgres_init (void *cls)
return NULL; return NULL;
} }
} }
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (cfg,
"taler",
"CURRENCY",
&pg->currency))
{
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
"taler",
"CURRENCY");
GNUNET_free (pg->connection_cfg_str);
GNUNET_free (pg);
return NULL;
}
plugin = GNUNET_new (struct TALER_AUDITORDB_Plugin); plugin = GNUNET_new (struct TALER_AUDITORDB_Plugin);
plugin->cls = pg; plugin->cls = pg;
plugin->get_session = &postgres_get_session; plugin->get_session = &postgres_get_session;
@ -3394,6 +3381,7 @@ libtaler_plugin_auditordb_postgres_done (void *cls)
struct PostgresClosure *pg = plugin->cls; struct PostgresClosure *pg = plugin->cls;
GNUNET_free (pg->connection_cfg_str); GNUNET_free (pg->connection_cfg_str);
GNUNET_free (pg->currency);
GNUNET_free (pg); GNUNET_free (pg);
GNUNET_free (plugin); GNUNET_free (plugin);
return NULL; return NULL;

View File

@ -5,3 +5,6 @@ DB = postgres
[auditordb-postgres] [auditordb-postgres]
# Argument for Postgres for how to connect to the database. # Argument for Postgres for how to connect to the database.
CONFIG = "postgres:///talercheck" CONFIG = "postgres:///talercheck"
[taler]
CURRENCY = "EUR"

View File

@ -54,7 +54,7 @@ static int result = -1;
/** /**
* Currency we use. * Currency we use, must match CURRENCY in "test-auditor-db-postgres.conf".
*/ */
#define CURRENCY "EUR" #define CURRENCY "EUR"

View File

@ -71,6 +71,7 @@ sign_account_data (void *cls,
global_ret = 1; global_ret = 1;
return; return;
} }
wire = TALER_JSON_exchange_wire_signature_make (ai->payto_url, wire = TALER_JSON_exchange_wire_signature_make (ai->payto_url,
&master_priv); &master_priv);
GNUNET_assert (NULL != wire); GNUNET_assert (NULL != wire);
@ -199,6 +200,9 @@ run (void *cls,
global_ret = 1; global_ret = 1;
return; return;
} }
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Signing /wire response with private key matching public key `%s'\n",
masters);
GNUNET_free (masters); GNUNET_free (masters);
TALER_EXCHANGEDB_find_accounts (cfg, TALER_EXCHANGEDB_find_accounts (cfg,
&sign_account_data, &sign_account_data,

View File

@ -684,6 +684,9 @@ exchange_serve_process_config ()
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
GNUNET_free (TEH_master_public_key_str); GNUNET_free (TEH_master_public_key_str);
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Launching exchange with public key `%s'...\n",
GNUNET_p2s (&TEH_master_public_key.eddsa_pub));
if ( (GNUNET_OK != if ( (GNUNET_OK !=
TEH_VALIDATION_init (cfg)) || TEH_VALIDATION_init (cfg)) ||

View File

@ -173,8 +173,9 @@ load_account (void *cls,
&TEH_master_public_key)) &TEH_master_public_key))
{ {
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Invalid signature in `%s'\n", "Invalid signature in `%s' for public key `%s'\n",
ai->wire_response_filename); ai->wire_response_filename,
GNUNET_p2s (&TEH_master_public_key.eddsa_pub));
json_decref (wire_s); json_decref (wire_s);
*ret = GNUNET_SYSERR; *ret = GNUNET_SYSERR;
return; return;

File diff suppressed because it is too large Load Diff

View File

@ -7,6 +7,8 @@ DB = postgres
#The connection string the plugin has to use for connecting to the database #The connection string the plugin has to use for connecting to the database
CONFIG = postgres:///talercheck CONFIG = postgres:///talercheck
[taler]
CURRENCY = EUR
[exchangedb] [exchangedb]

View File

@ -55,7 +55,7 @@ static int result;
/** /**
* Currency we use. * Currency we use. Must match test-exchange-db-*.conf.
*/ */
#define CURRENCY "EUR" #define CURRENCY "EUR"
@ -343,61 +343,6 @@ never_called_cb (void *cls,
} }
/**
* Callback used to process data of a merchant under KYC monitoring.
*
* @param cls closure
* @param payto_url payto URL of this particular merchant (bank account)
* @param general_id general identificator valid at the KYC-caring institution
* @param kyc_checked status of KYC check: if GNUNET_OK, the merchant was
* checked at least once, never otherwise.
* @param merchant_serial_id serial ID identifying this merchant (bank
* account) into the database system; it helps making more efficient
* queries instead of the payto URL.
*/
static void
kcs (void *cls,
const char *payto_url,
const char *general_id,
uint8_t kyc_checked,
uint64_t merchant_serial_id)
{
struct TALER_EXCHANGEDB_Session *session = cls;
struct TALER_Amount amount;
struct TALER_Amount sum;
GNUNET_assert (GNUNET_OK ==
TALER_amount_get_zero (CURRENCY,
&amount));
amount.value = 30;
FAILIF
(GNUNET_OK != plugin->insert_kyc_event (NULL,
session,
merchant_serial_id,
&amount));
amount.value = 20;
amount.fraction = 70;
FAILIF
(GNUNET_OK != plugin->insert_kyc_event (NULL,
session,
merchant_serial_id,
&amount));
FAILIF
(0 >= plugin->get_kyc_events (NULL,
session,
merchant_serial_id,
&sum));
FAILIF ((50 != sum.value) || (70 != sum.fraction));
FAILIF (2 != plugin->clean_kyc_events (NULL,
session,
merchant_serial_id));
drop:
return;
}
/** /**
* Function called with information about a refresh order. * Function called with information about a refresh order.
* Checks that the response matches what we expect to see. * Checks that the response matches what we expect to see.
@ -2225,26 +2170,6 @@ run (void *cls)
FAILIF (GNUNET_OK != FAILIF (GNUNET_OK !=
test_wire_fees (session)); test_wire_fees (session));
FAILIF (GNUNET_OK !=
plugin->insert_kyc_merchant (NULL,
session,
"dummy", // NULL segfaults.
"payto://mock"));
FAILIF (GNUNET_OK !=
plugin->mark_kyc_merchant (NULL,
session,
"payto://mock"));
FAILIF (GNUNET_OK !=
plugin->get_kyc_status (NULL,
session,
"payto://mock",
&kcs,
session));
FAILIF (GNUNET_OK !=
plugin->unmark_kyc_merchant (NULL,
session,
"payto://mock"));
plugin->preflight (plugin->cls, plugin->preflight (plugin->cls,
session); session);

View File

@ -793,29 +793,6 @@ typedef int
int done); int done);
/**
* Callback used to process data of a merchant under KYC monitoring.
*
* @param cls closure
* @param payto_url payto URL of this particular
* merchant (bank account)
* @param general_id general identificator valid
* at the KYC-caring institution
* @param kyc_checked status of KYC check:
* if GNUNET_OK, the merchant was checked at least once,
* never otherwise.
* @param merchant_serial_id serial ID identifying
* this merchant (bank account) into the database system;
* it helps making more efficient queries than the payto
* URL.
*/
typedef void
(*TALER_EXCHANGEDB_KycStatusCallback)(void *cls,
const char *payto_url,
const char *general_id,
uint8_t kyc_checked,
uint64_t merchant_serial_id);
/** /**
* Function called with details about coins that were melted, * Function called with details about coins that were melted,
* with the goal of auditing the refresh's execution. * with the goal of auditing the refresh's execution.
@ -918,19 +895,6 @@ typedef void
const struct TALER_TransferPublicKeyP *tp); const struct TALER_TransferPublicKeyP *tp);
/**
* Callback for handling a KYC timestamped event associated with
* a certain customer (= merchant).
*
* @param cls closure
* @param url "payto" URL associated with the customer
* @param timeout last time when the KYC was issued to the customer.
*/
typedef void
(*TALER_EXCHANGEDB_KycCallback)(void *cls,
const char *url,
struct GNUNET_TIME_Absolute timeout);
/** /**
* Function called with details about coins that were refunding, * Function called with details about coins that were refunding,
* with the goal of auditing the refund's execution. * with the goal of auditing the refund's execution.
@ -2509,126 +2473,6 @@ struct TALER_EXCHANGEDB_Plugin
TALER_EXCHANGEDB_WireMissingCallback cb, TALER_EXCHANGEDB_WireMissingCallback cb,
void *cb_cls); void *cb_cls);
/**
* Insert a merchant into the KYC monitor table, namely it
* associates a flag to the merchant that indicates whether
* a KYC check has been done or not on this merchant.
*
* @param cls closure
* @param session db session
* @param general_id identificator at the KYC-aware institution,
* can be NULL if this is in-line wiht the rules.
* @param payto_url payto:// URL indentifying the merchant
* bank account.
* @return database transaction status.
*/
enum GNUNET_DB_QueryStatus
(*insert_kyc_merchant)(void *cls,
struct TALER_EXCHANGEDB_Session *session,
const char *general_id,
const char *payto_url);
/**
* Mark a merchant as KYC-checked.
*
* @param cls closure
* @param session db session
* @param payto_url payto:// URL indentifying the merchant
* to check. Note, different banks may have different
* policies to check their customers.
* @return database transaction status.
*/
enum GNUNET_DB_QueryStatus
(*mark_kyc_merchant)(void *cls,
struct TALER_EXCHANGEDB_Session *session,
const char *payto_url);
/**
* Mark a merchant as NOT KYC-checked.
*
* @param cls closure
* @param session db session
* @param payto_url payto:// URL indentifying the merchant
* to unmark. Note, different banks may have different
* policies to check their customers.
* @return database transaction status.
*/
enum GNUNET_DB_QueryStatus
(*unmark_kyc_merchant)(void *cls,
struct TALER_EXCHANGEDB_Session *session,
const char *payto_url);
/**
* Retrieve KYC-check status related to a particular merchant.
*
* @param cls closure
* @param session db session
* @param payto_url URL identifying a merchant bank account,
* whose KYC is going to be retrieved.
* @param ksc callback to process all the row's columns. As
* expectable, it will only be called _if_ a row is found.
* @param ksc_cls closure for above callback.
* @return transaction status.
*/
enum GNUNET_DB_QueryStatus
(*get_kyc_status)(void *cls,
struct TALER_EXCHANGEDB_Session *session,
const char *payto_url,
TALER_EXCHANGEDB_KycStatusCallback ksc,
void *ksc_cls);
/**
* Record timestamp where a particular merchant performed
* a wire transfer.
*
* @param cls closure.
* @param session db session.
* @param merchant_serial_id serial id of the merchant who
* performed the wire transfer.
* @param amount amount of the wire transfer being monitored.
* @return database transaction status.
*/
enum GNUNET_DB_QueryStatus
(*insert_kyc_event)(void *cls,
struct TALER_EXCHANGEDB_Session *session,
uint64_t merchant_serial_id,
struct TALER_Amount *amount);
/**
* Calculate sum of money flow related to a particular merchant,
* used for KYC monitoring.
*
* @param cls closure
* @param session DB session
* @param merchant_serial_id serial id identifying the merchant
* into the KYC monitoring system.
* @param amount[out] will store the amount of money received
* by this merchant.
*/
enum GNUNET_DB_QueryStatus
(*get_kyc_events)(void *cls,
struct TALER_EXCHANGEDB_Session *session,
uint64_t merchant_serial_id,
struct TALER_Amount *amount);
/**
* Delete wire transfer records related to a particular merchant.
* This method would be called by the logic once that merchant
* gets successfully KYC checked.
*
* @param cls closure
* @param session DB session
* @param merchant_serial_id serial id of the merchant whose
* KYC records have to be deleted.
* @return DB transaction status.
*/
enum GNUNET_DB_QueryStatus
(*clean_kyc_events)(void *cls,
struct TALER_EXCHANGEDB_Session *session,
uint64_t merchant_serial_id);
}; };
#endif /* _TALER_EXCHANGE_DB_H */ #endif /* _TALER_EXCHANGE_DB_H */

View File

@ -94,11 +94,13 @@ TALER_PQ_query_param_absolute_time_nbo (const struct GNUNET_TIME_AbsoluteNBO *x)
* Currency amount expected. * Currency amount expected.
* *
* @param name name of the field in the table * @param name name of the field in the table
* @param currency expected currency for the @a amount
* @param[out] amount where to store the result * @param[out] amount where to store the result
* @return array entry for the result specification to use * @return array entry for the result specification to use
*/ */
struct GNUNET_PQ_ResultSpec struct GNUNET_PQ_ResultSpec
TALER_PQ_result_spec_amount_nbo (const char *name, TALER_PQ_result_spec_amount_nbo (const char *name,
const char *currency,
struct TALER_AmountNBO *amount); struct TALER_AmountNBO *amount);
@ -106,11 +108,13 @@ TALER_PQ_result_spec_amount_nbo (const char *name,
* Currency amount expected. * Currency amount expected.
* *
* @param name name of the field in the table * @param name name of the field in the table
* @param currency expected currency for the @a amount
* @param[out] amount where to store the result * @param[out] amount where to store the result
* @return array entry for the result specification to use * @return array entry for the result specification to use
*/ */
struct GNUNET_PQ_ResultSpec struct GNUNET_PQ_ResultSpec
TALER_PQ_result_spec_amount (const char *name, TALER_PQ_result_spec_amount (const char *name,
const char *currency,
struct TALER_Amount *amount); struct TALER_Amount *amount);

View File

@ -89,6 +89,7 @@ const char *
TALER_b2s (const void *buf, TALER_b2s (const void *buf,
size_t buf_size); size_t buf_size);
/** /**
* Convert a fixed-sized object to a string using * Convert a fixed-sized object to a string using
* #TALER_b2s(). * #TALER_b2s().

View File

@ -150,7 +150,6 @@ TALER_JSON_exchange_wire_signature_make (const char *payto_url,
GNUNET_CRYPTO_eddsa_key_get_public (&master_priv->eddsa_priv, GNUNET_CRYPTO_eddsa_key_get_public (&master_priv->eddsa_priv,
&master_pub.eddsa_pub); &master_pub.eddsa_pub);
TALER_exchange_wire_signature_make (payto_url, TALER_exchange_wire_signature_make (payto_url,
master_priv, master_priv,
&master_sig); &master_sig);

View File

@ -54,7 +54,7 @@ qconv_amount_nbo (void *cls,
const struct TALER_AmountNBO *amount = data; const struct TALER_AmountNBO *amount = data;
unsigned int off = 0; unsigned int off = 0;
GNUNET_assert (3 == param_length); GNUNET_assert (2 == param_length);
param_values[off] = (void *) &amount->value; param_values[off] = (void *) &amount->value;
param_lengths[off] = sizeof (amount->value); param_lengths[off] = sizeof (amount->value);
param_formats[off] = 1; param_formats[off] = 1;
@ -62,10 +62,6 @@ qconv_amount_nbo (void *cls,
param_values[off] = (void *) &amount->fraction; param_values[off] = (void *) &amount->fraction;
param_lengths[off] = sizeof (amount->fraction); param_lengths[off] = sizeof (amount->fraction);
param_formats[off] = 1; param_formats[off] = 1;
off++;
param_values[off] = (void *) amount->currency;
param_lengths[off] = strlen (amount->currency);
param_formats[off] = 1;
return 0; return 0;
} }
@ -83,7 +79,7 @@ struct GNUNET_PQ_QueryParam
TALER_PQ_query_param_amount_nbo (const struct TALER_AmountNBO *x) TALER_PQ_query_param_amount_nbo (const struct TALER_AmountNBO *x)
{ {
struct GNUNET_PQ_QueryParam res = struct GNUNET_PQ_QueryParam res =
{ &qconv_amount_nbo, NULL, x, sizeof (*x), 3 }; { &qconv_amount_nbo, NULL, x, sizeof (*x), 2 };
return res; return res;
} }
@ -146,7 +142,7 @@ struct GNUNET_PQ_QueryParam
TALER_PQ_query_param_amount (const struct TALER_Amount *x) TALER_PQ_query_param_amount (const struct TALER_Amount *x)
{ {
struct GNUNET_PQ_QueryParam res = struct GNUNET_PQ_QueryParam res =
{ &qconv_amount, NULL, x, sizeof (*x), 3 }; { &qconv_amount, NULL, x, sizeof (*x), 2 };
return res; return res;
} }

View File

@ -41,14 +41,13 @@
static int static int
extract_amount_nbo_helper (PGresult *result, extract_amount_nbo_helper (PGresult *result,
int row, int row,
const char *currency,
const char *val_name, const char *val_name,
const char *frac_name, const char *frac_name,
const char *curr_name,
struct TALER_AmountNBO *r_amount_nbo) struct TALER_AmountNBO *r_amount_nbo)
{ {
int val_num; int val_num;
int frac_num; int frac_num;
int curr_num;
int len; int len;
/* These checks are simply to check that clients obey by our naming /* These checks are simply to check that clients obey by our naming
@ -59,9 +58,6 @@ extract_amount_nbo_helper (PGresult *result,
GNUNET_assert (NULL != GNUNET_assert (NULL !=
strstr (frac_name, strstr (frac_name,
"_frac")); "_frac"));
GNUNET_assert (NULL !=
strstr (curr_name,
"_curr"));
/* Set return value to invalid in case we don't finish */ /* Set return value to invalid in case we don't finish */
memset (r_amount_nbo, memset (r_amount_nbo,
0, 0,
@ -70,8 +66,6 @@ extract_amount_nbo_helper (PGresult *result,
val_name); val_name);
frac_num = PQfnumber (result, frac_num = PQfnumber (result,
frac_name); frac_name);
curr_num = PQfnumber (result,
curr_name);
if (val_num < 0) if (val_num < 0)
{ {
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@ -86,22 +80,12 @@ extract_amount_nbo_helper (PGresult *result,
frac_name); frac_name);
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
if (curr_num < 0)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Field `%s' does not exist in result\n",
curr_name);
return GNUNET_SYSERR;
}
if ( (PQgetisnull (result, if ( (PQgetisnull (result,
row, row,
val_num)) || val_num)) ||
(PQgetisnull (result, (PQgetisnull (result,
row, row,
frac_num)) || frac_num)) )
(PQgetisnull (result,
row,
curr_num)) )
{ {
GNUNET_break (0); GNUNET_break (0);
return GNUNET_NO; return GNUNET_NO;
@ -115,13 +99,9 @@ extract_amount_nbo_helper (PGresult *result,
row, row,
frac_num); frac_num);
len = GNUNET_MIN (TALER_CURRENCY_LEN - 1, len = GNUNET_MIN (TALER_CURRENCY_LEN - 1,
PQgetlength (result, strlen (currency));
row,
curr_num));
memcpy (r_amount_nbo->currency, memcpy (r_amount_nbo->currency,
PQgetvalue (result, currency,
row,
curr_num),
len); len);
return GNUNET_OK; return GNUNET_OK;
} }
@ -130,7 +110,7 @@ extract_amount_nbo_helper (PGresult *result,
/** /**
* Extract data from a Postgres database @a result at row @a row. * Extract data from a Postgres database @a result at row @a row.
* *
* @param cls closure * @param cls closure, a `const char *` giving the currency
* @param result where to extract data from * @param result where to extract data from
* @param row row to extract data from * @param row row to extract data from
* @param fname name (or prefix) of the fields to extract from * @param fname name (or prefix) of the fields to extract from
@ -149,9 +129,9 @@ extract_amount_nbo (void *cls,
size_t *dst_size, size_t *dst_size,
void *dst) void *dst)
{ {
const char *currency = cls;
char *val_name; char *val_name;
char *frac_name; char *frac_name;
char *curr_name;
int ret; int ret;
GNUNET_asprintf (&val_name, GNUNET_asprintf (&val_name,
@ -160,18 +140,14 @@ extract_amount_nbo (void *cls,
GNUNET_asprintf (&frac_name, GNUNET_asprintf (&frac_name,
"%s_frac", "%s_frac",
fname); fname);
GNUNET_asprintf (&curr_name,
"%s_curr",
fname);
ret = extract_amount_nbo_helper (result, ret = extract_amount_nbo_helper (result,
row, row,
currency,
val_name, val_name,
frac_name, frac_name,
curr_name,
dst); dst);
GNUNET_free (val_name); GNUNET_free (val_name);
GNUNET_free (frac_name); GNUNET_free (frac_name);
GNUNET_free (curr_name);
return ret; return ret;
} }
@ -185,12 +161,17 @@ extract_amount_nbo (void *cls,
*/ */
struct GNUNET_PQ_ResultSpec struct GNUNET_PQ_ResultSpec
TALER_PQ_result_spec_amount_nbo (const char *name, TALER_PQ_result_spec_amount_nbo (const char *name,
const char *currency,
struct TALER_AmountNBO *amount) struct TALER_AmountNBO *amount)
{ {
struct GNUNET_PQ_ResultSpec res = struct GNUNET_PQ_ResultSpec res = {
{ &extract_amount_nbo, NULL, NULL, .conv = &extract_amount_nbo,
(void *) amount, sizeof (*amount), .cls = (void *) currency,
name, NULL }; .dst = (void *) amount,
.dst_size = sizeof (*amount),
.fname = name
};
return res; return res;
} }
@ -198,7 +179,7 @@ TALER_PQ_result_spec_amount_nbo (const char *name,
/** /**
* Extract data from a Postgres database @a result at row @a row. * Extract data from a Postgres database @a result at row @a row.
* *
* @param cls closure * @param cls closure, a `const char *` giving the currency
* @param result where to extract data from * @param result where to extract data from
* @param row row to extract data from * @param row row to extract data from
* @param fname name (or prefix) of the fields to extract from * @param fname name (or prefix) of the fields to extract from
@ -217,10 +198,10 @@ extract_amount (void *cls,
size_t *dst_size, size_t *dst_size,
void *dst) void *dst)
{ {
const char *currency = cls;
struct TALER_Amount *r_amount = dst; struct TALER_Amount *r_amount = dst;
char *val_name; char *val_name;
char *frac_name; char *frac_name;
char *curr_name;
struct TALER_AmountNBO amount_nbo; struct TALER_AmountNBO amount_nbo;
int ret; int ret;
@ -230,20 +211,16 @@ extract_amount (void *cls,
GNUNET_asprintf (&frac_name, GNUNET_asprintf (&frac_name,
"%s_frac", "%s_frac",
fname); fname);
GNUNET_asprintf (&curr_name,
"%s_curr",
fname);
ret = extract_amount_nbo_helper (result, ret = extract_amount_nbo_helper (result,
row, row,
currency,
val_name, val_name,
frac_name, frac_name,
curr_name,
&amount_nbo); &amount_nbo);
TALER_amount_ntoh (r_amount, TALER_amount_ntoh (r_amount,
&amount_nbo); &amount_nbo);
GNUNET_free (val_name); GNUNET_free (val_name);
GNUNET_free (frac_name); GNUNET_free (frac_name);
GNUNET_free (curr_name);
return ret; return ret;
} }
@ -252,17 +229,23 @@ extract_amount (void *cls,
* Currency amount expected. * Currency amount expected.
* *
* @param name name of the field in the table * @param name name of the field in the table
* @param currency the currency the amount is in
* @param[out] amount where to store the result * @param[out] amount where to store the result
* @return array entry for the result specification to use * @return array entry for the result specification to use
*/ */
struct GNUNET_PQ_ResultSpec struct GNUNET_PQ_ResultSpec
TALER_PQ_result_spec_amount (const char *name, TALER_PQ_result_spec_amount (const char *name,
const char *currency,
struct TALER_Amount *amount) struct TALER_Amount *amount)
{ {
struct GNUNET_PQ_ResultSpec res = struct GNUNET_PQ_ResultSpec res = {
{ &extract_amount, NULL, NULL, .conv = &extract_amount,
(void *) amount, sizeof (*amount), .cls = (void *) currency,
name, NULL }; .dst = (void *) amount,
.dst_size = sizeof (*amount),
.fname = name
};
return res; return res;
} }
@ -363,15 +346,17 @@ struct GNUNET_PQ_ResultSpec
TALER_PQ_result_spec_json (const char *name, TALER_PQ_result_spec_json (const char *name,
json_t **jp) json_t **jp)
{ {
struct GNUNET_PQ_ResultSpec res = struct GNUNET_PQ_ResultSpec res = {
{ &extract_json, &clean_json, NULL, .conv = &extract_json,
(void *) jp, 0, .cleaner = &clean_json,
name, NULL }; .dst = (void *) jp,
.fname = name
};
return res; return res;
} }
/** /**
* Extract data from a Postgres database @a result at row @a row. * Extract data from a Postgres database @a result at row @a row.
* *
@ -443,10 +428,13 @@ struct GNUNET_PQ_ResultSpec
TALER_PQ_result_spec_absolute_time (const char *name, TALER_PQ_result_spec_absolute_time (const char *name,
struct GNUNET_TIME_Absolute *at) struct GNUNET_TIME_Absolute *at)
{ {
struct GNUNET_PQ_ResultSpec res = struct GNUNET_PQ_ResultSpec res = {
{ &extract_round_time, NULL, NULL, .conv = &extract_round_time,
(void *) at, sizeof (struct GNUNET_TIME_Absolute), .dst = (void *) at,
name, NULL }; .dst_size = sizeof (struct GNUNET_TIME_Absolute),
.fname = name
};
return res; return res;
} }
@ -522,10 +510,13 @@ struct GNUNET_PQ_ResultSpec
TALER_PQ_result_spec_absolute_time_nbo (const char *name, TALER_PQ_result_spec_absolute_time_nbo (const char *name,
struct GNUNET_TIME_AbsoluteNBO *at) struct GNUNET_TIME_AbsoluteNBO *at)
{ {
struct GNUNET_PQ_ResultSpec res = struct GNUNET_PQ_ResultSpec res = {
{ &extract_round_time_nbo, NULL, NULL, .conv = &extract_round_time_nbo,
(void *) at, sizeof (struct GNUNET_TIME_AbsoluteNBO), .dst = (void *) at,
name, NULL }; .dst_size = sizeof (struct GNUNET_TIME_AbsoluteNBO),
.fname = name
};
return res; return res;
} }

View File

@ -50,23 +50,18 @@ postgres_prepare (PGconn *db_conn)
"INSERT INTO test_pq (" "INSERT INTO test_pq ("
" hamount_val" " hamount_val"
",hamount_frac" ",hamount_frac"
",hamount_curr"
",namount_val" ",namount_val"
",namount_frac" ",namount_frac"
",namount_curr"
",json" ",json"
") VALUES " ") VALUES "
"($1, $2, $3, $4, $5, $6," "($1, $2, $3, $4, $5);",
"$7);", 5, NULL);
7, NULL);
PREPARE ("test_select", PREPARE ("test_select",
"SELECT" "SELECT"
" hamount_val" " hamount_val"
",hamount_frac" ",hamount_frac"
",hamount_curr"
",namount_val" ",namount_val"
",namount_frac" ",namount_frac"
",namount_curr"
",json" ",json"
" FROM test_pq;", " FROM test_pq;",
0, NULL); 0, NULL);
@ -144,8 +139,8 @@ run_queries (PGconn *conn)
{ {
struct GNUNET_PQ_ResultSpec results_select[] = { struct GNUNET_PQ_ResultSpec results_select[] = {
TALER_PQ_result_spec_amount ("hamount", &hamount2), TALER_PQ_result_spec_amount ("hamount", "EUR", &hamount2),
TALER_PQ_result_spec_amount_nbo ("namount", &namount2), TALER_PQ_result_spec_amount_nbo ("namount", "EUR", &namount2),
TALER_PQ_result_spec_json ("json", &json2), TALER_PQ_result_spec_json ("json", &json2),
GNUNET_PQ_result_spec_end GNUNET_PQ_result_spec_end
}; };
@ -164,7 +159,8 @@ run_queries (PGconn *conn)
GNUNET_break (0 == GNUNET_break (0 ==
TALER_amount_cmp (&hamount, TALER_amount_cmp (&hamount,
&hamount2)); &hamount2));
GNUNET_break (42 == json_integer_value (json_object_get (json2, "foo"))); GNUNET_break (42 ==
json_integer_value (json_object_get (json2, "foo")));
GNUNET_PQ_cleanup_result (results_select); GNUNET_PQ_cleanup_result (results_select);
PQclear (result); PQclear (result);
} }
@ -202,10 +198,8 @@ main(int argc,
"CREATE TEMPORARY TABLE IF NOT EXISTS test_pq (" "CREATE TEMPORARY TABLE IF NOT EXISTS test_pq ("
" hamount_val INT8 NOT NULL" " hamount_val INT8 NOT NULL"
",hamount_frac INT4 NOT NULL" ",hamount_frac INT4 NOT NULL"
",hamount_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",namount_val INT8 NOT NULL" ",namount_val INT8 NOT NULL"
",namount_frac INT4 NOT NULL" ",namount_frac INT4 NOT NULL"
",namount_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",json VARCHAR NOT NULL" ",json VARCHAR NOT NULL"
")"); ")");
if (PGRES_COMMAND_OK != PQresultStatus (result)) if (PGRES_COMMAND_OK != PQresultStatus (result))