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",
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
store commitments */
PREPARE ("insert_refresh_commit_link",
@ -3735,7 +3754,7 @@ postgres_get_transfer (void *cls,
/**
* 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 session database connection
@ -3778,6 +3797,11 @@ postgres_get_coin_transactions (void *cls,
deposit = GNUNET_new (struct TALER_EXCHANGEDB_Deposit);
{
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",
&deposit->coin.denom_pub.rsa_public_key),
GNUNET_PQ_result_spec_rsa_signature ("denom_sig",
@ -3835,7 +3859,7 @@ postgres_get_coin_transactions (void *cls,
PGresult *result;
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,
"get_refresh_melt_by_coin",
params);
@ -3883,6 +3907,70 @@ postgres_get_coin_transactions (void *cls,
}
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;
cleanup:
if (NULL != head)