aboutsummaryrefslogtreecommitdiff
path: root/src/mint
diff options
context:
space:
mode:
Diffstat (limited to 'src/mint')
-rw-r--r--src/mint/mint_db.c22
-rw-r--r--src/mint/mint_db.h3
-rw-r--r--src/mint/taler-mint-httpd_db.c1
-rw-r--r--src/mint/test_mint_db.c9
4 files changed, 34 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);
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));