From c3916068ea8ccf7c5c26119e08ebb701a2544816 Mon Sep 17 00:00:00 2001 From: Marcello Stanisci Date: Sun, 16 Jul 2017 11:48:31 +0200 Subject: flagging proposal as paid (#5054) --- src/backend/taler-merchant-httpd_pay.c | 62 ++++++++++++++++------ .../taler-merchant-httpd_track-transaction.c | 3 +- 2 files changed, 48 insertions(+), 17 deletions(-) (limited to 'src/backend') diff --git a/src/backend/taler-merchant-httpd_pay.c b/src/backend/taler-merchant-httpd_pay.c index 2e3767be..b00f8e45 100644 --- a/src/backend/taler-merchant-httpd_pay.c +++ b/src/backend/taler-merchant-httpd_pay.c @@ -1317,6 +1317,8 @@ handler_pay_json (struct MHD_Connection *connection, { int ret; enum GNUNET_DB_QueryStatus qs; + enum GNUNET_DB_QueryStatus qs_st; + enum GNUNET_DB_QueryStatus qs_mp; ret = parse_pay (connection, root, @@ -1404,34 +1406,62 @@ handler_pay_json (struct MHD_Connection *connection, "The time to pay for this contract has expired."); } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Storing transaction '%s'\n", - GNUNET_h2s (&pc->h_contract_terms)); for (unsigned int i=0;istore_transaction (db->cls, - &pc->h_contract_terms, - &pc->mi->pubkey, - pc->chosen_exchange, - &pc->mi->h_wire, - pc->timestamp, - pc->refund_deadline, - &pc->amount); - if (GNUNET_DB_STATUS_SOFT_ERROR != qs) - break; + + if (GNUNET_OK != db->start (db->cls)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Could not start transaction to store successful payment\n"); + return TMH_RESPONSE_reply_internal_error (connection, + TALER_EC_PAY_DB_STORE_TRANSACTION_ERROR, + "Merchant database error"); + } + + qs_st = db->store_transaction (db->cls, + &pc->h_contract_terms, + &pc->mi->pubkey, + pc->chosen_exchange, + &pc->mi->h_wire, + pc->timestamp, + pc->refund_deadline, + &pc->amount); + + qs_mp = db->mark_proposal_paid (db->cls, + &pc->h_contract_terms, + &pc->mi->pubkey); + + /* Only retry if SOFT error occurred. Exit in case of OK or HARD failure */ + if ( (GNUNET_DB_STATUS_SOFT_ERROR == qs_st) && + (GNUNET_DB_STATUS_SOFT_ERROR == qs_mp) ) + { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Rolling back db transaction\n"); + db->rollback (db->cls); + } + + break; } - if (0 > qs) + + /* Break if AT LEAST one error occurred */ + if (2 != (qs_st + qs_mp)) { + db->rollback (db->cls); /* Special report if retries insufficient */ - GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR != qs); + GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR != qs_st); + GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR != qs_mp); /* Always report on hard error as well to enable diagnostics */ - GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs); + GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR != qs_st); + GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR != qs_mp); + return TMH_RESPONSE_reply_internal_error (connection, TALER_EC_PAY_DB_STORE_TRANSACTION_ERROR, "Merchant database error"); } } + db->commit (db->cls); + MHD_suspend_connection (connection); pc->suspended = GNUNET_YES; diff --git a/src/backend/taler-merchant-httpd_track-transaction.c b/src/backend/taler-merchant-httpd_track-transaction.c index 2848bc7e..d91fb575 100644 --- a/src/backend/taler-merchant-httpd_track-transaction.c +++ b/src/backend/taler-merchant-httpd_track-transaction.c @@ -812,7 +812,8 @@ handle_track_transaction_timeout (void *cls) /** * Function called with information about a transaction. - * Its duty is to fill up the "context" for the whole operation. + * Responsible to fill up the "context" for the whole + * tracking operation. * * @param cls closure * @param transaction_id of the contract -- cgit v1.2.3