2022-11-27 00:16:00 +01:00
--
-- 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/>
--
2022-11-27 14:05:47 +01:00
CREATE FUNCTION create_table_wire_out (
IN partition_suffix VARCHAR DEFAULT NULL
2022-11-27 00:16:00 +01:00
)
RETURNS VOID
LANGUAGE plpgsql
AS $ $
DECLARE
table_name VARCHAR DEFAULT ' wire_out ' ;
BEGIN
PERFORM create_partitioned_table (
' CREATE TABLE IF NOT EXISTS %I '
2022-11-27 14:05:47 +01:00
' (wireout_uuid BIGINT GENERATED BY DEFAULT AS IDENTITY '
2022-11-27 00:16:00 +01:00
' ,execution_date INT8 NOT NULL '
' ,wtid_raw BYTEA UNIQUE NOT NULL CHECK (LENGTH(wtid_raw)=32) '
' ,wire_target_h_payto BYTEA CHECK (LENGTH(wire_target_h_payto)=32) '
' ,exchange_account_section TEXT NOT NULL '
' ,amount_val INT8 NOT NULL '
' ,amount_frac INT4 NOT NULL '
' ) %s ; '
, table_name
, ' PARTITION BY HASH (wtid_raw) '
2022-11-27 14:05:47 +01:00
, partition_suffix
2022-11-27 00:16:00 +01:00
) ;
2022-11-27 14:05:47 +01:00
PERFORM comment_partitioned_table (
' wire transfers the exchange has executed '
, table_name
, partition_suffix
) ;
PERFORM comment_partitioned_column (
' identifies the configuration section with the debit account of this payment '
, ' exchange_account_section '
, table_name
, partition_suffix
) ;
PERFORM comment_partitioned_column (
' Identifies the credited bank account and KYC status '
, ' wire_target_h_payto '
, table_name
, partition_suffix
2022-11-27 00:16:00 +01:00
) ;
END
$ $ ;
2022-11-27 14:05:47 +01:00
CREATE FUNCTION constrain_table_wire_out (
2022-11-27 00:16:00 +01:00
IN partition_suffix VARCHAR
)
RETURNS void
LANGUAGE plpgsql
AS $ $
2022-11-27 14:05:47 +01:00
DECLARE
table_name VARCHAR DEFAULT ' wire_out ' ;
2022-11-27 00:16:00 +01:00
BEGIN
2022-11-27 14:05:47 +01:00
table_name = concat_ws ( ' _ ' , table_name , partition_suffix ) ;
2022-11-27 00:16:00 +01:00
EXECUTE FORMAT (
2022-11-27 14:05:47 +01:00
' CREATE INDEX ' | | table_name | | ' _by_wire_target_h_payto_index '
' ON ' | | table_name | | ' '
' (wire_target_h_payto); '
) ;
EXECUTE FORMAT (
' ALTER TABLE ' | | table_name | |
' ADD CONSTRAINT ' | | table_name | | ' _wireout_uuid_pkey '
' PRIMARY KEY (wireout_uuid) '
2022-11-27 00:16:00 +01:00
) ;
END
$ $ ;
2022-11-27 02:00:38 +01:00
2022-11-27 14:05:47 +01:00
CREATE FUNCTION wire_out_delete_trigger ( )
RETURNS trigger
LANGUAGE plpgsql
AS $ $
BEGIN
DELETE FROM exchange . aggregation_tracking
WHERE wtid_raw = OLD . wtid_raw ;
RETURN OLD ;
END $ $ ;
COMMENT ON FUNCTION wire_out_delete_trigger ( )
IS ' Replicate reserve_out deletions into aggregation_tracking. This replaces an earlier use of an ON DELETE CASCADE that required a DEFERRABLE constraint and conflicted with nice partitioning. ' ;
CREATE FUNCTION master_table_wire_out ( )
RETURNS void
LANGUAGE plpgsql
AS $ $
BEGIN
CREATE TRIGGER wire_out_on_delete
AFTER DELETE
ON wire_out
FOR EACH ROW EXECUTE FUNCTION wire_out_delete_trigger ( ) ;
END $ $ ;
2022-11-27 02:00:38 +01:00
INSERT INTO exchange_tables
( name
, version
, action
, partitioned
, by_range )
VALUES
( ' wire_out '
, ' exchange-0002 '
, ' create '
, TRUE
2022-11-27 14:05:47 +01:00
, FALSE ) ,
( ' wire_out '
, ' exchange-0002 '
, ' constrain '
, TRUE
, FALSE ) ,
( ' wire_out '
, ' exchange-0002 '
, ' master '
, TRUE
2022-11-27 02:00:38 +01:00
, FALSE ) ;