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"
|
" ORDER BY prewire_uuid ASC"
|
||||||
" LIMIT 1;",
|
" LIMIT 1;",
|
||||||
0),
|
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() */
|
/* Used in #postgres_gc() */
|
||||||
GNUNET_PQ_make_prepare ("gc_prewire",
|
GNUNET_PQ_make_prepare ("gc_prewire",
|
||||||
"DELETE"
|
"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.
|
* 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->get_reserve_by_h_blind = &postgres_get_reserve_by_h_blind;
|
||||||
plugin->insert_denomination_revocation = &postgres_insert_denomination_revocation;
|
plugin->insert_denomination_revocation = &postgres_insert_denomination_revocation;
|
||||||
plugin->get_denomination_revocation = &postgres_get_denomination_revocation;
|
plugin->get_denomination_revocation = &postgres_get_denomination_revocation;
|
||||||
|
plugin->select_deposits_missing_wire = &postgres_select_deposits_missing_wire;
|
||||||
return plugin;
|
return plugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1041,6 +1041,30 @@ typedef void
|
|||||||
const struct TALER_Amount *amount);
|
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.
|
* @brief The plugin API, returned from the plugin's "init" function.
|
||||||
* The argument given to "init" is simply a configuration handle.
|
* The argument given to "init" is simply a configuration handle.
|
||||||
@ -2189,6 +2213,28 @@ struct TALER_EXCHANGEDB_Plugin
|
|||||||
uint64_t *rowid);
|
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