summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÖzgür Kesim <oec-taler@kesim.org>2023-07-28 14:28:20 +0200
committerÖzgür Kesim <oec-taler@kesim.org>2023-07-28 14:28:20 +0200
commit0d0494ee9117c89faeda64baf7413dee1cee46ca (patch)
treeeeb7ad13fcb76ea37527b69a2ac17fafb0881da9
parent85020a9204f3fdcc1ab29fa43e18d53c31fb595a (diff)
downloadexchange-0d0494ee9117c89faeda64baf7413dee1cee46ca.tar.gz
exchange-0d0494ee9117c89faeda64baf7413dee1cee46ca.tar.bz2
exchange-0d0494ee9117c89faeda64baf7413dee1cee46ca.zip
finalize v3/v4 -> v2 exchange schema merger
-rw-r--r--src/exchangedb/0002-age_withdraw.sql (renamed from src/exchangedb/0002-age_withdrawl.sql)0
-rw-r--r--src/exchangedb/exchange-0003.sql.in24
-rw-r--r--src/exchangedb/exchange_do_amount_specific.sql78
3 files changed, 78 insertions, 24 deletions
diff --git a/src/exchangedb/0002-age_withdrawl.sql b/src/exchangedb/0002-age_withdraw.sql
index 05c0df272..05c0df272 100644
--- a/src/exchangedb/0002-age_withdrawl.sql
+++ b/src/exchangedb/0002-age_withdraw.sql
diff --git a/src/exchangedb/exchange-0003.sql.in b/src/exchangedb/exchange-0003.sql.in
deleted file mode 100644
index 768aa778b..000000000
--- a/src/exchangedb/exchange-0003.sql.in
+++ /dev/null
@@ -1,24 +0,0 @@
---
--- 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/>
---
-
-BEGIN;
-
-SELECT _v.register_patch('exchange-0003', NULL, NULL);
-SET search_path TO exchange;
-
-
-
-COMMIT;
diff --git a/src/exchangedb/exchange_do_amount_specific.sql b/src/exchangedb/exchange_do_amount_specific.sql
new file mode 100644
index 000000000..c88cc8510
--- /dev/null
+++ b/src/exchangedb/exchange_do_amount_specific.sql
@@ -0,0 +1,78 @@
+--------------------------------------------------------------
+-- Taler amounts and helper functiosn
+-------------------------------------------------------------
+
+CREATE OR REPLACE PROCEDURE amount_normalize(
+ IN amount taler_amount
+ ,OUT normalized taler_amount
+)
+LANGUAGE plpgsql
+AS $$
+BEGIN
+ normalized.val = amount.val + amount.frac / 100000000;
+ normalized.frac = amount.frac % 100000000;
+END $$;
+
+COMMENT ON PROCEDURE amount_normalize
+ IS 'Returns the normalized amount by adding to the .val the value of (.frac / 100000000) and removing the modulus 100000000 from .frac.';
+
+CREATE OR REPLACE PROCEDURE amount_add(
+ IN a taler_amount
+ ,IN b taler_amount
+ ,OUT sum taler_amount
+)
+LANGUAGE plpgsql
+AS $$
+BEGIN
+ sum = (a.val + b.val, a.frac + b.frac);
+ CALL amount_normalize(sum ,sum);
+
+ IF (sum.val > (1<<52))
+ THEN
+ RAISE EXCEPTION 'addition overflow';
+ END IF;
+END $$;
+
+COMMENT ON PROCEDURE amount_add
+ IS 'Returns the normalized sum of two amounts. It raises an exception when the resulting .val is larger than 2^52';
+
+CREATE OR REPLACE FUNCTION amount_left_minus_right(
+ IN l taler_amount
+ ,IN r taler_amount
+ ,OUT diff taler_amount
+ ,OUT ok BOOLEAN
+)
+LANGUAGE plpgsql
+AS $$
+BEGIN
+
+IF (l.val > r.val)
+THEN
+ ok = TRUE;
+ IF (l.frac >= r.frac)
+ THEN
+ diff.val = l.val - r.val;
+ diff.frac = l.frac - r.frac;
+ ELSE
+ diff.val = l.val - r.val - 1;
+ diff.frac = l.frac + 100000000 - r.frac;
+ END IF;
+ELSE
+ IF (l.val = r.val) AND (l.frac >= r.frac)
+ THEN
+ diff.val = 0;
+ diff.frac = l.frac - r.frac;
+ ok = TRUE;
+ ELSE
+ diff = (-1, -1);
+ ok = FALSE;
+ END IF;
+END IF;
+
+RETURN;
+END $$;
+
+COMMENT ON FUNCTION amount_left_minus_right
+ IS 'Subtracts the right amount from the left and returns the difference and TRUE, if the left amount is larger than the right, or an invalid amount and FALSE otherwise.';
+
+