gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [taler-merchant] branch master updated: implementing backen


From: gnunet
Subject: [GNUnet-SVN] [taler-merchant] branch master updated: implementing backend logic to lookup wire fees (for #4943)
Date: Thu, 20 Jul 2017 12:35:10 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository merchant.

The following commit(s) were added to refs/heads/master by this push:
     new eb71cb2  implementing backend logic to lookup wire fees (for #4943)
eb71cb2 is described below

commit eb71cb2c3372564ca4051e7b4b4dc721678f03d8
Author: Christian Grothoff <address@hidden>
AuthorDate: Thu Jul 20 12:34:21 2017 +0200

    implementing backend logic to lookup wire fees (for #4943)
---
 src/backenddb/plugin_merchantdb_postgres.c |  79 ++++++++++++++-
 src/backenddb/test_merchantdb.c            | 152 ++++++++++++++++++++++++++++-
 src/include/taler_merchantdb_plugin.h      |  30 +++++-
 3 files changed, 256 insertions(+), 5 deletions(-)

diff --git a/src/backenddb/plugin_merchantdb_postgres.c 
b/src/backenddb/plugin_merchantdb_postgres.c
index e060059..17e4d0a 100644
--- a/src/backenddb/plugin_merchantdb_postgres.c
+++ b/src/backenddb/plugin_merchantdb_postgres.c
@@ -267,13 +267,29 @@ postgres_initialize (void *cls)
                             " VALUES "
                             "($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
                             11),
+    GNUNET_PQ_make_prepare ("lookup_wire_fee",
+                            "SELECT"
+                            " wire_fee_val"
+                            ",wire_fee_frac"
+                            ",wire_fee_curr"
+                            ",closing_fee_val"
+                            ",closing_fee_frac"
+                            ",closing_fee_curr"
+                            ",start_date"
+                            ",end_date"
+                            ",exchange_sig"
+                            " FROM exchange_wire_fees"
+                            " WHERE exchange_pub=$1"
+                           "   AND h_wire_method=$2"
+                           "   AND start_date <= $3"
+                           "   AND end_date > $3",
+                            1),
     GNUNET_PQ_make_prepare ("find_contract_terms_from_hash",
                             "SELECT"
                             " contract_terms"
                             " FROM merchant_contract_terms"
-                            " WHERE"
-                            " h_contract_terms=$1"
-                            " AND merchant_pub=$2",
+                            " WHERE h_contract_terms=$1"
+                            "   AND merchant_pub=$2",
                             2),
     GNUNET_PQ_make_prepare ("end_transaction",
                             "COMMIT",
@@ -1908,6 +1924,62 @@ postgres_store_wire_fee_by_exchange (void *cls,
 
 
 /**
+ * Obtain information about wire fees charged by an exchange,
+ * including signature (so we have proof).
+ *
+ * @param cls closure
+ * @param exchange_pub public key of the exchange
+ * @param h_wire_method hash of wire method
+ * @param contract_date date of the contract to use for the lookup
+ * @param[out] wire_fee wire fee charged
+ * @param[out] closing_fee closing fee charged (irrelevant for us,
+ *              but needed to check signature)
+ * @param[out] start_date start of fee being used
+ * @param[out] end_date end of fee being used
+ * @param[out] exchange_sig signature of exchange over fee structure
+ * @return transaction status code
+ */
+static enum GNUNET_DB_QueryStatus
+postgres_lookup_wire_fee (void *cls,
+                         const struct TALER_MasterPublicKeyP *exchange_pub,
+                         const struct GNUNET_HashCode *h_wire_method,
+                         struct GNUNET_TIME_Absolute contract_date,
+                         struct TALER_Amount *wire_fee,
+                         struct TALER_Amount *closing_fee,
+                         struct GNUNET_TIME_Absolute *start_date,
+                         struct GNUNET_TIME_Absolute *end_date,
+                         struct TALER_MasterSignatureP *exchange_sig)
+{
+  struct PostgresClosure *pg = cls;
+  struct GNUNET_PQ_QueryParam params[] = {
+    GNUNET_PQ_query_param_auto_from_type (exchange_pub),
+    GNUNET_PQ_query_param_auto_from_type (h_wire_method),
+    GNUNET_PQ_query_param_absolute_time (&contract_date),
+    GNUNET_PQ_query_param_end
+  };
+  struct GNUNET_PQ_ResultSpec rs[] = {
+    TALER_PQ_result_spec_amount ("wire_fee",
+                                wire_fee),
+    TALER_PQ_result_spec_amount ("closing_fee",
+                                closing_fee),
+    GNUNET_PQ_result_spec_absolute_time ("start_date",
+                                        start_date),
+    GNUNET_PQ_result_spec_absolute_time ("end_date",
+                                        end_date),
+    GNUNET_PQ_result_spec_auto_from_type ("exchange_sig",
+                                         exchange_sig),
+    GNUNET_PQ_result_spec_end
+  };
+
+  check_connection (pg);
+  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
+                                                  "lookup_wire_fee",
+                                                  params,
+                                                  rs);
+}
+
+
+/**
  * Closure for #process_refund_cb.
  */
 struct FindRefundContext
@@ -2417,6 +2489,7 @@ libtaler_plugin_merchantdb_postgres_init (void *cls)
   plugin->find_contract_terms_by_date_and_range = 
&postgres_find_contract_terms_by_date_and_range;
   plugin->find_contract_terms_from_hash = 
&postgres_find_contract_terms_from_hash;
   plugin->get_refunds_from_contract_terms_hash = 
&postgres_get_refunds_from_contract_terms_hash;
+  plugin->lookup_wire_fee = &postgres_lookup_wire_fee;
   plugin->increase_refund_for_contract = postgres_increase_refund_for_contract;
   plugin->mark_proposal_paid = postgres_mark_proposal_paid;
   plugin->start = postgres_start;
diff --git a/src/backenddb/test_merchantdb.c b/src/backenddb/test_merchantdb.c
index 0f43b8f..212359d 100644
--- a/src/backenddb/test_merchantdb.c
+++ b/src/backenddb/test_merchantdb.c
@@ -363,6 +363,153 @@ proof_cb (void *cls,
 
 
 /**
+ * Test the wire fee storage.
+ *
+ * @return #GNUNET_OK on success
+ */
+static int
+test_wire_fee ()
+{
+  struct TALER_MasterPublicKeyP exchange_pub;
+  struct GNUNET_HashCode h_wire_method;
+  struct GNUNET_TIME_Absolute contract_date;
+  struct TALER_Amount wire_fee1;
+  struct TALER_Amount closing_fee1;
+  struct TALER_Amount wire_fee2;
+  struct TALER_Amount closing_fee2;
+  struct TALER_Amount wire_fee3;
+  struct TALER_Amount closing_fee3;
+  struct GNUNET_TIME_Absolute date1;
+  struct GNUNET_TIME_Absolute date2;
+  struct GNUNET_TIME_Absolute date3;
+  struct GNUNET_TIME_Absolute start_date;
+  struct GNUNET_TIME_Absolute end_date;
+  struct TALER_MasterSignatureP exchange_sig;
+  struct TALER_MasterSignatureP exchange_sig2;
+
+  RND_BLK (&exchange_pub);
+  RND_BLK (&h_wire_method);
+  RND_BLK (&exchange_sig);
+  date1 = GNUNET_TIME_absolute_get ();
+  date2 = GNUNET_TIME_absolute_add (date1,
+                                   GNUNET_TIME_UNIT_DAYS);
+  date3 = GNUNET_TIME_absolute_add (date2,
+                                   GNUNET_TIME_UNIT_DAYS);
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_string_to_amount (CURRENCY ":5",
+                                         &closing_fee1));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_string_to_amount (CURRENCY ":4",
+                                         &wire_fee1));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_string_to_amount (CURRENCY ":3",
+                                         &closing_fee2));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_string_to_amount (CURRENCY ":2",
+                                         &wire_fee2));
+  if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
+      plugin->store_wire_fee_by_exchange (plugin->cls,
+                                         &exchange_pub,
+                                         &h_wire_method,
+                                         &wire_fee1,
+                                         &closing_fee1,
+                                         date1,
+                                         date2,
+                                         &exchange_sig))
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
+      plugin->store_wire_fee_by_exchange (plugin->cls,
+                                         &exchange_pub,
+                                         &h_wire_method,
+                                         &wire_fee2,
+                                         &closing_fee2,
+                                         date2,
+                                         date3,
+                                         &exchange_sig))
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  contract_date = date2; /* test inclusive/exclusive range */
+  if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
+      plugin->lookup_wire_fee (plugin->cls,
+                              &exchange_pub,
+                              &h_wire_method,
+                              contract_date,
+                              &wire_fee3,
+                              &closing_fee3,
+                              &start_date,
+                              &end_date,
+                              &exchange_sig2))
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  if ( (start_date.abs_value_us != date2.abs_value_us) ||
+       (end_date.abs_value_us != date3.abs_value_us) ||
+       (0 != memcmp (&exchange_sig,
+                    &exchange_sig2,
+                    sizeof (exchange_sig))) ||
+       (0 != TALER_amount_cmp (&wire_fee2,
+                              &wire_fee3)) ||
+       (0 != TALER_amount_cmp (&closing_fee2,
+                              &closing_fee3)) )
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  contract_date = GNUNET_TIME_absolute_add (date1,
+                                           GNUNET_TIME_UNIT_SECONDS);
+  if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
+      plugin->lookup_wire_fee (plugin->cls,
+                              &exchange_pub,
+                              &h_wire_method,
+                              contract_date,
+                              &wire_fee3,
+                              &closing_fee3,
+                              &start_date,
+                              &end_date,
+                              &exchange_sig2))
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  if ( (start_date.abs_value_us != date1.abs_value_us) ||
+       (end_date.abs_value_us != date2.abs_value_us) ||
+       (0 != memcmp (&exchange_sig,
+                    &exchange_sig2,
+                    sizeof (exchange_sig))) ||
+       (0 != TALER_amount_cmp (&wire_fee1,
+                              &wire_fee3)) ||
+       (0 != TALER_amount_cmp (&closing_fee1,
+                              &closing_fee3)) )
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  contract_date = date3; /* outside of valid range! */
+  if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS !=
+      plugin->lookup_wire_fee (plugin->cls,
+                              &exchange_pub,
+                              &h_wire_method,
+                              contract_date,
+                              &wire_fee3,
+                              &closing_fee3,
+                              &start_date,
+                              &end_date,
+                              &exchange_sig2))
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  return GNUNET_OK;
+}
+
+
+/**
  * Main function that will be run by the scheduler.
  *
  * @param cls closure with config
@@ -635,7 +782,10 @@ run (void *cls)
                                                 &too_big_refund_amount,
                                                 "make refund testing fail due"
                                                 " to too big refund amount"));
-
+  
+  FAILIF (GNUNET_OK !=
+         test_wire_fee ());
+  
   if (-1 == result)
     result = 0;
 
diff --git a/src/include/taler_merchantdb_plugin.h 
b/src/include/taler_merchantdb_plugin.h
index 2fd801f..a5e91f5 100644
--- a/src/include/taler_merchantdb_plugin.h
+++ b/src/include/taler_merchantdb_plugin.h
@@ -408,7 +408,7 @@ struct TALER_MERCHANTDB_Plugin
    * including signature (so we have proof).
    *
    * @param cls closure
-   * @paramm exchange_pub public key of the exchange
+   * @param exchange_pub public key of the exchange
    * @param h_wire_method hash of wire method
    * @param wire_fee wire fee charged
    * @param closing_fee closing fee charged (irrelevant for us,
@@ -555,8 +555,36 @@ struct TALER_MERCHANTDB_Plugin
                          const struct TALER_WireTransferIdentifierRawP *wtid,
                          TALER_MERCHANTDB_ProofCallback cb,
                          void *cb_cls);
+  
 
+  /**
+   * Obtain information about wire fees charged by an exchange,
+   * including signature (so we have proof).
+   *
+   * @param cls closure
+   * @param exchange_pub public key of the exchange
+   * @param h_wire_method hash of wire method
+   * @param contract_date date of the contract to use for the lookup
+   * @param[out] wire_fee wire fee charged
+   * @param[out] closing_fee closing fee charged (irrelevant for us,
+   *              but needed to check signature)
+   * @param[out] start_date start of fee being used
+   * @param[out] end_date end of fee being used
+   * @param[out] exchange_sig signature of exchange over fee structure
+   * @return transaction status code
+   */
+  enum GNUNET_DB_QueryStatus
+  (*lookup_wire_fee) (void *cls,
+                     const struct TALER_MasterPublicKeyP *exchange_pub,
+                     const struct GNUNET_HashCode *h_wire_method,
+                     struct GNUNET_TIME_Absolute contract_date,
+                     struct TALER_Amount *wire_fee,
+                     struct TALER_Amount *closing_fee,
+                     struct GNUNET_TIME_Absolute *start_date,
+                     struct GNUNET_TIME_Absolute *end_date,
+                     struct TALER_MasterSignatureP *exchange_sig);
 
+  
   /**
    * Function called when some backoffice staff decides to award or
    * increase the refund on an existing contract.

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]