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_known_coins (
2022-11-27 21:21:04 +01:00
IN partition_suffix VARCHAR DEFAULT NULL
2022-11-27 00:16:00 +01:00
)
RETURNS VOID
LANGUAGE plpgsql
AS $ $
DECLARE
table_name VARCHAR default ' known_coins ' ;
BEGIN
PERFORM create_partitioned_table (
2022-11-27 14:05:47 +01:00
' CREATE TABLE %I '
' (known_coin_id BIGINT GENERATED BY DEFAULT AS IDENTITY '
' ,denominations_serial INT8 NOT NULL '
2022-11-27 00:16:00 +01:00
' ,coin_pub BYTEA NOT NULL PRIMARY KEY CHECK (LENGTH(coin_pub)=32) '
' ,age_commitment_hash BYTEA CHECK (LENGTH(age_commitment_hash)=32) '
' ,denom_sig BYTEA NOT NULL '
' ,remaining_val INT8 NOT NULL DEFAULT(0) '
' ,remaining_frac INT4 NOT NULL DEFAULT(0) '
' ) %s ; '
, table_name
2022-11-27 14:05:47 +01:00
, ' PARTITION BY HASH (coin_pub) '
2022-11-27 21:21:04 +01:00
, partition_suffix
2022-11-27 14:05:47 +01:00
) ;
PERFORM comment_partitioned_table (
' information about coins and their signatures, so we do not have to store the signatures more than once if a coin is involved in multiple operations '
, table_name
2022-11-27 21:21:04 +01:00
, partition_suffix
2022-11-27 14:05:47 +01:00
) ;
PERFORM comment_partitioned_column (
' Denomination of the coin, determines the value of the original coin and applicable fees for coin-specific operations. '
, ' denominations_serial '
, table_name
2022-11-27 21:21:04 +01:00
, partition_suffix
2022-11-27 14:05:47 +01:00
) ;
PERFORM comment_partitioned_column (
' EdDSA public key of the coin '
, ' coin_pub '
, table_name
2022-11-27 21:21:04 +01:00
, partition_suffix
2022-11-27 14:05:47 +01:00
) ;
PERFORM comment_partitioned_column (
' Value of the coin that remains to be spent '
, ' remaining_val '
, table_name
2022-11-27 21:21:04 +01:00
, partition_suffix
2022-11-27 14:05:47 +01:00
) ;
PERFORM comment_partitioned_column (
' Optional hash of the age commitment for age restrictions as per DD 24 (active if denom_type has the respective bit set) '
, ' age_commitment_hash '
, table_name
2022-11-27 21:21:04 +01:00
, partition_suffix
2022-11-27 14:05:47 +01:00
) ;
PERFORM comment_partitioned_column (
' This is the signature of the exchange that affirms that the coin is a valid coin. The specific signature type depends on denom_type of the denomination. '
, ' denom_sig '
, table_name
2022-11-27 21:21:04 +01:00
, partition_suffix
2022-11-27 00:16:00 +01:00
) ;
END
$ $ ;
2022-11-27 14:05:47 +01:00
CREATE FUNCTION constrain_table_known_coins (
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 ' known_coins ' ;
BEGIN
2022-11-27 21:21:04 +01:00
table_name = concat_ws ( ' _ ' , table_name , partition_suffix ) ;
2022-11-27 14:05:47 +01:00
EXECUTE FORMAT (
' ALTER TABLE ' | | table_name | |
' ADD CONSTRAINT ' | | table_name | | ' _known_coin_id_key '
' UNIQUE (known_coin_id) '
) ;
END
$ $ ;
CREATE FUNCTION foreign_table_known_coins ( )
RETURNS void
LANGUAGE plpgsql
AS $ $
DECLARE
table_name VARCHAR default ' known_coins ' ;
2022-11-27 00:16:00 +01:00
BEGIN
EXECUTE FORMAT (
2022-11-27 14:05:47 +01:00
' ALTER TABLE ' | | table_name | |
' ADD CONSTRAINT ' | | table_name | | ' _foreign_denominations '
2022-11-27 21:21:04 +01:00
' FOREIGN KEY (denominations_serial) '
2022-11-27 14:05:47 +01:00
' REFERENCES denominations (denominations_serial) ON DELETE CASCADE '
2022-11-27 00:16:00 +01:00
) ;
END
$ $ ;
2022-11-27 02:00:38 +01:00
INSERT INTO exchange_tables
( name
, version
, action
, partitioned
, by_range )
VALUES
( ' known_coins '
, ' exchange-0002 '
, ' create '
, TRUE
2022-11-27 14:05:47 +01:00
, FALSE ) ,
( ' known_coins '
, ' exchange-0002 '
, ' constrain '
, TRUE
, FALSE ) ,
( ' known_coins '
, ' exchange-0002 '
, ' foreign '
, TRUE
2022-11-27 02:00:38 +01:00
, FALSE ) ;