diff --git a/source/client/jni/com_taosdata_jdbc_TSDBJNIConnector.h b/source/client/jni/com_taosdata_jdbc_TSDBJNIConnector.h index 3b728a31429aea1c695268a1dcb21ad67f79771c..a88bf0f7a6bfd74bc92a82e57a44c5fc2957f6a8 100644 --- a/source/client/jni/com_taosdata_jdbc_TSDBJNIConnector.h +++ b/source/client/jni/com_taosdata_jdbc_TSDBJNIConnector.h @@ -260,6 +260,14 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_insertLinesImp(JN JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_schemalessInsertImp(JNIEnv *, jobject, jobjectArray, jlong, jint, jint); +/** + * Class: com_taosdata_jdbc_TSDBJNIConnector + * Method: getTableVgID + * Signature: (Ljava/lang/String;Ljava/lang/String)Lcom/taosdata/jdbc/VGroupIDResp + */ +JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getTableVgID(JNIEnv *, jobject, jlong, jstring, + jstring, jobject); + #ifdef __cplusplus } #endif diff --git a/source/client/src/clientJniConnector.c b/source/client/src/clientJniConnector.c index 34fc480432f5dac71f80b6316718fe22397eb125..859d4ec80ff6e954259415dabaf1761eb3e7129e 100644 --- a/source/client/src/clientJniConnector.c +++ b/source/client/src/clientJniConnector.c @@ -488,7 +488,8 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn numOfFields); return JNI_FETCH_END; } else { - jniDebug("jobj:%p, conn:%p, interrupted query. fetch row error code: %d, msg:%s", jobj, tscon, code, taos_errstr(result)); + jniDebug("jobj:%p, conn:%p, interrupted query. fetch row error code: %d, msg:%s", jobj, tscon, code, + taos_errstr(result)); return JNI_RESULT_SET_NULL; } } @@ -583,7 +584,8 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchBlockImp(JNI jniDebug("jobj:%p, conn:%p, resultset:%p, no data to retrieve", jobj, tscon, (void *)res); return JNI_FETCH_END; } else { - jniError("jobj:%p, conn:%p, query interrupted. fetch block error code:%d, msg:%s", jobj, tscon, error_code, taos_errstr(tres)); + jniError("jobj:%p, conn:%p, query interrupted. fetch block error code:%d, msg:%s", jobj, tscon, error_code, + taos_errstr(tres)); return JNI_RESULT_SET_NULL; } } @@ -1028,3 +1030,62 @@ JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_schemalessInsert } return (jlong)tres; } + +// TABLE_VG_ID_FID_CACHE cache resp object for getTableVgID +typedef struct TABLE_VG_ID_FIELD_CACHE { + int cached; + jclass clazz; + jfieldID codeField; + jfieldID vgIDField; +} TABLE_VG_ID_FIELD_CACHE; + +TABLE_VG_ID_FIELD_CACHE tableVgIdFieldCache; + +void cacheTableVgIDField(JNIEnv *env, jobject jobj) { + if (tableVgIdFieldCache.cached) { + return; + } + + tableVgIdFieldCache.clazz = (*env)->GetObjectClass(env, jobj); + tableVgIdFieldCache.codeField = (*env)->GetFieldID(env, tableVgIdFieldCache.clazz, "code", "I"); + tableVgIdFieldCache.vgIDField = (*env)->GetFieldID(env, tableVgIdFieldCache.clazz, "vgID", "I"); + tableVgIdFieldCache.cached = 1; +} + +JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getTableVgID(JNIEnv *env, jobject jobj, jlong conn, + jstring jdb, jstring jtable, + jobject resp) { + if (!tableVgIdFieldCache.cached) { + cacheTableVgIDField(env, resp); + } + + TAOS *taos = (TAOS *)conn; + if (taos == NULL) { + jniError("jobj:%p, connection already closed", jobj); + (*env)->SetIntField(env, resp, tableVgIdFieldCache.codeField, JNI_CONNECTION_NULL); + return resp; + } + + const char *db = NULL; + const char *table = NULL; + int vgID = 0; + + if (jdb != NULL) { + db = (*env)->GetStringUTFChars(env, jdb, NULL); + } + if (jtable != NULL) { + table = (*env)->GetStringUTFChars(env, jtable, NULL); + } + + int code = taos_get_table_vgId(taos, db, table, &vgID); + if (db != NULL) { + (*env)->ReleaseStringUTFChars(env, jdb, db); + } + if (table != NULL) { + (*env)->ReleaseStringUTFChars(env, jtable, table); + } + + (*env)->SetIntField(env, resp, tableVgIdFieldCache.codeField, code); + (*env)->SetIntField(env, resp, tableVgIdFieldCache.vgIDField, vgID); + return resp; +}