gnunet-svn
[Top][All Lists]
Advanced

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

[taler-exchange] 01/03: FAILING attempt to make echange.reserve use tale


From: gnunet
Subject: [taler-exchange] 01/03: FAILING attempt to make echange.reserve use taler_amount
Date: Fri, 28 Jul 2023 23:29:28 +0200

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

oec pushed a commit to branch master
in repository exchange.

commit a1dae0199f3bc3e9f66fc1375c652c6f99b26b2c
Author: Özgür Kesim <oec-taler@kesim.org>
AuthorDate: Fri Jul 28 19:01:57 2023 +0200

    FAILING attempt to make echange.reserve use taler_amount
    
    Fails with
    
    > TALER_PREFIX=/usr/local ./test-exchangedb-postgres
    2023-07-28T19:02:25.150845+0200 
/home/oec/projects/taler/exchange/src/exchangedb/.libs/test-exchangedb-postgres-2559159
 WARNING Could not run PSQL on file 
/usr/local/share/taler//sql/exchange/drop.sql: psql exit code was 3
    2023-07-28T19:02:32.488085+0200 pq-2559159 ERROR Query `call_withdraw' 
failed with result: invalid input syntax for type bigint:
    "(1,1000)"/(null)/ERROR:  invalid input syntax for type bigint: "(1,1000)"
    CONTEXT:  PL/pgSQL function 
exchange_do_withdraw(bytea,taler_amount,bytea,bytea,bytea,bytea,bytea,bigint,bigint,boolean)
 line 23 at SQL statement
    /PGRES_FATAL_ERROR/ERROR:  invalid input syntax for type bigint: "(1,1000)"
    CONTEXT:  PL/pgSQL function 
exchange_do_withdraw(bytea,taler_amount,bytea,bytea,bytea,bytea,bytea,bigint,bigint,boolean)
 line 23 at SQL statement
    2023-07-28T19:02:32.488146+0200 
/home/oec/projects/taler/exchange/src/exchangedb/.libs/test-exchangedb-postgres-2559159
 ERROR Assertion failed at test_exchangedb.c:1428.
---
 src/exchangedb/0002-reserves.sql                   |   8 +-
 src/exchangedb/exchange_do_age_withdraw.sql        |   6 +-
 .../exchange_do_batch_reserves_update.sql          |  15 +-
 src/exchangedb/exchange_do_batch_withdraw.sql      |  37 +++--
 src/exchangedb/exchange_do_gc.sql                  |   9 +-
 src/exchangedb/exchange_do_history_request.sql     |  14 +-
 src/exchangedb/exchange_do_purse_deposit.sql       |  27 ++--
 src/exchangedb/exchange_do_purse_merge.sql         |  35 ++---
 src/exchangedb/exchange_do_recoup_to_reserve.sql   |  22 ++-
 src/exchangedb/exchange_do_reserve_open.sql        |  96 +++++-------
 src/exchangedb/exchange_do_reserve_purse.sql       |  23 ++-
 src/exchangedb/exchange_do_reserves_in_insert.sql  | 162 ++++++++-------------
 src/exchangedb/exchange_do_withdraw.sql            |  41 +++---
 src/exchangedb/pg_do_batch_withdraw_insert.c       |   5 +-
 src/exchangedb/pg_do_withdraw.c                    |   5 +-
 src/exchangedb/pg_get_expired_reserves.c           |  10 +-
 src/exchangedb/pg_get_reserve_balance.c            |   8 +-
 src/exchangedb/pg_reserves_get.c                   |   8 +-
 src/exchangedb/pg_reserves_in_insert.c             |  16 +-
 src/exchangedb/pg_reserves_update.c                |   8 +-
 src/exchangedb/pg_select_reserve_close_info.c      |   8 +-
 src/exchangedb/plugin_exchangedb_postgres.c        |  14 +-
 22 files changed, 245 insertions(+), 332 deletions(-)

diff --git a/src/exchangedb/0002-reserves.sql b/src/exchangedb/0002-reserves.sql
index 3d345afd..3e836133 100644
--- a/src/exchangedb/0002-reserves.sql
+++ b/src/exchangedb/0002-reserves.sql
@@ -27,8 +27,7 @@ BEGIN
     'CREATE TABLE %I'
       '(reserve_uuid BIGINT GENERATED BY DEFAULT AS IDENTITY'
       ',reserve_pub BYTEA PRIMARY KEY CHECK(LENGTH(reserve_pub)=32)'
-      ',current_balance_val INT8 NOT NULL DEFAULT(0)'
-      ',current_balance_frac INT4 NOT NULL DEFAULT(0)'
+      ',current_balance taler_amount NOT NULL DEFAULT (0, 0)'
       ',purses_active INT8 NOT NULL DEFAULT(0)'
       ',purses_allowed INT8 NOT NULL DEFAULT(0)'
       ',birthday INT4 NOT NULL DEFAULT(0)'
@@ -52,7 +51,7 @@ BEGIN
   );
   PERFORM comment_partitioned_column(
      'Current balance remaining with the reserve.'
-    ,'current_balance_val'
+    ,'current_balance'
     ,table_name
     ,partition_suffix
   );
@@ -109,8 +108,7 @@ BEGIN
     'CREATE INDEX ' || table_name || '_by_expiration_index '
     'ON ' || table_name || ' '
     '(expiration_date'
-    ',current_balance_val'
-    ',current_balance_frac'
+    ',current_balance'
     ');'
   );
   EXECUTE FORMAT (
diff --git a/src/exchangedb/exchange_do_age_withdraw.sql 
b/src/exchangedb/exchange_do_age_withdraw.sql
index ce257a8d..756c0085 100644
--- a/src/exchangedb/exchange_do_age_withdraw.sql
+++ b/src/exchangedb/exchange_do_age_withdraw.sql
@@ -50,8 +50,7 @@ BEGIN
 --         wire_targets by wire_target_h_payto
 
 SELECT
-   current_balance_val
-  ,current_balance_frac
+   current_balance
   ,gc_date
   ,birthday
  INTO
@@ -126,8 +125,7 @@ min_reserve_gc=GREATEST(min_reserve_gc,reserve_gc);
 -- Update reserve balance.
 UPDATE reserves SET
   gc_date=min_reserve_gc
- ,current_balance_val=new_balance.val
- ,current_balance_frac=new_balance.frac
+ ,current_balance=new_balance
 WHERE
   reserves.reserve_pub=rpub;
 
diff --git a/src/exchangedb/exchange_do_batch_reserves_update.sql 
b/src/exchangedb/exchange_do_batch_reserves_update.sql
index 39920629..da7f4508 100644
--- a/src/exchangedb/exchange_do_batch_reserves_update.sql
+++ b/src/exchangedb/exchange_do_batch_reserves_update.sql
@@ -18,8 +18,7 @@ CREATE OR REPLACE FUNCTION exchange_do_batch_reserves_update(
   IN in_reserve_pub BYTEA,
   IN in_expiration_date INT8,
   IN in_wire_ref INT8,
-  IN in_credit_val INT8,
-  IN in_credit_frac INT4,
+  IN in_credit taler_amount,
   IN in_exchange_account_name VARCHAR,
   IN in_wire_source_h_payto BYTEA,
   IN in_notify text,
@@ -38,8 +37,8 @@ BEGIN
     VALUES
     (in_reserve_pub
     ,in_wire_ref
-    ,in_credit_val
-    ,in_credit_frac
+    ,in_credit.val
+    ,in_credit.frac
     ,in_exchange_account_name
     ,in_wire_source_h_payto
     ,in_expiration_date)
@@ -50,15 +49,15 @@ BEGIN
     out_duplicate = FALSE;
     UPDATE reserves
       SET
-         current_balance_frac = current_balance_frac+in_credit_frac
+         current_balance.frac = current_balance.frac+in_credit.frac
            - CASE
-             WHEN current_balance_frac + in_credit_frac >= 100000000
+             WHEN current_balance.frac + in_credit.frac >= 100000000
                THEN 100000000
              ELSE 1
              END
-            ,current_balance_val = current_balance_val+in_credit_val
+            ,current_balance.val = current_balance.val+in_credit.val
            + CASE
-             WHEN current_balance_frac + in_credit_frac >= 100000000
+             WHEN current_balance.frac + in_credit.frac >= 100000000
                THEN 1
              ELSE 0
              END
diff --git a/src/exchangedb/exchange_do_batch_withdraw.sql 
b/src/exchangedb/exchange_do_batch_withdraw.sql
index 53e90844..ba364dda 100644
--- a/src/exchangedb/exchange_do_batch_withdraw.sql
+++ b/src/exchangedb/exchange_do_batch_withdraw.sql
@@ -17,8 +17,7 @@
 -- @author Özgür Kesim
 
 CREATE OR REPLACE FUNCTION exchange_do_batch_withdraw(
-  IN amount_val INT8,
-  IN amount_frac INT4,
+  IN amount taler_amount,
   IN rpub BYTEA,
   IN now INT8,
   IN min_reserve_gc INT8,
@@ -32,8 +31,7 @@ LANGUAGE plpgsql
 AS $$
 DECLARE
   reserve_gc INT8;
-  reserve_val INT8;
-  reserve_frac INT4;
+  reserve taler_amount;
   reserve_birthday INT4;
   not_before date;
 BEGIN
@@ -45,14 +43,14 @@ BEGIN
 
 
 SELECT
-   current_balance_val
-  ,current_balance_frac
+   current_balance.val
+  ,current_balance.frac
   ,gc_date
   ,birthday
   ,reserve_uuid
  INTO
-   reserve_val
-  ,reserve_frac
+   reserve.val
+  ,reserve.frac
   ,reserve_gc
   ,reserve_birthday
   ,ruuid
@@ -92,21 +90,21 @@ ELSE
 END IF;
 
 -- Check reserve balance is sufficient.
-IF (reserve_val > amount_val)
+IF (reserve.val > amount.val)
 THEN
-  IF (reserve_frac >= amount_frac)
+  IF (reserve.frac >= amount.frac)
   THEN
-    reserve_val=reserve_val - amount_val;
-    reserve_frac=reserve_frac - amount_frac;
+    reserve.val=reserve.val - amount.val;
+    reserve.frac=reserve.frac - amount.frac;
   ELSE
-    reserve_val=reserve_val - amount_val - 1;
-    reserve_frac=reserve_frac + 100000000 - amount_frac;
+    reserve.val=reserve.val - amount.val - 1;
+    reserve.frac=reserve.frac + 100000000 - amount.frac;
   END IF;
 ELSE
-  IF (reserve_val = amount_val) AND (reserve_frac >= amount_frac)
+  IF (reserve.val = amount.val) AND (reserve.frac >= amount.frac)
   THEN
-    reserve_val=0;
-    reserve_frac=reserve_frac - amount_frac;
+    reserve.val=0;
+    reserve.frac=reserve.frac - amount.frac;
   ELSE
     balance_ok=FALSE;
     RETURN;
@@ -119,8 +117,7 @@ min_reserve_gc=GREATEST(min_reserve_gc,reserve_gc);
 -- Update reserve balance.
 UPDATE reserves SET
   gc_date=min_reserve_gc
- ,current_balance_val=reserve_val
- ,current_balance_frac=reserve_frac
+ ,current_balance=reserve
 WHERE
   reserves.reserve_pub=rpub;
 
@@ -129,6 +126,6 @@ balance_ok=TRUE;
 
 END $$;
 
-COMMENT ON FUNCTION exchange_do_batch_withdraw(INT8, INT4, BYTEA, INT8, INT8, 
BOOLEAN)
+COMMENT ON FUNCTION exchange_do_batch_withdraw(taler_amount, BYTEA, INT8, 
INT8, BOOLEAN)
   IS 'Checks whether the reserve has sufficient balance for a withdraw 
operation (or the request is repeated and was previously approved) and that age 
requirements are formally met. If so updates the database with the result. 
Excludes storing the planchets.';
 
diff --git a/src/exchangedb/exchange_do_gc.sql 
b/src/exchangedb/exchange_do_gc.sql
index c6331c18..07cbeb42 100644
--- a/src/exchangedb/exchange_do_gc.sql
+++ b/src/exchangedb/exchange_do_gc.sql
@@ -21,15 +21,10 @@ LANGUAGE plpgsql
 AS $$
 DECLARE
   reserve_uuid_min INT8; -- minimum reserve UUID still alive
-DECLARE
   melt_min INT8; -- minimum melt still alive
-DECLARE
   coin_min INT8; -- minimum known_coin still alive
-DECLARE
   deposit_min INT8; -- minimum deposit still alive
-DECLARE
   reserve_out_min INT8; -- minimum reserve_out still alive
-DECLARE
   denom_min INT8; -- minimum denomination still alive
 BEGIN
 
@@ -42,8 +37,8 @@ DELETE FROM exchange.wire_fee
 -- TODO: use closing fee as threshold?
 DELETE FROM exchange.reserves
   WHERE gc_date < in_now
-    AND current_balance_val = 0
-    AND current_balance_frac = 0;
+    AND current_balance.val = 0
+    AND current_balance.frac = 0;
 
 SELECT
      reserve_out_serial_id
diff --git a/src/exchangedb/exchange_do_history_request.sql 
b/src/exchangedb/exchange_do_history_request.sql
index 2f604174..7eb368ef 100644
--- a/src/exchangedb/exchange_do_history_request.sql
+++ b/src/exchangedb/exchange_do_history_request.sql
@@ -54,23 +54,23 @@ BEGIN
   -- Update reserve balance.
   UPDATE exchange.reserves
    SET
-    current_balance_frac=current_balance_frac-in_history_fee_frac
+    current_balance.frac=current_balance.frac-in_history_fee_frac
        + CASE
-         WHEN current_balance_frac < in_history_fee_frac
+         WHEN current_balance.frac < in_history_fee_frac
          THEN 100000000
          ELSE 0
          END,
-    current_balance_val=current_balance_val-in_history_fee_val
+    current_balance.val=current_balance.val-in_history_fee_val
        - CASE
-         WHEN current_balance_frac < in_history_fee_frac
+         WHEN current_balance.frac < in_history_fee_frac
          THEN 1
          ELSE 0
          END
   WHERE
     reserve_pub=in_reserve_pub
-    AND ( (current_balance_val > in_history_fee_val) OR
-          ( (current_balance_frac >= in_history_fee_frac) AND
-            (current_balance_val >= in_history_fee_val) ) );
+    AND ( (current_balance.val > in_history_fee_val) OR
+          ( (current_balance.frac >= in_history_fee_frac) AND
+            (current_balance.val >= in_history_fee_val) ) );
 
   IF NOT FOUND
   THEN
diff --git a/src/exchangedb/exchange_do_purse_deposit.sql 
b/src/exchangedb/exchange_do_purse_deposit.sql
index d710e900..5e9f71bb 100644
--- a/src/exchangedb/exchange_do_purse_deposit.sql
+++ b/src/exchangedb/exchange_do_purse_deposit.sql
@@ -32,17 +32,10 @@ LANGUAGE plpgsql
 AS $$
 DECLARE
   was_merged BOOLEAN;
-DECLARE
   psi INT8; -- partner's serial ID (set if merged)
-DECLARE
-  my_amount_val INT8; -- total in purse
-DECLARE
-  my_amount_frac INT4; -- total in purse
-DECLARE
+  my_amount taler_amount; -- total in purse
   was_paid BOOLEAN;
-DECLARE
   my_in_reserve_quota BOOLEAN;
-DECLARE
   my_reserve_pub BYTEA;
 BEGIN
 
@@ -174,8 +167,8 @@ SELECT
    ,amount_with_fee_frac
    ,in_reserve_quota
   INTO
-    my_amount_val
-   ,my_amount_frac
+    my_amount.val
+   ,my_amount.frac
    ,my_in_reserve_quota
   FROM exchange.purse_requests
   WHERE (purse_pub=in_purse_pub)
@@ -231,14 +224,12 @@ ELSE
   -- This is a local reserve, update balance immediately.
   INSERT INTO reserves
     (reserve_pub
-    ,current_balance_frac
-    ,current_balance_val
+    ,current_balance
     ,expiration_date
     ,gc_date)
   VALUES
     (my_reserve_pub
-    ,my_amount_frac
-    ,my_amount_val
+    ,my_amount
     ,in_reserve_expiration
     ,in_reserve_expiration)
   ON CONFLICT DO NOTHING;
@@ -248,15 +239,15 @@ ELSE
     -- Reserve existed, thus UPDATE instead of INSERT.
     UPDATE reserves
       SET
-       current_balance_frac=current_balance_frac+my_amount_frac
+       current_balance.frac=current_balance.frac+my_amount.frac
         - CASE
-          WHEN current_balance_frac + my_amount_frac >= 100000000
+          WHEN current_balance.frac + my_amount.frac >= 100000000
             THEN 100000000
           ELSE 0
           END
-      ,current_balance_val=current_balance_val+my_amount_val
+      ,current_balance.val=current.balance_val+my_amount.val
         + CASE
-          WHEN current_balance_frac + my_amount_frac >= 100000000
+          WHEN current_balance.frac + my_amount.frac >= 100000000
             THEN 1
           ELSE 0
           END
diff --git a/src/exchangedb/exchange_do_purse_merge.sql 
b/src/exchangedb/exchange_do_purse_merge.sql
index f02dd5dc..85bae999 100644
--- a/src/exchangedb/exchange_do_purse_merge.sql
+++ b/src/exchangedb/exchange_do_purse_merge.sql
@@ -29,16 +29,9 @@ CREATE OR REPLACE FUNCTION exchange_do_purse_merge(
 LANGUAGE plpgsql
 AS $$
 DECLARE
-  my_amount_val INT8;
-DECLARE
-  my_amount_frac INT4;
-DECLARE
-  my_purse_fee_val INT8;
-DECLARE
-  my_purse_fee_frac INT4;
-DECLARE
+  my_amount taler_amount;
+  my_purse_fee taler_amount;
   my_partner_serial_id INT8;
-DECLARE
   my_in_reserve_quota BOOLEAN;
 BEGIN
 
@@ -72,10 +65,10 @@ SELECT amount_with_fee_val
       ,purse_fee_val
       ,purse_fee_frac
       ,in_reserve_quota
-  INTO my_amount_val
-      ,my_amount_frac
-      ,my_purse_fee_val
-      ,my_purse_fee_frac
+  INTO my_amount.val
+      ,my_amount.frac
+      ,my_purse_fee.val
+      ,my_purse_fee.frac
       ,my_in_reserve_quota
   FROM exchange.purse_requests
   WHERE purse_pub=in_purse_pub
@@ -196,23 +189,23 @@ ELSE
   -- This is a local reserve, update reserve balance immediately.
 
   -- Refund the purse fee, by adding it to the purse value:
-  my_amount_val = my_amount_val + my_purse_fee_val;
-  my_amount_frac = my_amount_frac + my_purse_fee_frac;
+  my_amount.val = my_amount.val + my_purse_fee.val;
+  my_amount.frac = my_amount.frac + my_purse_fee.frac;
   -- normalize result
-  my_amount_val = my_amount_val + my_amount_frac / 100000000;
-  my_amount_frac = my_amount_frac % 100000000;
+  my_amount.val = my_amount.val + my_amount.frac / 100000000;
+  my_amount.frac = my_amount.frac % 100000000;
 
   UPDATE exchange.reserves
   SET
-    current_balance_frac=current_balance_frac+my_amount_frac
+    current_balance.frac=current_balance.frac+my_amount.frac
        - CASE
-         WHEN current_balance_frac + my_amount_frac >= 100000000
+         WHEN current_balance.frac + my_amount.frac >= 100000000
          THEN 100000000
          ELSE 0
          END,
-    current_balance_val=current_balance_val+my_amount_val
+    current_balance.val=current.balance_val+my.amount_val
        + CASE
-         WHEN current_balance_frac + my_amount_frac >= 100000000
+         WHEN current_balance.frac + my_amount.frac >= 100000000
          THEN 1
          ELSE 0
          END
diff --git a/src/exchangedb/exchange_do_recoup_to_reserve.sql 
b/src/exchangedb/exchange_do_recoup_to_reserve.sql
index 39baba8f..72942e8c 100644
--- a/src/exchangedb/exchange_do_recoup_to_reserve.sql
+++ b/src/exchangedb/exchange_do_recoup_to_reserve.sql
@@ -31,9 +31,7 @@ CREATE OR REPLACE FUNCTION exchange_do_recoup_to_reserve(
 LANGUAGE plpgsql
 AS $$
 DECLARE
-  tmp_val INT8; -- amount recouped
-DECLARE
-  tmp_frac INT8; -- amount recouped
+  tmp taler_amount; -- amount recouped
 BEGIN
 -- Shards: SELECT known_coins (by coin_pub)
 --         SELECT recoup      (by coin_pub)
@@ -49,8 +47,8 @@ SELECT
    remaining_frac
   ,remaining_val
  INTO
-   tmp_frac
-  ,tmp_val
+   tmp.frac
+  ,tmp.val
 FROM exchange.known_coins
   WHERE coin_pub=in_coin_pub;
 
@@ -61,7 +59,7 @@ THEN
   RETURN;
 END IF;
 
-IF tmp_val + tmp_frac = 0
+IF tmp.val + tmp.frac = 0
 THEN
   -- Check for idempotency
   SELECT
@@ -87,15 +85,15 @@ UPDATE known_coins
 -- Credit the reserve and update reserve timers.
 UPDATE reserves
   SET
-    current_balance_frac=current_balance_frac+tmp_frac
+    current_balance.frac=current_balance.frac+tmp.frac
        - CASE
-         WHEN current_balance_frac+tmp_frac >= 100000000
+         WHEN current_balance.frac+tmp.frac >= 100000000
          THEN 100000000
          ELSE 0
          END,
-    current_balance_val=current_balance_val+tmp_val
+    current_balance.val=current_balance.val+tmp.val
        + CASE
-         WHEN current_balance_frac+tmp_frac >= 100000000
+         WHEN current_balance.frac+tmp.frac >= 100000000
          THEN 1
          ELSE 0
          END,
@@ -126,8 +124,8 @@ VALUES
   (in_coin_pub
   ,in_coin_sig
   ,in_coin_blind
-  ,tmp_val
-  ,tmp_frac
+  ,tmp.val
+  ,tmp.frac
   ,in_recoup_timestamp
   ,in_reserve_out_serial_id);
 
diff --git a/src/exchangedb/exchange_do_reserve_open.sql 
b/src/exchangedb/exchange_do_reserve_open.sql
index 5e80f713..d97b4449 100644
--- a/src/exchangedb/exchange_do_reserve_open.sql
+++ b/src/exchangedb/exchange_do_reserve_open.sql
@@ -16,45 +16,29 @@
 
 CREATE OR REPLACE FUNCTION exchange_do_reserve_open(
   IN in_reserve_pub BYTEA,
-  IN in_total_paid_val INT8,
-  IN in_total_paid_frac INT4,
-  IN in_reserve_payment_val INT8,
-  IN in_reserve_payment_frac INT4,
+  IN in_total_paid taler_amount,
+  IN in_reserve_payment taler_amount,
   IN in_min_purse_limit INT4,
   IN in_default_purse_limit INT4,
   IN in_reserve_sig BYTEA,
   IN in_desired_expiration INT8,
   IN in_reserve_gc_delay INT8,
   IN in_now INT8,
-  IN in_open_fee_val INT8,
-  IN in_open_fee_frac INT4,
-  OUT out_open_cost_val INT8,
-  OUT out_open_cost_frac INT4,
+  IN in_open_fee taler_amount,
+  OUT out_open_cost taler_amount,
   OUT out_final_expiration INT8,
   OUT out_no_funds BOOLEAN)
 LANGUAGE plpgsql
 AS $$
 DECLARE
-  my_balance_val INT8;
-DECLARE
-  my_balance_frac INT4;
-DECLARE
-  my_cost_val INT8;
-DECLARE
+  my_balance taler_amount;
+  my_cost taler_amount;
   my_cost_tmp INT8;
-DECLARE
-  my_cost_frac INT4;
-DECLARE
   my_years_tmp INT4;
-DECLARE
   my_years INT4;
-DECLARE
   my_needs_update BOOL;
-DECLARE
   my_purses_allowed INT8;
-DECLARE
   my_expiration_date INT8;
-DECLARE
   my_reserve_expiration INT8;
 BEGIN
 
@@ -62,13 +46,13 @@ BEGIN
 SELECT
   purses_allowed
  ,expiration_date
- ,current_balance_val
- ,current_balance_frac
+ ,current_balance.val
+ ,current_balance.frac
 INTO
   my_purses_allowed
  ,my_reserve_expiration
- ,my_balance_val
- ,my_balance_frac
+ ,my_balance.val
+ ,my_balance.frac
 FROM reserves
 WHERE
   reserve_pub=in_reserve_pub;
@@ -88,8 +72,8 @@ ELSE
   my_expiration_date = my_reserve_expiration;
 END IF;
 
-my_cost_val = 0;
-my_cost_frac = 0;
+my_cost.val = 0;
+my_cost.frac = 0;
 my_needs_update = FALSE;
 my_years = 0;
 
@@ -115,19 +99,19 @@ END IF;
 -- Compute cost based on annual fees
 IF (my_years > 0)
 THEN
-  my_cost_val = my_years * in_open_fee_val;
-  my_cost_tmp = my_years * in_open_fee_frac / 100000000;
-  IF (CAST (my_cost_val + my_cost_tmp AS INT8) < my_cost_val)
+  my_cost.val = my_years * in_open_fee.val;
+  my_cost_tmp = my_years * in_open_fee.frac / 100000000;
+  IF (CAST (my_cost.val + my_cost_tmp AS INT8) < my_cost.val)
   THEN
-    out_open_cost_val=9223372036854775807;
-    out_open_cost_frac=2147483647;
+    out_open_cost.val=9223372036854775807;
+    out_open_cost.frac=2147483647;
     out_final_expiration=my_expiration_date;
     out_no_funds=FALSE;
     RAISE NOTICE 'arithmetic issue computing amount';
   RETURN;
   END IF;
-  my_cost_val = CAST (my_cost_val + my_cost_tmp AS INT8);
-  my_cost_frac = my_years * in_open_fee_frac % 100000000;
+  my_cost.val = CAST (my_cost.val + my_cost_tmp AS INT8);
+  my_cost.frac = my_years * in_open_fee.frac % 100000000;
   my_needs_update = TRUE;
 END IF;
 
@@ -135,20 +119,20 @@ END IF;
 IF NOT my_needs_update
 THEN
   out_final_expiration = my_reserve_expiration;
-  out_open_cost_val = 0;
-  out_open_cost_frac = 0;
+  out_open_cost.val = 0;
+  out_open_cost.frac = 0;
   out_no_funds=FALSE;
   RAISE NOTICE 'no change required';
   RETURN;
 END IF;
 
 -- Check payment (coins and reserve) would be sufficient.
-IF ( (in_total_paid_val < my_cost_val) OR
-     ( (in_total_paid_val = my_cost_val) AND
-       (in_total_paid_frac < my_cost_frac) ) )
+IF ( (in_total_paid.val < my_cost.val) OR
+     ( (in_total_paid.val = my_cost.val) AND
+       (in_total_paid.frac < my_cost.frac) ) )
 THEN
-  out_open_cost_val = my_cost_val;
-  out_open_cost_frac = my_cost_frac;
+  out_open_cost.val = my_cost.val;
+  out_open_cost.frac = my_cost.frac;
   out_no_funds=FALSE;
   -- We must return a failure, which is indicated by
   -- the expiration being below the desired expiration.
@@ -167,25 +151,25 @@ THEN
 END IF;
 
 -- Check reserve balance is sufficient.
-IF (my_balance_val > in_reserve_payment_val)
+IF (my_balance.val > in_reserve_payment.val)
 THEN
-  IF (my_balance_frac >= in_reserve_payment_frac)
+  IF (my_balance.frac >= in_reserve_payment.frac)
   THEN
-    my_balance_val=my_balance_val - in_reserve_payment_val;
-    my_balance_frac=my_balance_frac - in_reserve_payment_frac;
+    my_balance.val=my_balance.val - in_reserve_payment.val;
+    my_balance.frac=my_balance.frac - in_reserve_payment.frac;
   ELSE
-    my_balance_val=my_balance_val - in_reserve_payment_val - 1;
-    my_balance_frac=my_balance_frac + 100000000 - in_reserve_payment_frac;
+    my_balance.val=my_balance.val - in_reserve_payment.val - 1;
+    my_balance.frac=my_balance.frac + 100000000 - in_reserve_payment.frac;
   END IF;
 ELSE
-  IF (my_balance_val = in_reserve_payment_val) AND (my_balance_frac >= 
in_reserve_payment_frac)
+  IF (my_balance.val = in_reserve_payment.val) AND (my_balance.frac >= 
in_reserve_payment.frac)
   THEN
-    my_balance_val=0;
-    my_balance_frac=my_balance_frac - in_reserve_payment_frac;
+    my_balance.val=0;
+    my_balance.frac=my_balance.frac - in_reserve_payment.frac;
   ELSE
     out_final_expiration = my_reserve_expiration;
-    out_open_cost_val = my_cost_val;
-    out_open_cost_frac = my_cost_frac;
+    out_open_cost.val = my_cost.val;
+    out_open_cost.frac = my_cost.frac;
     out_no_funds=TRUE;
     RAISE NOTICE 'reserve balance too low';
   RETURN;
@@ -193,8 +177,7 @@ ELSE
 END IF;
 
 UPDATE reserves SET
-  current_balance_val=my_balance_val
- ,current_balance_frac=my_balance_frac
+  current_balance=my_balance
  ,gc_date=my_reserve_expiration + in_reserve_gc_delay
  ,expiration_date=my_expiration_date
  ,purses_allowed=my_purses_allowed
@@ -202,8 +185,7 @@ WHERE
  reserve_pub=in_reserve_pub;
 
 out_final_expiration=my_expiration_date;
-out_open_cost_val = my_cost_val;
-out_open_cost_frac = my_cost_frac;
+out_open_cost = my_cost;
 out_no_funds=FALSE;
 RETURN;
 
diff --git a/src/exchangedb/exchange_do_reserve_purse.sql 
b/src/exchangedb/exchange_do_reserve_purse.sql
index 0476e60d..abe5a749 100644
--- a/src/exchangedb/exchange_do_reserve_purse.sql
+++ b/src/exchangedb/exchange_do_reserve_purse.sql
@@ -22,8 +22,7 @@ CREATE OR REPLACE FUNCTION exchange_do_reserve_purse(
   IN in_reserve_gc INT8,
   IN in_reserve_sig BYTEA,
   IN in_reserve_quota BOOLEAN,
-  IN in_purse_fee_val INT8,
-  IN in_purse_fee_frac INT4,
+  IN in_purse_fee taler_amount,
   IN in_reserve_pub BYTEA,
   IN in_wallet_h_payto BYTEA,
   OUT out_no_funds BOOLEAN,
@@ -101,8 +100,8 @@ ELSE
   --  UPDATE reserves balance (and check if balance is enough to pay the fee)
   IF (out_no_reserve)
   THEN
-    IF ( (0 != in_purse_fee_val) OR
-         (0 != in_purse_fee_frac) )
+    IF ( (0 != in_purse_fee.val) OR
+         (0 != in_purse_fee.frac) )
     THEN
       out_no_funds=TRUE;
       RETURN;
@@ -118,22 +117,22 @@ ELSE
   ELSE
     UPDATE exchange.reserves
       SET
-        current_balance_frac=current_balance_frac-in_purse_fee_frac
+        current_balance.frac=current_balance.frac-in_purse_fee.frac
          + CASE
-         WHEN current_balance_frac < in_purse_fee_frac
+         WHEN current_balance.frac < in_purse_fee.frac
          THEN 100000000
          ELSE 0
          END,
-       current_balance_val=current_balance_val-in_purse_fee_val
+       current_balance.val=current_balance.val-in_purse_fee.val
          - CASE
-         WHEN current_balance_frac < in_purse_fee_frac
+         WHEN current_balance.frac < in_purse_fee.frac
          THEN 1
          ELSE 0
          END
       WHERE reserve_pub=in_reserve_pub
-        AND ( (current_balance_val > in_purse_fee_val) OR
-              ( (current_balance_frac >= in_purse_fee_frac) AND
-                (current_balance_val >= in_purse_fee_val) ) );
+        AND ( (current_balance.val > in_purse_fee.val) OR
+              ( (current_balance.frac >= in_purse_fee.frac) AND
+                (current_balance.val >= in_purse_fee.val) ) );
     IF NOT FOUND
     THEN
       out_no_funds=TRUE;
@@ -159,5 +158,5 @@ INSERT INTO exchange.account_merges
 
 END $$;
 
-COMMENT ON FUNCTION exchange_do_reserve_purse(BYTEA, BYTEA, INT8, INT8, INT8, 
BYTEA, BOOLEAN, INT8, INT4, BYTEA, BYTEA)
+COMMENT ON FUNCTION exchange_do_reserve_purse(BYTEA, BYTEA, INT8, INT8, INT8, 
BYTEA, BOOLEAN, taler_amount, BYTEA, BYTEA)
   IS 'Create a purse for a reserve.';
diff --git a/src/exchangedb/exchange_do_reserves_in_insert.sql 
b/src/exchangedb/exchange_do_reserves_in_insert.sql
index 26966a94..e7018e51 100644
--- a/src/exchangedb/exchange_do_reserves_in_insert.sql
+++ b/src/exchangedb/exchange_do_reserves_in_insert.sql
@@ -19,8 +19,7 @@ CREATE OR REPLACE FUNCTION 
exchange_do_batch_reserves_in_insert(
   IN in_reserve_expiration INT8,
   IN in_reserve_pub BYTEA,
   IN in_wire_ref INT8,
-  IN in_credit_val INT8,
-  IN in_credit_frac INT4,
+  IN in_credit taler_amount,
   IN in_exchange_account_name VARCHAR,
   IN in_execution_date INT8,
   IN in_wire_source_h_payto BYTEA,
@@ -42,14 +41,12 @@ BEGIN
 
   INSERT INTO reserves
     (reserve_pub
-    ,current_balance_val
-    ,current_balance_frac
+    ,current_balance
     ,expiration_date
     ,gc_date)
     VALUES
     (in_reserve_pub
-    ,in_credit_val
-    ,in_credit_frac
+    ,in_credit
     ,in_reserve_expiration
     ,in_gc_date)
   ON CONFLICT DO NOTHING
@@ -67,8 +64,8 @@ BEGIN
     VALUES
     (in_reserve_pub
     ,in_wire_ref
-    ,in_credit_val
-    ,in_credit_frac
+    ,in_credit.val
+    ,in_credit.frac
     ,in_exchange_account_name
     ,in_wire_source_h_payto
     ,in_execution_date)
@@ -90,8 +87,7 @@ CREATE OR REPLACE FUNCTION exchange_do_batch2_reserves_insert(
   IN in_reserve_expiration INT8,
   IN in0_reserve_pub BYTEA,
   IN in0_wire_ref INT8,
-  IN in0_credit_val INT8,
-  IN in0_credit_frac INT4,
+  IN in0_credit taler_amount,
   IN in0_exchange_account_name VARCHAR,
   IN in0_execution_date INT8,
   IN in0_wire_source_h_payto BYTEA,
@@ -99,8 +95,7 @@ CREATE OR REPLACE FUNCTION exchange_do_batch2_reserves_insert(
   IN in0_notify TEXT,
   IN in1_reserve_pub BYTEA,
   IN in1_wire_ref INT8,
-  IN in1_credit_val INT8,
-  IN in1_credit_frac INT4,
+  IN in1_credit taler_amount,
   IN in1_exchange_account_name VARCHAR,
   IN in1_execution_date INT8,
   IN in1_wire_source_h_payto BYTEA,
@@ -138,19 +133,16 @@ BEGIN
   WITH reserve_changes AS (
     INSERT INTO reserves
       (reserve_pub
-      ,current_balance_val
-      ,current_balance_frac
+      ,current_balance
       ,expiration_date
       ,gc_date)
       VALUES
       (in0_reserve_pub
-      ,in0_credit_val
-      ,in0_credit_frac
+      ,in0_credit
       ,in_reserve_expiration
       ,in_gc_date),
       (in1_reserve_pub
-      ,in1_credit_val
-      ,in1_credit_frac
+      ,in1_credit
       ,in_reserve_expiration
       ,in_gc_date)
     ON CONFLICT DO NOTHING
@@ -200,15 +192,15 @@ BEGIN
       VALUES
       (in0_reserve_pub
       ,in0_wire_ref
-      ,in0_credit_val
-      ,in0_credit_frac
+      ,in0_credit.val
+      ,in0_credit.frac
       ,in0_exchange_account_name
       ,in0_wire_source_h_payto
       ,in0_execution_date),
       (in1_reserve_pub
       ,in1_wire_ref
-      ,in1_credit_val
-      ,in1_credit_frac
+      ,in1_credit.val
+      ,in1_credit.frac
       ,in1_exchange_account_name
       ,in1_wire_source_h_payto
       ,in1_execution_date)
@@ -261,8 +253,7 @@ CREATE OR REPLACE FUNCTION 
exchange_do_batch4_reserves_insert(
   IN in_reserve_expiration INT8,
   IN in0_reserve_pub BYTEA,
   IN in0_wire_ref INT8,
-  IN in0_credit_val INT8,
-  IN in0_credit_frac INT4,
+  IN in0_credit taler_amount,
   IN in0_exchange_account_name VARCHAR,
   IN in0_execution_date INT8,
   IN in0_wire_source_h_payto BYTEA,
@@ -270,8 +261,7 @@ CREATE OR REPLACE FUNCTION 
exchange_do_batch4_reserves_insert(
   IN in0_notify TEXT,
   IN in1_reserve_pub BYTEA,
   IN in1_wire_ref INT8,
-  IN in1_credit_val INT8,
-  IN in1_credit_frac INT4,
+  IN in1_credit taler_amount,
   IN in1_exchange_account_name VARCHAR,
   IN in1_execution_date INT8,
   IN in1_wire_source_h_payto BYTEA,
@@ -279,8 +269,7 @@ CREATE OR REPLACE FUNCTION 
exchange_do_batch4_reserves_insert(
   IN in1_notify TEXT,
   IN in2_reserve_pub BYTEA,
   IN in2_wire_ref INT8,
-  IN in2_credit_val INT8,
-  IN in2_credit_frac INT4,
+  IN in2_credit taler_amount,
   IN in2_exchange_account_name VARCHAR,
   IN in2_execution_date INT8,
   IN in2_wire_source_h_payto BYTEA,
@@ -288,8 +277,7 @@ CREATE OR REPLACE FUNCTION 
exchange_do_batch4_reserves_insert(
   IN in2_notify TEXT,
   IN in3_reserve_pub BYTEA,
   IN in3_wire_ref INT8,
-  IN in3_credit_val INT8,
-  IN in3_credit_frac INT4,
+  IN in3_credit taler_amount,
   IN in3_exchange_account_name VARCHAR,
   IN in3_execution_date INT8,
   IN in3_wire_source_h_payto BYTEA,
@@ -337,29 +325,24 @@ BEGIN
   WITH reserve_changes AS (
     INSERT INTO reserves
       (reserve_pub
-      ,current_balance_val
-      ,current_balance_frac
+      ,current_balance
       ,expiration_date
       ,gc_date)
       VALUES
       (in0_reserve_pub
-      ,in0_credit_val
-      ,in0_credit_frac
+      ,in0_credit
       ,in_reserve_expiration
       ,in_gc_date),
       (in1_reserve_pub
-      ,in1_credit_val
-      ,in1_credit_frac
+      ,in1_credit
       ,in_reserve_expiration
       ,in_gc_date),
       (in2_reserve_pub
-      ,in2_credit_val
-      ,in2_credit_frac
+      ,in2_credit
       ,in_reserve_expiration
       ,in_gc_date),
       (in3_reserve_pub
-      ,in3_credit_val
-      ,in3_credit_frac
+      ,in3_credit
       ,in_reserve_expiration
       ,in_gc_date)
     ON CONFLICT DO NOTHING
@@ -425,29 +408,29 @@ BEGIN
       VALUES
       (in0_reserve_pub
       ,in0_wire_ref
-      ,in0_credit_val
-      ,in0_credit_frac
+      ,in0_credit.val
+      ,in0_credit.frac
       ,in0_exchange_account_name
       ,in0_wire_source_h_payto
       ,in0_execution_date),
       (in1_reserve_pub
       ,in1_wire_ref
-      ,in1_credit_val
-      ,in1_credit_frac
+      ,in1_credit.val
+      ,in1_credit.frac
       ,in1_exchange_account_name
       ,in1_wire_source_h_payto
       ,in1_execution_date),
       (in2_reserve_pub
       ,in2_wire_ref
-      ,in2_credit_val
-      ,in2_credit_frac
+      ,in2_credit.val
+      ,in2_credit.frac
       ,in2_exchange_account_name
       ,in2_wire_source_h_payto
       ,in2_execution_date),
       (in3_reserve_pub
       ,in3_wire_ref
-      ,in3_credit_val
-      ,in3_credit_frac
+      ,in3_credit.val
+      ,in3_credit.frac
       ,in3_exchange_account_name
       ,in3_wire_source_h_payto
       ,in3_execution_date)
@@ -522,8 +505,7 @@ CREATE OR REPLACE FUNCTION 
exchange_do_batch8_reserves_insert(
   IN in_reserve_expiration INT8,
   IN in0_reserve_pub BYTEA,
   IN in0_wire_ref INT8,
-  IN in0_credit_val INT8,
-  IN in0_credit_frac INT4,
+  IN in0_credit taler_amount,
   IN in0_exchange_account_name VARCHAR,
   IN in0_execution_date INT8,
   IN in0_wire_source_h_payto BYTEA,
@@ -531,8 +513,7 @@ CREATE OR REPLACE FUNCTION 
exchange_do_batch8_reserves_insert(
   IN in0_notify TEXT,
   IN in1_reserve_pub BYTEA,
   IN in1_wire_ref INT8,
-  IN in1_credit_val INT8,
-  IN in1_credit_frac INT4,
+  IN in1_credit taler_amount,
   IN in1_exchange_account_name VARCHAR,
   IN in1_execution_date INT8,
   IN in1_wire_source_h_payto BYTEA,
@@ -540,8 +521,7 @@ CREATE OR REPLACE FUNCTION 
exchange_do_batch8_reserves_insert(
   IN in1_notify TEXT,
   IN in2_reserve_pub BYTEA,
   IN in2_wire_ref INT8,
-  IN in2_credit_val INT8,
-  IN in2_credit_frac INT4,
+  IN in2_credit taler_amount,
   IN in2_exchange_account_name VARCHAR,
   IN in2_execution_date INT8,
   IN in2_wire_source_h_payto BYTEA,
@@ -549,8 +529,7 @@ CREATE OR REPLACE FUNCTION 
exchange_do_batch8_reserves_insert(
   IN in2_notify TEXT,
   IN in3_reserve_pub BYTEA,
   IN in3_wire_ref INT8,
-  IN in3_credit_val INT8,
-  IN in3_credit_frac INT4,
+  IN in3_credit taler_amount,
   IN in3_exchange_account_name VARCHAR,
   IN in3_execution_date INT8,
   IN in3_wire_source_h_payto BYTEA,
@@ -558,8 +537,7 @@ CREATE OR REPLACE FUNCTION 
exchange_do_batch8_reserves_insert(
   IN in3_notify TEXT,
   IN in4_reserve_pub BYTEA,
   IN in4_wire_ref INT8,
-  IN in4_credit_val INT8,
-  IN in4_credit_frac INT4,
+  IN in4_credit taler_amount,
   IN in4_exchange_account_name VARCHAR,
   IN in4_execution_date INT8,
   IN in4_wire_source_h_payto BYTEA,
@@ -567,8 +545,7 @@ CREATE OR REPLACE FUNCTION 
exchange_do_batch8_reserves_insert(
   IN in4_notify TEXT,
   IN in5_reserve_pub BYTEA,
   IN in5_wire_ref INT8,
-  IN in5_credit_val INT8,
-  IN in5_credit_frac INT4,
+  IN in5_credit taler_amount,
   IN in5_exchange_account_name VARCHAR,
   IN in5_execution_date INT8,
   IN in5_wire_source_h_payto BYTEA,
@@ -576,8 +553,7 @@ CREATE OR REPLACE FUNCTION 
exchange_do_batch8_reserves_insert(
   IN in5_notify TEXT,
   IN in6_reserve_pub BYTEA,
   IN in6_wire_ref INT8,
-  IN in6_credit_val INT8,
-  IN in6_credit_frac INT4,
+  IN in6_credit taler_amount,
   IN in6_exchange_account_name VARCHAR,
   IN in6_execution_date INT8,
   IN in6_wire_source_h_payto BYTEA,
@@ -585,8 +561,7 @@ CREATE OR REPLACE FUNCTION 
exchange_do_batch8_reserves_insert(
   IN in6_notify TEXT,
   IN in7_reserve_pub BYTEA,
   IN in7_wire_ref INT8,
-  IN in7_credit_val INT8,
-  IN in7_credit_frac INT4,
+  IN in7_credit taler_amount,
   IN in7_exchange_account_name VARCHAR,
   IN in7_execution_date INT8,
   IN in7_wire_source_h_payto BYTEA,
@@ -657,49 +632,40 @@ BEGIN
   WITH reserve_changes AS (
     INSERT INTO reserves
       (reserve_pub
-      ,current_balance_val
-      ,current_balance_frac
+      ,current_balance
       ,expiration_date
       ,gc_date)
       VALUES
       (in0_reserve_pub
-      ,in0_credit_val
-      ,in0_credit_frac
+      ,in0_credit
       ,in_reserve_expiration
       ,in_gc_date),
       (in1_reserve_pub
-      ,in1_credit_val
-      ,in1_credit_frac
+      ,in1_credit
       ,in_reserve_expiration
       ,in_gc_date),
       (in2_reserve_pub
-      ,in2_credit_val
-      ,in2_credit_frac
+      ,in2_credit
       ,in_reserve_expiration
       ,in_gc_date),
       (in3_reserve_pub
-      ,in3_credit_val
-      ,in3_credit_frac
+      ,in3_credit
       ,in_reserve_expiration
       ,in_gc_date),
       (in4_reserve_pub
-      ,in4_credit_val
-      ,in4_credit_frac
+      ,in4_credit
       ,in_reserve_expiration
       ,in_gc_date),
       (in5_reserve_pub
-      ,in5_credit_val
-      ,in5_credit_frac
+      ,in5_credit
       ,in_reserve_expiration
       ,in_gc_date),
       (in6_reserve_pub
-      ,in6_credit_val
-      ,in6_credit_frac
+      ,in6_credit
       ,in_reserve_expiration
       ,in_gc_date),
       (in7_reserve_pub
-      ,in7_credit_val
-      ,in7_credit_frac
+      ,in7_credit
       ,in_reserve_expiration
       ,in_gc_date)
     ON CONFLICT DO NOTHING
@@ -802,57 +768,57 @@ BEGIN
       VALUES
       (in0_reserve_pub
       ,in0_wire_ref
-      ,in0_credit_val
-      ,in0_credit_frac
+      ,in0_credit.val
+      ,in0_credit.frac
       ,in0_exchange_account_name
       ,in0_wire_source_h_payto
       ,in0_execution_date),
       (in1_reserve_pub
       ,in1_wire_ref
-      ,in1_credit_val
-      ,in1_credit_frac
+      ,in1_credit.val
+      ,in1_credit.frac
       ,in1_exchange_account_name
       ,in1_wire_source_h_payto
       ,in1_execution_date),
       (in2_reserve_pub
       ,in2_wire_ref
-      ,in2_credit_val
-      ,in2_credit_frac
+      ,in2_credit.val
+      ,in2_credit.frac
       ,in2_exchange_account_name
       ,in2_wire_source_h_payto
       ,in2_execution_date),
       (in3_reserve_pub
       ,in3_wire_ref
-      ,in3_credit_val
-      ,in3_credit_frac
+      ,in3_credit.val
+      ,in3_credit.frac
       ,in3_exchange_account_name
       ,in3_wire_source_h_payto
       ,in3_execution_date),
       (in4_reserve_pub
       ,in4_wire_ref
-      ,in4_credit_val
-      ,in4_credit_frac
+      ,in4_credit.val
+      ,in4_credit.frac
       ,in4_exchange_account_name
       ,in4_wire_source_h_payto
       ,in4_execution_date),
       (in5_reserve_pub
       ,in5_wire_ref
-      ,in5_credit_val
-      ,in5_credit_frac
+      ,in5_credit.val
+      ,in5_credit.frac
       ,in5_exchange_account_name
       ,in5_wire_source_h_payto
       ,in5_execution_date),
       (in6_reserve_pub
       ,in6_wire_ref
-      ,in6_credit_val
-      ,in6_credit_frac
+      ,in6_credit.val
+      ,in6_credit.frac
       ,in6_exchange_account_name
       ,in6_wire_source_h_payto
       ,in6_execution_date),
       (in7_reserve_pub
       ,in7_wire_ref
-      ,in7_credit_val
-      ,in7_credit_frac
+      ,in7_credit.val
+      ,in7_credit.frac
       ,in7_exchange_account_name
       ,in7_wire_source_h_payto
       ,in7_execution_date)
diff --git a/src/exchangedb/exchange_do_withdraw.sql 
b/src/exchangedb/exchange_do_withdraw.sql
index f6632c54..d0d98867 100644
--- a/src/exchangedb/exchange_do_withdraw.sql
+++ b/src/exchangedb/exchange_do_withdraw.sql
@@ -17,8 +17,7 @@
 
 CREATE OR REPLACE FUNCTION exchange_do_withdraw(
   IN cs_nonce BYTEA,
-  IN amount_val INT8,
-  IN amount_frac INT4,
+  IN amount taler_amount,
   IN h_denom_pub BYTEA,
   IN rpub BYTEA,
   IN reserve_sig BYTEA,
@@ -38,8 +37,7 @@ AS $$
 DECLARE
   reserve_gc INT8;
   denom_serial INT8;
-  reserve_val INT8;
-  reserve_frac INT4;
+  reserve taler_amount;
   reserve_birthday INT4;
   not_before date;
 BEGIN
@@ -68,14 +66,13 @@ END IF;
 
 
 SELECT
-   current_balance_val
-  ,current_balance_frac
+   current_balance
   ,gc_date
   ,birthday
   ,reserve_uuid
  INTO
-   reserve_val
-  ,reserve_frac
+   reserve.val
+  ,reserve.frac
   ,reserve_gc
   ,reserve_birthday
   ,ruuid
@@ -133,8 +130,8 @@ VALUES
   ,ruuid
   ,reserve_sig
   ,now
-  ,amount_val
-  ,amount_frac)
+  ,amount.val
+  ,amount.frac)
 ON CONFLICT DO NOTHING;
 
 IF NOT FOUND
@@ -147,21 +144,21 @@ THEN
 END IF;
 
 -- Check reserve balance is sufficient.
-IF (reserve_val > amount_val)
+IF (reserve.val > amount.val)
 THEN
-  IF (reserve_frac >= amount_frac)
+  IF (reserve.frac >= amount.frac)
   THEN
-    reserve_val=reserve_val - amount_val;
-    reserve_frac=reserve_frac - amount_frac;
+    reserve.val=reserve.val - amount.val;
+    reserve.frac=reserve.frac - amount.frac;
   ELSE
-    reserve_val=reserve_val - amount_val - 1;
-    reserve_frac=reserve_frac + 100000000 - amount_frac;
+    reserve.val=reserve.val - amount.val - 1;
+    reserve.frac=reserve.frac + 100000000 - amount.frac;
   END IF;
 ELSE
-  IF (reserve_val = amount_val) AND (reserve_frac >= amount_frac)
+  IF (reserve.val = amount.val) AND (reserve.frac >= amount.frac)
   THEN
-    reserve_val=0;
-    reserve_frac=reserve_frac - amount_frac;
+    reserve.val=0;
+    reserve.frac=reserve.frac - amount.frac;
   ELSE
     reserve_found=TRUE;
     nonce_ok=TRUE; -- we do not really know
@@ -176,8 +173,7 @@ min_reserve_gc=GREATEST(min_reserve_gc,reserve_gc);
 -- Update reserve balance.
 UPDATE reserves SET
   gc_date=min_reserve_gc
- ,current_balance_val=reserve_val
- ,current_balance_frac=reserve_frac
+ ,current_balance=reserve
 WHERE
   reserves.reserve_pub=rpub;
 
@@ -222,7 +218,6 @@ END IF;
 
 END $$;
 
-
-COMMENT ON FUNCTION exchange_do_withdraw(BYTEA, INT8, INT4, BYTEA, BYTEA, 
BYTEA, BYTEA, BYTEA, INT8, INT8, BOOLEAN)
+COMMENT ON FUNCTION exchange_do_withdraw(BYTEA, taler_amount, BYTEA, BYTEA, 
BYTEA, BYTEA, BYTEA, INT8, INT8, BOOLEAN)
   IS 'Checks whether the reserve has sufficient balance for a withdraw 
operation (or the request is repeated and was previously approved) and if the 
age requirements are formally met.  If so updates the database with the result';
 
diff --git a/src/exchangedb/pg_do_batch_withdraw_insert.c 
b/src/exchangedb/pg_do_batch_withdraw_insert.c
index 8be18f7c..2952483c 100644
--- a/src/exchangedb/pg_do_batch_withdraw_insert.c
+++ b/src/exchangedb/pg_do_batch_withdraw_insert.c
@@ -41,7 +41,8 @@ TEH_PG_do_batch_withdraw_insert (
     NULL == nonce
     ? GNUNET_PQ_query_param_null ()
     : GNUNET_PQ_query_param_auto_from_type (nonce),
-    TALER_PQ_query_param_amount (&collectable->amount_with_fee),
+    TALER_PQ_query_param_amount_tuple (pg->conn,
+                                       &collectable->amount_with_fee),
     GNUNET_PQ_query_param_auto_from_type (&collectable->denom_pub_hash),
     GNUNET_PQ_query_param_uint64 (&ruuid),
     GNUNET_PQ_query_param_auto_from_type (&collectable->reserve_sig),
@@ -69,7 +70,7 @@ TEH_PG_do_batch_withdraw_insert (
            ",out_conflict AS conflict"
            ",out_nonce_reuse AS nonce_reuse"
            " FROM exchange_do_batch_withdraw_insert"
-           " ($1,$2,$3,$4,$5,$6,$7,$8,$9);");
+           " ($1,$2,$3,$4,$5,$6,$7,$8);");
   return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
                                                    
"call_batch_withdraw_insert",
                                                    params,
diff --git a/src/exchangedb/pg_do_withdraw.c b/src/exchangedb/pg_do_withdraw.c
index 99732df6..03794179 100644
--- a/src/exchangedb/pg_do_withdraw.c
+++ b/src/exchangedb/pg_do_withdraw.c
@@ -46,7 +46,8 @@ TEH_PG_do_withdraw (
     NULL == nonce
     ? GNUNET_PQ_query_param_null ()
     : GNUNET_PQ_query_param_auto_from_type (nonce),
-    TALER_PQ_query_param_amount (&collectable->amount_with_fee),
+    TALER_PQ_query_param_amount_tuple (pg->conn,
+                                       &collectable->amount_with_fee),
     GNUNET_PQ_query_param_auto_from_type (&collectable->denom_pub_hash),
     GNUNET_PQ_query_param_auto_from_type (&collectable->reserve_pub),
     GNUNET_PQ_query_param_auto_from_type (&collectable->reserve_sig),
@@ -83,7 +84,7 @@ TEH_PG_do_withdraw (
            ",allowed_maximum_age"
            ",ruuid"
            " FROM exchange_do_withdraw"
-           " ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11);");
+           " ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10);");
   gc = GNUNET_TIME_absolute_to_timestamp (
     GNUNET_TIME_absolute_add (now.abs_time,
                               pg->legal_reserve_expiration_time));
diff --git a/src/exchangedb/pg_get_expired_reserves.c 
b/src/exchangedb/pg_get_expired_reserves.c
index c7162dc6..d94a9305 100644
--- a/src/exchangedb/pg_get_expired_reserves.c
+++ b/src/exchangedb/pg_get_expired_reserves.c
@@ -84,8 +84,9 @@ reserve_expired_cb (void *cls,
                                     &account_details),
       GNUNET_PQ_result_spec_auto_from_type ("reserve_pub",
                                             &reserve_pub),
-      TALER_PQ_RESULT_SPEC_AMOUNT ("current_balance",
-                                   &remaining_balance),
+      TALER_PQ_result_spec_amount_tuple ("current_balance",
+                                         pg->currency,
+                                         &remaining_balance),
       GNUNET_PQ_result_spec_end
     };
 
@@ -137,7 +138,7 @@ TEH_PG_get_expired_reserves (void *cls,
            " SELECT * "
            " FROM reserves "
            " WHERE expiration_date <= $1 "
-           "   AND (current_balance_val != 0 OR current_balance_frac != 0) "
+           "   AND (current_balance.val != 0 OR current_balance.frac != 0) "
            " ORDER BY expiration_date ASC "
            " LIMIT 1 "
            ") "
@@ -145,8 +146,7 @@ TEH_PG_get_expired_reserves (void *cls,
            " ed.expiration_date "
            " ,payto_uri AS account_details "
            " ,ed.reserve_pub "
-           " ,current_balance_val "
-           " ,current_balance_frac "
+           " ,current_balance "
            "FROM ( "
            " SELECT "
            "  * "
diff --git a/src/exchangedb/pg_get_reserve_balance.c 
b/src/exchangedb/pg_get_reserve_balance.c
index 7d5eb58f..8886d2b1 100644
--- a/src/exchangedb/pg_get_reserve_balance.c
+++ b/src/exchangedb/pg_get_reserve_balance.c
@@ -36,16 +36,16 @@ TEH_PG_get_reserve_balance (void *cls,
     GNUNET_PQ_query_param_end
   };
   struct GNUNET_PQ_ResultSpec rs[] = {
-    TALER_PQ_RESULT_SPEC_AMOUNT ("current_balance",
-                                 balance),
+    TALER_PQ_result_spec_amount_tuple ("current_balance",
+                                       pg->currency,
+                                       balance),
     GNUNET_PQ_result_spec_end
   };
 
   PREPARE (pg,
            "get_reserve_balance",
            "SELECT"
-           " current_balance_val"
-           ",current_balance_frac"
+           " current_balance"
            " FROM reserves"
            " WHERE reserve_pub=$1;");
   return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
diff --git a/src/exchangedb/pg_reserves_get.c b/src/exchangedb/pg_reserves_get.c
index d081ca00..5b487b86 100644
--- a/src/exchangedb/pg_reserves_get.c
+++ b/src/exchangedb/pg_reserves_get.c
@@ -35,8 +35,9 @@ TEH_PG_reserves_get (void *cls,
     GNUNET_PQ_query_param_end
   };
   struct GNUNET_PQ_ResultSpec rs[] = {
-    TALER_PQ_RESULT_SPEC_AMOUNT ("current_balance",
-                                 &reserve->balance),
+    TALER_PQ_result_spec_amount_tuple ("current_balance",
+                                       pg->currency,
+                                       &reserve->balance),
     GNUNET_PQ_result_spec_timestamp ("expiration_date",
                                      &reserve->expiry),
     GNUNET_PQ_result_spec_timestamp ("gc_date",
@@ -47,8 +48,7 @@ TEH_PG_reserves_get (void *cls,
   PREPARE (pg,
            "reserves_get",
            "SELECT"
-           " current_balance_val"
-           ",current_balance_frac"
+           " current_balance"
            ",expiration_date"
            ",gc_date"
            " FROM reserves"
diff --git a/src/exchangedb/pg_reserves_in_insert.c 
b/src/exchangedb/pg_reserves_in_insert.c
index 7f59826c..ff33a2f1 100644
--- a/src/exchangedb/pg_reserves_in_insert.c
+++ b/src/exchangedb/pg_reserves_in_insert.c
@@ -100,7 +100,7 @@ struct ReserveRecord
 #define RR_QUERY_PARAM(rr,index) \
   GNUNET_PQ_query_param_auto_from_type (rr[index].reserve->reserve_pub),    \
   GNUNET_PQ_query_param_uint64 (&rr[index].reserve->wire_reference),        \
-  TALER_PQ_query_param_amount (rr[index].reserve->balance),                 \
+  TALER_PQ_query_param_amount_tuple (pg->conn, rr[index].reserve->balance), \
   GNUNET_PQ_query_param_string (rr[index].reserve->exchange_account_name),  \
   GNUNET_PQ_query_param_timestamp (&rr[index].reserve->execution_time),     \
   GNUNET_PQ_query_param_auto_from_type (&rr[index].h_payto),                \
@@ -154,7 +154,7 @@ insert1 (struct PostgresClosure *pg,
            " transaction_duplicate0 AS transaction_duplicate0"
            ",ruuid0 AS reserve_uuid0"
            " FROM exchange_do_batch_reserves_in_insert"
-           " ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11);");
+           " ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10);");
   qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
                                                  "batch1_reserve_create",
                                                  params,
@@ -214,7 +214,7 @@ insert2 (struct PostgresClosure *pg,
            ",ruuid0 AS reserve_uuid0"
            ",ruuid1 AS reserve_uuid1"
            " FROM exchange_do_batch2_reserves_insert"
-           " 
($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20);");
+           " 
($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18);");
   qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
                                                  "batch2_reserve_create",
                                                  params,
@@ -285,7 +285,7 @@ insert4 (struct PostgresClosure *pg,
            ",ruuid2 AS reserve_uuid2"
            ",ruuid3 AS reserve_uuid3"
            " FROM exchange_do_batch4_reserves_insert"
-           " 
($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31,$32,$33,$34,$35,$36,$37,$38);");
+           " 
($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31,$32,$33,$34);");
   qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
                                                  "batch4_reserve_create",
                                                  params,
@@ -373,7 +373,7 @@ insert8 (struct PostgresClosure *pg,
            ",ruuid6 AS reserve_uuid6"
            ",ruuid7 AS reserve_uuid7"
            " FROM exchange_do_batch8_reserves_insert"
-           " 
($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,
 $40, 
$41,$42,$43,$44,$45,$46,$47,$48,$49,$50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$70,$71,$72,$73,$74);");
+           " 
($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,
 $40, 
$41,$42,$43,$44,$45,$46,$47,$48,$49,$50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$60,$61,$62,$63,$64,$65,$66);");
 
   qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
                                                  "batch8_reserve_create",
@@ -537,7 +537,8 @@ transact (
         GNUNET_PQ_query_param_auto_from_type (rr[i].reserve->reserve_pub),
         GNUNET_PQ_query_param_timestamp (&reserve_expiration),
         GNUNET_PQ_query_param_uint64 (&rr[i].reserve->wire_reference),
-        TALER_PQ_query_param_amount (rr[i].reserve->balance),
+        TALER_PQ_query_param_amount_tuple (pg->conn,
+                                           rr[i].reserve->balance),
         GNUNET_PQ_query_param_string (rr[i].reserve->exchange_account_name),
         GNUNET_PQ_query_param_auto_from_type (&rr[i].h_payto),
         GNUNET_PQ_query_param_string (rr[i].notify_s),
@@ -859,7 +860,8 @@ TEH_PG_reserves_in_insertN (
         GNUNET_PQ_query_param_auto_from_type (reserve_pubs[i]),
         GNUNET_PQ_query_param_timestamp (&reserve_expiration),
         GNUNET_PQ_query_param_uint64 (&wire_reference[i]),
-        TALER_PQ_query_param_amount (balances[i]),
+        TALER_PQ_query_param_amount_tuple (pg->conn,
+                                           balances[i]),
         GNUNET_PQ_query_param_string (exchange_account_names[i]),
         GNUNET_PQ_query_param_auto_from_type (h_paytos[i]),
         GNUNET_PQ_query_param_string (notify_s[i]),
diff --git a/src/exchangedb/pg_reserves_update.c 
b/src/exchangedb/pg_reserves_update.c
index a76c37c2..ecec81fc 100644
--- a/src/exchangedb/pg_reserves_update.c
+++ b/src/exchangedb/pg_reserves_update.c
@@ -33,7 +33,8 @@ TEH_PG_reserves_update (void *cls,
   struct GNUNET_PQ_QueryParam params[] = {
     GNUNET_PQ_query_param_timestamp (&reserve->expiry),
     GNUNET_PQ_query_param_timestamp (&reserve->gc),
-    TALER_PQ_query_param_amount (&reserve->balance),
+    TALER_PQ_query_param_amount_tuple (pg->conn,
+                                       &reserve->balance),
     GNUNET_PQ_query_param_auto_from_type (&reserve->pub),
     GNUNET_PQ_query_param_end
   };
@@ -44,9 +45,8 @@ TEH_PG_reserves_update (void *cls,
            " SET"
            " expiration_date=$1"
            ",gc_date=$2"
-           ",current_balance_val=$3"
-           ",current_balance_frac=$4"
-           " WHERE reserve_pub=$5;");
+           ",current_balance=$3"
+           " WHERE reserve_pub=$4;");
   return GNUNET_PQ_eval_prepared_non_select (pg->conn,
                                              "reserve_update",
                                              params);
diff --git a/src/exchangedb/pg_select_reserve_close_info.c 
b/src/exchangedb/pg_select_reserve_close_info.c
index 973f5fa5..06e8dda2 100644
--- a/src/exchangedb/pg_select_reserve_close_info.c
+++ b/src/exchangedb/pg_select_reserve_close_info.c
@@ -39,8 +39,9 @@ TEH_PG_select_reserve_close_info (
     GNUNET_PQ_query_param_end
   };
   struct GNUNET_PQ_ResultSpec rs[] = {
-    TALER_PQ_RESULT_SPEC_AMOUNT ("current_balance",
-                                 balance),
+    TALER_PQ_result_spec_amount_tuple ("current_balance",
+                                       pg->currency,
+                                       balance),
     GNUNET_PQ_result_spec_string ("payto_uri",
                                   payto_uri),
     GNUNET_PQ_result_spec_end
@@ -49,8 +50,7 @@ TEH_PG_select_reserve_close_info (
   PREPARE (pg,
            "select_reserve_close_info",
            "SELECT "
-           " r.current_balance_val"
-           ",r.current_balance_frac"
+           " r.current_balance"
            ",wt.payto_uri"
            " FROM reserves r"
            " LEFT JOIN reserves_in ri USING (reserve_pub)"
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c 
b/src/exchangedb/plugin_exchangedb_postgres.c
index 93ea09cd..4f8959ff 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -294,14 +294,6 @@ TEH_PG_internal_setup (struct PostgresClosure *pg)
     if (NULL == db_conn)
       return GNUNET_SYSERR;
 
-    if (GNUNET_OK != TALER_PQ_load_oids_for_composite_types (db_conn))
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  "Failed to load OIDs for composite types\n");
-      GNUNET_PQ_disconnect (db_conn);
-      return GNUNET_SYSERR;
-    }
-
     pg->prep_gen++;
     pg->conn = db_conn;
   }
@@ -787,6 +779,12 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)
   plugin->batch_ensure_coin_known
     = &TEH_PG_batch_ensure_coin_known;
 
+  if (GNUNET_OK != TALER_PQ_load_oids_for_composite_types (pg->conn))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Failed to load OIDs for composite types\n");
+  }
+
   return plugin;
 }
 

-- 
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]