summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2015-03-18 18:55:46 +0100
committerChristian Grothoff <christian@grothoff.org>2015-03-18 18:55:46 +0100
commit1f3f4ed8dd292f1aad0b2ca59dc9c669cafb19e4 (patch)
tree750a704ecb35d02da78999f7a8afb3a7c34b3cd0
parent23bf1eee74bed73cf98264c247ab44df8dadfcd9 (diff)
parente6b13123d78c7da4fdcb2cf0e7eb5fafe1f62975 (diff)
downloadexchange-1f3f4ed8dd292f1aad0b2ca59dc9c669cafb19e4.tar.gz
exchange-1f3f4ed8dd292f1aad0b2ca59dc9c669cafb19e4.tar.bz2
exchange-1f3f4ed8dd292f1aad0b2ca59dc9c669cafb19e4.zip
Merge branch 'master' of git+ssh://taler.net/var/git/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 545a5252..556d32af 100644
--- a/src/mint/mint_db.c
+++ b/src/mint/mint_db.c
@@ -1040,6 +1040,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
@@ -1049,9 +1051,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;
@@ -1073,16 +1077,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 9312f548..d11ee8fe 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 05c2a48a..df525eec 100644
--- a/src/mint/taler-mint-httpd_db.c
+++ b/src/mint/taler-mint-httpd_db.c
@@ -422,6 +422,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 01041613..6a55a1d3 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));