exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

commit e0277b2191faff41981e5337b978fa9ff3698e5f
parent a47090924e84c7435736cdeab7724580f5c68748
Author: Christian Grothoff <grothoff@gnunet.org>
Date:   Mon, 12 May 2025 18:06:26 +0200

ensure exchange-schema is set in triggers even during DB recovery (fixes #9947)

Diffstat:
Msrc/exchangedb/0002-purse_actions.sql | 19-------------------
Msrc/exchangedb/0002-purse_decision.sql | 38--------------------------------------
Msrc/exchangedb/0002-reserves_in.sql | 20--------------------
Msrc/exchangedb/0002-reserves_out.sql | 22----------------------
Msrc/exchangedb/Makefile.am | 3++-
Asrc/exchangedb/exchange_trigger_purse_decision_insert.sql | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/exchangedb/exchange_trigger_purse_requests_insert.sql | 35+++++++++++++++++++++++++++++++++++
Asrc/exchangedb/exchange_trigger_reserves_in_insert.sql | 35+++++++++++++++++++++++++++++++++++
Asrc/exchangedb/exchange_trigger_reserves_out_insert.sql | 37+++++++++++++++++++++++++++++++++++++
Msrc/exchangedb/procedures.sql.in | 4++++
10 files changed, 167 insertions(+), 100 deletions(-)

diff --git a/src/exchangedb/0002-purse_actions.sql b/src/exchangedb/0002-purse_actions.sql @@ -60,25 +60,6 @@ BEGIN END $$; -CREATE OR REPLACE FUNCTION purse_requests_insert_trigger() - RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - INSERT INTO - purse_actions - (purse_pub - ,action_date) - VALUES - (NEW.purse_pub - ,NEW.purse_expiration); - RETURN NEW; -END $$; - -COMMENT ON FUNCTION purse_requests_insert_trigger() - IS 'When a purse is created, insert it into the purse_action table to take action when the purse expires.'; - - CREATE OR REPLACE FUNCTION master_table_purse_actions() RETURNS VOID LANGUAGE plpgsql diff --git a/src/exchangedb/0002-purse_decision.sql b/src/exchangedb/0002-purse_decision.sql @@ -74,44 +74,6 @@ END $$; -CREATE OR REPLACE FUNCTION purse_decision_insert_trigger() - RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - UPDATE purse_requests - SET was_decided=TRUE - WHERE purse_pub=NEW.purse_pub; - IF NEW.refunded - THEN - INSERT INTO coin_history - (coin_pub - ,table_name - ,serial_id) - SELECT - pd.coin_pub - ,'purse_decision' - ,NEW.purse_decision_serial_id - FROM purse_deposits pd - WHERE purse_pub = NEW.purse_pub; - ELSE - INSERT INTO reserve_history - (reserve_pub - ,table_name - ,serial_id) - SELECT - reserve_pub - ,'purse_decision' - ,NEW.purse_decision_serial_id - FROM purse_merges - WHERE purse_pub=NEW.purse_pub; - END IF; - RETURN NEW; -END $$; -COMMENT ON FUNCTION purse_decision_insert_trigger() - IS 'Automatically generate coin history entry and update decision status for the purse.'; - - CREATE FUNCTION master_table_purse_decision() RETURNS VOID LANGUAGE plpgsql diff --git a/src/exchangedb/0002-reserves_in.sql b/src/exchangedb/0002-reserves_in.sql @@ -121,26 +121,6 @@ BEGIN END $$; - -CREATE OR REPLACE FUNCTION reserves_in_insert_trigger() - RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - INSERT INTO reserve_history - (reserve_pub - ,table_name - ,serial_id) - VALUES - (NEW.reserve_pub - ,'reserves_in' - ,NEW.reserve_in_serial_id); - RETURN NEW; -END $$; -COMMENT ON FUNCTION reserves_in_insert_trigger() - IS 'Automatically generate reserve history entry.'; - - CREATE FUNCTION master_table_reserves_in() RETURNS VOID LANGUAGE plpgsql diff --git a/src/exchangedb/0002-reserves_out.sql b/src/exchangedb/0002-reserves_out.sql @@ -107,28 +107,6 @@ END $$; -CREATE FUNCTION reserves_out_insert_trigger() - RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - INSERT INTO reserve_history - (reserve_pub - ,table_name - ,serial_id) - SELECT - res.reserve_pub - ,'reserves_out' - ,NEW.reserve_out_serial_id - FROM - reserves res - WHERE res.reserve_uuid = NEW.reserve_uuid; - RETURN NEW; -END $$; -COMMENT ON FUNCTION reserves_out_insert_trigger() - IS 'Replicate reserve_out inserts into reserve_history table.'; - - CREATE FUNCTION master_table_reserves_out() RETURNS void LANGUAGE plpgsql diff --git a/src/exchangedb/Makefile.am b/src/exchangedb/Makefile.am @@ -24,6 +24,7 @@ sqldir = $(prefix)/share/taler-exchange/sql/ sqlinputs = \ exchange_do_*.sql \ exchange_statistics_*.sql \ + exchange_trigger_*.sql \ procedures.sql.in \ 0002-*.sql \ exchange-0002.sql.in @@ -48,7 +49,7 @@ CLEANFILES = \ exchange-0002.sql \ procedures.sql -procedures.sql: procedures.sql.in exchange_do_*.sql exchange_statistics_helpers.sql +procedures.sql: procedures.sql.in exchange_do_*.sql exchange_statistics_*.sql exchange_trigger_*.sql chmod +w $@ 2> /dev/null || true gcc -E -P -undef - < procedures.sql.in 2>/dev/null | sed -e "s/--.*//" | awk 'NF' - >$@ chmod ugo-w $@ diff --git a/src/exchangedb/exchange_trigger_purse_decision_insert.sql b/src/exchangedb/exchange_trigger_purse_decision_insert.sql @@ -0,0 +1,54 @@ +-- +-- This file is part of TALER +-- Copyright (C) 2024 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 purse_decision_insert_trigger() + RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + UPDATE exchange.purse_requests + SET was_decided=TRUE + WHERE purse_pub=NEW.purse_pub; + IF NEW.refunded + THEN + INSERT INTO exchange.coin_history + (coin_pub + ,table_name + ,serial_id) + SELECT + pd.coin_pub + ,'purse_decision' + ,NEW.purse_decision_serial_id + FROM exchange.purse_deposits pd + WHERE purse_pub = NEW.purse_pub; + ELSE + INSERT INTO exchange.reserve_history + (reserve_pub + ,table_name + ,serial_id) + SELECT + reserve_pub + ,'purse_decision' + ,NEW.purse_decision_serial_id + FROM exchange.purse_merges + WHERE purse_pub=NEW.purse_pub; + END IF; + RETURN NEW; +END $$; +COMMENT ON FUNCTION purse_decision_insert_trigger() + IS 'Automatically generate coin history entry and update decision status for the purse.'; + + diff --git a/src/exchangedb/exchange_trigger_purse_requests_insert.sql b/src/exchangedb/exchange_trigger_purse_requests_insert.sql @@ -0,0 +1,35 @@ +-- +-- This file is part of TALER +-- Copyright (C) 2024 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 purse_requests_insert_trigger() + RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + INSERT INTO + exchange.purse_actions + (purse_pub + ,action_date) + VALUES + (NEW.purse_pub + ,NEW.purse_expiration); + RETURN NEW; +END $$; + +COMMENT ON FUNCTION purse_requests_insert_trigger() + IS 'When a purse is created, insert it into the purse_action table to take action when the purse expires.'; + + diff --git a/src/exchangedb/exchange_trigger_reserves_in_insert.sql b/src/exchangedb/exchange_trigger_reserves_in_insert.sql @@ -0,0 +1,35 @@ +-- +-- This file is part of TALER +-- Copyright (C) 2024 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 reserves_in_insert_trigger() + RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + INSERT INTO exchange.reserve_history + (reserve_pub + ,table_name + ,serial_id) + VALUES + (NEW.reserve_pub + ,'reserves_in' + ,NEW.reserve_in_serial_id); + RETURN NEW; +END $$; +COMMENT ON FUNCTION reserves_in_insert_trigger() + IS 'Automatically generate reserve history entry.'; + + diff --git a/src/exchangedb/exchange_trigger_reserves_out_insert.sql b/src/exchangedb/exchange_trigger_reserves_out_insert.sql @@ -0,0 +1,37 @@ +-- +-- This file is part of TALER +-- Copyright (C) 2024 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 reserves_out_insert_trigger() + RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + INSERT INTO exchange.reserve_history + (reserve_pub + ,table_name + ,serial_id) + SELECT + res.reserve_pub + ,'reserves_out' + ,NEW.reserve_out_serial_id + FROM + exchange.reserves res + WHERE res.reserve_uuid = NEW.reserve_uuid; + RETURN NEW; +END $$; +COMMENT ON FUNCTION reserves_out_insert_trigger() + IS 'Replicate reserve_out inserts into reserve_history table.'; + diff --git a/src/exchangedb/procedures.sql.in b/src/exchangedb/procedures.sql.in @@ -59,6 +59,10 @@ SET search_path TO exchange; #include "exchange_do_set_aml_lock.sql" #include "exchange_do_insert_sanction_list_hit.sql" #include "exchange_statistics_helpers.sql" +#include "exchange_trigger_purse_requests_insert.sql" +#include "exchange_trigger_reserves_out_insert.sql" +#include "exchange_trigger_reserves_in_insert.sql" +#include "exchange_trigger_purse_decision_insert.sql" DROP PROCEDURE IF EXISTS exchange_do_gc; CREATE PROCEDURE exchange_do_gc(