mintdb postgres; implement get_coin_transactions (deposit)

This commit is contained in:
Sree Harsha Totakura 2015-04-10 16:22:03 +02:00
parent d7e38031a9
commit 01554ef865

View File

@ -624,6 +624,22 @@ postgres_prepare (PGconn *db_conn)
"(merchant_pub = $3)"
")",
3, NULL);
PREPARE ("get_deposit_with_coin_pub",
"SELECT "
"coin_pub,"
"denom_pub,"
"transaction_id,"
"amount_value,"
"amount_fraction,"
"amount_currency,"
"merchant_pub,"
"h_contract,"
"h_wire,"
"wire,"
"coin_sig"
" FROM deposits WHERE "
" coin_pub = $1",
1, NULL);
return GNUNET_OK;
#undef PREPARE
}
@ -2399,8 +2415,99 @@ postgres_get_coin_transactions (void *cls,
struct TALER_MINTDB_Session *session,
const union TALER_CoinSpendPublicKeyP *coin_pub)
{
PGresult *result;
struct TALER_MINTDB_TransactionList *head;
struct TALER_MINTDB_TransactionList *tl;
int nrows;
int ret;
result = NULL;
head = NULL;
tl = NULL;
nrows = 0;
ret = GNUNET_SYSERR;
/* check deposits */
{
struct TALER_MINTDB_Deposit *deposit;
struct TALER_PQ_QueryParam params[] = {
TALER_PQ_QUERY_PARAM_PTR (&coin_pub->ecdsa_pub),
TALER_PQ_QUERY_PARAM_END
};
json_error_t json_error;
char *json_wire_enc;
size_t json_wire_enc_size;
int i;
result = TALER_PQ_exec_prepared (session->conn,
"get_deposit_with_coin_pub",
params);
if (PGRES_TUPLES_OK != PQresultStatus (result))
{
QUERY_ERR (result);
goto cleanup;
}
nrows = PQntuples (result);
for (i=0; i < nrows; i++)
{
deposit = GNUNET_new (struct TALER_MINTDB_Deposit);
struct TALER_PQ_ResultSpec rs[] = {
TALER_PQ_RESULT_SPEC ("coin_pub", &deposit->coin),
TALER_PQ_RESULT_SPEC ("coin_sig", &deposit->csig),
TALER_PQ_RESULT_SPEC ("merchant_pub", &deposit->merchant_pub),
TALER_PQ_RESULT_SPEC ("h_contract", &deposit->h_contract),
TALER_PQ_RESULT_SPEC ("h_wire", &deposit->h_wire),
TALER_PQ_RESULT_SPEC_VAR ("wire", &json_wire_enc, &json_wire_enc_size),
TALER_PQ_RESULT_SPEC ("transaction_id", &deposit->transaction_id),
/** FIXME:
* TALER_PQ_RESULT_SPEC ("timestamp", &deposit->timestamp),
* TALER_PQ_RESULT_SPEC ("refund_deadline", &deposit->refund_deadline),
* TALER_PQ_RESULT_SPEC ("deposit_fee", &deposit->deposit_fee)
*/
TALER_PQ_RESULT_SPEC_END
};
if ((GNUNET_OK != TALER_PQ_extract_result (result, rs, i))
|| (GNUNET_OK != TALER_PQ_extract_amount (result,
i,
"amount_value",
"amount_fraction",
"amount_currency",
&deposit->amount_with_fee)))
{
GNUNET_break (0);
goto cleanup_deposit;
}
deposit->wire = json_loads (json_wire_enc,
JSON_REJECT_DUPLICATES,
&json_error);
if (NULL == deposit->wire)
{
TALER_json_warn (json_error);
goto cleanup_deposit;
}
GNUNET_free (json_wire_enc);
json_wire_enc = NULL;
deposit->transaction_id = GNUNET_ntohll (deposit->transaction_id);
tl = GNUNET_new (struct TALER_MINTDB_TransactionList);
tl->type = TALER_MINTDB_TT_DEPOSIT;
tl->details.deposit = deposit;
deposit = NULL;
continue;
cleanup_deposit:
GNUNET_free_non_null (json_wire_enc);
GNUNET_free_non_null (deposit);
goto cleanup;
}
}
// FIXME: check logic!
GNUNET_break (0); // FIXME: implement!
/* We need to get this information from 3 tables:
1. Deposits
2. Coins used in for refreshing
3. locked coins (locking is not implemented as of now) */
cleanup:
if (GNUNET_OK == ret)
return head;
if (NULL != head)
common_free_coin_transaction_list (cls, head);
return NULL;
}