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 -- [email protected]
To unsubscribe send an email to [email protected]