summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2022-11-26 23:26:44 +0100
committerChristian Grothoff <christian@grothoff.org>2022-11-26 23:26:44 +0100
commit746a8a0cdb7b3494230d41e870173936120cd34b (patch)
tree97f576f9808f5e55da8c11f95ebfe64a65270bd9 /src
parent95149f345fc1daefd2ea703538e31b1be29fb902 (diff)
downloadexchange-746a8a0cdb7b3494230d41e870173936120cd34b.tar.gz
exchange-746a8a0cdb7b3494230d41e870173936120cd34b.tar.bz2
exchange-746a8a0cdb7b3494230d41e870173936120cd34b.zip
-remove shard support
Diffstat (limited to 'src')
-rw-r--r--src/exchange-tools/taler-exchange-dbinit.c49
-rw-r--r--src/exchangedb/Makefile.am26
-rw-r--r--src/exchangedb/common-0001.sql81
-rw-r--r--src/exchangedb/common-0002.sql288
-rw-r--r--src/exchangedb/exchange-0001-part.sql34
-rw-r--r--src/exchangedb/exchange-0002-part.sql3
-rw-r--r--src/exchangedb/exchange-0002.sql.in3
-rw-r--r--src/exchangedb/pg_complete_shard.c9
-rw-r--r--src/exchangedb/pg_create_shard_tables.c66
-rw-r--r--src/exchangedb/pg_create_shard_tables.h39
-rw-r--r--src/exchangedb/pg_setup_foreign_servers.c118
-rw-r--r--src/exchangedb/pg_setup_foreign_servers.h39
-rw-r--r--src/exchangedb/plugin_exchangedb_postgres.c30
-rw-r--r--src/exchangedb/procedures.sql1
-rw-r--r--src/exchangedb/shard-0002-part.sql16
15 files changed, 160 insertions, 642 deletions
diff --git a/src/exchange-tools/taler-exchange-dbinit.c b/src/exchange-tools/taler-exchange-dbinit.c
index 7dd5c0151..db3d65a29 100644
--- a/src/exchange-tools/taler-exchange-dbinit.c
+++ b/src/exchange-tools/taler-exchange-dbinit.c
@@ -50,21 +50,11 @@ static int gc_db;
static uint32_t num_partitions;
/**
- * -F option: setup a sharded database, i.e. create foreign tables/server
- */
-static int shard_db;
-
-/**
* -f option: force partitions to be created when there is only one
*/
static int force_create_partitions;
/**
- * -S option: setup a database on a shard server, creates tables with suffix shard_idx
- */
-static uint32_t shard_idx;
-
-/**
* Main function that will be run.
*
* @param cls closure
@@ -100,21 +90,6 @@ run (void *cls,
"Could not drop tables as requested. Either database was not yet initialized, or permission denied. Consult the logs. Will still try to create new tables.\n");
}
}
- if (0 < shard_idx)
- {
- if (GNUNET_OK !=
- plugin->create_shard_tables (plugin->cls,
- shard_idx))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Could not create shard database\n");
- global_ret = EXIT_NOTINSTALLED;
- }
- /* We do not want to continue if we are on a shard */
- TALER_EXCHANGEDB_plugin_unload (plugin);
- plugin = NULL;
- return;
- }
if (GNUNET_OK !=
plugin->create_tables (plugin->cls))
{
@@ -132,16 +107,9 @@ run (void *cls,
&& force_create_partitions))
{
enum GNUNET_GenericReturnValue r = GNUNET_OK;
- if (shard_db)
- {
- r = plugin->setup_foreign_servers (plugin->cls,
- num_partitions);
- }
- else
- {
- r = plugin->setup_partitions (plugin->cls,
- num_partitions);
- }
+
+ r = plugin->setup_partitions (plugin->cls,
+ num_partitions);
if (GNUNET_OK != r)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -220,17 +188,8 @@ main (int argc,
GNUNET_GETOPT_option_uint ('P',
"partition",
"NUMBER",
- "Setup a partitioned database where each table which can be partitioned holds NUMBER partitions on a single DB node (NOTE: sharding add -F for sharding)",
+ "Setup a partitioned database where each table which can be partitioned holds NUMBER partitions on a single DB node",
&num_partitions),
- GNUNET_GETOPT_option_flag ('F',
- "foreign",
- "Setup a sharded database with foreign servers (shards) / tables rather than a partitioned one, must be called as DB superuser.",
- &shard_db),
- GNUNET_GETOPT_option_uint ('S',
- "shard",
- "INDEX",
- "Setup a shard server, creates tables with INDEX as suffix",
- &shard_idx),
GNUNET_GETOPT_option_flag ('f',
"force",
"Force partitions to be created if there is only one partition",
diff --git a/src/exchangedb/Makefile.am b/src/exchangedb/Makefile.am
index 043b438c7..595bb9032 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 a95d74d2a..3c2a850d1 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 0f7b1f52b..388d5547e 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 72b084104..59e684e11 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 1697a3755..2381d8b2d 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 b25555ce9..a09ea58ff 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 5efea7c03..8e62809c5 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 4fb6940f9..000000000
--- 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 31ab49a4d..000000000
--- 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 490ae4c24..000000000
--- 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 65ba03430..000000000
--- 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 5b59d4b05..2f8b9b57f 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 ff282735c..9783d2b13 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 439d672a6..723154f1d 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
-$$;