Changeset: 8d52a6a1f81a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8d52a6a1f81a
Modified Files:
        java/embedded/embedded.c
        java/embedded/embedded.h
        java/embedded/org_monetdb_embedded_MonetDBEmbedded.c
        java/embedded/org_monetdb_embedded_MonetDBEmbedded.h
        java/embedded/src/main/java/org/monetdb/embedded/MonetDBEmbedded.java
Branch: embedded-java
Log Message:

Fix issues when an error occurs and pull changes from the embedded branch
- Avoid premature cleaning (for now)
- Do not try to access nr_cols if output is null
While there:
- Add 'wrapper' to native function names


diffs (278 lines):

diff --git a/java/embedded/embedded.c b/java/embedded/embedded.c
--- a/java/embedded/embedded.c
+++ b/java/embedded/embedded.c
@@ -15,7 +15,6 @@
  * Taken from the embedded branch tools/embedded/embedded.h
  * Stripped of the R-specific functions
  */
-
 #include "embedded.h"
 
 #include "monetdb_config.h"
@@ -62,21 +61,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;
        }
 
@@ -87,7 +85,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;
        }
 
@@ -100,7 +98,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];
@@ -123,20 +121,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");
@@ -148,16 +149,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;
-       }
-
-       if(setjmp(GDKfataljump) != 0) {
-               // we will get here if GDKfatal was called.
-               if (GDKfatalmsg == NULL) {
-                       return GDKstrdup("Fatal GDK error. This is bad. ");
-               }
-               return GDKfatalmsg;
+               return GDKstrdup("Embedded MonetDB is not started");
        }
 
        while (*query == ' ' || *query == '\t') query++;
diff --git a/java/embedded/embedded.h b/java/embedded/embedded.h
--- a/java/embedded/embedded.h
+++ b/java/embedded/embedded.h
@@ -13,7 +13,7 @@
 #ifndef _INVERSE_RAPI_LIB_
 #define _INVERSE_RAPI_LIB_
 
-int monetdb_startup(char* dir, char silent);
+char* monetdb_startup(char* dir, char silent);
 char* monetdb_query(char* query, void** result);
 void monetdb_cleanup_result(void* output);
 
diff --git a/java/embedded/org_monetdb_embedded_MonetDBEmbedded.c 
b/java/embedded/org_monetdb_embedded_MonetDBEmbedded.c
--- a/java/embedded/org_monetdb_embedded_MonetDBEmbedded.c
+++ b/java/embedded/org_monetdb_embedded_MonetDBEmbedded.c
@@ -13,12 +13,13 @@
 #include "res_table.h"
 #include "mal_type.h"
 
-JNIEXPORT jint JNICALL Java_org_monetdb_embedded_MonetDBEmbedded_startupWrapper
+JNIEXPORT jstring JNICALL 
Java_org_monetdb_embedded_MonetDBEmbedded_startupWrapper
 (JNIEnv *env, jobject object, jstring directory, jboolean silent) {
        (void)object;
        const char *directory_string_tmp = (*env)->GetStringUTFChars(env, 
directory, 0);
        char *directory_string = strdup(directory_string_tmp);
        unsigned char silent_char = 'n';
+       jstring result;
 
        // Release the directory string
        (*env)->ReleaseStringUTFChars(env, directory, directory_string_tmp);
@@ -26,13 +27,16 @@ JNIEXPORT jint JNICALL Java_org_monetdb_
        if (silent) {
                silent_char = 'y';
        }
-       return monetdb_startup(directory_string, silent_char);
+
+       result = (*env)->NewStringUTF(env, monetdb_startup(directory_string, 
silent_char));
+       return result;
 }
 
-JNIEXPORT jobject JNICALL Java_org_monetdb_embedded_MonetDBEmbedded_query
+JNIEXPORT jobject JNICALL 
Java_org_monetdb_embedded_MonetDBEmbedded_queryWrapper
 (JNIEnv *env, jobject object, jstring query) {
        (void)object;
        res_table *output = NULL;
+       int number_of_columns = 0;
        const char *query_string_tmp = (*env)->GetStringUTFChars(env, query, 0);
        char *query_string = strdup(query_string_tmp);
        // Release the query string
@@ -59,7 +63,8 @@ JNIEXPORT jobject JNICALL Java_org_monet
                jclass exClass = (*env)->FindClass(env, 
"java/sql/SQLException");
 
                // Clean up the result data
-               monetdb_cleanup_result(output);
+               // TODO: creates a segfault, fix later
+//             monetdb_cleanup_result(output);
                if (exClass == NULL) {
                        // Cloud not find the exception class, just return 
empty object
                        return NULL;
@@ -70,11 +75,15 @@ JNIEXPORT jobject JNICALL Java_org_monet
 
        // Collect result column names and types in string arrays
        // If we have not output, we will return them empty
-       columnNames = (*env)->NewObjectArray(env, output->nr_cols, stringClass, 
0);
-       columnTypes = (*env)->NewObjectArray(env, output->nr_cols, stringClass, 
0);
-       if (output && output->nr_cols > 0) {
+       if (output) {
+               number_of_columns = output->nr_cols;
+       }
+       columnNames = (*env)->NewObjectArray(env, number_of_columns, 
stringClass, 0);
+       columnTypes = (*env)->NewObjectArray(env, number_of_columns, 
stringClass, 0);
+
+       if (number_of_columns > 0) {
                int i;
-               for (i = 0; i < output->nr_cols; i++) {
+               for (i = 0; i < number_of_columns; i++) {
                        res_col col = output->cols[i];
                        BAT* b = BATdescriptor(col.b);
                        char *type;
@@ -115,12 +124,12 @@ JNIEXPORT jobject JNICALL Java_org_monet
        long resultTablePointer = (long)output;
        // Create the result object
        // from Java EmbeddedQueryResult(String[] columnNames, String[] 
columnTypes, int numberOfColumns, long resultPointer)
-       result = (*env)->NewObject(env, resultClass, resultConstructor, 
columnNames, columnTypes, output->nr_cols, resultTablePointer);
+       result = (*env)->NewObject(env, resultClass, resultConstructor, 
columnNames, columnTypes, number_of_columns, resultTablePointer);
 
        return result;
 }
 
-JNIEXPORT jstring JNICALL Java_org_monetdb_embedded_MonetDBEmbedded_append
+JNIEXPORT jstring JNICALL 
Java_org_monetdb_embedded_MonetDBEmbedded_appendWrapper
 (JNIEnv *env, jobject object, jstring table, jstring schema, jobject data) {
        (void)object;
        (void)table;
diff --git a/java/embedded/org_monetdb_embedded_MonetDBEmbedded.h 
b/java/embedded/org_monetdb_embedded_MonetDBEmbedded.h
--- a/java/embedded/org_monetdb_embedded_MonetDBEmbedded.h
+++ b/java/embedded/org_monetdb_embedded_MonetDBEmbedded.h
@@ -12,7 +12,7 @@ extern "C" {
  * Method:    startupNative
  * Signature: (Ljava/lang/String;Z)I
  */
-JNIEXPORT jint JNICALL Java_org_monetdb_embedded_MonetDBEmbedded_startupWrapper
+JNIEXPORT jstring JNICALL 
Java_org_monetdb_embedded_MonetDBEmbedded_startupWrapper
   (JNIEnv *, jobject, jstring, jboolean);
 
 /*
@@ -20,7 +20,7 @@ JNIEXPORT jint JNICALL Java_org_monetdb_
  * Method:    query
  * Signature: 
(Ljava/lang/String;)Lorg/monetdb/embedded/result/EmbeddedQueryResult;
  */
-JNIEXPORT jobject JNICALL Java_org_monetdb_embedded_MonetDBEmbedded_query
+JNIEXPORT jobject JNICALL 
Java_org_monetdb_embedded_MonetDBEmbedded_queryWrapper
   (JNIEnv *, jobject, jstring);
 
 /*
@@ -28,7 +28,7 @@ JNIEXPORT jobject JNICALL Java_org_monet
  * Method:    append
  * Signature: 
(Ljava/lang/String;Ljava/lang/String;Ljava/lang/reflect/Array;)Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_org_monetdb_embedded_MonetDBEmbedded_append
+JNIEXPORT jstring JNICALL 
Java_org_monetdb_embedded_MonetDBEmbedded_appendWrapper
   (JNIEnv *, jobject, jstring, jstring, jobject);
 
 #ifdef __cplusplus
diff --git 
a/java/embedded/src/main/java/org/monetdb/embedded/MonetDBEmbedded.java 
b/java/embedded/src/main/java/org/monetdb/embedded/MonetDBEmbedded.java
--- a/java/embedded/src/main/java/org/monetdb/embedded/MonetDBEmbedded.java
+++ b/java/embedded/src/main/java/org/monetdb/embedded/MonetDBEmbedded.java
@@ -64,7 +64,7 @@ public class MonetDBEmbedded {
         */
        public boolean startup(boolean silent) {
                if (!running) {
-                       if (startupWrapper(directory.getAbsolutePath(), silent) 
== 1) {
+                       if (startupWrapper(directory.getAbsolutePath(), silent) 
== null){
                                running = true;
                        }
                }
@@ -72,15 +72,34 @@ public class MonetDBEmbedded {
        }
 
        /**
+        * Execute an SQL query in an embedded database.
+        * 
+        * @param query The SQL query string
+        * @return The query result object, {@code null} if the database is not 
running
+        * @throws SQLException
+        */
+       public EmbeddedQueryResult query(String query) throws SQLException {
+               if (!running) {
+                       return null;
+               }
+       
+               String queryString = query;
+               if (!queryString.endsWith(";")) {
+                       queryString = queryString + ";";
+               }
+               return queryWrapper(queryString);
+       }
+
+       /**
         * Start the embedded database up.
         * 
         * @param direcrory Database directory
         * @param silent Silent flag
         * @return Startup status code
         */
-       private native int startupWrapper(String dir, boolean silent);
+       private native String startupWrapper(String dir, boolean silent);
 
-       public native EmbeddedQueryResult query(String query) throws 
SQLException;
+       private native EmbeddedQueryResult queryWrapper(String query) throws 
SQLException;
 
-       public native String append(String schema, String table, Array data) 
throws SQLException;
+       private native String appendWrapper(String schema, String table, Array 
data) throws SQLException;
 }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to