From 1cbba4bec1551a4662029e2899e5120cc4793c4b Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 2 May 2016 06:36:58 +0200 Subject: fixing #4462: avoid temporary schemata altogether --- src/exchangedb/perf_taler_exchangedb_interpreter.c | 15 ++-- src/exchangedb/plugin_exchangedb_postgres.c | 85 +++++++++------------- src/exchangedb/test_exchangedb.c | 23 ++++-- 3 files changed, 56 insertions(+), 67 deletions(-) (limited to 'src/exchangedb') diff --git a/src/exchangedb/perf_taler_exchangedb_interpreter.c b/src/exchangedb/perf_taler_exchangedb_interpreter.c index 897a06eed..cb805a0b3 100644 --- a/src/exchangedb/perf_taler_exchangedb_interpreter.c +++ b/src/exchangedb/perf_taler_exchangedb_interpreter.c @@ -1369,7 +1369,7 @@ interpret (struct PERF_TALER_EXCHANGEDB_interpreter_state *state) break; case PERF_TALER_EXCHANGEDB_CMD_NEW_SESSION: - state->session = state->plugin->get_session (state->plugin->cls, GNUNET_YES); + state->session = state->plugin->get_session (state->plugin->cls); break; case PERF_TALER_EXCHANGEDB_CMD_START_TRANSACTION: @@ -1816,8 +1816,7 @@ PERF_TALER_EXCHANGEDB_interpret (struct TALER_EXCHANGEDB_Plugin *db_plugin, ret = cmd_init (cmd); if (GNUNET_SYSERR == ret) return ret; - state.session = db_plugin->get_session (db_plugin->cls, - GNUNET_YES); + state.session = db_plugin->get_session (db_plugin->cls); GNUNET_assert (NULL != state.session); ret = interpret (&state); cmd_clean (cmd); @@ -1943,8 +1942,7 @@ PERF_TALER_EXCHANGEDB_run_benchmark (const char *benchmark_name, "Error connectiong to the database\n"); return GNUNET_NO; } - ret = plugin->create_tables (plugin->cls, - GNUNET_YES); + ret = plugin->create_tables (plugin->cls); if (GNUNET_OK != ret) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, @@ -1981,10 +1979,9 @@ PERF_TALER_EXCHANGEDB_run_benchmark (const char *benchmark_name, { struct TALER_EXCHANGEDB_Session *session; - session = plugin->get_session (plugin->cls, - GNUNET_YES); - ret = plugin->drop_temporary (plugin->cls, - session); + session = plugin->get_session (plugin->cls); + ret = plugin->drop_tables (plugin->cls, + session); if (GNUNET_OK != ret) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index ad5b5d982..1cc64ce4d 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -29,15 +29,6 @@ #include "plugin_exchangedb_common.c" -/** - * For testing / experiments, we set the Postgres schema to - * #TALER_TEMP_SCHEMA_NAME so we can easily purge everything - * associated with a test. We *also* should use the database - * "talercheck" instead of "taler" for testing, but we're doing - * both: better safe than sorry. - */ -#define TALER_TEMP_SCHEMA_NAME "taler_temporary" - /** * Log a query error. * @@ -138,39 +129,48 @@ struct PostgresClosure -/** - * Set the given connection to use a temporary schema - * - * @param db the database connection - * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon error - */ -static int -set_temporary_schema (PGconn *db) -{ - SQLEXEC_(db, - "CREATE SCHEMA IF NOT EXISTS " TALER_TEMP_SCHEMA_NAME ";" - "SET search_path to " TALER_TEMP_SCHEMA_NAME ";"); - return GNUNET_OK; - SQLEXEC_fail: - return GNUNET_SYSERR; -} - /** - * Drop the temporary taler schema. This is only useful for testcases + * Drop all Taler tables. This should only be used by testcases. * * @param cls the `struct PostgresClosure` with the plugin-specific state * @param session database session to use * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure */ static int -postgres_drop_temporary (void *cls, - struct TALER_EXCHANGEDB_Session *session) +postgres_drop_tables (void *cls, + struct TALER_EXCHANGEDB_Session *session) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Dropping temporary tables\n"); + "Dropping ALL tables\n"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS prewire;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS aggregation_tracking;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS deposits;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS refresh_out;"); SQLEXEC_ (session->conn, - "DROP SCHEMA " TALER_TEMP_SCHEMA_NAME " CASCADE;"); + "DROP TABLE IF EXISTS refresh_commit_coin;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS refresh_commit_link;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS refresh_order;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS refresh_melts;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS refresh_sessions;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS known_coins;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS reserves_out;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS reserves_in;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS reserves;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS denominations;"); return GNUNET_OK; SQLEXEC_fail: return GNUNET_SYSERR; @@ -215,12 +215,10 @@ pq_notice_processor_cb (void *arg, * Create the necessary tables if they are not present * * @param cls the `struct PostgresClosure` with the plugin-specific state - * @param temporary should we use a temporary schema * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure */ static int -postgres_create_tables (void *cls, - int temporary) +postgres_create_tables (void *cls) { struct PostgresClosure *pc = cls; PGconn *conn; @@ -239,12 +237,6 @@ postgres_create_tables (void *cls, PQsetNoticeProcessor (conn, &pq_notice_processor_cb, NULL); - if ( (GNUNET_YES == temporary) && - (GNUNET_SYSERR == set_temporary_schema (conn))) - { - PQfinish (conn); - return GNUNET_SYSERR; - } #define SQLEXEC(sql) SQLEXEC_(conn, sql); #define SQLEXEC_INDEX(sql) SQLEXEC_IGNORE_ERROR_(conn, sql); /* Denomination table for holding the publicly available information of @@ -1200,13 +1192,10 @@ db_conn_destroy (void *cls) * Connect to the db if the connection does not exist yet. * * @param cls the `struct PostgresClosure` with the plugin-specific state - * @param temporary #GNUNET_YES to use a temporary schema; #GNUNET_NO to use the - * database default one * @return the database connection, or NULL on error */ static struct TALER_EXCHANGEDB_Session * -postgres_get_session (void *cls, - int temporary) +postgres_get_session (void *cls) { struct PostgresClosure *pc = cls; PGconn *db_conn; @@ -1229,12 +1218,6 @@ postgres_get_session (void *cls, PQsetNoticeProcessor (db_conn, &pq_notice_processor_cb, NULL); - if ( (GNUNET_YES == temporary) && - (GNUNET_SYSERR == set_temporary_schema(db_conn)) ) - { - GNUNET_break (0); - return NULL; - } if (GNUNET_OK != postgres_prepare (db_conn)) { @@ -4243,7 +4226,7 @@ libtaler_plugin_exchangedb_postgres_init (void *cls) plugin = GNUNET_new (struct TALER_EXCHANGEDB_Plugin); plugin->cls = pg; plugin->get_session = &postgres_get_session; - plugin->drop_temporary = &postgres_drop_temporary; + plugin->drop_tables = &postgres_drop_tables; plugin->create_tables = &postgres_create_tables; plugin->start = &postgres_start; plugin->commit = &postgres_commit; diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c index 16ee95f9c..2ef7f5d72 100644 --- a/src/exchangedb/test_exchangedb.c +++ b/src/exchangedb/test_exchangedb.c @@ -663,18 +663,27 @@ run (void *cls) result = 77; return; } + if (NULL != + (session = plugin->get_session (plugin->cls))) + { + if (GNUNET_OK != + plugin->drop_tables (plugin->cls, + session)) + { + result = 77; + goto drop; + } + } if (GNUNET_OK != - plugin->create_tables (plugin->cls, - GNUNET_YES)) + plugin->create_tables (plugin->cls)) { result = 77; goto drop; } if (NULL == - (session = plugin->get_session (plugin->cls, - GNUNET_YES))) + (session = plugin->get_session (plugin->cls))) { - result = 3; + result = 77; goto drop; } RND_BLK (&reserve_pub); @@ -934,8 +943,8 @@ run (void *cls) rh = NULL; if (NULL != session) GNUNET_break (GNUNET_OK == - plugin->drop_temporary (plugin->cls, - session)); + plugin->drop_tables (plugin->cls, + session)); if (NULL != dkp) destroy_denom_key_pair (dkp); if (NULL != cbc.sig.rsa_signature) -- cgit v1.2.3