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: SELECT refunds + ne


From: gnunet
Subject: [GNUnet-SVN] [taler-merchant] branch master updated: SELECT refunds + nested loops to fetch per-coin situation about refunds.
Date: Fri, 09 Jun 2017 15:02:22 +0200

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

marcello pushed a commit to branch master
in repository merchant.

The following commit(s) were added to refs/heads/master by this push:
     new d3d70ff  SELECT refunds + nested loops to fetch per-coin situation 
about refunds.
d3d70ff is described below

commit d3d70ffd6fb3a502dd5c6712c8a26fb4ed7dfad1
Author: Marcello Stanisci <address@hidden>
AuthorDate: Fri Jun 9 15:02:02 2017 +0200

    SELECT refunds + nested loops to fetch per-coin
    situation about refunds.
---
 src/backenddb/plugin_merchantdb_postgres.c | 93 +++++++++++++++++++++++++++---
 1 file changed, 85 insertions(+), 8 deletions(-)

diff --git a/src/backenddb/plugin_merchantdb_postgres.c 
b/src/backenddb/plugin_merchantdb_postgres.c
index 61f9e6d..ae0efd2 100644
--- a/src/backenddb/plugin_merchantdb_postgres.c
+++ b/src/backenddb/plugin_merchantdb_postgres.c
@@ -45,6 +45,7 @@ struct PostgresClosure
 
 /**
  * Error code returned by Postgres for deadlock.
+ * FIXME: no threads, really needed?
  */
 #define PQ_DIAG_SQLSTATE_DEADLOCK "40P01"
 
@@ -209,7 +210,7 @@ evaluate_pq_result (struct PostgresClosure *pg,
       return GNUNET_SYSERR;
     }
     if ( (0 == strcmp (sqlstate,
-                       PQ_DIAG_SQLSTATE_DEADLOCK)) ||
+                       PQ_DIAG_SQLSTATE_DEADLOCK)) || /*FIXME: no threads, 
really needed?*/
          (0 == strcmp (sqlstate,
                        PQ_DIAG_SQLSTATE_SERIALIZATION_FAILURE)) )
     {
@@ -412,6 +413,16 @@ postgres_initialize (void *cls)
                             " h_contract_terms=$1"
                             " AND merchant_pub=$2",
                             2),
+
+    /*NOTE: minimal version, to be expanded on a needed basis*/
+    GNUNET_PQ_make_prepare ("find_refunds",
+                            "SELECT"
+                            " refund_amount_val" 
+                            ",refund_amount_frac"
+                            ",refund_amount_curr"
+                            " FROM merchant_refunds"
+                            " WHERE coin_pub=$1",
+                            1),
     GNUNET_PQ_make_prepare ("find_contract_terms",
                             "SELECT"
                             " contract_terms"
@@ -1785,7 +1796,13 @@ postgres_increase_refund_for_contract (void *cls,
     GNUNET_PQ_query_param_end
   };
 
-  /*FIXME: begin transaction*/
+  if (GNUNET_OK !=
+      postgres_start (cls))
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+
   result = GNUNET_PQ_exec_prepared (pg->conn,
                                     "find_deposits",
                                     params);
@@ -1806,12 +1823,11 @@ postgres_increase_refund_for_contract (void *cls,
     return GNUNET_SYSERR;
   }
 
-  /*FIXME, logic incomplete!!*/
-
   for (i=0;i<PQntuples (result);i++)
   {
     struct TALER_CoinSpendPublicKeyP coin_pub;
     struct TALER_Amount amount_with_fee;
+    struct TALER_Amount refunded_amount;
 
     struct GNUNET_PQ_ResultSpec rs[] = {
       GNUNET_PQ_result_spec_auto_from_type ("coin_pub",
@@ -1830,13 +1846,74 @@ postgres_increase_refund_for_contract (void *cls,
       PQclear (result);
       return GNUNET_SYSERR;
     }
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Found: coin_pub '%s' amount_with_fee '%s'.\n",
-                TALER_B2S (&coin_pub),
-                TALER_amount_to_string (&amount_with_fee));
+    struct GNUNET_PQ_QueryParam params[] = {
+      GNUNET_PQ_query_param_auto_from_type (&coin_pub),
+      GNUNET_PQ_query_param_end
+    };
+
+    result = GNUNET_PQ_exec_prepared (pg->conn,
+                                      "find_refunds",
+                                      params);
+
+    if (PGRES_TUPLES_OK != PQresultStatus (result))
+    {
+      BREAK_DB_ERR (result);
+      goto rollback;
+    }
+    TALER_amount_get_zero (amount_with_fee.currency,
+                           &refunded_amount);
+    if (0 < PQntuples (result))
+    {
+      for (i=0; PQntuples (result); i++)
+      {
+        /*Sum up refund*/
+        struct TALER_Amount acc;
+        struct GNUNET_PQ_ResultSpec rs[] = {
+          TALER_PQ_result_spec_amount ("refund_amount",
+                                       &acc),
+          GNUNET_PQ_result_spec_end
+        };
+
+        if (GNUNET_OK !=
+            GNUNET_PQ_extract_result (result,
+                                      rs,
+                                      i))
+          goto rollback;
+
+        if (GNUNET_SYSERR == TALER_amount_add (&refunded_amount,
+                                               &refunded_amount,
+                                               &acc))
+        {
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Could not add amounts\n");
+          goto rollback;
+        }
+      }
+    }
+
+    /**
+     * Here we know how much the coin is worth, and how much it has
+     * been refunded out of it, so the actual logic can take place.
+     */
+  }
+
+  if (GNUNET_OK != postgres_commit (cls))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Failed to commit transaction increasing refund\n");
+    return GNUNET_SYSERR;
   }
 
   return GNUNET_OK;
+
+  rollback:
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Failed transaction, doing rollback\n");
+    PQclear (result);
+    postgres_rollback (pg);
+    return GNUNET_SYSERR;
+
+  /*FIXME, logic incomplete!!*/
 }
 
 /**

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



reply via email to

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