add logic to return refunds with transaction history

This commit is contained in:
Christian Grothoff 2016-05-06 13:03:57 +02:00
parent a4d99f229a
commit fbbc49bdad

View File

@ -837,6 +837,25 @@ postgres_prepare (PGconn *db_conn)
" WHERE coin_pub=$1", " WHERE coin_pub=$1",
1, NULL); 1, NULL);
/* Query the 'refunds' by coin public key */
PREPARE ("get_refunds_by_coin",
"SELECT"
" merchant_pub"
",merchant_sig"
",h_contract"
",transaction_id"
",rtransaction_id"
",amount_with_fee_val"
",amount_with_fee_frac"
",amount_with_fee_curr"
",refund_fee_val "
",refund_fee_frac "
",refund_fee_curr "
" FROM refunds"
" WHERE coin_pub=$1",
1, NULL);
/* Used in #postgres_insert_refresh_commit_links() to /* Used in #postgres_insert_refresh_commit_links() to
store commitments */ store commitments */
PREPARE ("insert_refresh_commit_link", PREPARE ("insert_refresh_commit_link",
@ -3735,7 +3754,7 @@ postgres_get_transfer (void *cls,
/** /**
* Compile a list of all (historic) transactions performed * Compile a list of all (historic) transactions performed
* with the given coin (/refresh/melt and /deposit operations). * with the given coin (/refresh/melt, /deposit and /refund operations).
* *
* @param cls the `struct PostgresClosure` with the plugin-specific state * @param cls the `struct PostgresClosure` with the plugin-specific state
* @param session database connection * @param session database connection
@ -3778,6 +3797,11 @@ postgres_get_coin_transactions (void *cls,
deposit = GNUNET_new (struct TALER_EXCHANGEDB_Deposit); deposit = GNUNET_new (struct TALER_EXCHANGEDB_Deposit);
{ {
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
/* FIXME: do we care about the denom_*s? We do not keep
them for refresh/refund, and it's unclear why we'd
bother with them here. (Kept for now, once we have
the auditor done we should decide if we want to always
take these along, or always drop them.) */
GNUNET_PQ_result_spec_rsa_public_key ("denom_pub", GNUNET_PQ_result_spec_rsa_public_key ("denom_pub",
&deposit->coin.denom_pub.rsa_public_key), &deposit->coin.denom_pub.rsa_public_key),
GNUNET_PQ_result_spec_rsa_signature ("denom_sig", GNUNET_PQ_result_spec_rsa_signature ("denom_sig",
@ -3835,7 +3859,7 @@ postgres_get_coin_transactions (void *cls,
PGresult *result; PGresult *result;
struct TALER_EXCHANGEDB_TransactionList *tl; struct TALER_EXCHANGEDB_TransactionList *tl;
/* check if the melt record exists and get it */ /* check if the melt records exist and get them */
result = GNUNET_PQ_exec_prepared (session->conn, result = GNUNET_PQ_exec_prepared (session->conn,
"get_refresh_melt_by_coin", "get_refresh_melt_by_coin",
params); params);
@ -3883,6 +3907,70 @@ postgres_get_coin_transactions (void *cls,
} }
PQclear (result); PQclear (result);
} }
/* handle refunds */
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (&coin_pub->eddsa_pub),
GNUNET_PQ_query_param_end
};
int nrows;
int i;
PGresult *result;
struct TALER_EXCHANGEDB_TransactionList *tl;
/* check if a refund records exist and get them */
result = GNUNET_PQ_exec_prepared (session->conn,
"get_refunds_by_coin",
params);
if (PGRES_TUPLES_OK != PQresultStatus (result))
{
BREAK_DB_ERR (result);
PQclear (result);
goto cleanup;
}
nrows = PQntuples (result);
for (i=0;i<nrows;i++)
{
struct TALER_EXCHANGEDB_Refund *refund;
refund = GNUNET_new (struct TALER_EXCHANGEDB_Refund);
{
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_auto_from_type ("merchant_pub",
&refund->merchant_pub),
GNUNET_PQ_result_spec_auto_from_type ("merchant_sig",
&refund->merchant_sig),
GNUNET_PQ_result_spec_auto_from_type ("h_contract",
&refund->h_contract),
GNUNET_PQ_result_spec_uint64 ("transaction_id",
&refund->transaction_id),
GNUNET_PQ_result_spec_uint64 ("rtransaction_id",
&refund->rtransaction_id),
TALER_PQ_result_spec_amount ("amount_with_fee",
&refund->refund_amount),
TALER_PQ_result_spec_amount ("refund_fee",
&refund->refund_fee),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result, rs, 0))
{
GNUNET_break (0);
GNUNET_free (refund);
PQclear (result);
goto cleanup;
}
refund->coin.coin_pub = *coin_pub;
}
tl = GNUNET_new (struct TALER_EXCHANGEDB_TransactionList);
tl->next = head;
tl->type = TALER_EXCHANGEDB_TT_REFUND;
tl->details.refund = refund;
head = tl;
continue;
}
PQclear (result);
}
return head; return head;
cleanup: cleanup:
if (NULL != head) if (NULL != head)