diff options
m--------- | contrib/gana | 0 | ||||
-rw-r--r-- | src/exchange/taler-exchange-httpd_purses_get.c | 8 | ||||
-rw-r--r-- | src/exchangedb/plugin_exchangedb_postgres.c | 70 | ||||
-rw-r--r-- | src/include/taler_exchangedb_plugin.h | 25 |
4 files changed, 98 insertions, 5 deletions
diff --git a/contrib/gana b/contrib/gana -Subproject fbd5974fba30cab15ef1b7454a5a609286c7150 +Subproject 0172bed41a8fdfc4ef2511e311441120a3d2572 diff --git a/src/exchange/taler-exchange-httpd_purses_get.c b/src/exchange/taler-exchange-httpd_purses_get.c index dd904d790..325272884 100644 --- a/src/exchange/taler-exchange-httpd_purses_get.c +++ b/src/exchange/taler-exchange-httpd_purses_get.c @@ -295,7 +295,6 @@ TEH_handler_purses_get (struct TEH_RequestContext *rc, } } /* end first-time initialization */ -#if FIXME { enum GNUNET_DB_QueryStatus qs; @@ -324,21 +323,20 @@ TEH_handler_purses_get (struct TEH_RequestContext *rc, case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS: return TALER_MHD_reply_with_error (rc->connection, MHD_HTTP_NOT_FOUND, - TALER_EC_EXCHANGE_PURSE_UNKNOWN, + TALER_EC_EXCHANGE_GENERIC_PURSE_UNKNOWN, NULL); case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT: 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, MHD_HTTP_GONE, - TALER_EC_EXCHANGE_PURSE_EXPIRED, + TALER_EC_EXCHANGE_GENERIC_PURSE_EXPIRED, GNUNET_TIME_timestamp2s ( gc->purse_expiration)); } -#endif // FIXME: compare amount to deposited amount; // if below, set 'deposit_timestamp' to zero! diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index ebdcae402..af4cbc780 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -13352,6 +13352,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 * merge capability key. * @@ -14021,6 +14089,8 @@ libtaler_plugin_exchangedb_postgres_init (void *cls) = &postgres_insert_purse_request; plugin->select_purse_request = &postgres_select_purse_request; + plugin->select_purse + = &postgres_select_purse; plugin->select_purse_by_merge_pub = &postgres_select_purse_by_merge_pub; plugin->do_purse_deposit diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h index cf265c106..27b0d1b0f 100644 --- a/src/include/taler_exchangedb_plugin.h +++ b/src/include/taler_exchangedb_plugin.h @@ -4547,6 +4547,31 @@ struct TALER_EXCHANGEDB_Plugin /** + * 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 * purse public key. * |