Changeset: cc5ba2a6de3d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/cc5ba2a6de3d Modified Files: clients/Tests/exports.stable.out monetdb5/mal/mal.c monetdb5/mal/mal_embedded.c monetdb5/mal/mal_linker.c monetdb5/mal/mal_prelude.c tools/monetdbe/monetdbe.c tools/monetdbe/monetdbe.h Branch: default Log Message:
added monetdbe_load_extension(dbhdl, module_name) diffs (161 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -1309,6 +1309,7 @@ char *monetdbe_get_autocommit(monetdbe_d char *monetdbe_get_columns(monetdbe_database dbhdl, const char *schema_name, const char *table_name, size_t *column_count, monetdbe_column **columns); const char *monetdbe_get_mapi_port(void); int monetdbe_in_transaction(monetdbe_database dbhdl); +char *monetdbe_load_extension(monetdbe_database dbhdl, const char *file); const void *monetdbe_null(monetdbe_database dbhdl, monetdbe_types t); int monetdbe_open(monetdbe_database *db, char *url, monetdbe_options *opts); char *monetdbe_prepare(monetdbe_database dbhdl, char *query, monetdbe_statement **stmt, monetdbe_result **result); diff --git a/monetdb5/mal/mal.c b/monetdb5/mal/mal.c --- a/monetdb5/mal/mal.c +++ b/monetdb5/mal/mal.c @@ -72,6 +72,7 @@ mal_init(char *modules[], bool embedded, */ str err; + mal_startup(); /* check that library that we're linked against is compatible with * the one we were compiled with */ int maj, min, patch; diff --git a/monetdb5/mal/mal_embedded.c b/monetdb5/mal/mal_embedded.c --- a/monetdb5/mal/mal_embedded.c +++ b/monetdb5/mal/mal_embedded.c @@ -56,6 +56,7 @@ malEmbeddedBoot(int workerlimit, int mem if (embeddedinitialized) return MAL_SUCCEED; + mal_startup(); { /* unlock the vault, first see if we can find the file which * holds the secret */ diff --git a/monetdb5/mal/mal_linker.c b/monetdb5/mal/mal_linker.c --- a/monetdb5/mal/mal_linker.c +++ b/monetdb5/mal/mal_linker.c @@ -155,7 +155,7 @@ loadLibrary(const char *filename, int fl is_mod = (!is_monetdb5 && strcmp(filename, "embedded") != 0); if (lastfile == 0 && is_mod) { /* first load reference to local functions */ - str msg = loadLibrary("monetdb5", flag); + str msg = loadLibrary("monetdb5", flag>=0?flag:0); if (msg != MAL_SUCCEED) return msg; } @@ -184,7 +184,9 @@ loadLibrary(const char *filename, int fl if (mod_path == NULL) { int len; - if (is_mod) + if (is_mod && flag < 0) + len = snprintf(nme, FILENAME_MAX, ".%c%s_%s%s", DIR_SEP, SO_PREFIX, s, SO_EXT); + else if (is_mod) len = snprintf(nme, FILENAME_MAX, "%s_%s%s", SO_PREFIX, s, SO_EXT); else len = snprintf(nme, FILENAME_MAX, "%s%s%s", SO_PREFIX, s, SO_EXT); @@ -198,7 +200,7 @@ loadLibrary(const char *filename, int fl handle = dlopen(is_monetdb5 ? NULL : nme, RTLD_NOW | RTLD_GLOBAL); #endif if (!handle) { - if (flag) + if (flag>0) throw(LOADER, "loadLibrary", RUNTIME_FILE_NOT_FOUND ":%s", s); return MAL_SUCCEED; } diff --git a/monetdb5/mal/mal_prelude.c b/monetdb5/mal/mal_prelude.c --- a/monetdb5/mal/mal_prelude.c +++ b/monetdb5/mal/mal_prelude.c @@ -29,7 +29,7 @@ #include "mal_prelude.h" #define MAX_MAL_MODULES 128 -static int mel_modules = 0; +static int mel_modules = 0, mel_modules_loaded = 0; static struct mel_module { const char *name; mel_atom *atoms; @@ -42,6 +42,7 @@ int mal_startup(void) { /* clean up the MAL internal structures before restart */ + mel_modules_loaded = 0; return 0; } @@ -479,7 +480,7 @@ malPrelude(Client c, int listing, int *s (void) listing; /* Add all atom definitions */ - for (i = 0; i < mel_modules; i++) { + for (i = mel_modules_loaded; i < mel_modules; i++) { if (mel_module[i].atoms) { msg = addAtom(mel_module[i].atoms); if (msg) @@ -488,7 +489,7 @@ malPrelude(Client c, int listing, int *s } /* Add the signatures, where we now have access to all atoms */ - for (i = 0; i < mel_modules; i++) { + for (i = mel_modules_loaded; i < mel_modules; i++) { const char *name = putName(mel_module[i].name); if (!malLibraryEnabled(name)) continue; @@ -523,6 +524,7 @@ malPrelude(Client c, int listing, int *s return msg; } } + mel_modules_loaded = mel_modules; return MAL_SUCCEED; } diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c --- a/tools/monetdbe/monetdbe.c +++ b/tools/monetdbe/monetdbe.c @@ -19,6 +19,7 @@ #include "mal_embedded.h" #include "mal_backend.h" #include "mal_builder.h" +#include "mal_linker.h" #include "opt_prelude.h" #include "sql_mvc.h" #include "sql_catalog.h" @@ -992,6 +993,26 @@ monetdbe_error(monetdbe_database dbhdl) } char* +monetdbe_load_extension(monetdbe_database dbhdl, const char *file) +{ + if (!dbhdl) + return 0; + + monetdbe_database_internal *mdbe = (monetdbe_database_internal*)dbhdl; + + if ((mdbe->msg = validate_database_handle(mdbe, "embedded.monetdbe_dump_database")) != MAL_SUCCEED) { + return mdbe->msg; + } + char *modules[2]; + modules[0] = (char*)file; + modules[1] = NULL; + char *msg = loadLibrary(file, -1); + if (msg) + return msg; + return malIncludeModules(mdbe->c, modules, 0, true, NULL); +} + +char* monetdbe_dump_database(monetdbe_database dbhdl, const char *filename) { if (!dbhdl) diff --git a/tools/monetdbe/monetdbe.h b/tools/monetdbe/monetdbe.h --- a/tools/monetdbe/monetdbe.h +++ b/tools/monetdbe/monetdbe.h @@ -182,6 +182,8 @@ monetdbe_export const void* monetdbe_nul monetdbe_export char* monetdbe_get_columns(monetdbe_database dbhdl, const char* schema_name, const char *table_name, size_t *column_count, monetdbe_column **columns); +monetdbe_export char* monetdbe_load_extension(monetdbe_database dbhdl, const char *file); + monetdbe_export char* monetdbe_dump_database(monetdbe_database dbhdl, const char *backupfile); monetdbe_export char* monetdbe_dump_table(monetdbe_database dbhdl, const char *schema_name, const char *table_name, const char *backupfile); monetdbe_export const char* monetdbe_get_mapi_port(void); _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org