未验证 提交 1c106bfd 编写于 作者: S Shengliang Guan 提交者: GitHub

Merge pull request #17235 from taosdata/feat/TD-17777-V30

feat(shell): Supported the word completed by press Tab key for 3.0
...@@ -33,38 +33,35 @@ ...@@ -33,38 +33,35 @@
typedef struct STireNode { typedef struct STireNode {
struct STireNode** d; struct STireNode** d;
bool end; // record end flag bool end; // record end flag
}STireNode; } STireNode;
typedef struct StrName { typedef struct StrName {
char * name; char* name;
struct StrName * next; struct StrName* next;
}StrName; } StrName;
typedef struct STire { typedef struct STire {
char type; // see define TIRE_ char type; // see define TIRE_
STireNode root; STireNode root;
StrName * head; StrName* head;
StrName * tail; StrName* tail;
int count; // all count int count; // all count
int ref; int ref;
}STire; } STire;
typedef struct SMatchNode { typedef struct SMatchNode {
char* word; char* word;
struct SMatchNode* next; struct SMatchNode* next;
}SMatchNode; } SMatchNode;
typedef struct SMatch { typedef struct SMatch {
SMatchNode* head; SMatchNode* head;
SMatchNode* tail; // append node to tail SMatchNode* tail; // append node to tail
int count; int count;
char pre[MAX_WORD_LEN]; char pre[MAX_WORD_LEN];
}SMatch; } SMatch;
// ----------- interface ------------- // ----------- interface -------------
......
...@@ -25,40 +25,40 @@ ...@@ -25,40 +25,40 @@
// //
#define UNION_ALL " union all " #define UNION_ALL " union all "
// extern function // extern function
void shellClearScreen(int32_t ecmd_pos, int32_t cursor_pos); void shellClearScreen(int32_t ecmd_pos, int32_t cursor_pos);
void shellGetPrevCharSize(const char *str, int32_t pos, int32_t *size, int32_t *width); void shellGetPrevCharSize(const char* str, int32_t pos, int32_t* size, int32_t* width);
void shellShowOnScreen(SShellCmd *cmd); void shellShowOnScreen(SShellCmd* cmd);
void shellInsertChar(SShellCmd *cmd, char *c, int size); void shellInsertChar(SShellCmd* cmd, char* c, int size);
bool appendAfterSelect(TAOS * con, SShellCmd * cmd, char* p, int32_t len); bool appendAfterSelect(TAOS* con, SShellCmd* cmd, char* p, int32_t len);
typedef struct SAutoPtr { typedef struct SAutoPtr {
STire* p; STire* p;
int ref; int ref;
}SAutoPtr; } SAutoPtr;
typedef struct SWord{ typedef struct SWord {
int type ; // word type , see WT_ define int type; // word type , see WT_ define
char * word; char* word;
int32_t len; int32_t len;
struct SWord * next; struct SWord* next;
bool free; // if true need free bool free; // if true need free
}SWord; } SWord;
typedef struct { typedef struct {
char * source; char* source;
int32_t source_len; // valid data length in source int32_t source_len; // valid data length in source
int32_t count; int32_t count;
SWord* head; SWord* head;
// matched information // matched information
int32_t matchIndex; // matched word index in words int32_t matchIndex; // matched word index in words
int32_t matchLen; // matched length at matched word int32_t matchLen; // matched length at matched word
}SWords; } SWords;
SWords shellCommands[] = { SWords shellCommands[] = {
{"alter database <db_name> <alter_db_options> <anyword> <alter_db_options> <anyword> <alter_db_options> <anyword> <alter_db_options> <anyword> <alter_db_options> <anyword> ;", 0, 0, NULL}, {"alter database <db_name> <alter_db_options> <anyword> <alter_db_options> <anyword> <alter_db_options> <anyword> "
"<alter_db_options> <anyword> <alter_db_options> <anyword> ;",
0, 0, NULL},
{"alter dnode <dnode_id> balance ", 0, 0, NULL}, {"alter dnode <dnode_id> balance ", 0, 0, NULL},
{"alter dnode <dnode_id> resetlog;", 0, 0, NULL}, {"alter dnode <dnode_id> resetlog;", 0, 0, NULL},
{"alter dnode <dnode_id> debugFlag 141;", 0, 0, NULL}, {"alter dnode <dnode_id> debugFlag 141;", 0, 0, NULL},
...@@ -80,7 +80,10 @@ SWords shellCommands[] = { ...@@ -80,7 +80,10 @@ SWords shellCommands[] = {
{"alter user <user_name> <user_actions> <anyword> ;", 0, 0, NULL}, {"alter user <user_name> <user_actions> <anyword> ;", 0, 0, NULL},
// 20 // 20
{"create table <anyword> using <stb_name> tags(", 0, 0, NULL}, {"create table <anyword> using <stb_name> tags(", 0, 0, NULL},
{"create database <anyword> <db_options> <anyword> <db_options> <anyword> <db_options> <anyword> <db_options> <anyword> <db_options> <anyword> <db_options> <anyword> <db_options> <anyword> <db_options> <anyword> <db_options> <anyword> <db_options> <anyword> ;", 0, 0, NULL}, {"create database <anyword> <db_options> <anyword> <db_options> <anyword> <db_options> <anyword> <db_options> "
"<anyword> <db_options> <anyword> <db_options> <anyword> <db_options> <anyword> <db_options> <anyword> "
"<db_options> <anyword> <db_options> <anyword> ;",
0, 0, NULL},
{"create dnode ", 0, 0, NULL}, {"create dnode ", 0, 0, NULL},
{"create index ", 0, 0, NULL}, {"create index ", 0, 0, NULL},
{"create mnode on dnode <dnode_id> ;", 0, 0, NULL}, {"create mnode on dnode <dnode_id> ;", 0, 0, NULL},
...@@ -142,11 +145,11 @@ SWords shellCommands[] = { ...@@ -142,11 +145,11 @@ SWords shellCommands[] = {
// 80 // 80
{"show query <anyword> ;", 0, 0, NULL}, {"show query <anyword> ;", 0, 0, NULL},
{"show qnodes;", 0, 0, NULL}, {"show qnodes;", 0, 0, NULL},
{"show snodes;", 0, 0, NULL},
{"show stables;", 0, 0, NULL}, {"show stables;", 0, 0, NULL},
{"show stables like ", 0, 0, NULL}, {"show stables like ", 0, 0, NULL},
{"show streams;", 0, 0, NULL}, {"show streams;", 0, 0, NULL},
{"show scores;", 0, 0, NULL}, {"show scores;", 0, 0, NULL},
{"show snodes;", 0, 0, NULL},
{"show subscriptions;", 0, 0, NULL}, {"show subscriptions;", 0, 0, NULL},
{"show tables;", 0, 0, NULL}, {"show tables;", 0, 0, NULL},
{"show tables like", 0, 0, NULL}, {"show tables like", 0, 0, NULL},
...@@ -169,126 +172,57 @@ SWords shellCommands[] = { ...@@ -169,126 +172,57 @@ SWords shellCommands[] = {
{"insert into <tb_name> file ", 0, 0, NULL}, {"insert into <tb_name> file ", 0, 0, NULL},
{"trim database <db_name>", 0, 0, NULL}, {"trim database <db_name>", 0, 0, NULL},
{"use <db_name>", 0, 0, NULL}, {"use <db_name>", 0, 0, NULL},
{"quit", 0, 0, NULL} {"quit", 0, 0, NULL}};
};
char* keywords[] = {
char * keywords[] = { "and ", "asc ", "desc ", "from ", "fill(", "limit ", "where ",
"and ", "interval(", "order by ", "order by ", "offset ", "or ", "group by ", "now()",
"asc ", "session(", "sliding ", "slimit ", "soffset ", "state_window(", "today() ", "union all select ",
"desc ", "partition by "};
"from ",
"fill(", char* functions[] = {
"limit ", "count(", "sum(",
"where ", "avg(", "last(",
"interval(", "last_row(", "top(",
"order by ", "interp(", "max(",
"order by ", "min(", "now()",
"offset ", "today()", "percentile(",
"or ", "tail(", "pow(",
"group by ", "abs(", "atan(",
"now()", "acos(", "asin(",
"session(", "apercentile(", "bottom(",
"sliding ", "cast(", "ceil(",
"slimit ", "char_length(", "cos(",
"soffset ", "concat(", "concat_ws(",
"state_window(", "csum(", "diff(",
"today() ", "derivative(", "elapsed(",
"union all select ", "first(", "floor(",
"partition by " "hyperloglog(", "histogram(",
}; "irate(", "leastsquares(",
"length(", "log(",
char * functions[] = { "lower(", "ltrim(",
"count(", "mavg(", "mode(",
"sum(", "tan(", "round(",
"avg(", "rtrim(", "sample(",
"last(", "sin(", "spread(",
"last_row(", "substr(", "statecount(",
"top(", "stateduration(", "stddev(",
"interp(", "sqrt(", "timediff(",
"max(", "timezone(", "timetruncate(",
"min(", "twa(", "to_unixtimestamp(",
"now()", "unique(", "upper(",
"today()",
"percentile(",
"tail(",
"pow(",
"abs(",
"atan(",
"acos(",
"asin(",
"apercentile(",
"bottom(",
"cast(",
"ceil(",
"char_length(",
"cos(",
"concat(",
"concat_ws(",
"csum(",
"diff(",
"derivative(",
"elapsed(",
"first(",
"floor(",
"hyperloglog(",
"histogram(",
"irate(",
"leastsquares(",
"length(",
"log(",
"lower(",
"ltrim(",
"mavg(",
"mode(",
"tan(",
"round(",
"rtrim(",
"sample(",
"sin(",
"spread(",
"substr(",
"statecount(",
"stateduration(",
"stddev(",
"sqrt(",
"timediff(",
"timezone(",
"timetruncate(",
"twa(",
"to_unixtimestamp(",
"unique(",
"upper(",
}; };
char * tb_actions[] = { char* tb_actions[] = {
"add column ", "add column ", "modify column ", "drop column ", "rename column ", "add tag ",
"modify column ", "modify tag ", "drop tag ", "rename tag ", "set tag ",
"drop column ",
"rename column ",
"add tag ",
"modify tag ",
"drop tag ",
"rename tag ",
"set tag ",
}; };
char * user_actions[] = { char* user_actions[] = {"pass ", "enable ", "sysinfo "};
"pass ",
"enable ",
"sysinfo "
};
char * tb_options[] = { char* tb_options[] = {"comment ", "watermark ", "max_delay ", "ttl ", "rollup(", "sma("};
"comment ",
"watermark ",
"max_delay ",
"ttl ",
"rollup(",
"sma("
};
char * db_options[] = { char* db_options[] = {"keep ",
"keep ",
"replica ", "replica ",
"precision ", "precision ",
"strict ", "strict ",
...@@ -309,43 +243,22 @@ char * db_options[] = { ...@@ -309,43 +243,22 @@ char * db_options[] = {
"wal_retention_period ", "wal_retention_period ",
"wal_roll_period ", "wal_roll_period ",
"wal_retention_size ", "wal_retention_size ",
"wal_segment_size " "wal_segment_size "};
};
char * alter_db_options[] = { char* alter_db_options[] = {"keep ", "cachemodel ", "cachesize ", "wal_fsync_period ", "wal_level "};
"keep ",
"cachemodel ",
"cachesize ",
"wal_fsync_period ",
"wal_level "
};
char * data_types[] = { char* data_types[] = {"timestamp", "int",
"timestamp", "int unsigned", "varchar(16)",
"int", "float", "double",
"int unsigned", "binary(16)", "nchar(16)",
"varchar(16)", "bigint", "bigint unsigned",
"float", "smallint", "smallint unsigned",
"double", "tinyint", "tinyint unsigned",
"binary(16)", "bool", "json"};
"nchar(16)",
"bigint",
"bigint unsigned",
"smallint",
"smallint unsigned",
"tinyint",
"tinyint unsigned",
"bool",
"json"
};
char * key_tags[] = { char* key_tags[] = {"tags("};
"tags("
};
char * key_select[] = { char* key_select[] = {"select "};
"select "
};
// //
// ------- gobal variant define --------- // ------- gobal variant define ---------
...@@ -356,7 +269,6 @@ int32_t curMatchIndex = -1; // current match shellCommands index ...@@ -356,7 +269,6 @@ int32_t curMatchIndex = -1; // current match shellCommands index
int32_t lastWordBytes = -1; // printShow last word length int32_t lastWordBytes = -1; // printShow last word length
bool waitAutoFill = false; bool waitAutoFill = false;
// //
// ----------- global var array define ----------- // ----------- global var array define -----------
// //
...@@ -380,7 +292,6 @@ bool waitAutoFill = false; ...@@ -380,7 +292,6 @@ bool waitAutoFill = false;
#define WT_VAR_USERACTION 17 #define WT_VAR_USERACTION 17
#define WT_VAR_KEYSELECT 18 #define WT_VAR_KEYSELECT 18
#define WT_VAR_CNT 19 #define WT_VAR_CNT 19
#define WT_FROM_DB_MAX 6 // max get content from db #define WT_FROM_DB_MAX 6 // max get content from db
...@@ -392,53 +303,26 @@ char dbName[256] = ""; // save use database name; ...@@ -392,53 +303,26 @@ char dbName[256] = ""; // save use database name;
// tire array // tire array
STire* tires[WT_VAR_CNT]; STire* tires[WT_VAR_CNT];
TdThreadMutex tiresMutex; TdThreadMutex tiresMutex;
//save thread handle obtain var name from db server // save thread handle obtain var name from db server
TdThread* threads[WT_FROM_DB_CNT]; TdThread* threads[WT_FROM_DB_CNT];
// obtain var name with sql from server // obtain var name with sql from server
char varTypes[WT_VAR_CNT][64] = { char varTypes[WT_VAR_CNT][64] = {"<db_name>", "<stb_name>", "<tb_name>", "<dnode_id>", "<user_name>",
"<db_name>", "<topic_name>", "<stream_name>", "<all_table>", "<function>", "<keyword>",
"<stb_name>", "<tb_actions>", "<db_options>", "<alter_db_options>", "<data_types>", "<key_tags>",
"<tb_name>", "<anyword>", "<tb_options>", "<user_actions>", "<key_select>"};
"<dnode_id>",
"<user_name>",
"<topic_name>",
"<stream_name>",
"<all_table>",
"<function>",
"<keyword>",
"<tb_actions>",
"<db_options>",
"<alter_db_options>",
"<data_types>",
"<key_tags>",
"<anyword>",
"<tb_options>",
"<user_actions>",
"<key_select>"
};
char varSqls[WT_FROM_DB_CNT][64] = {
"show databases;",
"show stables;",
"show tables;",
"show dnodes;",
"show users;",
"show topics;",
"show streams;"
};
char varSqls[WT_FROM_DB_CNT][64] = {"show databases;", "show stables;", "show tables;", "show dnodes;",
"show users;", "show topics;", "show streams;"};
// var words current cursor, if user press any one key except tab, cursorVar can be reset to -1 // var words current cursor, if user press any one key except tab, cursorVar can be reset to -1
int cursorVar = -1; int cursorVar = -1;
bool varMode = false; // enter var names list mode bool varMode = false; // enter var names list mode
TAOS* varCon = NULL; TAOS* varCon = NULL;
SShellCmd* varCmd = NULL; SShellCmd* varCmd = NULL;
SMatch* lastMatch = NULL; // save last match result SMatch* lastMatch = NULL; // save last match result
int cntDel = 0; // delete byte count after next press tab int cntDel = 0; // delete byte count after next press tab
// show auto tab introduction // show auto tab introduction
void printfIntroduction() { void printfIntroduction() {
printf(" **************************** How To Use TAB Key ********************************\n"); printf(" **************************** How To Use TAB Key ********************************\n");
...@@ -459,7 +343,8 @@ void printfIntroduction() { ...@@ -459,7 +343,8 @@ void printfIntroduction() {
void showHelp() { void showHelp() {
printf("\nThe following are supported commands for TDengine Command Line:"); printf("\nThe following are supported commands for TDengine Command Line:");
printf("\n\ printf(
"\n\
----- A ----- \n\ ----- A ----- \n\
alter database <db_name> <db_options> \n\ alter database <db_name> <db_options> \n\
alter dnode <dnode_id> balance \n\ alter dnode <dnode_id> balance \n\
...@@ -573,8 +458,9 @@ void showHelp() { ...@@ -573,8 +458,9 @@ void showHelp() {
printf("\n\n"); printf("\n\n");
//define in getDuration() function // define in getDuration() function
printf("\ printf(
"\
Timestamp expression Format:\n\ Timestamp expression Format:\n\
b - nanosecond \n\ b - nanosecond \n\
u - microsecond \n\ u - microsecond \n\
...@@ -597,11 +483,10 @@ void showHelp() { ...@@ -597,11 +483,10 @@ void showHelp() {
#define SHELL_COMMAND_COUNT() (sizeof(shellCommands) / sizeof(SWords)) #define SHELL_COMMAND_COUNT() (sizeof(shellCommands) / sizeof(SWords))
// get at // get at
SWord * atWord(SWords * command, int32_t index) { SWord* atWord(SWords* command, int32_t index) {
SWord * word = command->head; SWord* word = command->head;
for (int32_t i = 0; i < index; i++) { for (int32_t i = 0; i < index; i++) {
if (word == NULL) if (word == NULL) return NULL;
return NULL;
word = word->next; word = word->next;
} }
...@@ -612,17 +497,16 @@ SWord * atWord(SWords * command, int32_t index) { ...@@ -612,17 +497,16 @@ SWord * atWord(SWords * command, int32_t index) {
int wordType(const char* p, int32_t len) { int wordType(const char* p, int32_t len) {
for (int i = 0; i < WT_VAR_CNT; i++) { for (int i = 0; i < WT_VAR_CNT; i++) {
if (strncmp(p, varTypes[i], len) == 0) if (strncmp(p, varTypes[i], len) == 0) return i;
return i;
} }
return WT_TEXT; return WT_TEXT;
} }
// add word // add word
SWord * addWord(const char* p, int32_t len, bool pattern) { SWord* addWord(const char* p, int32_t len, bool pattern) {
SWord* word = (SWord *) taosMemoryMalloc(sizeof(SWord)); SWord* word = (SWord*)taosMemoryMalloc(sizeof(SWord));
memset(word, 0, sizeof(SWord)); memset(word, 0, sizeof(SWord));
word->word = (char* )p; word->word = (char*)p;
word->len = len; word->len = len;
// check format // check format
...@@ -636,8 +520,8 @@ SWord * addWord(const char* p, int32_t len, bool pattern) { ...@@ -636,8 +520,8 @@ SWord * addWord(const char* p, int32_t len, bool pattern) {
} }
// parse one command // parse one command
void parseCommand(SWords * command, bool pattern) { void parseCommand(SWords* command, bool pattern) {
char * p = command->source; char* p = command->source;
int32_t start = 0; int32_t start = 0;
int32_t size = command->source_len > 0 ? command->source_len : strlen(p); int32_t size = command->source_len > 0 ? command->source_len : strlen(p);
...@@ -647,12 +531,12 @@ void parseCommand(SWords * command, bool pattern) { ...@@ -647,12 +531,12 @@ void parseCommand(SWords * command, bool pattern) {
// check continue blank like ' ' // check continue blank like ' '
if (p[i] == ' ') { if (p[i] == ' ') {
if (lastBlank) { if (lastBlank) {
start ++; start++;
continue; continue;
} }
if (i == 0) { // first blank if (i == 0) { // first blank
lastBlank = true; lastBlank = true;
start ++; start++;
continue; continue;
} }
lastBlank = true; lastBlank = true;
...@@ -663,12 +547,12 @@ void parseCommand(SWords * command, bool pattern) { ...@@ -663,12 +547,12 @@ void parseCommand(SWords * command, bool pattern) {
command->head = addWord(p + start, i - start, pattern); command->head = addWord(p + start, i - start, pattern);
command->count = 1; command->count = 1;
} else { } else {
SWord * word = command->head; SWord* word = command->head;
while (word->next) { while (word->next) {
word = word->next; word = word->next;
} }
word->next = addWord(p + start, i - start, pattern); word->next = addWord(p + start, i - start, pattern);
command->count ++; command->count++;
} }
start = i + 1; start = i + 1;
} else { } else {
...@@ -678,25 +562,23 @@ void parseCommand(SWords * command, bool pattern) { ...@@ -678,25 +562,23 @@ void parseCommand(SWords * command, bool pattern) {
} }
// free SShellCmd // free SShellCmd
void freeCommand(SWords * command) { void freeCommand(SWords* command) {
SWord * word = command->head; SWord* word = command->head;
if (word == NULL) { if (word == NULL) {
return ; return;
} }
// loop // loop
while (word->next) { while (word->next) {
SWord * tmp = word; SWord* tmp = word;
word = word->next; word = word->next;
// if malloc need free // if malloc need free
if(tmp->free && tmp->word) if (tmp->free && tmp->word) taosMemoryFree(tmp->word);
taosMemoryFree(tmp->word);
taosMemoryFree(tmp); taosMemoryFree(tmp);
} }
// if malloc need free // if malloc need free
if(word->free && word->word) if (word->free && word->word) taosMemoryFree(word->word);
taosMemoryFree(word->word);
taosMemoryFree(word); taosMemoryFree(word);
} }
...@@ -715,12 +597,11 @@ void GenerateVarType(int type, char** p, int count) { ...@@ -715,12 +597,11 @@ void GenerateVarType(int type, char** p, int count) {
// -------------------- shell auto ---------------- // -------------------- shell auto ----------------
// //
// init shell auto funciton , shell start call once // init shell auto funciton , shell start call once
bool shellAutoInit() { bool shellAutoInit() {
// command // command
int32_t count = SHELL_COMMAND_COUNT(); int32_t count = SHELL_COMMAND_COUNT();
for (int32_t i = 0; i < count; i ++) { for (int32_t i = 0; i < count; i++) {
parseCommand(shellCommands + i, true); parseCommand(shellCommands + i, true);
} }
...@@ -732,30 +613,28 @@ bool shellAutoInit() { ...@@ -732,30 +613,28 @@ bool shellAutoInit() {
memset(threads, 0, sizeof(TdThread*) * WT_FROM_DB_CNT); memset(threads, 0, sizeof(TdThread*) * WT_FROM_DB_CNT);
// generate varType // generate varType
GenerateVarType(WT_VAR_FUNC, functions, sizeof(functions) /sizeof(char *)); GenerateVarType(WT_VAR_FUNC, functions, sizeof(functions) / sizeof(char*));
GenerateVarType(WT_VAR_KEYWORD, keywords, sizeof(keywords) /sizeof(char *)); GenerateVarType(WT_VAR_KEYWORD, keywords, sizeof(keywords) / sizeof(char*));
GenerateVarType(WT_VAR_DBOPTION, db_options, sizeof(db_options) /sizeof(char *)); GenerateVarType(WT_VAR_DBOPTION, db_options, sizeof(db_options) / sizeof(char*));
GenerateVarType(WT_VAR_ALTER_DBOPTION, alter_db_options, sizeof(alter_db_options) /sizeof(char *)); GenerateVarType(WT_VAR_ALTER_DBOPTION, alter_db_options, sizeof(alter_db_options) / sizeof(char*));
GenerateVarType(WT_VAR_TBACTION, tb_actions, sizeof(tb_actions) /sizeof(char *)); GenerateVarType(WT_VAR_TBACTION, tb_actions, sizeof(tb_actions) / sizeof(char*));
GenerateVarType(WT_VAR_DATATYPE, data_types, sizeof(data_types) /sizeof(char *)); GenerateVarType(WT_VAR_DATATYPE, data_types, sizeof(data_types) / sizeof(char*));
GenerateVarType(WT_VAR_KEYTAGS, key_tags, sizeof(key_tags) /sizeof(char *)); GenerateVarType(WT_VAR_KEYTAGS, key_tags, sizeof(key_tags) / sizeof(char*));
GenerateVarType(WT_VAR_TBOPTION, tb_options, sizeof(tb_options) /sizeof(char *)); GenerateVarType(WT_VAR_TBOPTION, tb_options, sizeof(tb_options) / sizeof(char*));
GenerateVarType(WT_VAR_USERACTION, user_actions, sizeof(user_actions) /sizeof(char *)); GenerateVarType(WT_VAR_USERACTION, user_actions, sizeof(user_actions) / sizeof(char*));
GenerateVarType(WT_VAR_KEYSELECT,key_select, sizeof(key_select) /sizeof(char *)); GenerateVarType(WT_VAR_KEYSELECT, key_select, sizeof(key_select) / sizeof(char*));
return true; return true;
} }
// set conn // set conn
void shellSetConn(TAOS* conn) { void shellSetConn(TAOS* conn) { varCon = conn; }
varCon = conn;
}
// exit shell auto funciton, shell exit call once // exit shell auto funciton, shell exit call once
void shellAutoExit() { void shellAutoExit() {
// free command // free command
int32_t count = SHELL_COMMAND_COUNT(); int32_t count = SHELL_COMMAND_COUNT();
for (int32_t i = 0; i < count; i ++) { for (int32_t i = 0; i < count; i++) {
freeCommand(shellCommands + i); freeCommand(shellCommands + i);
} }
...@@ -790,8 +669,7 @@ void shellAutoExit() { ...@@ -790,8 +669,7 @@ void shellAutoExit() {
// ------------------- auto ptr for tires -------------------------- // ------------------- auto ptr for tires --------------------------
// //
bool setNewAuotPtr(int type, STire* pNew) { bool setNewAuotPtr(int type, STire* pNew) {
if (pNew == NULL) if (pNew == NULL) return false;
return false;
taosThreadMutexLock(&tiresMutex); taosThreadMutexLock(&tiresMutex);
STire* pOld = tires[type]; STire* pOld = tires[type];
...@@ -826,12 +704,12 @@ STire* getAutoPtr(int type) { ...@@ -826,12 +704,12 @@ STire* getAutoPtr(int type) {
// put back tire to tires[type], if tire not equal tires[type].p, need free tire // put back tire to tires[type], if tire not equal tires[type].p, need free tire
void putBackAutoPtr(int type, STire* tire) { void putBackAutoPtr(int type, STire* tire) {
if (tire == NULL) { if (tire == NULL) {
return ; return;
} }
taosThreadMutexLock(&tiresMutex); taosThreadMutexLock(&tiresMutex);
if (tires[type] != tire) { if (tires[type] != tire) {
//update by out, can't put back , so free // update by out, can't put back , so free
if (--tire->ref == 1) { if (--tire->ref == 1) {
// support multi thread getAuotPtr // support multi thread getAuotPtr
freeTire(tire); freeTire(tire);
...@@ -843,11 +721,9 @@ void putBackAutoPtr(int type, STire* tire) { ...@@ -843,11 +721,9 @@ void putBackAutoPtr(int type, STire* tire) {
} }
taosThreadMutexUnlock(&tiresMutex); taosThreadMutexUnlock(&tiresMutex);
return ; return;
} }
// //
// ------------------- var Word -------------------------- // ------------------- var Word --------------------------
// //
...@@ -861,7 +737,7 @@ int writeVarNames(int type, TAOS_RES* tres) { ...@@ -861,7 +737,7 @@ int writeVarNames(int type, TAOS_RES* tres) {
return 0; return 0;
} }
TAOS_FIELD *fields = taos_fetch_fields(tres); TAOS_FIELD* fields = taos_fetch_fields(tres);
// create new tires // create new tires
char tireType = type == WT_VAR_TABLE ? TIRE_TREE : TIRE_LIST; char tireType = type == WT_VAR_TABLE ? TIRE_TREE : TIRE_LIST;
STire* tire = createTire(tireType); STire* tire = createTire(tireType);
...@@ -872,17 +748,17 @@ int writeVarNames(int type, TAOS_RES* tres) { ...@@ -872,17 +748,17 @@ int writeVarNames(int type, TAOS_RES* tres) {
do { do {
int32_t* lengths = taos_fetch_lengths(tres); int32_t* lengths = taos_fetch_lengths(tres);
int32_t bytes = lengths[0]; int32_t bytes = lengths[0];
if(fields[0].type == TSDB_DATA_TYPE_INT) { if (fields[0].type == TSDB_DATA_TYPE_INT) {
sprintf(name,"%d", *(int16_t*)row[0]); sprintf(name, "%d", *(int16_t*)row[0]);
} else { } else {
memcpy(name, row[0], bytes); memcpy(name, row[0], bytes);
} }
name[bytes] = 0; //set string end name[bytes] = 0; // set string end
// insert to tire // insert to tire
insertWord(tire, name); insertWord(tire, name);
if (++numOfRows > MAX_CACHED_CNT ) { if (++numOfRows > MAX_CACHED_CNT) {
break; break;
} }
...@@ -895,12 +771,12 @@ int writeVarNames(int type, TAOS_RES* tres) { ...@@ -895,12 +771,12 @@ int writeVarNames(int type, TAOS_RES* tres) {
return numOfRows; return numOfRows;
} }
bool firstMatchCommand(TAOS * con, SShellCmd * cmd); bool firstMatchCommand(TAOS* con, SShellCmd* cmd);
// //
// thread obtain var thread from db server // thread obtain var thread from db server
// //
void* varObtainThread(void* param) { void* varObtainThread(void* param) {
int type = *(int* )param; int type = *(int*)param;
taosMemoryFree(param); taosMemoryFree(param);
if (varCon == NULL || type > WT_FROM_DB_MAX) { if (varCon == NULL || type > WT_FROM_DB_MAX) {
...@@ -952,8 +828,7 @@ char* matchNextPrefix(STire* tire, char* pre) { ...@@ -952,8 +828,7 @@ char* matchNextPrefix(STire* tire, char* pre) {
// save to lastMatch // save to lastMatch
if (match) { if (match) {
if (lastMatch) if (lastMatch) freeMatch(lastMatch);
freeMatch(lastMatch);
lastMatch = match; lastMatch = match;
} }
} }
...@@ -1008,11 +883,10 @@ char* tireSearchWord(int type, char* pre) { ...@@ -1008,11 +883,10 @@ char* tireSearchWord(int type, char* pre) {
return NULL; return NULL;
} }
if(type > WT_FROM_DB_MAX) { if (type > WT_FROM_DB_MAX) {
// NOT FROM DB , tires[type] alwary not null // NOT FROM DB , tires[type] alwary not null
STire* tire = tires[type]; STire* tire = tires[type];
if (tire == NULL) if (tire == NULL) return NULL;
return NULL;
return matchNextPrefix(tire, pre); return matchNextPrefix(tire, pre);
} }
...@@ -1035,8 +909,8 @@ char* tireSearchWord(int type, char* pre) { ...@@ -1035,8 +909,8 @@ char* tireSearchWord(int type, char* pre) {
} }
// create new // create new
void * param = taosMemoryMalloc(sizeof(int)); void* param = taosMemoryMalloc(sizeof(int));
*((int* )param) = type; *((int*)param) = type;
threads[type] = taosCreateThread(varObtainThread, param); threads[type] = taosCreateThread(varObtainThread, param);
taosThreadMutexUnlock(&tiresMutex); taosThreadMutexUnlock(&tiresMutex);
return NULL; return NULL;
...@@ -1069,8 +943,7 @@ bool matchVarWord(SWord* word1, SWord* word2) { ...@@ -1069,8 +943,7 @@ bool matchVarWord(SWord* word1, SWord* word2) {
str = tireSearchWord(WT_VAR_STABLE, pre); str = tireSearchWord(WT_VAR_STABLE, pre);
if (str == NULL) { if (str == NULL) {
str = tireSearchWord(WT_VAR_TABLE, pre); str = tireSearchWord(WT_VAR_TABLE, pre);
if(str == NULL) if (str == NULL) return false;
return false;
} }
} else { } else {
// OTHER // OTHER
...@@ -1082,7 +955,7 @@ bool matchVarWord(SWord* word1, SWord* word2) { ...@@ -1082,7 +955,7 @@ bool matchVarWord(SWord* word1, SWord* word2) {
} }
// free previous malloc // free previous malloc
if(word1->free && word1->word) { if (word1->free && word1->word) {
taosMemoryFree(word1->word); taosMemoryFree(word1->word);
} }
...@@ -1098,11 +971,10 @@ bool matchVarWord(SWord* word1, SWord* word2) { ...@@ -1098,11 +971,10 @@ bool matchVarWord(SWord* word1, SWord* word2) {
// ------------------- match words -------------------------- // ------------------- match words --------------------------
// //
// compare command cmd1 come from shellCommands , cmd2 come from user input // compare command cmd1 come from shellCommands , cmd2 come from user input
int32_t compareCommand(SWords * cmd1, SWords * cmd2) { int32_t compareCommand(SWords* cmd1, SWords* cmd2) {
SWord * word1 = cmd1->head; SWord* word1 = cmd1->head;
SWord * word2 = cmd2->head; SWord* word2 = cmd2->head;
if (word1 == NULL || word2 == NULL) { if (word1 == NULL || word2 == NULL) {
return -1; return -1;
...@@ -1112,8 +984,7 @@ int32_t compareCommand(SWords * cmd1, SWords * cmd2) { ...@@ -1112,8 +984,7 @@ int32_t compareCommand(SWords * cmd1, SWords * cmd2) {
if (word1->type == WT_TEXT) { if (word1->type == WT_TEXT) {
// WT_TEXT match // WT_TEXT match
if (word1->len == word2->len) { if (word1->len == word2->len) {
if (strncasecmp(word1->word, word2->word, word1->len) != 0) if (strncasecmp(word1->word, word2->word, word1->len) != 0) return -1;
return -1;
} else if (word1->len < word2->len) { } else if (word1->len < word2->len) {
return -1; return -1;
} else { } else {
...@@ -1151,10 +1022,10 @@ int32_t compareCommand(SWords * cmd1, SWords * cmd2) { ...@@ -1151,10 +1022,10 @@ int32_t compareCommand(SWords * cmd1, SWords * cmd2) {
} }
// match command // match command
SWords * matchCommand(SWords * input, bool continueSearch) { SWords* matchCommand(SWords* input, bool continueSearch) {
int32_t count = SHELL_COMMAND_COUNT(); int32_t count = SHELL_COMMAND_COUNT();
for (int32_t i = 0; i < count; i ++) { for (int32_t i = 0; i < count; i++) {
SWords * shellCommand = shellCommands + i; SWords* shellCommand = shellCommands + i;
if (continueSearch && lastMatchIndex != -1 && i <= lastMatchIndex) { if (continueSearch && lastMatchIndex != -1 && i <= lastMatchIndex) {
// new match must greate than lastMatchIndex // new match must greate than lastMatchIndex
if (varMode && i == lastMatchIndex) { if (varMode && i == lastMatchIndex) {
...@@ -1165,15 +1036,14 @@ SWords * matchCommand(SWords * input, bool continueSearch) { ...@@ -1165,15 +1036,14 @@ SWords * matchCommand(SWords * input, bool continueSearch) {
} }
// command is large // command is large
if (input->count > shellCommand->count ) { if (input->count > shellCommand->count) {
continue; continue;
} }
// compare // compare
int32_t index = compareCommand(shellCommand, input); int32_t index = compareCommand(shellCommand, input);
if (index != -1) { if (index != -1) {
if (firstMatchIndex == -1) if (firstMatchIndex == -1) firstMatchIndex = i;
firstMatchIndex = i;
curMatchIndex = i; curMatchIndex = i;
return &shellCommands[i]; return &shellCommands[i];
} }
...@@ -1188,7 +1058,7 @@ SWords * matchCommand(SWords * input, bool continueSearch) { ...@@ -1188,7 +1058,7 @@ SWords * matchCommand(SWords * input, bool continueSearch) {
// //
// delete char count // delete char count
void deleteCount(SShellCmd * cmd, int count) { void deleteCount(SShellCmd* cmd, int count) {
int size = 0; int size = 0;
int width = 0; int width = 0;
int prompt_size = 6; int prompt_size = 6;
...@@ -1207,30 +1077,29 @@ void deleteCount(SShellCmd * cmd, int count) { ...@@ -1207,30 +1077,29 @@ void deleteCount(SShellCmd * cmd, int count) {
} }
// show screen // show screen
void printScreen(TAOS * con, SShellCmd * cmd, SWords * match) { void printScreen(TAOS* con, SShellCmd* cmd, SWords* match) {
// modify SShellCmd // modify SShellCmd
if (firstMatchIndex == -1 || curMatchIndex == -1) { if (firstMatchIndex == -1 || curMatchIndex == -1) {
// no match // no match
return ; return;
} }
// first tab press // first tab press
const char * str = NULL; const char* str = NULL;
int strLen = 0; int strLen = 0;
if (firstMatchIndex == curMatchIndex && lastWordBytes == -1) { if (firstMatchIndex == curMatchIndex && lastWordBytes == -1) {
// first press tab // first press tab
SWord * word = MATCH_WORD(match); SWord* word = MATCH_WORD(match);
str = word->word + match->matchLen; str = word->word + match->matchLen;
strLen = word->len - match->matchLen; strLen = word->len - match->matchLen;
lastMatchIndex = firstMatchIndex; lastMatchIndex = firstMatchIndex;
lastWordBytes = word->len; lastWordBytes = word->len;
} else { } else {
if (lastWordBytes == -1) if (lastWordBytes == -1) return;
return ;
deleteCount(cmd, lastWordBytes); deleteCount(cmd, lastWordBytes);
SWord * word = MATCH_WORD(match); SWord* word = MATCH_WORD(match);
str = word->word; str = word->word;
strLen = word->len; strLen = word->len;
// set current to last // set current to last
...@@ -1239,14 +1108,13 @@ void printScreen(TAOS * con, SShellCmd * cmd, SWords * match) { ...@@ -1239,14 +1108,13 @@ void printScreen(TAOS * con, SShellCmd * cmd, SWords * match) {
} }
// insert new // insert new
shellInsertChar(cmd, (char *)str, strLen); shellInsertChar(cmd, (char*)str, strLen);
} }
// main key press tab , matched return true else false // main key press tab , matched return true else false
bool firstMatchCommand(TAOS * con, SShellCmd * cmd) { bool firstMatchCommand(TAOS* con, SShellCmd* cmd) {
// parse command // parse command
SWords* input = (SWords *)taosMemoryMalloc(sizeof(SWords)); SWords* input = (SWords*)taosMemoryMalloc(sizeof(SWords));
memset(input, 0, sizeof(SWords)); memset(input, 0, sizeof(SWords));
input->source = cmd->command; input->source = cmd->command;
input->source_len = cmd->commandSize; input->source_len = cmd->commandSize;
...@@ -1255,7 +1123,7 @@ bool firstMatchCommand(TAOS * con, SShellCmd * cmd) { ...@@ -1255,7 +1123,7 @@ bool firstMatchCommand(TAOS * con, SShellCmd * cmd) {
// if have many , default match first, if press tab again , switch to next // if have many , default match first, if press tab again , switch to next
curMatchIndex = -1; curMatchIndex = -1;
lastMatchIndex = -1; lastMatchIndex = -1;
SWords * match = matchCommand(input, true); SWords* match = matchCommand(input, true);
if (match == NULL) { if (match == NULL) {
// not match , nothing to do // not match , nothing to do
freeCommand(input); freeCommand(input);
...@@ -1271,14 +1139,14 @@ bool firstMatchCommand(TAOS * con, SShellCmd * cmd) { ...@@ -1271,14 +1139,14 @@ bool firstMatchCommand(TAOS * con, SShellCmd * cmd) {
} }
// create input source // create input source
void createInputFromFirst(SWords* input, SWords * firstMatch) { void createInputFromFirst(SWords* input, SWords* firstMatch) {
// //
// if next pressTabKey , input context come from firstMatch, set matched length with source_len // if next pressTabKey , input context come from firstMatch, set matched length with source_len
// //
input->source = (char*)taosMemoryMalloc(1024); input->source = (char*)taosMemoryMalloc(1024);
memset((void* )input->source, 0, 1024); memset((void*)input->source, 0, 1024);
SWord * word = firstMatch->head; SWord* word = firstMatch->head;
// source_len = full match word->len + half match with firstMatch->matchLen // source_len = full match word->len + half match with firstMatch->matchLen
for (int i = 0; i < firstMatch->matchIndex && word; i++) { for (int i = 0; i < firstMatch->matchIndex && word; i++) {
...@@ -1297,11 +1165,11 @@ void createInputFromFirst(SWords* input, SWords * firstMatch) { ...@@ -1297,11 +1165,11 @@ void createInputFromFirst(SWords* input, SWords * firstMatch) {
} }
// user press Tabkey again is named next , matched return true else false // user press Tabkey again is named next , matched return true else false
bool nextMatchCommand(TAOS * con, SShellCmd * cmd, SWords * firstMatch) { bool nextMatchCommand(TAOS* con, SShellCmd* cmd, SWords* firstMatch) {
if (firstMatch == NULL || firstMatch->head == NULL) { if (firstMatch == NULL || firstMatch->head == NULL) {
return false; return false;
} }
SWords* input = (SWords *)taosMemoryMalloc(sizeof(SWords)); SWords* input = (SWords*)taosMemoryMalloc(sizeof(SWords));
memset(input, 0, sizeof(SWords)); memset(input, 0, sizeof(SWords));
// create input from firstMatch // create input from firstMatch
...@@ -1311,7 +1179,7 @@ bool nextMatchCommand(TAOS * con, SShellCmd * cmd, SWords * firstMatch) { ...@@ -1311,7 +1179,7 @@ bool nextMatchCommand(TAOS * con, SShellCmd * cmd, SWords * firstMatch) {
parseCommand(input, false); parseCommand(input, false);
// if have many , default match first, if press tab again , switch to next // if have many , default match first, if press tab again , switch to next
SWords * match = matchCommand(input, true); SWords* match = matchCommand(input, true);
if (match == NULL) { if (match == NULL) {
// if not match , reset all index // if not match , reset all index
firstMatchIndex = -1; firstMatchIndex = -1;
...@@ -1319,8 +1187,7 @@ bool nextMatchCommand(TAOS * con, SShellCmd * cmd, SWords * firstMatch) { ...@@ -1319,8 +1187,7 @@ bool nextMatchCommand(TAOS * con, SShellCmd * cmd, SWords * firstMatch) {
match = matchCommand(input, false); match = matchCommand(input, false);
if (match == NULL) { if (match == NULL) {
freeCommand(input); freeCommand(input);
if (input->source) if (input->source) taosMemoryFree(input->source);
taosMemoryFree(input->source);
taosMemoryFree(input); taosMemoryFree(input);
return false; return false;
} }
...@@ -1341,7 +1208,7 @@ bool nextMatchCommand(TAOS * con, SShellCmd * cmd, SWords * firstMatch) { ...@@ -1341,7 +1208,7 @@ bool nextMatchCommand(TAOS * con, SShellCmd * cmd, SWords * firstMatch) {
} }
// fill with type // fill with type
bool fillWithType(TAOS * con, SShellCmd * cmd, char* pre, int type) { bool fillWithType(TAOS* con, SShellCmd* cmd, char* pre, int type) {
// get type // get type
STire* tire = tires[type]; STire* tire = tires[type];
char* str = matchNextPrefix(tire, pre); char* str = matchNextPrefix(tire, pre);
...@@ -1350,7 +1217,7 @@ bool fillWithType(TAOS * con, SShellCmd * cmd, char* pre, int type) { ...@@ -1350,7 +1217,7 @@ bool fillWithType(TAOS * con, SShellCmd * cmd, char* pre, int type) {
} }
// need insert part string // need insert part string
char * part = str + strlen(pre); char* part = str + strlen(pre);
// show // show
int count = strlen(part); int count = strlen(part);
...@@ -1362,20 +1229,19 @@ bool fillWithType(TAOS * con, SShellCmd * cmd, char* pre, int type) { ...@@ -1362,20 +1229,19 @@ bool fillWithType(TAOS * con, SShellCmd * cmd, char* pre, int type) {
} }
// fill with type // fill with type
bool fillTableName(TAOS * con, SShellCmd * cmd, char* pre) { bool fillTableName(TAOS* con, SShellCmd* cmd, char* pre) {
// search stable and table // search stable and table
char * str = tireSearchWord(WT_VAR_STABLE, pre); char* str = tireSearchWord(WT_VAR_STABLE, pre);
if (str == NULL) { if (str == NULL) {
str = tireSearchWord(WT_VAR_TABLE, pre); str = tireSearchWord(WT_VAR_TABLE, pre);
if(str == NULL) if (str == NULL) return false;
return false;
} }
// need insert part string // need insert part string
char * part = str + strlen(pre); char* part = str + strlen(pre);
// delete autofill count last append // delete autofill count last append
if(cntDel > 0) { if (cntDel > 0) {
deleteCount(cmd, cntDel); deleteCount(cmd, cntDel);
cntDel = 0; cntDel = 0;
} }
...@@ -1396,16 +1262,16 @@ bool fillTableName(TAOS * con, SShellCmd * cmd, char* pre) { ...@@ -1396,16 +1262,16 @@ bool fillTableName(TAOS * con, SShellCmd * cmd, char* pre) {
// 2 select count(*),su -> select count(*), sum( // 2 select count(*),su -> select count(*), sum(
// 3 select count(*), su -> select count(*), sum( // 3 select count(*), su -> select count(*), sum(
// //
char * lastWord(char * p) { char* lastWord(char* p) {
// get near from end revert find ' ' and ',' // get near from end revert find ' ' and ','
char * p1 = strrchr(p, ' '); char* p1 = strrchr(p, ' ');
char * p2 = strrchr(p, ','); char* p2 = strrchr(p, ',');
if (p1 && p2) { if (p1 && p2) {
return p1 > p2 ? p1 : p2 + 1; return p1 > p2 ? p1 : p2 + 1;
} else if (p1) { } else if (p1) {
return p1 + 1; return p1 + 1;
} else if(p2) { } else if (p2) {
return p2 + 1; return p2 + 1;
} else { } else {
return p; return p;
...@@ -1425,18 +1291,18 @@ bool fieldsInputEnd(char* sql) { ...@@ -1425,18 +1291,18 @@ bool fieldsInputEnd(char* sql) {
} }
// not in ',' // not in ','
char * p3 = strrchr(sql, ','); char* p3 = strrchr(sql, ',');
char * p = p3; char* p = p3;
// like select ts, age,' ' // like select ts, age,' '
if (p) { if (p) {
++p; ++p;
bool allBlank = true; // after last ',' all char is blank bool allBlank = true; // after last ',' all char is blank
int cnt = 0; // blank count , like ' ' as one blank int cnt = 0; // blank count , like ' ' as one blank
char * plast = NULL; // last blank position char* plast = NULL; // last blank position
while(*p) { while (*p) {
if (*p == ' ') { if (*p == ' ') {
plast = p; plast = p;
cnt ++; cnt++;
} else { } else {
allBlank = false; allBlank = false;
} }
...@@ -1444,7 +1310,7 @@ bool fieldsInputEnd(char* sql) { ...@@ -1444,7 +1310,7 @@ bool fieldsInputEnd(char* sql) {
} }
// any one word is not blank // any one word is not blank
if(allBlank) { if (allBlank) {
return false; return false;
} }
...@@ -1454,13 +1320,13 @@ bool fieldsInputEnd(char* sql) { ...@@ -1454,13 +1320,13 @@ bool fieldsInputEnd(char* sql) {
} }
// if last char not ' ', then not end field, like 'select count(*), su' can fill sum( // if last char not ' ', then not end field, like 'select count(*), su' can fill sum(
if(sql[strlen(sql)-1] != ' ' && cnt <= 1) { if (sql[strlen(sql) - 1] != ' ' && cnt <= 1) {
return false; return false;
} }
} }
char * p4 = strrchr(sql, ' '); char* p4 = strrchr(sql, ' ');
if(p4 == NULL) { if (p4 == NULL) {
// only one word // only one word
return false; return false;
} }
...@@ -1469,9 +1335,9 @@ bool fieldsInputEnd(char* sql) { ...@@ -1469,9 +1335,9 @@ bool fieldsInputEnd(char* sql) {
} }
// need insert from // need insert from
bool needInsertFrom(char * sql, int len) { bool needInsertFrom(char* sql, int len) {
// last is blank // last is blank
if(sql[len-1] != ' ') { if (sql[len - 1] != ' ') {
// insert from keyword // insert from keyword
return false; return false;
} }
...@@ -1486,33 +1352,33 @@ bool needInsertFrom(char * sql, int len) { ...@@ -1486,33 +1352,33 @@ bool needInsertFrom(char * sql, int len) {
} }
// p is string following select keyword // p is string following select keyword
bool appendAfterSelect(TAOS * con, SShellCmd * cmd, char* sql, int32_t len) { bool appendAfterSelect(TAOS* con, SShellCmd* cmd, char* sql, int32_t len) {
char* p = strndup(sql, len); char* p = strndup(sql, len);
// union all // union all
char * p1; char* p1;
do { do {
p1 = strstr(p, UNION_ALL); p1 = strstr(p, UNION_ALL);
if(p1) { if (p1) {
p = p1 + strlen(UNION_ALL); p = p1 + strlen(UNION_ALL);
} }
} while (p1); } while (p1);
char * from = strstr(p, " from "); char* from = strstr(p, " from ");
//last word , maybe empty string or some letters of a string // last word , maybe empty string or some letters of a string
char * last = lastWord(p); char* last = lastWord(p);
bool ret = false; bool ret = false;
if (from == NULL) { if (from == NULL) {
bool fieldEnd = fieldsInputEnd(p); bool fieldEnd = fieldsInputEnd(p);
// cheeck fields input end then insert from keyword // cheeck fields input end then insert from keyword
if (fieldEnd && p[len-1] == ' ') { if (fieldEnd && p[len - 1] == ' ') {
shellInsertChar(cmd, "from", 4); shellInsertChar(cmd, "from", 4);
taosMemoryFree(p); taosMemoryFree(p);
return true; return true;
} }
// fill funciton // fill funciton
if(fieldEnd) { if (fieldEnd) {
// fields is end , need match keyword // fields is end , need match keyword
ret = fillWithType(con, cmd, last, WT_VAR_KEYWORD); ret = fillWithType(con, cmd, last, WT_VAR_KEYWORD);
} else { } else {
...@@ -1524,7 +1390,7 @@ bool appendAfterSelect(TAOS * con, SShellCmd * cmd, char* sql, int32_t len) { ...@@ -1524,7 +1390,7 @@ bool appendAfterSelect(TAOS * con, SShellCmd * cmd, char* sql, int32_t len) {
} }
// have from // have from
char * blank = strstr(from + 6, " "); char* blank = strstr(from + 6, " ");
if (blank == NULL) { if (blank == NULL) {
// no table name, need fill // no table name, need fill
ret = fillTableName(con, cmd, last); ret = fillTableName(con, cmd, last);
...@@ -1538,13 +1404,12 @@ bool appendAfterSelect(TAOS * con, SShellCmd * cmd, char* sql, int32_t len) { ...@@ -1538,13 +1404,12 @@ bool appendAfterSelect(TAOS * con, SShellCmd * cmd, char* sql, int32_t len) {
int32_t searchAfterSelect(char* p, int32_t len) { int32_t searchAfterSelect(char* p, int32_t len) {
// select * from st; // select * from st;
if(strncasecmp(p, "select ", 7) == 0) { if (strncasecmp(p, "select ", 7) == 0) {
// check nest query // check nest query
char *p1 = p + 7; char* p1 = p + 7;
while(1) { while (1) {
char *p2 = strstr(p1, "select "); char* p2 = strstr(p1, "select ");
if(p2 == NULL) if (p2 == NULL) break;
break;
p1 = p2 + 7; p1 = p2 + 7;
} }
...@@ -1552,29 +1417,29 @@ int32_t searchAfterSelect(char* p, int32_t len) { ...@@ -1552,29 +1417,29 @@ int32_t searchAfterSelect(char* p, int32_t len) {
} }
// explain as select * from st; // explain as select * from st;
if(strncasecmp(p, "explain select ", 15) == 0) { if (strncasecmp(p, "explain select ", 15) == 0) {
return 15; return 15;
} }
char* as_pos_end = strstr(p, " as select "); char* as_pos_end = strstr(p, " as select ");
if (as_pos_end == NULL) if (as_pos_end == NULL) return -1;
return -1;
as_pos_end += 11; as_pos_end += 11;
// create stream <stream_name> as select // create stream <stream_name> as select
if(strncasecmp(p, "create stream ", 14) == 0) { if (strncasecmp(p, "create stream ", 14) == 0) {
return as_pos_end - p;; return as_pos_end - p;
;
} }
// create topic <topic_name> as select // create topic <topic_name> as select
if(strncasecmp(p, "create topic ", 13) == 0) { if (strncasecmp(p, "create topic ", 13) == 0) {
return as_pos_end - p; return as_pos_end - p;
} }
return -1; return -1;
} }
bool matchSelectQuery(TAOS * con, SShellCmd * cmd) { bool matchSelectQuery(TAOS* con, SShellCmd* cmd) {
// if continue press Tab , delete bytes by previous autofill // if continue press Tab , delete bytes by previous autofill
if (cntDel > 0) { if (cntDel > 0) {
deleteCount(cmd, cntDel); deleteCount(cmd, cntDel);
...@@ -1583,7 +1448,7 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) { ...@@ -1583,7 +1448,7 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) {
// match select ... // match select ...
int len = cmd->commandSize; int len = cmd->commandSize;
char * p = cmd->command; char* p = cmd->command;
// remove prefix blank // remove prefix blank
while (p[0] == ' ' && len > 0) { while (p[0] == ' ' && len > 0) {
...@@ -1592,7 +1457,7 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) { ...@@ -1592,7 +1457,7 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) {
} }
// special range // special range
if(len < 7 || len > 512) { if (len < 7 || len > 512) {
return false; return false;
} }
...@@ -1600,8 +1465,7 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) { ...@@ -1600,8 +1465,7 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) {
char* sql_cp = strndup(p, len); char* sql_cp = strndup(p, len);
int32_t n = searchAfterSelect(sql_cp, len); int32_t n = searchAfterSelect(sql_cp, len);
taosMemoryFree(sql_cp); taosMemoryFree(sql_cp);
if(n == -1 || n > len) if (n == -1 || n > len) return false;
return false;
p += n; p += n;
len -= n; len -= n;
...@@ -1610,15 +1474,15 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) { ...@@ -1610,15 +1474,15 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) {
} }
// if is input create fields or tags area, return true // if is input create fields or tags area, return true
bool isCreateFieldsArea(char * p) { bool isCreateFieldsArea(char* p) {
char * left = strrchr(p, '('); char* left = strrchr(p, '(');
if (left == NULL) { if (left == NULL) {
// like 'create table st' // like 'create table st'
return false; return false;
} }
char * right = strrchr(p, ')'); char* right = strrchr(p, ')');
if(right == NULL) { if (right == NULL) {
// like 'create table st( ' // like 'create table st( '
return true; return true;
} }
...@@ -1631,7 +1495,7 @@ bool isCreateFieldsArea(char * p) { ...@@ -1631,7 +1495,7 @@ bool isCreateFieldsArea(char * p) {
return false; return false;
} }
bool matchCreateTable(TAOS * con, SShellCmd * cmd) { bool matchCreateTable(TAOS* con, SShellCmd* cmd) {
// if continue press Tab , delete bytes by previous autofill // if continue press Tab , delete bytes by previous autofill
if (cntDel > 0) { if (cntDel > 0) {
deleteCount(cmd, cntDel); deleteCount(cmd, cntDel);
...@@ -1640,7 +1504,7 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) { ...@@ -1640,7 +1504,7 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) {
// match select ... // match select ...
int len = cmd->commandSize; int len = cmd->commandSize;
char * p = cmd->command; char* p = cmd->command;
// remove prefix blank // remove prefix blank
while (p[0] == ' ' && len > 0) { while (p[0] == ' ' && len > 0) {
...@@ -1649,12 +1513,12 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) { ...@@ -1649,12 +1513,12 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) {
} }
// special range // special range
if(len < 7 || len > 1024) { if (len < 7 || len > 1024) {
return false; return false;
} }
// select and from // select and from
if(strncasecmp(p, "create table ", 13) != 0) { if (strncasecmp(p, "create table ", 13) != 0) {
// not select query clause // not select query clause
return false; return false;
} }
...@@ -1663,7 +1527,7 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) { ...@@ -1663,7 +1527,7 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) {
char* ps = strndup(p, len); char* ps = strndup(p, len);
bool ret = false; bool ret = false;
char * last = lastWord(ps); char* last = lastWord(ps);
// check in create fields or tags input area // check in create fields or tags input area
if (isCreateFieldsArea(ps)) { if (isCreateFieldsArea(ps)) {
...@@ -1673,9 +1537,9 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) { ...@@ -1673,9 +1537,9 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) {
// tags // tags
if (!ret) { if (!ret) {
// find only one ')' , can insert tags // find only one ')' , can insert tags
char * p1 = strchr(ps, ')'); char* p1 = strchr(ps, ')');
if (p1) { if (p1) {
if(strchr(p1 + 1, ')') == NULL && strstr(p1 + 1, "tags") == NULL) { if (strchr(p1 + 1, ')') == NULL && strstr(p1 + 1, "tags") == NULL) {
// can insert tags keyword // can insert tags keyword
ret = fillWithType(con, cmd, last, WT_VAR_KEYTAGS); ret = fillWithType(con, cmd, last, WT_VAR_KEYTAGS);
} }
...@@ -1685,9 +1549,9 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) { ...@@ -1685,9 +1549,9 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) {
// tb options // tb options
if (!ret) { if (!ret) {
// find like create talbe st (...) tags(..) <here is fill tb option area> // find like create talbe st (...) tags(..) <here is fill tb option area>
char * p1 = strchr(ps, ')'); // first ')' end char* p1 = strchr(ps, ')'); // first ')' end
if (p1) { if (p1) {
if(strchr(p1 + 1, ')')) { // second ')' end if (strchr(p1 + 1, ')')) { // second ')' end
// here is tb options area, can insert option // here is tb options area, can insert option
ret = fillWithType(con, cmd, last, WT_VAR_TBOPTION); ret = fillWithType(con, cmd, last, WT_VAR_TBOPTION);
} }
...@@ -1698,7 +1562,7 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) { ...@@ -1698,7 +1562,7 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) {
return ret; return ret;
} }
bool matchOther(TAOS * con, SShellCmd * cmd) { bool matchOther(TAOS* con, SShellCmd* cmd) {
int len = cmd->commandSize; int len = cmd->commandSize;
char* p = cmd->command; char* p = cmd->command;
...@@ -1711,8 +1575,7 @@ bool matchOther(TAOS * con, SShellCmd * cmd) { ...@@ -1711,8 +1575,7 @@ bool matchOther(TAOS * con, SShellCmd * cmd) {
} }
// too small // too small
if(len < 8) if (len < 8) return false;
return false;
// like 'from ( ' // like 'from ( '
char* sql = strndup(p, len); char* sql = strndup(p, len);
...@@ -1731,26 +1594,25 @@ bool matchOther(TAOS * con, SShellCmd * cmd) { ...@@ -1731,26 +1594,25 @@ bool matchOther(TAOS * con, SShellCmd * cmd) {
// find last ' from' // find last ' from'
while (from) { while (from) {
char* p1 = strstr(from + 5, " from"); char* p1 = strstr(from + 5, " from");
if (p1 == NULL) if (p1 == NULL) break;
break;
from = p1; from = p1;
} }
if (from) { if (from) {
// find next is '(' // find next is '('
char * p2 = from + 5; char* p2 = from + 5;
bool found = false; // found 'from ... ( ...' ... is any count of blank bool found = false; // found 'from ... ( ...' ... is any count of blank
bool found1 = false; // found '(' bool found1 = false; // found '('
while (1) { while (1) {
if ( p2 == last || *p2 == '\0') { if (p2 == last || *p2 == '\0') {
// last word or string end // last word or string end
if (found1) { if (found1) {
found = true; found = true;
} }
break; break;
} else if(*p2 == '(') { } else if (*p2 == '(') {
found1 = true; found1 = true;
} else if(*p2 == ' ') { } else if (*p2 == ' ') {
// do nothing // do nothing
} else { } else {
// have any other char // have any other char
...@@ -1770,21 +1632,19 @@ bool matchOther(TAOS * con, SShellCmd * cmd) { ...@@ -1770,21 +1632,19 @@ bool matchOther(TAOS * con, SShellCmd * cmd) {
// INSERT // INSERT
taosMemoryFree(sql); taosMemoryFree(sql);
return false; return false;
} }
// main key press tab // main key press tab
void pressTabKey(SShellCmd * cmd) { void pressTabKey(SShellCmd* cmd) {
// check // check
if (cmd->commandSize == 0) { if (cmd->commandSize == 0) {
// empty // empty
showHelp(); showHelp();
shellShowOnScreen(cmd); shellShowOnScreen(cmd);
return ; return;
} }
// save connection to global // save connection to global
...@@ -1793,8 +1653,7 @@ void pressTabKey(SShellCmd * cmd) { ...@@ -1793,8 +1653,7 @@ void pressTabKey(SShellCmd * cmd) {
// manual match like create table st( ... // manual match like create table st( ...
matched = matchCreateTable(varCon, cmd); matched = matchCreateTable(varCon, cmd);
if (matched) if (matched) return;
return ;
// shellCommands match // shellCommands match
if (firstMatchIndex == -1) { if (firstMatchIndex == -1) {
...@@ -1802,21 +1661,18 @@ void pressTabKey(SShellCmd * cmd) { ...@@ -1802,21 +1661,18 @@ void pressTabKey(SShellCmd * cmd) {
} else { } else {
matched = nextMatchCommand(varCon, cmd, &shellCommands[firstMatchIndex]); matched = nextMatchCommand(varCon, cmd, &shellCommands[firstMatchIndex]);
} }
if (matched) if (matched) return;
return ;
// NOT MATCHED ANYONE // NOT MATCHED ANYONE
// match other like '\G' ... // match other like '\G' ...
matched = matchOther(varCon, cmd); matched = matchOther(varCon, cmd);
if (matched) if (matched) return;
return ;
// manual match like select * from ... // manual match like select * from ...
matched = matchSelectQuery(varCon, cmd); matched = matchSelectQuery(varCon, cmd);
if (matched) if (matched) return;
return ;
return ; return;
} }
// press othr key // press othr key
...@@ -1840,18 +1696,18 @@ void pressOtherKey(char c) { ...@@ -1840,18 +1696,18 @@ void pressOtherKey(char c) {
} }
// put name into name, return name length // put name into name, return name length
int getWordName(char* p, char * name, int nameLen) { int getWordName(char* p, char* name, int nameLen) {
//remove prefix blank // remove prefix blank
while (*p == ' ') { while (*p == ' ') {
p++; p++;
} }
// get databases name; // get databases name;
int i = 0; int i = 0;
while(p[i] != 0 && i < nameLen - 1) { while (p[i] != 0 && i < nameLen - 1) {
name[i] = p[i]; name[i] = p[i];
i++; i++;
if(p[i] == ' ' || p[i] == ';'|| p[i] == '(') { if (p[i] == ' ' || p[i] == ';' || p[i] == '(') {
// name end // name end
break; break;
} }
...@@ -1862,14 +1718,14 @@ int getWordName(char* p, char * name, int nameLen) { ...@@ -1862,14 +1718,14 @@ int getWordName(char* p, char * name, int nameLen) {
} }
// deal use db, if have 'use' return true // deal use db, if have 'use' return true
bool dealUseDB(char * sql) { bool dealUseDB(char* sql) {
// check use keyword // check use keyword
if(strncasecmp(sql, "use ", 4) != 0) { if (strncasecmp(sql, "use ", 4) != 0) {
return false; return false;
} }
char db[256]; char db[256];
char *p = sql + 4; char* p = sql + 4;
if (getWordName(p, db, sizeof(db)) == 0) { if (getWordName(p, db, sizeof(db)) == 0) {
// no name , return // no name , return
return true; return true;
...@@ -1886,13 +1742,13 @@ bool dealUseDB(char * sql) { ...@@ -1886,13 +1742,13 @@ bool dealUseDB(char * sql) {
// STABLE set null // STABLE set null
STire* tire = tires[WT_VAR_STABLE]; STire* tire = tires[WT_VAR_STABLE];
tires[WT_VAR_STABLE] = NULL; tires[WT_VAR_STABLE] = NULL;
if(tire) { if (tire) {
freeTire(tire); freeTire(tire);
} }
// TABLE set null // TABLE set null
tire = tires[WT_VAR_TABLE]; tire = tires[WT_VAR_TABLE];
tires[WT_VAR_TABLE] = NULL; tires[WT_VAR_TABLE] = NULL;
if(tire) { if (tire) {
freeTire(tire); freeTire(tire);
} }
// save // save
...@@ -1903,14 +1759,14 @@ bool dealUseDB(char * sql) { ...@@ -1903,14 +1759,14 @@ bool dealUseDB(char * sql) {
} }
// deal create, if have 'create' return true // deal create, if have 'create' return true
bool dealCreateCommand(char * sql) { bool dealCreateCommand(char* sql) {
// check keyword // check keyword
if(strncasecmp(sql, "create ", 7) != 0) { if (strncasecmp(sql, "create ", 7) != 0) {
return false; return false;
} }
char name[1024]; char name[1024];
char *p = sql + 7; char* p = sql + 7;
if (getWordName(p, name, sizeof(name)) == 0) { if (getWordName(p, name, sizeof(name)) == 0) {
// no name , return // no name , return
return true; return true;
...@@ -1921,7 +1777,7 @@ bool dealCreateCommand(char * sql) { ...@@ -1921,7 +1777,7 @@ bool dealCreateCommand(char * sql) {
if (strcasecmp(name, "database") == 0) { if (strcasecmp(name, "database") == 0) {
type = WT_VAR_DBNAME; type = WT_VAR_DBNAME;
} else if (strcasecmp(name, "table") == 0) { } else if (strcasecmp(name, "table") == 0) {
if(strstr(sql, " tags") != NULL && strstr(sql, " using ") == NULL) if (strstr(sql, " tags") != NULL && strstr(sql, " using ") == NULL)
type = WT_VAR_STABLE; type = WT_VAR_STABLE;
else else
type = WT_VAR_TABLE; type = WT_VAR_TABLE;
...@@ -1949,7 +1805,7 @@ bool dealCreateCommand(char * sql) { ...@@ -1949,7 +1805,7 @@ bool dealCreateCommand(char * sql) {
taosThreadMutexLock(&tiresMutex); taosThreadMutexLock(&tiresMutex);
// STABLE set null // STABLE set null
STire* tire = tires[type]; STire* tire = tires[type];
if(tire) { if (tire) {
insertWord(tire, name); insertWord(tire, name);
} }
taosThreadMutexUnlock(&tiresMutex); taosThreadMutexUnlock(&tiresMutex);
...@@ -1958,14 +1814,14 @@ bool dealCreateCommand(char * sql) { ...@@ -1958,14 +1814,14 @@ bool dealCreateCommand(char * sql) {
} }
// deal create, if have 'drop' return true // deal create, if have 'drop' return true
bool dealDropCommand(char * sql) { bool dealDropCommand(char* sql) {
// check keyword // check keyword
if(strncasecmp(sql, "drop ", 5) != 0) { if (strncasecmp(sql, "drop ", 5) != 0) {
return false; return false;
} }
char name[1024]; char name[1024];
char *p = sql + 5; char* p = sql + 5;
if (getWordName(p, name, sizeof(name)) == 0) { if (getWordName(p, name, sizeof(name)) == 0) {
// no name , return // no name , return
return true; return true;
...@@ -2002,23 +1858,20 @@ bool dealDropCommand(char * sql) { ...@@ -2002,23 +1858,20 @@ bool dealDropCommand(char * sql) {
// switch new db // switch new db
taosThreadMutexLock(&tiresMutex); taosThreadMutexLock(&tiresMutex);
// STABLE set null // STABLE set null
if(type == WT_VAR_ALLTABLE) { if (type == WT_VAR_ALLTABLE) {
bool del = false; bool del = false;
// del in stable // del in stable
STire* tire = tires[WT_VAR_STABLE]; STire* tire = tires[WT_VAR_STABLE];
if(tire) if (tire) del = deleteWord(tire, name);
del = deleteWord(tire, name);
// del in table // del in table
if(!del) { if (!del) {
tire = tires[WT_VAR_TABLE]; tire = tires[WT_VAR_TABLE];
if(tire) if (tire) del = deleteWord(tire, name);
del = deleteWord(tire, name);
} }
} else { } else {
// OTHER TYPE // OTHER TYPE
STire* tire = tires[type]; STire* tire = tires[type];
if(tire) if (tire) deleteWord(tire, name);
deleteWord(tire, name);
} }
taosThreadMutexUnlock(&tiresMutex); taosThreadMutexUnlock(&tiresMutex);
...@@ -2027,26 +1880,26 @@ bool dealDropCommand(char * sql) { ...@@ -2027,26 +1880,26 @@ bool dealDropCommand(char * sql) {
// callback autotab module after shell sql execute // callback autotab module after shell sql execute
void callbackAutoTab(char* sqlstr, TAOS* pSql, bool usedb) { void callbackAutoTab(char* sqlstr, TAOS* pSql, bool usedb) {
char * sql = sqlstr; char* sql = sqlstr;
// remove prefix blank // remove prefix blank
while (*sql == ' ') { while (*sql == ' ') {
sql++; sql++;
} }
if(dealUseDB(sql)) { if (dealUseDB(sql)) {
// change to new db // change to new db
return ; return;
} }
// create command add name to autotab // create command add name to autotab
if(dealCreateCommand(sql)) { if (dealCreateCommand(sql)) {
return ; return;
} }
// drop command remove name from autotab // drop command remove name from autotab
if(dealDropCommand(sql)) { if (dealDropCommand(sql)) {
return ; return;
} }
return ; return;
} }
...@@ -26,17 +26,16 @@ STire* createTire(char type) { ...@@ -26,17 +26,16 @@ STire* createTire(char type) {
memset(tire, 0, sizeof(STire)); memset(tire, 0, sizeof(STire));
tire->ref = 1; // init is 1 tire->ref = 1; // init is 1
tire->type = type; tire->type = type;
tire->root.d = (STireNode **)taosMemoryCalloc(CHAR_CNT, sizeof(STireNode *)); tire->root.d = (STireNode**)taosMemoryCalloc(CHAR_CNT, sizeof(STireNode*));
return tire; return tire;
} }
// free tire node // free tire node
void freeTireNode(STireNode* node) { void freeTireNode(STireNode* node) {
if (node == NULL) if (node == NULL) return;
return ;
// nest free sub node on array d // nest free sub node on array d
if(node->d) { if (node->d) {
for (int i = 0; i < CHAR_CNT; i++) { for (int i = 0; i < CHAR_CNT; i++) {
freeTireNode(node->d[i]); freeTireNode(node->d[i]);
} }
...@@ -56,9 +55,9 @@ void freeTire(STire* tire) { ...@@ -56,9 +55,9 @@ void freeTire(STire* tire) {
taosMemoryFree(tire->root.d); taosMemoryFree(tire->root.d);
// free from list // free from list
StrName * item = tire->head; StrName* item = tire->head;
while (item) { while (item) {
StrName * next = item->next; StrName* next = item->next;
// free string // free string
taosMemoryFree(item->name); taosMemoryFree(item->name);
// free node // free node
...@@ -75,14 +74,14 @@ void freeTire(STire* tire) { ...@@ -75,14 +74,14 @@ void freeTire(STire* tire) {
// insert a new word to list // insert a new word to list
bool insertToList(STire* tire, char* word) { bool insertToList(STire* tire, char* word) {
StrName * p = (StrName *)taosMemoryMalloc(sizeof(StrName)); StrName* p = (StrName*)taosMemoryMalloc(sizeof(StrName));
p->name = strdup(word); p->name = strdup(word);
p->next = NULL; p->next = NULL;
if(tire->head == NULL) { if (tire->head == NULL) {
tire->head = p; tire->head = p;
tire->tail = p; tire->tail = p;
}else { } else {
tire->tail->next = p; tire->tail->next = p;
tire->tail = p; tire->tail = p;
} }
...@@ -93,7 +92,7 @@ bool insertToList(STire* tire, char* word) { ...@@ -93,7 +92,7 @@ bool insertToList(STire* tire, char* word) {
// insert a new word to tree // insert a new word to tree
bool insertToTree(STire* tire, char* word, int len) { bool insertToTree(STire* tire, char* word, int len) {
int m = 0; int m = 0;
STireNode ** nodes = tire->root.d; STireNode** nodes = tire->root.d;
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
m = word[i] - FIRST_ASCII; m = word[i] - FIRST_ASCII;
if (m < 0 || m > CHAR_CNT) { if (m < 0 || m > CHAR_CNT) {
...@@ -102,7 +101,7 @@ bool insertToTree(STire* tire, char* word, int len) { ...@@ -102,7 +101,7 @@ bool insertToTree(STire* tire, char* word, int len) {
if (nodes[m] == NULL) { if (nodes[m] == NULL) {
// no pointer // no pointer
STireNode* p = (STireNode* )taosMemoryMalloc(sizeof(STireNode)); STireNode* p = (STireNode*)taosMemoryMalloc(sizeof(STireNode));
memset(p, 0, sizeof(STireNode)); memset(p, 0, sizeof(STireNode));
nodes[m] = p; nodes[m] = p;
if (i == len - 1) { if (i == len - 1) {
...@@ -114,7 +113,7 @@ bool insertToTree(STire* tire, char* word, int len) { ...@@ -114,7 +113,7 @@ bool insertToTree(STire* tire, char* word, int len) {
if (nodes[m]->d == NULL) { if (nodes[m]->d == NULL) {
// malloc d // malloc d
nodes[m]->d = (STireNode **)taosMemoryCalloc(CHAR_CNT, sizeof(STireNode *)); nodes[m]->d = (STireNode**)taosMemoryCalloc(CHAR_CNT, sizeof(STireNode*));
} }
// move to next node // move to next node
...@@ -146,7 +145,7 @@ bool insertWord(STire* tire, char* word) { ...@@ -146,7 +145,7 @@ bool insertWord(STire* tire, char* word) {
// delete one word from list // delete one word from list
bool deleteFromList(STire* tire, char* word) { bool deleteFromList(STire* tire, char* word) {
StrName * item = tire->head; StrName* item = tire->head;
while (item) { while (item) {
if (strcmp(item->name, word) == 0) { if (strcmp(item->name, word) == 0) {
// found, reset empty to delete // found, reset empty to delete
...@@ -176,7 +175,7 @@ bool deleteFromTree(STire* tire, char* word, int len) { ...@@ -176,7 +175,7 @@ bool deleteFromTree(STire* tire, char* word, int len) {
return false; return false;
} else { } else {
// not null // not null
if(i == len - 1) { if (i == len - 1) {
// this is last, only set end false , not free node // this is last, only set end false , not free node
nodes[m]->end = false; nodes[m]->end = false;
del = true; del = true;
...@@ -184,8 +183,7 @@ bool deleteFromTree(STire* tire, char* word, int len) { ...@@ -184,8 +183,7 @@ bool deleteFromTree(STire* tire, char* word, int len) {
} }
} }
if(nodes[m]->d == NULL) if (nodes[m]->d == NULL) break;
break;
// move to next node // move to next node
nodes = nodes[m]->d; nodes = nodes[m]->d;
} }
...@@ -216,9 +214,9 @@ bool deleteWord(STire* tire, char* word) { ...@@ -216,9 +214,9 @@ bool deleteWord(STire* tire, char* word) {
return false; return false;
} }
void addWordToMatch(SMatch* match, char* word){ void addWordToMatch(SMatch* match, char* word) {
// malloc new // malloc new
SMatchNode* node = (SMatchNode* )taosMemoryMalloc(sizeof(SMatchNode)); SMatchNode* node = (SMatchNode*)taosMemoryMalloc(sizeof(SMatchNode));
memset(node, 0, sizeof(SMatchNode)); memset(node, 0, sizeof(SMatchNode));
node->word = strdup(word); node->word = strdup(word);
...@@ -234,7 +232,7 @@ void addWordToMatch(SMatch* match, char* word){ ...@@ -234,7 +232,7 @@ void addWordToMatch(SMatch* match, char* word){
// enum all words from node // enum all words from node
void enumAllWords(STireNode** nodes, char* prefix, SMatch* match) { void enumAllWords(STireNode** nodes, char* prefix, SMatch* match) {
STireNode * c; STireNode* c;
char word[MAX_WORD_LEN]; char word[MAX_WORD_LEN];
int len = strlen(prefix); int len = strlen(prefix);
for (int i = 0; i < CHAR_CNT; i++) { for (int i = 0; i < CHAR_CNT; i++) {
...@@ -255,18 +253,17 @@ void enumAllWords(STireNode** nodes, char* prefix, SMatch* match) { ...@@ -255,18 +253,17 @@ void enumAllWords(STireNode** nodes, char* prefix, SMatch* match) {
addWordToMatch(match, word); addWordToMatch(match, word);
} }
// nested call next layer // nested call next layer
if (c->d) if (c->d) enumAllWords(c->d, word, match);
enumAllWords(c->d, word, match);
} }
} }
} }
// match prefix from list // match prefix from list
void matchPrefixFromList(STire* tire, char* prefix, SMatch* match) { void matchPrefixFromList(STire* tire, char* prefix, SMatch* match) {
StrName * item = tire->head; StrName* item = tire->head;
int len = strlen(prefix); int len = strlen(prefix);
while (item) { while (item) {
if ( strncmp(item->name, prefix, len) == 0) { if (strncmp(item->name, prefix, len) == 0) {
// prefix matched // prefix matched
addWordToMatch(match, item->name); addWordToMatch(match, item->name);
} }
...@@ -304,29 +301,27 @@ void matchPrefixFromTree(STire* tire, char* prefix, SMatch* match) { ...@@ -304,29 +301,27 @@ void matchPrefixFromTree(STire* tire, char* prefix, SMatch* match) {
if (i == len - 1) { if (i == len - 1) {
// malloc match if not pass by param match // malloc match if not pass by param match
if (root == NULL) { if (root == NULL) {
root = (SMatch* )taosMemoryMalloc(sizeof(SMatch)); root = (SMatch*)taosMemoryMalloc(sizeof(SMatch));
memset(root, 0, sizeof(SMatch)); memset(root, 0, sizeof(SMatch));
strcpy(root->pre, prefix); strcpy(root->pre, prefix);
} }
// prefix is match to end char // prefix is match to end char
if (c->d) if (c->d) enumAllWords(c->d, prefix, root);
enumAllWords(c->d, prefix, root);
} else { } else {
// move to next node continue match // move to next node continue match
if(c->d == NULL) if (c->d == NULL) break;
break;
nodes = c->d; nodes = c->d;
} }
} }
// return // return
return ; return;
} }
SMatch* matchPrefix(STire* tire, char* prefix, SMatch* match) { SMatch* matchPrefix(STire* tire, char* prefix, SMatch* match) {
if(match == NULL) { if (match == NULL) {
match = (SMatch* )taosMemoryMalloc(sizeof(SMatch)); match = (SMatch*)taosMemoryMalloc(sizeof(SMatch));
memset(match, 0, sizeof(SMatch)); memset(match, 0, sizeof(SMatch));
} }
...@@ -348,10 +343,9 @@ SMatch* matchPrefix(STire* tire, char* prefix, SMatch* match) { ...@@ -348,10 +343,9 @@ SMatch* matchPrefix(STire* tire, char* prefix, SMatch* match) {
return match; return match;
} }
// get all items from tires tree // get all items from tires tree
void enumFromList(STire* tire, SMatch* match) { void enumFromList(STire* tire, SMatch* match) {
StrName * item = tire->head; StrName* item = tire->head;
while (item) { while (item) {
if (item->name[0] != 0) { if (item->name[0] != 0) {
// not delete // not delete
...@@ -365,7 +359,7 @@ void enumFromList(STire* tire, SMatch* match) { ...@@ -365,7 +359,7 @@ void enumFromList(STire* tire, SMatch* match) {
// get all items from tires tree // get all items from tires tree
void enumFromTree(STire* tire, SMatch* match) { void enumFromTree(STire* tire, SMatch* match) {
char pre[2] ={0, 0}; char pre[2] = {0, 0};
STireNode* c; STireNode* c;
// enum first layer // enum first layer
...@@ -380,7 +374,7 @@ void enumFromTree(STire* tire, SMatch* match) { ...@@ -380,7 +374,7 @@ void enumFromTree(STire* tire, SMatch* match) {
} }
// this branch have data // this branch have data
if(c->end) if (c->end)
addWordToMatch(match, pre); addWordToMatch(match, pre);
else else
matchPrefix(tire, pre, match); matchPrefix(tire, pre, match);
...@@ -389,7 +383,7 @@ void enumFromTree(STire* tire, SMatch* match) { ...@@ -389,7 +383,7 @@ void enumFromTree(STire* tire, SMatch* match) {
// get all items from tires tree // get all items from tires tree
SMatch* enumAll(STire* tire) { SMatch* enumAll(STire* tire) {
SMatch* match = (SMatch* )taosMemoryMalloc(sizeof(SMatch)); SMatch* match = (SMatch*)taosMemoryMalloc(sizeof(SMatch));
memset(match, 0, sizeof(SMatch)); memset(match, 0, sizeof(SMatch));
switch (tire->type) { switch (tire->type) {
...@@ -410,16 +404,13 @@ SMatch* enumAll(STire* tire) { ...@@ -410,16 +404,13 @@ SMatch* enumAll(STire* tire) {
return match; return match;
} }
// free match result // free match result
void freeMatchNode(SMatchNode* node) { void freeMatchNode(SMatchNode* node) {
// first free next // first free next
if (node->next) if (node->next) freeMatchNode(node->next);
freeMatchNode(node->next);
// second free self // second free self
if (node->word) if (node->word) taosMemoryFree(node->word);
taosMemoryFree(node->word);
taosMemoryFree(node); taosMemoryFree(node);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册