Merge branch 'develop' into test1
This commit is contained in:
commit
8f46f81f71
|
@ -619,7 +619,11 @@ static int32_t tscRebuildDDLForNormalTable(SSqlObj *pSql, const char *tableName,
|
||||||
for (int32_t i = 0; i < numOfRows; ++i) {
|
for (int32_t i = 0; i < numOfRows; ++i) {
|
||||||
uint8_t type = pSchema[i].type;
|
uint8_t type = pSchema[i].type;
|
||||||
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result), "%s %s(%d),", pSchema[i].name,tDataTypeDesc[pSchema[i].type].aName,pSchema->bytes);
|
int32_t bytes = pSchema[i].bytes - VARSTR_HEADER_SIZE;
|
||||||
|
if (type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
bytes = bytes/TSDB_NCHAR_SIZE;
|
||||||
|
}
|
||||||
|
snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result), "%s %s(%d),", pSchema[i].name, tDataTypeDesc[pSchema[i].type].aName, bytes);
|
||||||
} else {
|
} else {
|
||||||
snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result), "%s %s,", pSchema[i].name, tDataTypeDesc[pSchema[i].type].aName);
|
snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result), "%s %s,", pSchema[i].name, tDataTypeDesc[pSchema[i].type].aName);
|
||||||
}
|
}
|
||||||
|
@ -642,7 +646,11 @@ static int32_t tscRebuildDDLForSuperTable(SSqlObj *pSql, const char *tableName,
|
||||||
for (int32_t i = 0; i < numOfRows; ++i) {
|
for (int32_t i = 0; i < numOfRows; ++i) {
|
||||||
uint8_t type = pSchema[i].type;
|
uint8_t type = pSchema[i].type;
|
||||||
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result),"%s %s(%d),", pSchema[i].name,tDataTypeDesc[pSchema[i].type].aName,pSchema->bytes);
|
int32_t bytes = pSchema[i].bytes - VARSTR_HEADER_SIZE;
|
||||||
|
if (type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
bytes = bytes/TSDB_NCHAR_SIZE;
|
||||||
|
}
|
||||||
|
snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result),"%s %s(%d),", pSchema[i].name,tDataTypeDesc[pSchema[i].type].aName, bytes);
|
||||||
} else {
|
} else {
|
||||||
snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result), "%s %s,", pSchema[i].name, tDataTypeDesc[type].aName);
|
snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result), "%s %s,", pSchema[i].name, tDataTypeDesc[type].aName);
|
||||||
}
|
}
|
||||||
|
@ -652,7 +660,11 @@ static int32_t tscRebuildDDLForSuperTable(SSqlObj *pSql, const char *tableName,
|
||||||
for (int32_t i = numOfRows; i < totalRows; i++) {
|
for (int32_t i = numOfRows; i < totalRows; i++) {
|
||||||
uint8_t type = pSchema[i].type;
|
uint8_t type = pSchema[i].type;
|
||||||
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result), "%s %s(%d),", pSchema[i].name,tDataTypeDesc[pSchema[i].type].aName,pSchema->bytes);
|
int32_t bytes = pSchema[i].bytes - VARSTR_HEADER_SIZE;
|
||||||
|
if (type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
bytes = bytes/TSDB_NCHAR_SIZE;
|
||||||
|
}
|
||||||
|
snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result), "%s %s(%d),", pSchema[i].name,tDataTypeDesc[pSchema[i].type].aName, bytes);
|
||||||
} else {
|
} else {
|
||||||
snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result), "%s %s,", pSchema[i].name, tDataTypeDesc[type].aName);
|
snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result), "%s %s,", pSchema[i].name, tDataTypeDesc[type].aName);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1148,6 +1148,10 @@ int tsParseInsertSql(SSqlObj *pSql) {
|
||||||
|
|
||||||
index = 0;
|
index = 0;
|
||||||
sToken = tStrGetToken(str, &index, false, 0, NULL);
|
sToken = tStrGetToken(str, &index, false, 0, NULL);
|
||||||
|
if (sToken.type != TK_STRING && sToken.type != TK_ID) {
|
||||||
|
code = tscInvalidSQLErrMsg(pCmd->payload, "file path is required following keyword FILE", sToken.z);
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
str += index;
|
str += index;
|
||||||
if (sToken.n == 0) {
|
if (sToken.n == 0) {
|
||||||
code = tscInvalidSQLErrMsg(pCmd->payload, "file path is required following keyword FILE", sToken.z);
|
code = tscInvalidSQLErrMsg(pCmd->payload, "file path is required following keyword FILE", sToken.z);
|
||||||
|
|
|
@ -197,7 +197,8 @@ public class TSDBConnection implements Connection {
|
||||||
|
|
||||||
public SQLWarning getWarnings() throws SQLException {
|
public SQLWarning getWarnings() throws SQLException {
|
||||||
//todo: implement getWarnings according to the warning messages returned from TDengine
|
//todo: implement getWarnings according to the warning messages returned from TDengine
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
|
return null;
|
||||||
|
// throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clearWarnings() throws SQLException {
|
public void clearWarnings() throws SQLException {
|
||||||
|
|
|
@ -40,19 +40,22 @@ typedef struct {
|
||||||
enum _show_db_index {
|
enum _show_db_index {
|
||||||
TSDB_SHOW_DB_NAME_INDEX,
|
TSDB_SHOW_DB_NAME_INDEX,
|
||||||
TSDB_SHOW_DB_CREATED_TIME_INDEX,
|
TSDB_SHOW_DB_CREATED_TIME_INDEX,
|
||||||
TSDB_SHOW_DB_VGROUPS_INDEX,
|
|
||||||
TSDB_SHOW_DB_NTABLES_INDEX,
|
TSDB_SHOW_DB_NTABLES_INDEX,
|
||||||
|
TSDB_SHOW_DB_VGROUPS_INDEX,
|
||||||
TSDB_SHOW_DB_REPLICA_INDEX,
|
TSDB_SHOW_DB_REPLICA_INDEX,
|
||||||
|
TSDB_SHOW_DB_QUORUM_INDEX,
|
||||||
TSDB_SHOW_DB_DAYS_INDEX,
|
TSDB_SHOW_DB_DAYS_INDEX,
|
||||||
TSDB_SHOW_DB_KEEP_INDEX,
|
TSDB_SHOW_DB_KEEP_INDEX,
|
||||||
TSDB_SHOW_DB_TABLES_INDEX,
|
|
||||||
TSDB_SHOW_DB_ROWS_INDEX,
|
|
||||||
TSDB_SHOW_DB_CACHE_INDEX,
|
TSDB_SHOW_DB_CACHE_INDEX,
|
||||||
TSDB_SHOW_DB_ABLOCKS_INDEX,
|
TSDB_SHOW_DB_BLOCKS_INDEX,
|
||||||
TSDB_SHOW_DB_TBLOCKS_INDEX,
|
TSDB_SHOW_DB_MINROWS_INDEX,
|
||||||
TSDB_SHOW_DB_CTIME_INDEX,
|
TSDB_SHOW_DB_MAXROWS_INDEX,
|
||||||
TSDB_SHOW_DB_CLOG_INDEX,
|
TSDB_SHOW_DB_WALLEVEL_INDEX,
|
||||||
|
TSDB_SHOW_DB_FSYNC_INDEX,
|
||||||
TSDB_SHOW_DB_COMP_INDEX,
|
TSDB_SHOW_DB_COMP_INDEX,
|
||||||
|
TSDB_SHOW_DB_PRECISION_INDEX,
|
||||||
|
TSDB_SHOW_DB_UPDATE_INDEX,
|
||||||
|
TSDB_SHOW_DB_STATUS_INDEX,
|
||||||
TSDB_MAX_SHOW_DB
|
TSDB_MAX_SHOW_DB
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -90,17 +93,23 @@ extern char version[];
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char name[TSDB_DB_NAME_LEN + 1];
|
char name[TSDB_DB_NAME_LEN + 1];
|
||||||
int32_t replica;
|
int32_t tables;
|
||||||
int32_t days;
|
int32_t vgroups;
|
||||||
int32_t keep;
|
int16_t replications;
|
||||||
int32_t tables;
|
int16_t quorum;
|
||||||
int32_t rows;
|
int16_t daysPerFile;
|
||||||
int32_t cache;
|
int16_t daysToKeep;
|
||||||
int32_t ablocks;
|
int16_t daysToKeep1;
|
||||||
int32_t tblocks;
|
int16_t daysToKeep2;
|
||||||
int32_t ctime;
|
int32_t cacheBlockSize; //MB
|
||||||
int32_t clog;
|
int32_t totalBlocks;
|
||||||
int32_t comp;
|
int32_t minRowsPerFileBlock;
|
||||||
|
int32_t maxRowsPerFileBlock;
|
||||||
|
int8_t walLevel;
|
||||||
|
int32_t fsyncPeriod;
|
||||||
|
int8_t compression;
|
||||||
|
int8_t precision; // time resolution
|
||||||
|
int8_t update;
|
||||||
} SDbInfo;
|
} SDbInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -173,6 +182,7 @@ static struct argp_option options[] = {
|
||||||
{"start-time", 'S', "START_TIME", 0, "Start time to dump.", 3},
|
{"start-time", 'S', "START_TIME", 0, "Start time to dump.", 3},
|
||||||
{"end-time", 'E', "END_TIME", 0, "End time to dump.", 3},
|
{"end-time", 'E', "END_TIME", 0, "End time to dump.", 3},
|
||||||
{"data-batch", 'N', "DATA_BATCH", 0, "Number of data point per insert statement. Default is 1.", 3},
|
{"data-batch", 'N', "DATA_BATCH", 0, "Number of data point per insert statement. Default is 1.", 3},
|
||||||
|
{"max-sql-len", 'L', "SQL_LEN", 0, "Max length of one sql. Default is 65480.", 3},
|
||||||
{"table-batch", 't', "TABLE_BATCH", 0, "Number of table dumpout into one output file. Default is 1.", 3},
|
{"table-batch", 't', "TABLE_BATCH", 0, "Number of table dumpout into one output file. Default is 1.", 3},
|
||||||
{"thread_num", 'T', "THREAD_NUM", 0, "Number of thread for dump in file. Default is 5.", 3},
|
{"thread_num", 'T', "THREAD_NUM", 0, "Number of thread for dump in file. Default is 5.", 3},
|
||||||
{"allow-sys", 'a', 0, 0, "Allow to dump sys database", 3},
|
{"allow-sys", 'a', 0, 0, "Allow to dump sys database", 3},
|
||||||
|
@ -200,6 +210,7 @@ struct arguments {
|
||||||
int64_t start_time;
|
int64_t start_time;
|
||||||
int64_t end_time;
|
int64_t end_time;
|
||||||
int32_t data_batch;
|
int32_t data_batch;
|
||||||
|
int32_t max_sql_len;
|
||||||
int32_t table_batch; // num of table which will be dump into one output file.
|
int32_t table_batch; // num of table which will be dump into one output file.
|
||||||
bool allow_sys;
|
bool allow_sys;
|
||||||
// other options
|
// other options
|
||||||
|
@ -298,6 +309,17 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
|
||||||
case 'N':
|
case 'N':
|
||||||
arguments->data_batch = atoi(arg);
|
arguments->data_batch = atoi(arg);
|
||||||
break;
|
break;
|
||||||
|
case 'L':
|
||||||
|
{
|
||||||
|
int32_t len = atoi(arg);
|
||||||
|
if (len > TSDB_MAX_ALLOWED_SQL_LEN) {
|
||||||
|
len = TSDB_MAX_ALLOWED_SQL_LEN;
|
||||||
|
} else if (len < TSDB_MAX_SQL_LEN) {
|
||||||
|
len = TSDB_MAX_SQL_LEN;
|
||||||
|
}
|
||||||
|
arguments->max_sql_len = len;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 't':
|
case 't':
|
||||||
arguments->table_batch = atoi(arg);
|
arguments->table_batch = atoi(arg);
|
||||||
break;
|
break;
|
||||||
|
@ -360,6 +382,7 @@ struct arguments tsArguments = {
|
||||||
0,
|
0,
|
||||||
INT64_MAX,
|
INT64_MAX,
|
||||||
1,
|
1,
|
||||||
|
TSDB_MAX_SQL_LEN,
|
||||||
1,
|
1,
|
||||||
false,
|
false,
|
||||||
// other options
|
// other options
|
||||||
|
@ -415,7 +438,9 @@ int main(int argc, char *argv[]) {
|
||||||
printf("start_time: %" PRId64 "\n", tsArguments.start_time);
|
printf("start_time: %" PRId64 "\n", tsArguments.start_time);
|
||||||
printf("end_time: %" PRId64 "\n", tsArguments.end_time);
|
printf("end_time: %" PRId64 "\n", tsArguments.end_time);
|
||||||
printf("data_batch: %d\n", tsArguments.data_batch);
|
printf("data_batch: %d\n", tsArguments.data_batch);
|
||||||
|
printf("max_sql_len: %d\n", tsArguments.max_sql_len);
|
||||||
printf("table_batch: %d\n", tsArguments.table_batch);
|
printf("table_batch: %d\n", tsArguments.table_batch);
|
||||||
|
printf("thread_num: %d\n", tsArguments.thread_num);
|
||||||
printf("allow_sys: %d\n", tsArguments.allow_sys);
|
printf("allow_sys: %d\n", tsArguments.allow_sys);
|
||||||
printf("abort: %d\n", tsArguments.abort);
|
printf("abort: %d\n", tsArguments.abort);
|
||||||
printf("isDumpIn: %d\n", tsArguments.isDumpIn);
|
printf("isDumpIn: %d\n", tsArguments.isDumpIn);
|
||||||
|
@ -682,8 +707,8 @@ int taosDumpOut(struct arguments *arguments) {
|
||||||
TAOS_FIELD *fields = taos_fetch_fields(result);
|
TAOS_FIELD *fields = taos_fetch_fields(result);
|
||||||
|
|
||||||
while ((row = taos_fetch_row(result)) != NULL) {
|
while ((row = taos_fetch_row(result)) != NULL) {
|
||||||
// sys database name : 'monitor', but subsequent version changed to 'log'
|
// sys database name : 'log', but subsequent version changed to 'log'
|
||||||
if (strncasecmp(row[TSDB_SHOW_DB_NAME_INDEX], "monitor", fields[TSDB_SHOW_DB_NAME_INDEX].bytes) == 0 &&
|
if (strncasecmp(row[TSDB_SHOW_DB_NAME_INDEX], "log", fields[TSDB_SHOW_DB_NAME_INDEX].bytes) == 0 &&
|
||||||
(!arguments->allow_sys))
|
(!arguments->allow_sys))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -711,20 +736,27 @@ int taosDumpOut(struct arguments *arguments) {
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(dbInfos[count]->name, (char *)row[TSDB_SHOW_DB_NAME_INDEX], fields[TSDB_SHOW_DB_NAME_INDEX].bytes);
|
strncpy(dbInfos[count]->name, (char *)row[TSDB_SHOW_DB_NAME_INDEX], fields[TSDB_SHOW_DB_NAME_INDEX].bytes);
|
||||||
#if 0
|
#if 0
|
||||||
dbInfos[count]->replica = (int)(*((int16_t *)row[TSDB_SHOW_DB_REPLICA_INDEX]));
|
if (arguments->with_property) {
|
||||||
dbInfos[count]->days = (int)(*((int16_t *)row[TSDB_SHOW_DB_DAYS_INDEX]));
|
dbInfos[count]->tables = *((int32_t *)row[TSDB_SHOW_DB_NTABLES_INDEX]);
|
||||||
dbInfos[count]->keep = *((int *)row[TSDB_SHOW_DB_KEEP_INDEX]);
|
dbInfos[count]->vgroups = *((int32_t *)row[TSDB_SHOW_DB_VGROUPS_INDEX]);
|
||||||
dbInfos[count]->tables = *((int *)row[TSDB_SHOW_DB_TABLES_INDEX]);
|
dbInfos[count]->replications = *((int16_t *)row[TSDB_SHOW_DB_REPLICA_INDEX]);
|
||||||
dbInfos[count]->rows = *((int *)row[TSDB_SHOW_DB_ROWS_INDEX]);
|
dbInfos[count]->quorum = *((int16_t *)row[TSDB_SHOW_DB_QUORUM_INDEX]);
|
||||||
dbInfos[count]->cache = *((int *)row[TSDB_SHOW_DB_CACHE_INDEX]);
|
dbInfos[count]->daysPerFile = *((int16_t *)row[TSDB_SHOW_DB_DAYS_INDEX]);
|
||||||
dbInfos[count]->ablocks = *((int *)row[TSDB_SHOW_DB_ABLOCKS_INDEX]);
|
dbInfos[count]->daysToKeep = *((int16_t *)row[TSDB_SHOW_DB_KEEP_INDEX]);
|
||||||
dbInfos[count]->tblocks = (int)(*((int16_t *)row[TSDB_SHOW_DB_TBLOCKS_INDEX]));
|
dbInfos[count]->daysToKeep1;
|
||||||
dbInfos[count]->ctime = *((int *)row[TSDB_SHOW_DB_CTIME_INDEX]);
|
dbInfos[count]->daysToKeep2;
|
||||||
dbInfos[count]->clog = (int)(*((int8_t *)row[TSDB_SHOW_DB_CLOG_INDEX]));
|
dbInfos[count]->cacheBlockSize = *((int32_t *)row[TSDB_SHOW_DB_CACHE_INDEX]);
|
||||||
dbInfos[count]->comp = (int)(*((int8_t *)row[TSDB_SHOW_DB_COMP_INDEX]));
|
dbInfos[count]->totalBlocks = *((int32_t *)row[TSDB_SHOW_DB_BLOCKS_INDEX]);
|
||||||
|
dbInfos[count]->minRowsPerFileBlock = *((int32_t *)row[TSDB_SHOW_DB_MINROWS_INDEX]);
|
||||||
|
dbInfos[count]->maxRowsPerFileBlock = *((int32_t *)row[TSDB_SHOW_DB_MAXROWS_INDEX]);
|
||||||
|
dbInfos[count]->walLevel = *((int8_t *)row[TSDB_SHOW_DB_WALLEVEL_INDEX]);
|
||||||
|
dbInfos[count]->fsyncPeriod = *((int32_t *)row[TSDB_SHOW_DB_FSYNC_INDEX]);
|
||||||
|
dbInfos[count]->compression = (int8_t)(*((int8_t *)row[TSDB_SHOW_DB_COMP_INDEX]));
|
||||||
|
dbInfos[count]->precision = *((int8_t *)row[TSDB_SHOW_DB_PRECISION_INDEX]);
|
||||||
|
dbInfos[count]->update = *((int8_t *)row[TSDB_SHOW_DB_UPDATE_INDEX]);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
|
|
||||||
if (arguments->databases) {
|
if (arguments->databases) {
|
||||||
|
@ -1037,10 +1069,13 @@ void taosDumpCreateDbClause(SDbInfo *dbInfo, bool isDumpProperty, FILE *fp) {
|
||||||
|
|
||||||
pstr += sprintf(pstr, "CREATE DATABASE IF NOT EXISTS %s", dbInfo->name);
|
pstr += sprintf(pstr, "CREATE DATABASE IF NOT EXISTS %s", dbInfo->name);
|
||||||
if (isDumpProperty) {
|
if (isDumpProperty) {
|
||||||
|
#if 0
|
||||||
pstr += sprintf(pstr,
|
pstr += sprintf(pstr,
|
||||||
" REPLICA %d DAYS %d KEEP %d TABLES %d ROWS %d CACHE %d ABLOCKS %d TBLOCKS %d CTIME %d CLOG %d COMP %d",
|
"TABLES %d vgroups %d REPLICA %d quorum %d DAYS %d KEEP %d CACHE %d BLOCKS %d MINROWS %d MAXROWS %d WALLEVEL %d FYNC %d COMP %d PRECISION %s UPDATE %d",
|
||||||
dbInfo->replica, dbInfo->days, dbInfo->keep, dbInfo->tables, dbInfo->rows, dbInfo->cache,
|
dbInfo->tables, dbInfo->vgroups, dbInfo->replications, dbInfo->quorum, dbInfo->daysPerFile, dbInfo->daysToKeep, dbInfo->cacheBlockSize,
|
||||||
dbInfo->ablocks, dbInfo->tblocks, dbInfo->ctime, dbInfo->clog, dbInfo->comp);
|
dbInfo->totalBlocks, dbInfo->minRowsPerFileBlock, dbInfo->maxRowsPerFileBlock, dbInfo->walLevel, dbInfo->fsyncPeriod, dbInfo->compression,
|
||||||
|
dbInfo->precision, dbInfo->update);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
pstr += sprintf(pstr, ";");
|
pstr += sprintf(pstr, ";");
|
||||||
|
@ -1459,7 +1494,8 @@ int taosDumpTableData(FILE *fp, char *tbname, struct arguments *arguments, TAOS*
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* tmpBuffer = (char *)calloc(1, COMMAND_SIZE);
|
int32_t sql_buf_len = arguments->max_sql_len;
|
||||||
|
char* tmpBuffer = (char *)calloc(1, sql_buf_len + 128);
|
||||||
if (tmpBuffer == NULL) {
|
if (tmpBuffer == NULL) {
|
||||||
fprintf(stderr, "failed to allocate memory\n");
|
fprintf(stderr, "failed to allocate memory\n");
|
||||||
free(tmpCommand);
|
free(tmpCommand);
|
||||||
|
@ -1502,85 +1538,83 @@ int taosDumpTableData(FILE *fp, char *tbname, struct arguments *arguments, TAOS*
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char sqlStr[8] = "\0";
|
|
||||||
if (arguments->mysqlFlag) {
|
|
||||||
sprintf(sqlStr, "INSERT");
|
|
||||||
} else {
|
|
||||||
sprintf(sqlStr, "IMPORT");
|
|
||||||
}
|
|
||||||
|
|
||||||
int rowFlag = 0;
|
int rowFlag = 0;
|
||||||
|
int32_t curr_sqlstr_len = 0;
|
||||||
|
int32_t total_sqlstr_len = 0;
|
||||||
count = 0;
|
count = 0;
|
||||||
while ((row = taos_fetch_row(tmpResult)) != NULL) {
|
while ((row = taos_fetch_row(tmpResult)) != NULL) {
|
||||||
pstr = tmpBuffer;
|
pstr = tmpBuffer;
|
||||||
|
curr_sqlstr_len = 0;
|
||||||
|
|
||||||
int32_t* length = taos_fetch_lengths(tmpResult); // act len
|
int32_t* length = taos_fetch_lengths(tmpResult); // act len
|
||||||
|
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
pstr += sprintf(pstr, "%s INTO %s VALUES (", sqlStr, tbname);
|
total_sqlstr_len = 0;
|
||||||
} else {
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, "INSERT INTO %s VALUES (", tbname);
|
||||||
|
} else {
|
||||||
if (arguments->mysqlFlag) {
|
if (arguments->mysqlFlag) {
|
||||||
if (0 == rowFlag) {
|
if (0 == rowFlag) {
|
||||||
pstr += sprintf(pstr, "(");
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, "(");
|
||||||
rowFlag++;
|
rowFlag++;
|
||||||
} else {
|
} else {
|
||||||
pstr += sprintf(pstr, ", (");
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, ", (");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pstr += sprintf(pstr, "(");
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, "(");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int col = 0; col < numFields; col++) {
|
for (int col = 0; col < numFields; col++) {
|
||||||
if (col != 0) pstr += sprintf(pstr, ", ");
|
if (col != 0) curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, ", ");
|
||||||
|
|
||||||
if (row[col] == NULL) {
|
if (row[col] == NULL) {
|
||||||
pstr += sprintf(pstr, "NULL");
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, "NULL");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (fields[col].type) {
|
switch (fields[col].type) {
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
pstr += sprintf(pstr, "%d", ((((int32_t)(*((char *)row[col]))) == 1) ? 1 : 0));
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, "%d", ((((int32_t)(*((char *)row[col]))) == 1) ? 1 : 0));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
pstr += sprintf(pstr, "%d", *((int8_t *)row[col]));
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, "%d", *((int8_t *)row[col]));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
pstr += sprintf(pstr, "%d", *((int16_t *)row[col]));
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, "%d", *((int16_t *)row[col]));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_INT:
|
case TSDB_DATA_TYPE_INT:
|
||||||
pstr += sprintf(pstr, "%d", *((int32_t *)row[col]));
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, "%d", *((int32_t *)row[col]));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
pstr += sprintf(pstr, "%" PRId64 "", *((int64_t *)row[col]));
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, "%" PRId64 "", *((int64_t *)row[col]));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
pstr += sprintf(pstr, "%f", GET_FLOAT_VAL(row[col]));
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, "%f", GET_FLOAT_VAL(row[col]));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
pstr += sprintf(pstr, "%f", GET_DOUBLE_VAL(row[col]));
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, "%f", GET_DOUBLE_VAL(row[col]));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_BINARY:
|
case TSDB_DATA_TYPE_BINARY:
|
||||||
*(pstr++) = '\'';
|
//*(pstr++) = '\'';
|
||||||
converStringToReadable((char *)row[col], length[col], tbuf, COMMAND_SIZE);
|
converStringToReadable((char *)row[col], length[col], tbuf, COMMAND_SIZE);
|
||||||
pstr = stpcpy(pstr, tbuf);
|
//pstr = stpcpy(pstr, tbuf);
|
||||||
*(pstr++) = '\'';
|
//*(pstr++) = '\'';
|
||||||
|
pstr += sprintf(pstr + curr_sqlstr_len, "\'%s\'", tbuf);
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
convertNCharToReadable((char *)row[col], length[col], tbuf, COMMAND_SIZE);
|
convertNCharToReadable((char *)row[col], length[col], tbuf, COMMAND_SIZE);
|
||||||
pstr += sprintf(pstr, "\'%s\'", tbuf);
|
pstr += sprintf(pstr + curr_sqlstr_len, "\'%s\'", tbuf);
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
if (!arguments->mysqlFlag) {
|
if (!arguments->mysqlFlag) {
|
||||||
pstr += sprintf(pstr, "%" PRId64 "", *(int64_t *)row[col]);
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, "%" PRId64 "", *(int64_t *)row[col]);
|
||||||
} else {
|
} else {
|
||||||
char buf[64] = "\0";
|
char buf[64] = "\0";
|
||||||
int64_t ts = *((int64_t *)row[col]);
|
int64_t ts = *((int64_t *)row[col]);
|
||||||
time_t tt = (time_t)(ts / 1000);
|
time_t tt = (time_t)(ts / 1000);
|
||||||
struct tm *ptm = localtime(&tt);
|
struct tm *ptm = localtime(&tt);
|
||||||
strftime(buf, 64, "%y-%m-%d %H:%M:%S", ptm);
|
strftime(buf, 64, "%y-%m-%d %H:%M:%S", ptm);
|
||||||
pstr += sprintf(pstr, "\'%s.%03d\'", buf, (int)(ts % 1000));
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, "\'%s.%03d\'", buf, (int)(ts % 1000));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1588,13 +1622,15 @@ int taosDumpTableData(FILE *fp, char *tbname, struct arguments *arguments, TAOS*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pstr += sprintf(pstr, ") ");
|
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, ") ");
|
||||||
|
|
||||||
totalRows++;
|
totalRows++;
|
||||||
count++;
|
count++;
|
||||||
fprintf(fp, "%s", tmpBuffer);
|
fprintf(fp, "%s", tmpBuffer);
|
||||||
|
|
||||||
if (count >= arguments->data_batch) {
|
total_sqlstr_len += curr_sqlstr_len;
|
||||||
|
|
||||||
|
if ((count >= arguments->data_batch) || (sql_buf_len - total_sqlstr_len < TSDB_MAX_BYTES_PER_ROW)) {
|
||||||
fprintf(fp, ";\n");
|
fprintf(fp, ";\n");
|
||||||
count = 0;
|
count = 0;
|
||||||
} //else {
|
} //else {
|
||||||
|
|
|
@ -43,6 +43,8 @@ typedef struct SHistogramInfo {
|
||||||
int32_t numOfElems;
|
int32_t numOfElems;
|
||||||
int32_t numOfEntries;
|
int32_t numOfEntries;
|
||||||
int32_t maxEntries;
|
int32_t maxEntries;
|
||||||
|
double min;
|
||||||
|
double max;
|
||||||
|
|
||||||
double min;
|
double min;
|
||||||
double max;
|
double max;
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
README.md
|
||||||
|
target/
|
||||||
|
!.mvn/wrapper/maven-wrapper.jar
|
||||||
|
!**/src/main/**/target/
|
||||||
|
!**/src/test/**/target/
|
||||||
|
|
||||||
|
### STS ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
build/
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
118
tests/examples/JDBC/mybatisplus-demo/.mvn/wrapper/MavenWrapperDownloader.java
vendored
Normal file
118
tests/examples/JDBC/mybatisplus-demo/.mvn/wrapper/MavenWrapperDownloader.java
vendored
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2007-present the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.net.*;
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.channels.*;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
public class MavenWrapperDownloader {
|
||||||
|
|
||||||
|
private static final String WRAPPER_VERSION = "0.5.6";
|
||||||
|
/**
|
||||||
|
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
|
||||||
|
*/
|
||||||
|
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
|
||||||
|
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
|
||||||
|
* use instead of the default one.
|
||||||
|
*/
|
||||||
|
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
|
||||||
|
".mvn/wrapper/maven-wrapper.properties";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path where the maven-wrapper.jar will be saved to.
|
||||||
|
*/
|
||||||
|
private static final String MAVEN_WRAPPER_JAR_PATH =
|
||||||
|
".mvn/wrapper/maven-wrapper.jar";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the property which should be used to override the default download url for the wrapper.
|
||||||
|
*/
|
||||||
|
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
|
||||||
|
|
||||||
|
public static void main(String args[]) {
|
||||||
|
System.out.println("- Downloader started");
|
||||||
|
File baseDirectory = new File(args[0]);
|
||||||
|
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
|
||||||
|
|
||||||
|
// If the maven-wrapper.properties exists, read it and check if it contains a custom
|
||||||
|
// wrapperUrl parameter.
|
||||||
|
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
|
||||||
|
String url = DEFAULT_DOWNLOAD_URL;
|
||||||
|
if (mavenWrapperPropertyFile.exists()) {
|
||||||
|
FileInputStream mavenWrapperPropertyFileInputStream = null;
|
||||||
|
try {
|
||||||
|
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
|
||||||
|
Properties mavenWrapperProperties = new Properties();
|
||||||
|
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
|
||||||
|
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (mavenWrapperPropertyFileInputStream != null) {
|
||||||
|
mavenWrapperPropertyFileInputStream.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
// Ignore ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.println("- Downloading from: " + url);
|
||||||
|
|
||||||
|
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
|
||||||
|
if (!outputFile.getParentFile().exists()) {
|
||||||
|
if (!outputFile.getParentFile().mkdirs()) {
|
||||||
|
System.out.println(
|
||||||
|
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
|
||||||
|
try {
|
||||||
|
downloadFileFromURL(url, outputFile);
|
||||||
|
System.out.println("Done");
|
||||||
|
System.exit(0);
|
||||||
|
} catch (Throwable e) {
|
||||||
|
System.out.println("- Error downloading");
|
||||||
|
e.printStackTrace();
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
|
||||||
|
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
|
||||||
|
String username = System.getenv("MVNW_USERNAME");
|
||||||
|
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
|
||||||
|
Authenticator.setDefault(new Authenticator() {
|
||||||
|
@Override
|
||||||
|
protected PasswordAuthentication getPasswordAuthentication() {
|
||||||
|
return new PasswordAuthentication(username, password);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
URL website = new URL(urlString);
|
||||||
|
ReadableByteChannel rbc;
|
||||||
|
rbc = Channels.newChannel(website.openStream());
|
||||||
|
FileOutputStream fos = new FileOutputStream(destination);
|
||||||
|
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
|
||||||
|
fos.close();
|
||||||
|
rbc.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Binary file not shown.
|
@ -0,0 +1,2 @@
|
||||||
|
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
|
||||||
|
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
|
|
@ -0,0 +1,322 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
# or more contributor license agreements. See the NOTICE file
|
||||||
|
# distributed with this work for additional information
|
||||||
|
# regarding copyright ownership. The ASF licenses this file
|
||||||
|
# to you under the Apache License, Version 2.0 (the
|
||||||
|
# "License"); you may not use this file except in compliance
|
||||||
|
# with the License. You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing,
|
||||||
|
# software distributed under the License is distributed on an
|
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
# KIND, either express or implied. See the License for the
|
||||||
|
# specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Maven Start Up Batch script
|
||||||
|
#
|
||||||
|
# Required ENV vars:
|
||||||
|
# ------------------
|
||||||
|
# JAVA_HOME - location of a JDK home dir
|
||||||
|
#
|
||||||
|
# Optional ENV vars
|
||||||
|
# -----------------
|
||||||
|
# M2_HOME - location of maven2's installed home dir
|
||||||
|
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||||
|
# e.g. to debug Maven itself, use
|
||||||
|
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||||
|
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if [ -z "$MAVEN_SKIP_RC" ]; then
|
||||||
|
|
||||||
|
if [ -f /etc/mavenrc ]; then
|
||||||
|
. /etc/mavenrc
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$HOME/.mavenrc" ]; then
|
||||||
|
. "$HOME/.mavenrc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
# OS specific support. $var _must_ be set to either true or false.
|
||||||
|
cygwin=false
|
||||||
|
darwin=false
|
||||||
|
mingw=false
|
||||||
|
case "$(uname)" in
|
||||||
|
CYGWIN*) cygwin=true ;;
|
||||||
|
MINGW*) mingw=true ;;
|
||||||
|
Darwin*)
|
||||||
|
darwin=true
|
||||||
|
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
|
||||||
|
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
|
||||||
|
if [ -z "$JAVA_HOME" ]; then
|
||||||
|
if [ -x "/usr/libexec/java_home" ]; then
|
||||||
|
export JAVA_HOME="$(/usr/libexec/java_home)"
|
||||||
|
else
|
||||||
|
export JAVA_HOME="/Library/Java/Home"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ]; then
|
||||||
|
if [ -r /etc/gentoo-release ]; then
|
||||||
|
JAVA_HOME=$(java-config --jre-home)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$M2_HOME" ]; then
|
||||||
|
## resolve links - $0 may be a link to maven's home
|
||||||
|
PRG="$0"
|
||||||
|
|
||||||
|
# need this for relative symlinks
|
||||||
|
while [ -h "$PRG" ]; do
|
||||||
|
ls=$(ls -ld "$PRG")
|
||||||
|
link=$(expr "$ls" : '.*-> \(.*\)$')
|
||||||
|
if expr "$link" : '/.*' >/dev/null; then
|
||||||
|
PRG="$link"
|
||||||
|
else
|
||||||
|
PRG="$(dirname "$PRG")/$link"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
saveddir=$(pwd)
|
||||||
|
|
||||||
|
M2_HOME=$(dirname "$PRG")/..
|
||||||
|
|
||||||
|
# make it fully qualified
|
||||||
|
M2_HOME=$(cd "$M2_HOME" && pwd)
|
||||||
|
|
||||||
|
cd "$saveddir"
|
||||||
|
# echo Using m2 at $M2_HOME
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Cygwin, ensure paths are in UNIX format before anything is touched
|
||||||
|
if $cygwin; then
|
||||||
|
[ -n "$M2_HOME" ] &&
|
||||||
|
M2_HOME=$(cygpath --unix "$M2_HOME")
|
||||||
|
[ -n "$JAVA_HOME" ] &&
|
||||||
|
JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
|
||||||
|
[ -n "$CLASSPATH" ] &&
|
||||||
|
CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Mingw, ensure paths are in UNIX format before anything is touched
|
||||||
|
if $mingw; then
|
||||||
|
[ -n "$M2_HOME" ] &&
|
||||||
|
M2_HOME="$( (
|
||||||
|
cd "$M2_HOME"
|
||||||
|
pwd
|
||||||
|
))"
|
||||||
|
[ -n "$JAVA_HOME" ] &&
|
||||||
|
JAVA_HOME="$( (
|
||||||
|
cd "$JAVA_HOME"
|
||||||
|
pwd
|
||||||
|
))"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ]; then
|
||||||
|
javaExecutable="$(which javac)"
|
||||||
|
if [ -n "$javaExecutable" ] && ! [ "$(expr \"$javaExecutable\" : '\([^ ]*\)')" = "no" ]; then
|
||||||
|
# readlink(1) is not available as standard on Solaris 10.
|
||||||
|
readLink=$(which readlink)
|
||||||
|
if [ ! $(expr "$readLink" : '\([^ ]*\)') = "no" ]; then
|
||||||
|
if $darwin; then
|
||||||
|
javaHome="$(dirname \"$javaExecutable\")"
|
||||||
|
javaExecutable="$(cd \"$javaHome\" && pwd -P)/javac"
|
||||||
|
else
|
||||||
|
javaExecutable="$(readlink -f \"$javaExecutable\")"
|
||||||
|
fi
|
||||||
|
javaHome="$(dirname \"$javaExecutable\")"
|
||||||
|
javaHome=$(expr "$javaHome" : '\(.*\)/bin')
|
||||||
|
JAVA_HOME="$javaHome"
|
||||||
|
export JAVA_HOME
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVACMD" ]; then
|
||||||
|
if [ -n "$JAVA_HOME" ]; then
|
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ]; then
|
||||||
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
|
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||||
|
else
|
||||||
|
JAVACMD="$JAVA_HOME/bin/java"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
JAVACMD="$(which java)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -x "$JAVACMD" ]; then
|
||||||
|
echo "Error: JAVA_HOME is not defined correctly." >&2
|
||||||
|
echo " We cannot execute $JAVACMD" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ]; then
|
||||||
|
echo "Warning: JAVA_HOME environment variable is not set."
|
||||||
|
fi
|
||||||
|
|
||||||
|
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
|
||||||
|
|
||||||
|
# traverses directory structure from process work directory to filesystem root
|
||||||
|
# first directory with .mvn subdirectory is considered project base directory
|
||||||
|
find_maven_basedir() {
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
echo "Path not specified to find_maven_basedir"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
basedir="$1"
|
||||||
|
wdir="$1"
|
||||||
|
while [ "$wdir" != '/' ]; do
|
||||||
|
if [ -d "$wdir"/.mvn ]; then
|
||||||
|
basedir=$wdir
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
|
||||||
|
if [ -d "${wdir}" ]; then
|
||||||
|
wdir=$(
|
||||||
|
cd "$wdir/.."
|
||||||
|
pwd
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
# end of workaround
|
||||||
|
done
|
||||||
|
echo "${basedir}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# concatenates all lines of a file
|
||||||
|
concat_lines() {
|
||||||
|
if [ -f "$1" ]; then
|
||||||
|
echo "$(tr -s '\n' ' ' <"$1")"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
BASE_DIR=$(find_maven_basedir "$(pwd)")
|
||||||
|
if [ -z "$BASE_DIR" ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
##########################################################################################
|
||||||
|
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||||
|
# This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||||
|
##########################################################################################
|
||||||
|
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
|
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then
|
||||||
|
echo "Found .mvn/wrapper/maven-wrapper.jar"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then
|
||||||
|
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
|
||||||
|
fi
|
||||||
|
if [ -n "$MVNW_REPOURL" ]; then
|
||||||
|
jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||||
|
else
|
||||||
|
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||||
|
fi
|
||||||
|
while IFS="=" read key value; do
|
||||||
|
case "$key" in wrapperUrl)
|
||||||
|
jarUrl="$value"
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done <"$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
|
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then
|
||||||
|
echo "Downloading from: $jarUrl"
|
||||||
|
fi
|
||||||
|
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
|
||||||
|
if $cygwin; then
|
||||||
|
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v wget >/dev/null; then
|
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then
|
||||||
|
echo "Found wget ... using wget"
|
||||||
|
fi
|
||||||
|
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||||
|
wget "$jarUrl" -O "$wrapperJarPath"
|
||||||
|
else
|
||||||
|
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
|
||||||
|
fi
|
||||||
|
elif command -v curl >/dev/null; then
|
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then
|
||||||
|
echo "Found curl ... using curl"
|
||||||
|
fi
|
||||||
|
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||||
|
curl -o "$wrapperJarPath" "$jarUrl" -f
|
||||||
|
else
|
||||||
|
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then
|
||||||
|
echo "Falling back to using Java to download"
|
||||||
|
fi
|
||||||
|
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
|
||||||
|
# For Cygwin, switch paths to Windows format before running javac
|
||||||
|
if $cygwin; then
|
||||||
|
javaClass=$(cygpath --path --windows "$javaClass")
|
||||||
|
fi
|
||||||
|
if [ -e "$javaClass" ]; then
|
||||||
|
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
|
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then
|
||||||
|
echo " - Compiling MavenWrapperDownloader.java ..."
|
||||||
|
fi
|
||||||
|
# Compiling the Java class
|
||||||
|
("$JAVA_HOME/bin/javac" "$javaClass")
|
||||||
|
fi
|
||||||
|
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
|
||||||
|
# Running the downloader
|
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then
|
||||||
|
echo " - Running MavenWrapperDownloader.java ..."
|
||||||
|
fi
|
||||||
|
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
##########################################################################################
|
||||||
|
# End of extension
|
||||||
|
##########################################################################################
|
||||||
|
|
||||||
|
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
|
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then
|
||||||
|
echo $MAVEN_PROJECTBASEDIR
|
||||||
|
fi
|
||||||
|
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
|
||||||
|
|
||||||
|
# For Cygwin, switch paths to Windows format before running java
|
||||||
|
if $cygwin; then
|
||||||
|
[ -n "$M2_HOME" ] &&
|
||||||
|
M2_HOME=$(cygpath --path --windows "$M2_HOME")
|
||||||
|
[ -n "$JAVA_HOME" ] &&
|
||||||
|
JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
|
||||||
|
[ -n "$CLASSPATH" ] &&
|
||||||
|
CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
|
||||||
|
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
|
||||||
|
MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Provide a "standardized" way to retrieve the CLI args that will
|
||||||
|
# work with both Windows and non-Windows executions.
|
||||||
|
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
|
||||||
|
export MAVEN_CMD_LINE_ARGS
|
||||||
|
|
||||||
|
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||||
|
|
||||||
|
exec "$JAVACMD" \
|
||||||
|
$MAVEN_OPTS \
|
||||||
|
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
|
||||||
|
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
|
||||||
|
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
|
|
@ -0,0 +1,182 @@
|
||||||
|
@REM ----------------------------------------------------------------------------
|
||||||
|
@REM Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
@REM or more contributor license agreements. See the NOTICE file
|
||||||
|
@REM distributed with this work for additional information
|
||||||
|
@REM regarding copyright ownership. The ASF licenses this file
|
||||||
|
@REM to you under the Apache License, Version 2.0 (the
|
||||||
|
@REM "License"); you may not use this file except in compliance
|
||||||
|
@REM with the License. You may obtain a copy of the License at
|
||||||
|
@REM
|
||||||
|
@REM https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
@REM
|
||||||
|
@REM Unless required by applicable law or agreed to in writing,
|
||||||
|
@REM software distributed under the License is distributed on an
|
||||||
|
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
@REM KIND, either express or implied. See the License for the
|
||||||
|
@REM specific language governing permissions and limitations
|
||||||
|
@REM under the License.
|
||||||
|
@REM ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@REM ----------------------------------------------------------------------------
|
||||||
|
@REM Maven Start Up Batch script
|
||||||
|
@REM
|
||||||
|
@REM Required ENV vars:
|
||||||
|
@REM JAVA_HOME - location of a JDK home dir
|
||||||
|
@REM
|
||||||
|
@REM Optional ENV vars
|
||||||
|
@REM M2_HOME - location of maven2's installed home dir
|
||||||
|
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
|
||||||
|
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
|
||||||
|
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||||
|
@REM e.g. to debug Maven itself, use
|
||||||
|
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||||
|
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||||
|
@REM ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
|
||||||
|
@echo off
|
||||||
|
@REM set title of command window
|
||||||
|
title %0
|
||||||
|
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
|
||||||
|
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
|
||||||
|
|
||||||
|
@REM set %HOME% to equivalent of $HOME
|
||||||
|
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
|
||||||
|
|
||||||
|
@REM Execute a user defined script before this one
|
||||||
|
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
|
||||||
|
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
|
||||||
|
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
|
||||||
|
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
|
||||||
|
:skipRcPre
|
||||||
|
|
||||||
|
@setlocal
|
||||||
|
|
||||||
|
set ERROR_CODE=0
|
||||||
|
|
||||||
|
@REM To isolate internal variables from possible post scripts, we use another setlocal
|
||||||
|
@setlocal
|
||||||
|
|
||||||
|
@REM ==== START VALIDATION ====
|
||||||
|
if not "%JAVA_HOME%" == "" goto OkJHome
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Error: JAVA_HOME not found in your environment. >&2
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||||
|
echo location of your Java installation. >&2
|
||||||
|
echo.
|
||||||
|
goto error
|
||||||
|
|
||||||
|
:OkJHome
|
||||||
|
if exist "%JAVA_HOME%\bin\java.exe" goto init
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Error: JAVA_HOME is set to an invalid directory. >&2
|
||||||
|
echo JAVA_HOME = "%JAVA_HOME%" >&2
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||||
|
echo location of your Java installation. >&2
|
||||||
|
echo.
|
||||||
|
goto error
|
||||||
|
|
||||||
|
@REM ==== END VALIDATION ====
|
||||||
|
|
||||||
|
:init
|
||||||
|
|
||||||
|
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
|
||||||
|
@REM Fallback to current working directory if not found.
|
||||||
|
|
||||||
|
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
|
||||||
|
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
|
||||||
|
|
||||||
|
set EXEC_DIR=%CD%
|
||||||
|
set WDIR=%EXEC_DIR%
|
||||||
|
:findBaseDir
|
||||||
|
IF EXIST "%WDIR%"\.mvn goto baseDirFound
|
||||||
|
cd ..
|
||||||
|
IF "%WDIR%"=="%CD%" goto baseDirNotFound
|
||||||
|
set WDIR=%CD%
|
||||||
|
goto findBaseDir
|
||||||
|
|
||||||
|
:baseDirFound
|
||||||
|
set MAVEN_PROJECTBASEDIR=%WDIR%
|
||||||
|
cd "%EXEC_DIR%"
|
||||||
|
goto endDetectBaseDir
|
||||||
|
|
||||||
|
:baseDirNotFound
|
||||||
|
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
|
||||||
|
cd "%EXEC_DIR%"
|
||||||
|
|
||||||
|
:endDetectBaseDir
|
||||||
|
|
||||||
|
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
|
||||||
|
|
||||||
|
@setlocal EnableExtensions EnableDelayedExpansion
|
||||||
|
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
|
||||||
|
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
|
||||||
|
|
||||||
|
:endReadAdditionalConfig
|
||||||
|
|
||||||
|
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
|
||||||
|
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
|
||||||
|
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||||
|
|
||||||
|
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||||
|
|
||||||
|
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||||
|
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
|
||||||
|
)
|
||||||
|
|
||||||
|
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||||
|
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||||
|
if exist %WRAPPER_JAR% (
|
||||||
|
if "%MVNW_VERBOSE%" == "true" (
|
||||||
|
echo Found %WRAPPER_JAR%
|
||||||
|
)
|
||||||
|
) else (
|
||||||
|
if not "%MVNW_REPOURL%" == "" (
|
||||||
|
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||||
|
)
|
||||||
|
if "%MVNW_VERBOSE%" == "true" (
|
||||||
|
echo Couldn't find %WRAPPER_JAR%, downloading it ...
|
||||||
|
echo Downloading from: %DOWNLOAD_URL%
|
||||||
|
)
|
||||||
|
|
||||||
|
powershell -Command "&{"^
|
||||||
|
"$webclient = new-object System.Net.WebClient;"^
|
||||||
|
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
|
||||||
|
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
|
||||||
|
"}"^
|
||||||
|
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
|
||||||
|
"}"
|
||||||
|
if "%MVNW_VERBOSE%" == "true" (
|
||||||
|
echo Finished downloading %WRAPPER_JAR%
|
||||||
|
)
|
||||||
|
)
|
||||||
|
@REM End of extension
|
||||||
|
|
||||||
|
@REM Provide a "standardized" way to retrieve the CLI args that will
|
||||||
|
@REM work with both Windows and non-Windows executions.
|
||||||
|
set MAVEN_CMD_LINE_ARGS=%*
|
||||||
|
|
||||||
|
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
|
||||||
|
if ERRORLEVEL 1 goto error
|
||||||
|
goto end
|
||||||
|
|
||||||
|
:error
|
||||||
|
set ERROR_CODE=1
|
||||||
|
|
||||||
|
:end
|
||||||
|
@endlocal & set ERROR_CODE=%ERROR_CODE%
|
||||||
|
|
||||||
|
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
|
||||||
|
@REM check for post script, once with legacy .bat ending and once with .cmd ending
|
||||||
|
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
|
||||||
|
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
|
||||||
|
:skipRcPost
|
||||||
|
|
||||||
|
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
|
||||||
|
if "%MAVEN_BATCH_PAUSE%" == "on" pause
|
||||||
|
|
||||||
|
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
|
||||||
|
|
||||||
|
exit /B %ERROR_CODE%
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>2.4.0</version>
|
||||||
|
<relativePath/> <!-- lookup parent from repository -->
|
||||||
|
</parent>
|
||||||
|
<groupId>com.taosdata.example</groupId>
|
||||||
|
<artifactId>mybatisplus-demo</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<name>mybatisplus-demo</name>
|
||||||
|
<description>Demo project for tdengine</description>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<java.version>1.8</java.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.baomidou</groupId>
|
||||||
|
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||||
|
<version>3.1.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.h2database</groupId>
|
||||||
|
<artifactId>h2</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.taosdata.jdbc</groupId>
|
||||||
|
<artifactId>taos-jdbcdriver</artifactId>
|
||||||
|
<version>2.0.11</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<version>5.1.47</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-devtools</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.12</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>2.17</version>
|
||||||
|
<configuration>
|
||||||
|
<includes>
|
||||||
|
<include>**/*Test.java</include>
|
||||||
|
</includes>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/Abstract*.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.taosdata.example.mybatisplusdemo;
|
||||||
|
|
||||||
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@MapperScan("com.taosdata.example.mybatisplusdemo.mapper")
|
||||||
|
public class MybatisplusDemoApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(MybatisplusDemoApplication.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.taosdata.example.mybatisplusdemo.config;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class MybatisPlusConfig {
|
||||||
|
|
||||||
|
|
||||||
|
/** mybatis 3.4.1 pagination config start ***/
|
||||||
|
// @Bean
|
||||||
|
// public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
||||||
|
// MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
||||||
|
// interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
|
||||||
|
// return interceptor;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// @Bean
|
||||||
|
// public ConfigurationCustomizer configurationCustomizer() {
|
||||||
|
// return configuration -> configuration.setUseDeprecatedExecutor(false);
|
||||||
|
// }
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public PaginationInterceptor paginationInterceptor() {
|
||||||
|
// return new PaginationInterceptor();
|
||||||
|
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
|
||||||
|
//TODO: mybatis-plus do not support TDengine, use postgresql Dialect
|
||||||
|
paginationInterceptor.setDialectType("postgresql");
|
||||||
|
|
||||||
|
return paginationInterceptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.taosdata.example.mybatisplusdemo.domain;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class Temperature {
|
||||||
|
|
||||||
|
private Timestamp ts;
|
||||||
|
private float temperature;
|
||||||
|
private String location;
|
||||||
|
private int tbIndex;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.taosdata.example.mybatisplusdemo.domain;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class Weather {
|
||||||
|
|
||||||
|
private Timestamp ts;
|
||||||
|
private float temperature;
|
||||||
|
private int humidity;
|
||||||
|
private String location;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.taosdata.example.mybatisplusdemo.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.taosdata.example.mybatisplusdemo.domain.Temperature;
|
||||||
|
import org.apache.ibatis.annotations.Insert;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
import org.apache.ibatis.annotations.Update;
|
||||||
|
|
||||||
|
public interface TemperatureMapper extends BaseMapper<Temperature> {
|
||||||
|
|
||||||
|
@Update("CREATE TABLE if not exists temperature(ts timestamp, temperature float) tags(location nchar(64), tbIndex int)")
|
||||||
|
int createSuperTable();
|
||||||
|
|
||||||
|
@Update("create table #{tbName} using temperature tags( #{location}, #{tbindex})")
|
||||||
|
int createTable(@Param("tbName") String tbName, @Param("location") String location, @Param("tbindex") int tbindex);
|
||||||
|
|
||||||
|
@Update("drop table if exists temperature")
|
||||||
|
void dropSuperTable();
|
||||||
|
|
||||||
|
@Insert("insert into t${tbIndex}(ts, temperature) values(#{ts}, #{temperature})")
|
||||||
|
int insertOne(Temperature one);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package com.taosdata.example.mybatisplusdemo.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.taosdata.example.mybatisplusdemo.domain.Weather;
|
||||||
|
|
||||||
|
public interface WeatherMapper extends BaseMapper<Weather> {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
spring:
|
||||||
|
datasource:
|
||||||
|
# driver-class-name: org.h2.Driver
|
||||||
|
# schema: classpath:db/schema-mysql.sql
|
||||||
|
# data: classpath:db/data-mysql.sql
|
||||||
|
# url: jdbc:h2:mem:test
|
||||||
|
# username: root
|
||||||
|
# password: test
|
||||||
|
|
||||||
|
# driver-class-name: com.mysql.jdbc.Driver
|
||||||
|
# url: jdbc:mysql://master:3306/test?useSSL=false
|
||||||
|
# username: root
|
||||||
|
# password: 123456
|
||||||
|
|
||||||
|
driver-class-name: com.taosdata.jdbc.TSDBDriver
|
||||||
|
url: jdbc:TAOS://localhost:6030/mp_test
|
||||||
|
user: root
|
||||||
|
password: taosdata
|
||||||
|
charset: UTF-8
|
||||||
|
locale: en_US.UTF-8
|
||||||
|
timezone: UTC-8
|
||||||
|
|
||||||
|
mybatis-plus:
|
||||||
|
configuration:
|
||||||
|
map-underscore-to-camel-case: false
|
||||||
|
|
||||||
|
logging:
|
||||||
|
level:
|
||||||
|
com:
|
||||||
|
taosdata:
|
||||||
|
example:
|
||||||
|
mybatisplusdemo:
|
||||||
|
mapper: debug
|
||||||
|
|
|
@ -0,0 +1,140 @@
|
||||||
|
package com.taosdata.example.mybatisplusdemo.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.taosdata.example.mybatisplusdemo.domain.Temperature;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
|
@SpringBootTest
|
||||||
|
public class TemperatureMapperTest {
|
||||||
|
|
||||||
|
private static Random random = new Random(System.currentTimeMillis());
|
||||||
|
private static String[] locations = {"北京", "上海", "深圳", "广州", "杭州"};
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void before() {
|
||||||
|
mapper.dropSuperTable();
|
||||||
|
// create table temperature
|
||||||
|
mapper.createSuperTable();
|
||||||
|
// create table t_X using temperature
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
mapper.createTable("t" + i, locations[random.nextInt(locations.length)], i);
|
||||||
|
}
|
||||||
|
// insert into table
|
||||||
|
int affectRows = 0;
|
||||||
|
// insert 10 tables
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
// each table insert 5 rows
|
||||||
|
for (int j = 0; j < 5; j++) {
|
||||||
|
Temperature one = new Temperature();
|
||||||
|
one.setTs(new Timestamp(1605024000000l));
|
||||||
|
one.setTemperature(random.nextFloat() * 50);
|
||||||
|
one.setLocation("望京");
|
||||||
|
one.setTbIndex(i);
|
||||||
|
affectRows += mapper.insertOne(one);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Assert.assertEquals(50, affectRows);
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void after() {
|
||||||
|
mapper.dropSuperTable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private TemperatureMapper mapper;
|
||||||
|
|
||||||
|
/***
|
||||||
|
* test SelectList
|
||||||
|
* **/
|
||||||
|
@Test
|
||||||
|
public void testSelectList() {
|
||||||
|
List<Temperature> temperatureList = mapper.selectList(null);
|
||||||
|
temperatureList.forEach(System.out::println);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* test InsertOne which is a custom metheod
|
||||||
|
* ***/
|
||||||
|
@Test
|
||||||
|
public void testInsert() {
|
||||||
|
Temperature one = new Temperature();
|
||||||
|
one.setTs(new Timestamp(1605024000000l));
|
||||||
|
one.setTemperature(random.nextFloat() * 50);
|
||||||
|
one.setLocation("望京");
|
||||||
|
int affectRows = mapper.insertOne(one);
|
||||||
|
Assert.assertEquals(1, affectRows);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* test SelectOne
|
||||||
|
* **/
|
||||||
|
@Test
|
||||||
|
public void testSelectOne() {
|
||||||
|
QueryWrapper<Temperature> wrapper = new QueryWrapper<>();
|
||||||
|
wrapper.eq("location", "beijing");
|
||||||
|
Temperature one = mapper.selectOne(wrapper);
|
||||||
|
System.out.println(one);
|
||||||
|
Assert.assertNotNull(one);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* test select By map
|
||||||
|
* ***/
|
||||||
|
@Test
|
||||||
|
public void testSelectByMap() {
|
||||||
|
Map<String, Object> map = new HashMap<>();
|
||||||
|
map.put("location", "beijing");
|
||||||
|
List<Temperature> temperatures = mapper.selectByMap(map);
|
||||||
|
Assert.assertEquals(1, temperatures.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* test selectObjs
|
||||||
|
* **/
|
||||||
|
@Test
|
||||||
|
public void testSelectObjs() {
|
||||||
|
List<Object> ts = mapper.selectObjs(null);
|
||||||
|
System.out.println(ts);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test selectC ount
|
||||||
|
* **/
|
||||||
|
@Test
|
||||||
|
public void testSelectCount() {
|
||||||
|
int count = mapper.selectCount(null);
|
||||||
|
Assert.assertEquals(5, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****
|
||||||
|
* 分页
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testSelectPage() {
|
||||||
|
IPage page = new Page(1, 2);
|
||||||
|
IPage<Temperature> temperatureIPage = mapper.selectPage(page, null);
|
||||||
|
System.out.println("total : " + temperatureIPage.getTotal());
|
||||||
|
System.out.println("pages : " + temperatureIPage.getPages());
|
||||||
|
for (Temperature temperature : temperatureIPage.getRecords()) {
|
||||||
|
System.out.println(temperature);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,88 @@
|
||||||
|
package com.taosdata.example.mybatisplusdemo.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.taosdata.example.mybatisplusdemo.domain.Weather;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
|
@SpringBootTest
|
||||||
|
public class WeatherMapperTest {
|
||||||
|
|
||||||
|
private static Random random = new Random(System.currentTimeMillis());
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private WeatherMapper mapper;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSelectList() {
|
||||||
|
List<Weather> weathers = mapper.selectList(null);
|
||||||
|
weathers.forEach(System.out::println);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testInsert() {
|
||||||
|
Weather one = new Weather();
|
||||||
|
one.setTs(new Timestamp(1605024000000l));
|
||||||
|
one.setTemperature(random.nextFloat() * 50);
|
||||||
|
one.setHumidity(random.nextInt(100));
|
||||||
|
one.setLocation("望京");
|
||||||
|
int affectRows = mapper.insert(one);
|
||||||
|
Assert.assertEquals(1, affectRows);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSelectOne() {
|
||||||
|
QueryWrapper<Weather> wrapper = new QueryWrapper<>();
|
||||||
|
wrapper.eq("location", "beijing");
|
||||||
|
Weather one = mapper.selectOne(wrapper);
|
||||||
|
System.out.println(one);
|
||||||
|
Assert.assertEquals(12.22f, one.getTemperature(), 0.00f);
|
||||||
|
Assert.assertEquals("beijing", one.getLocation());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSelectByMap() {
|
||||||
|
Map<String, Object> map = new HashMap<>();
|
||||||
|
map.put("location", "beijing");
|
||||||
|
List<Weather> weathers = mapper.selectByMap(map);
|
||||||
|
Assert.assertEquals(1, weathers.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSelectObjs() {
|
||||||
|
List<Object> ts = mapper.selectObjs(null);
|
||||||
|
System.out.println(ts);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSelectCount() {
|
||||||
|
int count = mapper.selectCount(null);
|
||||||
|
// Assert.assertEquals(5, count);
|
||||||
|
System.out.println(count);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSelectPage() {
|
||||||
|
IPage page = new Page(1, 2);
|
||||||
|
IPage<Weather> weatherIPage = mapper.selectPage(page, null);
|
||||||
|
System.out.println("total : " + weatherIPage.getTotal());
|
||||||
|
System.out.println("pages : " + weatherIPage.getPages());
|
||||||
|
for (Weather weather : weatherIPage.getRecords()) {
|
||||||
|
System.out.println(weather);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -50,10 +50,10 @@ static void queryDB(TAOS *taos, char *command) {
|
||||||
taos_free_result(pSql);
|
taos_free_result(pSql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Test(char *qstr, const char *input, int i);
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
TAOS * taos;
|
|
||||||
char qstr[1024];
|
char qstr[1024];
|
||||||
TAOS_RES *result;
|
|
||||||
|
|
||||||
// connect to server
|
// connect to server
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
|
@ -63,41 +63,26 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
// init TAOS
|
// init TAOS
|
||||||
taos_init();
|
taos_init();
|
||||||
|
for (int i = 0; i < 4000000; i++) {
|
||||||
taos = taos_connect(argv[1], "root", "taosdata", NULL, 0);
|
Test(qstr, argv[1], i);
|
||||||
|
}
|
||||||
|
taos_cleanup();
|
||||||
|
}
|
||||||
|
void Test(char *qstr, const char *input, int index) {
|
||||||
|
TAOS *taos = taos_connect(input, "root", "taosdata", NULL, 0);
|
||||||
|
printf("==================test at %d\n================================", index);
|
||||||
|
queryDB(taos, "drop database if exists demo");
|
||||||
|
queryDB(taos, "create database demo");
|
||||||
|
TAOS_RES *result;
|
||||||
if (taos == NULL) {
|
if (taos == NULL) {
|
||||||
printf("failed to connect to server, reason:%s\n", "null taos"/*taos_errstr(taos)*/);
|
printf("failed to connect to server, reason:%s\n", "null taos"/*taos_errstr(taos)*/);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
printf("success to connect to server\n");
|
|
||||||
|
|
||||||
|
|
||||||
//taos_query(taos, "drop database demo");
|
|
||||||
queryDB(taos, "drop database if exists demo");
|
|
||||||
|
|
||||||
//result = taos_query(taos, "create database demo");
|
|
||||||
//if (result == NULL) {
|
|
||||||
// printf("failed to create database, reason:%s\n", "null result"/*taos_errstr(taos)*/);
|
|
||||||
// exit(1);
|
|
||||||
//}
|
|
||||||
queryDB(taos, "create database demo");
|
|
||||||
printf("success to create database\n");
|
|
||||||
|
|
||||||
//taos_query(taos, "use demo");
|
|
||||||
queryDB(taos, "use demo");
|
queryDB(taos, "use demo");
|
||||||
|
|
||||||
// create table
|
|
||||||
//if (taos_query(taos, "create table m1 (ts timestamp, ti tinyint, si smallint, i int, bi bigint, f float, d double, b binary(10))") == 0) {
|
|
||||||
// printf("failed to create table, reason:%s\n", taos_errstr(result));
|
|
||||||
// exit(1);
|
|
||||||
//}
|
|
||||||
queryDB(taos, "create table m1 (ts timestamp, ti tinyint, si smallint, i int, bi bigint, f float, d double, b binary(10))");
|
queryDB(taos, "create table m1 (ts timestamp, ti tinyint, si smallint, i int, bi bigint, f float, d double, b binary(10))");
|
||||||
printf("success to create table\n");
|
printf("success to create table\n");
|
||||||
|
|
||||||
// sleep for one second to make sure table is created on data node
|
|
||||||
// taosMsleep(1000);
|
|
||||||
|
|
||||||
// insert 10 records
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (i = 0; i < 10; ++i) {
|
for (i = 0; i < 10; ++i) {
|
||||||
sprintf(qstr, "insert into m1 values (%" PRId64 ", %d, %d, %d, %d, %f, %lf, '%s')", 1546300800000 + i * 1000, i, i, i, i*10000000, i*1.0, i*2.0, "hello");
|
sprintf(qstr, "insert into m1 values (%" PRId64 ", %d, %d, %d, %d, %f, %lf, '%s')", 1546300800000 + i * 1000, i, i, i, i*10000000, i*1.0, i*2.0, "hello");
|
||||||
|
@ -117,7 +102,6 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
taos_free_result(result);
|
taos_free_result(result);
|
||||||
|
|
||||||
//sleep(1);
|
|
||||||
}
|
}
|
||||||
printf("success to insert rows, total %d rows\n", i);
|
printf("success to insert rows, total %d rows\n", i);
|
||||||
|
|
||||||
|
@ -147,5 +131,6 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
taos_free_result(result);
|
taos_free_result(result);
|
||||||
printf("====demo end====\n\n");
|
printf("====demo end====\n\n");
|
||||||
return getchar();
|
taos_close(taos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,112 +16,202 @@ import sys
|
||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
import random
|
import random
|
||||||
# query sql
|
import requests
|
||||||
query_sql = [
|
from requests.auth import HTTPBasicAuth
|
||||||
# first supertable
|
func_list=['avg','count','twa','sum','stddev','leastsquares','min',
|
||||||
"select count(*) from test.meters ;",
|
'max','first','last','top','bottom','percentile','apercentile',
|
||||||
"select count(*) from test.meters where t3 > 2;",
|
'last_row','diff','spread']
|
||||||
"select count(*) from test.meters where ts <> '2020-05-13 10:00:00.002';",
|
condition_list=[
|
||||||
"select count(*) from test.meters where t7 like 'taos_1%';",
|
"where _c0 > now -10d ",
|
||||||
"select count(*) from test.meters where t7 like '_____2';",
|
'interval(10s)',
|
||||||
"select count(*) from test.meters where t8 like '%思%';",
|
'limit 10',
|
||||||
"select count(*) from test.meters interval(1n) order by ts desc;",
|
'group by',
|
||||||
#"select max(c0) from test.meters group by tbname",
|
'order by',
|
||||||
"select first(ts) from test.meters where t5 >5000 and t5<5100;",
|
'fill(null)'
|
||||||
"select last(ts) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select last_row(*) from test.meters;",
|
|
||||||
"select twa(c1) from test.t1 where ts > 1500000001000 and ts < 1500000101000" ,
|
|
||||||
"select avg(c1) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select bottom(c1, 2) from test.t1;",
|
|
||||||
"select diff(c1) from test.t1;",
|
|
||||||
"select leastsquares(c1, 1, 1) from test.t1 ;",
|
|
||||||
"select max(c1) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select min(c1) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select c1 + c2 + c1 / c5 + c4 + c2 from test.t1;",
|
|
||||||
"select percentile(c1, 50) from test.t1;",
|
|
||||||
"select spread(c1) from test.t1 ;",
|
|
||||||
"select stddev(c1) from test.t1;",
|
|
||||||
"select sum(c1) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select top(c1, 2) from test.meters where t5 >5000 and t5<5100;"
|
|
||||||
"select twa(c4) from test.t1 where ts > 1500000001000 and ts < 1500000101000" ,
|
|
||||||
"select avg(c4) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select bottom(c4, 2) from test.t1 where t5 >5000 and t5<5100;",
|
|
||||||
"select diff(c4) from test.t1 where t5 >5000 and t5<5100;",
|
|
||||||
"select leastsquares(c4, 1, 1) from test.t1 ;",
|
|
||||||
"select max(c4) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select min(c4) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select c5 + c2 + c4 / c5 + c4 + c2 from test.t1 ;",
|
|
||||||
"select percentile(c5, 50) from test.t1;",
|
|
||||||
"select spread(c5) from test.t1 ;",
|
|
||||||
"select stddev(c5) from test.t1 where t5 >5000 and t5<5100;",
|
|
||||||
"select sum(c5) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
"select top(c5, 2) from test.meters where t5 >5000 and t5<5100;",
|
|
||||||
#all vnode
|
|
||||||
"select count(*) from test.meters where t5 >5000 and t5<5100",
|
|
||||||
"select max(c0),avg(c1) from test.meters where t5 >5000 and t5<5100",
|
|
||||||
"select sum(c5),avg(c1) from test.meters where t5 >5000 and t5<5100",
|
|
||||||
"select max(c0),min(c5) from test.meters where t5 >5000 and t5<5100",
|
|
||||||
"select min(c0),avg(c5) from test.meters where t5 >5000 and t5<5100",
|
|
||||||
# second supertable
|
|
||||||
"select count(*) from test.meters1 where t3 > 2;",
|
|
||||||
"select count(*) from test.meters1 where ts <> '2020-05-13 10:00:00.002';",
|
|
||||||
"select count(*) from test.meters where t7 like 'taos_1%';",
|
|
||||||
"select count(*) from test.meters where t7 like '_____2';",
|
|
||||||
"select count(*) from test.meters where t8 like '%思%';",
|
|
||||||
"select count(*) from test.meters1 interval(1n) order by ts desc;",
|
|
||||||
#"select max(c0) from test.meters1 group by tbname",
|
|
||||||
"select first(ts) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select last(ts) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select last_row(*) from test.meters1 ;",
|
|
||||||
"select twa(c1) from test.m1 where ts > 1500000001000 and ts < 1500000101000" ,
|
|
||||||
"select avg(c1) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select bottom(c1, 2) from test.m1 where t5 >5000 and t5<5100;",
|
|
||||||
"select diff(c1) from test.m1 ;",
|
|
||||||
"select leastsquares(c1, 1, 1) from test.m1 ;",
|
|
||||||
"select max(c1) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select min(c1) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select c1 + c2 + c1 / c0 + c2 from test.m1 ;",
|
|
||||||
"select percentile(c1, 50) from test.m1;",
|
|
||||||
"select spread(c1) from test.m1 ;",
|
|
||||||
"select stddev(c1) from test.m1;",
|
|
||||||
"select sum(c1) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select top(c1, 2) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select twa(c5) from test.m1 where ts > 1500000001000 and ts < 1500000101000" ,
|
|
||||||
"select avg(c5) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select bottom(c5, 2) from test.m1;",
|
|
||||||
"select diff(c5) from test.m1;",
|
|
||||||
"select leastsquares(c5, 1, 1) from test.m1 ;",
|
|
||||||
"select max(c5) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select min(c5) from test.meters1 where t5 >5000 and t5<5100;",
|
|
||||||
"select c5 + c2 + c4 / c5 + c0 from test.m1;",
|
|
||||||
"select percentile(c4, 50) from test.m1;",
|
|
||||||
"select spread(c4) from test.m1 ;",
|
|
||||||
"select stddev(c4) from test.m1;",
|
|
||||||
"select sum(c4) from test.meters1 where t5 >5100 and t5<5300;",
|
|
||||||
"select top(c4, 2) from test.meters1 where t5 >5100 and t5<5300;",
|
|
||||||
"select count(*) from test.meters1 where t5 >5100 and t5<5300",
|
|
||||||
#all vnode
|
|
||||||
"select count(*) from test.meters1 where t5 >5100 and t5<5300",
|
|
||||||
"select max(c0),avg(c1) from test.meters1 where t5 >5000 and t5<5100",
|
|
||||||
"select sum(c5),avg(c1) from test.meters1 where t5 >5000 and t5<5100",
|
|
||||||
"select max(c0),min(c5) from test.meters1 where t5 >5000 and t5<5100",
|
|
||||||
"select min(c0),avg(c5) from test.meters1 where t5 >5000 and t5<5100",
|
|
||||||
#join
|
|
||||||
# "select * from meters,meters1 where meters.ts = meters1.ts and meters.t5 = meters1.t5",
|
|
||||||
# "select * from meters,meters1 where meters.ts = meters1.ts and meters.t7 = meters1.t7",
|
|
||||||
# "select * from meters,meters1 where meters.ts = meters1.ts and meters.t8 = meters1.t8",
|
|
||||||
# "select meters.ts,meters1.c2 from meters,meters1 where meters.ts = meters1.ts and meters.t8 = meters1.t8"
|
|
||||||
]
|
]
|
||||||
|
where_list = ['_c0>now-10d',' <50'," like \'%a%\'"]
|
||||||
class ConcurrentInquiry:
|
class ConcurrentInquiry:
|
||||||
def initConnection(self):
|
def __init__(self,n_Therads=25,r_Therads=25):
|
||||||
self.numOfTherads = 50
|
self.n_numOfTherads = n_Therads
|
||||||
|
self.r_numOfTherads = r_Therads
|
||||||
self.ts=1500000001000
|
self.ts=1500000001000
|
||||||
|
self.dbname='test'
|
||||||
|
self.stb_list=[]
|
||||||
|
self.subtb_list=[]
|
||||||
|
self.stb_stru_list=[]
|
||||||
|
self.subtb_stru_list=[]
|
||||||
|
self.stb_tag_list=[]
|
||||||
|
self.subtb_tag_list=[]
|
||||||
|
|
||||||
def SetThreadsNum(self,num):
|
def SetThreadsNum(self,num):
|
||||||
self.numOfTherads=num
|
self.numOfTherads=num
|
||||||
def query_thread(self,threadID):
|
|
||||||
host = "10.211.55.14"
|
def ret_fcol(self,cl,sql): #返回结果的第一列
|
||||||
|
cl.execute(sql)
|
||||||
|
fcol_list=[]
|
||||||
|
for data in cl:
|
||||||
|
fcol_list.append(data[0])
|
||||||
|
return fcol_list
|
||||||
|
|
||||||
|
def r_stb_list(self,cl): #返回超级表列表
|
||||||
|
sql='show '+self.dbname+'.stables'
|
||||||
|
self.stb_list=self.ret_fcol(cl,sql)
|
||||||
|
|
||||||
|
def r_subtb_list(self,cl,stablename): #每个超级表返回2个子表
|
||||||
|
sql='select tbname from '+self.dbname+'.'+stablename+' limit 2;'
|
||||||
|
self.subtb_list+=self.ret_fcol(cl,sql)
|
||||||
|
|
||||||
|
def cal_struct(self,cl,tbname): #查看表结构
|
||||||
|
tb=[]
|
||||||
|
tag=[]
|
||||||
|
sql='describe '+self.dbname+'.'+tbname+';'
|
||||||
|
cl.execute(sql)
|
||||||
|
for data in cl:
|
||||||
|
if data[3]:
|
||||||
|
tag.append(data[0])
|
||||||
|
else:
|
||||||
|
tb.append(data[0])
|
||||||
|
return tb,tag
|
||||||
|
|
||||||
|
def r_stb_stru(self,cl): #获取所有超级表的表结构
|
||||||
|
for i in self.stb_list:
|
||||||
|
tb,tag=self.cal_struct(cl,i)
|
||||||
|
self.stb_stru_list.append(tb)
|
||||||
|
self.stb_tag_list.append(tag)
|
||||||
|
|
||||||
|
def r_subtb_stru(self,cl): #返回所有子表的表结构
|
||||||
|
for i in self.subtb_list:
|
||||||
|
tb,tag=self.cal_struct(cl,i)
|
||||||
|
self.subtb_stru_list.append(tb)
|
||||||
|
self.subtb_tag_list.append(tag)
|
||||||
|
|
||||||
|
def get_full(self): #获取所有的表、表结构
|
||||||
|
host = "127.0.0.1"
|
||||||
|
user = "root"
|
||||||
|
password = "taosdata"
|
||||||
|
conn = taos.connect(
|
||||||
|
host,
|
||||||
|
user,
|
||||||
|
password,
|
||||||
|
)
|
||||||
|
cl = conn.cursor()
|
||||||
|
self.r_stb_list(cl)
|
||||||
|
for i in self.stb_list:
|
||||||
|
self.r_subtb_list(cl,i)
|
||||||
|
self.r_stb_stru(cl)
|
||||||
|
self.r_subtb_stru(cl)
|
||||||
|
cl.close()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
#query condition
|
||||||
|
def con_where(self,tlist):
|
||||||
|
l=[]
|
||||||
|
for i in range(random.randint(0,len(tlist))):
|
||||||
|
c = random.choice(where_list)
|
||||||
|
if c == '_c0>now-10d':
|
||||||
|
l.append(c)
|
||||||
|
else:
|
||||||
|
l.append(random.choice(tlist)+c)
|
||||||
|
return 'where '+random.choice([' and ',' or ']).join(l)
|
||||||
|
|
||||||
|
def con_interval(self,tlist):
|
||||||
|
return random.choice(['interval(10s)','interval(10d)','interval(1n)'])
|
||||||
|
|
||||||
|
def con_limit(self,tlist):
|
||||||
|
return random.choice(['limit 10','limit 10 offset 10','slimit 10','slimit 10 offset 10','limit 10 slimit 10','limit 10 offset 5 slimit 5 soffset 10'])
|
||||||
|
|
||||||
|
def con_fill(self,tlist):
|
||||||
|
return random.choice(['fill(null)','fill(prev)','fill(none)','fill(LINEAR)'])
|
||||||
|
|
||||||
|
def con_group(self,tlist):
|
||||||
|
return 'group by '+random.choice(tlist)
|
||||||
|
|
||||||
|
def con_order(self,tlist):
|
||||||
|
return 'order by '+random.choice(tlist)
|
||||||
|
|
||||||
|
def gen_query_sql(self): #生成查询语句
|
||||||
|
tbi=random.randint(0,len(self.subtb_list)+len(self.stb_list)) #随机决定查询哪张表
|
||||||
|
tbname=''
|
||||||
|
col_list=[]
|
||||||
|
tag_list=[]
|
||||||
|
is_stb=0
|
||||||
|
if tbi>len(self.stb_list) :
|
||||||
|
tbi=tbi-len(self.stb_list)
|
||||||
|
tbname=self.subtb_list[tbi-1]
|
||||||
|
col_list=self.subtb_stru_list[tbi-1]
|
||||||
|
tag_list=self.subtb_tag_list[tbi-1]
|
||||||
|
else:
|
||||||
|
tbname=self.stb_list[tbi-1]
|
||||||
|
col_list=self.stb_stru_list[tbi-1]
|
||||||
|
tag_list=self.stb_tag_list[tbi-1]
|
||||||
|
is_stb=1
|
||||||
|
tlist=col_list+tag_list
|
||||||
|
con_rand=random.randint(0,len(condition_list))
|
||||||
|
func_rand=random.randint(0,len(func_list))
|
||||||
|
col_rand=random.randint(0,len(col_list))
|
||||||
|
tag_rand=random.randint(0,len(tag_list))
|
||||||
|
t_rand=random.randint(0,len(tlist))
|
||||||
|
sql='select ' #select
|
||||||
|
random.shuffle(col_list)
|
||||||
|
random.shuffle(func_list)
|
||||||
|
sel_col_list=[]
|
||||||
|
col_rand=random.randint(0,len(col_list))
|
||||||
|
for i,j in zip(col_list[0:col_rand],func_list): #决定每个被查询col的函数
|
||||||
|
if j == 'leastsquares':
|
||||||
|
sel_col_list.append(j+'('+i+',1,1)')
|
||||||
|
elif j == 'top' or j == 'bottom' or j == 'percentile' or j == 'apercentile':
|
||||||
|
sel_col_list.append(j+'('+i+',1)')
|
||||||
|
else:
|
||||||
|
sel_col_list.append(j+'('+i+')')
|
||||||
|
sql=sql+','.join(sel_col_list)+' from '+random.choice(self.stb_list+self.subtb_list)+' ' #select col & func
|
||||||
|
con_func=[self.con_where,self.con_interval,self.con_limit,self.con_group,self.con_order,self.con_fill]
|
||||||
|
sel_con=random.sample(con_func,random.randint(0,len(con_func)))
|
||||||
|
sel_con_list=[]
|
||||||
|
for i in sel_con:
|
||||||
|
sel_con_list.append(i(tlist)) #获取对应的条件函数
|
||||||
|
sql+=' '.join(sel_con_list) # condition
|
||||||
|
print(sql)
|
||||||
|
return sql
|
||||||
|
|
||||||
|
def rest_query(self,sql): #rest 接口
|
||||||
|
host = "127.0.0.1"
|
||||||
|
user = "root"
|
||||||
|
password = "taosdata"
|
||||||
|
port =6041
|
||||||
|
url = "http://{}:{}/rest/sql".format(host, port )
|
||||||
|
try:
|
||||||
|
r = requests.post(url,
|
||||||
|
data = 'use test',
|
||||||
|
auth = HTTPBasicAuth('root', 'taosdata'))
|
||||||
|
r = requests.post(url,
|
||||||
|
data = sql,
|
||||||
|
auth = HTTPBasicAuth('root', 'taosdata'))
|
||||||
|
except:
|
||||||
|
print("REST API Failure (TODO: more info here)")
|
||||||
|
raise
|
||||||
|
rj = r.json()
|
||||||
|
if ('status' not in rj):
|
||||||
|
raise RuntimeError("No status in REST response")
|
||||||
|
|
||||||
|
if rj['status'] == 'error': # clearly reported error
|
||||||
|
if ('code' not in rj): # error without code
|
||||||
|
raise RuntimeError("REST error return without code")
|
||||||
|
errno = rj['code'] # May need to massage this in the future
|
||||||
|
# print("Raising programming error with REST return: {}".format(rj))
|
||||||
|
raise taos.error.ProgrammingError(
|
||||||
|
rj['desc'], errno) # todo: check existance of 'desc'
|
||||||
|
|
||||||
|
if rj['status'] != 'succ': # better be this
|
||||||
|
raise RuntimeError(
|
||||||
|
"Unexpected REST return status: {}".format(
|
||||||
|
rj['status']))
|
||||||
|
|
||||||
|
nRows = rj['rows'] if ('rows' in rj) else 0
|
||||||
|
return nRows
|
||||||
|
|
||||||
|
def query_thread_n(self,threadID): #使用原生python接口查询
|
||||||
|
host = "127.0.0.1"
|
||||||
user = "root"
|
user = "root"
|
||||||
password = "taosdata"
|
password = "taosdata"
|
||||||
conn = taos.connect(
|
conn = taos.connect(
|
||||||
|
@ -135,35 +225,59 @@ class ConcurrentInquiry:
|
||||||
print("Thread %d: starting" % threadID)
|
print("Thread %d: starting" % threadID)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
ran_query_sql=query_sql
|
|
||||||
random.shuffle(ran_query_sql)
|
|
||||||
for i in ran_query_sql:
|
|
||||||
print("Thread %d : %s"% (threadID,i))
|
|
||||||
try:
|
try:
|
||||||
|
sql=self.gen_query_sql()
|
||||||
|
print("sql is ",sql)
|
||||||
start = time.time()
|
start = time.time()
|
||||||
cl.execute(i)
|
cl.execute(sql)
|
||||||
cl.fetchall
|
cl.fetchall()
|
||||||
end = time.time()
|
end = time.time()
|
||||||
print("time cost :",end-start)
|
print("time cost :",end-start)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(
|
print(
|
||||||
"Failure thread%d, sql: %s,exception: %s" %
|
"Failure thread%d, sql: %s,exception: %s" %
|
||||||
(threadID, str(i),str(e)))
|
(threadID, str(sql),str(e)))
|
||||||
exit(-1)
|
#exit(-1)
|
||||||
|
|
||||||
|
|
||||||
print("Thread %d: finishing" % threadID)
|
print("Thread %d: finishing" % threadID)
|
||||||
|
|
||||||
|
def query_thread_r(self,threadID): #使用rest接口查询
|
||||||
|
print("Thread %d: starting" % threadID)
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
sql=self.gen_query_sql()
|
||||||
|
print("sql is ",sql)
|
||||||
|
start = time.time()
|
||||||
|
self.rest_query(sql)
|
||||||
|
end = time.time()
|
||||||
|
print("time cost :",end-start)
|
||||||
|
except Exception as e:
|
||||||
|
print(
|
||||||
|
"Failure thread%d, sql: %s,exception: %s" %
|
||||||
|
(threadID, str(sql),str(e)))
|
||||||
|
#exit(-1)
|
||||||
|
|
||||||
|
|
||||||
|
print("Thread %d: finishing" % threadID)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
print(self.n_numOfTherads,self.r_numOfTherads)
|
||||||
threads = []
|
threads = []
|
||||||
for i in range(self.numOfTherads):
|
for i in range(self.n_numOfTherads):
|
||||||
thread = threading.Thread(target=self.query_thread, args=(i,))
|
thread = threading.Thread(target=self.query_thread_n, args=(i,))
|
||||||
threads.append(thread)
|
threads.append(thread)
|
||||||
thread.start()
|
thread.start()
|
||||||
|
for i in range(self.r_numOfTherads):
|
||||||
q = ConcurrentInquiry()
|
# for i in range(1):
|
||||||
q.initConnection()
|
thread = threading.Thread(target=self.query_thread_r, args=(i,))
|
||||||
|
threads.append(thread)
|
||||||
|
thread.start()
|
||||||
|
if len(sys.argv)>1:
|
||||||
|
q = ConcurrentInquiry(n_Therads=sys.argv[1],r_Therads=sys.argv[2])
|
||||||
|
else:
|
||||||
|
q = ConcurrentInquiry()
|
||||||
|
q.get_full()
|
||||||
|
#q.gen_query_sql()
|
||||||
q.run()
|
q.run()
|
||||||
|
|
|
@ -0,0 +1,169 @@
|
||||||
|
###################################################################
|
||||||
|
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This file is proprietary and confidential to TAOS Technologies.
|
||||||
|
# No part of this file may be reproduced, stored, transmitted,
|
||||||
|
# disclosed or used in any form or by any means other than as
|
||||||
|
# expressly provided by the written permission from Jianhui Tao
|
||||||
|
#
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import threading
|
||||||
|
import taos
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
import random
|
||||||
|
# query sql
|
||||||
|
query_sql = [
|
||||||
|
# first supertable
|
||||||
|
"select count(*) from test.meters ;",
|
||||||
|
"select count(*) from test.meters where t3 > 2;",
|
||||||
|
"select count(*) from test.meters where ts <> '2020-05-13 10:00:00.002';",
|
||||||
|
"select count(*) from test.meters where t7 like 'taos_1%';",
|
||||||
|
"select count(*) from test.meters where t7 like '_____2';",
|
||||||
|
"select count(*) from test.meters where t8 like '%思%';",
|
||||||
|
"select count(*) from test.meters interval(1n) order by ts desc;",
|
||||||
|
#"select max(c0) from test.meters group by tbname",
|
||||||
|
"select first(ts) from test.meters where t5 >5000 and t5<5100;",
|
||||||
|
"select last(ts) from test.meters where t5 >5000 and t5<5100;",
|
||||||
|
"select last_row(*) from test.meters;",
|
||||||
|
"select twa(c1) from test.t1 where ts > 1500000001000 and ts < 1500000101000" ,
|
||||||
|
"select avg(c1) from test.meters where t5 >5000 and t5<5100;",
|
||||||
|
"select bottom(c1, 2) from test.t1;",
|
||||||
|
"select diff(c1) from test.t1;",
|
||||||
|
"select leastsquares(c1, 1, 1) from test.t1 ;",
|
||||||
|
"select max(c1) from test.meters where t5 >5000 and t5<5100;",
|
||||||
|
"select min(c1) from test.meters where t5 >5000 and t5<5100;",
|
||||||
|
"select c1 + c2 + c1 / c5 + c4 + c2 from test.t1;",
|
||||||
|
"select percentile(c1, 50) from test.t1;",
|
||||||
|
"select spread(c1) from test.t1 ;",
|
||||||
|
"select stddev(c1) from test.t1;",
|
||||||
|
"select sum(c1) from test.meters where t5 >5000 and t5<5100;",
|
||||||
|
"select top(c1, 2) from test.meters where t5 >5000 and t5<5100;"
|
||||||
|
"select twa(c4) from test.t1 where ts > 1500000001000 and ts < 1500000101000" ,
|
||||||
|
"select avg(c4) from test.meters where t5 >5000 and t5<5100;",
|
||||||
|
"select bottom(c4, 2) from test.t1 where t5 >5000 and t5<5100;",
|
||||||
|
"select diff(c4) from test.t1 where t5 >5000 and t5<5100;",
|
||||||
|
"select leastsquares(c4, 1, 1) from test.t1 ;",
|
||||||
|
"select max(c4) from test.meters where t5 >5000 and t5<5100;",
|
||||||
|
"select min(c4) from test.meters where t5 >5000 and t5<5100;",
|
||||||
|
"select c5 + c2 + c4 / c5 + c4 + c2 from test.t1 ;",
|
||||||
|
"select percentile(c5, 50) from test.t1;",
|
||||||
|
"select spread(c5) from test.t1 ;",
|
||||||
|
"select stddev(c5) from test.t1 where t5 >5000 and t5<5100;",
|
||||||
|
"select sum(c5) from test.meters where t5 >5000 and t5<5100;",
|
||||||
|
"select top(c5, 2) from test.meters where t5 >5000 and t5<5100;",
|
||||||
|
#all vnode
|
||||||
|
"select count(*) from test.meters where t5 >5000 and t5<5100",
|
||||||
|
"select max(c0),avg(c1) from test.meters where t5 >5000 and t5<5100",
|
||||||
|
"select sum(c5),avg(c1) from test.meters where t5 >5000 and t5<5100",
|
||||||
|
"select max(c0),min(c5) from test.meters where t5 >5000 and t5<5100",
|
||||||
|
"select min(c0),avg(c5) from test.meters where t5 >5000 and t5<5100",
|
||||||
|
# second supertable
|
||||||
|
"select count(*) from test.meters1 where t3 > 2;",
|
||||||
|
"select count(*) from test.meters1 where ts <> '2020-05-13 10:00:00.002';",
|
||||||
|
"select count(*) from test.meters where t7 like 'taos_1%';",
|
||||||
|
"select count(*) from test.meters where t7 like '_____2';",
|
||||||
|
"select count(*) from test.meters where t8 like '%思%';",
|
||||||
|
"select count(*) from test.meters1 interval(1n) order by ts desc;",
|
||||||
|
#"select max(c0) from test.meters1 group by tbname",
|
||||||
|
"select first(ts) from test.meters1 where t5 >5000 and t5<5100;",
|
||||||
|
"select last(ts) from test.meters1 where t5 >5000 and t5<5100;",
|
||||||
|
"select last_row(*) from test.meters1 ;",
|
||||||
|
"select twa(c1) from test.m1 where ts > 1500000001000 and ts < 1500000101000" ,
|
||||||
|
"select avg(c1) from test.meters1 where t5 >5000 and t5<5100;",
|
||||||
|
"select bottom(c1, 2) from test.m1 where t5 >5000 and t5<5100;",
|
||||||
|
"select diff(c1) from test.m1 ;",
|
||||||
|
"select leastsquares(c1, 1, 1) from test.m1 ;",
|
||||||
|
"select max(c1) from test.meters1 where t5 >5000 and t5<5100;",
|
||||||
|
"select min(c1) from test.meters1 where t5 >5000 and t5<5100;",
|
||||||
|
"select c1 + c2 + c1 / c0 + c2 from test.m1 ;",
|
||||||
|
"select percentile(c1, 50) from test.m1;",
|
||||||
|
"select spread(c1) from test.m1 ;",
|
||||||
|
"select stddev(c1) from test.m1;",
|
||||||
|
"select sum(c1) from test.meters1 where t5 >5000 and t5<5100;",
|
||||||
|
"select top(c1, 2) from test.meters1 where t5 >5000 and t5<5100;",
|
||||||
|
"select twa(c5) from test.m1 where ts > 1500000001000 and ts < 1500000101000" ,
|
||||||
|
"select avg(c5) from test.meters1 where t5 >5000 and t5<5100;",
|
||||||
|
"select bottom(c5, 2) from test.m1;",
|
||||||
|
"select diff(c5) from test.m1;",
|
||||||
|
"select leastsquares(c5, 1, 1) from test.m1 ;",
|
||||||
|
"select max(c5) from test.meters1 where t5 >5000 and t5<5100;",
|
||||||
|
"select min(c5) from test.meters1 where t5 >5000 and t5<5100;",
|
||||||
|
"select c5 + c2 + c4 / c5 + c0 from test.m1;",
|
||||||
|
"select percentile(c4, 50) from test.m1;",
|
||||||
|
"select spread(c4) from test.m1 ;",
|
||||||
|
"select stddev(c4) from test.m1;",
|
||||||
|
"select sum(c4) from test.meters1 where t5 >5100 and t5<5300;",
|
||||||
|
"select top(c4, 2) from test.meters1 where t5 >5100 and t5<5300;",
|
||||||
|
"select count(*) from test.meters1 where t5 >5100 and t5<5300",
|
||||||
|
#all vnode
|
||||||
|
"select count(*) from test.meters1 where t5 >5100 and t5<5300",
|
||||||
|
"select max(c0),avg(c1) from test.meters1 where t5 >5000 and t5<5100",
|
||||||
|
"select sum(c5),avg(c1) from test.meters1 where t5 >5000 and t5<5100",
|
||||||
|
"select max(c0),min(c5) from test.meters1 where t5 >5000 and t5<5100",
|
||||||
|
"select min(c0),avg(c5) from test.meters1 where t5 >5000 and t5<5100",
|
||||||
|
#join
|
||||||
|
# "select * from meters,meters1 where meters.ts = meters1.ts and meters.t5 = meters1.t5",
|
||||||
|
# "select * from meters,meters1 where meters.ts = meters1.ts and meters.t7 = meters1.t7",
|
||||||
|
# "select * from meters,meters1 where meters.ts = meters1.ts and meters.t8 = meters1.t8",
|
||||||
|
# "select meters.ts,meters1.c2 from meters,meters1 where meters.ts = meters1.ts and meters.t8 = meters1.t8"
|
||||||
|
]
|
||||||
|
|
||||||
|
class ConcurrentInquiry:
|
||||||
|
def initConnection(self):
|
||||||
|
self.numOfTherads = 50
|
||||||
|
self.ts=1500000001000
|
||||||
|
|
||||||
|
def SetThreadsNum(self,num):
|
||||||
|
self.numOfTherads=num
|
||||||
|
def query_thread(self,threadID):
|
||||||
|
host = "10.211.55.14"
|
||||||
|
user = "root"
|
||||||
|
password = "taosdata"
|
||||||
|
conn = taos.connect(
|
||||||
|
host,
|
||||||
|
user,
|
||||||
|
password,
|
||||||
|
)
|
||||||
|
cl = conn.cursor()
|
||||||
|
cl.execute("use test;")
|
||||||
|
|
||||||
|
print("Thread %d: starting" % threadID)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
ran_query_sql=query_sql
|
||||||
|
random.shuffle(ran_query_sql)
|
||||||
|
for i in ran_query_sql:
|
||||||
|
print("Thread %d : %s"% (threadID,i))
|
||||||
|
try:
|
||||||
|
start = time.time()
|
||||||
|
cl.execute(i)
|
||||||
|
cl.fetchall()
|
||||||
|
end = time.time()
|
||||||
|
print("time cost :",end-start)
|
||||||
|
except Exception as e:
|
||||||
|
print(
|
||||||
|
"Failure thread%d, sql: %s,exception: %s" %
|
||||||
|
(threadID, str(i),str(e)))
|
||||||
|
exit(-1)
|
||||||
|
|
||||||
|
|
||||||
|
print("Thread %d: finishing" % threadID)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
|
||||||
|
threads = []
|
||||||
|
for i in range(self.numOfTherads):
|
||||||
|
thread = threading.Thread(target=self.query_thread, args=(i,))
|
||||||
|
threads.append(thread)
|
||||||
|
thread.start()
|
||||||
|
|
||||||
|
q = ConcurrentInquiry()
|
||||||
|
q.initConnection()
|
||||||
|
q.run()
|
|
@ -0,0 +1,71 @@
|
||||||
|
###################################################################
|
||||||
|
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This file is proprietary and confidential to TAOS Technologies.
|
||||||
|
# No part of this file may be reproduced, stored, transmitted,
|
||||||
|
# disclosed or used in any form or by any means other than as
|
||||||
|
# expressly provided by the written permission from Jianhui Tao
|
||||||
|
#
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import taos
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor())
|
||||||
|
|
||||||
|
self.rowNum = 10
|
||||||
|
self.ts = 1537146000000
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
tdSql.prepare()
|
||||||
|
|
||||||
|
tdSql.execute('''create table test(ts timestamp, col1 int, col2 int) tags(loc nchar(20))''')
|
||||||
|
tdSql.execute("create table test1 using test tags('beijing')")
|
||||||
|
tdSql.execute("create table test2 using test tags('shanghai')")
|
||||||
|
for i in range(self.rowNum):
|
||||||
|
tdSql.execute("insert into test1 values(%d, %d, %d)" % (self.ts + i, i + 1, i + 1))
|
||||||
|
tdSql.execute("insert into test2 values(%d, %d, %d)" % (self.ts + i, i + 1, i + 1))
|
||||||
|
|
||||||
|
# arithmetic verifacation
|
||||||
|
tdSql.query("select 0.1 + 0.1 from test")
|
||||||
|
tdSql.checkRows(self.rowNum * 2)
|
||||||
|
for i in range(self.rowNum * 2):
|
||||||
|
tdSql.checkData(0, 0, 0.20000000)
|
||||||
|
|
||||||
|
tdSql.query("select 4 * avg(col1) from test")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.checkData(0, 0, 22)
|
||||||
|
|
||||||
|
tdSql.query("select 4 * sum(col1) from test")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.checkData(0, 0, 440)
|
||||||
|
|
||||||
|
tdSql.query("select 4 * avg(col1) * sum(col2) from test")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.checkData(0, 0, 2420)
|
||||||
|
|
||||||
|
tdSql.query("select 4 * avg(col1) * sum(col2) from test group by loc")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
tdSql.checkData(0, 0, 1210)
|
||||||
|
tdSql.checkData(1, 0, 1210)
|
||||||
|
|
||||||
|
tdSql.error("select avg(col1 * 2)from test group by loc")
|
||||||
|
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -15,25 +15,28 @@ import requests
|
||||||
import threading
|
import threading
|
||||||
import random
|
import random
|
||||||
import time
|
import time
|
||||||
|
import argparse
|
||||||
|
|
||||||
class RestfulInsert:
|
class RestfulInsert:
|
||||||
def init(self):
|
def __init__(self, host, dbname, threads, tables, records, batchSize, tbNamePerfix, outOfOrder):
|
||||||
self.header = {'Authorization': 'Basic cm9vdDp0YW9zZGF0YQ=='}
|
self.header = {'Authorization': 'Basic cm9vdDp0YW9zZGF0YQ=='}
|
||||||
self.url = "http://127.0.0.1:6041/rest/sql"
|
self.url = "http://%s:6041/rest/sql" % host
|
||||||
self.ts = 1500000000000
|
self.ts = 1500000000000
|
||||||
self.numOfThreads = 20
|
self.dbname = dbname
|
||||||
self.numOfTables = 10000
|
self.numOfThreads = threads
|
||||||
self.recordsPerTable = 10000
|
self.numOfTables = tables
|
||||||
self.batchSize = 1000
|
self.recordsPerTable = records
|
||||||
self.tableNamePerfix = 't'
|
self.batchSize = batchSize
|
||||||
|
self.tableNamePerfix = tbNamePerfix
|
||||||
|
self.outOfOrder = outOfOrder
|
||||||
|
|
||||||
def createTable(self, threadID):
|
def createTable(self, threadID):
|
||||||
tablesPerThread = int (self.numOfTables / self.numOfThreads)
|
tablesPerThread = int (self.numOfTables / self.numOfThreads)
|
||||||
print("create table %d to %d" % (tablesPerThread * threadID, tablesPerThread * (threadID + 1) - 1))
|
print("create table %d to %d" % (tablesPerThread * threadID, tablesPerThread * (threadID + 1) - 1))
|
||||||
for i in range(tablesPerThread):
|
for i in range(tablesPerThread):
|
||||||
tableID = threadID * tablesPerThread
|
tableID = threadID * tablesPerThread
|
||||||
name = 'beijing' if tableID % 2 == 0 else 'shanghai'
|
name = 'beijing' if tableID % 2 == 0 else 'shanghai'
|
||||||
data = "create table test.%s%d using test.meters tags(%d, '%s')" % (self.tableNamePerfix, tableID + i, tableID + i, name)
|
data = "create table %s.%s%d using %s.meters tags(%d, '%s')" % (self.dbname, self.tableNamePerfix, tableID + i, self.dbname, tableID + i, name)
|
||||||
requests.post(self.url, data, headers = self.header)
|
requests.post(self.url, data, headers = self.header)
|
||||||
|
|
||||||
def insertData(self, threadID):
|
def insertData(self, threadID):
|
||||||
|
@ -43,17 +46,42 @@ class RestfulInsert:
|
||||||
tableID = i + threadID * tablesPerThread
|
tableID = i + threadID * tablesPerThread
|
||||||
start = self.ts
|
start = self.ts
|
||||||
for j in range(int(self.recordsPerTable / self.batchSize)):
|
for j in range(int(self.recordsPerTable / self.batchSize)):
|
||||||
data = "insert into test.%s%d values" % (self.tableNamePerfix, tableID)
|
data = "insert into %s.%s%d values" % (self.dbname, self.tableNamePerfix, tableID)
|
||||||
|
values = []
|
||||||
for k in range(self.batchSize):
|
for k in range(self.batchSize):
|
||||||
data += "(%d, %d, %d, %d)" % (start + j * self.batchSize + k, random.randint(1, 100), random.randint(1, 100), random.randint(1, 100))
|
data += "(%d, %d, %d, %d)" % (start + j * self.batchSize + k, random.randint(1, 100), random.randint(1, 100), random.randint(1, 100))
|
||||||
|
requests.post(self.url, data, headers = self.header)
|
||||||
|
|
||||||
|
def insertUnlimitedData(self, threadID):
|
||||||
|
print("thread %d started" % threadID)
|
||||||
|
tablesPerThread = int (self.numOfTables / self.numOfThreads)
|
||||||
|
while True:
|
||||||
|
i = 0
|
||||||
|
start = self.ts
|
||||||
|
|
||||||
|
for i in range(tablesPerThread):
|
||||||
|
tableID = i + threadID * tablesPerThread
|
||||||
|
|
||||||
|
data = "insert into %s.%s%d values" % (self.dbname, self.tableNamePerfix, tableID)
|
||||||
|
values = []
|
||||||
|
for k in range(self.batchSize):
|
||||||
|
values.append("(%d, %d, %d, %d)" % (start + j * self.batchSize + k, random.randint(1, 100), random.randint(1, 100), random.randint(1, 100)))
|
||||||
|
|
||||||
|
if(self.outOfOrder == False):
|
||||||
|
for k in range(len(values)):
|
||||||
|
data += values[k]
|
||||||
|
else:
|
||||||
|
random.shuffle(values)
|
||||||
|
for k in range(len(values)):
|
||||||
|
data += values[k]
|
||||||
requests.post(self.url, data, headers = self.header)
|
requests.post(self.url, data, headers = self.header)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
data = "drop database if exists test"
|
data = "drop database if exists %s" % self.dbname
|
||||||
requests.post(self.url, data, headers = self.header)
|
requests.post(self.url, data, headers = self.header)
|
||||||
data = "create database test"
|
data = "create database %s" % self.dbname
|
||||||
requests.post(self.url, data, headers = self.header)
|
requests.post(self.url, data, headers = self.header)
|
||||||
data = "create table test.meters(ts timestamp, f1 int, f2 int, f3 int) tags(id int, loc nchar(20))"
|
data = "create table %s.meters(ts timestamp, f1 int, f2 int, f3 int) tags(id int, loc nchar(20))" % self.dbname
|
||||||
requests.post(self.url, data, headers = self.header)
|
requests.post(self.url, data, headers = self.header)
|
||||||
|
|
||||||
threads = []
|
threads = []
|
||||||
|
@ -70,7 +98,10 @@ class RestfulInsert:
|
||||||
threads = []
|
threads = []
|
||||||
startTime = time.time()
|
startTime = time.time()
|
||||||
for i in range(self.numOfThreads):
|
for i in range(self.numOfThreads):
|
||||||
thread = threading.Thread(target=self.insertData, args=(i,))
|
if(self.recordsPerTable != -1):
|
||||||
|
thread = threading.Thread(target=self.insertData, args=(i,))
|
||||||
|
else:
|
||||||
|
thread = threading.Thread(target=self.insertUnlimitedData, args=(i,))
|
||||||
thread.start()
|
thread.start()
|
||||||
threads.append(thread)
|
threads.append(thread)
|
||||||
|
|
||||||
|
@ -78,6 +109,62 @@ class RestfulInsert:
|
||||||
threads[i].join()
|
threads[i].join()
|
||||||
print("inserting %d records takes %d seconds" % (self.numOfTables * self.recordsPerTable, (time.time() - startTime)))
|
print("inserting %d records takes %d seconds" % (self.numOfTables * self.recordsPerTable, (time.time() - startTime)))
|
||||||
|
|
||||||
ri = RestfulInsert()
|
parser = argparse.ArgumentParser()
|
||||||
ri.init()
|
parser.add_argument(
|
||||||
|
'-H',
|
||||||
|
'--host-name',
|
||||||
|
action='store',
|
||||||
|
default='127.0.0.1',
|
||||||
|
type=str,
|
||||||
|
help='host name to be connected (default: 127.0.0.1)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-d',
|
||||||
|
'--db-name',
|
||||||
|
action='store',
|
||||||
|
default='test',
|
||||||
|
type=str,
|
||||||
|
help='Database name to be created (default: test)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-t',
|
||||||
|
'--number-of-threads',
|
||||||
|
action='store',
|
||||||
|
default=10,
|
||||||
|
type=int,
|
||||||
|
help='Number of threads to create tables and insert datas (default: 10)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-T',
|
||||||
|
'--number-of-tables',
|
||||||
|
action='store',
|
||||||
|
default=1000,
|
||||||
|
type=int,
|
||||||
|
help='Number of tables to be created (default: 1000)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-r',
|
||||||
|
'--number-of-records',
|
||||||
|
action='store',
|
||||||
|
default=1000,
|
||||||
|
type=int,
|
||||||
|
help='Number of record to be created for each table (default: 1000, -1 for unlimited records)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-s',
|
||||||
|
'--batch-size',
|
||||||
|
action='store',
|
||||||
|
default='1000',
|
||||||
|
type=int,
|
||||||
|
help='Number of tables to be created (default: 1000)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-p',
|
||||||
|
'--table-name-prefix',
|
||||||
|
action='store',
|
||||||
|
default='t',
|
||||||
|
type=str,
|
||||||
|
help='Number of tables to be created (default: 1000)')
|
||||||
|
parser.add_argument(
|
||||||
|
'-o',
|
||||||
|
'--out-of-order',
|
||||||
|
action='store_true',
|
||||||
|
help='The order of test data (default: False)')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
ri = RestfulInsert(args.host_name, args.db_name, args.number_of_threads, args.number_of_tables, args.number_of_records, args.batch_size, args.table_name_prefix, args.out_of_order)
|
||||||
ri.run()
|
ri.run()
|
Loading…
Reference in New Issue