diff options
| author | Christian Grothoff <christian@grothoff.org> | 2022-04-26 13:24:44 +0200 | 
|---|---|---|
| committer | Christian Grothoff <christian@grothoff.org> | 2022-04-26 13:24:51 +0200 | 
| commit | efb8c8037b0d9e4d0407e62156b0021f790ad974 (patch) | |
| tree | 906c64f536d6b60b41031cdb605bad1b8cf43726 | |
| parent | a92d3aae7bd7f6fe894fb901c351a0ce320c87a3 (diff) | |
-implement purses get db sketch
| 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 dd904d79..32527288 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 ebdcae40..af4cbc78 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 cf265c10..27b0d1b0 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.     * | 
