summaryrefslogtreecommitdiff
path: root/src/mint/mint_db.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mint/mint_db.c')
-rw-r--r--src/mint/mint_db.c22
1 files changed, 21 insertions, 1 deletions
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);