clean up postgres_get_reserve_history logic and improve docu

This commit is contained in:
Christian Grothoff 2015-06-05 15:04:21 +02:00
parent c4f3c9be6c
commit 49fdd32337
2 changed files with 61 additions and 38 deletions

View File

@ -112,7 +112,6 @@ struct TALER_MINTDB_CollectableBlindcoin
*/
struct TALER_Amount withdraw_fee;
/**
* Public key of the reserve that was drained.
*/

View File

@ -263,12 +263,17 @@ postgres_create_tables (void *cls,
SQLEXEC_INDEX ("CREATE INDEX expiration_index"
" ON reserves_in (expiration_date);");
/* Table with the withdraw operations that have been performed on a reserve.
TODO: maybe rename to "reserves_out"? #3810
The 'h_blind_ev' is the hash of the blinded coin. It serves as a primary
key, as (broken) clients that use a non-random coin and blinding factor
should fail to even withdraw, as otherwise the coins will fail to deposit
(as they really must be unique). */
/* TODO: maybe rename to "reserves_out"? #3810
TODO: maybe add withdraw fee and amount_with_fee explicitly to table,
so we can init those fields on select? #3825
TODO: maybe add timestamp of when the operation was performed, so we
can influence the reserves' expiration_date not just based on
incoming but also based on outgoing transactions?
TODO: is h_blind_ev really a _primary key_? Is this constraint useful? */
SQLEXEC ("CREATE TABLE IF NOT EXISTS collectable_blindcoins"
incoming but also based on outgoing transactions? */
SQLEXEC ("CREATE TABLE IF NOT EXISTS collectable_blindcoins"
"(h_blind_ev BYTEA PRIMARY KEY"
",denom_pub BYTEA NOT NULL REFERENCES denominations (pub)"
",denom_sig BYTEA NOT NULL"
@ -1304,6 +1309,8 @@ postgres_get_collectable_blindcoin (void *cls,
TALER_PQ_result_spec_rsa_signature("denom_sig", &denom_sig),
TALER_PQ_result_spec_auto_from_type("reserve_sig", &collectable->reserve_sig),
TALER_PQ_result_spec_auto_from_type("reserve_pub", &collectable->reserve_pub),
/* FIXME: collectable->amount_with_fee and
collectable->withdraw_fee not initialized! (#3825) */
TALER_PQ_result_spec_end
};
@ -1312,8 +1319,10 @@ postgres_get_collectable_blindcoin (void *cls,
GNUNET_break (0);
goto cleanup;
}
/* FIXME: why do we bother with the temporary variables? */
collectable->denom_pub.rsa_public_key = denom_pub;
collectable->sig.rsa_signature = denom_sig;
collectable->h_coin_envelope = *h_blind;
ret = GNUNET_YES;
cleanup:
@ -1330,9 +1339,11 @@ postgres_get_collectable_blindcoin (void *cls,
*
* @param cls the `struct PostgresClosure` with the plugin-specific state
* @param session database connection to use
* @param h_blind hash of the blinded message
* @param h_blind hash of the blinded message. FIXME:
* redundant information given @a collectable's h_coin_envelope, right? #3825
* @param withdraw amount by which the reserve will be reduced with this
* transaction (coin value plus fee)
* transaction (coin value plus fee). FIXME:
* redundant information given @a collectable's amount_with_fee! #3825
* @param collectable corresponding collectable coin (blind signature)
* if a coin is found
* @return #GNUNET_SYSERR on internal error
@ -1355,6 +1366,7 @@ postgres_insert_collectable_blindcoin (void *cls,
TALER_PQ_query_param_rsa_signature (collectable->sig.rsa_signature),
TALER_PQ_query_param_auto_from_type (&collectable->reserve_pub),
TALER_PQ_query_param_auto_from_type (&collectable->reserve_sig),
/* FIXME: store fees? #3825 */
TALER_PQ_query_param_end
};
@ -1375,12 +1387,20 @@ postgres_insert_collectable_blindcoin (void *cls,
if (GNUNET_OK != postgres_reserve_get (cls,
session,
&reserve))
{
/* Should have been checked before we got here... */
GNUNET_break (0);
goto rollback;
}
if (GNUNET_SYSERR ==
TALER_amount_subtract (&reserve.balance,
&reserve.balance,
&withdraw))
{
/* Should have been checked before we got here... */
GNUNET_break (0);
goto rollback;
}
if (GNUNET_OK != reserves_update (cls,
session,
&reserve))
@ -1417,13 +1437,12 @@ postgres_get_reserve_history (void *cls,
{
PGresult *result;
struct TALER_MINTDB_ReserveHistory *rh;
struct TALER_MINTDB_ReserveHistory *rh_head;
struct TALER_MINTDB_ReserveHistory *rh_tail;
int rows;
int ret;
result = NULL;
rh = NULL;
rh_head = NULL;
rh_tail = NULL;
ret = GNUNET_SYSERR;
{
struct TALER_MINTDB_BankTransfer *bt;
@ -1455,6 +1474,7 @@ postgres_get_reserve_history (void *cls,
while (0 < rows)
{
bt = GNUNET_new (struct TALER_MINTDB_BankTransfer);
/* FIXME: use higher-level libtalerpq API here? */
if (GNUNET_OK != TALER_PQ_extract_amount (result,
--rows,
"balance_val",
@ -1467,22 +1487,22 @@ postgres_get_reserve_history (void *cls,
goto cleanup;
}
bt->reserve_pub = *reserve_pub;
if (NULL != rh_head)
/* FIXME: bt->wire not initialized! (#3817) */
if (NULL != rh_tail)
{
rh_head->next = GNUNET_new (struct TALER_MINTDB_ReserveHistory);
rh_head = rh_head->next;
rh_tail->next = GNUNET_new (struct TALER_MINTDB_ReserveHistory);
rh_tail = rh_tail->next;
}
else
{
rh_head = GNUNET_new (struct TALER_MINTDB_ReserveHistory);
rh = rh_head;
rh_tail = GNUNET_new (struct TALER_MINTDB_ReserveHistory);
rh = rh_tail;
}
rh_head->type = TALER_MINTDB_RO_BANK_TO_MINT;
rh_head->details.bank = bt;
rh_tail->type = TALER_MINTDB_RO_BANK_TO_MINT;
rh_tail->details.bank = bt;
}
PQclear (result);
}
PQclear (result);
result = NULL;
{
struct GNUNET_HashCode h_blind_ev;
struct TALER_ReserveSignatureP reserve_sig;
@ -1500,48 +1520,52 @@ postgres_get_reserve_history (void *cls,
if (PGRES_TUPLES_OK != PQresultStatus (result))
{
QUERY_ERR (result);
PQclear (result);
goto cleanup;
}
if (0 == (rows = PQntuples (result)))
{
ret = GNUNET_OK; /* Its OK if there are no withdrawls yet */
goto cleanup;
PQclear (result);
ret = GNUNET_OK; /* It is OK if there are no withdrawls yet */
break;
}
struct TALER_PQ_ResultSpec rs[] = {
TALER_PQ_result_spec_auto_from_type ("h_blind_ev", &h_blind_ev),
TALER_PQ_result_spec_rsa_public_key ("denom_pub", &denom_pub),
TALER_PQ_result_spec_rsa_signature ("denom_sig", &denom_sig),
TALER_PQ_result_spec_auto_from_type ("reserve_sig", &reserve_sig),
TALER_PQ_result_spec_end
};
GNUNET_assert (NULL != rh);
GNUNET_assert (NULL != rh_head);
GNUNET_assert (NULL == rh_head->next);
GNUNET_assert (NULL != rh_tail);
GNUNET_assert (NULL == rh_tail->next);
while (0 < rows)
{
struct TALER_PQ_ResultSpec rs[] = {
TALER_PQ_result_spec_auto_from_type ("h_blind_ev", &h_blind_ev),
TALER_PQ_result_spec_rsa_public_key ("denom_pub", &denom_pub),
TALER_PQ_result_spec_rsa_signature ("denom_sig", &denom_sig),
TALER_PQ_result_spec_auto_from_type ("reserve_sig", &reserve_sig),
TALER_PQ_result_spec_end
};
if (GNUNET_YES !=
TALER_PQ_extract_result (result, rs, --rows))
{
GNUNET_break (0);
PQclear (result);
goto cleanup;
}
cbc = GNUNET_new (struct TALER_MINTDB_CollectableBlindcoin);
cbc->sig.rsa_signature = denom_sig;
cbc->denom_pub.rsa_public_key = denom_pub;
cbc->h_coin_envelope = h_blind_ev;
/* FIXME: amount_with_fee and withdraw_fee not initialized! #3825 */
cbc->h_coin_envelope = h_blind_ev;
cbc->reserve_pub = *reserve_pub;
cbc->reserve_sig = reserve_sig;
rh_head->next = GNUNET_new (struct TALER_MINTDB_ReserveHistory);
rh_head = rh_head->next;
rh_head->type = TALER_MINTDB_RO_WITHDRAW_COIN;
rh_head->details.withdraw = cbc;
rh_tail->next = GNUNET_new (struct TALER_MINTDB_ReserveHistory);
rh_tail = rh_tail->next;
rh_tail->type = TALER_MINTDB_RO_WITHDRAW_COIN;
rh_tail->details.withdraw = cbc;
}
ret = GNUNET_OK;
PQclear (result);
}
ret = GNUNET_OK;
cleanup:
if (NULL != result)
PQclear (result);
if (GNUNET_SYSERR == ret)
{
common_free_reserve_history (cls,