diff options
author | Christian Grothoff <christian@grothoff.org> | 2020-05-31 17:42:39 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2020-05-31 17:42:39 +0200 |
commit | 4089ebeec60159c438c0da04115f416d314713ef (patch) | |
tree | 027747e9923e64f5e22256d2ca1fb308dc715eaf /src/backenddb | |
parent | 48ea83ffb0b7f8f57649e66352c8962efaaeb0b7 (diff) | |
download | merchant-4089ebeec60159c438c0da04115f416d314713ef.tar.gz merchant-4089ebeec60159c438c0da04115f416d314713ef.tar.bz2 merchant-4089ebeec60159c438c0da04115f416d314713ef.zip |
address DB fixes for missing EC values
Diffstat (limited to 'src/backenddb')
-rw-r--r-- | src/backenddb/plugin_merchantdb_postgres.c | 53 |
1 files changed, 33 insertions, 20 deletions
diff --git a/src/backenddb/plugin_merchantdb_postgres.c b/src/backenddb/plugin_merchantdb_postgres.c index 44fbe3d8..690f484d 100644 --- a/src/backenddb/plugin_merchantdb_postgres.c +++ b/src/backenddb/plugin_merchantdb_postgres.c @@ -4285,7 +4285,7 @@ lookup_reserve_for_tip_cb (void *cls, i)) { GNUNET_break (0); - lac->ec = GNUNET_DB_STATUS_HARD_ERROR; // FIXME + lac->ec = TALER_EC_TIP_LOOKUP_RESERVE_DB_FAILURE; return; } if (0 > @@ -4300,9 +4300,11 @@ lookup_reserve_for_tip_cb (void *cls, TALER_amount_cmp (&remaining, &lac->required_amount)) continue; /* insufficient balance */ - if ( (expiration.abs_value_us > lac->expiration.abs_value_us) && - (GNUNET_TIME_absolute_get_remaining (lac->expiration).rel_value_us > - MIN_EXPIRATION.rel_value_us) ) + if ( (lac->expiration.abs_value_us != + GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us) && + ( (expiration.abs_value_us > lac->expiration.abs_value_us) && + (GNUNET_TIME_absolute_get_remaining (lac->expiration).rel_value_us > + MIN_EXPIRATION.rel_value_us) ) ) continue; lac->expiration = expiration; lac->reserve_pub = reserve_pub; @@ -4325,10 +4327,14 @@ lookup_reserve_for_tip_cb (void *cls, * @param[out] expiration set to when the tip expires * @return transaction status, * #TALER_EC_TIP_AUTHORIZE_RESERVE_EXPIRED if the reserve is known but has expired - * #TALER_EC_TIP_AUTHORIZE_RESERVE_UNKNOWN if the reserve is not known + * #TALER_EC_TIP_AUTHORIZE_RESERVE_NOT_FOUND if the reserve is not known * #TALER_EC_TIP_AUTHORIZE_INSUFFICIENT_FUNDS if the reserve has insufficient funds left - * #TALER_EC_TIP_AUTHORIZE_DB_HARD_ERROR on hard DB errors - * #TALER_EC_TIP_AUTHORIZE_DB_SOFT_ERROR on soft DB errors (client should retry) + * #TALER_EC_TIP_AUTHORIZE_DB_START_FAILURE on hard DB errors + * #TALER_EC_TIP_AUTHORIZE_DB_LOOKUP_RESERVE_FAILURE on hard DB errors + * #TALER_EC_TIP_AUTHORIZE_DB_UPDATE_RESERVE_FAILURE on hard DB errors + * #TALER_EC_TIP_AUTHORIZE_DB_RESERVE_INVARIANT_FAILURE on hard DB errors + * #TALER_EC_TIP_AUTHORIZE_DB_START_FAILURE on hard DB errors + * #TALER_EC_TIP_AUTHORIZE_DB_SERIALIZATION_FAILURE on soft DB errors (client should retry) * #TALER_EC_NONE upon success */ static enum TALER_ErrorCode @@ -4357,22 +4363,25 @@ postgres_authorize_tip (void *cls, RETRY: reserve_pubp = reserve_pub; if (MAX_RETRIES < ++retries) - return GNUNET_DB_STATUS_SOFT_ERROR; // FIXME: wrong EC! + { + GNUNET_break (0); + return TALER_EC_TIP_AUTHORIZE_DB_SERIALIZATION_FAILURE; + } if (GNUNET_OK != postgres_start (pg, "enable tip reserve")) { GNUNET_break (0); - return GNUNET_DB_STATUS_HARD_ERROR; // FIXME: wrong EC! + return TALER_EC_TIP_AUTHORIZE_DB_START_FAILURE; } if (NULL == reserve_pubp) { struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_string (instance_id), - GNUNET_PQ_query_param_absolute_time (expiration), TALER_PQ_query_param_amount (amount), GNUNET_PQ_query_param_end }; + qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, "lookup_reserve_for_tip", params, @@ -4387,13 +4396,18 @@ RETRY: { GNUNET_break (0); postgres_rollback (pg); - return GNUNET_DB_STATUS_HARD_ERROR; // FIXME: wrong EC! + return TALER_EC_TIP_AUTHORIZE_DB_LOOKUP_RESERVE_FAILURE; } if (GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us == lac.expiration.abs_value_us) { postgres_rollback (pg); - return 0; // FIXME: EC for 'no reserve available!' + return TALER_EC_TIP_AUTHORIZE_DB_RESERVE_NOT_FOUND; + } + if (0 == GNUNET_TIME_absolute_get_remaining (lac.expiration).rel_value_us) + { + postgres_rollback (pg); + return TALER_EC_TIP_AUTHORIZE_DB_RESERVE_EXPIRED; } reserve_pubp = &lac.reserve_pub; } @@ -4427,7 +4441,7 @@ RETRY: { GNUNET_break (0); postgres_rollback (pg); - return GNUNET_DB_STATUS_HARD_ERROR; // FIXME: ec! + return TALER_EC_TIP_AUTHORIZE_DB_LOOKUP_RESERVE_FAILURE; } } { @@ -4440,14 +4454,14 @@ RETRY: { GNUNET_break (0); postgres_rollback (pg); - return GNUNET_DB_STATUS_HARD_ERROR; // FIXME: EC: invariant failure! + return TALER_EC_TIP_AUTHORIZE_DB_RESERVE_INVARIANT_FAILURE; } if (0 < TALER_amount_cmp (&remaining, amount)) { postgres_rollback (pg); - return GNUNET_DB_STATUS_HARD_ERROR; // FIXME: EC: insufficient funds! + return TALER_EC_TIP_AUTHORIZE_INSUFFICIENT_FUNDS; } } GNUNET_assert (0 <= @@ -4474,7 +4488,7 @@ RETRY: { GNUNET_break (0); postgres_rollback (pg); - return GNUNET_DB_STATUS_HARD_ERROR; // FIXME: ec! + return TALER_EC_TIP_AUTHORIZE_DB_UPDATE_RESERVE_FAILURE; } } GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_NONCE, @@ -4503,7 +4517,7 @@ RETRY: { GNUNET_break (0); postgres_rollback (pg); - return GNUNET_DB_STATUS_HARD_ERROR; // FIXME: ec! + return TALER_EC_TIP_AUTHORIZE_DB_UPDATE_RESERVE_FAILURE; } } qs = postgres_commit (pg); @@ -4513,7 +4527,7 @@ RETRY: { GNUNET_break (0); postgres_rollback (pg); - return GNUNET_DB_STATUS_HARD_ERROR; // FIXME: ec! + return TALER_EC_TIP_AUTHORIZE_DB_UPDATE_RESERVE_FAILURE; } return TALER_EC_NONE; } @@ -6930,8 +6944,7 @@ libtaler_plugin_merchantdb_postgres_init (void *cls) ",tips_committed_val" ",tips_committed_frac" " FROM merchant_tip_reserves" - " WHERE expiration < $2 " - " AND exchange_initial_balance_val - tips_committed_val >= $3" + " WHERE exchange_initial_balance_val - tips_committed_val >= $2" " AND merchant_serial =" " (SELECT merchant_serial" " FROM merchant_instances" |