From f94bb0a3a076caab71597b32963fd2815b8446f9 Mon Sep 17 00:00:00 2001 From: Sree Harsha Totakura Date: Thu, 26 Mar 2015 18:06:37 +0100 Subject: [PATCH] db: Implement plugin loading and unloading --- src/mint/plugin.c | 31 ++++++++++++++++++++++++++++++- src/mint/plugin_mintdb_postgres.c | 5 +++-- src/mint/taler_mintdb_plugin.h | 5 +++++ src/mint/test_mint_db.c | 1 + 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/mint/plugin.c b/src/mint/plugin.c index 4fb75f87a..455c7e8fa 100644 --- a/src/mint/plugin.c +++ b/src/mint/plugin.c @@ -43,7 +43,34 @@ static char *old_dlsearchpath; int TALER_MINT_plugin_load (const struct GNUNET_CONFIGURATION_Handle *cfg) { - return GNUNET_SYSERR; + char *plugin_name; + char *lib_name; + struct GNUNET_CONFIGURATION_Handle *cfg_dup; + + if (NULL != plugin) + return GNUNET_OK; + if (GNUNET_SYSERR == + GNUNET_CONFIGURATION_get_value_string (cfg, + "mint", + "db", + &plugin_name)) + { + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, + "mint", + "db"); + return GNUNET_SYSERR; + } + (void) GNUNET_asprintf (&lib_name, + "libtaler_plugin_mintdb_%s", + plugin_name); + GNUNET_free (plugin_name); + cfg_dup = GNUNET_CONFIGURATION_dup (cfg); + plugin = GNUNET_PLUGIN_load (lib_name, cfg_dup); + GNUNET_CONFIGURATION_destroy (cfg_dup); + GNUNET_free (lib_name); + if (NULL == plugin) + return GNUNET_SYSERR; + return GNUNET_OK; } @@ -55,6 +82,8 @@ TALER_MINT_plugin_unload () { if (NULL == plugin) return; + GNUNET_assert (NULL == GNUNET_PLUGIN_unload (plugin->library_name, + plugin)); } diff --git a/src/mint/plugin_mintdb_postgres.c b/src/mint/plugin_mintdb_postgres.c index 5a1ff8c0c..8edee59ae 100644 --- a/src/mint/plugin_mintdb_postgres.c +++ b/src/mint/plugin_mintdb_postgres.c @@ -2289,16 +2289,17 @@ libtaler_plugin_mintdb_postgres_init (void *cls) /* FIXME: use configuration section with "postgres" in its name... */ if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (cfg, - "mint", "db", + "mint", "db_conn_str", &pg->TALER_MINT_db_connection_cfg_str)) { GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, "mint", - "db"); + "db_conn_str"); return NULL; } plugin = GNUNET_new (struct TALER_MINTDB_Plugin); plugin->cls = pg; + plugin->library_name = "libtaler_plugin_mintdb_postgres"; plugin->get_session = &postgres_get_session; plugin->drop_temporary = &postgres_drop_temporary; plugin->create_tables = &postgres_create_tables; diff --git a/src/mint/taler_mintdb_plugin.h b/src/mint/taler_mintdb_plugin.h index 08a73479d..4d74b88db 100644 --- a/src/mint/taler_mintdb_plugin.h +++ b/src/mint/taler_mintdb_plugin.h @@ -478,6 +478,11 @@ struct TALER_MINTDB_Plugin */ void *cls; + /** + * Name of the library which generated this plugin + */ + const char *library_name; + /** * Get the thread-local database-handle. * Connect to the db if the connection does not exist yet. diff --git a/src/mint/test_mint_db.c b/src/mint/test_mint_db.c index 0b61818f1..ef882b90a 100644 --- a/src/mint/test_mint_db.c +++ b/src/mint/test_mint_db.c @@ -343,6 +343,7 @@ run (void *cls, if (NULL != cbc2.sig.rsa_signature) GNUNET_CRYPTO_rsa_signature_free (cbc2.sig.rsa_signature); dkp = NULL; + TALER_MINT_plugin_unload (); }