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