diff options
author | Christian Grothoff <christian@grothoff.org> | 2019-11-11 20:04:13 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2019-11-11 20:04:13 +0100 |
commit | 4170ac40d66b19b73913afdbf71bdfa33ac94e2f (patch) | |
tree | beef94241480838928d395d51d54eb08554ec047 /src | |
parent | 5379d577ff6f674fcfb080425bf5a8a42dd2b1c0 (diff) |
contract can change between suspend and resume, fetch it again
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/taler-merchant-httpd_check-payment.c | 66 |
1 files changed, 34 insertions, 32 deletions
diff --git a/src/backend/taler-merchant-httpd_check-payment.c b/src/backend/taler-merchant-httpd_check-payment.c index 260f3310..31e24d31 100644 --- a/src/backend/taler-merchant-httpd_check-payment.c +++ b/src/backend/taler-merchant-httpd_check-payment.c @@ -434,41 +434,43 @@ MH_handler_check_payment (struct TMH_RequestHandler *rh, "Starting /check-payment processing with timeout %s\n", GNUNET_STRINGS_absolute_time_to_string ( cprc->sc.long_poll_timeout)); - db->preflight (db->cls); - qs = db->find_contract_terms (db->cls, - &cprc->contract_terms, - cprc->order_id, - &mi->pubkey); - if (0 > qs) - { - /* single, read-only SQL statements should never cause - serialization problems */ - GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR != qs); - /* Always report on hard error as well to enable diagnostics */ - GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs); - return TMH_RESPONSE_reply_internal_error (connection, - TALER_EC_CHECK_PAYMENT_DB_FETCH_CONTRACT_TERMS_ERROR, - "db error fetching contract terms"); - } - - if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs) - { - /* Check that we're at least aware of the order */ - return check_order_and_request_payment (cprc); - } - GNUNET_assert (NULL != cprc->contract_terms); + } + if (NULL != cprc->contract_terms) + { + json_decref (cprc->contract_terms); + cprc->contract_terms = NULL; + } + db->preflight (db->cls); + qs = db->find_contract_terms (db->cls, + &cprc->contract_terms, + cprc->order_id, + &mi->pubkey); + if (0 > qs) + { + /* single, read-only SQL statements should never cause + serialization problems */ + GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR != qs); + /* Always report on hard error as well to enable diagnostics */ + GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs); + return TMH_RESPONSE_reply_internal_error (connection, + TALER_EC_CHECK_PAYMENT_DB_FETCH_CONTRACT_TERMS_ERROR, + "db error fetching contract terms"); + } - if (GNUNET_OK != - parse_contract_terms (cprc)) - return cprc->ret; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Order `%s' matches contract %s\n", - cprc->order_id, - GNUNET_h2s (&cprc->h_contract_terms)); + if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs) + { + /* Check that we're at least aware of the order */ + return check_order_and_request_payment (cprc); } + GNUNET_assert (NULL != cprc->contract_terms); + + if (GNUNET_OK != + parse_contract_terms (cprc)) + return cprc->ret; GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Checking payment status for order `%s'\n", - cprc->order_id); + "Checkig payment status for order `%s' with contract %s\n", + cprc->order_id, + GNUNET_h2s (&cprc->h_contract_terms)); GNUNET_assert (NULL != cprc->contract_terms); /* Check if the order has been paid for. */ |