summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorMarcello Stanisci <marcello.stanisci@inria.fr>2017-07-16 11:48:31 +0200
committerMarcello Stanisci <marcello.stanisci@inria.fr>2017-07-16 11:53:26 +0200
commitc3916068ea8ccf7c5c26119e08ebb701a2544816 (patch)
treec934772923eced5cef8519ea18a92de946ff3f39 /src/backend
parent4fbf3a105e22c7cbb08abb91730c3e5ca703e9d9 (diff)
downloadmerchant-c3916068ea8ccf7c5c26119e08ebb701a2544816.tar.gz
merchant-c3916068ea8ccf7c5c26119e08ebb701a2544816.tar.bz2
merchant-c3916068ea8ccf7c5c26119e08ebb701a2544816.zip
flagging proposal as paid (#5054)
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/taler-merchant-httpd_pay.c62
-rw-r--r--src/backend/taler-merchant-httpd_track-transaction.c3
2 files changed, 48 insertions, 17 deletions
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;i<MAX_RETRIES;i++)
{
- qs = 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);
- 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