-remove shard support
This commit is contained in:
parent
95149f345f
commit
746a8a0cdb
@ -1 +1 @@
|
|||||||
Subproject commit b971fd44ebf51a9c403dbbff144b43e73aa02c6c
|
Subproject commit a4a6b9ba4b2634c56194d53e36344686d7052cef
|
@ -49,21 +49,11 @@ static int gc_db;
|
|||||||
*/
|
*/
|
||||||
static uint32_t num_partitions;
|
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
|
* -f option: force partitions to be created when there is only one
|
||||||
*/
|
*/
|
||||||
static int force_create_partitions;
|
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.
|
* Main function that will be run.
|
||||||
*
|
*
|
||||||
@ -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");
|
"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 !=
|
if (GNUNET_OK !=
|
||||||
plugin->create_tables (plugin->cls))
|
plugin->create_tables (plugin->cls))
|
||||||
{
|
{
|
||||||
@ -132,16 +107,9 @@ run (void *cls,
|
|||||||
&& force_create_partitions))
|
&& force_create_partitions))
|
||||||
{
|
{
|
||||||
enum GNUNET_GenericReturnValue r = GNUNET_OK;
|
enum GNUNET_GenericReturnValue r = GNUNET_OK;
|
||||||
if (shard_db)
|
|
||||||
{
|
r = plugin->setup_partitions (plugin->cls,
|
||||||
r = plugin->setup_foreign_servers (plugin->cls,
|
num_partitions);
|
||||||
num_partitions);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
r = plugin->setup_partitions (plugin->cls,
|
|
||||||
num_partitions);
|
|
||||||
}
|
|
||||||
if (GNUNET_OK != r)
|
if (GNUNET_OK != r)
|
||||||
{
|
{
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||||
@ -220,17 +188,8 @@ main (int argc,
|
|||||||
GNUNET_GETOPT_option_uint ('P',
|
GNUNET_GETOPT_option_uint ('P',
|
||||||
"partition",
|
"partition",
|
||||||
"NUMBER",
|
"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),
|
&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',
|
GNUNET_GETOPT_option_flag ('f',
|
||||||
"force",
|
"force",
|
||||||
"Force partitions to be created if there is only one partition",
|
"Force partitions to be created if there is only one partition",
|
||||||
|
@ -18,33 +18,25 @@ sqlinputs = \
|
|||||||
common-0001.sql \
|
common-0001.sql \
|
||||||
exchange-0001.sql.in \
|
exchange-0001.sql.in \
|
||||||
exchange-0001-part.sql \
|
exchange-0001-part.sql \
|
||||||
shard-0001-part.sql \
|
|
||||||
shard-0001.sql.in \
|
|
||||||
common-0002.sql \
|
common-0002.sql \
|
||||||
exchange-0002.sql.in \
|
exchange-0002.sql.in \
|
||||||
exchange-0002-part.sql \
|
exchange-0002-part.sql
|
||||||
shard-0002-part.sql \
|
|
||||||
shard-0002.sql.in
|
|
||||||
|
|
||||||
sql_DATA = \
|
sql_DATA = \
|
||||||
benchmark-0001.sql \
|
benchmark-0001.sql \
|
||||||
versioning.sql \
|
versioning.sql \
|
||||||
exchange-0001.sql \
|
exchange-0001.sql \
|
||||||
drop.sql \
|
drop.sql \
|
||||||
procedures.sql \
|
procedures.sql
|
||||||
shard-0001.sql
|
|
||||||
|
|
||||||
BUILT_SOURCES = \
|
BUILT_SOURCES = \
|
||||||
shard-0001.sql \
|
|
||||||
exchange-0001.sql \
|
exchange-0001.sql \
|
||||||
drop.sql \
|
drop.sql \
|
||||||
procedures.sql
|
procedures.sql
|
||||||
|
|
||||||
CLEANFILES = \
|
CLEANFILES = \
|
||||||
shard-0001.sql \
|
|
||||||
exchange-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
|
exchange-0001.sql: common-0001.sql exchange-0001-part.sql exchange-0001.sql.in
|
||||||
chmod +w $@ || true
|
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' - >$@
|
gcc -E -P -undef - < exchange-0002.sql.in 2>/dev/null | sed -e "s/--.*//" | awk 'NF' - >$@
|
||||||
chmod ugo-w $@
|
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 = \
|
EXTRA_DIST = \
|
||||||
exchangedb.conf \
|
exchangedb.conf \
|
||||||
exchangedb-postgres.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_select_contract_by_purse.h pg_select_contract_by_purse.c \
|
||||||
pg_insert_drain_profit.h pg_insert_drain_profit.c \
|
pg_insert_drain_profit.h pg_insert_drain_profit.c \
|
||||||
pg_create_tables.h pg_create_tables.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.h pg_event_listen.c \
|
||||||
pg_event_listen_cancel.h pg_event_listen_cancel.c \
|
pg_event_listen_cancel.h pg_event_listen_cancel.c \
|
||||||
pg_event_notify.h pg_event_notify.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_batch_withdraw_insert.h pg_do_batch_withdraw_insert.c \
|
||||||
pg_do_reserve_open.c pg_do_reserve_open.h \
|
pg_do_reserve_open.c pg_do_reserve_open.h \
|
||||||
pg_do_withdraw.h pg_do_withdraw.c \
|
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_preflight.h pg_preflight.c \
|
||||||
pg_iterate_active_signkeys.h pg_iterate_active_signkeys.c \
|
pg_iterate_active_signkeys.h pg_iterate_active_signkeys.c \
|
||||||
pg_commit.h pg_commit.c \
|
pg_commit.h pg_commit.c \
|
||||||
|
@ -50,7 +50,6 @@ RETURNS VOID
|
|||||||
LANGUAGE plpgsql
|
LANGUAGE plpgsql
|
||||||
AS $$
|
AS $$
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
PERFORM create_partitioned_table(
|
PERFORM create_partitioned_table(
|
||||||
'CREATE TABLE IF NOT EXISTS %I'
|
'CREATE TABLE IF NOT EXISTS %I'
|
||||||
'(wire_target_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
|
'(wire_target_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
|
||||||
@ -61,7 +60,6 @@ BEGIN
|
|||||||
,'PARTITION BY HASH (wire_target_h_payto)'
|
,'PARTITION BY HASH (wire_target_h_payto)'
|
||||||
,shard_suffix
|
,shard_suffix
|
||||||
);
|
);
|
||||||
|
|
||||||
END
|
END
|
||||||
$$;
|
$$;
|
||||||
|
|
||||||
@ -1010,61 +1008,6 @@ BEGIN
|
|||||||
END
|
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 -------------------------------
|
---------------------------- wire_out -------------------------------
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION create_table_wire_out(
|
CREATE OR REPLACE FUNCTION create_table_wire_out(
|
||||||
@ -2028,30 +1971,6 @@ $$;
|
|||||||
------------------------- Partitions ------------------------------
|
------------------------- 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(
|
CREATE OR REPLACE FUNCTION create_range_partition(
|
||||||
source_table_name VARCHAR
|
source_table_name VARCHAR
|
||||||
|
@ -14,192 +14,174 @@
|
|||||||
-- TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
-- 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 ----------------------------
|
-------------------- Tables ----------------------------
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION create_table_wire_targets(
|
CREATE OR REPLACE FUNCTION create_table_purse_deletion(
|
||||||
IN shard_suffix VARCHAR DEFAULT NULL
|
IN shard_suffix VARCHAR DEFAULT NULL
|
||||||
)
|
)
|
||||||
RETURNS VOID
|
RETURNS VOID
|
||||||
LANGUAGE plpgsql
|
LANGUAGE plpgsql
|
||||||
AS $$
|
AS $$
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
PERFORM create_partitioned_table(
|
PERFORM create_partitioned_table(
|
||||||
'CREATE TABLE IF NOT EXISTS %I'
|
'CREATE TABLE IF NOT EXISTS %I'
|
||||||
'(wire_target_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
|
'(purse_deletion_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
|
||||||
',wire_target_h_payto BYTEA PRIMARY KEY CHECK (LENGTH(wire_target_h_payto)=32)'
|
',purse_sig BYTEA CHECK (LENGTH(purse_sig)=64)'
|
||||||
',payto_uri VARCHAR NOT NULL'
|
',XXX VARCHAR NOT NULL'
|
||||||
') %s ;'
|
') %s ;'
|
||||||
,'wire_targets'
|
,'purse_deletion'
|
||||||
,'PARTITION BY HASH (wire_target_h_payto)'
|
,'PARTITION BY HASH (XXX)'
|
||||||
,shard_suffix
|
,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
|
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
|
CREATE OR REPLACE FUNCTION constrain_table_purse_deletion(
|
||||||
-- those constraints to each partition which gets created
|
|
||||||
CREATE OR REPLACE FUNCTION add_constraints_to_wire_targets_partition(
|
|
||||||
IN partition_suffix VARCHAR
|
IN partition_suffix VARCHAR
|
||||||
)
|
)
|
||||||
RETURNS void
|
RETURNS void
|
||||||
LANGUAGE plpgsql
|
LANGUAGE plpgsql
|
||||||
AS $$
|
AS $$
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
EXECUTE FORMAT (
|
EXECUTE FORMAT (
|
||||||
'ALTER TABLE wire_targets_' || partition_suffix || ' '
|
'ALTER TABLE purse_deletion_' || partition_suffix || ' '
|
||||||
'ADD CONSTRAINT wire_targets_' || partition_suffix || '_wire_target_serial_id_key '
|
'ADD CONSTRAINT purse_deletion_' || partition_suffix || '_XXX '
|
||||||
'UNIQUE (wire_target_serial_id)'
|
'UNIQUE (XXX)'
|
||||||
);
|
);
|
||||||
END
|
END
|
||||||
$$;
|
$$;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION alter_create_was_deleted_table_purse_requests (
|
||||||
CREATE OR REPLACE FUNCTION detach_default_partitions2()
|
IN partition_suffix VARCHAR
|
||||||
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
|
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
|
LANGUAGE plpgsql
|
||||||
AS $$
|
AS $$
|
||||||
BEGIN
|
BEGIN
|
||||||
|
EXECUTE FORMAT (
|
||||||
PERFORM detach_default_partitions2();
|
'ALTER TABLE purse_requests_' || partition_suffix ||
|
||||||
|
' ADD COLUMN'
|
||||||
ALTER TABLE IF EXISTS wire_targets
|
' was_deleted BOOLEAN NOT NULL DEFAULT(FALSE)'
|
||||||
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'
|
|
||||||
)
|
|
||||||
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
|
|
||||||
);
|
);
|
||||||
END
|
END
|
||||||
$$;
|
$$;
|
||||||
|
|
||||||
COMMENT ON FUNCTION create_shard_server2
|
INSERT INTO exchange_tables
|
||||||
IS 'Create a shard server on the master
|
(name
|
||||||
node with all foreign tables and user mappings';
|
,version
|
||||||
|
,action
|
||||||
|
,partitioned
|
||||||
|
,by_range)
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS partitioned_tables
|
|
||||||
(name VARCHAR PRIMARY KEY NOT NULL);
|
|
||||||
|
|
||||||
INSERT INTO partitioned_tables
|
|
||||||
(name)
|
|
||||||
VALUES
|
VALUES
|
||||||
('wire_targets')
|
('purse_deletion'
|
||||||
,('refunds')
|
,'exchange-0002'
|
||||||
ON CONFLICT DO NOTHING;
|
,'create'
|
||||||
|
,TRUE
|
||||||
|
,FALSE),
|
||||||
CREATE OR REPLACE FUNCTION drop_default_partitions()
|
('purse_deletion'
|
||||||
RETURNS VOID
|
,'exchange-0002'
|
||||||
LANGUAGE plpgsql
|
,'constrain'
|
||||||
AS $$
|
,TRUE
|
||||||
DECLARE
|
,FALSE),
|
||||||
tc CURSOR FOR SELECT name FROM partitioned_tables;
|
('purse_requests'
|
||||||
BEGIN
|
,'exchange-0002'
|
||||||
|
,'alter_create_was_deleted'
|
||||||
RAISE NOTICE 'Dropping default table partitions';
|
,TRUE
|
||||||
FOR rec IN tc
|
,FALSE);
|
||||||
LOOP
|
|
||||||
EXECUTE FORMAT (
|
|
||||||
'DROP TABLE IF EXISTS %s_default ;'::text,
|
|
||||||
rec.name;
|
|
||||||
END
|
|
||||||
$$;
|
|
||||||
|
@ -16,40 +16,6 @@
|
|||||||
|
|
||||||
-- ------------------------------ denominations ----------------------------------------
|
-- ------------------------------ 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 ----------------------------------------
|
-- ------------------------------ denomination_revocations ----------------------------------------
|
||||||
|
@ -31,3 +31,6 @@ CREATE TABLE IF NOT EXISTS wire_targets_default
|
|||||||
|
|
||||||
SELECT add_constraints_to_wire_targets_partition('default');
|
SELECT add_constraints_to_wire_targets_partition('default');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SELECT create_tables('exchange-0002');
|
||||||
|
@ -24,7 +24,6 @@ SELECT _v.register_patch('exchange-0002', NULL, NULL);
|
|||||||
|
|
||||||
SET search_path TO exchange;
|
SET search_path TO exchange;
|
||||||
|
|
||||||
#include "common-0002.sql"
|
#include "0002-denominations.sql"
|
||||||
#include "exchange-0002-part.sql"
|
|
||||||
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
@ -27,12 +27,11 @@
|
|||||||
|
|
||||||
enum GNUNET_DB_QueryStatus
|
enum GNUNET_DB_QueryStatus
|
||||||
TEH_PG_complete_shard (void *cls,
|
TEH_PG_complete_shard (void *cls,
|
||||||
const char *job_name,
|
const char *job_name,
|
||||||
uint64_t start_row,
|
uint64_t start_row,
|
||||||
uint64_t end_row)
|
uint64_t end_row)
|
||||||
{
|
{
|
||||||
struct PostgresClosure *pg = cls;
|
struct PostgresClosure *pg = cls;
|
||||||
|
|
||||||
struct GNUNET_PQ_QueryParam params[] = {
|
struct GNUNET_PQ_QueryParam params[] = {
|
||||||
GNUNET_PQ_query_param_string (job_name),
|
GNUNET_PQ_query_param_string (job_name),
|
||||||
GNUNET_PQ_query_param_uint64 (&start_row),
|
GNUNET_PQ_query_param_uint64 (&start_row),
|
||||||
@ -44,8 +43,6 @@ TEH_PG_complete_shard (void *cls,
|
|||||||
"Completing shard %llu-%llu\n",
|
"Completing shard %llu-%llu\n",
|
||||||
(unsigned long long) start_row,
|
(unsigned long long) start_row,
|
||||||
(unsigned long long) end_row);
|
(unsigned long long) end_row);
|
||||||
|
|
||||||
|
|
||||||
PREPARE (pg,
|
PREPARE (pg,
|
||||||
"complete_shard",
|
"complete_shard",
|
||||||
"UPDATE work_shards"
|
"UPDATE work_shards"
|
||||||
|
@ -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;
|
|
||||||
}
|
|
@ -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
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
@ -65,10 +65,8 @@
|
|||||||
#include "pg_iterate_active_signkeys.h"
|
#include "pg_iterate_active_signkeys.h"
|
||||||
#include "pg_preflight.h"
|
#include "pg_preflight.h"
|
||||||
#include "pg_commit.h"
|
#include "pg_commit.h"
|
||||||
#include "pg_create_shard_tables.h"
|
|
||||||
#include "pg_insert_aggregation_tracking.h"
|
#include "pg_insert_aggregation_tracking.h"
|
||||||
#include "pg_drop_tables.h"
|
#include "pg_drop_tables.h"
|
||||||
#include "pg_setup_partitions.h"
|
|
||||||
#include "pg_select_satisfied_kyc_processes.h"
|
#include "pg_select_satisfied_kyc_processes.h"
|
||||||
#include "pg_select_aggregation_amounts_for_kyc_check.h"
|
#include "pg_select_aggregation_amounts_for_kyc_check.h"
|
||||||
#include "pg_kyc_provider_account_lookup.h"
|
#include "pg_kyc_provider_account_lookup.h"
|
||||||
@ -123,6 +121,7 @@
|
|||||||
#include "pg_get_policy_details.h"
|
#include "pg_get_policy_details.h"
|
||||||
#include "pg_persist_policy_details.h"
|
#include "pg_persist_policy_details.h"
|
||||||
#include "pg_do_deposit.h"
|
#include "pg_do_deposit.h"
|
||||||
|
#include "pg_setup_partitions.h"
|
||||||
#include "pg_add_policy_fulfillment_proof.h"
|
#include "pg_add_policy_fulfillment_proof.h"
|
||||||
#include "pg_do_melt.h"
|
#include "pg_do_melt.h"
|
||||||
#include "pg_do_refund.h"
|
#include "pg_do_refund.h"
|
||||||
@ -384,9 +383,6 @@ TEH_PG_internal_setup (struct PostgresClosure *pg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Closure for #get_refunds_cb().
|
* 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
|
/* Get the details of a policy, referenced by its hash code
|
||||||
*
|
*
|
||||||
* @param cls the `struct PostgresClosure` with the plugin-specific state
|
* @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;
|
return TALER_EXCHANGEDB_CKS_PRESENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
enum GNUNET_DB_QueryStatus
|
enum GNUNET_DB_QueryStatus
|
||||||
setup_wire_target(
|
setup_wire_target (
|
||||||
struct PostgresClosure *pg,
|
struct PostgresClosure *pg,
|
||||||
const char *payto_uri,
|
const char *payto_uri,
|
||||||
struct TALER_PaytoHashP *h_payto)
|
struct TALER_PaytoHashP *h_payto)
|
||||||
@ -1654,6 +1648,8 @@ setup_wire_target(
|
|||||||
"insert_kyc_status",
|
"insert_kyc_status",
|
||||||
iparams);
|
iparams);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Insert information about deposited coin into the database.
|
* Insert information about deposited coin into the database.
|
||||||
*
|
*
|
||||||
@ -2866,7 +2862,7 @@ postgres_insert_reserve_closed (
|
|||||||
reserve.pub = *reserve_pub;
|
reserve.pub = *reserve_pub;
|
||||||
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
|
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
|
||||||
(qs = TEH_PG_reserves_get (cls,
|
(qs = TEH_PG_reserves_get (cls,
|
||||||
&reserve)))
|
&reserve)))
|
||||||
{
|
{
|
||||||
/* Existence should have been checked before we got here... */
|
/* Existence should have been checked before we got here... */
|
||||||
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
|
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
|
||||||
@ -2893,7 +2889,7 @@ postgres_insert_reserve_closed (
|
|||||||
GNUNET_break (TALER_AAR_RESULT_ZERO == ret);
|
GNUNET_break (TALER_AAR_RESULT_ZERO == ret);
|
||||||
}
|
}
|
||||||
return TEH_PG_reserves_update (cls,
|
return TEH_PG_reserves_update (cls,
|
||||||
&reserve);
|
&reserve);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -5168,12 +5164,8 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)
|
|||||||
= &TEH_PG_commit;
|
= &TEH_PG_commit;
|
||||||
plugin->preflight
|
plugin->preflight
|
||||||
= &TEH_PG_preflight;
|
= &TEH_PG_preflight;
|
||||||
plugin->create_shard_tables
|
|
||||||
= &TEH_PG_create_shard_tables;
|
|
||||||
plugin->insert_aggregation_tracking
|
plugin->insert_aggregation_tracking
|
||||||
= &TEH_PG_insert_aggregation_tracking;
|
= &TEH_PG_insert_aggregation_tracking;
|
||||||
plugin->setup_partitions
|
|
||||||
= &TEH_PG_setup_partitions;
|
|
||||||
plugin->select_aggregation_amounts_for_kyc_check
|
plugin->select_aggregation_amounts_for_kyc_check
|
||||||
= &TEH_PG_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;
|
= &TEH_PG_start;
|
||||||
plugin->rollback
|
plugin->rollback
|
||||||
= &TEH_PG_rollback;
|
= &TEH_PG_rollback;
|
||||||
|
plugin->create_tables
|
||||||
plugin->create_tables
|
|
||||||
= &TEH_PG_create_tables;
|
= &TEH_PG_create_tables;
|
||||||
plugin->setup_foreign_servers
|
|
||||||
= &TEH_PG_setup_foreign_servers;
|
|
||||||
plugin->event_listen
|
plugin->event_listen
|
||||||
= &TEH_PG_event_listen;
|
= &TEH_PG_event_listen;
|
||||||
plugin->event_listen_cancel
|
plugin->event_listen_cancel
|
||||||
@ -5446,7 +5435,8 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)
|
|||||||
= &TEH_PG_select_purse_by_merge_pub;
|
= &TEH_PG_select_purse_by_merge_pub;
|
||||||
plugin->set_purse_balance
|
plugin->set_purse_balance
|
||||||
= &TEH_PG_set_purse_balance;
|
= &TEH_PG_set_purse_balance;
|
||||||
|
plugin->setup_partitions
|
||||||
|
= &TEH_PG_setup_partitions;
|
||||||
plugin->batch_reserves_in_insert
|
plugin->batch_reserves_in_insert
|
||||||
= &TEH_PG_batch_reserves_in_insert;
|
= &TEH_PG_batch_reserves_in_insert;
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ SET search_path TO exchange;
|
|||||||
-- Stored procedures
|
-- Stored procedures
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION exchange_do_withdraw(
|
CREATE OR REPLACE FUNCTION exchange_do_withdraw(
|
||||||
IN cs_nonce BYTEA,
|
IN cs_nonce BYTEA,
|
||||||
IN amount_val INT8,
|
IN amount_val INT8,
|
||||||
|
@ -13,19 +13,3 @@
|
|||||||
-- You should have received a copy of the GNU General Public License along with
|
-- 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/>
|
-- 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
|
|
||||||
$$;
|
|
||||||
|
Loading…
Reference in New Issue
Block a user