[TD-6432]<fix>: fix batchFetch BufferUnderflowException (#7675)
This commit is contained in:
parent
56776b62fe
commit
8f32f23de9
|
@ -20,12 +20,42 @@
|
||||||
|
|
||||||
#include "com_taosdata_jdbc_TSDBJNIConnector.h"
|
#include "com_taosdata_jdbc_TSDBJNIConnector.h"
|
||||||
|
|
||||||
#define jniFatal(...) { if (jniDebugFlag & DEBUG_FATAL) { taosPrintLog("JNI FATAL ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); }}
|
#define jniFatal(...) \
|
||||||
#define jniError(...) { if (jniDebugFlag & DEBUG_ERROR) { taosPrintLog("JNI ERROR ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); }}
|
{ \
|
||||||
#define jniWarn(...) { if (jniDebugFlag & DEBUG_WARN) { taosPrintLog("JNI WARN ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); }}
|
if (jniDebugFlag & DEBUG_FATAL) { \
|
||||||
#define jniInfo(...) { if (jniDebugFlag & DEBUG_INFO) { taosPrintLog("JNI ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); }}
|
taosPrintLog("JNI FATAL ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); \
|
||||||
#define jniDebug(...) { if (jniDebugFlag & DEBUG_DEBUG) { taosPrintLog("JNI ", jniDebugFlag, __VA_ARGS__); }}
|
} \
|
||||||
#define jniTrace(...) { if (jniDebugFlag & DEBUG_TRACE) { taosPrintLog("JNI ", jniDebugFlag, __VA_ARGS__); }}
|
}
|
||||||
|
#define jniError(...) \
|
||||||
|
{ \
|
||||||
|
if (jniDebugFlag & DEBUG_ERROR) { \
|
||||||
|
taosPrintLog("JNI ERROR ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#define jniWarn(...) \
|
||||||
|
{ \
|
||||||
|
if (jniDebugFlag & DEBUG_WARN) { \
|
||||||
|
taosPrintLog("JNI WARN ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#define jniInfo(...) \
|
||||||
|
{ \
|
||||||
|
if (jniDebugFlag & DEBUG_INFO) { \
|
||||||
|
taosPrintLog("JNI ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#define jniDebug(...) \
|
||||||
|
{ \
|
||||||
|
if (jniDebugFlag & DEBUG_DEBUG) { \
|
||||||
|
taosPrintLog("JNI ", jniDebugFlag, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#define jniTrace(...) \
|
||||||
|
{ \
|
||||||
|
if (jniDebugFlag & DEBUG_TRACE) { \
|
||||||
|
taosPrintLog("JNI ", jniDebugFlag, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
int __init = 0;
|
int __init = 0;
|
||||||
|
|
||||||
|
@ -60,14 +90,14 @@ jmethodID g_blockdataSetByteArrayFp;
|
||||||
jmethodID g_blockdataSetNumOfRowsFp;
|
jmethodID g_blockdataSetNumOfRowsFp;
|
||||||
jmethodID g_blockdataSetNumOfColsFp;
|
jmethodID g_blockdataSetNumOfColsFp;
|
||||||
|
|
||||||
#define JNI_SUCCESS 0
|
#define JNI_SUCCESS 0
|
||||||
#define JNI_TDENGINE_ERROR -1
|
#define JNI_TDENGINE_ERROR -1
|
||||||
#define JNI_CONNECTION_NULL -2
|
#define JNI_CONNECTION_NULL -2
|
||||||
#define JNI_RESULT_SET_NULL -3
|
#define JNI_RESULT_SET_NULL -3
|
||||||
#define JNI_NUM_OF_FIELDS_0 -4
|
#define JNI_NUM_OF_FIELDS_0 -4
|
||||||
#define JNI_SQL_NULL -5
|
#define JNI_SQL_NULL -5
|
||||||
#define JNI_FETCH_END -6
|
#define JNI_FETCH_END -6
|
||||||
#define JNI_OUT_OF_MEMORY -7
|
#define JNI_OUT_OF_MEMORY -7
|
||||||
|
|
||||||
static void jniGetGlobalMethod(JNIEnv *env) {
|
static void jniGetGlobalMethod(JNIEnv *env) {
|
||||||
// make sure init function executed once
|
// make sure init function executed once
|
||||||
|
@ -129,13 +159,13 @@ static void jniGetGlobalMethod(JNIEnv *env) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t check_for_params(jobject jobj, jlong conn, jlong res) {
|
static int32_t check_for_params(jobject jobj, jlong conn, jlong res) {
|
||||||
if ((TAOS*) conn == NULL) {
|
if ((TAOS *)conn == NULL) {
|
||||||
jniError("jobj:%p, connection is closed", jobj);
|
jniError("jobj:%p, connection is closed", jobj);
|
||||||
return JNI_CONNECTION_NULL;
|
return JNI_CONNECTION_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((TAOS_RES *) res == NULL) {
|
if ((TAOS_RES *)res == NULL) {
|
||||||
jniError("jobj:%p, conn:%p, res is null", jobj, (TAOS*) conn);
|
jniError("jobj:%p, conn:%p, res is null", jobj, (TAOS *)conn);
|
||||||
return JNI_RESULT_SET_NULL;
|
return JNI_RESULT_SET_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,7 +246,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setOptions(JNIEnv
|
||||||
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_connectImp(JNIEnv *env, jobject jobj, jstring jhost,
|
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_connectImp(JNIEnv *env, jobject jobj, jstring jhost,
|
||||||
jint jport, jstring jdbName, jstring juser,
|
jint jport, jstring jdbName, jstring juser,
|
||||||
jstring jpass) {
|
jstring jpass) {
|
||||||
jlong ret = 0;
|
jlong ret = 0;
|
||||||
const char *host = NULL;
|
const char *host = NULL;
|
||||||
const char *user = NULL;
|
const char *user = NULL;
|
||||||
const char *pass = NULL;
|
const char *pass = NULL;
|
||||||
|
@ -246,7 +276,7 @@ JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_connectImp(JNIEn
|
||||||
jniDebug("jobj:%p, pass not specified, use default password", jobj);
|
jniDebug("jobj:%p, pass not specified, use default password", jobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = (jlong) taos_connect((char *)host, (char *)user, (char *)pass, (char *)dbname, (uint16_t)jport);
|
ret = (jlong)taos_connect((char *)host, (char *)user, (char *)pass, (char *)dbname, (uint16_t)jport);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
jniError("jobj:%p, conn:%p, connect to database failed, host=%s, user=%s, dbname=%s, port=%d", jobj, (void *)ret,
|
jniError("jobj:%p, conn:%p, connect to database failed, host=%s, user=%s, dbname=%s, port=%d", jobj, (void *)ret,
|
||||||
(char *)host, (char *)user, (char *)dbname, (int32_t)jport);
|
(char *)host, (char *)user, (char *)dbname, (int32_t)jport);
|
||||||
|
@ -289,7 +319,7 @@ JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_executeQueryImp(
|
||||||
|
|
||||||
jsize len = (*env)->GetArrayLength(env, jsql);
|
jsize len = (*env)->GetArrayLength(env, jsql);
|
||||||
|
|
||||||
char *str = (char *) calloc(1, sizeof(char) * (len + 1));
|
char *str = (char *)calloc(1, sizeof(char) * (len + 1));
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
jniError("jobj:%p, conn:%p, alloc memory failed", jobj, tscon);
|
jniError("jobj:%p, conn:%p, alloc memory failed", jobj, tscon);
|
||||||
return JNI_OUT_OF_MEMORY;
|
return JNI_OUT_OF_MEMORY;
|
||||||
|
@ -315,16 +345,17 @@ JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_executeQueryImp(
|
||||||
}
|
}
|
||||||
|
|
||||||
free(str);
|
free(str);
|
||||||
return (jlong) pSql;
|
return (jlong)pSql;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getErrCodeImp(JNIEnv *env, jobject jobj, jlong con, jlong tres) {
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getErrCodeImp(JNIEnv *env, jobject jobj, jlong con,
|
||||||
|
jlong tres) {
|
||||||
int32_t code = check_for_params(jobj, con, tres);
|
int32_t code = check_for_params(jobj, con, tres);
|
||||||
if (code != JNI_SUCCESS) {
|
if (code != JNI_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (jint)taos_errno((TAOS_RES*) tres);
|
return (jint)taos_errno((TAOS_RES *)tres);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jstring JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getErrMsgImp(JNIEnv *env, jobject jobj, jlong tres) {
|
JNIEXPORT jstring JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getErrMsgImp(JNIEnv *env, jobject jobj, jlong tres) {
|
||||||
|
@ -334,7 +365,7 @@ JNIEXPORT jstring JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getErrMsgImp(J
|
||||||
|
|
||||||
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getResultSetImp(JNIEnv *env, jobject jobj, jlong con,
|
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getResultSetImp(JNIEnv *env, jobject jobj, jlong con,
|
||||||
jlong tres) {
|
jlong tres) {
|
||||||
TAOS *tscon = (TAOS *)con;
|
TAOS * tscon = (TAOS *)con;
|
||||||
int32_t code = check_for_params(jobj, con, tres);
|
int32_t code = check_for_params(jobj, con, tres);
|
||||||
if (code != JNI_SUCCESS) {
|
if (code != JNI_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
|
@ -359,7 +390,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_isUpdateQueryImp(
|
||||||
|
|
||||||
SSqlObj *pSql = (TAOS_RES *)tres;
|
SSqlObj *pSql = (TAOS_RES *)tres;
|
||||||
|
|
||||||
return (tscIsUpdateQuery(pSql)? 1:0);
|
return (tscIsUpdateQuery(pSql) ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_freeResultSetImp(JNIEnv *env, jobject jobj, jlong con,
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_freeResultSetImp(JNIEnv *env, jobject jobj, jlong con,
|
||||||
|
@ -370,21 +401,22 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_freeResultSetImp(
|
||||||
}
|
}
|
||||||
|
|
||||||
taos_free_result((void *)res);
|
taos_free_result((void *)res);
|
||||||
jniDebug("jobj:%p, conn:%p, free resultset:%p", jobj, (TAOS*) con, (void *)res);
|
jniDebug("jobj:%p, conn:%p, free resultset:%p", jobj, (TAOS *)con, (void *)res);
|
||||||
|
|
||||||
return JNI_SUCCESS;
|
return JNI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getAffectedRowsImp(JNIEnv *env, jobject jobj, jlong con,
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getAffectedRowsImp(JNIEnv *env, jobject jobj, jlong con,
|
||||||
jlong res) {
|
jlong res) {
|
||||||
TAOS *tscon = (TAOS *)con;
|
TAOS * tscon = (TAOS *)con;
|
||||||
int32_t code = check_for_params(jobj, con, res);
|
int32_t code = check_for_params(jobj, con, res);
|
||||||
if (code != JNI_SUCCESS) {
|
if (code != JNI_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
jint ret = taos_affected_rows((SSqlObj *)res);
|
jint ret = taos_affected_rows((SSqlObj *)res);
|
||||||
jniDebug("jobj:%p, conn:%p, sql:%p, res: %p, affect rows:%d", jobj, tscon, (TAOS *)con, (TAOS_RES *)res, (int32_t)ret);
|
jniDebug("jobj:%p, conn:%p, sql:%p, res: %p, affect rows:%d", jobj, tscon, (TAOS *)con, (TAOS_RES *)res,
|
||||||
|
(int32_t)ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -392,13 +424,13 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getAffectedRowsIm
|
||||||
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getSchemaMetaDataImp(JNIEnv *env, jobject jobj,
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getSchemaMetaDataImp(JNIEnv *env, jobject jobj,
|
||||||
jlong con, jlong res,
|
jlong con, jlong res,
|
||||||
jobject arrayListObj) {
|
jobject arrayListObj) {
|
||||||
TAOS *tscon = (TAOS *)con;
|
TAOS * tscon = (TAOS *)con;
|
||||||
int32_t code = check_for_params(jobj, con, res);
|
int32_t code = check_for_params(jobj, con, res);
|
||||||
if (code != JNI_SUCCESS) {
|
if (code != JNI_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_RES* tres = (TAOS_RES*) res;
|
TAOS_RES * tres = (TAOS_RES *)res;
|
||||||
TAOS_FIELD *fields = taos_fetch_fields(tres);
|
TAOS_FIELD *fields = taos_fetch_fields(tres);
|
||||||
|
|
||||||
int32_t num_fields = taos_num_fields(tres);
|
int32_t num_fields = taos_num_fields(tres);
|
||||||
|
@ -452,7 +484,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn
|
||||||
|
|
||||||
int32_t numOfFields = taos_num_fields(result);
|
int32_t numOfFields = taos_num_fields(result);
|
||||||
if (numOfFields == 0) {
|
if (numOfFields == 0) {
|
||||||
jniError("jobj:%p, conn:%p, resultset:%p, fields size %d", jobj, tscon, (void*)res, numOfFields);
|
jniError("jobj:%p, conn:%p, resultset:%p, fields size %d", jobj, tscon, (void *)res, numOfFields);
|
||||||
return JNI_NUM_OF_FIELDS_0;
|
return JNI_NUM_OF_FIELDS_0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -460,7 +492,8 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn
|
||||||
if (row == NULL) {
|
if (row == NULL) {
|
||||||
int code = taos_errno(result);
|
int code = taos_errno(result);
|
||||||
if (code == TSDB_CODE_SUCCESS) {
|
if (code == TSDB_CODE_SUCCESS) {
|
||||||
jniDebug("jobj:%p, conn:%p, resultset:%p, fields size is %d, fetch row to the end", jobj, tscon, (void*)res, numOfFields);
|
jniDebug("jobj:%p, conn:%p, resultset:%p, fields size is %d, fetch row to the end", jobj, tscon, (void *)res,
|
||||||
|
numOfFields);
|
||||||
return JNI_FETCH_END;
|
return JNI_FETCH_END;
|
||||||
} else {
|
} else {
|
||||||
jniDebug("jobj:%p, conn:%p, interrupted query", jobj, tscon);
|
jniDebug("jobj:%p, conn:%p, interrupted query", jobj, tscon);
|
||||||
|
@ -468,7 +501,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t* length = taos_fetch_lengths(result);
|
int32_t *length = taos_fetch_lengths(result);
|
||||||
|
|
||||||
char tmp[TSDB_MAX_BYTES_PER_ROW] = {0};
|
char tmp[TSDB_MAX_BYTES_PER_ROW] = {0};
|
||||||
|
|
||||||
|
@ -533,7 +566,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchBlockImp(JNIEnv *env, jobject jobj, jlong con,
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchBlockImp(JNIEnv *env, jobject jobj, jlong con,
|
||||||
jlong res, jobject rowobj) {
|
jlong res, jobject rowobj) {
|
||||||
TAOS * tscon = (TAOS *)con;
|
TAOS * tscon = (TAOS *)con;
|
||||||
int32_t code = check_for_params(jobj, con, res);
|
int32_t code = check_for_params(jobj, con, res);
|
||||||
if (code != JNI_SUCCESS) {
|
if (code != JNI_SUCCESS) {
|
||||||
|
@ -564,8 +597,13 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchBlockImp(JNI
|
||||||
(*env)->CallVoidMethod(env, rowobj, g_blockdataSetNumOfColsFp, (jint)numOfFields);
|
(*env)->CallVoidMethod(env, rowobj, g_blockdataSetNumOfColsFp, (jint)numOfFields);
|
||||||
|
|
||||||
for (int i = 0; i < numOfFields; i++) {
|
for (int i = 0; i < numOfFields; i++) {
|
||||||
(*env)->CallVoidMethod(env, rowobj, g_blockdataSetByteArrayFp, i, fields[i].bytes * numOfRows,
|
int bytes = fields[i].bytes;
|
||||||
jniFromNCharToByteArray(env, (char *)row[i], fields[i].bytes * numOfRows));
|
|
||||||
|
if (fields[i].type == TSDB_DATA_TYPE_BINARY || fields[i].type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
bytes += 2;
|
||||||
|
}
|
||||||
|
(*env)->CallVoidMethod(env, rowobj, g_blockdataSetByteArrayFp, i, bytes * numOfRows,
|
||||||
|
jniFromNCharToByteArray(env, (char *)row[i], bytes * numOfRows));
|
||||||
}
|
}
|
||||||
|
|
||||||
return JNI_SUCCESS;
|
return JNI_SUCCESS;
|
||||||
|
@ -585,7 +623,8 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_closeConnectionIm
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_subscribeImp(JNIEnv *env, jobject jobj, jlong con,
|
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_subscribeImp(JNIEnv *env, jobject jobj, jlong con,
|
||||||
jboolean restart, jstring jtopic, jstring jsql, jint jinterval) {
|
jboolean restart, jstring jtopic,
|
||||||
|
jstring jsql, jint jinterval) {
|
||||||
jlong sub = 0;
|
jlong sub = 0;
|
||||||
TAOS *taos = (TAOS *)con;
|
TAOS *taos = (TAOS *)con;
|
||||||
char *topic = NULL;
|
char *topic = NULL;
|
||||||
|
@ -682,8 +721,8 @@ JNIEXPORT jstring JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getTsCharset(J
|
||||||
* @param res the TAOS_RES object, i.e. the SSqlObject
|
* @param res the TAOS_RES object, i.e. the SSqlObject
|
||||||
* @return precision 0:ms 1:us 2:ns
|
* @return precision 0:ms 1:us 2:ns
|
||||||
*/
|
*/
|
||||||
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getResultTimePrecisionImp(JNIEnv *env, jobject jobj, jlong con,
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getResultTimePrecisionImp(JNIEnv *env, jobject jobj,
|
||||||
jlong res) {
|
jlong con, jlong res) {
|
||||||
TAOS *tscon = (TAOS *)con;
|
TAOS *tscon = (TAOS *)con;
|
||||||
if (tscon == NULL) {
|
if (tscon == NULL) {
|
||||||
jniError("jobj:%p, connection is closed", jobj);
|
jniError("jobj:%p, connection is closed", jobj);
|
||||||
|
@ -699,7 +738,8 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getResultTimePrec
|
||||||
return taos_result_precision(result);
|
return taos_result_precision(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_prepareStmtImp(JNIEnv *env, jobject jobj, jbyteArray jsql, jlong con) {
|
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_prepareStmtImp(JNIEnv *env, jobject jobj,
|
||||||
|
jbyteArray jsql, jlong con) {
|
||||||
TAOS *tscon = (TAOS *)con;
|
TAOS *tscon = (TAOS *)con;
|
||||||
if (tscon == NULL) {
|
if (tscon == NULL) {
|
||||||
jniError("jobj:%p, connection already closed", jobj);
|
jniError("jobj:%p, connection already closed", jobj);
|
||||||
|
@ -713,7 +753,7 @@ JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_prepareStmtImp(J
|
||||||
|
|
||||||
jsize len = (*env)->GetArrayLength(env, jsql);
|
jsize len = (*env)->GetArrayLength(env, jsql);
|
||||||
|
|
||||||
char *str = (char *) calloc(1, sizeof(char) * (len + 1));
|
char *str = (char *)calloc(1, sizeof(char) * (len + 1));
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
jniError("jobj:%p, conn:%p, alloc memory failed", jobj, tscon);
|
jniError("jobj:%p, conn:%p, alloc memory failed", jobj, tscon);
|
||||||
return JNI_OUT_OF_MEMORY;
|
return JNI_OUT_OF_MEMORY;
|
||||||
|
@ -724,25 +764,27 @@ JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_prepareStmtImp(J
|
||||||
// todo handle error
|
// todo handle error
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_STMT* pStmt = taos_stmt_init(tscon);
|
TAOS_STMT *pStmt = taos_stmt_init(tscon);
|
||||||
int32_t code = taos_stmt_prepare(pStmt, str, len);
|
int32_t code = taos_stmt_prepare(pStmt, str, len);
|
||||||
tfree(str);
|
tfree(str);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
jniError("jobj:%p, conn:%p, code:%s", jobj, tscon, tstrerror(code));
|
jniError("jobj:%p, conn:%p, code:%s", jobj, tscon, tstrerror(code));
|
||||||
return JNI_TDENGINE_ERROR;
|
return JNI_TDENGINE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (jlong) pStmt;
|
return (jlong)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setBindTableNameImp(JNIEnv *env, jobject jobj, jlong stmt, jstring jname, jlong conn) {
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setBindTableNameImp(JNIEnv *env, jobject jobj,
|
||||||
|
jlong stmt, jstring jname,
|
||||||
|
jlong conn) {
|
||||||
TAOS *tsconn = (TAOS *)conn;
|
TAOS *tsconn = (TAOS *)conn;
|
||||||
if (tsconn == NULL) {
|
if (tsconn == NULL) {
|
||||||
jniError("jobj:%p, connection already closed", jobj);
|
jniError("jobj:%p, connection already closed", jobj);
|
||||||
return JNI_CONNECTION_NULL;
|
return JNI_CONNECTION_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_STMT* pStmt = (TAOS_STMT*) stmt;
|
TAOS_STMT *pStmt = (TAOS_STMT *)stmt;
|
||||||
if (pStmt == NULL) {
|
if (pStmt == NULL) {
|
||||||
jniError("jobj:%p, conn:%p, invalid stmt handle", jobj, tsconn);
|
jniError("jobj:%p, conn:%p, invalid stmt handle", jobj, tsconn);
|
||||||
return JNI_SQL_NULL;
|
return JNI_SQL_NULL;
|
||||||
|
@ -750,7 +792,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setBindTableNameI
|
||||||
|
|
||||||
const char *name = (*env)->GetStringUTFChars(env, jname, NULL);
|
const char *name = (*env)->GetStringUTFChars(env, jname, NULL);
|
||||||
|
|
||||||
int32_t code = taos_stmt_set_tbname((void*)stmt, name);
|
int32_t code = taos_stmt_set_tbname((void *)stmt, name);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
(*env)->ReleaseStringUTFChars(env, jname, name);
|
(*env)->ReleaseStringUTFChars(env, jname, name);
|
||||||
|
|
||||||
|
@ -763,8 +805,9 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setBindTableNameI
|
||||||
return JNI_SUCCESS;
|
return JNI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_bindColDataImp(JNIEnv *env, jobject jobj, jlong stmt,
|
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_bindColDataImp(
|
||||||
jbyteArray colDataList, jbyteArray lengthList, jbyteArray nullList, jint dataType, jint dataBytes, jint numOfRows, jint colIndex, jlong con) {
|
JNIEnv *env, jobject jobj, jlong stmt, jbyteArray colDataList, jbyteArray lengthList, jbyteArray nullList,
|
||||||
|
jint dataType, jint dataBytes, jint numOfRows, jint colIndex, jlong con) {
|
||||||
TAOS *tscon = (TAOS *)con;
|
TAOS *tscon = (TAOS *)con;
|
||||||
if (tscon == NULL) {
|
if (tscon == NULL) {
|
||||||
jniError("jobj:%p, connection already closed", jobj);
|
jniError("jobj:%p, connection already closed", jobj);
|
||||||
|
@ -798,14 +841,14 @@ JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_bindColDataImp(J
|
||||||
}
|
}
|
||||||
|
|
||||||
// bind multi-rows with only one invoke.
|
// bind multi-rows with only one invoke.
|
||||||
TAOS_MULTI_BIND* b = calloc(1, sizeof(TAOS_MULTI_BIND));
|
TAOS_MULTI_BIND *b = calloc(1, sizeof(TAOS_MULTI_BIND));
|
||||||
|
|
||||||
b->num = numOfRows;
|
b->num = numOfRows;
|
||||||
b->buffer_type = dataType; // todo check data type
|
b->buffer_type = dataType; // todo check data type
|
||||||
b->buffer_length = IS_VAR_DATA_TYPE(dataType)? dataBytes:tDataTypes[dataType].bytes;
|
b->buffer_length = IS_VAR_DATA_TYPE(dataType) ? dataBytes : tDataTypes[dataType].bytes;
|
||||||
b->is_null = nullArray;
|
b->is_null = nullArray;
|
||||||
b->buffer = colBuf;
|
b->buffer = colBuf;
|
||||||
b->length = (int32_t*)lengthArray;
|
b->length = (int32_t *)lengthArray;
|
||||||
|
|
||||||
// set the length and is_null array
|
// set the length and is_null array
|
||||||
if (!IS_VAR_DATA_TYPE(dataType)) {
|
if (!IS_VAR_DATA_TYPE(dataType)) {
|
||||||
|
@ -829,14 +872,15 @@ JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_bindColDataImp(J
|
||||||
return JNI_SUCCESS;
|
return JNI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_executeBatchImp(JNIEnv *env, jobject jobj, jlong stmt, jlong con) {
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_executeBatchImp(JNIEnv *env, jobject jobj, jlong stmt,
|
||||||
|
jlong con) {
|
||||||
TAOS *tscon = (TAOS *)con;
|
TAOS *tscon = (TAOS *)con;
|
||||||
if (tscon == NULL) {
|
if (tscon == NULL) {
|
||||||
jniError("jobj:%p, connection already closed", jobj);
|
jniError("jobj:%p, connection already closed", jobj);
|
||||||
return JNI_CONNECTION_NULL;
|
return JNI_CONNECTION_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_STMT *pStmt = (TAOS_STMT*) stmt;
|
TAOS_STMT *pStmt = (TAOS_STMT *)stmt;
|
||||||
if (pStmt == NULL) {
|
if (pStmt == NULL) {
|
||||||
jniError("jobj:%p, conn:%p, invalid stmt", jobj, tscon);
|
jniError("jobj:%p, conn:%p, invalid stmt", jobj, tscon);
|
||||||
return JNI_SQL_NULL;
|
return JNI_SQL_NULL;
|
||||||
|
@ -853,14 +897,15 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_executeBatchImp(J
|
||||||
return JNI_SUCCESS;
|
return JNI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_closeStmt(JNIEnv *env, jobject jobj, jlong stmt, jlong con) {
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_closeStmt(JNIEnv *env, jobject jobj, jlong stmt,
|
||||||
|
jlong con) {
|
||||||
TAOS *tscon = (TAOS *)con;
|
TAOS *tscon = (TAOS *)con;
|
||||||
if (tscon == NULL) {
|
if (tscon == NULL) {
|
||||||
jniError("jobj:%p, connection already closed", jobj);
|
jniError("jobj:%p, connection already closed", jobj);
|
||||||
return JNI_CONNECTION_NULL;
|
return JNI_CONNECTION_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_STMT *pStmt = (TAOS_STMT*) stmt;
|
TAOS_STMT *pStmt = (TAOS_STMT *)stmt;
|
||||||
if (pStmt == NULL) {
|
if (pStmt == NULL) {
|
||||||
jniError("jobj:%p, conn:%p, invalid stmt", jobj, tscon);
|
jniError("jobj:%p, conn:%p, invalid stmt", jobj, tscon);
|
||||||
return JNI_SQL_NULL;
|
return JNI_SQL_NULL;
|
||||||
|
@ -876,15 +921,16 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_closeStmt(JNIEnv
|
||||||
return JNI_SUCCESS;
|
return JNI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setTableNameTagsImp(JNIEnv *env, jobject jobj,
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setTableNameTagsImp(
|
||||||
jlong stmt, jstring tableName, jint numOfTags, jbyteArray tags, jbyteArray typeList, jbyteArray lengthList, jbyteArray nullList, jlong conn) {
|
JNIEnv *env, jobject jobj, jlong stmt, jstring tableName, jint numOfTags, jbyteArray tags, jbyteArray typeList,
|
||||||
|
jbyteArray lengthList, jbyteArray nullList, jlong conn) {
|
||||||
TAOS *tsconn = (TAOS *)conn;
|
TAOS *tsconn = (TAOS *)conn;
|
||||||
if (tsconn == NULL) {
|
if (tsconn == NULL) {
|
||||||
jniError("jobj:%p, connection already closed", jobj);
|
jniError("jobj:%p, connection already closed", jobj);
|
||||||
return JNI_CONNECTION_NULL;
|
return JNI_CONNECTION_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_STMT* pStmt = (TAOS_STMT*) stmt;
|
TAOS_STMT *pStmt = (TAOS_STMT *)stmt;
|
||||||
if (pStmt == NULL) {
|
if (pStmt == NULL) {
|
||||||
jniError("jobj:%p, conn:%p, invalid stmt handle", jobj, tsconn);
|
jniError("jobj:%p, conn:%p, invalid stmt handle", jobj, tsconn);
|
||||||
return JNI_SQL_NULL;
|
return JNI_SQL_NULL;
|
||||||
|
@ -898,39 +944,39 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setTableNameTagsI
|
||||||
}
|
}
|
||||||
|
|
||||||
len = (*env)->GetArrayLength(env, lengthList);
|
len = (*env)->GetArrayLength(env, lengthList);
|
||||||
int64_t *lengthArray = (int64_t*) calloc(1, len);
|
int64_t *lengthArray = (int64_t *)calloc(1, len);
|
||||||
(*env)->GetByteArrayRegion(env, lengthList, 0, len, (jbyte*) lengthArray);
|
(*env)->GetByteArrayRegion(env, lengthList, 0, len, (jbyte *)lengthArray);
|
||||||
if ((*env)->ExceptionCheck(env)) {
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
len = (*env)->GetArrayLength(env, typeList);
|
len = (*env)->GetArrayLength(env, typeList);
|
||||||
char *typeArray = (char*) calloc(1, len);
|
char *typeArray = (char *)calloc(1, len);
|
||||||
(*env)->GetByteArrayRegion(env, typeList, 0, len, (jbyte*) typeArray);
|
(*env)->GetByteArrayRegion(env, typeList, 0, len, (jbyte *)typeArray);
|
||||||
if ((*env)->ExceptionCheck(env)) {
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
len = (*env)->GetArrayLength(env, nullList);
|
len = (*env)->GetArrayLength(env, nullList);
|
||||||
int32_t *nullArray = (int32_t*) calloc(1, len);
|
int32_t *nullArray = (int32_t *)calloc(1, len);
|
||||||
(*env)->GetByteArrayRegion(env, nullList, 0, len, (jbyte*) nullArray);
|
(*env)->GetByteArrayRegion(env, nullList, 0, len, (jbyte *)nullArray);
|
||||||
if ((*env)->ExceptionCheck(env)) {
|
if ((*env)->ExceptionCheck(env)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *name = (*env)->GetStringUTFChars(env, tableName, NULL);
|
const char *name = (*env)->GetStringUTFChars(env, tableName, NULL);
|
||||||
char* curTags = tagsData;
|
char * curTags = tagsData;
|
||||||
|
|
||||||
TAOS_BIND *tagsBind = calloc(numOfTags, sizeof(TAOS_BIND));
|
TAOS_BIND *tagsBind = calloc(numOfTags, sizeof(TAOS_BIND));
|
||||||
for(int32_t i = 0; i < numOfTags; ++i) {
|
for (int32_t i = 0; i < numOfTags; ++i) {
|
||||||
tagsBind[i].buffer_type = typeArray[i];
|
tagsBind[i].buffer_type = typeArray[i];
|
||||||
tagsBind[i].buffer = curTags;
|
tagsBind[i].buffer = curTags;
|
||||||
tagsBind[i].is_null = &nullArray[i];
|
tagsBind[i].is_null = &nullArray[i];
|
||||||
tagsBind[i].length = (uintptr_t*) &lengthArray[i];
|
tagsBind[i].length = (uintptr_t *)&lengthArray[i];
|
||||||
|
|
||||||
curTags += lengthArray[i];
|
curTags += lengthArray[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = taos_stmt_set_tbname_tags((void*)stmt, name, tagsBind);
|
int32_t code = taos_stmt_set_tbname_tags((void *)stmt, name, tagsBind);
|
||||||
|
|
||||||
int32_t nTags = (int32_t) numOfTags;
|
int32_t nTags = (int32_t)numOfTags;
|
||||||
jniDebug("jobj:%p, conn:%p, set table name:%s, numOfTags:%d", jobj, tsconn, name, nTags);
|
jniDebug("jobj:%p, conn:%p, set table name:%s, numOfTags:%d", jobj, tsconn, name, nTags);
|
||||||
|
|
||||||
tfree(tagsData);
|
tfree(tagsData);
|
||||||
|
@ -948,28 +994,28 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setTableNameTagsI
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_insertLinesImp(JNIEnv *env, jobject jobj,
|
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_insertLinesImp(JNIEnv *env, jobject jobj,
|
||||||
jobjectArray lines, jlong conn) {
|
jobjectArray lines, jlong conn) {
|
||||||
TAOS *taos = (TAOS *)conn;
|
TAOS *taos = (TAOS *)conn;
|
||||||
if (taos == NULL) {
|
if (taos == NULL) {
|
||||||
jniError("jobj:%p, connection already closed", jobj);
|
jniError("jobj:%p, connection already closed", jobj);
|
||||||
return JNI_CONNECTION_NULL;
|
return JNI_CONNECTION_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int numLines = (*env)->GetArrayLength(env, lines);
|
int numLines = (*env)->GetArrayLength(env, lines);
|
||||||
char** c_lines = calloc(numLines, sizeof(char*));
|
char **c_lines = calloc(numLines, sizeof(char *));
|
||||||
if (c_lines == NULL) {
|
if (c_lines == NULL) {
|
||||||
jniError("c_lines:%p, alloc memory failed", c_lines);
|
jniError("c_lines:%p, alloc memory failed", c_lines);
|
||||||
return JNI_OUT_OF_MEMORY;
|
return JNI_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < numLines; ++i) {
|
for (int i = 0; i < numLines; ++i) {
|
||||||
jstring line = (jstring) ((*env)->GetObjectArrayElement(env, lines, i));
|
jstring line = (jstring)((*env)->GetObjectArrayElement(env, lines, i));
|
||||||
c_lines[i] = (char*)(*env)->GetStringUTFChars(env, line, 0);
|
c_lines[i] = (char *)(*env)->GetStringUTFChars(env, line, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int code = taos_insert_lines(taos, c_lines, numLines);
|
int code = taos_insert_lines(taos, c_lines, numLines);
|
||||||
|
|
||||||
for (int i = 0; i < numLines; ++i) {
|
for (int i = 0; i < numLines; ++i) {
|
||||||
jstring line = (jstring) ((*env)->GetObjectArrayElement(env, lines, i));
|
jstring line = (jstring)((*env)->GetObjectArrayElement(env, lines, i));
|
||||||
(*env)->ReleaseStringUTFChars(env, line, c_lines[i]);
|
(*env)->ReleaseStringUTFChars(env, line, c_lines[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ import java.util.List;
|
||||||
import com.taosdata.jdbc.utils.NullType;
|
import com.taosdata.jdbc.utils.NullType;
|
||||||
|
|
||||||
public class TSDBResultSetBlockData {
|
public class TSDBResultSetBlockData {
|
||||||
|
private static final int BINARY_LENGTH_OFFSET = 2;
|
||||||
private int numOfRows = 0;
|
private int numOfRows = 0;
|
||||||
private int rowIndex = 0;
|
private int rowIndex = 0;
|
||||||
|
|
||||||
|
@ -404,10 +405,8 @@ public class TSDBResultSetBlockData {
|
||||||
|
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_BINARY: {
|
case TSDBConstants.TSDB_DATA_TYPE_BINARY: {
|
||||||
ByteBuffer bb = (ByteBuffer) this.colData.get(col);
|
ByteBuffer bb = (ByteBuffer) this.colData.get(col);
|
||||||
bb.position(fieldSize * this.rowIndex);
|
bb.position((fieldSize + BINARY_LENGTH_OFFSET) * this.rowIndex);
|
||||||
|
|
||||||
int length = bb.getShort();
|
int length = bb.getShort();
|
||||||
|
|
||||||
byte[] dest = new byte[length];
|
byte[] dest = new byte[length];
|
||||||
bb.get(dest, 0, length);
|
bb.get(dest, 0, length);
|
||||||
if (NullType.isBinaryNull(dest, length)) {
|
if (NullType.isBinaryNull(dest, length)) {
|
||||||
|
@ -419,16 +418,13 @@ public class TSDBResultSetBlockData {
|
||||||
|
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_NCHAR: {
|
case TSDBConstants.TSDB_DATA_TYPE_NCHAR: {
|
||||||
ByteBuffer bb = (ByteBuffer) this.colData.get(col);
|
ByteBuffer bb = (ByteBuffer) this.colData.get(col);
|
||||||
bb.position(fieldSize * this.rowIndex);
|
bb.position((fieldSize + BINARY_LENGTH_OFFSET) * this.rowIndex);
|
||||||
|
|
||||||
int length = bb.getShort();
|
int length = bb.getShort();
|
||||||
|
|
||||||
byte[] dest = new byte[length];
|
byte[] dest = new byte[length];
|
||||||
bb.get(dest, 0, length);
|
bb.get(dest, 0, length);
|
||||||
if (NullType.isNcharNull(dest, length)) {
|
if (NullType.isNcharNull(dest, length)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String charset = TaosGlobalConfig.getCharset();
|
String charset = TaosGlobalConfig.getCharset();
|
||||||
return new String(dest, charset);
|
return new String(dest, charset);
|
||||||
|
|
Loading…
Reference in New Issue