gnunet-svn
[Top][All Lists]
Advanced

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

[taler-exchange] 02/03: taler_amount type introduced in reserves table a


From: gnunet
Subject: [taler-exchange] 02/03: taler_amount type introduced in reserves table and corresponding functions
Date: Fri, 28 Jul 2023 23:29:29 +0200

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

oec pushed a commit to branch master
in repository exchange.

commit 6dedca0fa36bd30bbeb26be012ce3ac9d967065a
Author: Özgür Kesim <oec-taler@kesim.org>
AuthorDate: Fri Jul 28 23:27:02 2023 +0200

    taler_amount type introduced in reserves table and corresponding functions
    
    - current_balance is now a taler_amount
    - all C-functions, SQL-statements and stored procedures adjusted 
accordingly.
    
    => make check passes all tests in testing.
---
 src/exchangedb/exchange_do_age_withdraw.sql        | 36 +++++------
 src/exchangedb/exchange_do_batch_withdraw.sql      | 48 ++++++---------
 .../exchange_do_batch_withdraw_insert.sql          |  9 ++-
 src/exchangedb/exchange_do_gc.sql                  |  3 +-
 src/exchangedb/exchange_do_history_request.sql     | 71 ++++++++++++++--------
 src/exchangedb/exchange_do_purse_deposit.sql       | 40 ++++++------
 src/exchangedb/exchange_do_purse_merge.sql         | 35 +++++++----
 src/exchangedb/exchange_do_recoup_to_reserve.sql   | 36 +++++++----
 src/exchangedb/exchange_do_reserve_open.sql        | 46 ++++++--------
 src/exchangedb/exchange_do_reserve_purse.sql       | 14 ++---
 src/exchangedb/exchange_do_reserves_in_insert.sql  | 14 -----
 src/exchangedb/exchange_do_withdraw.sql            | 47 ++++++--------
 src/exchangedb/pg_do_batch_withdraw.c              |  5 +-
 src/exchangedb/pg_do_purse_deposit.c               | 10 ++-
 src/exchangedb/pg_do_reserve_open.c                | 21 ++++---
 src/exchangedb/pg_do_reserve_purse.c               |  9 +--
 src/exchangedb/pg_get_expired_reserves.c           |  2 +-
 src/exchangedb/pg_insert_history_request.c         |  5 +-
 18 files changed, 227 insertions(+), 224 deletions(-)

diff --git a/src/exchangedb/exchange_do_age_withdraw.sql 
b/src/exchangedb/exchange_do_age_withdraw.sql
index 756c0085..184a3e49 100644
--- a/src/exchangedb/exchange_do_age_withdraw.sql
+++ b/src/exchangedb/exchange_do_age_withdraw.sql
@@ -36,10 +36,9 @@ CREATE OR REPLACE FUNCTION exchange_do_age_withdraw(
 LANGUAGE plpgsql
 AS $$
 DECLARE
-  reserve_gc INT8;
+  reserve RECORD;
   difference RECORD;
   balance  taler_amount;
-  new_balance taler_amount;
   not_before date;
   earliest_date date;
 BEGIN
@@ -49,15 +48,8 @@ BEGIN
 --         reserves_in by reserve_pub (SELECT)
 --         wire_targets by wire_target_h_payto
 
-SELECT
-   current_balance
-  ,gc_date
-  ,birthday
- INTO
-   balance.val
-  ,balance.frac
-  ,reserve_gc
-  ,reserve_birthday
+SELECT *
+  INTO reserve
   FROM exchange.reserves
  WHERE reserves.reserve_pub=rpub;
 
@@ -74,10 +66,13 @@ END IF;
 reserve_found = TRUE;
 conflict=FALSE;  -- not really yet determined
 
+balance = reserve.current_balance;
+reserve_birthday = reserve.birthday;
+
 -- Check age requirements
-IF (reserve_birthday <> 0)
+IF (reserve.birthday <> 0)
 THEN
-  not_before=date '1970-01-01' + reserve_birthday;
+  not_before=date '1970-01-01' + reserve.birthday;
   earliest_date = current_date - make_interval(maximum_age_committed);
   --
   -- 1970-01-01 + birthday == not_before                 now
@@ -103,12 +98,9 @@ required_age=0;
 
 -- Check reserve balance is sufficient.
 SELECT *
-INTO
-  difference
-FROM
-  amount_left_minus_right(
-     balance
-    ,amount_with_fee);
+INTO difference
+FROM amount_left_minus_right(balance
+                            ,amount_with_fee);
 
 balance_ok = difference.ok;
 
@@ -117,15 +109,15 @@ THEN
   RETURN;
 END IF;
 
-new_balance = difference.diff;
+balance = difference.diff;
 
 -- Calculate new expiration dates.
-min_reserve_gc=GREATEST(min_reserve_gc,reserve_gc);
+min_reserve_gc=GREATEST(min_reserve_gc,reserve.gc_date);
 
 -- Update reserve balance.
 UPDATE reserves SET
   gc_date=min_reserve_gc
- ,current_balance=new_balance
+ ,current_balance=balance
 WHERE
   reserves.reserve_pub=rpub;
 
diff --git a/src/exchangedb/exchange_do_batch_withdraw.sql 
b/src/exchangedb/exchange_do_batch_withdraw.sql
index ba364dda..b896e04f 100644
--- a/src/exchangedb/exchange_do_batch_withdraw.sql
+++ b/src/exchangedb/exchange_do_batch_withdraw.sql
@@ -30,9 +30,8 @@ CREATE OR REPLACE FUNCTION exchange_do_batch_withdraw(
 LANGUAGE plpgsql
 AS $$
 DECLARE
-  reserve_gc INT8;
-  reserve taler_amount;
-  reserve_birthday INT4;
+  reserve RECORD;
+  balance taler_amount;
   not_before date;
 BEGIN
 -- Shards: reserves by reserve_pub (SELECT)
@@ -42,18 +41,8 @@ BEGIN
 --         wire_targets by wire_target_h_payto
 
 
-SELECT
-   current_balance.val
-  ,current_balance.frac
-  ,gc_date
-  ,birthday
-  ,reserve_uuid
- INTO
-   reserve.val
-  ,reserve.frac
-  ,reserve_gc
-  ,reserve_birthday
-  ,ruuid
+SELECT *
+  INTO reserve
   FROM exchange.reserves
  WHERE reserves.reserve_pub=rpub;
 
@@ -68,9 +57,10 @@ THEN
   RETURN;
 END IF;
 
+ruuid = reserve.reserve_uuid;
 
 -- Check if age requirements are present
-IF ((NOT do_age_check) OR (reserve_birthday = 0))
+IF ((NOT do_age_check) OR (reserve.birthday = 0))
 THEN
   age_ok = TRUE;
   allowed_maximum_age = -1;
@@ -80,7 +70,7 @@ ELSE
   -- birthday set (reserve_birthday != 0), but the client called the
   -- batch-withdraw endpoint instead of the age-withdraw endpoint, which it
   -- should have.
-  not_before=date '1970-01-01' + reserve_birthday;
+  not_before=date '1970-01-01' + reserve.birthday;
   allowed_maximum_age = extract(year from age(current_date, not_before));
 
   reserve_found=TRUE;
@@ -89,22 +79,24 @@ ELSE
   RETURN;
 END IF;
 
+balance = reserve.current_balance;
+
 -- Check reserve balance is sufficient.
-IF (reserve.val > amount.val)
+IF (balance.val > amount.val)
 THEN
-  IF (reserve.frac >= amount.frac)
+  IF (balance.frac >= amount.frac)
   THEN
-    reserve.val=reserve.val - amount.val;
-    reserve.frac=reserve.frac - amount.frac;
+    balance.val=balance.val - amount.val;
+    balance.frac=balance.frac - amount.frac;
   ELSE
-    reserve.val=reserve.val - amount.val - 1;
-    reserve.frac=reserve.frac + 100000000 - amount.frac;
+    balance.val=balance.val - amount.val - 1;
+    balance.frac=balance.frac + 100000000 - amount.frac;
   END IF;
 ELSE
-  IF (reserve.val = amount.val) AND (reserve.frac >= amount.frac)
+  IF (balance.val = amount.val) AND (balance.frac >= amount.frac)
   THEN
-    reserve.val=0;
-    reserve.frac=reserve.frac - amount.frac;
+    balance.val=0;
+    balance.frac=balance.frac - amount.frac;
   ELSE
     balance_ok=FALSE;
     RETURN;
@@ -112,12 +104,12 @@ ELSE
 END IF;
 
 -- Calculate new expiration dates.
-min_reserve_gc=GREATEST(min_reserve_gc,reserve_gc);
+min_reserve_gc=GREATEST(min_reserve_gc,reserve.gc_date);
 
 -- Update reserve balance.
 UPDATE reserves SET
   gc_date=min_reserve_gc
- ,current_balance=reserve
+ ,current_balance=balance
 WHERE
   reserves.reserve_pub=rpub;
 
diff --git a/src/exchangedb/exchange_do_batch_withdraw_insert.sql 
b/src/exchangedb/exchange_do_batch_withdraw_insert.sql
index b580f6fb..fd00754a 100644
--- a/src/exchangedb/exchange_do_batch_withdraw_insert.sql
+++ b/src/exchangedb/exchange_do_batch_withdraw_insert.sql
@@ -16,8 +16,7 @@
 
 CREATE OR REPLACE FUNCTION exchange_do_batch_withdraw_insert(
   IN cs_nonce BYTEA,
-  IN amount_val INT8,
-  IN amount_frac INT4,
+  IN amount taler_amount,
   IN h_denom_pub BYTEA, -- FIXME: denom_serials should really be a parameter 
to this FUNCTION.
   IN ruuid INT8,
   IN reserve_sig BYTEA,
@@ -74,8 +73,8 @@ VALUES
   ,ruuid
   ,reserve_sig
   ,now
-  ,amount_val
-  ,amount_frac)
+  ,amount.val
+  ,amount.frac)
 ON CONFLICT DO NOTHING;
 
 IF NOT FOUND
@@ -119,6 +118,6 @@ END IF;
 
 END $$;
 
-COMMENT ON FUNCTION exchange_do_batch_withdraw_insert(BYTEA, INT8, INT4, 
BYTEA, INT8, BYTEA, BYTEA, BYTEA, INT8)
+COMMENT ON FUNCTION exchange_do_batch_withdraw_insert(BYTEA, taler_amount, 
BYTEA, INT8, BYTEA, BYTEA, BYTEA, INT8)
   IS 'Stores information about a planchet for a batch withdraw operation. 
Checks if the planchet already exists, and in that case indicates a conflict';
 
diff --git a/src/exchangedb/exchange_do_gc.sql 
b/src/exchangedb/exchange_do_gc.sql
index 07cbeb42..75dd120d 100644
--- a/src/exchangedb/exchange_do_gc.sql
+++ b/src/exchangedb/exchange_do_gc.sql
@@ -37,8 +37,7 @@ 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 = (0, 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 7eb368ef..5cd15bc6 100644
--- a/src/exchangedb/exchange_do_history_request.sql
+++ b/src/exchangedb/exchange_do_history_request.sql
@@ -19,12 +19,15 @@ CREATE OR REPLACE FUNCTION exchange_do_history_request(
   IN in_reserve_pub BYTEA,
   IN in_reserve_sig BYTEA,
   IN in_request_timestamp INT8,
-  IN in_history_fee_val INT8,
-  IN in_history_fee_frac INT4,
+  IN in_history_fee taler_amount,
   OUT out_balance_ok BOOLEAN,
   OUT out_idempotent BOOLEAN)
 LANGUAGE plpgsql
 AS $$
+DECLARE
+  reserve RECORD;
+  balance taler_amount;
+  new_balance taler_amount;
 BEGIN
 
   -- Insert and check for idempotency.
@@ -38,8 +41,8 @@ BEGIN
   (in_reserve_pub
   ,in_request_timestamp
   ,in_reserve_sig
-  ,in_history_fee_val
-  ,in_history_fee_frac)
+  ,in_history_fee.val
+  ,in_history_fee.frac)
   ON CONFLICT DO NOTHING;
 
   IF NOT FOUND
@@ -51,35 +54,51 @@ BEGIN
 
   out_idempotent=FALSE;
 
-  -- Update reserve balance.
-  UPDATE exchange.reserves
-   SET
-    current_balance.frac=current_balance.frac-in_history_fee_frac
-       + CASE
-         WHEN current_balance.frac < in_history_fee_frac
-         THEN 100000000
-         ELSE 0
-         END,
-    current_balance.val=current_balance.val-in_history_fee_val
-       - CASE
-         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) ) );
+  SELECT *
+    INTO reserve
+    FROM exchange.reserves
+   WHERE reserve_pub=in_reserve_pub;
 
   IF NOT FOUND
   THEN
-    -- Either reserve does not exist, or balance insufficient.
-    -- Both we treat the same here as balance insufficient.
+    -- Reserve does not exist, we treat it the same here
+    -- as balance insufficient.
+    out_balance_ok=FALSE;
+    RETURN;
+  END IF;
+
+  balance = reserve.current_balance;
+
+  -- check balance
+  IF ( (balance.val <= in_history_fee.val) AND
+       ( (balance.frac < in_history_fee.frac) OR
+         (balance.val < in_history_fee.val) ) )
+  THEN
     out_balance_ok=FALSE;
     RETURN;
   END IF;
 
+  new_balance.frac=balance.frac-in_history_fee.frac
+     + CASE
+       WHEN balance.frac < in_history_fee.frac
+       THEN 100000000
+       ELSE 0
+       END;
+  new_balance.val=balance.val-in_history_fee.val
+     - CASE
+       WHEN balance.frac < in_history_fee.frac
+       THEN 1
+       ELSE 0
+       END;
+
+  -- Update reserve balance.
+  UPDATE exchange.reserves
+     SET current_balance=new_balance
+   WHERE reserve_pub=in_reserve_pub;
+
+  ASSERT FOUND, 'reserve suddenly disappeared';
+
   out_balance_ok=TRUE;
+
 END $$;
 
diff --git a/src/exchangedb/exchange_do_purse_deposit.sql 
b/src/exchangedb/exchange_do_purse_deposit.sql
index 5e9f71bb..45bdcdf6 100644
--- a/src/exchangedb/exchange_do_purse_deposit.sql
+++ b/src/exchangedb/exchange_do_purse_deposit.sql
@@ -17,12 +17,10 @@
 CREATE OR REPLACE FUNCTION exchange_do_purse_deposit(
   IN in_partner_id INT8,
   IN in_purse_pub BYTEA,
-  IN in_amount_with_fee_val INT8,
-  IN in_amount_with_fee_frac INT4,
+  IN in_amount_with_fee taler_amount,
   IN in_coin_pub BYTEA,
   IN in_coin_sig BYTEA,
-  IN in_amount_without_fee_val INT8,
-  IN in_amount_without_fee_frac INT4,
+  IN in_amount_without_fee taler_amount,
   IN in_reserve_expiration INT8,
   IN in_now INT8,
   OUT out_balance_ok BOOLEAN,
@@ -51,8 +49,8 @@ INSERT INTO exchange.purse_deposits
   (in_partner_id
   ,in_purse_pub
   ,in_coin_pub
-  ,in_amount_with_fee_val
-  ,in_amount_with_fee_frac
+  ,in_amount_with_fee.val
+  ,in_amount_with_fee.frac
   ,in_coin_sig)
   ON CONFLICT DO NOTHING;
 
@@ -100,22 +98,22 @@ END IF;
 -- Check and update balance of the coin.
 UPDATE known_coins
   SET
-    remaining_frac=remaining_frac-in_amount_with_fee_frac
+    remaining_frac=remaining_frac-in_amount_with_fee.frac
        + CASE
-         WHEN remaining_frac < in_amount_with_fee_frac
+         WHEN remaining_frac < in_amount_with_fee.frac
          THEN 100000000
          ELSE 0
          END,
-    remaining_val=remaining_val-in_amount_with_fee_val
+    remaining_val=remaining_val-in_amount_with_fee.val
        - CASE
-         WHEN remaining_frac < in_amount_with_fee_frac
+         WHEN remaining_frac < in_amount_with_fee.frac
          THEN 1
          ELSE 0
          END
   WHERE coin_pub=in_coin_pub
-    AND ( (remaining_val > in_amount_with_fee_val) OR
-          ( (remaining_frac >= in_amount_with_fee_frac) AND
-            (remaining_val >= in_amount_with_fee_val) ) );
+    AND ( (remaining_val > in_amount_with_fee.val) OR
+          ( (remaining_frac >= in_amount_with_fee.frac) AND
+            (remaining_val >= in_amount_with_fee.val) ) );
 
 IF NOT FOUND
 THEN
@@ -130,15 +128,15 @@ END IF;
 -- Credit the purse.
 UPDATE purse_requests
   SET
-    balance_frac=balance_frac+in_amount_without_fee_frac
+    balance_frac=balance_frac+in_amount_without_fee.frac
        - CASE
-         WHEN balance_frac+in_amount_without_fee_frac >= 100000000
+         WHEN balance_frac+in_amount_without_fee.frac >= 100000000
          THEN 100000000
          ELSE 0
          END,
-    balance_val=balance_val+in_amount_without_fee_val
+    balance_val=balance_val+in_amount_without_fee.val
        + CASE
-         WHEN balance_frac+in_amount_without_fee_frac >= 100000000
+         WHEN balance_frac+in_amount_without_fee.frac >= 100000000
          THEN 1
          ELSE 0
          END
@@ -239,15 +237,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 85bae999..9780c016 100644
--- a/src/exchangedb/exchange_do_purse_merge.sql
+++ b/src/exchangedb/exchange_do_purse_merge.sql
@@ -33,6 +33,8 @@ DECLARE
   my_purse_fee taler_amount;
   my_partner_serial_id INT8;
   my_in_reserve_quota BOOLEAN;
+  reserve RECORD;
+  balance taler_amount;
 BEGIN
 
 
@@ -195,20 +197,27 @@ ELSE
   my_amount.val = my_amount.val + my_amount.frac / 100000000;
   my_amount.frac = my_amount.frac % 100000000;
 
+  SELECT *
+   INTO reserve
+   FROM exchange.reserves
+  WHERE reserve_pub=in_reserve_pub;
+
+  balance = reserve.current_balance;
+  balance.frac=balance.frac+my_amount.frac
+     - CASE
+       WHEN balance.frac + my_amount.frac >= 100000000
+       THEN 100000000
+       ELSE 0
+       END;
+  balance.val=balance.val+my_amount.val
+     + CASE
+       WHEN balance.frac + my_amount.frac >= 100000000
+       THEN 1
+       ELSE 0
+       END;
+
   UPDATE exchange.reserves
-  SET
-    current_balance.frac=current_balance.frac+my_amount.frac
-       - CASE
-         WHEN current_balance.frac + my_amount.frac >= 100000000
-         THEN 100000000
-         ELSE 0
-         END,
-    current_balance.val=current.balance_val+my.amount_val
-       + CASE
-         WHEN current_balance.frac + my_amount.frac >= 100000000
-         THEN 1
-         ELSE 0
-         END
+  SET current_balance=balance
   WHERE reserve_pub=in_reserve_pub;
 
 END IF;
diff --git a/src/exchangedb/exchange_do_recoup_to_reserve.sql 
b/src/exchangedb/exchange_do_recoup_to_reserve.sql
index 72942e8c..71c1d51b 100644
--- a/src/exchangedb/exchange_do_recoup_to_reserve.sql
+++ b/src/exchangedb/exchange_do_recoup_to_reserve.sql
@@ -32,6 +32,9 @@ LANGUAGE plpgsql
 AS $$
 DECLARE
   tmp taler_amount; -- amount recouped
+  balance taler_amount; -- current balance of the reserve
+  new_balance taler_amount; -- new balance of the reserve
+  reserve RECORD;
 BEGIN
 -- Shards: SELECT known_coins (by coin_pub)
 --         SELECT recoup      (by coin_pub)
@@ -81,22 +84,31 @@ UPDATE known_coins
     ,remaining_val=0
   WHERE coin_pub=in_coin_pub;
 
+-- Get current balance
+SELECT *
+  INTO reserve
+  FROM reserves
+ WHERE reserve_pub=in_reserve_pub;
+
+balance = reserve.current_balance;
+new_balance.frac=balance.frac+tmp.frac
+   - CASE
+     WHEN balance.frac+tmp.frac >= 100000000
+     THEN 100000000
+     ELSE 0
+     END;
+
+new_balance.val=balance.val+tmp.val
+   + CASE
+     WHEN balance.frac+tmp.frac >= 100000000
+     THEN 1
+     ELSE 0
+     END;
 
 -- Credit the reserve and update reserve timers.
 UPDATE reserves
   SET
-    current_balance.frac=current_balance.frac+tmp.frac
-       - CASE
-         WHEN current_balance.frac+tmp.frac >= 100000000
-         THEN 100000000
-         ELSE 0
-         END,
-    current_balance.val=current_balance.val+tmp.val
-       + CASE
-         WHEN current_balance.frac+tmp.frac >= 100000000
-         THEN 1
-         ELSE 0
-         END,
+    current_balance = new_balance,
     gc_date=GREATEST(gc_date, in_reserve_gc),
     expiration_date=GREATEST(expiration_date, in_reserve_expiration)
   WHERE reserve_pub=in_reserve_pub;
diff --git a/src/exchangedb/exchange_do_reserve_open.sql 
b/src/exchangedb/exchange_do_reserve_open.sql
index d97b4449..7aca78b8 100644
--- a/src/exchangedb/exchange_do_reserve_open.sql
+++ b/src/exchangedb/exchange_do_reserve_open.sql
@@ -37,25 +37,15 @@ DECLARE
   my_years_tmp INT4;
   my_years INT4;
   my_needs_update BOOL;
-  my_purses_allowed INT8;
   my_expiration_date INT8;
-  my_reserve_expiration INT8;
+  reserve RECORD;
 BEGIN
 
 -- FIXME: use SELECT FOR UPDATE?
-SELECT
-  purses_allowed
- ,expiration_date
- ,current_balance.val
- ,current_balance.frac
-INTO
-  my_purses_allowed
- ,my_reserve_expiration
- ,my_balance.val
- ,my_balance.frac
-FROM reserves
-WHERE
-  reserve_pub=in_reserve_pub;
+SELECT *
+  INTO reserve
+  FROM reserves
+ WHERE reserve_pub=in_reserve_pub;
 
 IF NOT FOUND
 THEN
@@ -64,12 +54,14 @@ THEN
   RETURN;
 END IF;
 
+my_balance = reserve.current_balance;
+
 -- Do not allow expiration time to start in the past already
-IF (my_reserve_expiration < in_now)
+IF (reserve.expiration_date < in_now)
 THEN
   my_expiration_date = in_now;
 ELSE
-  my_expiration_date = my_reserve_expiration;
+  my_expiration_date = reserve.expiration_date;
 END IF;
 
 my_cost.val = 0;
@@ -81,18 +73,18 @@ my_years = 0;
 IF (my_expiration_date < in_desired_expiration)
 THEN
   my_years = (31535999999999 + in_desired_expiration - my_expiration_date) / 
31536000000000;
-  my_purses_allowed = in_default_purse_limit;
+  reserve.purses_allowed = in_default_purse_limit;
   my_expiration_date = my_expiration_date + 31536000000000 * my_years;
 END IF;
 
 -- Increase years based on purses requested
-IF (my_purses_allowed < in_min_purse_limit)
+IF (reserve.purses_allowed < in_min_purse_limit)
 THEN
   my_years = (31535999999999 + in_desired_expiration - in_now) / 
31536000000000;
   my_expiration_date = in_now + 31536000000000 * my_years;
-  my_years_tmp = (in_min_purse_limit + in_default_purse_limit - 
my_purses_allowed - 1) / in_default_purse_limit;
+  my_years_tmp = (in_min_purse_limit + in_default_purse_limit - 
reserve.purses_allowed - 1) / in_default_purse_limit;
   my_years = my_years + my_years_tmp;
-  my_purses_allowed = my_purses_allowed + (in_default_purse_limit * 
my_years_tmp);
+  reserve.purses_allowed = reserve.purses_allowed + (in_default_purse_limit * 
my_years_tmp);
 END IF;
 
 
@@ -118,7 +110,7 @@ END IF;
 -- check if we actually have something to do
 IF NOT my_needs_update
 THEN
-  out_final_expiration = my_reserve_expiration;
+  out_final_expiration = reserve.expiration_date;
   out_open_cost.val = 0;
   out_open_cost.frac = 0;
   out_no_funds=FALSE;
@@ -136,7 +128,7 @@ THEN
   out_no_funds=FALSE;
   -- We must return a failure, which is indicated by
   -- the expiration being below the desired expiration.
-  IF (my_reserve_expiration >= in_desired_expiration)
+  IF (reserve.expiration_date >= in_desired_expiration)
   THEN
     -- This case is relevant especially if the purse
     -- count was to be increased and the payment was
@@ -144,7 +136,7 @@ THEN
     RAISE NOTICE 'forcing low expiration time';
     out_final_expiration = 0;
   ELSE
-    out_final_expiration = my_reserve_expiration;
+    out_final_expiration = reserve.expiration_date;
   END IF;
   RAISE NOTICE 'amount paid too low';
   RETURN;
@@ -167,7 +159,7 @@ ELSE
     my_balance.val=0;
     my_balance.frac=my_balance.frac - in_reserve_payment.frac;
   ELSE
-    out_final_expiration = my_reserve_expiration;
+    out_final_expiration = reserve.expiration_date;
     out_open_cost.val = my_cost.val;
     out_open_cost.frac = my_cost.frac;
     out_no_funds=TRUE;
@@ -178,9 +170,9 @@ END IF;
 
 UPDATE reserves SET
   current_balance=my_balance
- ,gc_date=my_reserve_expiration + in_reserve_gc_delay
+ ,gc_date=reserve.expiration_date + in_reserve_gc_delay
  ,expiration_date=my_expiration_date
- ,purses_allowed=my_purses_allowed
+ ,purses_allowed=reserve.purses_allowed
 WHERE
  reserve_pub=in_reserve_pub;
 
diff --git a/src/exchangedb/exchange_do_reserve_purse.sql 
b/src/exchangedb/exchange_do_reserve_purse.sql
index abe5a749..43d4c91a 100644
--- a/src/exchangedb/exchange_do_reserve_purse.sql
+++ b/src/exchangedb/exchange_do_reserve_purse.sql
@@ -117,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;
diff --git a/src/exchangedb/exchange_do_reserves_in_insert.sql 
b/src/exchangedb/exchange_do_reserves_in_insert.sql
index e7018e51..fcf8ef4c 100644
--- a/src/exchangedb/exchange_do_reserves_in_insert.sql
+++ b/src/exchangedb/exchange_do_reserves_in_insert.sql
@@ -109,11 +109,8 @@ LANGUAGE plpgsql
 AS $$
 DECLARE
   curs_reserve_exist REFCURSOR;
-DECLARE
   k INT8;
-DECLARE
   curs_transaction_exist REFCURSOR;
-DECLARE
   i RECORD;
 BEGIN
   transaction_duplicate0 = TRUE;
@@ -295,11 +292,8 @@ LANGUAGE plpgsql
 AS $$
 DECLARE
   curs_reserve_exist REFCURSOR;
-DECLARE
   k INT8;
-DECLARE
   curs_transaction_exist REFCURSOR;
-DECLARE
   i RECORD;
 BEGIN
   transaction_duplicate0=TRUE;
@@ -587,13 +581,9 @@ LANGUAGE plpgsql
 AS $$
 DECLARE
   curs_reserve_exist REFCURSOR;
-DECLARE
   k INT8;
-DECLARE
   curs_transaction_exist REFCURSOR;
-DECLARE
   i RECORD;
-DECLARE
   r RECORD;
 
 BEGIN
@@ -949,13 +939,9 @@ LANGUAGE plpgsql
 AS $$
 DECLARE
   curs REFCURSOR;
-DECLARE
   conflict BOOL;
-DECLARE
   dup BOOL;
-DECLARE
   uuid INT8;
-DECLARE
   i RECORD;
 BEGIN
 
diff --git a/src/exchangedb/exchange_do_withdraw.sql 
b/src/exchangedb/exchange_do_withdraw.sql
index d0d98867..60a63e67 100644
--- a/src/exchangedb/exchange_do_withdraw.sql
+++ b/src/exchangedb/exchange_do_withdraw.sql
@@ -35,10 +35,9 @@ CREATE OR REPLACE FUNCTION exchange_do_withdraw(
 LANGUAGE plpgsql
 AS $$
 DECLARE
-  reserve_gc INT8;
+  reserve RECORD;
   denom_serial INT8;
-  reserve taler_amount;
-  reserve_birthday INT4;
+  balance taler_amount;
   not_before date;
 BEGIN
 -- Shards: reserves by reserve_pub (SELECT)
@@ -65,17 +64,8 @@ THEN
 END IF;
 
 
-SELECT
-   current_balance
-  ,gc_date
-  ,birthday
-  ,reserve_uuid
- INTO
-   reserve.val
-  ,reserve.frac
-  ,reserve_gc
-  ,reserve_birthday
-  ,ruuid
+SELECT *
+  INTO reserve
   FROM exchange.reserves
  WHERE reserves.reserve_pub=rpub;
 
@@ -91,8 +81,11 @@ THEN
   RETURN;
 END IF;
 
+balance = reserve.current_balance;
+ruuid = reserve.reserve_uuid;
+
 -- Check if age requirements are present
-IF ((NOT do_age_check) OR (reserve_birthday = 0))
+IF ((NOT do_age_check) OR (reserve.birthday = 0))
 THEN
   age_ok = TRUE;
   allowed_maximum_age = -1;
@@ -102,7 +95,7 @@ ELSE
   -- birthday set (reserve_birthday != 0), but the client called the
   -- batch-withdraw endpoint instead of the age-withdraw endpoint, which it
   -- should have.
-  not_before=date '1970-01-01' + reserve_birthday;
+  not_before=date '1970-01-01' + reserve.birthday;
   allowed_maximum_age = extract(year from age(current_date, not_before));
 
   reserve_found=TRUE;
@@ -144,21 +137,21 @@ THEN
 END IF;
 
 -- Check reserve balance is sufficient.
-IF (reserve.val > amount.val)
+IF (balance.val > amount.val)
 THEN
-  IF (reserve.frac >= amount.frac)
+  IF (balance.frac >= amount.frac)
   THEN
-    reserve.val=reserve.val - amount.val;
-    reserve.frac=reserve.frac - amount.frac;
+    balance.val=balance.val - amount.val;
+    balance.frac=balance.frac - amount.frac;
   ELSE
-    reserve.val=reserve.val - amount.val - 1;
-    reserve.frac=reserve.frac + 100000000 - amount.frac;
+    balance.val=balance.val - amount.val - 1;
+    balance.frac=balance.frac + 100000000 - amount.frac;
   END IF;
 ELSE
-  IF (reserve.val = amount.val) AND (reserve.frac >= amount.frac)
+  IF (balance.val = amount.val) AND (balance.frac >= amount.frac)
   THEN
-    reserve.val=0;
-    reserve.frac=reserve.frac - amount.frac;
+    balance.val=0;
+    balance.frac=balance.frac - amount.frac;
   ELSE
     reserve_found=TRUE;
     nonce_ok=TRUE; -- we do not really know
@@ -168,12 +161,12 @@ ELSE
 END IF;
 
 -- Calculate new expiration dates.
-min_reserve_gc=GREATEST(min_reserve_gc,reserve_gc);
+min_reserve_gc=GREATEST(min_reserve_gc,reserve.gc_date);
 
 -- Update reserve balance.
 UPDATE reserves SET
   gc_date=min_reserve_gc
- ,current_balance=reserve
+ ,current_balance=balance
 WHERE
   reserves.reserve_pub=rpub;
 
diff --git a/src/exchangedb/pg_do_batch_withdraw.c 
b/src/exchangedb/pg_do_batch_withdraw.c
index 45b1d322..8e118a99 100644
--- a/src/exchangedb/pg_do_batch_withdraw.c
+++ b/src/exchangedb/pg_do_batch_withdraw.c
@@ -43,7 +43,8 @@ TEH_PG_do_batch_withdraw (
   struct PostgresClosure *pg = cls;
   struct GNUNET_TIME_Timestamp gc;
   struct GNUNET_PQ_QueryParam params[] = {
-    TALER_PQ_query_param_amount (amount),
+    TALER_PQ_query_param_amount_tuple (pg->conn,
+                                       amount),
     GNUNET_PQ_query_param_auto_from_type (reserve_pub),
     GNUNET_PQ_query_param_timestamp (&now),
     GNUNET_PQ_query_param_timestamp (&gc),
@@ -80,7 +81,7 @@ TEH_PG_do_batch_withdraw (
            ",allowed_maximum_age"
            ",ruuid"
            " FROM exchange_do_batch_withdraw"
-           " ($1,$2,$3,$4,$5,$6);");
+           " ($1,$2,$3,$4,$5);");
   return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
                                                    "call_batch_withdraw",
                                                    params,
diff --git a/src/exchangedb/pg_do_purse_deposit.c 
b/src/exchangedb/pg_do_purse_deposit.c
index ba6f03c1..3ac3cfbf 100644
--- a/src/exchangedb/pg_do_purse_deposit.c
+++ b/src/exchangedb/pg_do_purse_deposit.c
@@ -47,10 +47,14 @@ TEH_PG_do_purse_deposit (
     ? GNUNET_PQ_query_param_null ()
     : GNUNET_PQ_query_param_uint64 (&partner_id),
     GNUNET_PQ_query_param_auto_from_type (purse_pub),
-    TALER_PQ_query_param_amount (amount),
+    TALER_PQ_query_param_amount_tuple (
+      pg->conn,
+      amount),
     GNUNET_PQ_query_param_auto_from_type (coin_pub),
     GNUNET_PQ_query_param_auto_from_type (coin_sig),
-    TALER_PQ_query_param_amount (amount_minus_fee),
+    TALER_PQ_query_param_amount_tuple (
+      pg->conn,
+      amount_minus_fee),
     GNUNET_PQ_query_param_timestamp (&reserve_expiration),
     GNUNET_PQ_query_param_timestamp (&now),
     GNUNET_PQ_query_param_end
@@ -77,7 +81,7 @@ TEH_PG_do_purse_deposit (
            ",out_conflict AS conflict"
            ",out_late AS too_late"
            " FROM exchange_do_purse_deposit"
-           " ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10);");
+           " ($1,$2,$3,$4,$5,$6,$7,$8);");
 
   return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
                                                    "call_purse_deposit",
diff --git a/src/exchangedb/pg_do_reserve_open.c 
b/src/exchangedb/pg_do_reserve_open.c
index 542d1f46..cdc42964 100644
--- a/src/exchangedb/pg_do_reserve_open.c
+++ b/src/exchangedb/pg_do_reserve_open.c
@@ -44,20 +44,26 @@ TEH_PG_do_reserve_open (
   struct PostgresClosure *pg = cls;
   struct GNUNET_PQ_QueryParam params[] = {
     GNUNET_PQ_query_param_auto_from_type (reserve_pub),
-    TALER_PQ_query_param_amount (total_paid),
-    TALER_PQ_query_param_amount (reserve_payment),
+    TALER_PQ_query_param_amount_tuple (
+      pg->conn,
+      total_paid),
+    TALER_PQ_query_param_amount_tuple (
+      pg->conn,
+      reserve_payment),
     GNUNET_PQ_query_param_uint32 (&min_purse_limit),
     GNUNET_PQ_query_param_uint32 (&pg->def_purse_limit),
     GNUNET_PQ_query_param_auto_from_type (reserve_sig),
     GNUNET_PQ_query_param_timestamp (&desired_expiration),
     GNUNET_PQ_query_param_relative_time (&pg->legal_reserve_expiration_time),
     GNUNET_PQ_query_param_timestamp (&now),
-    TALER_PQ_query_param_amount (open_fee),
+    TALER_PQ_query_param_amount_tuple (pg->conn,
+                                       open_fee),
     GNUNET_PQ_query_param_end
   };
   struct GNUNET_PQ_ResultSpec rs[] = {
-    TALER_PQ_RESULT_SPEC_AMOUNT ("out_open_cost",
-                                 open_cost),
+    TALER_PQ_result_spec_amount_tuple ("out_open_cost",
+                                       pg->currency,
+                                       open_cost),
     GNUNET_PQ_result_spec_timestamp ("out_final_expiration",
                                      final_expiration),
     GNUNET_PQ_result_spec_bool ("out_no_funds",
@@ -68,12 +74,11 @@ TEH_PG_do_reserve_open (
   PREPARE (pg,
            "do_reserve_open",
            "SELECT "
-           " out_open_cost_val"
-           ",out_open_cost_frac"
+           " out_open_cost"
            ",out_final_expiration"
            ",out_no_funds"
            " FROM exchange_do_reserve_open"
-           " ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13);");
+           " ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10);");
   return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
                                                    "do_reserve_open",
                                                    params,
diff --git a/src/exchangedb/pg_do_reserve_purse.c 
b/src/exchangedb/pg_do_reserve_purse.c
index b0859417..6e05a5ab 100644
--- a/src/exchangedb/pg_do_reserve_purse.c
+++ b/src/exchangedb/pg_do_reserve_purse.c
@@ -74,9 +74,10 @@ TEH_PG_do_reserve_purse (
     GNUNET_PQ_query_param_timestamp (&reserve_gc),
     GNUNET_PQ_query_param_auto_from_type (reserve_sig),
     GNUNET_PQ_query_param_bool (NULL == purse_fee),
-    TALER_PQ_query_param_amount (NULL == purse_fee
-                                 ? &zero_fee
-                                 : purse_fee),
+    TALER_PQ_query_param_amount_tuple (pg->conn,
+                                       NULL == purse_fee
+                                        ? &zero_fee
+                                        : purse_fee),
     GNUNET_PQ_query_param_auto_from_type (reserve_pub),
     GNUNET_PQ_query_param_auto_from_type (&h_payto),
     GNUNET_PQ_query_param_end
@@ -111,7 +112,7 @@ TEH_PG_do_reserve_purse (
            ",out_no_reserve AS no_reserve"
            ",out_conflict AS conflict"
            " FROM exchange_do_reserve_purse"
-           "  ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11);");
+           "  ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);");
 
   return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
                                                    "call_reserve_purse",
diff --git a/src/exchangedb/pg_get_expired_reserves.c 
b/src/exchangedb/pg_get_expired_reserves.c
index d94a9305..852d1780 100644
--- a/src/exchangedb/pg_get_expired_reserves.c
+++ b/src/exchangedb/pg_get_expired_reserves.c
@@ -138,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 "
            ") "
diff --git a/src/exchangedb/pg_insert_history_request.c 
b/src/exchangedb/pg_insert_history_request.c
index ab3f3913..63a175de 100644
--- a/src/exchangedb/pg_insert_history_request.c
+++ b/src/exchangedb/pg_insert_history_request.c
@@ -41,7 +41,8 @@ TEH_PG_insert_history_request (
     GNUNET_PQ_query_param_auto_from_type (reserve_pub),
     GNUNET_PQ_query_param_auto_from_type (reserve_sig),
     GNUNET_PQ_query_param_timestamp (&request_timestamp),
-    TALER_PQ_query_param_amount (history_fee),
+    TALER_PQ_query_param_amount_tuple (pg->conn,
+                                       history_fee),
     GNUNET_PQ_query_param_end
   };
   struct GNUNET_PQ_ResultSpec rs[] = {
@@ -58,7 +59,7 @@ TEH_PG_insert_history_request (
            "  out_balance_ok AS balance_ok"
            " ,out_idempotent AS idempotent"
            " FROM exchange_do_history_request"
-           "  ($1, $2, $3, $4, $5)");
+           "  ($1, $2, $3, $4)");
   return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
                                                    "call_history_request",
                                                    params,

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