diff --git a/src/exchangedb/0002-age_withdrawl.sql b/src/exchangedb/0002-age_withdraw.sql similarity index 100% rename from src/exchangedb/0002-age_withdrawl.sql rename to 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 --- - -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.'; + +