diff --git a/src/mint/mint_db.c b/src/mint/mint_db.c index 6ed7193e3..250acf547 100644 --- a/src/mint/mint_db.c +++ b/src/mint/mint_db.c @@ -1030,6 +1030,8 @@ TALER_MINT_DB_get_collectable_blindcoin (PGconn *db_conn, * * @param db_conn database connection to use * @param h_blind hash of the blinded message + * @param withdraw amount by which the reserve will be withdrawn with this + * transaction * @param collectable corresponding collectable coin (blind signature) * if a coin is found * @return #GNUNET_SYSERR on internal error @@ -1039,9 +1041,11 @@ TALER_MINT_DB_get_collectable_blindcoin (PGconn *db_conn, int TALER_MINT_DB_insert_collectable_blindcoin (PGconn *db_conn, const struct GNUNET_HashCode *h_blind, + struct TALER_Amount withdraw, const struct CollectableBlindcoin *collectable) { PGresult *result; + struct Reserve reserve; char *denom_pub_enc = NULL; char *denom_sig_enc = NULL; size_t denom_pub_enc_size; @@ -1063,16 +1067,32 @@ TALER_MINT_DB_insert_collectable_blindcoin (PGconn *db_conn, TALER_DB_QUERY_PARAM_PTR (&collectable->reserve_sig), TALER_DB_QUERY_PARAM_END }; + if (GNUNET_OK != TALER_MINT_DB_transaction (db_conn)) + goto cleanup; result = TALER_DB_exec_prepared (db_conn, "insert_collectable_blindcoin", params); if (PGRES_COMMAND_OK != PQresultStatus (result)) { QUERY_ERR (result); + goto rollback; + } + reserve.pub = (struct GNUNET_CRYPTO_EddsaPublicKey *) + &collectable->reserve_pub; + if (GNUNET_OK != TALER_MINT_DB_reserve_get (db_conn, + &reserve)) + goto rollback; + reserve.balance = TALER_amount_subtract (reserve.balance, withdraw); + if (GNUNET_OK != reserves_update (db_conn, &reserve)) + goto rollback; + if (GNUNET_OK == TALER_MINT_DB_commit (db_conn)) + { + ret = GNUNET_OK; goto cleanup; } - ret = GNUNET_OK; + rollback: + TALER_MINT_DB_rollback(db_conn); cleanup: PQclear (result); GNUNET_free_non_null (denom_pub_enc); diff --git a/src/mint/mint_db.h b/src/mint/mint_db.h index 4a9ec1524..cec243c99 100644 --- a/src/mint/mint_db.h +++ b/src/mint/mint_db.h @@ -252,6 +252,8 @@ TALER_MINT_DB_get_collectable_blindcoin (PGconn *db_conn, * * @param db_conn database connection to use * @param h_blind hash of the blinded message + * @param withdraw amount by which the reserve will be withdrawn with this + * transaction * @param collectable corresponding collectable coin (blind signature) * if a coin is found * @return #GNUNET_SYSERR on internal error @@ -261,6 +263,7 @@ TALER_MINT_DB_get_collectable_blindcoin (PGconn *db_conn, int TALER_MINT_DB_insert_collectable_blindcoin (PGconn *db_conn, const struct GNUNET_HashCode *h_blind, + struct TALER_Amount withdraw, const struct CollectableBlindcoin *collectable); diff --git a/src/mint/taler-mint-httpd_db.c b/src/mint/taler-mint-httpd_db.c index df68b6570..c5c121d58 100644 --- a/src/mint/taler-mint-httpd_db.c +++ b/src/mint/taler-mint-httpd_db.c @@ -386,6 +386,7 @@ TALER_MINT_db_execute_withdraw_sign (struct MHD_Connection *connection, if (GNUNET_OK != TALER_MINT_DB_insert_collectable_blindcoin (db_conn, &h_blind, + amount_required, &collectable)) { GNUNET_break (0); diff --git a/src/mint/test_mint_db.c b/src/mint/test_mint_db.c index 010416138..6a55a1d35 100644 --- a/src/mint/test_mint_db.c +++ b/src/mint/test_mint_db.c @@ -194,9 +194,18 @@ run (void *cls, char *const *args, const char *cfgfile, cbc.denom_pub = dkp->pub; cbc.sig = GNUNET_CRYPTO_rsa_sign (dkp->priv, &h_blind, sizeof (h_blind)); (void) memcpy (&cbc.reserve_pub, &reserve_pub, sizeof (reserve_pub)); + amount.value--; + amount.fraction--; FAILIF (GNUNET_OK != TALER_MINT_DB_insert_collectable_blindcoin (db, &h_blind, + amount, &cbc)); + FAILIF (GNUNET_OK != check_reserve (db, + &reserve_pub, + amount.value, + amount.fraction, + amount.currency, + expiry.abs_value_us)); FAILIF (GNUNET_YES != TALER_MINT_DB_get_collectable_blindcoin (db, &h_blind, &cbc2));