implement #4956-support in exchange db and exchange (to return information about closed reserves)

This commit is contained in:
Christian Grothoff 2017-04-19 14:40:43 +02:00
parent c15ff78f0c
commit 8f98a5ca6e
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
2 changed files with 106 additions and 4 deletions

View File

@ -886,17 +886,20 @@ compile_reserve_history (const struct TALER_EXCHANGEDB_ReserveHistory *rh,
rcc.reserve_pub = pos->details.closing->reserve_pub;
TALER_JSON_hash (pos->details.closing->receiver_account_details,
&rcc.h_wire);
TALER_JSON_hash (pos->details.closing->transfer_details,
&rcc.h_transfer);
TEH_KS_sign (&rcc.purpose,
&pub,
&sig);
GNUNET_assert (0 ==
json_array_append_new (json_history,
json_pack ("{s:s, s:o, s:o, s:o, s:o}",
json_pack ("{s:s, s:O, s:O, s:o, s:o, s:o, s:o, s:o}",
"type", "CLOSING",
"receiver_account_details", pos->details.closing->receiver_account_details,
"transfer_details", pos->details.closing->transfer_details,
"exchange_pub", GNUNET_JSON_from_data_auto (&pub),
"exchange_sig", GNUNET_JSON_from_data_auto (&sig),
"timestamp", GNUNET_JSON_from_time_abs (pos->details.closing->execution_date),
"h_wire", GNUNET_JSON_from_data_auto (&rcc.h_wire),
"amount", TALER_JSON_from_amount (&value),
"closing_fee", TALER_JSON_from_amount (&pos->details.closing->closing_fee))));
}

View File

@ -564,6 +564,26 @@ postgres_create_tables (void *cls)
SQLEXEC_INDEX("CREATE INDEX prepare_iteration_index "
"ON prewire(type,finished)");
/* This table contains the data for
wire transfers the exchange has executed
to close a reserve. */
SQLEXEC("CREATE TABLE IF NOT EXISTS reserve_close "
"(close_uuid BIGSERIAL PRIMARY KEY"
",reserve_pub BYTEA NOT NULL REFERENCES reserves (reserve_pub) ON DELETE CASCADE"
",execution_date INT8 NOT NULL"
",transfer_details TEXT NOT NULL"
",receiver_account TEXT NOT NULL"
",amount_val INT8 NOT NULL"
",amount_frac INT4 NOT NULL"
",amount_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",closing_fee_val INT8 NOT NULL"
",closing_fee_frac INT4 NOT NULL"
",closing_fee_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
")");
SQLEXEC_INDEX("CREATE INDEX reserve_close_by_reserve "
"ON reserve_close(reserve_pub)");
#undef SQLEXEC
#undef SQLEXEC_INDEX
@ -1508,6 +1528,22 @@ postgres_prepare (PGconn *db_conn)
" WHERE payback.reserve_pub=$1",
1, NULL);
/* Used in #postgres_get_reserve_history() */
PREPARE ("close_by_reserve",
"SELECT"
" amount_val"
",amount_frac"
",amount_curr"
",closing_fee_val"
",closing_fee_frac"
",closing_fee_curr"
",execution_date"
",receiver_account"
",transfer_details"
" FROM reserve_close"
" WHERE reserve_pub=$1;",
1, NULL);
/* Used in #postgres_get_coin_transactions() to obtain payback transactions
for a coin */
PREPARE ("payback_by_coin",
@ -2444,9 +2480,9 @@ postgres_get_reserve_history (void *cls,
ret = GNUNET_OK;
PQclear (result);
}
/** #TALER_EXCHANGEDB_RO_PAYBACK_COIN */
{
struct TALER_EXCHANGEDB_Payback *payback;
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (reserve_pub),
GNUNET_PQ_query_param_end
@ -2463,6 +2499,8 @@ postgres_get_reserve_history (void *cls,
rows = PQntuples (result);
while (0 < rows)
{
struct TALER_EXCHANGEDB_Payback *payback;
payback = GNUNET_new (struct TALER_EXCHANGEDB_Payback);
{
struct GNUNET_PQ_ResultSpec rs[] = {
@ -2512,8 +2550,69 @@ postgres_get_reserve_history (void *cls,
/** #TALER_EXCHANGEDB_RO_EXCHANGE_TO_BANK */
/* TODO: #4956 */
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (reserve_pub),
GNUNET_PQ_query_param_end
};
result = GNUNET_PQ_exec_prepared (session->conn,
"close_by_reserve",
params);
if (PGRES_TUPLES_OK != PQresultStatus (result))
{
QUERY_ERR (result, session->conn);
goto cleanup;
}
rows = PQntuples (result);
while (0 < rows)
{
struct TALER_EXCHANGEDB_ClosingTransfer *closing;
closing = GNUNET_new (struct TALER_EXCHANGEDB_ClosingTransfer);
{
struct GNUNET_PQ_ResultSpec rs[] = {
TALER_PQ_result_spec_amount ("amount",
&closing->amount),
TALER_PQ_result_spec_amount ("closing_fee",
&closing->closing_fee),
GNUNET_PQ_result_spec_absolute_time ("execution_date",
&closing->execution_date),
TALER_PQ_result_spec_json ("receiver_account",
&closing->receiver_account_details),
TALER_PQ_result_spec_json ("transfer_details",
&closing->transfer_details),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
--rows))
{
GNUNET_break (0);
GNUNET_free (closing);
PQclear (result);
goto cleanup;
}
}
closing->reserve_pub = *reserve_pub;
if (NULL != rh_tail)
{
rh_tail->next = GNUNET_new (struct TALER_EXCHANGEDB_ReserveHistory);
rh_tail = rh_tail->next;
}
else
{
rh_tail = GNUNET_new (struct TALER_EXCHANGEDB_ReserveHistory);
rh = rh_tail;
}
rh_tail->type = TALER_EXCHANGEDB_RO_EXCHANGE_TO_BANK;
rh_tail->details.closing = closing;
} /* end of 'while (0 < rows)' */
PQclear (result);
}
cleanup:
if (GNUNET_SYSERR == ret)
{