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