diff options
Diffstat (limited to 'src/exchangedb')
| -rw-r--r-- | src/exchangedb/Makefile.am | 26 | ||||
| -rw-r--r-- | src/exchangedb/common-0001.sql | 81 | ||||
| -rw-r--r-- | src/exchangedb/common-0002.sql | 288 | ||||
| -rw-r--r-- | src/exchangedb/exchange-0001-part.sql | 34 | ||||
| -rw-r--r-- | src/exchangedb/exchange-0002-part.sql | 3 | ||||
| -rw-r--r-- | src/exchangedb/exchange-0002.sql.in | 3 | ||||
| -rw-r--r-- | src/exchangedb/pg_complete_shard.c | 9 | ||||
| -rw-r--r-- | src/exchangedb/pg_create_shard_tables.c | 66 | ||||
| -rw-r--r-- | src/exchangedb/pg_create_shard_tables.h | 39 | ||||
| -rw-r--r-- | src/exchangedb/pg_setup_foreign_servers.c | 118 | ||||
| -rw-r--r-- | src/exchangedb/pg_setup_foreign_servers.h | 39 | ||||
| -rw-r--r-- | src/exchangedb/plugin_exchangedb_postgres.c | 30 | ||||
| -rw-r--r-- | src/exchangedb/procedures.sql | 1 | ||||
| -rw-r--r-- | src/exchangedb/shard-0002-part.sql | 16 | 
14 files changed, 156 insertions, 597 deletions
| diff --git a/src/exchangedb/Makefile.am b/src/exchangedb/Makefile.am index 043b438c..595bb903 100644 --- a/src/exchangedb/Makefile.am +++ b/src/exchangedb/Makefile.am @@ -18,33 +18,25 @@ sqlinputs = \    common-0001.sql \    exchange-0001.sql.in \    exchange-0001-part.sql \ -  shard-0001-part.sql \ -  shard-0001.sql.in \    common-0002.sql \    exchange-0002.sql.in \ -  exchange-0002-part.sql \ -  shard-0002-part.sql \ -  shard-0002.sql.in +  exchange-0002-part.sql  sql_DATA = \    benchmark-0001.sql \    versioning.sql \    exchange-0001.sql \    drop.sql \ -  procedures.sql \ -  shard-0001.sql +  procedures.sql  BUILT_SOURCES = \ -  shard-0001.sql \    exchange-0001.sql \    drop.sql \    procedures.sql  CLEANFILES = \ -  shard-0001.sql \    exchange-0001.sql \ -  shard-0002.sql \ -  exchange-0002.sql  +  exchange-0002.sql  exchange-0001.sql: common-0001.sql exchange-0001-part.sql exchange-0001.sql.in  	chmod +w $@ || true @@ -56,16 +48,6 @@ exchange-0002.sql: common-0002.sql exchange-0002-part.sql exchange-0002.sql.in  	gcc -E -P -undef - < exchange-0002.sql.in 2>/dev/null | sed -e "s/--.*//" | awk 'NF' - >$@  	chmod ugo-w $@ -shard-0001.sql: common-0001.sql shard-0001-part.sql exchange-0001.sql.in -	chmod +w $@ || true -	gcc -E -P -undef - < shard-0001.sql.in 2>/dev/null | sed -e "s/--.*//" | awk 'NF' - >$@ -	chmod ugo-w $@ - -shard-0002.sql: common-0002.sql shard-0002-part.sql exchange-0002.sql.in -	chmod +w $@ || true -	gcc -E -P -undef - < shard-0002.sql.in 2>/dev/null | sed -e "s/--.*//" | awk 'NF' - >$@ -	chmod ugo-w $@ -  EXTRA_DIST = \    exchangedb.conf \    exchangedb-postgres.conf \ @@ -111,7 +93,6 @@ libtaler_plugin_exchangedb_postgres_la_SOURCES = \    pg_select_contract_by_purse.h pg_select_contract_by_purse.c \    pg_insert_drain_profit.h pg_insert_drain_profit.c \    pg_create_tables.h pg_create_tables.c \ -  pg_setup_foreign_servers.h pg_setup_foreign_servers.c \    pg_event_listen.h pg_event_listen.c \    pg_event_listen_cancel.h pg_event_listen_cancel.c \    pg_event_notify.h pg_event_notify.c \ @@ -225,7 +206,6 @@ libtaler_plugin_exchangedb_postgres_la_SOURCES = \    pg_do_batch_withdraw_insert.h pg_do_batch_withdraw_insert.c \    pg_do_reserve_open.c pg_do_reserve_open.h \    pg_do_withdraw.h pg_do_withdraw.c \ -  pg_create_shard_tables.h pg_create_shard_tables.c \    pg_preflight.h pg_preflight.c \    pg_iterate_active_signkeys.h pg_iterate_active_signkeys.c \    pg_commit.h pg_commit.c \ diff --git a/src/exchangedb/common-0001.sql b/src/exchangedb/common-0001.sql index a95d74d2..3c2a850d 100644 --- a/src/exchangedb/common-0001.sql +++ b/src/exchangedb/common-0001.sql @@ -50,7 +50,6 @@ RETURNS VOID  LANGUAGE plpgsql  AS $$  BEGIN -    PERFORM create_partitioned_table(      'CREATE TABLE IF NOT EXISTS %I'        '(wire_target_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE' @@ -61,7 +60,6 @@ BEGIN      ,'PARTITION BY HASH (wire_target_h_payto)'      ,shard_suffix    ); -  END  $$; @@ -1010,61 +1008,6 @@ BEGIN  END  $$; ------------------------------ refunds ------------------------------ - -CREATE OR REPLACE FUNCTION create_table_refunds( -  IN shard_suffix VARCHAR DEFAULT NULL -) -RETURNS VOID -LANGUAGE plpgsql -AS $$ -DECLARE -  table_name VARCHAR DEFAULT 'refunds'; -BEGIN - -  PERFORM create_partitioned_table( -    'CREATE TABLE IF NOT EXISTS %I' -      '(refund_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE' -      ',coin_pub BYTEA NOT NULL CHECK (LENGTH(coin_pub)=32)' -- REFERENCES known_coins (coin_pub) ON DELETE CASCADE -      ',deposit_serial_id INT8 NOT NULL' -- REFERENCES deposits (deposit_serial_id) ON DELETE CASCADE' -      ',merchant_sig BYTEA NOT NULL CHECK(LENGTH(merchant_sig)=64)' -      ',rtransaction_id INT8 NOT NULL' -      ',amount_with_fee_val INT8 NOT NULL' -      ',amount_with_fee_frac INT4 NOT NULL' -      -- ,PRIMARY KEY (deposit_serial_id, rtransaction_id) -- done per shard! -    ') %s ;' -    ,table_name -    ,'PARTITION BY HASH (coin_pub)' -    ,shard_suffix -  ); - -  table_name = concat_ws('_', table_name, shard_suffix); - -  EXECUTE FORMAT ( -    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_coin_pub_index ' -    'ON ' || table_name || ' ' -    '(coin_pub);' -  ); - -END -$$; - -CREATE OR REPLACE FUNCTION add_constraints_to_refunds_partition( -  IN partition_suffix VARCHAR -) -RETURNS void -LANGUAGE plpgsql -AS $$ -BEGIN -  EXECUTE FORMAT ( -    'ALTER TABLE refunds_' || partition_suffix || ' ' -      'ADD CONSTRAINT refunds_' || partition_suffix || '_refund_serial_id_key ' -        'UNIQUE (refund_serial_id) ' -      ',ADD PRIMARY KEY (deposit_serial_id, rtransaction_id) ' -  ); -END -$$; -  ---------------------------- wire_out -------------------------------  CREATE OR REPLACE FUNCTION create_table_wire_out( @@ -2028,30 +1971,6 @@ $$;  ------------------------- Partitions ------------------------------  ------------------------------------------------------------------- -CREATE OR REPLACE FUNCTION create_hash_partition( -    source_table_name VARCHAR -    ,modulus INTEGER -    ,partition_num INTEGER -  ) -  RETURNS VOID -  LANGUAGE plpgsql -AS $$ -BEGIN - -  RAISE NOTICE 'Creating partition %_%', source_table_name, partition_num; - -  EXECUTE FORMAT( -    'CREATE TABLE IF NOT EXISTS %I ' -      'PARTITION OF %I ' -      'FOR VALUES WITH (MODULUS %s, REMAINDER %s)' -    ,source_table_name || '_' || partition_num -    ,source_table_name -    ,modulus -    ,partition_num-1 -  ); - -END -$$;  CREATE OR REPLACE FUNCTION create_range_partition(    source_table_name VARCHAR diff --git a/src/exchangedb/common-0002.sql b/src/exchangedb/common-0002.sql index 0f7b1f52..388d5547 100644 --- a/src/exchangedb/common-0002.sql +++ b/src/exchangedb/common-0002.sql @@ -14,192 +14,174 @@  -- TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>  -- +-------------------------------- + +CREATE TABLE IF NOT EXISTS exchange_tables +  (table_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY +  ,name VARCHAR NOT NULL +  ,version VARCHAR NOT NULL +  ,action VARCHAR NOT NULL +  ,partitioned BOOL NOT NULL +  ,by_range BOOL NOT NULL); +COMMENT ON TABLE exchange_tables +  IS 'Tables of the exchange and their status'; +COMMENT ON COLUMN exchange_tables.name +  IS 'Base name of the table (without partition/shard)'; +COMMENT ON COLUMN exchange_tables.version +  IS 'Version of the DB in which the given action happened'; +COMMENT ON COLUMN exchange_tables.action +  IS 'Action to take on the table (e.g. create, alter, constrain, unconstrain, or drop)'; +COMMENT ON COLUMN exchange_tables.partitioned +  IS 'TRUE if the table is partitioned'; +COMMENT ON COLUMN exchange_tables.by_range +  IS 'TRUE if the table is partitioned by range'; + + +INSERT INTO exchange_tables +    (name +    ,version +    ,action +    ,partitioned +    ,by_range) +  VALUES +    ('denominations', 'exchange-0001', 'create', FALSE, FALSE) +   ,('denomination_revocations', 'exchange-0001', 'create', FALSE, FALSE) +   ,('kyc_alerts', 'exchange-0001', 'create', FALSE, FALSE) +   ,('profit_drains', 'exchange-0001', 'create', FALSE, FALSE) +   ,('auditors', 'exchange-0001', 'create', FALSE, FALSE) +   ,('auditor_denom_sigs', 'exchange-0001', 'create', FALSE, FALSE) +   ,('exchange_sign_keys', 'exchange-0001', 'create', FALSE, FALSE) +   ,('signkey_revocations', 'exchange-0001', 'create', FALSE, FALSE) +   ,('extensions', 'exchange-0001', 'create', FALSE, FALSE) +   ,('wire_fee', 'exchange-0001', 'create', FALSE, FALSE) +   ,('global_fee', 'exchange-0001', 'create', FALSE, FALSE) +   ,('wire_accounts', 'exchange-0001', 'create', FALSE, FALSE) +   ,('work_shards', 'exchange-0001', 'create', FALSE, FALSE) +   ,('revolving_work_shards', 'exchange-0001', 'create', FALSE, FALSE) +   ,('partners', 'exchange-0001', 'create', FALSE, FALSE) +   ,('partner_accounts', 'exchange-0001', 'create', FALSE, FALSE) +   ,('purse_actions', 'exchange-0001', 'create', FALSE, FALSE) +   ,('policy_fulfillments', 'exchange-0001', 'create', FALSE, FALSE) -- bad! +   ,('policy_details', 'exchange-0001', 'create', FALSE, FALSE) -- bad! +   ,('wire_targets''exchange-0001', 'create', TRUE, FALSE) +   ,('legitimization_processes', 'exchange-0001', 'create', TRUE, FALSE) +   ,('legitimization_requirements', 'exchange-0001', 'create', TRUE, FALSE) +   ,('reserves', 'exchange-0001', 'create', TRUE, FALSE) +   ,('reserves_in', 'exchange-0001', 'create', TRUE, FALSE) +   ,('reserves_close', 'exchange-0001', 'create', TRUE, FALSE) +   ,('reserves_open_requests', 'exchange-0001', 'create', TRUE, FALSE) +   ,('reserves_open_deposits', 'exchange-0001', 'create', TRUE, FALSE) +   ,('reserves_out', 'exchange-0001', 'create', TRUE, FALSE) +   ,('reserves_out_by_reserve', 'exchange-0001', 'create', TRUE, FALSE) +   ,('known_coins', 'exchange-0001', 'create', TRUE, FALSE) +   ,('refresh_commitments', 'exchange-0001', 'create', TRUE, FALSE) +   ,('refresh_revealed_coins', 'exchange-0001', 'create', TRUE, FALSE) +   ,('refresh_transfer_keys', 'exchange-0001', 'create', TRUE, FALSE) +   ,('refunds', 'exchange-0001', 'create', TRUE, FALSE) +   ,('deposits', 'exchange-0001', 'create', TRUE, FALSE) +   ,('deposits_by_ready', 'exchange-0001', 'create', TRUE, TRUE) +   ,('deposits_for_matching', 'exchange-0001', 'create', TRUE, TRUE) +   ,('wire_out', 'exchange-0001', 'create', TRUE, FALSE) +   ,('aggregation_transient', 'exchange-0001', 'create', TRUE, FALSE) +   ,('aggregation_tracking', 'exchange-0001', 'create', TRUE, FALSE) +   ,('recoup', 'exchange-0001', 'create', TRUE, FALSE) +   ,('recoup_by_reserve', 'exchange-0001', 'create', TRUE, FALSE) +   ,('recoup_refresh', 'exchange-0001', 'create', TRUE, FALSE) +   ,('prewire', 'exchange-0001', 'create', TRUE, FALSE) +   ,('cs_nonce_locks', 'exchange-0001', 'create', TRUE, FALSE) +   ,('purse_requests', 'exchange-0001', 'create', TRUE, FALSE) +   ,('purse_decision', 'exchange-0001', 'create', TRUE, FALSE) +   ,('purse_merges', 'exchange-0001', 'create', TRUE, FALSE) +   ,('account_merges', 'exchange-0001', 'create', TRUE, FALSE) +   ,('contracts', 'exchange-0001', 'create', TRUE, FALSE) +   ,('history_requests', 'exchange-0001', 'create', TRUE, FALSE) +   ,('close_requests', 'exchange-0001', 'create', TRUE, FALSE) +   ,('purse_deposists', 'exchange-0001', 'create', TRUE, FALSE) +   ,('wads_out', 'exchange-0001', 'create', TRUE, FALSE) +   ,('wads_out_entries', 'exchange-0001', 'create', TRUE, FALSE) +   ,('wads_in', 'exchange-0001', 'create', TRUE, FALSE) +   ,('wads_in_entries', 'exchange-0001', 'create', TRUE, FALSE) + ON CONFLICT DO NOTHING; + + +  -------------------- Tables ---------------------------- -CREATE OR REPLACE FUNCTION create_table_wire_targets( +CREATE OR REPLACE FUNCTION create_table_purse_deletion(    IN shard_suffix VARCHAR DEFAULT NULL  )  RETURNS VOID  LANGUAGE plpgsql  AS $$  BEGIN -    PERFORM create_partitioned_table(      'CREATE TABLE IF NOT EXISTS %I' -      '(wire_target_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE' -      ',wire_target_h_payto BYTEA PRIMARY KEY CHECK (LENGTH(wire_target_h_payto)=32)' -      ',payto_uri VARCHAR NOT NULL' +      '(purse_deletion_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE' +      ',purse_sig BYTEA CHECK (LENGTH(purse_sig)=64)' +      ',XXX VARCHAR NOT NULL'      ') %s ;' -    ,'wire_targets' -    ,'PARTITION BY HASH (wire_target_h_payto)' +    ,'purse_deletion' +    ,'PARTITION BY HASH (XXX)'      ,shard_suffix    ); - +  COMMENT ON TABLE purse_deletion +    IS 'signatures affirming explicit purse deletions'; +  COMMENT ON COLUMN purse_deletion.purse_sig +    IS 'signature of type XXX';  END  $$; +COMMENT ON FUNCTION create_table_purse_deletion +  IS 'Creates the purse_deletion table'; --- We need a separate function for this, as we call create_table only once but need to add --- those constraints to each partition which gets created -CREATE OR REPLACE FUNCTION add_constraints_to_wire_targets_partition( +CREATE OR REPLACE FUNCTION constrain_table_purse_deletion(    IN partition_suffix VARCHAR  )  RETURNS void  LANGUAGE plpgsql  AS $$  BEGIN -    EXECUTE FORMAT ( -    'ALTER TABLE wire_targets_' || partition_suffix || ' ' -      'ADD CONSTRAINT wire_targets_' || partition_suffix || '_wire_target_serial_id_key ' -        'UNIQUE (wire_target_serial_id)' +    'ALTER TABLE purse_deletion_' || partition_suffix || ' ' +      'ADD CONSTRAINT purse_deletion_' || partition_suffix || '_XXX ' +        'UNIQUE (XXX)'    );  END  $$; - -CREATE OR REPLACE FUNCTION detach_default_partitions2() -  RETURNS VOID -  LANGUAGE plpgsql -AS $$ -BEGIN - -  RAISE NOTICE 'Detaching all default table partitions'; - -  ALTER TABLE IF EXISTS wire_targets -    DETACH PARTITION wire_targets_default; - -END -$$; - -COMMENT ON FUNCTION detach_default_partitions2 -  IS 'We need to drop default and create new one before deleting the default partitions -      otherwise constraints get lost too. Might be needed in sharding too'; - - -CREATE OR REPLACE FUNCTION drop_default_partitions2() -  RETURNS VOID -  LANGUAGE plpgsql -AS $$ -BEGIN - -  RAISE NOTICE 'Dropping default table partitions'; - -  DROP TABLE IF EXISTS wire_targets_default; -END -$$; - -COMMENT ON FUNCTION drop_default_partitions2 -  IS 'Drop all default partitions once other partitions are attached. -      Might be needed in sharding too.'; - - -CREATE OR REPLACE FUNCTION create_partitions2( -    num_partitions INTEGER -) -RETURNS VOID -LANGUAGE plpgsql -AS $$ -DECLARE -  modulus INTEGER; -BEGIN - -  modulus := num_partitions; - -  PERFORM detach_default_partitions2(); - -  LOOP - -    PERFORM create_hash_partition( -      'wire_targets' -      ,modulus -      ,num_partitions -    ); -    PERFORM add_constraints_to_wire_targets_partition(num_partitions::varchar); - -  END LOOP; - -  PERFORM drop_default_partitions2(); - -END -$$; - - -CREATE OR REPLACE FUNCTION prepare_sharding2() -RETURNS VOID -LANGUAGE plpgsql -AS $$ -BEGIN - -  PERFORM detach_default_partitions2(); - -  ALTER TABLE IF EXISTS wire_targets -    DROP CONSTRAINT IF EXISTS wire_targets_pkey CASCADE -  ; - -END -$$; - - -CREATE OR REPLACE FUNCTION create_shard_server2( -    shard_suffix VARCHAR -    ,total_num_shards INTEGER -    ,current_shard_num INTEGER -    ,remote_host VARCHAR -    ,remote_user VARCHAR -    ,remote_user_password VARCHAR -    ,remote_db_name VARCHAR DEFAULT 'taler-exchange' -    ,remote_port INTEGER DEFAULT '5432' -    ,local_user VARCHAR DEFAULT 'taler-exchange-httpd' +CREATE OR REPLACE FUNCTION alter_create_was_deleted_table_purse_requests ( +  IN partition_suffix VARCHAR  ) -RETURNS VOID +RETURNS void  LANGUAGE plpgsql  AS $$  BEGIN - -  RAISE NOTICE 'Creating server %', remote_host; - -  PERFORM create_foreign_hash_partition( -    'wire_targets' -    ,total_num_shards -    ,shard_suffix -    ,current_shard_num -    ,local_user +  EXECUTE FORMAT ( +    'ALTER TABLE purse_requests_' || partition_suffix || +    ' ADD COLUMN' +    ' was_deleted BOOLEAN NOT NULL DEFAULT(FALSE)'    );  END  $$; -COMMENT ON FUNCTION create_shard_server2 -  IS 'Create a shard server on the master -      node with all foreign tables and user mappings'; - - - --------------------------------- - -CREATE TABLE IF NOT EXISTS partitioned_tables -  (name VARCHAR PRIMARY KEY NOT NULL); - -INSERT INTO partitioned_tables -    (name) +INSERT INTO exchange_tables +    (name +    ,version +    ,action +    ,partitioned +    ,by_range)    VALUES -    ('wire_targets') -   ,('refunds') -  ON CONFLICT DO NOTHING; - - -CREATE OR REPLACE FUNCTION drop_default_partitions() -  RETURNS VOID -  LANGUAGE plpgsql -AS $$ -DECLARE -  tc CURSOR FOR SELECT name FROM partitioned_tables; -BEGIN - -  RAISE NOTICE 'Dropping default table partitions'; -  FOR rec IN tc -  LOOP -    EXECUTE FORMAT ( -      'DROP TABLE IF EXISTS %s_default ;'::text, -    rec.name; -END   -$$; +    ('purse_deletion' +    ,'exchange-0002' +    ,'create' +    ,TRUE +    ,FALSE), +    ('purse_deletion' +    ,'exchange-0002' +    ,'constrain' +    ,TRUE +    ,FALSE), +    ('purse_requests' +    ,'exchange-0002' +    ,'alter_create_was_deleted' +    ,TRUE +    ,FALSE); diff --git a/src/exchangedb/exchange-0001-part.sql b/src/exchangedb/exchange-0001-part.sql index 72b08410..59e684e1 100644 --- a/src/exchangedb/exchange-0001-part.sql +++ b/src/exchangedb/exchange-0001-part.sql @@ -16,40 +16,6 @@  -- ------------------------------ denominations ---------------------------------------- -CREATE TABLE IF NOT EXISTS denominations -  (denominations_serial BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE -  ,denom_pub_hash BYTEA PRIMARY KEY CHECK (LENGTH(denom_pub_hash)=64) -  ,denom_type INT4 NOT NULL DEFAULT (1) -- 1 == RSA (for now, remove default later!) -  ,age_mask INT4 NOT NULL DEFAULT (0) -  ,denom_pub BYTEA NOT NULL -  ,master_sig BYTEA NOT NULL CHECK (LENGTH(master_sig)=64) -  ,valid_from INT8 NOT NULL -  ,expire_withdraw INT8 NOT NULL -  ,expire_deposit INT8 NOT NULL -  ,expire_legal INT8 NOT NULL -  ,coin_val INT8 NOT NULL -  ,coin_frac INT4 NOT NULL -  ,fee_withdraw_val INT8 NOT NULL -  ,fee_withdraw_frac INT4 NOT NULL -  ,fee_deposit_val INT8 NOT NULL -  ,fee_deposit_frac INT4 NOT NULL -  ,fee_refresh_val INT8 NOT NULL -  ,fee_refresh_frac INT4 NOT NULL -  ,fee_refund_val INT8 NOT NULL -  ,fee_refund_frac INT4 NOT NULL -  ); -COMMENT ON TABLE denominations -  IS 'Main denominations table. All the valid denominations the exchange knows about.'; -COMMENT ON COLUMN denominations.denom_type -  IS 'determines cipher type for blind signatures used with this denomination; 0 is for RSA'; -COMMENT ON COLUMN denominations.age_mask -  IS 'bitmask with the age restrictions that are being used for this denomination; 0 if denomination does not support the use of age restrictions'; -COMMENT ON COLUMN denominations.denominations_serial -  IS 'needed for exchange-auditor replication logic'; - -CREATE INDEX IF NOT EXISTS denominations_by_expire_legal_index -  ON denominations -  (expire_legal);  -- ------------------------------ denomination_revocations ---------------------------------------- diff --git a/src/exchangedb/exchange-0002-part.sql b/src/exchangedb/exchange-0002-part.sql index 1697a375..2381d8b2 100644 --- a/src/exchangedb/exchange-0002-part.sql +++ b/src/exchangedb/exchange-0002-part.sql @@ -31,3 +31,6 @@ CREATE TABLE IF NOT EXISTS wire_targets_default  SELECT add_constraints_to_wire_targets_partition('default'); + + +SELECT create_tables('exchange-0002'); diff --git a/src/exchangedb/exchange-0002.sql.in b/src/exchangedb/exchange-0002.sql.in index b25555ce..a09ea58f 100644 --- a/src/exchangedb/exchange-0002.sql.in +++ b/src/exchangedb/exchange-0002.sql.in @@ -24,7 +24,6 @@ SELECT _v.register_patch('exchange-0002', NULL, NULL);  SET search_path TO exchange; -#include "common-0002.sql" -#include "exchange-0002-part.sql" +#include "0002-denominations.sql"  COMMIT; diff --git a/src/exchangedb/pg_complete_shard.c b/src/exchangedb/pg_complete_shard.c index 5efea7c0..8e62809c 100644 --- a/src/exchangedb/pg_complete_shard.c +++ b/src/exchangedb/pg_complete_shard.c @@ -27,12 +27,11 @@  enum GNUNET_DB_QueryStatus  TEH_PG_complete_shard (void *cls, -                         const char *job_name, -                         uint64_t start_row, -                         uint64_t end_row) +                       const char *job_name, +                       uint64_t start_row, +                       uint64_t end_row)  {    struct PostgresClosure *pg = cls; -    struct GNUNET_PQ_QueryParam params[] = {      GNUNET_PQ_query_param_string (job_name),      GNUNET_PQ_query_param_uint64 (&start_row), @@ -44,8 +43,6 @@ TEH_PG_complete_shard (void *cls,                "Completing shard %llu-%llu\n",                (unsigned long long) start_row,                (unsigned long long) end_row); - -    PREPARE (pg,             "complete_shard",             "UPDATE work_shards" diff --git a/src/exchangedb/pg_create_shard_tables.c b/src/exchangedb/pg_create_shard_tables.c deleted file mode 100644 index 4fb6940f..00000000 --- a/src/exchangedb/pg_create_shard_tables.c +++ /dev/null @@ -1,66 +0,0 @@ -/* -   This file is part of TALER -   Copyright (C) 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/> - */ -/** - * @file exchangedb/pg_create_shard_tables.c - * @brief Implementation of the create_shard_tables function for Postgres - * @author Christian Grothoff - */ -#include "platform.h" -#include "taler_error_codes.h" -#include "taler_dbevents.h" -#include "taler_pq_lib.h" -#include "pg_create_shard_tables.h" -#include "pg_helper.h" - - -enum GNUNET_GenericReturnValue -TEH_PG_create_shard_tables (void *cls, -                              uint32_t idx) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_Context *conn; -  enum GNUNET_GenericReturnValue ret = GNUNET_OK; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_uint32 (&idx), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ExecuteStatement es[] = { -    GNUNET_PQ_make_try_execute ("SET search_path TO exchange;"), -    GNUNET_PQ_EXECUTE_STATEMENT_END -  }; - -  struct GNUNET_PQ_PreparedStatement ps[] = { -    GNUNET_PQ_make_prepare ("create_shard_tables", -                            "SELECT" -                            " setup_shard" -                            " ($1);"), -    GNUNET_PQ_PREPARED_STATEMENT_END -  }; - -  conn = GNUNET_PQ_connect_with_cfg (pg->cfg, -                                     "exchangedb-postgres", -                                     "shard-", -                                     es, -                                     ps); -  if (NULL == conn) -    return GNUNET_SYSERR; -  if (0 > GNUNET_PQ_eval_prepared_non_select (conn, -                                              "create_shard_tables", -                                              params)) -    ret = GNUNET_SYSERR; -  GNUNET_PQ_disconnect (conn); -  return ret; -} diff --git a/src/exchangedb/pg_create_shard_tables.h b/src/exchangedb/pg_create_shard_tables.h deleted file mode 100644 index 31ab49a4..00000000 --- a/src/exchangedb/pg_create_shard_tables.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -   This file is part of TALER -   Copyright (C) 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/> - */ -/** - * @file exchangedb/pg_create_shard_tables.h - * @brief implementation of the create_shard_tables function for Postgres - * @author Christian Grothoff - */ -#ifndef PG_CREATE_SHARD_TABLES_H -#define PG_CREATE_SHARD_TABLES_H - -#include "taler_util.h" -#include "taler_json_lib.h" -#include "taler_exchangedb_plugin.h" - -/** - * Create tables of a shard node with index idx - * - * @param cls the `struct PostgresClosure` with the plugin-specific state - * @param idx the shards index, will be appended as suffix to all tables - * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure - */ -enum GNUNET_GenericReturnValue -TEH_PG_create_shard_tables (void *cls, -                            uint32_t idx); - -#endif diff --git a/src/exchangedb/pg_setup_foreign_servers.c b/src/exchangedb/pg_setup_foreign_servers.c deleted file mode 100644 index 490ae4c2..00000000 --- a/src/exchangedb/pg_setup_foreign_servers.c +++ /dev/null @@ -1,118 +0,0 @@ -/* -   This file is part of TALER -   Copyright (C) 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/> - */ -/** - * @file exchangedb/pg_setup_foreign_servers.c - * @brief Implementation of the setup_foreign_servers function for Postgres - * @author Christian Grothoff - */ -#include "platform.h" -#include "taler_error_codes.h" -#include "taler_dbevents.h" -#include "taler_pq_lib.h" -#include "pg_setup_foreign_servers.h" -#include "pg_helper.h" - - - -enum GNUNET_GenericReturnValue -TEH_PG_setup_foreign_servers (void *cls, -                                uint32_t num) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_Context *conn; -  enum GNUNET_GenericReturnValue ret = GNUNET_OK; -  char *shard_domain = NULL; -  char *remote_user = NULL; -  char *remote_user_pw = NULL; - -  if (GNUNET_OK != -      GNUNET_CONFIGURATION_get_value_string (pg->cfg, -                                             "exchange", -                                             "SHARD_DOMAIN", -                                             &shard_domain)) -  { -    GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, -                               "exchange", -                               "SHARD_DOMAIN"); -    return GNUNET_SYSERR; -  } -  if (GNUNET_OK != -      GNUNET_CONFIGURATION_get_value_string (pg->cfg, -                                             "exchangedb-postgres", -                                             "SHARD_REMOTE_USER", -                                             &remote_user)) -  { -    GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, -                               "exchangedb-postgres", -                               "SHARD_REMOTE_USER"); -    GNUNET_free (shard_domain); -    return GNUNET_SYSERR; -  } -  if (GNUNET_OK != -      GNUNET_CONFIGURATION_get_value_string (pg->cfg, -                                             "exchangedb-postgres", -                                             "SHARD_REMOTE_USER_PW", -                                             &remote_user_pw)) -  { -    GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, -                               "exchangedb-postgres", -                               "SHARD_REMOTE_USER_PW"); -    GNUNET_free (shard_domain); -    GNUNET_free (remote_user); -    return GNUNET_SYSERR; -  } - -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_uint32 (&num), -    GNUNET_PQ_query_param_string (shard_domain), -    GNUNET_PQ_query_param_string (remote_user), -    GNUNET_PQ_query_param_string (remote_user_pw), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ExecuteStatement es[] = { -    GNUNET_PQ_make_try_execute ("SET search_path TO exchange;"), -    GNUNET_PQ_EXECUTE_STATEMENT_END -  }; -  struct GNUNET_PQ_PreparedStatement ps[] = { -    GNUNET_PQ_make_prepare ("create_foreign_servers", -                            "SELECT" -                            " create_foreign_servers" -                            " ($1, $2, $3, $4);"), -    GNUNET_PQ_PREPARED_STATEMENT_END -  }; - -  conn = GNUNET_PQ_connect_with_cfg (pg->cfg, -                                     "exchangedb-postgres", -                                     NULL, -                                     es, -                                     ps); -  if (NULL == conn) -  { -    ret = GNUNET_SYSERR; -  } -  else if (0 > GNUNET_PQ_eval_prepared_non_select (conn, -                                                   "create_foreign_servers", -                                                   params)) -  { -    ret = GNUNET_SYSERR; -  } -  GNUNET_free (shard_domain); -  GNUNET_free (remote_user); -  GNUNET_free (remote_user_pw); -  GNUNET_PQ_disconnect (conn); -  return ret; -} - diff --git a/src/exchangedb/pg_setup_foreign_servers.h b/src/exchangedb/pg_setup_foreign_servers.h deleted file mode 100644 index 65ba0343..00000000 --- a/src/exchangedb/pg_setup_foreign_servers.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -   This file is part of TALER -   Copyright (C) 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/> - */ -/** - * @file exchangedb/pg_setup_foreign_servers.h - * @brief implementation of the setup_foreign_servers function for Postgres - * @author Christian Grothoff - */ -#ifndef PG_SETUP_FOREIGN_SERVERS_H -#define PG_SETUP_FOREIGN_SERVERS_H - -#include "taler_util.h" -#include "taler_json_lib.h" -#include "taler_exchangedb_plugin.h" - - -/** - * Setup foreign servers (shards) for already existing tables - * - * @param cls the `struct PostgresClosure` with the plugin-specific state - * @param num the number of foreign servers (shards) to create for each partitioned table - * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure - */ -enum GNUNET_GenericReturnValue -TEH_PG_setup_foreign_servers (void *cls, -                              uint32_t num); -#endif diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index 5b59d4b0..2f8b9b57 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -65,10 +65,8 @@  #include "pg_iterate_active_signkeys.h"  #include "pg_preflight.h"  #include "pg_commit.h" -#include "pg_create_shard_tables.h"  #include "pg_insert_aggregation_tracking.h"  #include "pg_drop_tables.h" -#include "pg_setup_partitions.h"  #include "pg_select_satisfied_kyc_processes.h"  #include "pg_select_aggregation_amounts_for_kyc_check.h"  #include "pg_kyc_provider_account_lookup.h" @@ -123,6 +121,7 @@  #include "pg_get_policy_details.h"  #include "pg_persist_policy_details.h"  #include "pg_do_deposit.h" +#include "pg_setup_partitions.h"  #include "pg_add_policy_fulfillment_proof.h"  #include "pg_do_melt.h"  #include "pg_do_refund.h" @@ -384,9 +383,6 @@ TEH_PG_internal_setup (struct PostgresClosure *pg,  } - - -  /**   * Closure for #get_refunds_cb().   */ @@ -456,9 +452,6 @@ get_refunds_cb (void *cls,  } - - -  /* Get the details of a policy, referenced by its hash code   *   * @param cls the `struct PostgresClosure` with the plugin-specific state @@ -1627,8 +1620,9 @@ postgres_ensure_coin_known (void *cls,    return TALER_EXCHANGEDB_CKS_PRESENT;  } +  enum GNUNET_DB_QueryStatus -setup_wire_target( +setup_wire_target (    struct PostgresClosure *pg,    const char *payto_uri,    struct TALER_PaytoHashP *h_payto) @@ -1654,6 +1648,8 @@ setup_wire_target(                                               "insert_kyc_status",                                               iparams);  } + +  /**   * Insert information about deposited coin into the database.   * @@ -2866,7 +2862,7 @@ postgres_insert_reserve_closed (    reserve.pub = *reserve_pub;    if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=        (qs = TEH_PG_reserves_get (cls, -                                   &reserve))) +                                 &reserve)))    {      /* Existence should have been checked before we got here... */      GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); @@ -2893,7 +2889,7 @@ postgres_insert_reserve_closed (      GNUNET_break (TALER_AAR_RESULT_ZERO == ret);    }    return TEH_PG_reserves_update (cls, -                          &reserve); +                                 &reserve);  } @@ -5168,12 +5164,8 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)      = &TEH_PG_commit;    plugin->preflight      = &TEH_PG_preflight; -  plugin->create_shard_tables -    = &TEH_PG_create_shard_tables;    plugin->insert_aggregation_tracking      = &TEH_PG_insert_aggregation_tracking; -  plugin->setup_partitions -    = &TEH_PG_setup_partitions;    plugin->select_aggregation_amounts_for_kyc_check      = &TEH_PG_select_aggregation_amounts_for_kyc_check; @@ -5245,11 +5237,8 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)      = &TEH_PG_start;    plugin->rollback      = &TEH_PG_rollback; - - plugin->create_tables +  plugin->create_tables      = &TEH_PG_create_tables; -  plugin->setup_foreign_servers -    = &TEH_PG_setup_foreign_servers;    plugin->event_listen      = &TEH_PG_event_listen;    plugin->event_listen_cancel @@ -5446,7 +5435,8 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)      = &TEH_PG_select_purse_by_merge_pub;    plugin->set_purse_balance      = &TEH_PG_set_purse_balance; - +  plugin->setup_partitions +    = &TEH_PG_setup_partitions;    plugin->batch_reserves_in_insert      = &TEH_PG_batch_reserves_in_insert; diff --git a/src/exchangedb/procedures.sql b/src/exchangedb/procedures.sql index ff282735..9783d2b1 100644 --- a/src/exchangedb/procedures.sql +++ b/src/exchangedb/procedures.sql @@ -23,6 +23,7 @@ SET search_path TO exchange;  --                      Stored procedures  --------------------------------------------------------------------------- +  CREATE OR REPLACE FUNCTION exchange_do_withdraw(    IN cs_nonce BYTEA,    IN amount_val INT8, diff --git a/src/exchangedb/shard-0002-part.sql b/src/exchangedb/shard-0002-part.sql index 439d672a..723154f1 100644 --- a/src/exchangedb/shard-0002-part.sql +++ b/src/exchangedb/shard-0002-part.sql @@ -13,19 +13,3 @@  -- 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 setup_shard2( -  shard_idx INTEGER -) -RETURNS VOID -LANGUAGE plpgsql -AS $$ -DECLARE -  shard_suffix VARCHAR; -BEGIN - -  shard_suffix = shard_idx::varchar; - -  PERFORM create_table_wire_targets(shard_suffix); -END -$$; | 
