add exchangedb function for #4961
This commit is contained in:
parent
4a84520514
commit
272f1135fc
@ -1300,6 +1300,29 @@ postgres_prepare (PGconn *db_conn)
|
||||
" ORDER BY prewire_uuid ASC"
|
||||
" LIMIT 1;",
|
||||
0),
|
||||
/* Used in #postgres_select_deposits_missing_wire */
|
||||
GNUNET_PQ_make_prepare ("deposits_get_overdue",
|
||||
"SELECT"
|
||||
" deposit_serial_id"
|
||||
",coin_pub"
|
||||
",amount_with_fee_val"
|
||||
",amount_with_fee_frac"
|
||||
",amount_with_fee_curr"
|
||||
",wire"
|
||||
",wire_deadline"
|
||||
",tiny"
|
||||
",done"
|
||||
" FROM deposits"
|
||||
" WHERE wire_deadline <= $1"
|
||||
" AND wire_deadline > $2"
|
||||
" AND NOT (EXISTS (SELECT 1"
|
||||
" FROM refunds"
|
||||
" WHERE (refunds.coin_pub = deposits.coin_pub))"
|
||||
" OR EXISTS (SELECT 1"
|
||||
" FROM aggregation_tracking"
|
||||
" WHERE (aggregation_tracking.deposit_serial_id = deposits.deposit_serial_id)))"
|
||||
" ORDER BY wire_deadline ASC",
|
||||
2),
|
||||
/* Used in #postgres_gc() */
|
||||
GNUNET_PQ_make_prepare ("gc_prewire",
|
||||
"DELETE"
|
||||
@ -6216,6 +6239,135 @@ postgres_get_denomination_revocation (void *cls,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Closure for #missing_wire_cb().
|
||||
*/
|
||||
struct MissingWireContext
|
||||
{
|
||||
/**
|
||||
* Function to call per result.
|
||||
*/
|
||||
TALER_EXCHANGEDB_WireMissingCallback cb;
|
||||
|
||||
/**
|
||||
* Closure for @e cb.
|
||||
*/
|
||||
void *cb_cls;
|
||||
|
||||
/**
|
||||
* Set to #GNUNET_SYSERR on error.
|
||||
*/
|
||||
int status;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Invoke the callback for each result.
|
||||
*
|
||||
* @param cls a `struct MissingWireContext *`
|
||||
* @param result SQL result
|
||||
* @param num_results number of rows in @a result
|
||||
*/
|
||||
static void
|
||||
missing_wire_cb (void *cls,
|
||||
PGresult *result,
|
||||
unsigned int num_results)
|
||||
{
|
||||
struct MissingWireContext *mwc = cls;
|
||||
|
||||
while (0 < num_results)
|
||||
{
|
||||
uint64_t rowid;
|
||||
struct TALER_CoinSpendPublicKeyP coin_pub;
|
||||
struct TALER_Amount amount;
|
||||
json_t *wire;
|
||||
struct GNUNET_TIME_Absolute deadline;
|
||||
/* bool? */ uint32_t tiny;
|
||||
/* bool? */ uint32_t done;
|
||||
struct GNUNET_PQ_ResultSpec rs[] = {
|
||||
GNUNET_PQ_result_spec_uint64 ("deposit_serial_id",
|
||||
&rowid),
|
||||
GNUNET_PQ_result_spec_auto_from_type ("coin_pub",
|
||||
&coin_pub),
|
||||
TALER_PQ_result_spec_amount ("amount_with_fee",
|
||||
&amount),
|
||||
TALER_PQ_result_spec_json ("wire",
|
||||
&wire),
|
||||
GNUNET_PQ_result_spec_absolute_time ("wire_deadline",
|
||||
&deadline),
|
||||
GNUNET_PQ_result_spec_uint32 ("tiny",
|
||||
&tiny),
|
||||
GNUNET_PQ_result_spec_uint32 ("done",
|
||||
&done),
|
||||
GNUNET_PQ_result_spec_end
|
||||
};
|
||||
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_PQ_extract_result (result,
|
||||
rs,
|
||||
--num_results))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
mwc->status = GNUNET_SYSERR;
|
||||
return;
|
||||
}
|
||||
mwc->cb (mwc->cb_cls,
|
||||
rowid,
|
||||
&coin_pub,
|
||||
&amount,
|
||||
wire,
|
||||
deadline,
|
||||
tiny,
|
||||
done);
|
||||
GNUNET_PQ_cleanup_result (rs);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Select all of those deposits in the database for which we do
|
||||
* not have a wire transfer (or a refund) and which should have
|
||||
* been deposited between @a start_date and @a end_date.
|
||||
*
|
||||
* @param cls closure
|
||||
* @param session a session
|
||||
* @param start_date lower bound on the requested wire execution date
|
||||
* @param end_date upper bound on the requested wire execution date
|
||||
* @param cb function to call on all such deposits
|
||||
* @param cb_cls closure for @a cb
|
||||
* @return transaction status code
|
||||
*/
|
||||
static enum GNUNET_DB_QueryStatus
|
||||
postgres_select_deposits_missing_wire (void *cls,
|
||||
struct TALER_EXCHANGEDB_Session *session,
|
||||
struct GNUNET_TIME_Absolute start_date,
|
||||
struct GNUNET_TIME_Absolute end_date,
|
||||
TALER_EXCHANGEDB_WireMissingCallback cb,
|
||||
void *cb_cls)
|
||||
{
|
||||
struct GNUNET_PQ_QueryParam params[] = {
|
||||
GNUNET_PQ_query_param_absolute_time (&start_date),
|
||||
GNUNET_PQ_query_param_absolute_time (&end_date),
|
||||
GNUNET_PQ_query_param_end
|
||||
};
|
||||
struct MissingWireContext mwc = {
|
||||
.cb = cb,
|
||||
.cb_cls = cb_cls,
|
||||
.status = GNUNET_OK
|
||||
};
|
||||
enum GNUNET_DB_QueryStatus qs;
|
||||
|
||||
qs = GNUNET_PQ_eval_prepared_multi_select (session->conn,
|
||||
"deposits_get_overdue",
|
||||
params,
|
||||
&missing_wire_cb,
|
||||
&mwc);
|
||||
if (GNUNET_OK != mwc.status)
|
||||
return GNUNET_DB_STATUS_HARD_ERROR;
|
||||
return qs;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialize Postgres database subsystem.
|
||||
*
|
||||
@ -6337,6 +6489,7 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)
|
||||
plugin->get_reserve_by_h_blind = &postgres_get_reserve_by_h_blind;
|
||||
plugin->insert_denomination_revocation = &postgres_insert_denomination_revocation;
|
||||
plugin->get_denomination_revocation = &postgres_get_denomination_revocation;
|
||||
plugin->select_deposits_missing_wire = &postgres_select_deposits_missing_wire;
|
||||
return plugin;
|
||||
}
|
||||
|
||||
|
@ -1041,6 +1041,30 @@ typedef void
|
||||
const struct TALER_Amount *amount);
|
||||
|
||||
|
||||
/**
|
||||
* Function called on deposits that are past their due date
|
||||
* and have not yet seen a wire transfer.
|
||||
*
|
||||
* @param cls closure
|
||||
* @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?
|
||||
*/
|
||||
typedef void
|
||||
(*TALER_EXCHANGEDB_WireMissingCallback)(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);
|
||||
|
||||
|
||||
/**
|
||||
* @brief The plugin API, returned from the plugin's "init" function.
|
||||
* The argument given to "init" is simply a configuration handle.
|
||||
@ -2189,6 +2213,28 @@ struct TALER_EXCHANGEDB_Plugin
|
||||
uint64_t *rowid);
|
||||
|
||||
|
||||
/**
|
||||
* Select all of those deposits in the database for which we do
|
||||
* not have a wire transfer (or a refund) and which should have
|
||||
* been deposited between @a start_date and @a end_date.
|
||||
*
|
||||
* @param cls closure
|
||||
* @param session a session
|
||||
* @param start_date lower bound on the requested wire execution date
|
||||
* @param end_date upper bound on the requested wire execution date
|
||||
* @param cb function to call on all such deposits
|
||||
* @param cb_cls closure for @a cb
|
||||
* @return transaction status code
|
||||
*/
|
||||
enum GNUNET_DB_QueryStatus
|
||||
(*select_deposits_missing_wire)(void *cls,
|
||||
struct TALER_EXCHANGEDB_Session *session,
|
||||
struct GNUNET_TIME_Absolute start_date,
|
||||
struct GNUNET_TIME_Absolute end_date,
|
||||
TALER_EXCHANGEDB_WireMissingCallback cb,
|
||||
void *cb_cls);
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user