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 15:21:27+02:00, eherman@stripped +7 -0
check-in a rough draft of the jnicallback implementation. Compile errors exist.
plugin/java_udf/Makefile.am@stripped, 2007-09-22 15:21:22+02:00, eherman@stripped +2 -1
adding jnicallback.c
plugin/java_udf/com/mysql/udf/NativeUDFCallback.java@stripped, 2007-09-22 15:21:22+02:00, eherman@stripped +128 -20
adjusting the native callbacks to encapsulate native calls passing the "that" pointer back to the native side.
plugin/java_udf/com/mysql/udf/UDFCallback.java@stripped, 2007-09-22 15:21:22+02:00, eherman@stripped +6 -9
clarified the argument names, added interface to return a result set
plugin/java_udf/com/mysql/udf/test/TestCallback.java@stripped, 2007-09-22 15:21:23+02:00, eherman@stripped +4 -0
added ability to return a result set
plugin/java_udf/jnicallback.c@stripped, 2007-09-22 15:21:23+02:00, eherman@stripped +244 -0
New BitKeeper file ``plugin/java_udf/jnicallback.c''
plugin/java_udf/jnicallback.c@stripped, 2007-09-22 15:21:23+02:00, eherman@stripped +0 -0
plugin/java_udf/jniutils.cc@stripped, 2007-09-22 15:21:23+02:00, eherman@stripped +21 -0
New BitKeeper file ``plugin/java_udf/jniutils.cc''
plugin/java_udf/jniutils.cc@stripped, 2007-09-22 15:21:23+02:00, eherman@stripped +0 -0
plugin/java_udf/jniutils.h@stripped, 2007-09-22 15:21:23+02:00, eherman@stripped +10 -0
New BitKeeper file ``plugin/java_udf/jniutils.h''
plugin/java_udf/jniutils.h@stripped, 2007-09-22 15:21:23+02:00, eherman@stripped +0 -0
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: eherman
# Host: halle.local
# Root: /Users/eric/src/mysql-5.2-eric+antony
--- 1.4/plugin/java_udf/Makefile.am 2007-09-21 21:15:20 +02:00
+++ 1.5/plugin/java_udf/Makefile.am 2007-09-22 15:21:22 +02:00
@@ -39,7 +39,8 @@ 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
+ java_util_arraylist.cc jvm_singleton.cc jnicallback.c \
+ jniutils.cc
EXTRA_LTLIBRARIES= psm_java.la
pkglib_LTLIBRARIES= @plugin_java_udf_shared_target@
--- 1.1/plugin/java_udf/com/mysql/udf/NativeUDFCallback.java 2007-06-04 21:41:15 +02:00
+++ 1.2/plugin/java_udf/com/mysql/udf/NativeUDFCallback.java 2007-09-22 15:21:22 +02:00
@@ -1,51 +1,159 @@
package com.mysql.udf;
import java.math.BigDecimal;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
public class NativeUDFCallback implements UDFCallback {
- private long ptr;
+ private static final int RESULT_INDEX = -1;
+
+ private final long that;
public NativeUDFCallback(long ptr) {
- this.ptr = ptr;
+ this.that = ptr;
}
public long getPointer() {
- return ptr;
+ return that;
+ }
+
+ public int getArgumentCount() {
+ return get_argument_count(that);
+ }
+
+ public int getArgumentType(int argIndex) {
+ return get_argument_type(that, argIndex);
+ }
+
+ public boolean isArgumentNull(int argIndex) {
+ return is_argument_null(that, argIndex);
+ }
+
+ public void setNullArgument(int idx) {
+ set_null_argument(that, idx);
+ }
+
+ public long getLongArgument(int argIndex) {
+ return get_long_argument(that, argIndex);
+ }
+
+ public void setLongArgument(int idx, long value) {
+ set_long_argument(that, idx, value);
+ }
+
+ public String getStringArgument(int argIndex) {
+ return get_string_argument(that, argIndex);
+ }
+
+ public void setStringArgument(int idx, String value) {
+ set_string_argument(that, idx, value);
+ }
+
+ public double getDoubleArgument(int argIndex) {
+ return get_double_argument(that, argIndex);
+ }
+
+ public void setDoubleArgument(int idx, double value) {
+ set_double_argument(that, idx, value);
+ }
+
+ public BigDecimal getBigDecimalArgument(int argIndex) {
+ return new BigDecimal(get_big_decimal_argument(that, argIndex));
+ }
+
+ public void setBigDecimalArgument(int idx, BigDecimal value) {
+ set_big_decimal_argument(that, idx, value.toString());
+ }
+
+ public void storeResultNull() {
+ set_null_argument(that, RESULT_INDEX);
}
- public native int getArgumentCount();
+ public void storeResultLong(long value) {
+ set_long_argument(that, RESULT_INDEX, value);
+ }
+
+ public void storeResultString(String value) {
+ set_string_argument(that, RESULT_INDEX, value);
+ }
+
+ public void storeResultDouble(double value) {
+ set_double_argument(that, RESULT_INDEX, value);
+ }
+
+ public void storeResultBigDecimal(BigDecimal value) {
+ set_big_decimal_argument(that, RESULT_INDEX, value.toString());
+ }
+
+ public void storeResultResultSet(java.sql.ResultSet rs) {
+ try {
+ int colcount;
+ final ResultSetMetaData metaData = rs.getMetaData();
+ colcount = metaData.getColumnCount();
+ for (int i = 1; i <= colcount; i++) {
+ String name = metaData.getColumnLabel(i);
+ int width = metaData.getColumnDisplaySize(i);
+ int mysql_type = 254; /* MYSQL_TYPE_STRING */
+ int precision = 0;
+
+ row_field(that, name, mysql_type, width, precision);
+ }
+ while (rs.next()) {
+ row_prepare(that);
+ for (int i = 1; i <= colcount; i++) {
+ storeResultString(rs.getString(i));
+ }
+ row_send(that);
+ }
+ row_send_eof(that);
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+ }
- public native int getArgumentType(int argIndex);
+ private static native int get_argument_count(long that);
- public native boolean isArgumentNull(int argIndex);
+ private static native int get_argument_type(long that, int arg_index);
- public native void setNullArgument(int idx);
+ private static native boolean is_argument_null(long that, int arg_index);
- public native long getLongArgument(int argIndex);
+ private static native void set_null_argument(long that, int idx);
- public native void setLongArgument(int idx, long value);
+ private static native long get_long_argument(long that, int arg_index);
- public native String getStringArgument(int argIndex);
+ private static native void set_long_argument(long that, int idx, long value);
- public native void setStringArgument(int idx, String value);
+ private static native String get_string_argument(long that, int arg_index);
- public native double getDoubleArgument(int argIndex);
+ private static native void set_string_argument(long that, int idx,
+ String value);
- public native void setDoubleArgument(int idx, double value);
+ private static native double get_double_argument(long that, int arg_index);
- public native BigDecimal getBigDecimalArgument(int argIndex);
+ private static native void set_double_argument(long that, int idx,
+ double value);
- public native void setBigDecimalArgument(int idx, BigDecimal value);
+ private static native String get_big_decimal_argument(long that,
+ int argIndex);
- public native void storeResultNull();
+ private static native void set_big_decimal_argument(long that, int idx,
+ String value);
- public native void storeResultLong(long value);
+ /* The following are for result sets */
- public native void storeResultString(String value);
+ /* this method is called for each column in the result set to be constructed */
+ private static native int row_field(long that, String column_name,
+ int field_type, int column_width, int precision);
- public native void storeResultDouble(double value);
+ /* call row_prepare() before filling in the row */
+ private static native int row_prepare(long that);
- public native void storeResultBigDecimal(BigDecimal value);
+ /* call store for each column value*/
+ /* call row_send for each row*/
+ private static native int row_send(long that);
+
+ /* call row_send_eof after the last row */
+ private static native int row_send_eof(long that);
}
--- 1.1/plugin/java_udf/com/mysql/udf/UDFCallback.java 2007-06-04 21:41:16 +02:00
+++ 1.2/plugin/java_udf/com/mysql/udf/UDFCallback.java 2007-09-22 15:21:22 +02:00
@@ -29,17 +29,14 @@ public interface UDFCallback {
void storeResultNull();
- void storeResultLong(long value);
+ void storeResultLong(long returnValue);
- void storeResultString(String value);
+ void storeResultString(String returnValue);
- void storeResultDouble(double value);
+ void storeResultDouble(double returnValue);
- void storeResultBigDecimal(BigDecimal value);
+ void storeResultBigDecimal(BigDecimal returnValue);
+
+ void storeResultResultSet(java.sql.ResultSet returnValue);
- // This stuff will come in handy for stored procs:
- // void rowDeclareField(String title, UDFType type, int size, int
- // precision);
- // void rowPrepare();
- // void rowSend();
}
--- 1.1/plugin/java_udf/com/mysql/udf/test/TestCallback.java 2007-06-04 21:54:26 +02:00
+++ 1.2/plugin/java_udf/com/mysql/udf/test/TestCallback.java 2007-09-22 15:21:23 +02:00
@@ -135,6 +135,10 @@ public class TestCallback implements UDF
this.result = value;
}
+ public void storeResultResultSet(java.sql.ResultSet returnValue) {
+ this.result = returnValue;
+ }
+
String resultAsString() {
return "" + this.result;
}
--- New file ---
+++ plugin/java_udf/jnicallback.c 07/09/22 15:21:23
#include <stdlib.h>
#include <ctype.h>
#include <strings.h>
#include <mysql.h>
#include <mysql/plugin.h>
#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);
}
--- New file ---
+++ plugin/java_udf/jniutils.cc 07/09/22 15:21:23
#include "jniutils.h"
jstring make_jstring(JNIEnv * jenv, const char *src_str, uint src_length,
CHARSET_INFO *src_cs)
{
CHARSET_INFO *tgt_cs = &my_charset_utf8_general_ci;
char * tgt_str;
uint tgt_len;
uint add_len;
jstring result;
int dummy; /* let us ignore any errors */
add_len = src_length / src_cs->mbminlen * tgt_cs->mbmaxlen;
tgt_str = (char *) malloc(add_len+1);
tgt_len = copy_and_convert(tgt_str, add_len, tgt_cs,
src_str, src_length, src_cs, &dummy);
result = (*jenv)->NewStringUTF(tgt_str);
free(tgt_str);
}
--- New file ---
+++ plugin/java_udf/jniutils.h 07/09/22 15:21:23
#include <jni.h>
#include <stdlib.h>
#include <ctype.h>
#include <strings.h>
#include <mysql.h>
#include <mysql/plugin.h>
#if 0
#include <sql_string.h>
#endif
jstring make_jstring(JNIEnv * jenv, const char *src_str, uint src_length, CHARSET_INFO *src_cs)
| Thread |
|---|
| • bk commit into 5.2 tree (eherman:1.2526) | eherman | 22 Sep |