finalize v3/v4 -> v2 exchange schema merger
This commit is contained in:
parent
85020a9204
commit
0d0494ee91
@ -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;
|
|
78
src/exchangedb/exchange_do_amount_specific.sql
Normal file
78
src/exchangedb/exchange_do_amount_specific.sql
Normal file
@ -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.';
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user