summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/exchangedb/plugin_exchangedb_postgres.c7
-rw-r--r--src/exchangedb/test_exchangedb.c72
2 files changed, 77 insertions, 2 deletions
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c
index 0faf126e..93a8c1a8 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -1100,6 +1100,7 @@ postgres_prepare (PGconn *db_conn)
",denom.fee_deposit_curr"
",timestamp"
",refund_deadline"
+ ",wire_deadline"
",merchant_pub"
",h_contract_terms"
",h_wire"
@@ -1313,8 +1314,8 @@ postgres_prepare (PGconn *db_conn)
",tiny"
",done"
" FROM deposits"
- " WHERE wire_deadline <= $1"
- " AND wire_deadline > $2"
+ " WHERE wire_deadline >= $1"
+ " AND wire_deadline < $2"
" AND NOT (EXISTS (SELECT 1"
" FROM refunds"
" WHERE (refunds.coin_pub = deposits.coin_pub))"
@@ -3833,6 +3834,8 @@ add_coin_deposit (void *cls,
&deposit->timestamp),
GNUNET_PQ_result_spec_absolute_time ("refund_deadline",
&deposit->refund_deadline),
+ GNUNET_PQ_result_spec_absolute_time ("wire_deadline",
+ &deposit->wire_deadline),
GNUNET_PQ_result_spec_auto_from_type ("merchant_pub",
&deposit->merchant_pub),
GNUNET_PQ_result_spec_auto_from_type ("h_contract_terms",
diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c
index 537f33c9..f04eaf12 100644
--- a/src/exchangedb/test_exchangedb.c
+++ b/src/exchangedb/test_exchangedb.c
@@ -1417,6 +1417,57 @@ payback_cb (void *cls,
/**
+ * Function called on deposits that are past their due date
+ * and have not yet seen a wire transfer.
+ *
+ * @param cls closure a `struct TALER_EXCHANGEDB_Deposit *`
+ * @param rowid deposit table row of the coin's deposit
+ * @param coin_pub public key of the coin
+ * @param amount value of the deposit, including fee
+ * @param wire where should the funds be wired
+ * @param deadline what was the requested wire transfer deadline
+ * @param tiny did the exchange defer this transfer because it is too small?
+ * @param done did the exchange claim that it made a transfer?
+ */
+static void
+wire_missing_cb (void *cls,
+ uint64_t rowid,
+ const struct TALER_CoinSpendPublicKeyP *coin_pub,
+ const struct TALER_Amount *amount,
+ const json_t *wire,
+ struct GNUNET_TIME_Absolute deadline,
+ /* bool? */ int tiny,
+ /* bool? */ int done)
+{
+ struct TALER_EXCHANGEDB_Deposit *deposit = cls;
+ struct GNUNET_HashCode h_wire;
+
+ if (NULL != wire)
+ GNUNET_assert (GNUNET_OK ==
+ TALER_JSON_hash (wire,
+ &h_wire));
+ else
+ memset (&h_wire,
+ 0,
+ sizeof (h_wire));
+ if ( (GNUNET_NO != tiny) ||
+ (GNUNET_NO != done) ||
+ (0 != TALER_amount_cmp (amount,
+ &deposit->amount_with_fee)) ||
+ (0 != memcmp (coin_pub,
+ &deposit->coin.coin_pub,
+ sizeof (struct TALER_CoinSpendPublicKeyP))) ||
+ (0 != memcmp (&h_wire,
+ &deposit->h_wire,
+ sizeof (struct GNUNET_HashCode))) )
+ {
+ GNUNET_break (0);
+ result = 66;
+ }
+}
+
+
+/**
* Main function that will be run by the scheduler.
*
* @param cls closure with config
@@ -1646,6 +1697,7 @@ run (void *cls)
deposit.coin.denom_pub = dkp->pub;
deposit.coin.denom_sig = cbc.sig;
deadline = GNUNET_TIME_absolute_get ();
+ (void) GNUNET_TIME_round_abs (&deadline);
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
plugin->insert_payback_request (plugin->cls,
session,
@@ -1788,6 +1840,9 @@ run (void *cls)
deposit.receiver_wire_account = wire;
deposit.amount_with_fee = value;
deposit.deposit_fee = fee_deposit;
+
+ deposit.refund_deadline = deadline;
+ deposit.wire_deadline = deadline;
result = 8;
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
plugin->insert_deposit (plugin->cls,
@@ -1797,6 +1852,23 @@ run (void *cls)
plugin->have_deposit (plugin->cls,
session,
&deposit));
+ {
+ struct GNUNET_TIME_Absolute start_range;
+ struct GNUNET_TIME_Absolute end_range;
+
+ start_range = GNUNET_TIME_absolute_subtract (deadline,
+ GNUNET_TIME_UNIT_SECONDS);
+ end_range = GNUNET_TIME_absolute_add (deadline,
+ GNUNET_TIME_UNIT_SECONDS);
+ FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
+ plugin->select_deposits_missing_wire (plugin->cls,
+ session,
+ start_range,
+ end_range,
+ &wire_missing_cb,
+ &deposit));
+ FAILIF (8 != result);
+ }
auditor_row_cnt = 0;
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
plugin->select_deposits_above_serial_id (plugin->cls,