From 510b69ffc89f25b5be1397b27956c6a5eebfe630 Mon Sep 17 00:00:00 2001 From: slguan Date: Mon, 5 Aug 2019 12:35:13 +0800 Subject: [PATCH] fix the issue #276 --- src/client/src/TSDBJNIConnector.c | 45 +++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/src/client/src/TSDBJNIConnector.c b/src/client/src/TSDBJNIConnector.c index 5ffa1c34fc..64f56886a5 100644 --- a/src/client/src/TSDBJNIConnector.c +++ b/src/client/src/TSDBJNIConnector.c @@ -365,8 +365,19 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getSchemaMetaData return JNI_SUCCESS; } -jstring jniFromNCharToByteArray(JNIEnv *env, char *nchar) { +/** + * + * @param env vm + * @param nchar true multibytes data + * @param maxBytes the maximum allowable field length + * @return + */ +jstring jniFromNCharToByteArray(JNIEnv *env, char *nchar, int32_t maxBytes) { int len = (int)strlen(nchar); + if (len > maxBytes) { // no terminated symbol exists '\0' + len = maxBytes; + } + jbyteArray bytes = (*env)->NewByteArray(env, len); (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte *)nchar); return bytes; @@ -400,6 +411,8 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn return JNI_FETCH_END; } + char tmp[TSDB_MAX_BYTES_PER_ROW] = {0}; + for (int i = 0; i < num_fields; i++) { if (row[i] == NULL) { continue; @@ -427,12 +440,18 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn case TSDB_DATA_TYPE_DOUBLE: (*env)->CallVoidMethod(env, rowobj, g_rowdataSetDoubleFp, i, (jdouble) * ((double *)row[i])); break; - case TSDB_DATA_TYPE_BINARY: - (*env)->CallVoidMethod(env, rowobj, g_rowdataSetStringFp, i, (*env)->NewStringUTF(env, (char *)row[i])); + case TSDB_DATA_TYPE_BINARY:{ + strncpy(tmp, row[i], (size_t) fields[i].bytes); // handle the case that terminated does not exist + (*env)->CallVoidMethod(env, rowobj, g_rowdataSetStringFp, i, (*env)->NewStringUTF(env, tmp)); + + memset(tmp, 0, (size_t) fields[i].bytes); break; - case TSDB_DATA_TYPE_NCHAR: - (*env)->CallVoidMethod(env, rowobj, g_rowdataSetByteArrayFp, i, jniFromNCharToByteArray(env, (char *)row[i])); + } + case TSDB_DATA_TYPE_NCHAR:{ + (*env)->CallVoidMethod(env, rowobj, g_rowdataSetByteArrayFp, i, + jniFromNCharToByteArray(env, (char*)row[i], fields[i].bytes)); break; + } case TSDB_DATA_TYPE_TIMESTAMP: (*env)->CallVoidMethod(env, rowobj, g_rowdataSetTimestampFp, i, (jlong) * ((int64_t *)row[i])); break; @@ -541,6 +560,8 @@ JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_consumeImp(JNI return NULL; } + char tmp[TSDB_MAX_BYTES_PER_ROW] = {0}; + for (int i = 0; i < num_fields; i++) { if (row[i] == NULL) { continue; @@ -568,12 +589,20 @@ JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_consumeImp(JNI case TSDB_DATA_TYPE_DOUBLE: (*env)->CallVoidMethod(env, rowobj, g_rowdataSetDoubleFp, i, (jdouble) * ((double *)row[i])); break; - case TSDB_DATA_TYPE_BINARY: + case TSDB_DATA_TYPE_BINARY: { + strncpy(tmp, row[i], (size_t) fields[i].bytes); // handle the case that terminated does not exist + (*env)->CallVoidMethod(env, rowobj, g_rowdataSetStringFp, i, (*env)->NewStringUTF(env, (char *)row[i])); + memset(tmp, 0, (size_t) fields[i].bytes); break; - case TSDB_DATA_TYPE_NCHAR: - (*env)->CallVoidMethod(env, rowobj, g_rowdataSetByteArrayFp, i, jniFromNCharToByteArray(env, (char *)row[i])); + } + + case TSDB_DATA_TYPE_NCHAR: { + (*env)->CallVoidMethod(env, rowobj, g_rowdataSetByteArrayFp, i, + jniFromNCharToByteArray(env, (char *)row[i], fields[i].bytes)); break; + } + case TSDB_DATA_TYPE_TIMESTAMP: (*env)->CallVoidMethod(env, rowobj, g_rowdataSetTimestampFp, i, (jlong) * ((int64_t *)row[i])); break;