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

Reply via email to