diff options
author | Christian Grothoff <christian@grothoff.org> | 2015-01-28 22:47:03 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2015-01-28 22:47:03 +0100 |
commit | b162d2e45829469df5327ea25b2bab1ba1ebaab9 (patch) | |
tree | c815fd6a78faab0d4934048427d35e80a2c30cb7 | |
parent | fb124841605dabe843f4d5713e58a516ddc84d48 (diff) |
rollback should just return void
-rw-r--r-- | src/mint/mint_db.c | 68 | ||||
-rw-r--r-- | src/mint/mint_db.h | 6 | ||||
-rw-r--r-- | src/mint/taler-mint-httpd_db.c | 67 | ||||
-rw-r--r-- | src/mint/taler-mint-httpd_responses.c | 17 | ||||
-rw-r--r-- | src/mint/taler-mint-httpd_responses.h | 11 |
5 files changed, 90 insertions, 79 deletions
diff --git a/src/mint/mint_db.c b/src/mint/mint_db.c index b23a5b65f..5da2a5d46 100644 --- a/src/mint/mint_db.c +++ b/src/mint/mint_db.c @@ -1572,6 +1572,7 @@ static void db_conn_destroy (void *cls) { PGconn *db_conn = cls; + if (NULL != db_conn) PQfinish (db_conn); } @@ -1589,8 +1590,7 @@ TALER_MINT_DB_init (const char *connection_cfg) if (0 != pthread_key_create (&db_conn_threadlocal, &db_conn_destroy)) { - fprintf (stderr, - "Can't create pthread key.\n"); + LOG_ERROR ("Cannnot create pthread key.\n"); return GNUNET_SYSERR; } TALER_MINT_db_connection_cfg_str = GNUNET_strdup (connection_cfg); @@ -1614,16 +1614,17 @@ TALER_MINT_DB_get_connection (void) db_conn = PQconnectdb (TALER_MINT_db_connection_cfg_str); - if (CONNECTION_OK != PQstatus (db_conn)) + if (CONNECTION_OK != + PQstatus (db_conn)) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "db connection failed: %s\n", - PQerrorMessage (db_conn)); + LOG_ERROR ("Database connection failed: %s\n", + PQerrorMessage (db_conn)); GNUNET_break (0); return NULL; } - if (GNUNET_OK != TALER_MINT_DB_prepare (db_conn)) + if (GNUNET_OK != + TALER_MINT_DB_prepare (db_conn)) { GNUNET_break (0); return NULL; @@ -1649,14 +1650,15 @@ TALER_MINT_DB_transaction (PGconn *db_conn) { PGresult *result; - result = PQexec(db_conn, "BEGIN"); - if (PGRES_COMMAND_OK != PQresultStatus (result)) + result = PQexec (db_conn, + "BEGIN"); + if (PGRES_COMMAND_OK != + PQresultStatus (result)) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Can't start transaction: %s\n", - PQresultErrorMessage (result)); - PQclear (result); + LOG_ERROR ("Failed to start transaction: %s\n", + PQresultErrorMessage (result)); GNUNET_break (0); + PQclear (result); return GNUNET_SYSERR; } @@ -1671,22 +1673,16 @@ TALER_MINT_DB_transaction (PGconn *db_conn) * @param db_conn the database connection * @return #GNUNET_OK on success */ -int +void TALER_MINT_DB_rollback (PGconn *db_conn) { PGresult *result; - result = PQexec(db_conn, - "ROLLBACK"); - if (PGRES_COMMAND_OK != PQresultStatus (result)) - { - PQclear (result); - GNUNET_break (0); - return GNUNET_SYSERR; - } - + result = PQexec (db_conn, + "ROLLBACK"); + GNUNET_break (PGRES_COMMAND_OK == + PQresultStatus (result)); PQclear (result); - return GNUNET_OK; } @@ -1701,12 +1697,13 @@ TALER_MINT_DB_commit (PGconn *db_conn) { PGresult *result; - result = PQexec(db_conn, - "COMMIT"); - if (PGRES_COMMAND_OK != PQresultStatus (result)) + result = PQexec (db_conn, + "COMMIT"); + if (PGRES_COMMAND_OK != + PQresultStatus (result)) { - PQclear (result); GNUNET_break (0); + PQclear (result); return GNUNET_SYSERR; } @@ -1744,7 +1741,8 @@ TALER_MINT_DB_get_collectable_blindcoin (PGconn *db_conn, "get_collectable_blindcoins", params); - if (PGRES_TUPLES_OK != PQresultStatus (result)) + if (PGRES_TUPLES_OK != + PQresultStatus (result)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Query failed: %s\n", @@ -2038,4 +2036,16 @@ TALER_MINT_DB_get_coin_transactions (PGconn *db_conn, } +/** + * Free linked list of transactions. + * + * @param list list to free + */ +void +TALER_MINT_DB_free_coin_transaction_list (struct TALER_MINT_DB_TransactionList *list) +{ + GNUNET_break (0); +} + + /* end of mint_db.c */ diff --git a/src/mint/mint_db.h b/src/mint/mint_db.h index 01fd737bd..ff14ba1e4 100644 --- a/src/mint/mint_db.h +++ b/src/mint/mint_db.h @@ -302,6 +302,7 @@ TALER_MINT_DB_get_connection (void); /** * Start a transaction. * + * @param db_conn connection to use * @return #GNUNET_OK on success */ int @@ -311,6 +312,7 @@ TALER_MINT_DB_transaction (PGconn *db_conn); /** * Commit a transaction. * + * @param db_conn connection to use * @return #GNUNET_OK on success */ int @@ -320,9 +322,9 @@ TALER_MINT_DB_commit (PGconn *db_conn); /** * Abort/rollback a transaction. * - * @return #GNUNET_OK on success + * @param db_conn connection to use */ -int +void TALER_MINT_DB_rollback (PGconn *db_conn); diff --git a/src/mint/taler-mint-httpd_db.c b/src/mint/taler-mint-httpd_db.c index 7e9dde849..c6f0fe2cb 100644 --- a/src/mint/taler-mint-httpd_db.c +++ b/src/mint/taler-mint-httpd_db.c @@ -89,60 +89,31 @@ TALER_MINT_db_execute_deposit (struct MHD_Connection *connection, // FIXME: in the future, check if there's enough credits // left on the coin. For now: refuse // FIXME: return more information here + TALER_MINT_DB_rollback (db_conn); return TALER_MINT_reply_json_pack (connection, MHD_HTTP_FORBIDDEN, "{s:s}", - "error", - "double spending"); + "error", "insufficient funds"); } - { - struct KnownCoin known_coin; - int res; - struct TALER_CoinPublicInfo coin_info; - - res = TALER_MINT_DB_get_known_coin (db_conn, - &coin_info.coin_pub, - &known_coin); - if (GNUNET_YES == res) - { - // coin must have been refreshed - // FIXME: check - // FIXME: return more information here - return TALER_MINT_reply_json_pack (connection, - MHD_HTTP_FORBIDDEN, - "{s:s}", - "error", "coin was refreshed"); - } - if (GNUNET_SYSERR == res) - { - GNUNET_break (0); - /* FIXME: return error message to client via MHD! */ - return MHD_NO; - } - - /* coin valid but not known => insert into DB */ - known_coin.is_refreshed = GNUNET_NO; - known_coin.expended_balance = deposit->amount; - known_coin.public_info = coin_info; + TALER_MINT_DB_free_coin_transaction_list (tl); - if (GNUNET_OK != TALER_MINT_DB_insert_known_coin (db_conn, &known_coin)) - { - GNUNET_break (0); - /* FIXME: return error message to client via MHD! */ - return MHD_NO; - } + if (GNUNET_OK != + TALER_MINT_DB_insert_deposit (db_conn, + deposit)) + { + LOG_WARNING ("Failed to store /deposit information in database\n"); + TALER_MINT_DB_rollback (db_conn); + return TALER_MINT_reply_internal_db_error (connection); } - if (GNUNET_OK != TALER_MINT_DB_insert_deposit (db_conn, deposit)) + if (GNUNET_OK != + TALER_MINT_DB_commit (db_conn)) { - GNUNET_break (0); - /* FIXME: return error message to client via MHD! */ - return MHD_NO; + LOG_WARNING ("/deposit transaction commit failed\n"); + return TALER_MINT_reply_commit_error (connection); } - // FIXME: check commit return value! - TALER_MINT_DB_commit (db_conn); return TALER_MINT_reply_deposit_success (connection, &deposit->coin.coin_pub, &deposit->h_wire, @@ -673,7 +644,7 @@ TALER_MINT_db_execute_refresh_melt (struct MHD_Connection *connection, &melt_balance))) { TALER_MINT_key_state_release (key_state); - GNUNET_break (GNUNET_OK == TALER_MINT_DB_rollback (db_conn)); + TALER_MINT_DB_rollback (db_conn); return (GNUNET_SYSERR == res) ? MHD_NO : MHD_YES; } @@ -686,7 +657,7 @@ TALER_MINT_db_execute_refresh_melt (struct MHD_Connection *connection, // FIXME: also, consider fees? if (TALER_amount_cmp (melt_balance, requested_cost) < 0) { - GNUNET_break (GNUNET_OK == TALER_MINT_DB_rollback (db_conn)); + TALER_MINT_DB_rollback (db_conn); return TALER_MINT_reply_json_pack (connection, MHD_HTTP_FORBIDDEN, @@ -772,7 +743,7 @@ TALER_MINT_db_execute_refresh_commit (struct MHD_Connection *connection, { // FIXME: return 'internal error'? GNUNET_break (0); - GNUNET_break (GNUNET_OK == TALER_MINT_DB_rollback (db_conn)); + TALER_MINT_DB_rollback (db_conn); return MHD_NO; } @@ -785,7 +756,7 @@ TALER_MINT_db_execute_refresh_commit (struct MHD_Connection *connection, { // FIXME: return 'internal error'? GNUNET_break (0); - GNUNET_break (GNUNET_OK == TALER_MINT_DB_rollback (db_conn)); + TALER_MINT_DB_rollback (db_conn); return MHD_NO; } } @@ -829,7 +800,7 @@ TALER_MINT_db_execute_refresh_commit (struct MHD_Connection *connection, { // FIXME: return 'internal error'? GNUNET_break (GNUNET_SYSERR != res); - GNUNET_break (GNUNET_OK == TALER_MINT_DB_rollback (db_conn)); + TALER_MINT_DB_rollback (db_conn); return MHD_NO; } diff --git a/src/mint/taler-mint-httpd_responses.c b/src/mint/taler-mint-httpd_responses.c index 92bba9e21..307e6ec17 100644 --- a/src/mint/taler-mint-httpd_responses.c +++ b/src/mint/taler-mint-httpd_responses.c @@ -178,6 +178,23 @@ TALER_MINT_reply_internal_error (struct MHD_Connection *connection, /** + * Send a response indicating an error committing a + * transaction (concurrent interference). + * + * @param connection the MHD connection to use + * @return a MHD result code + */ +int +TALER_MINT_reply_commit_error (struct MHD_Connection *connection) +{ + return TALER_MINT_reply_json_pack (connection, + MHD_HTTP_BAD_REQUEST, + "{s:s}", + "error", "commit failure"); +} + + +/** * Send a response indicating a failure to talk to the Mint's * database. * diff --git a/src/mint/taler-mint-httpd_responses.h b/src/mint/taler-mint-httpd_responses.h index 421113eed..f8a671e18 100644 --- a/src/mint/taler-mint-httpd_responses.h +++ b/src/mint/taler-mint-httpd_responses.h @@ -113,6 +113,17 @@ TALER_MINT_reply_internal_error (struct MHD_Connection *connection, /** + * Send a response indicating an error committing a + * transaction (concurrent interference). + * + * @param connection the MHD connection to use + * @return a MHD result code + */ +int +TALER_MINT_reply_commit_error (struct MHD_Connection *connection); + + +/** * Send a response indicating a failure to talk to the Mint's * database. * |