update java connector
This commit is contained in:
parent
051af216a5
commit
592f210983
|
@ -135,7 +135,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_closeConnectionIm
|
||||||
* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JI)J
|
* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JI)J
|
||||||
*/
|
*/
|
||||||
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_subscribeImp
|
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_subscribeImp
|
||||||
(JNIEnv *, jobject, jstring, jstring, jstring, jstring, jstring, jlong, jint);
|
(JNIEnv *, jobject, jlong, jboolean, jstring, jstring, jint);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class: com_taosdata_jdbc_TSDBJNIConnector
|
* Class: com_taosdata_jdbc_TSDBJNIConnector
|
||||||
|
@ -143,7 +143,7 @@ JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_subscribeImp
|
||||||
* Signature: (J)Lcom/taosdata/jdbc/TSDBResultSetRowData;
|
* Signature: (J)Lcom/taosdata/jdbc/TSDBResultSetRowData;
|
||||||
*/
|
*/
|
||||||
JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_consumeImp
|
JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_consumeImp
|
||||||
(JNIEnv *, jobject, jlong);
|
(JNIEnv *, jobject, jlong, jint);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class: com_taosdata_jdbc_TSDBJNIConnector
|
* Class: com_taosdata_jdbc_TSDBJNIConnector
|
||||||
|
@ -151,7 +151,7 @@ JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_consumeImp
|
||||||
* Signature: (J)V
|
* Signature: (J)V
|
||||||
*/
|
*/
|
||||||
JNIEXPORT void JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_unsubscribeImp
|
JNIEXPORT void JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_unsubscribeImp
|
||||||
(JNIEnv *, jobject, jlong);
|
(JNIEnv *, jobject, jlong, jboolean);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class: com_taosdata_jdbc_TSDBJNIConnector
|
* Class: com_taosdata_jdbc_TSDBJNIConnector
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "tscJoinProcess.h"
|
#include "tscJoinProcess.h"
|
||||||
#include "tsclient.h"
|
#include "tsclient.h"
|
||||||
#include "tscUtil.h"
|
#include "tscUtil.h"
|
||||||
|
#include "ttime.h"
|
||||||
|
|
||||||
int __init = 0;
|
int __init = 0;
|
||||||
|
|
||||||
|
@ -514,92 +515,42 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_closeConnectionIm
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_subscribeImp(JNIEnv *env, jobject jobj, jstring jhost,
|
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_subscribeImp(JNIEnv *env, jobject jobj, jlong con,
|
||||||
jstring juser, jstring jpass, jstring jdb,
|
jboolean restart, jstring jtopic, jstring jsql, jint jinterval) {
|
||||||
jstring jtable, jlong jtime,
|
jlong sub = 0;
|
||||||
jint jperiod) {
|
TAOS *taos = (TAOS *)con;
|
||||||
TAOS_SUB *tsub;
|
char *topic = NULL;
|
||||||
jlong sub = 0;
|
char *sql = NULL;
|
||||||
char * host = NULL;
|
|
||||||
char * user = NULL;
|
|
||||||
char * pass = NULL;
|
|
||||||
char * db = NULL;
|
|
||||||
char * table = NULL;
|
|
||||||
int64_t time = 0;
|
|
||||||
int period = 0;
|
|
||||||
|
|
||||||
jniGetGlobalMethod(env);
|
jniGetGlobalMethod(env);
|
||||||
jniTrace("jobj:%p, in TSDBJNIConnector_subscribeImp", jobj);
|
jniTrace("jobj:%p, in TSDBJNIConnector_subscribeImp", jobj);
|
||||||
|
|
||||||
if (jhost != NULL) {
|
if (jtopic != NULL) {
|
||||||
host = (char *)(*env)->GetStringUTFChars(env, jhost, NULL);
|
topic = (char *)(*env)->GetStringUTFChars(env, jtopic, NULL);
|
||||||
}
|
}
|
||||||
if (juser != NULL) {
|
if (jsql != NULL) {
|
||||||
user = (char *)(*env)->GetStringUTFChars(env, juser, NULL);
|
sql = (char *)(*env)->GetStringUTFChars(env, jsql, NULL);
|
||||||
}
|
|
||||||
if (jpass != NULL) {
|
|
||||||
pass = (char *)(*env)->GetStringUTFChars(env, jpass, NULL);
|
|
||||||
}
|
|
||||||
if (jdb != NULL) {
|
|
||||||
db = (char *)(*env)->GetStringUTFChars(env, jdb, NULL);
|
|
||||||
}
|
|
||||||
if (jtable != NULL) {
|
|
||||||
table = (char *)(*env)->GetStringUTFChars(env, jtable, NULL);
|
|
||||||
}
|
|
||||||
time = (int64_t)jtime;
|
|
||||||
period = (int)jperiod;
|
|
||||||
|
|
||||||
if (user == NULL) {
|
|
||||||
jniTrace("jobj:%p, user is null, use tsDefaultUser", jobj);
|
|
||||||
user = tsDefaultUser;
|
|
||||||
}
|
|
||||||
if (pass == NULL) {
|
|
||||||
jniTrace("jobj:%p, pass is null, use tsDefaultPass", jobj);
|
|
||||||
pass = tsDefaultPass;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
jniTrace("jobj:%p, host:%s, user:%s, pass:%s, db:%s, table:%s, time:%d, period:%d", jobj, host, user, pass, db, table,
|
TAOS_SUB *tsub = taos_subscribe(taos, (int)restart, topic, sql, NULL, NULL, jinterval);
|
||||||
time, period);
|
|
||||||
tsub = taos_subscribe(host, user, pass, db, table, time, period);
|
|
||||||
sub = (jlong)tsub;
|
sub = (jlong)tsub;
|
||||||
|
|
||||||
if (sub == 0) {
|
if (sub == 0) {
|
||||||
jniTrace("jobj:%p, failed to subscribe to db:%s, table:%s", jobj, db, table);
|
jniTrace("jobj:%p, failed to subscribe: topic:%s", jobj, jtopic);
|
||||||
} else {
|
} else {
|
||||||
jniTrace("jobj:%p, successfully subscribe to db:%s, table:%s, sub:%ld, tsub:%p", jobj, db, table, sub, tsub);
|
jniTrace("jobj:%p, successfully subscribe: topic: %s", jobj, jtopic);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (host != NULL) (*env)->ReleaseStringUTFChars(env, jhost, host);
|
if (topic != NULL) (*env)->ReleaseStringUTFChars(env, jtopic, topic);
|
||||||
if (user != NULL && user != tsDefaultUser) (*env)->ReleaseStringUTFChars(env, juser, user);
|
if (sql != NULL) (*env)->ReleaseStringUTFChars(env, jsql, sql);
|
||||||
if (pass != NULL && pass != tsDefaultPass) (*env)->ReleaseStringUTFChars(env, jpass, pass);
|
|
||||||
if (db != NULL) (*env)->ReleaseStringUTFChars(env, jdb, db);
|
|
||||||
if (table != NULL) (*env)->ReleaseStringUTFChars(env, jtable, table);
|
|
||||||
|
|
||||||
return sub;
|
return sub;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_consumeImp(JNIEnv *env, jobject jobj, jlong sub) {
|
static jobject convert_one_row(JNIEnv *env, TAOS_ROW row, TAOS_FIELD* fields, int num_fields) {
|
||||||
jniTrace("jobj:%p, in TSDBJNIConnector_consumeImp, sub:%ld", jobj, sub);
|
|
||||||
|
|
||||||
TAOS_SUB * tsub = (TAOS_SUB *)sub;
|
|
||||||
TAOS_ROW row = taos_consume(tsub);
|
|
||||||
TAOS_FIELD *fields = taos_fetch_subfields(tsub);
|
|
||||||
int num_fields = taos_subfields_count(tsub);
|
|
||||||
|
|
||||||
jniGetGlobalMethod(env);
|
|
||||||
|
|
||||||
jniTrace("jobj:%p, check fields:%p, num_fields=%d", jobj, fields, num_fields);
|
|
||||||
|
|
||||||
jobject rowobj = (*env)->NewObject(env, g_rowdataClass, g_rowdataConstructor, num_fields);
|
jobject rowobj = (*env)->NewObject(env, g_rowdataClass, g_rowdataConstructor, num_fields);
|
||||||
jniTrace("created a rowdata object, rowobj:%p", rowobj);
|
jniTrace("created a rowdata object, rowobj:%p", rowobj);
|
||||||
|
|
||||||
if (row == NULL) {
|
|
||||||
jniTrace("jobj:%p, tsub:%p, fields size is %d, fetch row to the end", jobj, tsub, num_fields);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char tmp[TSDB_MAX_BYTES_PER_ROW] = {0};
|
|
||||||
|
|
||||||
for (int i = 0; i < num_fields; i++) {
|
for (int i = 0; i < num_fields; i++) {
|
||||||
if (row[i] == NULL) {
|
if (row[i] == NULL) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -634,6 +585,7 @@ JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_consumeImp(JNI
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_BINARY: {
|
case TSDB_DATA_TYPE_BINARY: {
|
||||||
|
char tmp[TSDB_MAX_BYTES_PER_ROW] = {0};
|
||||||
strncpy(tmp, row[i], (size_t) fields[i].bytes); // handle the case that terminated does not exist
|
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));
|
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetStringFp, i, (*env)->NewStringUTF(env, tmp));
|
||||||
|
|
||||||
|
@ -642,7 +594,7 @@ JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_consumeImp(JNI
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetByteArrayFp, i,
|
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetByteArrayFp, i,
|
||||||
jniFromNCharToByteArray(env, (char*)row[i], fields[i].bytes));
|
jniFromNCharToByteArray(env, (char*)row[i], fields[i].bytes));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetTimestampFp, i, (jlong) * ((int64_t *)row[i]));
|
(*env)->CallVoidMethod(env, rowobj, g_rowdataSetTimestampFp, i, (jlong) * ((int64_t *)row[i]));
|
||||||
|
@ -651,13 +603,56 @@ JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_consumeImp(JNI
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
jniTrace("jobj:%p, rowdata retrieved, rowobj:%p", jobj, rowobj);
|
|
||||||
return rowobj;
|
return rowobj;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_unsubscribeImp(JNIEnv *env, jobject jobj, jlong sub) {
|
JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_consumeImp(JNIEnv *env, jobject jobj, jlong sub, jint timeout) {
|
||||||
|
jniTrace("jobj:%p, in TSDBJNIConnector_consumeImp, sub:%ld", jobj, sub);
|
||||||
|
jniGetGlobalMethod(env);
|
||||||
|
|
||||||
TAOS_SUB *tsub = (TAOS_SUB *)sub;
|
TAOS_SUB *tsub = (TAOS_SUB *)sub;
|
||||||
taos_unsubscribe(tsub);
|
jobject rows = (*env)->NewObject(env, g_arrayListClass, g_arrayListConstructFp);
|
||||||
|
|
||||||
|
int64_t start = taosGetTimestampMs();
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
TAOS_RES * res = taos_consume(tsub);
|
||||||
|
if (res == NULL) {
|
||||||
|
jniError("jobj:%p, tsub:%p, taos_consume returns NULL", jobj, tsub);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
TAOS_FIELD *fields = taos_fetch_fields(res);
|
||||||
|
int num_fields = taos_num_fields(res);
|
||||||
|
while (true) {
|
||||||
|
TAOS_ROW row = taos_fetch_row(res);
|
||||||
|
if (row == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
jobject rowobj = convert_one_row(env, row, fields, num_fields);
|
||||||
|
(*env)->CallBooleanMethod(env, rows, g_arrayListAddFp, rowobj);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count > 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (timeout == -1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (((int)(taosGetTimestampMs() - start)) >= timeout) {
|
||||||
|
jniTrace("jobj:%p, sub:%ld, timeout", jobj, sub);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_unsubscribeImp(JNIEnv *env, jobject jobj, jlong sub, jboolean keepProgress) {
|
||||||
|
TAOS_SUB *tsub = (TAOS_SUB *)sub;
|
||||||
|
taos_unsubscribe(tsub, keepProgress);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_validateCreateTableSqlImp(JNIEnv *env, jobject jobj,
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_validateCreateTableSqlImp(JNIEnv *env, jobject jobj,
|
||||||
|
|
|
@ -35,6 +35,7 @@ typedef struct SSubscriptionProgress {
|
||||||
typedef struct SSub {
|
typedef struct SSub {
|
||||||
char topic[32];
|
char topic[32];
|
||||||
int64_t lastSyncTime;
|
int64_t lastSyncTime;
|
||||||
|
int64_t lastConsumeTime;
|
||||||
void * signature;
|
void * signature;
|
||||||
TAOS * taos;
|
TAOS * taos;
|
||||||
void * pTimer;
|
void * pTimer;
|
||||||
|
@ -128,6 +129,7 @@ static SSub* tscCreateSubscription(STscObj* pObj, const char* topic, const char*
|
||||||
pSub->pSql = pSql;
|
pSub->pSql = pSql;
|
||||||
pSub->signature = pSub;
|
pSub->signature = pSub;
|
||||||
strncpy(pSub->topic, topic, sizeof(pSub->topic));
|
strncpy(pSub->topic, topic, sizeof(pSub->topic));
|
||||||
|
pSub->topic[sizeof(pSub->topic) - 1] = 0;
|
||||||
return pSub;
|
return pSub;
|
||||||
|
|
||||||
failed:
|
failed:
|
||||||
|
@ -294,7 +296,7 @@ void tscSaveSubscriptionProgress(void* sub) {
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_SUB *taos_subscribe(const char* topic, int restart, TAOS *taos, const char *sql, TAOS_SUBSCRIBE_CALLBACK fp, void *param, int interval) {
|
TAOS_SUB *taos_subscribe(TAOS *taos, int restart, const char* topic, const char *sql, TAOS_SUBSCRIBE_CALLBACK fp, void *param, int interval) {
|
||||||
STscObj* pObj = (STscObj*)taos;
|
STscObj* pObj = (STscObj*)taos;
|
||||||
if (pObj == NULL || pObj->signature != pObj) {
|
if (pObj == NULL || pObj->signature != pObj) {
|
||||||
globalCode = TSDB_CODE_DISCONNECTED;
|
globalCode = TSDB_CODE_DISCONNECTED;
|
||||||
|
@ -319,11 +321,11 @@ TAOS_SUB *taos_subscribe(const char* topic, int restart, TAOS *taos, const char
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pSub->interval = interval;
|
||||||
if (fp != NULL) {
|
if (fp != NULL) {
|
||||||
pSub->fp = fp;
|
pSub->fp = fp;
|
||||||
pSub->interval = interval;
|
|
||||||
pSub->param = param;
|
pSub->param = param;
|
||||||
taosTmrReset(tscProcessSubscriptionTimer, 0, pSub, tscTmr, &pSub->pTimer);
|
taosTmrReset(tscProcessSubscriptionTimer, interval, pSub, tscTmr, &pSub->pTimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pSub;
|
return pSub;
|
||||||
|
@ -338,7 +340,14 @@ TAOS_RES *taos_consume(TAOS_SUB *tsub) {
|
||||||
SSqlObj* pSql = pSub->pSql;
|
SSqlObj* pSql = pSub->pSql;
|
||||||
SSqlRes *pRes = &pSql->res;
|
SSqlRes *pRes = &pSql->res;
|
||||||
|
|
||||||
if (taosGetTimestampMs() - pSub->lastSyncTime > 10 * 1000) {
|
if (pSub->pTimer == NULL) {
|
||||||
|
int duration = (int)(taosGetTimestampMs() - pSub->lastConsumeTime);
|
||||||
|
if (duration < pSub->interval) {
|
||||||
|
taosMsleep(pSub->interval - (int32_t)duration);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (taosGetTimestampMs() - pSub->lastSyncTime > 10 * 60 * 1000) {
|
||||||
char* sqlstr = pSql->sqlstr;
|
char* sqlstr = pSql->sqlstr;
|
||||||
pSql->sqlstr = NULL;
|
pSql->sqlstr = NULL;
|
||||||
taos_free_result_imp(pSql, 0);
|
taos_free_result_imp(pSql, 0);
|
||||||
|
@ -356,11 +365,14 @@ TAOS_RES *taos_consume(TAOS_SUB *tsub) {
|
||||||
pSql->cmd.type = type;
|
pSql->cmd.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
tscDoQuery(pSql);
|
tscDoQuery(pSql);
|
||||||
if (pRes->code != TSDB_CODE_SUCCESS) {
|
if (pRes->code != TSDB_CODE_SUCCESS) {
|
||||||
tscRemoveFromSqlList(pSql);
|
tscRemoveFromSqlList(pSql);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pSub->lastConsumeTime = taosGetTimestampMs();
|
||||||
return pSql;
|
return pSql;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ DLL_EXPORT void taos_fetch_rows_a(TAOS_RES *res, void (*fp)(void *param, TAOS_RE
|
||||||
DLL_EXPORT void taos_fetch_row_a(TAOS_RES *res, void (*fp)(void *param, TAOS_RES *, TAOS_ROW row), void *param);
|
DLL_EXPORT void taos_fetch_row_a(TAOS_RES *res, void (*fp)(void *param, TAOS_RES *, TAOS_ROW row), void *param);
|
||||||
|
|
||||||
typedef void (*TAOS_SUBSCRIBE_CALLBACK)(TAOS_SUB* tsub, TAOS_RES *res, void* param, int code);
|
typedef void (*TAOS_SUBSCRIBE_CALLBACK)(TAOS_SUB* tsub, TAOS_RES *res, void* param, int code);
|
||||||
DLL_EXPORT TAOS_SUB *taos_subscribe(const char* topic, int restart, TAOS *taos, const char *sql, TAOS_SUBSCRIBE_CALLBACK fp, void *param, int interval);
|
DLL_EXPORT TAOS_SUB *taos_subscribe(TAOS* taos, int restart, const char* topic, const char *sql, TAOS_SUBSCRIBE_CALLBACK fp, void *param, int interval);
|
||||||
DLL_EXPORT TAOS_RES *taos_consume(TAOS_SUB *tsub);
|
DLL_EXPORT TAOS_RES *taos_consume(TAOS_SUB *tsub);
|
||||||
DLL_EXPORT void taos_unsubscribe(TAOS_SUB *tsub, int keepProgress);
|
DLL_EXPORT void taos_unsubscribe(TAOS_SUB *tsub, int keepProgress);
|
||||||
|
|
||||||
|
|
|
@ -75,9 +75,9 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (async) {
|
if (async) {
|
||||||
tsub = taos_subscribe(topic, restart, taos, sql, subscribe_callback, NULL, 1000);
|
tsub = taos_subscribe(taos, restart, topic, sql, subscribe_callback, NULL, 1000);
|
||||||
} else {
|
} else {
|
||||||
tsub = taos_subscribe(topic, restart, taos, sql, NULL, NULL, 0);
|
tsub = taos_subscribe(taos, restart, topic, sql, NULL, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsub == NULL) {
|
if (tsub == NULL) {
|
||||||
|
|
Loading…
Reference in New Issue