From 13a366363bb3c2899747ec79afed6559bb6ee6d9 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 29 Jul 2023 15:20:22 +0200 Subject: -migrate to amounts as tuples --- src/stasis/plugin_anastasis_postgres.c | 47 +++++++++++++++------------------- src/stasis/stasis-0001.sql | 37 +++++++++++++------------- 2 files changed, 40 insertions(+), 44 deletions(-) diff --git a/src/stasis/plugin_anastasis_postgres.c b/src/stasis/plugin_anastasis_postgres.c index 147045f..0f5f30c 100644 --- a/src/stasis/plugin_anastasis_postgres.c +++ b/src/stasis/plugin_anastasis_postgres.c @@ -161,29 +161,26 @@ prepare_statements (void *cls) "INSERT INTO anastasis_recdoc_payment " "(user_id" ",post_counter" - ",amount_val" - ",amount_frac" + ",amount" ",payment_identifier" ",creation_date" ") VALUES " - "($1, $2, $3, $4, $5, $6);"), + "($1, $2, $3, $4, $5);"), GNUNET_PQ_make_prepare ("challenge_payment_insert", "INSERT INTO anastasis_challenge_payment " "(truth_uuid" - ",amount_val" - ",amount_frac" + ",amount" ",payment_identifier" ",creation_date" ") VALUES " - "($1, $2, $3, $4, $5);"), + "($1, $2, $3, $4);"), GNUNET_PQ_make_prepare ("truth_payment_insert", "INSERT INTO anastasis_truth_payment " "(truth_uuid" - ",amount_val" - ",amount_frac" + ",amount" ",expiration" ") VALUES " - "($1, $2, $3, $4);"), + "($1, $2, $3);"), GNUNET_PQ_make_prepare ("recdoc_payment_done", "UPDATE anastasis_recdoc_payment " "SET" @@ -220,8 +217,7 @@ prepare_statements (void *cls) "SELECT" " creation_date" ",post_counter" - ",amount_val" - ",amount_frac" + ",amount" ",paid" " FROM anastasis_recdoc_payment" " WHERE payment_identifier=$1;"), @@ -234,8 +230,7 @@ prepare_statements (void *cls) GNUNET_PQ_make_prepare ("challenge_payment_select", "SELECT" " creation_date" - ",amount_val" - ",amount_frac" + ",amount" ",paid" " FROM anastasis_challenge_payment" " WHERE payment_identifier=$1" @@ -246,8 +241,7 @@ prepare_statements (void *cls) "SELECT" " creation_date" ",payment_identifier" - ",amount_val" - ",amount_frac" + ",amount" " FROM anastasis_challenge_payment" " WHERE" " paid=FALSE" @@ -261,8 +255,7 @@ prepare_statements (void *cls) "SELECT" " user_id" ",payment_identifier" - ",amount_val" - ",amount_frac" + ",amount" " FROM anastasis_recdoc_payment" " WHERE paid=FALSE;"), GNUNET_PQ_make_prepare ("gc_accounts", @@ -295,8 +288,7 @@ prepare_statements (void *cls) "($1, $2, $3, $4, $5, $6);"), GNUNET_PQ_make_prepare ("test_auth_iban_payment", "SELECT" - " credit_val" - ",credit_frac" + " credit" ",wire_subject" " FROM anastasis_auth_iban_in" " WHERE debit_account_details=$1" @@ -305,13 +297,12 @@ prepare_statements (void *cls) "INSERT INTO anastasis_auth_iban_in " "(wire_reference" ",wire_subject" - ",credit_val" - ",credit_frac" + ",credit" ",debit_account_details" ",credit_account_details" ",execution_date" ") VALUES " - "($1, $2, $3, $4, $5, $6, $7);"), + "($1, $2, $3, $4, $5, $6);"), GNUNET_PQ_make_prepare ("recovery_document_insert", "INSERT INTO anastasis_recoverydocument " "(user_id" @@ -1403,7 +1394,8 @@ postgres_record_recdoc_payment ( struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_auto_from_type (account_pub), GNUNET_PQ_query_param_uint32 (&post_counter), - TALER_PQ_query_param_amount (amount), + TALER_PQ_query_param_amount_tuple (pg->conn, + amount), GNUNET_PQ_query_param_auto_from_type (payment_secret), GNUNET_PQ_query_param_timestamp (&now), GNUNET_PQ_query_param_end @@ -1506,7 +1498,8 @@ postgres_record_truth_upload_payment ( duration); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_auto_from_type (uuid), - TALER_PQ_query_param_amount (amount), + TALER_PQ_query_param_amount_tuple (pg->conn, + amount), GNUNET_PQ_query_param_timestamp (&exp), GNUNET_PQ_query_param_end }; @@ -1573,7 +1566,8 @@ postgres_record_challenge_payment ( struct GNUNET_TIME_Timestamp now = GNUNET_TIME_timestamp_get (); struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_auto_from_type (truth_uuid), - TALER_PQ_query_param_amount (amount), + TALER_PQ_query_param_amount_tuple (pg->conn, + amount), GNUNET_PQ_query_param_auto_from_type (payment_secret), GNUNET_PQ_query_param_timestamp (&now), GNUNET_PQ_query_param_end @@ -1640,7 +1634,8 @@ postgres_record_auth_iban_payment ( struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&wire_reference), GNUNET_PQ_query_param_string (wire_subject), - TALER_PQ_query_param_amount (amount), + TALER_PQ_query_param_amount_tuple (pg->conn, + amount), GNUNET_PQ_query_param_string (debit_account), GNUNET_PQ_query_param_string (credit_account), GNUNET_PQ_query_param_timestamp (&execution_date), diff --git a/src/stasis/stasis-0001.sql b/src/stasis/stasis-0001.sql index cca8245..bd6e9ee 100644 --- a/src/stasis/stasis-0001.sql +++ b/src/stasis/stasis-0001.sql @@ -1,6 +1,6 @@ -- -- This file is part of Anastasis --- Copyright (C) 2020, 2021, 2022 Anastasis SARL SA +-- Copyright (C) 2020, 2021, 2022, 2023 Anastasis SARL SA -- -- ANASTASIS 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 @@ -26,19 +26,25 @@ COMMENT ON SCHEMA anastasis IS 'anastasis backend data'; SET search_path TO anastasis; +CREATE TYPE taler_amount + AS + (val INT8 + ,frac INT4 + ); +COMMENT ON TYPE taler_amount + IS 'Stores an amount, fraction is in units of 1/100000000 of the base value'; + + CREATE TABLE IF NOT EXISTS anastasis_truth_payment (truth_uuid BYTEA PRIMARY KEY CHECK(LENGTH(truth_uuid)=32), - amount_val INT8 NOT NULL, - amount_frac INT4 NOT NULL, + amount taler_amount NOT NULL, expiration INT8 NOT NULL); COMMENT ON TABLE anastasis_truth_payment IS 'Records about payments for truth uploads'; COMMENT ON COLUMN anastasis_truth_payment.truth_uuid IS 'Identifier of the truth'; -COMMENT ON COLUMN anastasis_truth_payment.amount_val +COMMENT ON COLUMN anastasis_truth_payment.amount IS 'Amount we were paid'; -COMMENT ON COLUMN anastasis_truth_payment.amount_frac - IS 'Amount we were paid fraction'; COMMENT ON COLUMN anastasis_truth_payment.expiration IS 'At which date will the truth payment expire'; @@ -81,8 +87,7 @@ CREATE TABLE IF NOT EXISTS anastasis_recdoc_payment (payment_id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, user_id BYTEA NOT NULL REFERENCES anastasis_user(user_id), post_counter INT4 NOT NULL DEFAULT 0 CHECK(post_counter >= 0), - amount_val INT8 NOT NULL, - amount_frac INT4 NOT NULL, + amount taler_amount NOT NULL, payment_identifier BYTEA NOT NULL CHECK(LENGTH(payment_identifier)=32), creation_date INT8 NOT NULL, paid BOOLEAN NOT NULL DEFAULT FALSE); @@ -94,10 +99,8 @@ COMMENT ON COLUMN anastasis_recdoc_payment.user_id IS 'Link to the corresponding user who paid'; COMMENT ON COLUMN anastasis_recdoc_payment.post_counter IS 'For how many posts does the user pay'; -COMMENT ON COLUMN anastasis_recdoc_payment.amount_val +COMMENT ON COLUMN anastasis_recdoc_payment.amount IS 'Amount we were paid'; -COMMENT ON COLUMN anastasis_recdoc_payment.amount_frac - IS 'Amount we were paid fraction'; COMMENT ON COLUMN anastasis_recdoc_payment.payment_identifier IS 'Payment identifier which the user has to provide'; COMMENT ON COLUMN anastasis_recdoc_payment.creation_date @@ -109,8 +112,7 @@ COMMENT ON COLUMN anastasis_recdoc_payment.paid CREATE TABLE IF NOT EXISTS anastasis_challenge_payment (payment_id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, truth_uuid BYTEA CHECK(LENGTH(truth_uuid)=32) NOT NULL, - amount_val INT8 NOT NULL, - amount_frac INT4 NOT NULL, + amount taler_amount NOT NULL, payment_identifier BYTEA NOT NULL CHECK(LENGTH(payment_identifier)=32), creation_date INT8 NOT NULL, counter INT4 NOT NULL DEFAULT 3, @@ -123,10 +125,8 @@ COMMENT ON COLUMN anastasis_challenge_payment.payment_id IS 'Serial number which identifies the payment'; COMMENT ON COLUMN anastasis_challenge_payment.truth_uuid IS 'Link to the corresponding challenge which is paid'; -COMMENT ON COLUMN anastasis_challenge_payment.amount_val +COMMENT ON COLUMN anastasis_challenge_payment.amount IS 'Amount we were paid'; -COMMENT ON COLUMN anastasis_challenge_payment.amount_frac - IS 'Amount we were paid fraction'; COMMENT ON COLUMN anastasis_challenge_payment.payment_identifier IS 'Payment identifier which the user has to provide'; COMMENT ON COLUMN anastasis_challenge_payment.counter @@ -208,8 +208,7 @@ CREATE TABLE IF NOT EXISTS anastasis_auth_iban_in (auth_in_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE ,wire_reference INT8 NOT NULL PRIMARY KEY ,wire_subject TEXT NOT NULL - ,credit_val INT8 NOT NULL - ,credit_frac INT4 NOT NULL + ,credit taler_amount NOT NULL ,debit_account_details TEXT NOT NULL ,credit_account_details TEXT NOT NULL ,execution_date INT8 NOT NULL @@ -220,6 +219,8 @@ COMMENT ON COLUMN anastasis_auth_iban_in.wire_reference IS 'Unique number identifying the wire transfer in LibEuFin/Nexus'; COMMENT ON COLUMN anastasis_auth_iban_in.wire_subject IS 'For authentication, this contains the code, but also additional text'; +COMMENT ON COLUMN anastasis_auth_iban_in.credit + IS 'Amount we were credited'; COMMENT ON COLUMN anastasis_auth_iban_in.execution_date IS 'Used both for (theoretical) garbage collection and to see if the transfer happened on time'; COMMENT ON COLUMN anastasis_auth_iban_in.credit_account_details -- cgit v1.2.3