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:
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(