diff options
Diffstat (limited to 'src/exchangedb/exchange_do_expire_purse.sql')
-rw-r--r-- | src/exchangedb/exchange_do_expire_purse.sql | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/exchangedb/exchange_do_expire_purse.sql b/src/exchangedb/exchange_do_expire_purse.sql new file mode 100644 index 000000000..ee9757f03 --- /dev/null +++ b/src/exchangedb/exchange_do_expire_purse.sql @@ -0,0 +1,98 @@ +-- +-- 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/> +-- + +CREATE OR REPLACE FUNCTION exchange_do_expire_purse( + IN in_start_time INT8, + IN in_end_time INT8, + IN in_now INT8, + OUT out_found BOOLEAN) +LANGUAGE plpgsql +AS $$ +DECLARE + my_purse_pub BYTEA; +DECLARE + my_deposit record; +DECLARE + my_in_reserve_quota BOOLEAN; +BEGIN + +-- FIXME: we should probably do this in a loop +-- and expire all at once, instead of one per query +SELECT purse_pub + ,in_reserve_quota + INTO my_purse_pub + ,my_in_reserve_quota + FROM purse_requests + WHERE (purse_expiration >= in_start_time) AND + (purse_expiration < in_end_time) AND + NOT was_decided + ORDER BY purse_expiration ASC + LIMIT 1; +out_found = FOUND; +IF NOT FOUND +THEN + RETURN; +END IF; + +INSERT INTO purse_decision + (purse_pub + ,action_timestamp + ,refunded) +VALUES + (my_purse_pub + ,in_now + ,TRUE); + +-- Code for 'TALER_DBEVENT_EXCHANGE_PURSE_REFUNDED' +NOTIFY X8DJSPNYJMNZDAP7GN6YQ4EZVSQXMF3HRP4VAR347WP9SZYP1C200; + +IF (my_in_reserve_quota) +THEN + UPDATE reserves + SET purses_active=purses_active-1 + WHERE reserve_pub IN + (SELECT reserve_pub + FROM exchange.purse_merges + WHERE purse_pub=my_purse_pub + LIMIT 1); +END IF; + +-- restore balance to each coin deposited into the purse +FOR my_deposit IN + SELECT coin_pub + ,amount_with_fee + FROM purse_deposits + WHERE purse_pub = my_purse_pub +LOOP + UPDATE known_coins kc SET + remaining.frac=(kc.remaining).frac+(my_deposit.amount_with_fee).frac + - CASE + WHEN (kc.remaining).frac+(my_deposit.amount_with_fee).frac >= 100000000 + THEN 100000000 + ELSE 0 + END, + remaining.val=(kc.remaining).val+(my_deposit.amount_with_fee).val + + CASE + WHEN (kc.remaining).frac+(my_deposit.amount_with_fee).frac >= 100000000 + THEN 1 + ELSE 0 + END + WHERE coin_pub = my_deposit.coin_pub; + END LOOP; +END $$; + +COMMENT ON FUNCTION exchange_do_expire_purse(INT8,INT8,INT8) + IS 'Finds an expired purse in the given time range and refunds the coins (if any).'; |