-implement purses get db sketch

This commit is contained in:
Christian Grothoff 2022-04-26 13:24:44 +02:00
parent a92d3aae7b
commit efb8c8037b
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
4 changed files with 99 additions and 6 deletions

@ -1 +1 @@
Subproject commit fbd5974fba30cab15ef1b7454a5a609286c71508 Subproject commit 0172bed41a8fdfc4ef2511e311441120a3d2572d

View File

@ -295,7 +295,6 @@ TEH_handler_purses_get (struct TEH_RequestContext *rc,
} }
} /* end first-time initialization */ } /* end first-time initialization */
#if FIXME
{ {
enum GNUNET_DB_QueryStatus qs; enum GNUNET_DB_QueryStatus qs;
@ -324,21 +323,20 @@ TEH_handler_purses_get (struct TEH_RequestContext *rc,
case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS: case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
return TALER_MHD_reply_with_error (rc->connection, return TALER_MHD_reply_with_error (rc->connection,
MHD_HTTP_NOT_FOUND, MHD_HTTP_NOT_FOUND,
TALER_EC_EXCHANGE_PURSE_UNKNOWN, TALER_EC_EXCHANGE_GENERIC_PURSE_UNKNOWN,
NULL); NULL);
case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT: case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
break; /* handled below */ break; /* handled below */
} }
} }
if (GNUNET_TIME_absolute_is_past (gc->purse_expiration)) if (GNUNET_TIME_absolute_is_past (gc->purse_expiration.abs_time))
{ {
return TALER_MHD_reply_with_error (rc->connection, return TALER_MHD_reply_with_error (rc->connection,
MHD_HTTP_GONE, MHD_HTTP_GONE,
TALER_EC_EXCHANGE_PURSE_EXPIRED, TALER_EC_EXCHANGE_GENERIC_PURSE_EXPIRED,
GNUNET_TIME_timestamp2s ( GNUNET_TIME_timestamp2s (
gc->purse_expiration)); gc->purse_expiration));
} }
#endif
// FIXME: compare amount to deposited amount; // FIXME: compare amount to deposited amount;
// if below, set 'deposit_timestamp' to zero! // if below, set 'deposit_timestamp' to zero!

View File

@ -13351,6 +13351,74 @@ postgres_insert_purse_request (
} }
/**
* Function called to obtain information about a purse.
*
* @param cls the @e cls of this struct with the plugin-specific state
* @param purse_pub public key of the new purse
* @param[out] purse_expiration set to time when the purse will expire
* @param[out] amount set to target amount (with fees) to be put into the purse
* @param[out] deposited set to actual amount put into the purse so far
* @param[out] h_contract_terms set to hash of the contract for the purse
* @param[out] merge_timestamp set to time when the purse was merged, or NEVER if not
* @param[out] deposit_timestamp set to time when the deposited amount reached the target amount, or NEVER if not
* @return transaction status code
*/
static enum GNUNET_DB_QueryStatus
postgres_select_purse (
void *cls,
const struct TALER_PurseContractPublicKeyP *purse_pub,
struct GNUNET_TIME_Timestamp *purse_expiration,
struct TALER_Amount *amount,
struct TALER_Amount *deposited,
struct TALER_PrivateContractHashP *h_contract_terms,
struct GNUNET_TIME_Timestamp *merge_timestamp,
struct GNUNET_TIME_Timestamp *deposit_timestamp)
{
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (purse_pub),
GNUNET_PQ_query_param_end
};
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_timestamp ("purse_expiration",
purse_expiration),
TALER_PQ_RESULT_SPEC_AMOUNT ("amount_with_fee",
amount),
TALER_PQ_RESULT_SPEC_AMOUNT ("balance",
deposited),
GNUNET_PQ_result_spec_auto_from_type ("h_contract_terms",
h_contract_terms),
GNUNET_PQ_result_spec_allow_null (
GNUNET_PQ_result_spec_timestamp ("merge_timestamp",
merge_timestamp),
NULL),
GNUNET_PQ_result_spec_allow_null (
GNUNET_PQ_result_spec_timestamp ("deposit_timestamp",
deposit_timestamp),
NULL),
GNUNET_PQ_result_spec_end
};
enum GNUNET_DB_QueryStatus qs;
*merge_timestamp = GNUNET_TIME_UNIT_FOREVER_TS;
*deposit_timestamp = GNUNET_TIME_UNIT_FOREVER_TS;
qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
"select_purse_request",
params,
rs);
if ( (qs > 0) &&
(0 <
TALER_amount_cmp (amount,
deposited)) )
{
/* not yet enough */
*deposit_timestamp = GNUNET_TIME_UNIT_FOREVER_TS;
}
return qs;
}
/** /**
* Function called to return meta data about a purse by the * Function called to return meta data about a purse by the
* merge capability key. * merge capability key.
@ -14021,6 +14089,8 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)
= &postgres_insert_purse_request; = &postgres_insert_purse_request;
plugin->select_purse_request plugin->select_purse_request
= &postgres_select_purse_request; = &postgres_select_purse_request;
plugin->select_purse
= &postgres_select_purse;
plugin->select_purse_by_merge_pub plugin->select_purse_by_merge_pub
= &postgres_select_purse_by_merge_pub; = &postgres_select_purse_by_merge_pub;
plugin->do_purse_deposit plugin->do_purse_deposit

View File

@ -4546,6 +4546,31 @@ struct TALER_EXCHANGEDB_Plugin
bool *in_conflict); bool *in_conflict);
/**
* Function called to obtain information about a purse.
*
* @param cls the @e cls of this struct with the plugin-specific state
* @param purse_pub public key of the new purse
* @param[out] purse_expiration set to time when the purse will expire
* @param[out] amount set to target amount (with fees) to be put into the purse
* @param[out] deposited set to actual amount put into the purse so far
* @param[out] h_contract_terms set to hash of the contract for the purse
* @param[out] merge_timestamp set to time when the purse was merged, or NEVER if not
* @param[out] deposit_timestamp set to time when the deposited amount reached the target amount, or NEVER if not
* @return transaction status code
*/
enum GNUNET_DB_QueryStatus
(*select_purse)(
void *cls,
const struct TALER_PurseContractPublicKeyP *purse_pub,
struct GNUNET_TIME_Timestamp *purse_expiration,
struct TALER_Amount *amount,
struct TALER_Amount *deposited,
struct TALER_PrivateContractHashP *h_contract_terms,
struct GNUNET_TIME_Timestamp *merge_timestamp,
struct GNUNET_TIME_Timestamp *deposit_timestamp);
/** /**
* Function called to reutrn meta data about a purse by the * Function called to reutrn meta data about a purse by the
* purse public key. * purse public key.