aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
m---------contrib/gana0
-rw-r--r--src/exchange/taler-exchange-httpd_purses_get.c8
-rw-r--r--src/exchangedb/plugin_exchangedb_postgres.c70
-rw-r--r--src/include/taler_exchangedb_plugin.h25
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.
*