From: eherman Date: September 22 2007 4:02pm Subject: bk commit into 5.2 tree (eherman:1.2595) List-Archive: http://lists.mysql.com/commits/34495 Message-Id: <20070922160251.24462EFA8FD@halle.local> Below is the list of changes that have just been committed into a local 5.2 repository of eric. When eric does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet@stripped, 2007-09-22 18:02:44+02:00, eherman@stripped +10 -0 completed the connecting of java to native callbacks: no longer have compile issues. plugin/java_udf/Makefile.am@stripped, 2007-09-22 18:02:38+02:00, eherman@stripped +4 -2 changed jnicallback to C++ file; added the jnilinkage plugin/java_udf/grokjni.pl@stripped, 2007-09-22 18:02:39+02:00, eherman@stripped +25 -0 New BitKeeper file ``plugin/java_udf/grokjni.pl'' plugin/java_udf/grokjni.pl@stripped, 2007-09-22 18:02:39+02:00, eherman@stripped +0 -0 plugin/java_udf/java_context.cc@stripped, 2007-09-22 18:02:38+02:00, eherman@stripped +8 -0 added register_natives function plugin/java_udf/java_context.h@stripped, 2007-09-22 18:02:38+02:00, eherman@stripped +3 -1 added function, made private function public plugin/java_udf/java_udf.cc@stripped, 2007-09-22 18:02:39+02:00, eherman@stripped +15 -8 made use of jnilinkage to connect java class to jni implementation plugin/java_udf/jnicallback.cc@stripped, 2007-09-22 18:02:39+02:00, eherman@stripped +25 -22 converted to C++ syntax plugin/java_udf/jnicallback.cc@stripped, 2007-09-22 16:05:44+02:00, eherman@stripped +0 -0 Rename: plugin/java_udf/jnicallback.c -> plugin/java_udf/jnicallback.cc plugin/java_udf/jniutils.cc@stripped, 2007-09-22 18:02:39+02:00, eherman@stripped +3 -2 converted to C++ syntax plugin/java_udf/jniutils.h@stripped, 2007-09-22 18:02:39+02:00, eherman@stripped +16 -3 made C++ syntax; copied declaration of copy_and_convert from sql_string.h sql/sql_plugin.cc@stripped, 2007-09-22 18:02:39+02:00, eherman@stripped +4 -3 nulling out initial value & fixing mutex order mis-match sql/sql_yacc.yy@stripped, 2007-09-22 18:02:39+02:00, eherman@stripped +1 -1 adjusted warnings diff -Nrup a/plugin/java_udf/Makefile.am b/plugin/java_udf/Makefile.am --- a/plugin/java_udf/Makefile.am 2007-09-22 15:38:30 +02:00 +++ b/plugin/java_udf/Makefile.am 2007-09-22 18:02:38 +02:00 @@ -42,7 +42,7 @@ noinst_HEADERS = java_context.h jbyte_ar java_udf_source= java_udf.cc java_context.cc jbyte_array.cc \ native_jvm.cc java_object_parameter.cc \ jobject_wrapper.cc jvm_interface.cc \ - java_util_arraylist.cc jvm_singleton.cc jnicallback.c \ + java_util_arraylist.cc jvm_singleton.cc jnicallback.cc \ jniutils.cc EXTRA_LTLIBRARIES= psm_java.la @@ -54,12 +54,14 @@ psm_java_la_SOURCES= $(java_udf_source) EXTRA_DIST = plug.in -BUILT_SOURCES= jnicallback.h +BUILT_SOURCES= jnilinkage.h jnicallback.h jnicallback.h: com/mysql/udf/NativeUDFCallback.java $(JAVAC) $(CLASSPATH) $(SOURCEPATH) com/mysql/udf/*.java $(JAVAH) $(CLASSPATH) -jni -o $@ com.mysql.udf.NativeUDFCallback +jnilinkage.h: jnicallback.h + $(PERL) $(srcdir)/grokjni.pl < $< > $@ test: jbyte_array_test jvm_singleton_test native_jvm_test java_context_test ./jbyte_array_test diff -Nrup a/plugin/java_udf/grokjni.pl b/plugin/java_udf/grokjni.pl --- /dev/null Wed Dec 31 16:00:00 196900 +++ b/plugin/java_udf/grokjni.pl 2007-09-22 18:02:39 +02:00 @@ -0,0 +1,25 @@ +#!/usr/bin/perl + +$struct_name= "native_methods"; + +print "/* WARNING - THIS FILE IS AUTOMATICALLY GENERATED */\n". + "static const JNINativeMethod ".$struct_name."[] =\n{\n"; +while ($ln= <>) +{ + $classname=$1 if $ln =~ m/Class:\s+(.*)/; + $method=$1 if $ln =~ m/Method:\s+(.*)/; + $signature=$1 if $ln =~ m/Signature:\s+(.*)/; + + next if not ( $ln =~ m/JNICALL (.*)/); + $function_name= $1; + + print " {\n". + " (char*) \"$method\",\n". + " (char*) \"$signature\",\n". + " (void*) $function_name\n". + " },\n"; +} + +print "};\n\nstatic const int ${struct_name}_count=\n". + "\tsizeof($struct_name)/sizeof(JNINativeMethod);\n"; + diff -Nrup a/plugin/java_udf/java_context.cc b/plugin/java_udf/java_context.cc --- a/plugin/java_udf/java_context.cc 2007-09-21 21:15:20 +02:00 +++ b/plugin/java_udf/java_context.cc 2007-09-22 18:02:38 +02:00 @@ -1074,4 +1074,12 @@ void Java_context::release_java_string_a JNI_DBUG_VOID_RETURN("Java_context::release_java_string_array"); } +bool Java_context::register_natives(jclass cls, const JNINativeMethod *methods, int count) +{ + JNI_DBUG_ENTER("Java_context::register_natives"); + bool fail = false; + if (env->RegisterNatives(cls, methods, count)) + fail = true; + JNI_DBUG_RETURN("Java_context::register_natives", fail); +} /* END java_context.cc */ diff -Nrup a/plugin/java_udf/java_context.h b/plugin/java_udf/java_context.h --- a/plugin/java_udf/java_context.h 2007-09-21 21:15:20 +02:00 +++ b/plugin/java_udf/java_context.h 2007-09-22 18:02:38 +02:00 @@ -117,9 +117,11 @@ public: void get_class_name(jobject jobj, char *buf, int buf_size); void delete_global_reference(jobject jobj); + + jclass get_java_class(const char *class_name); + bool register_natives(jclass cls, const JNINativeMethod *methods, int count); private: JNIEnv *env; - jclass get_java_class(const char *class_name); void find_class_name(jclass cls, char *buf, int buf_size); jmethodID get_method_id(jclass cls, const char *method_name, diff -Nrup a/plugin/java_udf/java_udf.cc b/plugin/java_udf/java_udf.cc --- a/plugin/java_udf/java_udf.cc 2007-09-21 21:33:58 +02:00 +++ b/plugin/java_udf/java_udf.cc 2007-09-22 18:02:39 +02:00 @@ -22,7 +22,8 @@ #include "jvm_singleton.h" #include "jvm_interface.h" #include "jobject_wrapper.h" - +#include "jnicallback.h" +#include "jnilinkage.h" #if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8) #define __attribute__(A) @@ -77,16 +78,22 @@ static int java_udf_plugin_init(void *ar Java_context *java_context = jvm->attach(); udf_module = java_context->new_java_object("com/mysql/udf/UDFModule"); - + if (!udf_module) goto err; + + jclass jc_udf_callback = java_context->get_java_class( + "com/mysql/udf/NativeUDFCallback"); + if (!jc_udf_callback) goto err; + + if (java_context->register_natives(jc_udf_callback, native_methods, + native_methods_count)) goto err; + delete java_context; - if (!udf_module) - { - Jvm_singleton::set(NULL); - delete jvm; - return 2; - } return 0; +err: + Jvm_singleton::set(NULL); + delete jvm; + return 2; } diff -Nrup a/plugin/java_udf/jnicallback.c b/plugin/java_udf/jnicallback.c --- a/plugin/java_udf/jnicallback.c 2007-09-22 15:21:23 +02:00 +++ /dev/null Wed Dec 31 16:00:00 196900 @@ -1,244 +0,0 @@ -#include -#include -#include -#include -#include -#include "jnicallback.h" -#if 0 -#include "jniutils.h" -#endif - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: get_argument_count - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_mysql_udf_NativeUDFCallback_get_1argument_1count - (JNIEnv *jenv, jclass jcls, jlong that) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - return context->arg_count; -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: get_argument_type - * Signature: (JI)I - */ -JNIEXPORT jint JNICALL Java_com_mysql_udf_NativeUDFCallback_get_1argument_1type - (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - int field_type, length; - void *ptr; - - context->cb->field_ptr(context, arg_index, &field_type, &ptr, &length); - return field_type; -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: is_argument_null - * Signature: (JI)Z - */ -JNIEXPORT jboolean JNICALL Java_com_mysql_udf_NativeUDFCallback_is_1argument_1null - (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - return context->cb->val_null(context, arg_index); -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: set_null_argument - * Signature: (JI)V - */ -JNIEXPORT void JNICALL Java_com_mysql_udf_NativeUDFCallback_set_1null_1argument - (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - context->cb->store_null(context, arg_index); -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: get_long_argument - * Signature: (JI)J - */ -JNIEXPORT jlong JNICALL Java_com_mysql_udf_NativeUDFCallback_get_1long_1argument - (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - return context->cb->val_integer(context, arg_index); -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: set_long_argument - * Signature: (JIJ)V - */ -JNIEXPORT void JNICALL Java_com_mysql_udf_NativeUDFCallback_set_1long_1argument - (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index, jlong val) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - context->cb->store_integer(context, arg_index, val); -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: get_string_argument - * Signature: (JI)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_mysql_udf_NativeUDFCallback_get_1string_1argument - (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - int field_type, length; - void *ptr; - jstring jstr; - CHARSET_INFO* cs; - - context->cb->field_ptr(context, arg_index, &field_type, &ptr, &length); - length = ( length + 64 ) & ~63; /* round up temp size */ - - for (;;) - { - int temp_length = length; - char *temp_ptr = (char *) malloc(length); - str = context->cb->val_string(context, arg_index, temp_ptr, &length, &cs); - if (length >= temp_length) - { - length = ( length + 64 ) & ~63; /* round up temp size */ - free(temp_ptr); - continue; - } - - jstr = make_jstring(jenv, str, length, cs); - free(temp_ptr); - return java_string; - } -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: set_string_argument - * Signature: (JILjava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_mysql_udf_NativeUDFCallback_set_1string_1argument - (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index, jstring val) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - - const char *str = (*jenv)->GetStringUTFChars(jenv, val, 0); - - context->cb->store_string(context, arg_index, str, strlen(str), - &my_charset_utf8_general_ci); - - (*jenv)->ReleaseStringUTFChars(jenv, col_name, str); -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: get_double_argument - * Signature: (JI)D - */ -JNIEXPORT jdouble JNICALL Java_com_mysql_udf_NativeUDFCallback_get_1double_1argument - (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - return context->cb->val_double(context, arg_index); -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: set_double_argument - * Signature: (JID)V - */ -JNIEXPORT void JNICALL Java_com_mysql_udf_NativeUDFCallback_set_1double_1argument - (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index, jdouble val) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - context->cb->store_double(context, arg_index, val); -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: get_big_decimal_argument - * Signature: (JI)Ljava/math/BigDecimal; - */ -JNIEXPORT jstring JNICALL Java_com_mysql_udf_NativeUDFCallback_get_1big_1decimal_1argument - (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index) -{ - return Java_com_mysql_udf_NativeUDFCallback_get_1string_1argument(jenv, jcls, - that, arg_index); -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: set_big_decimal_argument - * Signature: (JILjava/math/BigDecimal;)V - */ -JNIEXPORT void JNICALL Java_com_mysql_udf_NativeUDFCallback_set_1big_1decimal_1argument - (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index, jstring val) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - const char *str = (*jenv)->GetStringUTFChars(jenv, val, 0); - context->cb->store_string(context, arg_index, str, strlen(str), - &my_charset_utf8_general_ci); - (*jenv)->ReleaseStringUTFChars(jenv, val, str); -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: row_field - * Signature: (JLjava/lang/String;III)I - */ -JNIEXPORT jint JNICALL Java_com_mysql_udf_NativeUDFCallback_row_1field - (JNIEnv *jenv, jclass jcls, jlong that, jstring col_name, jint field_type, - jint display_width, jint precision) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - const char *str = (*jenv)->GetStringUTFChars(jenv, col_name, 0); - int rv = context->cb->row_field(context, str, field_type, display_width, - precision); - (*jenv)->ReleaseStringUTFChars(jenv, col_name, str); - - return rv; -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: row_prepare - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_mysql_udf_NativeUDFCallback_row_1prepare - (JNIEnv *jenv, jclass jcls, jlong that) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - return context->cb->row_prepare(context); -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: row_send - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_mysql_udf_NativeUDFCallback_row_1send - (JNIEnv *jenv, jclass jcls, jlong that) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - return context->cb->row_send(context); -} - -/* - * Class: com_mysql_udf_NativeUDFCallback - * Method: row_send_eof - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_com_mysql_udf_NativeUDFCallback_row_1send_1eof - (JNIEnv *jenv, jclass jcls, jlong that) -{ - MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; - return context->cb->row_send_eof(context); -} - diff -Nrup a/plugin/java_udf/jnicallback.cc b/plugin/java_udf/jnicallback.cc --- /dev/null Wed Dec 31 16:00:00 196900 +++ b/plugin/java_udf/jnicallback.cc 2007-09-22 18:02:39 +02:00 @@ -0,0 +1,247 @@ +#include +#include +#include +#include +#include +#include +#include "jnicallback.h" +#include "jniutils.h" +#if 0 +#include "jniutils.h" +#endif + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: get_argument_count + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_mysql_udf_NativeUDFCallback_get_1argument_1count + (JNIEnv *jenv, jclass jcls, jlong that) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + return context->arg_count; +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: get_argument_type + * Signature: (JI)I + */ +JNIEXPORT jint JNICALL Java_com_mysql_udf_NativeUDFCallback_get_1argument_1type + (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + int field_type, length; + void *ptr; + + context->field_ptr(arg_index, &field_type, &ptr, &length); + return field_type; +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: is_argument_null + * Signature: (JI)Z + */ +JNIEXPORT jboolean JNICALL Java_com_mysql_udf_NativeUDFCallback_is_1argument_1null + (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + return context->val_null(arg_index); +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: set_null_argument + * Signature: (JI)V + */ +JNIEXPORT void JNICALL Java_com_mysql_udf_NativeUDFCallback_set_1null_1argument + (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + context->store_null(arg_index); +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: get_long_argument + * Signature: (JI)J + */ +JNIEXPORT jlong JNICALL Java_com_mysql_udf_NativeUDFCallback_get_1long_1argument + (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + return context->val_integer(arg_index); +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: set_long_argument + * Signature: (JIJ)V + */ +JNIEXPORT void JNICALL Java_com_mysql_udf_NativeUDFCallback_set_1long_1argument + (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index, jlong val) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + context->store_integer(arg_index, val, 0); +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: get_string_argument + * Signature: (JI)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_com_mysql_udf_NativeUDFCallback_get_1string_1argument + (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + int field_type, length; + void *ptr; + const char *str; + jstring jstr; + CHARSET_INFO* cs; + + context->field_ptr(arg_index, &field_type, &ptr, &length); + length = ( length + 64 ) & ~63; /* round up temp size */ + + for (;;) + { + int temp_length = length; + char *temp_ptr = (char *) malloc(length); + str = context->val_string(arg_index, temp_ptr, &length, &cs); + if (length >= temp_length) + { + length = ( length + 64 ) & ~63; /* round up temp size */ + free(temp_ptr); + continue; + } + + jstr = make_jstring(jenv, str, length, cs); + free(temp_ptr); + return jstr; + } +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: set_string_argument + * Signature: (JILjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_mysql_udf_NativeUDFCallback_set_1string_1argument + (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index, jstring val) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + + const char *str = jenv->GetStringUTFChars(val, 0); + + context->store_string(arg_index, str, strlen(str), + &my_charset_utf8_general_ci); + + jenv->ReleaseStringUTFChars(val, str); +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: get_double_argument + * Signature: (JI)D + */ +JNIEXPORT jdouble JNICALL Java_com_mysql_udf_NativeUDFCallback_get_1double_1argument + (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + return context->val_double(arg_index); +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: set_double_argument + * Signature: (JID)V + */ +JNIEXPORT void JNICALL Java_com_mysql_udf_NativeUDFCallback_set_1double_1argument + (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index, jdouble val) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + context->store_double(arg_index, val, 53 /* PRECISION_FOR_DOUBLE */); +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: get_big_decimal_argument + * Signature: (JI)Ljava/math/BigDecimal; + */ +JNIEXPORT jstring JNICALL Java_com_mysql_udf_NativeUDFCallback_get_1big_1decimal_1argument + (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index) +{ + return Java_com_mysql_udf_NativeUDFCallback_get_1string_1argument(jenv, jcls, + that, arg_index); +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: set_big_decimal_argument + * Signature: (JILjava/math/BigDecimal;)V + */ +JNIEXPORT void JNICALL Java_com_mysql_udf_NativeUDFCallback_set_1big_1decimal_1argument + (JNIEnv *jenv, jclass jcls, jlong that, jint arg_index, jstring val) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + const char *str = jenv->GetStringUTFChars(val, 0); + context->store_string(arg_index, str, strlen(str), + &my_charset_utf8_general_ci); + jenv->ReleaseStringUTFChars(val, str); +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: row_field + * Signature: (JLjava/lang/String;III)I + */ +JNIEXPORT jint JNICALL Java_com_mysql_udf_NativeUDFCallback_row_1field + (JNIEnv *jenv, jclass jcls, jlong that, jstring col_name, jint field_type, + jint display_width, jint precision) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + const char *str = jenv->GetStringUTFChars(col_name, 0); + int rv = context->row_field(str, field_type, display_width, + precision); + jenv->ReleaseStringUTFChars(col_name, str); + + return rv; +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: row_prepare + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_mysql_udf_NativeUDFCallback_row_1prepare + (JNIEnv *jenv, jclass jcls, jlong that) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + return context->row_prepare(); +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: row_send + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_mysql_udf_NativeUDFCallback_row_1send + (JNIEnv *jenv, jclass jcls, jlong that) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + return context->row_send(); +} + +/* + * Class: com_mysql_udf_NativeUDFCallback + * Method: row_send_eof + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_com_mysql_udf_NativeUDFCallback_row_1send_1eof + (JNIEnv *jenv, jclass jcls, jlong that) +{ + MYSQL_PSM_CONTEXT context = (MYSQL_PSM_CONTEXT) that; + return context->row_send_eof(); +} + diff -Nrup a/plugin/java_udf/jniutils.cc b/plugin/java_udf/jniutils.cc --- a/plugin/java_udf/jniutils.cc 2007-09-22 15:21:23 +02:00 +++ b/plugin/java_udf/jniutils.cc 2007-09-22 18:02:39 +02:00 @@ -1,3 +1,4 @@ +#include #include "jniutils.h" jstring make_jstring(JNIEnv * jenv, const char *src_str, uint src_length, @@ -8,7 +9,7 @@ jstring make_jstring(JNIEnv * jenv, cons uint tgt_len; uint add_len; jstring result; - int dummy; /* let us ignore any errors */ + uint dummy; /* let us ignore any errors */ add_len = src_length / src_cs->mbminlen * tgt_cs->mbmaxlen; tgt_str = (char *) malloc(add_len+1); @@ -16,6 +17,6 @@ jstring make_jstring(JNIEnv * jenv, cons tgt_len = copy_and_convert(tgt_str, add_len, tgt_cs, src_str, src_length, src_cs, &dummy); - result = (*jenv)->NewStringUTF(tgt_str); + result = jenv->NewStringUTF(tgt_str); free(tgt_str); } diff -Nrup a/plugin/java_udf/jniutils.h b/plugin/java_udf/jniutils.h --- a/plugin/java_udf/jniutils.h 2007-09-22 15:21:23 +02:00 +++ b/plugin/java_udf/jniutils.h 2007-09-22 18:02:39 +02:00 @@ -4,7 +4,20 @@ #include #include #include -#if 0 -#include +#include + +#ifdef __cplusplus +extern "C" { #endif -jstring make_jstring(JNIEnv * jenv, const char *src_str, uint src_length, CHARSET_INFO *src_cs) + +jstring make_jstring(JNIEnv * jenv, const char *src_str, uint src_length, CHARSET_INFO *src_cs); + +#ifdef __cplusplus +} +#endif + +/* the following function is copied from sql_string.h */ +uint32 copy_and_convert(char *to, uint32 to_length, CHARSET_INFO *to_cs, + const char *from, uint32 from_length, + CHARSET_INFO *from_cs, uint *errors); + diff -Nrup a/sql/sql_plugin.cc b/sql/sql_plugin.cc --- a/sql/sql_plugin.cc 2007-09-22 14:28:31 +02:00 +++ b/sql/sql_plugin.cc 2007-09-22 18:02:39 +02:00 @@ -1620,7 +1620,7 @@ bool mysql_install_plugin(THD *thd, cons TABLE *table; int error, argc; char *argv[2]; - struct st_plugin_int *tmp; + struct st_plugin_int *tmp= NULL; DBUG_ENTER("mysql_install_plugin"); bzero(&tables, sizeof(tables)); @@ -1634,7 +1634,6 @@ bool mysql_install_plugin(THD *thd, cons DBUG_RETURN(TRUE); pthread_mutex_lock(&LOCK_plugin); - rw_wrlock(&LOCK_system_variables_hash); table->use_all_columns(); restore_record(table, s->default_values); @@ -1651,6 +1650,7 @@ bool mysql_install_plugin(THD *thd, cons argv[0]= const_cast(""); // without a cast gcc emits a warning argv[1]= 0; argc= 1; + rw_wrlock(&LOCK_system_variables_hash); error= plugin_add(thd->mem_root, name, dl, &argc, argv, REPORT_TO_USER); rw_unlock(&LOCK_system_variables_hash); @@ -1688,7 +1688,8 @@ deinit: } } - tmp->state= PLUGIN_IS_DELETED; + if (tmp) + tmp->state= PLUGIN_IS_DELETED; reap_needed= true; reap_plugins(); err: diff -Nrup a/sql/sql_yacc.yy b/sql/sql_yacc.yy --- a/sql/sql_yacc.yy 2007-09-22 14:28:31 +02:00 +++ b/sql/sql_yacc.yy 2007-09-22 18:02:39 +02:00 @@ -516,7 +516,7 @@ bool my_yyoverflow(short **a, YYSTYPE ** Currently there are 279 shift/reduce conflicts. We should not introduce new conflicts any more. */ -%expect 279 +%expect 270 /* Comments for TOKENS.