gnunet-svn
[Top][All Lists]
Advanced

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

[taler-exchange] branch master updated: tests for refunds_by_coin and re


From: gnunet
Subject: [taler-exchange] branch master updated: tests for refunds_by_coin and ready_deposit
Date: Mon, 23 Jan 2023 13:58:02 +0100

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

joseph-xu pushed a commit to branch master
in repository exchange.

The following commit(s) were added to refs/heads/master by this push:
     new 54fa07f5 tests for refunds_by_coin and ready_deposit
54fa07f5 is described below

commit 54fa07f5c7be025ee1a241deabe4a5dbcca61599
Author: Joseph <Joseph.xu@efrei.net>
AuthorDate: Mon Jan 23 07:57:34 2023 -0500

    tests for refunds_by_coin and ready_deposit
---
 src/exchangedb/Makefile.am                         |  10 +-
 src/exchangedb/exchange_do_get_ready_deposit.sql   |  64 +++++++
 src/exchangedb/exchange_do_refund_by_coin.sql      |  94 ++++++++++
 src/exchangedb/pg_get_ready_deposit.c              | 193 ++++++++++++++++++--
 src/exchangedb/pg_select_refunds_by_coin.c         | 196 +++++++++++++++++++--
 src/exchangedb/procedures.sql.in                   |   2 +
 .../test_exchangedb_populate_link_data.c           |  29 +--
 .../test_exchangedb_populate_ready_deposit.c       |  39 ++--
 ...t_exchangedb_populate_select_refunds_by_coin.c} |  99 ++++++++---
 9 files changed, 608 insertions(+), 118 deletions(-)

diff --git a/src/exchangedb/Makefile.am b/src/exchangedb/Makefile.am
index feeb09cd..2ae5fe42 100644
--- a/src/exchangedb/Makefile.am
+++ b/src/exchangedb/Makefile.am
@@ -296,7 +296,7 @@ check_PROGRAMS = \
   perf-exchangedb-reserves-in-insert-postgres\
   test-exchangedb-by-j-postgres\
   test-exchangedb-batch-reserves-in-insert-postgres\
-  test-exchangedb-populate-table-postgres\
+  test-exchangedb-populate-select-refunds-by-coin-postgres\
   test-exchangedb-populate-link-data-postgres\
   test-exchangedb-populate-ready-deposit-postgres
 
@@ -306,7 +306,7 @@ TESTS = \
   test-exchangedb-by-j-postgres\
   perf-exchangedb-reserves-in-insert-postgres\
   test-exchangedb-batch-reserves-in-insert-postgres\
-  test-exchangedb-populate-table-postgres\
+  test-exchangedb-populate-select-refunds-by-coin-postgres\
   test-exchangedb-populate-link-data-postgres\
   test-exchangedb-populate-ready-deposit-postgres
 test_exchangedb_postgres_SOURCES = \
@@ -369,9 +369,9 @@ test_exchangedb_batch_reserves_in_insert_postgres_LDADD = \
   -lgnunetutil \
   $(XLIB)
 
-test_exchangedb_populate_table_postgres_SOURCES = \
-  test_exchangedb_populate_table.c
-test_exchangedb_populate_table_postgres_LDADD = \
+test_exchangedb_populate_select_refunds_by_coin_postgres_SOURCES = \
+  test_exchangedb_populate_select_refunds_by_coin.c
+test_exchangedb_populate_select_refunds_by_coin_postgres_LDADD = \
   libtalerexchangedb.la \
   $(top_builddir)/src/json/libtalerjson.la \
   $(top_builddir)/src/util/libtalerutil.la \
diff --git a/src/exchangedb/exchange_do_get_ready_deposit.sql 
b/src/exchangedb/exchange_do_get_ready_deposit.sql
new file mode 100644
index 00000000..b887571e
--- /dev/null
+++ b/src/exchangedb/exchange_do_get_ready_deposit.sql
@@ -0,0 +1,64 @@
+--
+-- This file is part of TALER
+-- Copyright (C) 2014--2022 Taler Systems SA
+--
+-- TALER is free software; you can redistribute it and/or modify it under the
+-- terms of the GNU General Public License as published by the Free Software
+-- Foundation; either version 3, or (at your option) any later version.
+--
+-- TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
+-- A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License along with
+-- TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+--
+CREATE OR REPLACE FUNCTION exchange_do_get_ready_deposit(
+  IN in_now INT8,
+  IN in_start_shard_now INT8,
+  IN in_end_shard_now INT8,
+  OUT out_payto_uri VARCHAR,
+  OUT out_merchant_pub BYTEA
+)
+LANGUAGE plpgsql
+AS $$
+DECLARE
+ var_wire_target_h_payto BYTEA;
+DECLARE
+ var_coin_pub BYTEA;
+DECLARE
+ var_deposit_serial_id INT8;
+BEGIN
+
+SELECT
+   coin_pub
+  ,deposit_serial_id
+  INTO
+   var_coin_pub
+  ,var_deposit_serial_id
+  FROM deposits_by_ready
+  WHERE wire_deadline <= in_now
+  AND shard >= in_start_shard_now
+  AND shard <=in_end_shard_now
+  ORDER BY
+   wire_deadline ASC
+  ,shard ASC;
+
+SELECT
+  merchant_pub
+ ,wire_target_h_payto
+ INTO
+  out_merchant_pub
+ ,var_wire_target_h_payto
+ FROM deposits
+ WHERE coin_pub=var_coin_pub
+   AND deposit_serial_id=var_deposit_serial_id;
+
+SELECT
+ payto_uri
+ INTO out_payto_uri
+ FROM wire_targets
+ WHERE wire_target_h_payto=var_wire_target_h_payto;
+
+RETURN;
+END $$;
diff --git a/src/exchangedb/exchange_do_refund_by_coin.sql 
b/src/exchangedb/exchange_do_refund_by_coin.sql
new file mode 100644
index 00000000..ee00e2b5
--- /dev/null
+++ b/src/exchangedb/exchange_do_refund_by_coin.sql
@@ -0,0 +1,94 @@
+--
+-- This file is part of TALER
+-- Copyright (C) 2014--2022 Taler Systems SA
+--
+-- TALER is free software; you can redistribute it and/or modify it under the
+-- terms of the GNU General Public License as published by the Free Software
+-- Foundation; either version 3, or (at your option) any later version.
+--
+-- TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
+-- A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License along with
+-- TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+--
+/*DROP FUNCTION exchange_do_refund_by_coin(
+  IN in_coin_pub BYTEA,
+  IN in_merchant_pub BYTEA,
+  IN in_h_contract BYTEA
+);*/
+CREATE OR REPLACE FUNCTION exchange_do_refund_by_coin(
+  IN in_coin_pub BYTEA,
+  IN in_merchant_pub BYTEA,
+  IN in_h_contract BYTEA
+)
+RETURNS SETOF record
+LANGUAGE plpgsql
+AS $$
+DECLARE
+  curs CURSOR
+  FOR
+  SELECT
+    amount_with_fee_val
+   ,amount_with_fee_frac
+   ,deposit_serial_id
+  FROM refunds
+  WHERE coin_pub=in_coin_pub;
+DECLARE
+  i RECORD;
+BEGIN
+OPEN curs;
+LOOP
+    FETCH NEXT FROM curs INTO i;
+    EXIT WHEN NOT FOUND;
+    RETURN QUERY
+      SELECT
+        i.amount_with_fee_val
+       ,i.amount_with_fee_frac
+       FROM deposits
+       WHERE
+         coin_pub=in_coin_pub
+         AND merchant_pub=in_merchant_pub
+         AND h_contract_terms=in_h_contract
+         AND i.deposit_serial_id = deposit_serial_id;
+END LOOP;
+CLOSE curs;
+END $$;
+
+/*RETURNS TABLE(amount_with_fee_val INT8, amount_with_fee_frac INT4)
+LANGUAGE plpgsql
+AS $$
+DECLARE
+  curs CURSOR
+  FOR
+  SELECT
+    r.amount_with_fee_val
+   ,r.amount_with_fee_frac
+   ,r.deposit_serial_id
+  FROM refunds r
+  WHERE r.coin_pub=in_coin_pub;
+DECLARE
+  i RECORD;
+BEGIN
+OPEN curs;
+LOOP
+    FETCH NEXT FROM curs INTO i;
+    IF FOUND
+    THEN
+      RETURN QUERY
+      SELECT
+        i.amount_with_fee_val
+       ,i.amount_with_fee_frac
+       FROM deposits
+       WHERE
+         merchant_pub=in_merchant_pub
+         AND h_contract_terms=in_h_contract
+         AND i.deposit_serial_id = deposit_serial_id;
+    END IF;
+    EXIT WHEN NOT FOUND;
+END LOOP;
+CLOSE curs;
+
+END $$;
+*/
diff --git a/src/exchangedb/pg_get_ready_deposit.c 
b/src/exchangedb/pg_get_ready_deposit.c
index af123529..73ac9e47 100644
--- a/src/exchangedb/pg_get_ready_deposit.c
+++ b/src/exchangedb/pg_get_ready_deposit.c
@@ -41,6 +41,7 @@ TEH_PG_get_ready_deposit (void *cls,
     GNUNET_PQ_query_param_uint64 (&end_shard_row),
     GNUNET_PQ_query_param_end
   };
+
   struct GNUNET_PQ_ResultSpec rs[] = {
     GNUNET_PQ_result_spec_auto_from_type ("merchant_pub",
                                           merchant_pub),
@@ -57,26 +58,180 @@ TEH_PG_get_ready_deposit (void *cls,
               "Finding ready deposits by deadline %s (%llu)\n",
               GNUNET_TIME_absolute2s (now),
               (unsigned long long) now.abs_value_us);
-  PREPARE (pg,
-           "deposits_get_ready",
-           "SELECT"
-           " payto_uri"
-           ",merchant_pub"
-           " FROM deposits_by_ready dbr"
-           "  JOIN deposits dep"
-           "    ON (dbr.coin_pub = dep.coin_pub AND"
-           "        dbr.deposit_serial_id = dep.deposit_serial_id)"
-           "  JOIN wire_targets wt"
-           "    USING (wire_target_h_payto)"
-           " WHERE dbr.wire_deadline<=$1"
-           "   AND dbr.shard >= $2"
-           "   AND dbr.shard <= $3"
-           " ORDER BY "
-           "   dbr.wire_deadline ASC"
-           "  ,dbr.shard ASC"
-           " LIMIT 1;");
+  int choose_mode =-2;
+  const char *query;
+
+  if (-2 == choose_mode)
+  {
+    const char *mode = getenv ("NEW_LOGIC");
+    char dummy;
+    if ( (NULL==mode) ||
+         (1 != sscanf (mode,
+                       "%d%c",
+                       &choose_mode,
+                       &dummy)) )
+      {
+        if (NULL != mode)
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Bad mode `%s' specified\n",
+                      mode);
+      }
+    if (NULL==mode)
+      choose_mode=0;
+
+
+  }
+  switch (choose_mode)
+  {
+  case 0:
+    query="deposits_get_ready";
+    PREPARE (pg,
+             query,
+             "SELECT"
+             " payto_uri"
+             ",merchant_pub"
+             " FROM deposits_by_ready dbr"
+             "  JOIN deposits dep"
+             "    ON (dbr.coin_pub = dep.coin_pub AND"
+             "        dbr.deposit_serial_id = dep.deposit_serial_id)"
+             "  JOIN wire_targets wt"
+             "    USING (wire_target_h_payto)"
+             " WHERE dbr.wire_deadline<=$1"
+             "   AND dbr.shard >= $2"
+             "   AND dbr.shard <= $3"
+             " ORDER BY "
+             "   dbr.wire_deadline ASC"
+             "  ,dbr.shard ASC"
+             " LIMIT 1;");
+    break;
+  case 1:
+    query="deposits_get_ready_v1";
+    PREPARE (pg,
+             query,
+             "WITH rc AS MATERIALIZED ("
+             " SELECT"
+             " coin_pub"
+             ",deposit_serial_id"
+             " FROM deposits_by_ready"
+             " WHERE"
+             " wire_deadline<=$1"
+             " AND shard >= $2"
+             " AND shard <= $3"
+             " ORDER BY "
+             "   wire_deadline ASC"
+             "  ,shard ASC"
+             "  LIMIT 1"
+             ")"
+             "SELECT"
+             " wt.payto_uri"
+             ",dep.merchant_pub"
+             " FROM ("
+             " SELECT"
+             " wire_target_h_payto"
+             ",merchant_pub"
+             " FROM deposits"
+             " WHERE coin_pub=(SELECT coin_pub FROM rc)"
+             " AND deposit_serial_id=(SELECT deposit_serial_id FROM rc)"
+             ") dep"
+             "  JOIN wire_targets wt"
+             "    ON (dep.wire_target_h_payto = wt.wire_target_h_payto)"
+             );
+
+    break;
+  case 2:
+    query = "stored_procedure_get_ready_deposit";
+    PREPARE (pg,
+             query,
+             "SELECT"
+             " out_payto_uri AS payto_uri"
+             ",out_merchant_pub AS merchant_pub"
+             " FROM"
+             " exchange_do_get_ready_deposit"
+             " ($1, $2, $3) ");
+    break;
+  case 3:
+    query="deposits_get_ready_v3";
+    PREPARE (pg,
+             query,
+             "WITH rc AS MATERIALIZED ("
+             " SELECT"
+             " coin_pub"
+             ",deposit_serial_id"
+             " FROM deposits_by_ready"
+             " WHERE"
+             " wire_deadline<=$1"
+             " AND shard >= $2"
+             " AND shard <= $3"
+             " ORDER BY "
+             "   wire_deadline ASC"
+             "  ,shard ASC"
+             "  LIMIT 1"
+             ")"
+             "SELECT"
+             " wt.payto_uri"
+             ",dep.merchant_pub"
+             " FROM ("
+             " SELECT"
+             " wire_target_h_payto"
+             ",merchant_pub"
+             ",coin_pub"
+             " FROM deposits"
+             " WHERE coin_pub=(SELECT coin_pub FROM rc)"
+             " AND deposit_serial_id=(SELECT deposit_serial_id FROM rc)"
+             ") dep"
+             "  JOIN wire_targets wt"
+             "    ON (dep.wire_target_h_payto = wt.wire_target_h_payto)"
+             "  JOIN rc"
+             "    ON (dep.coin_pub=rc.coin_pub)"
+             );
+
+    break;
+  case 4:
+    query="deposits_get_ready_v4";
+    PREPARE (pg,
+             query,
+             "WITH rc AS MATERIALIZED ("
+             " SELECT"
+             " coin_pub"
+             ",deposit_serial_id"
+             " FROM deposits_by_ready"
+             " WHERE"
+             " wire_deadline<=$1"
+             " AND shard >= $2"
+             " AND shard <= $3"
+             " ORDER BY "
+             "   wire_deadline ASC"
+             "  ,shard ASC"
+             "  LIMIT 1"
+             "),"
+             "WITH rv AS MATERIALIZED ("
+             " SELECT"
+             " payto_uri"
+             ",wire_target_h_payto"
+             " FROM wire_targets"
+             ")"
+             "SELECT"
+             " rv.payto_uri"
+             ",dep.merchant_pub"
+             " FROM ("
+             " SELECT"
+             " wire_target_h_payto"
+             ",merchant_pub"
+             " FROM deposits"
+             " WHERE coin_pub=(SELECT coin_pub FROM rc)"
+             " AND deposit_serial_id=(SELECT deposit_serial_id FROM rc)"
+             ") dep"
+             " JOIN rv"
+             "  ON (rv.wire_target_h_payto=dep.wire_target_h_payto)"
+             );
+    break;
+  default:
+    GNUNET_break (0);
+    return GNUNET_DB_STATUS_HARD_ERROR;
+  }
+
   return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
-                                                   "deposits_get_ready",
+                                                   query,
                                                    params,
                                                    rs);
 }
diff --git a/src/exchangedb/pg_select_refunds_by_coin.c 
b/src/exchangedb/pg_select_refunds_by_coin.c
index b9db2b70..255cac34 100644
--- a/src/exchangedb/pg_select_refunds_by_coin.c
+++ b/src/exchangedb/pg_select_refunds_by_coin.c
@@ -112,17 +112,47 @@ TEH_PG_select_refunds_by_coin (
     GNUNET_PQ_query_param_auto_from_type (h_contract),
     GNUNET_PQ_query_param_end
   };
+  struct GNUNET_PQ_QueryParam params5[] = {
+    GNUNET_PQ_query_param_auto_from_type (coin_pub),
+    GNUNET_PQ_query_param_end
+  };
+
   struct SelectRefundContext srctx = {
     .cb = cb,
     .cb_cls = cb_cls,
     .pg = pg,
     .status = GNUNET_OK
   };
+  static int percent_refund = -2;
+  const char *query;
+  struct GNUNET_PQ_QueryParam *xparams = params;
 
-  if (NULL == getenv ("NEW_LOGIC"))
+  if (-2 == percent_refund)
   {
+    const char *mode = getenv ("NEW_LOGIC");
+    char dummy;
+
+    if ( (NULL==mode) ||
+         (1 != sscanf (mode,
+                       "%d%c",
+                       &percent_refund,
+                       &dummy)) )
+      {
+        if (NULL != mode)
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Bad mode `%s' specified\n",
+                      mode);
+      }
+      if (NULL==mode)
+        percent_refund=0;
+  }
+
+  switch (percent_refund)
+  {
+  case 0:
+    query = "get_refunds_by_coin_and_contract-v0";
     PREPARE (pg,
-             "get_refunds_by_coin_and_contract",
+             query,
              "SELECT"
              " ref.amount_with_fee_val"
              ",ref.amount_with_fee_frac"
@@ -132,12 +162,26 @@ TEH_PG_select_refunds_by_coin (
              " WHERE ref.coin_pub=$1"
              "   AND dep.merchant_pub=$2"
              "   AND dep.h_contract_terms=$3;");
-  }
-  else
-  {
-    // FIXME-Joseph
+    break;
+  case 1:
+    query = "get_refunds_by_coin_and_contract-v1";
+    PREPARE (pg,
+             query,
+             "SELECT"
+             " ref.amount_with_fee_val"
+             ",ref.amount_with_fee_frac"
+             " FROM refunds ref"
+             " LEFT JOIN deposits dep"
+             "   ON dep.coin_pub = ref.coin_pub"
+             "   AND ref.deposit_serial_id = dep.deposit_serial_id"
+             " WHERE ref.coin_pub=$1"
+             "   AND dep.merchant_pub=$2"
+             "   AND dep.h_contract_terms=$3;");
+    break;
+  case 2:
+    query = "get_refunds_by_coin_and_contract-v2";
     PREPARE (pg,
-             "get_refunds_by_coin_and_contract",
+             query,
              "WITH rc AS MATERIALIZED("
              "SELECT"
              " amount_with_fee_val"
@@ -149,21 +193,139 @@ TEH_PG_select_refunds_by_coin (
              "SELECT"
              "   rc.amount_with_fee_val"
              "  ,rc.amount_with_fee_frac"
-             " FROM "
-             "(SELECT"
-             "   rc.amount_with_fee_val"
-             "  ,rc.amount_with_fee_frac"
              "  FROM deposits dep"
+             " JOIN rc"
+             " ON rc.deposit_serial_id = dep.deposit_serial_id"
              "  WHERE"
-             "  dep.coin_pub = $1" // optional...
+             "      dep.coin_pub = $1"
              "  AND dep.merchant_pub = $2"
-             "  AND dep.h_contract_terms = $3) dep"
-             " JOIN rc"
-             "   USING (coin_pub,deposit_serial_id)");
+             "  AND dep.h_contract_terms = $3");
+    break;
+  case 3:
+    query = "get_refunds_by_coin_and_contract-v3";
+    PREPARE (pg,
+             query,
+             "WITH rc AS MATERIALIZED("
+             "SELECT"
+             " amount_with_fee_val"
+             ",amount_with_fee_frac"
+             ",deposit_serial_id"
+             " FROM refunds"
+             " WHERE coin_pub=$1)"
+             "SELECT"
+             "   rc.amount_with_fee_val"
+             "  ,rc.amount_with_fee_frac"
+             "  FROM ("
+             "SELECT"
+             " amount_with_fee_val"
+             ",amount_with_fee_frac"
+             " FROM deposits depos"
+             "  WHERE"
+             "  depos.coin_pub = $1"
+             "  AND depos.merchant_pub = $2"
+             "  AND depos.h_contract_terms = $3) dep, rc;");
+    break;
+  case 4:
+    query = "get_refunds_by_coin_and_contract-v4";
+    PREPARE (pg,
+             query,
+             "WITH rc AS MATERIALIZED("
+             "SELECT"
+             " amount_with_fee_val"
+             ",amount_with_fee_frac"
+             ",coin_pub"
+             ",deposit_serial_id"
+             " FROM refunds ref"
+             " WHERE ref.coin_pub=$1)"
+             "SELECT"
+             "   rc.amount_with_fee_val"
+             "  ,rc.amount_with_fee_frac"
+             "  ,deposit_serial_id"
+             "  FROM ("
+             "SELECT"
+             " amount_with_fee_val"
+             ",amount_with_fee_frac"
+             " FROM deposits depos"
+             "  WHERE"
+             "  depos.merchant_pub = $2"
+             "  AND depos.h_contract_terms = $3) dep JOIN rc "
+             "USING(deposit_serial_id, coin_pub);");
+    break;
+  case 5:
+    query = "get_refunds_by_coin_and_contract-v-broken";
+    xparams = params5;
+    PREPARE (pg,
+             query,
+             "SELECT"
+             " amount_with_fee_val"
+             ",amount_with_fee_frac"
+             ",coin_pub"
+             ",deposit_serial_id"
+             " FROM refunds"
+             " WHERE coin_pub=$1;");
+    break;
+  case 8:
+    query = "get_refunds_by_coin_and_contract-v8";
+    PREPARE (pg,
+             query,
+             "WITH"
+             " rc AS MATERIALIZED("
+             "  SELECT"
+             "   amount_with_fee_val"
+             "  ,amount_with_fee_frac"
+             "  ,coin_pub"
+             "  ,deposit_serial_id"
+             "  FROM refunds"
+             "  WHERE coin_pub=$1),"
+             " dep AS MATERIALIZED("
+             "  SELECT"
+             "   deposit_serial_id"
+             "  FROM deposits"
+             "  WHERE coin_pub = $1"
+             "    AND merchant_pub = $2"
+             "    AND h_contract_terms = $3"
+             ")"
+             "SELECT"
+             "   rc.amount_with_fee_val"
+             "  ,rc.amount_with_fee_frac"
+             "  FROM "
+             "  rc JOIN dep USING (deposit_serial_id);");
+    break;
+  case 9:
+    query = "get_refunds_by_coin_and_contract-v9-broken";
+    PREPARE (pg,
+             query,
+             "SELECT"
+             "   ref.amount_with_fee_val"
+             "  ,ref.amount_with_fee_frac"
+             " FROM deposits dep"
+             " JOIN refunds ref USING(deposit_serial_id)"
+             " WHERE dep.coin_pub IN ("
+             "   SELECT coin_pub"
+             "     FROM refunds"
+             "    WHERE coin_pub=$1)"
+             "  AND merchant_pub = $2"
+             "  AND h_contract_terms = $3;");
+    break;
+  case 10:
+    query = "get_refunds_by_coin_and_contract-v10-broken";
+    PREPARE (pg,
+             query,
+             "SELECT"
+             " *"
+             " FROM"
+             " exchange_do_refund_by_coin"
+             " ($1, $2, $3) "
+             " AS (amount_with_fee_val INT8, amount_with_fee_frac INT4);");
+    break;
+  default:
+    GNUNET_break (0);
+    return GNUNET_DB_STATUS_HARD_ERROR;
   }
+
   qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn,
-                                             
"get_refunds_by_coin_and_contract",
-                                             params,
+                                             query,
+                                             xparams,
                                              &get_refunds_cb,
                                              &srctx);
   if (GNUNET_SYSERR == srctx.status)
diff --git a/src/exchangedb/procedures.sql.in b/src/exchangedb/procedures.sql.in
index 73b75af2..ef6341a1 100644
--- a/src/exchangedb/procedures.sql.in
+++ b/src/exchangedb/procedures.sql.in
@@ -44,5 +44,7 @@ SET search_path TO exchange;
 #include "exchange_do_batch2_reserves_in_insert.sql"
 #include "exchange_do_batch4_reserves_in_insert.sql"
 #include "exchange_do_batch8_reserves_in_insert.sql"
+#include "exchange_do_refund_by_coin.sql"
+#include "exchange_do_get_ready_deposit.sql"
 
 COMMIT;
diff --git a/src/exchangedb/test_exchangedb_populate_link_data.c 
b/src/exchangedb/test_exchangedb_populate_link_data.c
index ff294874..1323f3b3 100644
--- a/src/exchangedb/test_exchangedb_populate_link_data.c
+++ b/src/exchangedb/test_exchangedb_populate_link_data.c
@@ -24,14 +24,6 @@
 #include "taler_exchangedb_plugin.h"
 #include "math.h"
 
-
-#define NUM_ROWS 1000
-
-/**
- * Global result from the testcase.
- */
-static int result;
-
 /**
  * Report line of error if @a cond is true, and jump to label "drop".
  */
@@ -55,22 +47,10 @@ static int result;
 #define ZR_BLK(ptr) \
   memset (ptr, 0, sizeof (*ptr))
 
-
-/**
- * Currency we use.  Must match test-exchange-db-*.conf.
- */
 #define CURRENCY "EUR"
-
-/**
- * How big do we make the RSA keys?
- */
 #define RSA_KEY_SIZE 1024
-static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
-
-static struct TALER_TransferPrivateKeyP tprivs[TALER_CNC_KAPPA];
-
-static struct TALER_TransferPublicKeyP tpub;
 #define ROUNDS 10
+#define NUM_ROWS 1000
 #define MELT_NEW_COINS 5
 #define MELT_NOREVEAL_INDEX 1
 /**
@@ -82,7 +62,10 @@ static struct TALER_DenomFeeSet fees;
  * Denomination keys used for fresh coins in melt test.
  */
 static struct DenomKeyPair **new_dkp;
-
+static int result;
+static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
+static struct TALER_TransferPrivateKeyP tprivs[TALER_CNC_KAPPA];
+static struct TALER_TransferPublicKeyP tpub;
 struct DenomKeyPair
 {
   struct TALER_DenominationPrivateKey priv;
@@ -222,8 +205,6 @@ handle_link_data_cb (void *cls,
   }
 }
 
-
-
 /**
  * Main function that will be run by the scheduler.
  *
diff --git a/src/exchangedb/test_exchangedb_populate_ready_deposit.c 
b/src/exchangedb/test_exchangedb_populate_ready_deposit.c
index 49b1bf5d..97273fc9 100644
--- a/src/exchangedb/test_exchangedb_populate_ready_deposit.c
+++ b/src/exchangedb/test_exchangedb_populate_ready_deposit.c
@@ -24,9 +24,6 @@
 #include "taler_exchangedb_plugin.h"
 #include "math.h"
 
-
-#define NUM_ROWS 1000
-
 /**
  * Global result from the testcase.
  */
@@ -55,20 +52,13 @@ static int result;
 #define ZR_BLK(ptr) \
   memset (ptr, 0, sizeof (*ptr))
 
-
 /**
  * Currency we use.  Must match test-exchange-db-*.conf.
  */
 #define CURRENCY "EUR"
-
-/**
- * How big do we make the RSA keys?
- */
 #define RSA_KEY_SIZE 1024
-static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
-
-
-#define ROUNDS 100
+#define NUM_ROWS 1000000
+#define ROUNDS 10000
 #define MELT_NEW_COINS 5
 #define MELT_NOREVEAL_INDEX 1
 /**
@@ -81,7 +71,7 @@ static struct TALER_MerchantWireHashP h_wire_wt;
  * Denomination keys used for fresh coins in melt test.
  */
 static struct DenomKeyPair **new_dkp;
-
+static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
 struct DenomKeyPair
 {
   struct TALER_DenominationPrivateKey priv;
@@ -389,7 +379,6 @@ run (void *cls)
                                      &nonce_ok,
                                      &ruuid));
       }
-
       {
         /* ENSURE_COIN_KNOWN */
         uint64_t known_coin_id;
@@ -408,23 +397,23 @@ run (void *cls)
         refresh.noreveal_index = MELT_NOREVEAL_INDEX;
       }
         /*STORE INTO DEPOSIT*/
-        {
-          struct GNUNET_TIME_Timestamp now;
-          now = GNUNET_TIME_timestamp_get ();
-          FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
-                  plugin->insert_deposit (plugin->cls,
-                                          now,
-                                          &depos[i]));
-        }
-        if (ROUNDS == i)
-          TALER_denom_sig_free (&depos[i].coin.denom_sig);
+      {
+        struct GNUNET_TIME_Timestamp now;
+        now = GNUNET_TIME_timestamp_get ();
+        FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
+                plugin->insert_deposit (plugin->cls,
+                                        now,
+                                        &depos[i]));
+      }
+      if (ROUNDS == i)
+        TALER_denom_sig_free (&depos[i].coin.denom_sig);
     }
   /* End of benchmark setup */
   GNUNET_free(perm);
   // commit
   FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS !=
           plugin->commit (plugin->cls));
-  /**** CALL GET LINK DATA ****/
+  /**** CALL GET READY DEPOSIT ****/
   for (unsigned int r=0; r< ROUNDS; r++)
   {
     struct GNUNET_TIME_Absolute time;
diff --git a/src/exchangedb/test_exchangedb_populate_table.c 
b/src/exchangedb/test_exchangedb_populate_select_refunds_by_coin.c
similarity index 87%
rename from src/exchangedb/test_exchangedb_populate_table.c
rename to src/exchangedb/test_exchangedb_populate_select_refunds_by_coin.c
index face454f..c094b204 100644
--- a/src/exchangedb/test_exchangedb_populate_table.c
+++ b/src/exchangedb/test_exchangedb_populate_select_refunds_by_coin.c
@@ -24,8 +24,6 @@
 #include "taler_exchangedb_plugin.h"
 #include "math.h"
 
-#define NUM_ROWS 10000
-
 /**
  * Global result from the testcase.
  */
@@ -41,7 +39,6 @@ static int result;
     goto drop;                                  \
   } while (0)
 
-
 /**
  * Initializes @a ptr with random data.
  */
@@ -54,16 +51,13 @@ static int result;
 #define ZR_BLK(ptr) \
   memset (ptr, 0, sizeof (*ptr))
 
-
 /**
  * Currency we use.  Must match test-exchange-db-*.conf.
  */
 #define CURRENCY "EUR"
-/**
- * How big do we make the RSA keys?
- */
 #define RSA_KEY_SIZE 1024
-#define ROUNDS 1000
+#define ROUNDS 10000
+#define NUM_ROWS 1000000
 #define MELT_NEW_COINS 5
 #define MELT_NOREVEAL_INDEX 1
 /**
@@ -72,14 +66,14 @@ static int result;
 static struct TALER_EXCHANGEDB_Plugin *plugin;
 static struct TALER_DenomFeeSet fees;
 static struct TALER_MerchantWireHashP h_wire_wt;
-
+static struct DenomKeyPair **new_dkp;
+static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
 struct DenomKeyPair
 {
   struct TALER_DenominationPrivateKey priv;
   struct TALER_DenominationPublicKey pub;
 };
-static struct DenomKeyPair **new_dkp;
-static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
+
 /**
  * Destroy a denomination key pair.  The key is not necessarily removed from 
the DB.
  *
@@ -185,7 +179,6 @@ check_refund_cb (void *cls,
                  const struct TALER_Amount *amount_with_fee)
 {
   const struct TALER_EXCHANGEDB_Refund *refund = cls;
-
   if (0 != TALER_amount_cmp (amount_with_fee,
                              &refund->details.refund_amount))
   {
@@ -207,7 +200,6 @@ run (void *cls)
 {
   struct GNUNET_CONFIGURATION_Handle *cfg = cls;
   const uint32_t num_partitions = 10;
-  struct DenomKeyPair *dkp = NULL;
   struct GNUNET_TIME_Timestamp ts;
   struct TALER_EXCHANGEDB_Deposit *depos=NULL;
   struct GNUNET_TIME_Timestamp deadline;
@@ -226,6 +218,8 @@ run (void *cls)
   struct TALER_CoinSpendPublicKeyP coin_pub;
   struct TALER_EXCHANGEDB_RefreshRevealedCoin *ccoin;
   struct TALER_DenominationPublicKey *new_denom_pubs = NULL;
+  unsigned int count=0;
+
   ref = GNUNET_new_array (ROUNDS +1,
                           struct TALER_EXCHANGEDB_Refund);
   depos = GNUNET_new_array (ROUNDS +1,
@@ -400,18 +394,72 @@ run (void *cls)
                                       now,
                                       &depos[i]));
     }
-
-    /* 100% Refund */
     {
       bool not_found;
       bool refund_ok;
       bool gone;
       bool conflict;
-      ref[i].coin = depos[i].coin;
-      ref[i].details.merchant_pub = depos[i].merchant_pub;
+      unsigned int refund_percent=0;
+      switch (refund_percent){
+      case 2 ://100% refund
+        ref[i].coin = depos[i].coin;
+        ref[i].details.merchant_pub = depos[i].merchant_pub;
+        RND_BLK(&ref[i].details.merchant_sig);
+        ref[i].details.h_contract_terms = depos[i].h_contract_terms;
+        ref[i].coin.coin_pub = depos[i].coin.coin_pub;
+        ref[i].details.rtransaction_id = i;
+        ref[i].details.refund_amount = value;
+        ref[i].details.refund_fee = fees.refund;
+        FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
+                plugin->do_refund (plugin->cls,
+                                   &ref[i],
+                                   &fees.deposit,
+                                   known_coin_id,
+                                   &not_found,
+                                   &refund_ok,
+                                   &gone,
+                                   &conflict));
+        break;
+    case 1 ://10% refund
+      if (count < (NUM_ROWS/10))
+      {
+        ref[i].coin = depos[i].coin;
+        ref[i].details.merchant_pub = depos[i].merchant_pub;
+        RND_BLK(&ref[i].details.merchant_sig);
+        ref[i].details.h_contract_terms = depos[i].h_contract_terms;
+        ref[i].coin.coin_pub = depos[i].coin.coin_pub;
+        ref[i].details.rtransaction_id = i;
+        ref[i].details.refund_amount = value;
+        ref[i].details.refund_fee = fees.refund;
+      }
+      else
+      {
+        ref[i].coin = depos[i].coin;
+        RND_BLK(&ref[i].details.merchant_pub);
+        RND_BLK(&ref[i].details.merchant_sig);
+        RND_BLK(&ref[i].details.h_contract_terms);
+        RND_BLK(&ref[i].coin.coin_pub);
+        ref[i].details.rtransaction_id = i;
+        ref[i].details.refund_amount = value;
+        ref[i].details.refund_fee = fees.refund;
+      }
+      FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
+              plugin->do_refund (plugin->cls,
+                                 &ref[i],
+                                 &fees.deposit,
+                                 known_coin_id,
+                                 &not_found,
+                                 &refund_ok,
+                                 &gone,
+                                 &conflict));
+      count++;
+      break;
+    case 0://no refund
+      ref[i].coin=depos[i].coin;
+      RND_BLK(&ref[i].details.merchant_pub);
       RND_BLK(&ref[i].details.merchant_sig);
-      ref[i].details.h_contract_terms = depos[i].h_contract_terms;
-      ref[i].coin.coin_pub = depos[i].coin.coin_pub;
+      RND_BLK(&ref[i].details.h_contract_terms);
+      RND_BLK(&ref[i].coin.coin_pub);
       ref[i].details.rtransaction_id = i;
       ref[i].details.refund_amount = value;
       ref[i].details.refund_fee = fees.refund;
@@ -424,10 +472,8 @@ run (void *cls)
                                  &refund_ok,
                                  &gone,
                                  &conflict));
-
-      /*      FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
-              plugin->insert_refund (plugin->cls,
-              &ref[i]));*/
+        break;
+      }/* END OF SWITCH CASE */
     }
     if (ROUNDS == i)
       TALER_denom_sig_free (&depos[i].coin.denom_sig);
@@ -443,7 +489,7 @@ run (void *cls)
     struct GNUNET_TIME_Relative duration;
 
     time = GNUNET_TIME_absolute_get ();
-    FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
+    FAILIF (0 >
             plugin->select_refunds_by_coin (plugin->cls,
                                             &ref[r].coin.coin_pub,
                                             &ref[r].details.merchant_pub,
@@ -476,10 +522,8 @@ run (void *cls)
   result = 0;
 drop:
   GNUNET_break (GNUNET_OK ==
-  plugin->drop_tables (plugin->cls));
+                plugin->drop_tables (plugin->cls));
 cleanup:
-  if (NULL != dkp)
-    destroy_denom_key_pair (dkp);
   if (NULL != revealed_coins)
   {
     for (unsigned int cnt = 0; cnt < MELT_NEW_COINS; cnt++)
@@ -502,7 +546,6 @@ cleanup:
     }
   GNUNET_free(depos);
   GNUNET_free(ref);
-  dkp = NULL;
   TALER_EXCHANGEDB_plugin_unload (plugin);
   plugin = NULL;
 }

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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