summaryrefslogtreecommitdiff
path: root/src/backenddb
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2020-05-31 17:42:39 +0200
committerChristian Grothoff <christian@grothoff.org>2020-05-31 17:42:39 +0200
commit4089ebeec60159c438c0da04115f416d314713ef (patch)
tree027747e9923e64f5e22256d2ca1fb308dc715eaf /src/backenddb
parent48ea83ffb0b7f8f57649e66352c8962efaaeb0b7 (diff)
downloadmerchant-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.c53
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"