Changeset: 5c6b67ba9bbf for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5c6b67ba9bbf
Added Files:
        tools/embedded/rpackage/man/embedded.Rd
Modified Files:
        clients/R/MonetDB.R/R/dbi.R
        configure.ag
        sql/backends/monet5/sql_scenario.c
        tools/embedded/embedded.c
        tools/embedded/embedded.h
        tools/embedded/rpackage/R/monetdb.R
Branch: embedded
Log Message:

MonetDBLite Updates


diffs (245 lines):

diff --git a/clients/R/MonetDB.R/R/dbi.R b/clients/R/MonetDB.R/R/dbi.R
--- a/clients/R/MonetDB.R/R/dbi.R
+++ b/clients/R/MonetDB.R/R/dbi.R
@@ -128,7 +128,7 @@ setMethod("dbConnect", "MonetDBDriver", 
   connenv$lock <- 0
   connenv$deferred <- list()
   connenv$exception <- list()
-  connenv$params <- list(host=host, port=port, timeout=timeout, dbname=dbname, 
user=user, password=password, language=language)
+  connenv$params <- list(drv=drv, host=host, port=port, timeout=timeout, 
dbname=dbname, user=user, password=password, language=language)
   connenv$socket <- .mapiConnect(host, port, timeout) 
   .mapiAuthenticate(connenv$socket, dbname, user, password, language=language)
   
@@ -252,10 +252,7 @@ setMethod("dbSendQuery", signature(conn=
     resp <- .mapiParseResponse(mresp)
   }, interrupt = function(ex) {
     message("Interrupted query execution. Attempting to fix connection....")
-    
-    conn@connenv$params[[1]] <- NULL
-    conn@connenv$params$drv <- MonetDB.R()
-    
+      
     newconn <- do.call("dbConnect", conn@connenv$params)
     dbDisconnect(conn)
     conn@connenv$socket <- newconn@connenv$socket
diff --git a/configure.ag b/configure.ag
--- a/configure.ag
+++ b/configure.ag
@@ -3130,6 +3130,7 @@ AH_BOTTOM([
 #endif
 
 #include <stdio.h>             /* NULL, printf etc. */
+
 #include <stdlib.h>
 #include <errno.h>
 #include <stdarg.h>            /* va_alist.. */
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -682,7 +682,7 @@ SQLinclude(Client cntxt, MalBlkPtr mb, M
  * The SQLreader is called from two places: the SQL parser and
  * the MAL debugger.
  * The former only occurs during the parsing phase and the
- * second only during exection.
+ * second only during execution.
  * This means we can safely change the language setting for
  * the duration of these calls.
  */
diff --git a/tools/embedded/embedded.c b/tools/embedded/embedded.c
--- a/tools/embedded/embedded.c
+++ b/tools/embedded/embedded.c
@@ -57,21 +57,20 @@ static void* lookup_function(char* lib, 
        return fun;
 }
 
-int monetdb_startup(char* dir, char silent) {
+char* monetdb_startup(char* dir, char silent) {
        opt *set = NULL;
        int setlen = 0;
-       int retval = -1;
+       char* retval = NULL;
+       char* sqres = NULL;
        void* res = NULL;
        char mod_path[1000];
        GDKfataljumpenable = 1;
        if(setjmp(GDKfataljump) != 0) {
+               retval = GDKfatalmsg;
                // we will get here if GDKfatal was called.
-               if (GDKfatalmsg != NULL) {
-                       fputs(GDKfatalmsg, stderr);
-                       fputs("\n", stderr);
-                       GDKfree(GDKfatalmsg);
+               if (retval != NULL) {
+                       retval = GDKstrdup("GDKfatal() with unspecified 
error?");
                }
-               retval = -2;
                goto cleanup;
        }
 
@@ -82,7 +81,7 @@ int monetdb_startup(char* dir, char sile
        setlen = mo_builtin_settings(&set);
        setlen = mo_add_option(&set, setlen, opt_cmdline, "gdk_dbpath", dir);
        if (GDKinit(set, setlen) == 0) {
-               retval = -3;
+               retval = GDKstrdup("GDKinit() failed");
                goto cleanup;
        }
 
@@ -95,7 +94,7 @@ int monetdb_startup(char* dir, char sile
        if (silent) THRdata[0] = stream_blackhole_create();
        msab_dbpathinit(GDKgetenv("gdk_dbpath"));
        if (mal_init() != 0) {
-               retval = -4;
+               retval = GDKstrdup("mal_init() failed");
                goto cleanup;
        }
        if (silent) mal_clients[0].fdout = THRdata[0];
@@ -118,23 +117,23 @@ int monetdb_startup(char* dir, char sile
                        res_table_destroy_ptr == NULL || mvc_append_wrap_ptr == 
NULL ||
                        mvc_bind_schema_ptr == NULL || mvc_bind_table_ptr == 
NULL ||
                        sqlcleanup_ptr == NULL || mvc_trans_ptr == NULL) {
-               retval = -5;
+               retval = GDKstrdup("Dynamic function lookup failed");
                goto cleanup;
        }
        // call this, otherwise c->sqlcontext is empty
        (*SQLinitClient_ptr)(&mal_clients[0]);
        ((backend *) mal_clients[0].sqlcontext)->mvc->session->auto_commit = 1;
        monetdb_embedded_initialized = true;
-
+       // we do not want to jump after this point, since we cannot do so 
between threads
        GDKfataljumpenable = 0;
 
        // sanity check, run a SQL query
-       if (monetdb_query("SELECT * FROM tables;", res) != NULL) {
+       sqres = monetdb_query("SELECT * FROM tables;", res);
+       if (sqres != NULL) {
                monetdb_embedded_initialized = false;
-               retval = -6;
+               retval = sqres;
                goto cleanup;
        }
-       retval = 0;
 cleanup:
        mo_free_options(set, setlen);
        MT_lock_unset(&monetdb_embedded_lock, "monetdb.startup");
@@ -146,8 +145,7 @@ char* monetdb_query(char* query, void** 
        Client c = &mal_clients[0];
        mvc* m = ((backend *) c->sqlcontext)->mvc;
        if (!monetdb_embedded_initialized) {
-               fprintf(stderr, "Embedded MonetDB is not started.\n");
-               return NULL;
+               return GDKstrdup("Embedded MonetDB is not started");
        }
 
        while (*query == ' ' || *query == '\t') query++;
@@ -271,14 +269,18 @@ SEXP monetdb_query_R(SEXP query, SEXP no
 SEXP monetdb_startup_R(SEXP dirsexp, SEXP silentsexp) {
        const char* dir = NULL;
        char silent = 0;
-       int res = 0;
-       if (!IS_CHARACTER(dirsexp) || !IS_LOGICAL(silentsexp)) {
-               return ScalarInteger(-1);
+       char* res = NULL;
+       if (monetdb_embedded_initialized) {
+               return ScalarLogical(0);
        }
        dir = CHAR(STRING_ELT(dirsexp, 0));
        silent = LOGICAL(silentsexp)[0];
        res = monetdb_startup((char*) dir, silent);
-       return ScalarInteger(res);
+       if (res == NULL) {
+               return ScalarLogical(1);
+       }  else {
+               return ScalarString(mkCharCE(res, CE_UTF8));
+       }
 }
 
 static str monetdb_get_columns(const char* schema_name, const char 
*table_name, int *column_count, char ***column_names, int **column_types) {
diff --git a/tools/embedded/embedded.h b/tools/embedded/embedded.h
--- a/tools/embedded/embedded.h
+++ b/tools/embedded/embedded.h
@@ -20,7 +20,7 @@ typedef struct append_data {
        ssize_t batid;
 } append_data;
 
-int monetdb_startup(char* dir, char silent);
+char* monetdb_startup(char* dir, char silent);
 char* monetdb_query(char* query, void** result);
 char* monetdb_append(const char* schema, const char* table, append_data *ad, 
int ncols);
 void monetdb_cleanup_result(void* output);
diff --git a/tools/embedded/rpackage/R/monetdb.R 
b/tools/embedded/rpackage/R/monetdb.R
--- a/tools/embedded/rpackage/R/monetdb.R
+++ b/tools/embedded/rpackage/R/monetdb.R
@@ -2,7 +2,7 @@
        dyn.load(file.path(libname, pkgname, "libs", "MonetDB.so"), local=F, 
now=F)
 }
 
-monetdb_embedded_startup <- function(dir=tempdir(), quiet=T) {
+monetdb_embedded_startup <- function(dir=tempdir(), quiet=TRUE) {
        dir <- as.character(dir)
        quiet <- as.logical(quiet)
        if (length(dir) != 1) {
@@ -15,16 +15,16 @@ monetdb_embedded_startup <- function(dir
                stop("Cannot write to ", dir)
        }
        res <- .Call("monetdb_startup_R", dir, quiet)
-       if (res < -1) {
-               stop("Failed to initialize embedded MonetDB.")
+       if (is.character(res)) {
+               stop("Failed to initialize embedded MonetDB ", res)
        }
-       if (res == -1) {
+       if (res == FALSE) {
                warning("monetdb_embedded_startup() was already called. 
Ignoring this invocation.")
        }
        invisible(TRUE)
 }
 
-monetdb_embedded_query <- function(query, notreally=F) {
+monetdb_embedded_query <- function(query, notreally=FALSE) {
        query <- as.character(query)
        if (length(query) != 1) {
                stop("Need a single query as parameter.")
diff --git a/tools/embedded/rpackage/man/embedded.Rd 
b/tools/embedded/rpackage/man/embedded.Rd
new file mode 100644
--- /dev/null
+++ b/tools/embedded/rpackage/man/embedded.Rd
@@ -0,0 +1,37 @@
+\name{embedded}
+\alias{monetdb_embedded_startup}
+\alias{monetdb_embedded_query}
+\alias{monetdb_embedded_append}
+
+\title{
+  Control embedded MonetDB
+}
+\description{
+TODO
+}
+\usage{
+monetdb_embedded_startup(dir=tempdir(), quiet=TRUE)
+monetdb_embedded_query(query, notreally=FALSE)
+monetdb_embedded_append(table, tdata, schema="sys")
+}
+\arguments{
+  \item{dir}{Path to the directory where the database will be created. Must be 
writeable or createable.}
+   \item{quiet}{Suppress MonetDB startup messages?}
+   \item{query}{SQL query, DDL statement or transaction statement}
+   \item{notreally}{Skip result conversion?}
+   \item{table}{Database table name}
+   \item{tdata}{\code{data.frame} with columns matching the schema of 
\code{table}}
+  \item{schema}{Schema name}
+ }
+\value{
+  \code{monetdb_embedded_startup} returns \code{TRUE} if successful.
+  \code{monetdb_embedded_query} returns a list with query results which might 
contain a \code{data.frame} with results or an error message string.
+  \code{monetdb_embedded_query} returns \code{TRUE} if successful or a string 
with an error message if not.
+}
+
+\examples{
+monetdb_embedded_startup(tempdir())
+monetdb_embedded_query("SELECT * FROM tables;")
+monetdb_embedded_query("CREATE TABLE foo(i INTEGER, j INTEGER)")
+monetdb_embedded_append("foo", data.frame(i=1:10, j=21:30))
+}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to