rollback should just return void

This commit is contained in:
Christian Grothoff 2015-01-28 22:47:03 +01:00
parent fb12484160
commit b162d2e458
5 changed files with 90 additions and 79 deletions

View File

@ -1572,6 +1572,7 @@ static void
db_conn_destroy (void *cls) db_conn_destroy (void *cls)
{ {
PGconn *db_conn = cls; PGconn *db_conn = cls;
if (NULL != db_conn) if (NULL != db_conn)
PQfinish (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, if (0 != pthread_key_create (&db_conn_threadlocal,
&db_conn_destroy)) &db_conn_destroy))
{ {
fprintf (stderr, LOG_ERROR ("Cannnot create pthread key.\n");
"Can't create pthread key.\n");
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
TALER_MINT_db_connection_cfg_str = GNUNET_strdup (connection_cfg); 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); 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, LOG_ERROR ("Database connection failed: %s\n",
"db connection failed: %s\n", PQerrorMessage (db_conn));
PQerrorMessage (db_conn));
GNUNET_break (0); GNUNET_break (0);
return NULL; return NULL;
} }
if (GNUNET_OK != TALER_MINT_DB_prepare (db_conn)) if (GNUNET_OK !=
TALER_MINT_DB_prepare (db_conn))
{ {
GNUNET_break (0); GNUNET_break (0);
return NULL; return NULL;
@ -1649,14 +1650,15 @@ TALER_MINT_DB_transaction (PGconn *db_conn)
{ {
PGresult *result; PGresult *result;
result = PQexec(db_conn, "BEGIN"); result = PQexec (db_conn,
if (PGRES_COMMAND_OK != PQresultStatus (result)) "BEGIN");
if (PGRES_COMMAND_OK !=
PQresultStatus (result))
{ {
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, LOG_ERROR ("Failed to start transaction: %s\n",
"Can't start transaction: %s\n", PQresultErrorMessage (result));
PQresultErrorMessage (result));
PQclear (result);
GNUNET_break (0); GNUNET_break (0);
PQclear (result);
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
@ -1671,22 +1673,16 @@ TALER_MINT_DB_transaction (PGconn *db_conn)
* @param db_conn the database connection * @param db_conn the database connection
* @return #GNUNET_OK on success * @return #GNUNET_OK on success
*/ */
int void
TALER_MINT_DB_rollback (PGconn *db_conn) TALER_MINT_DB_rollback (PGconn *db_conn)
{ {
PGresult *result; PGresult *result;
result = PQexec(db_conn, result = PQexec (db_conn,
"ROLLBACK"); "ROLLBACK");
if (PGRES_COMMAND_OK != PQresultStatus (result)) GNUNET_break (PGRES_COMMAND_OK ==
{ PQresultStatus (result));
PQclear (result);
GNUNET_break (0);
return GNUNET_SYSERR;
}
PQclear (result); PQclear (result);
return GNUNET_OK;
} }
@ -1701,12 +1697,13 @@ TALER_MINT_DB_commit (PGconn *db_conn)
{ {
PGresult *result; PGresult *result;
result = PQexec(db_conn, result = PQexec (db_conn,
"COMMIT"); "COMMIT");
if (PGRES_COMMAND_OK != PQresultStatus (result)) if (PGRES_COMMAND_OK !=
PQresultStatus (result))
{ {
PQclear (result);
GNUNET_break (0); GNUNET_break (0);
PQclear (result);
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
@ -1744,7 +1741,8 @@ TALER_MINT_DB_get_collectable_blindcoin (PGconn *db_conn,
"get_collectable_blindcoins", "get_collectable_blindcoins",
params); params);
if (PGRES_TUPLES_OK != PQresultStatus (result)) if (PGRES_TUPLES_OK !=
PQresultStatus (result))
{ {
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Query failed: %s\n", "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 */ /* end of mint_db.c */

View File

@ -302,6 +302,7 @@ TALER_MINT_DB_get_connection (void);
/** /**
* Start a transaction. * Start a transaction.
* *
* @param db_conn connection to use
* @return #GNUNET_OK on success * @return #GNUNET_OK on success
*/ */
int int
@ -311,6 +312,7 @@ TALER_MINT_DB_transaction (PGconn *db_conn);
/** /**
* Commit a transaction. * Commit a transaction.
* *
* @param db_conn connection to use
* @return #GNUNET_OK on success * @return #GNUNET_OK on success
*/ */
int int
@ -320,9 +322,9 @@ TALER_MINT_DB_commit (PGconn *db_conn);
/** /**
* Abort/rollback a transaction. * Abort/rollback a transaction.
* *
* @return #GNUNET_OK on success * @param db_conn connection to use
*/ */
int void
TALER_MINT_DB_rollback (PGconn *db_conn); TALER_MINT_DB_rollback (PGconn *db_conn);

View File

@ -89,60 +89,31 @@ TALER_MINT_db_execute_deposit (struct MHD_Connection *connection,
// FIXME: in the future, check if there's enough credits // FIXME: in the future, check if there's enough credits
// left on the coin. For now: refuse // left on the coin. For now: refuse
// FIXME: return more information here // FIXME: return more information here
TALER_MINT_DB_rollback (db_conn);
return TALER_MINT_reply_json_pack (connection, return TALER_MINT_reply_json_pack (connection,
MHD_HTTP_FORBIDDEN, MHD_HTTP_FORBIDDEN,
"{s:s}", "{s:s}",
"error", "error", "insufficient funds");
"double spending");
} }
TALER_MINT_DB_free_coin_transaction_list (tl);
if (GNUNET_OK !=
TALER_MINT_DB_insert_deposit (db_conn,
deposit))
{ {
struct KnownCoin known_coin; LOG_WARNING ("Failed to store /deposit information in database\n");
int res; TALER_MINT_DB_rollback (db_conn);
struct TALER_CoinPublicInfo coin_info; return TALER_MINT_reply_internal_db_error (connection);
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;
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)) if (GNUNET_OK !=
TALER_MINT_DB_commit (db_conn))
{ {
GNUNET_break (0); LOG_WARNING ("/deposit transaction commit failed\n");
/* FIXME: return error message to client via MHD! */ return TALER_MINT_reply_commit_error (connection);
return MHD_NO;
} }
// FIXME: check commit return value!
TALER_MINT_DB_commit (db_conn);
return TALER_MINT_reply_deposit_success (connection, return TALER_MINT_reply_deposit_success (connection,
&deposit->coin.coin_pub, &deposit->coin.coin_pub,
&deposit->h_wire, &deposit->h_wire,
@ -673,7 +644,7 @@ TALER_MINT_db_execute_refresh_melt (struct MHD_Connection *connection,
&melt_balance))) &melt_balance)))
{ {
TALER_MINT_key_state_release (key_state); 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; 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? // FIXME: also, consider fees?
if (TALER_amount_cmp (melt_balance, requested_cost) < 0) 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, return TALER_MINT_reply_json_pack (connection,
MHD_HTTP_FORBIDDEN, MHD_HTTP_FORBIDDEN,
@ -772,7 +743,7 @@ TALER_MINT_db_execute_refresh_commit (struct MHD_Connection *connection,
{ {
// FIXME: return 'internal error'? // FIXME: return 'internal error'?
GNUNET_break (0); GNUNET_break (0);
GNUNET_break (GNUNET_OK == TALER_MINT_DB_rollback (db_conn)); TALER_MINT_DB_rollback (db_conn);
return MHD_NO; return MHD_NO;
} }
@ -785,7 +756,7 @@ TALER_MINT_db_execute_refresh_commit (struct MHD_Connection *connection,
{ {
// FIXME: return 'internal error'? // FIXME: return 'internal error'?
GNUNET_break (0); GNUNET_break (0);
GNUNET_break (GNUNET_OK == TALER_MINT_DB_rollback (db_conn)); TALER_MINT_DB_rollback (db_conn);
return MHD_NO; return MHD_NO;
} }
} }
@ -829,7 +800,7 @@ TALER_MINT_db_execute_refresh_commit (struct MHD_Connection *connection,
{ {
// FIXME: return 'internal error'? // FIXME: return 'internal error'?
GNUNET_break (GNUNET_SYSERR != res); GNUNET_break (GNUNET_SYSERR != res);
GNUNET_break (GNUNET_OK == TALER_MINT_DB_rollback (db_conn)); TALER_MINT_DB_rollback (db_conn);
return MHD_NO; return MHD_NO;
} }

View File

@ -177,6 +177,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 * Send a response indicating a failure to talk to the Mint's
* database. * database.

View File

@ -112,6 +112,17 @@ TALER_MINT_reply_internal_error (struct MHD_Connection *connection,
const char *hint); const char *hint);
/**
* 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 * Send a response indicating a failure to talk to the Mint's
* database. * database.