Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
1c106bfd
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
1c106bfd
编写于
10月 09, 2022
作者:
S
Shengliang Guan
提交者:
GitHub
10月 09, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #17235 from taosdata/feat/TD-17777-V30
feat(shell): Supported the word completed by press Tab key for 3.0
上级
329b76ed
c3357340
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
888 addition
and
1047 deletion
+888
-1047
tools/shell/inc/shellAuto.h
tools/shell/inc/shellAuto.h
+1
-1
tools/shell/inc/shellTire.h
tools/shell/inc/shellTire.h
+29
-32
tools/shell/src/shellAuto.c
tools/shell/src/shellAuto.c
+539
-686
tools/shell/src/shellTire.c
tools/shell/src/shellTire.c
+319
-328
未找到文件。
tools/shell/inc/shellAuto.h
浏览文件 @
1c106bfd
tools/shell/inc/shellTire.h
浏览文件 @
1c106bfd
...
...
@@ -33,38 +33,35 @@
typedef
struct
STireNode
{
struct
STireNode
**
d
;
bool
end
;
// record end flag
}
STireNode
;
}
STireNode
;
typedef
struct
StrName
{
char
*
name
;
struct
StrName
*
next
;
}
StrName
;
char
*
name
;
struct
StrName
*
next
;
}
StrName
;
typedef
struct
STire
{
char
type
;
// see define TIRE_
STireNode
root
;
StrName
*
head
;
StrName
*
tail
;
StrName
*
head
;
StrName
*
tail
;
int
count
;
// all count
int
ref
;
}
STire
;
}
STire
;
typedef
struct
SMatchNode
{
char
*
word
;
struct
SMatchNode
*
next
;
}
SMatchNode
;
}
SMatchNode
;
typedef
struct
SMatch
{
SMatchNode
*
head
;
SMatchNode
*
tail
;
// append node to tail
int
count
;
char
pre
[
MAX_WORD_LEN
];
}
SMatch
;
}
SMatch
;
// ----------- interface -------------
...
...
tools/shell/src/shellAuto.c
浏览文件 @
1c106bfd
...
...
@@ -25,40 +25,40 @@
//
#define UNION_ALL " union all "
// extern function
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
shellShowOnScreen
(
SShellCmd
*
cmd
);
void
shellInsertChar
(
SShellCmd
*
cmd
,
char
*
c
,
int
size
);
bool
appendAfterSelect
(
TAOS
*
con
,
SShellCmd
*
cmd
,
char
*
p
,
int32_t
len
);
void
shellGetPrevCharSize
(
const
char
*
str
,
int32_t
pos
,
int32_t
*
size
,
int32_t
*
width
);
void
shellShowOnScreen
(
SShellCmd
*
cmd
);
void
shellInsertChar
(
SShellCmd
*
cmd
,
char
*
c
,
int
size
);
bool
appendAfterSelect
(
TAOS
*
con
,
SShellCmd
*
cmd
,
char
*
p
,
int32_t
len
);
typedef
struct
SAutoPtr
{
STire
*
p
;
int
ref
;
}
SAutoPtr
;
}
SAutoPtr
;
typedef
struct
SWord
{
int
type
;
// word type , see WT_ define
char
*
word
;
typedef
struct
SWord
{
int
type
;
// word type , see WT_ define
char
*
word
;
int32_t
len
;
struct
SWord
*
next
;
struct
SWord
*
next
;
bool
free
;
// if true need free
}
SWord
;
}
SWord
;
typedef
struct
{
char
*
source
;
char
*
source
;
int32_t
source_len
;
// valid data length in source
int32_t
count
;
SWord
*
head
;
// matched information
int32_t
matchIndex
;
// matched word index in words
int32_t
matchLen
;
// matched length at matched word
}
SWords
;
}
SWords
;
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> resetlog;"
,
0
,
0
,
NULL
},
{
"alter dnode <dnode_id> debugFlag 141;"
,
0
,
0
,
NULL
},
...
...
@@ -80,7 +80,10 @@ SWords shellCommands[] = {
{
"alter user <user_name> <user_actions> <anyword> ;"
,
0
,
0
,
NULL
},
// 20
{
"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 index "
,
0
,
0
,
NULL
},
{
"create mnode on dnode <dnode_id> ;"
,
0
,
0
,
NULL
},
...
...
@@ -142,11 +145,11 @@ SWords shellCommands[] = {
// 80
{
"show query <anyword> ;"
,
0
,
0
,
NULL
},
{
"show qnodes;"
,
0
,
0
,
NULL
},
{
"show snodes;"
,
0
,
0
,
NULL
},
{
"show stables;"
,
0
,
0
,
NULL
},
{
"show stables like "
,
0
,
0
,
NULL
},
{
"show streams;"
,
0
,
0
,
NULL
},
{
"show scores;"
,
0
,
0
,
NULL
},
{
"show snodes;"
,
0
,
0
,
NULL
},
{
"show subscriptions;"
,
0
,
0
,
NULL
},
{
"show tables;"
,
0
,
0
,
NULL
},
{
"show tables like"
,
0
,
0
,
NULL
},
...
...
@@ -169,126 +172,57 @@ SWords shellCommands[] = {
{
"insert into <tb_name> file "
,
0
,
0
,
NULL
},
{
"trim database <db_name>"
,
0
,
0
,
NULL
},
{
"use <db_name>"
,
0
,
0
,
NULL
},
{
"quit"
,
0
,
0
,
NULL
}
};
char
*
keywords
[]
=
{
"and "
,
"asc "
,
"desc "
,
"from "
,
"fill("
,
"limit "
,
"where "
,
"interval("
,
"order by "
,
"order by "
,
"offset "
,
"or "
,
"group by "
,
"now()"
,
"session("
,
"sliding "
,
"slimit "
,
"soffset "
,
"state_window("
,
"today() "
,
"union all select "
,
"partition by "
};
char
*
functions
[]
=
{
"count("
,
"sum("
,
"avg("
,
"last("
,
"last_row("
,
"top("
,
"interp("
,
"max("
,
"min("
,
"now()"
,
"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("
,
{
"quit"
,
0
,
0
,
NULL
}};
char
*
keywords
[]
=
{
"and "
,
"asc "
,
"desc "
,
"from "
,
"fill("
,
"limit "
,
"where "
,
"interval("
,
"order by "
,
"order by "
,
"offset "
,
"or "
,
"group by "
,
"now()"
,
"session("
,
"sliding "
,
"slimit "
,
"soffset "
,
"state_window("
,
"today() "
,
"union all select "
,
"partition by "
};
char
*
functions
[]
=
{
"count("
,
"sum("
,
"avg("
,
"last("
,
"last_row("
,
"top("
,
"interp("
,
"max("
,
"min("
,
"now()"
,
"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
[]
=
{
"add column "
,
"modify column "
,
"drop column "
,
"rename column "
,
"add tag "
,
"modify tag "
,
"drop tag "
,
"rename tag "
,
"set tag "
,
char
*
tb_actions
[]
=
{
"add column "
,
"modify column "
,
"drop column "
,
"rename column "
,
"add tag "
,
"modify tag "
,
"drop tag "
,
"rename tag "
,
"set tag "
,
};
char
*
user_actions
[]
=
{
"pass "
,
"enable "
,
"sysinfo "
};
char
*
user_actions
[]
=
{
"pass "
,
"enable "
,
"sysinfo "
};
char
*
tb_options
[]
=
{
"comment "
,
"watermark "
,
"max_delay "
,
"ttl "
,
"rollup("
,
"sma("
};
char
*
tb_options
[]
=
{
"comment "
,
"watermark "
,
"max_delay "
,
"ttl "
,
"rollup("
,
"sma("
};
char
*
db_options
[]
=
{
"keep "
,
char
*
db_options
[]
=
{
"keep "
,
"replica "
,
"precision "
,
"strict "
,
...
...
@@ -309,43 +243,22 @@ char * db_options[] = {
"wal_retention_period "
,
"wal_roll_period "
,
"wal_retention_size "
,
"wal_segment_size "
};
"wal_segment_size "
};
char
*
alter_db_options
[]
=
{
"keep "
,
"cachemodel "
,
"cachesize "
,
"wal_fsync_period "
,
"wal_level "
};
char
*
alter_db_options
[]
=
{
"keep "
,
"cachemodel "
,
"cachesize "
,
"wal_fsync_period "
,
"wal_level "
};
char
*
data_types
[]
=
{
"timestamp"
,
"int"
,
"int unsigned"
,
"varchar(16)"
,
"float"
,
"double"
,
"binary(16)"
,
"nchar(16)"
,
"bigint"
,
"bigint unsigned"
,
"smallint"
,
"smallint unsigned"
,
"tinyint"
,
"tinyint unsigned"
,
"bool"
,
"json"
};
char
*
data_types
[]
=
{
"timestamp"
,
"int"
,
"int unsigned"
,
"varchar(16)"
,
"float"
,
"double"
,
"binary(16)"
,
"nchar(16)"
,
"bigint"
,
"bigint unsigned"
,
"smallint"
,
"smallint unsigned"
,
"tinyint"
,
"tinyint unsigned"
,
"bool"
,
"json"
};
char
*
key_tags
[]
=
{
"tags("
};
char
*
key_tags
[]
=
{
"tags("
};
char
*
key_select
[]
=
{
"select "
};
char
*
key_select
[]
=
{
"select "
};
//
// ------- gobal variant define ---------
...
...
@@ -356,7 +269,6 @@ int32_t curMatchIndex = -1; // current match shellCommands index
int32_t
lastWordBytes
=
-
1
;
// printShow last word length
bool
waitAutoFill
=
false
;
//
// ----------- global var array define -----------
//
...
...
@@ -380,7 +292,6 @@ bool waitAutoFill = false;
#define WT_VAR_USERACTION 17
#define WT_VAR_KEYSELECT 18
#define WT_VAR_CNT 19
#define WT_FROM_DB_MAX 6 // max get content from db
...
...
@@ -392,53 +303,26 @@ char dbName[256] = ""; // save use database name;
// tire array
STire
*
tires
[
WT_VAR_CNT
];
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
];
// obtain var name with sql from server
char
varTypes
[
WT_VAR_CNT
][
64
]
=
{
"<db_name>"
,
"<stb_name>"
,
"<tb_name>"
,
"<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
varTypes
[
WT_VAR_CNT
][
64
]
=
{
"<db_name>"
,
"<stb_name>"
,
"<tb_name>"
,
"<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;"
};
// var words current cursor, if user press any one key except tab, cursorVar can be reset to -1
int
cursorVar
=
-
1
;
bool
varMode
=
false
;
// enter var names list mode
TAOS
*
varCon
=
NULL
;
SShellCmd
*
varCmd
=
NULL
;
SMatch
*
lastMatch
=
NULL
;
// save last match result
int
cntDel
=
0
;
// delete byte count after next press tab
// show auto tab introduction
void
printfIntroduction
()
{
printf
(
" **************************** How To Use TAB Key ********************************
\n
"
);
...
...
@@ -459,7 +343,8 @@ void printfIntroduction() {
void
showHelp
()
{
printf
(
"
\n
The following are supported commands for TDengine Command Line:"
);
printf
(
"
\n
\
printf
(
"
\n
\
----- A -----
\n
\
alter database <db_name> <db_options>
\n
\
alter dnode <dnode_id> balance
\n
\
...
...
@@ -573,8 +458,9 @@ void showHelp() {
printf
(
"
\n\n
"
);
//define in getDuration() function
printf
(
"\
// define in getDuration() function
printf
(
"\
Timestamp expression Format:
\n
\
b - nanosecond
\n
\
u - microsecond
\n
\
...
...
@@ -597,11 +483,10 @@ void showHelp() {
#define SHELL_COMMAND_COUNT() (sizeof(shellCommands) / sizeof(SWords))
// get at
SWord
*
atWord
(
SWords
*
command
,
int32_t
index
)
{
SWord
*
word
=
command
->
head
;
SWord
*
atWord
(
SWords
*
command
,
int32_t
index
)
{
SWord
*
word
=
command
->
head
;
for
(
int32_t
i
=
0
;
i
<
index
;
i
++
)
{
if
(
word
==
NULL
)
return
NULL
;
if
(
word
==
NULL
)
return
NULL
;
word
=
word
->
next
;
}
...
...
@@ -612,17 +497,16 @@ SWord * atWord(SWords * command, int32_t index) {
int
wordType
(
const
char
*
p
,
int32_t
len
)
{
for
(
int
i
=
0
;
i
<
WT_VAR_CNT
;
i
++
)
{
if
(
strncmp
(
p
,
varTypes
[
i
],
len
)
==
0
)
return
i
;
if
(
strncmp
(
p
,
varTypes
[
i
],
len
)
==
0
)
return
i
;
}
return
WT_TEXT
;
}
// add word
SWord
*
addWord
(
const
char
*
p
,
int32_t
len
,
bool
pattern
)
{
SWord
*
word
=
(
SWord
*
)
taosMemoryMalloc
(
sizeof
(
SWord
));
SWord
*
addWord
(
const
char
*
p
,
int32_t
len
,
bool
pattern
)
{
SWord
*
word
=
(
SWord
*
)
taosMemoryMalloc
(
sizeof
(
SWord
));
memset
(
word
,
0
,
sizeof
(
SWord
));
word
->
word
=
(
char
*
)
p
;
word
->
word
=
(
char
*
)
p
;
word
->
len
=
len
;
// check format
...
...
@@ -636,8 +520,8 @@ SWord * addWord(const char* p, int32_t len, bool pattern) {
}
// parse one command
void
parseCommand
(
SWords
*
command
,
bool
pattern
)
{
char
*
p
=
command
->
source
;
void
parseCommand
(
SWords
*
command
,
bool
pattern
)
{
char
*
p
=
command
->
source
;
int32_t
start
=
0
;
int32_t
size
=
command
->
source_len
>
0
?
command
->
source_len
:
strlen
(
p
);
...
...
@@ -647,12 +531,12 @@ void parseCommand(SWords * command, bool pattern) {
// check continue blank like ' '
if
(
p
[
i
]
==
' '
)
{
if
(
lastBlank
)
{
start
++
;
start
++
;
continue
;
}
if
(
i
==
0
)
{
// first blank
lastBlank
=
true
;
start
++
;
start
++
;
continue
;
}
lastBlank
=
true
;
...
...
@@ -663,12 +547,12 @@ void parseCommand(SWords * command, bool pattern) {
command
->
head
=
addWord
(
p
+
start
,
i
-
start
,
pattern
);
command
->
count
=
1
;
}
else
{
SWord
*
word
=
command
->
head
;
SWord
*
word
=
command
->
head
;
while
(
word
->
next
)
{
word
=
word
->
next
;
}
word
->
next
=
addWord
(
p
+
start
,
i
-
start
,
pattern
);
command
->
count
++
;
command
->
count
++
;
}
start
=
i
+
1
;
}
else
{
...
...
@@ -678,25 +562,23 @@ void parseCommand(SWords * command, bool pattern) {
}
// free SShellCmd
void
freeCommand
(
SWords
*
command
)
{
SWord
*
word
=
command
->
head
;
void
freeCommand
(
SWords
*
command
)
{
SWord
*
word
=
command
->
head
;
if
(
word
==
NULL
)
{
return
;
return
;
}
// loop
while
(
word
->
next
)
{
SWord
*
tmp
=
word
;
SWord
*
tmp
=
word
;
word
=
word
->
next
;
// if malloc need free
if
(
tmp
->
free
&&
tmp
->
word
)
taosMemoryFree
(
tmp
->
word
);
if
(
tmp
->
free
&&
tmp
->
word
)
taosMemoryFree
(
tmp
->
word
);
taosMemoryFree
(
tmp
);
}
// if malloc need free
if
(
word
->
free
&&
word
->
word
)
taosMemoryFree
(
word
->
word
);
if
(
word
->
free
&&
word
->
word
)
taosMemoryFree
(
word
->
word
);
taosMemoryFree
(
word
);
}
...
...
@@ -715,12 +597,11 @@ void GenerateVarType(int type, char** p, int count) {
// -------------------- shell auto ----------------
//
// init shell auto funciton , shell start call once
bool
shellAutoInit
()
{
// command
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
);
}
...
...
@@ -732,30 +613,28 @@ bool shellAutoInit() {
memset
(
threads
,
0
,
sizeof
(
TdThread
*
)
*
WT_FROM_DB_CNT
);
// generate varType
GenerateVarType
(
WT_VAR_FUNC
,
functions
,
sizeof
(
functions
)
/
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_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_DATATYPE
,
data_types
,
sizeof
(
data_types
)
/
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_USERACTION
,
user_actions
,
sizeof
(
user_actions
)
/
sizeof
(
char
*
));
GenerateVarType
(
WT_VAR_KEYSELECT
,
key_select
,
sizeof
(
key_select
)
/
sizeof
(
char
*
));
GenerateVarType
(
WT_VAR_FUNC
,
functions
,
sizeof
(
functions
)
/
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_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_DATATYPE
,
data_types
,
sizeof
(
data_types
)
/
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_USERACTION
,
user_actions
,
sizeof
(
user_actions
)
/
sizeof
(
char
*
));
GenerateVarType
(
WT_VAR_KEYSELECT
,
key_select
,
sizeof
(
key_select
)
/
sizeof
(
char
*
));
return
true
;
}
// set conn
void
shellSetConn
(
TAOS
*
conn
)
{
varCon
=
conn
;
}
void
shellSetConn
(
TAOS
*
conn
)
{
varCon
=
conn
;
}
// exit shell auto funciton, shell exit call once
void
shellAutoExit
()
{
// free command
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
);
}
...
...
@@ -790,8 +669,7 @@ void shellAutoExit() {
// ------------------- auto ptr for tires --------------------------
//
bool
setNewAuotPtr
(
int
type
,
STire
*
pNew
)
{
if
(
pNew
==
NULL
)
return
false
;
if
(
pNew
==
NULL
)
return
false
;
taosThreadMutexLock
(
&
tiresMutex
);
STire
*
pOld
=
tires
[
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
void
putBackAutoPtr
(
int
type
,
STire
*
tire
)
{
if
(
tire
==
NULL
)
{
return
;
return
;
}
taosThreadMutexLock
(
&
tiresMutex
);
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
)
{
// support multi thread getAuotPtr
freeTire
(
tire
);
...
...
@@ -843,11 +721,9 @@ void putBackAutoPtr(int type, STire* tire) {
}
taosThreadMutexUnlock
(
&
tiresMutex
);
return
;
return
;
}
//
// ------------------- var Word --------------------------
//
...
...
@@ -861,7 +737,7 @@ int writeVarNames(int type, TAOS_RES* tres) {
return
0
;
}
TAOS_FIELD
*
fields
=
taos_fetch_fields
(
tres
);
TAOS_FIELD
*
fields
=
taos_fetch_fields
(
tres
);
// create new tires
char
tireType
=
type
==
WT_VAR_TABLE
?
TIRE_TREE
:
TIRE_LIST
;
STire
*
tire
=
createTire
(
tireType
);
...
...
@@ -872,17 +748,17 @@ int writeVarNames(int type, TAOS_RES* tres) {
do
{
int32_t
*
lengths
=
taos_fetch_lengths
(
tres
);
int32_t
bytes
=
lengths
[
0
];
if
(
fields
[
0
].
type
==
TSDB_DATA_TYPE_INT
)
{
sprintf
(
name
,
"%d"
,
*
(
int16_t
*
)
row
[
0
]);
if
(
fields
[
0
].
type
==
TSDB_DATA_TYPE_INT
)
{
sprintf
(
name
,
"%d"
,
*
(
int16_t
*
)
row
[
0
]);
}
else
{
memcpy
(
name
,
row
[
0
],
bytes
);
}
name
[
bytes
]
=
0
;
//
set string end
name
[
bytes
]
=
0
;
//
set string end
// insert to tire
insertWord
(
tire
,
name
);
if
(
++
numOfRows
>
MAX_CACHED_CNT
)
{
if
(
++
numOfRows
>
MAX_CACHED_CNT
)
{
break
;
}
...
...
@@ -895,12 +771,12 @@ int writeVarNames(int type, TAOS_RES* tres) {
return
numOfRows
;
}
bool
firstMatchCommand
(
TAOS
*
con
,
SShellCmd
*
cmd
);
bool
firstMatchCommand
(
TAOS
*
con
,
SShellCmd
*
cmd
);
//
// thread obtain var thread from db server
//
void
*
varObtainThread
(
void
*
param
)
{
int
type
=
*
(
int
*
)
param
;
int
type
=
*
(
int
*
)
param
;
taosMemoryFree
(
param
);
if
(
varCon
==
NULL
||
type
>
WT_FROM_DB_MAX
)
{
...
...
@@ -952,8 +828,7 @@ char* matchNextPrefix(STire* tire, char* pre) {
// save to lastMatch
if
(
match
)
{
if
(
lastMatch
)
freeMatch
(
lastMatch
);
if
(
lastMatch
)
freeMatch
(
lastMatch
);
lastMatch
=
match
;
}
}
...
...
@@ -1008,11 +883,10 @@ char* tireSearchWord(int type, char* pre) {
return
NULL
;
}
if
(
type
>
WT_FROM_DB_MAX
)
{
if
(
type
>
WT_FROM_DB_MAX
)
{
// NOT FROM DB , tires[type] alwary not null
STire
*
tire
=
tires
[
type
];
if
(
tire
==
NULL
)
return
NULL
;
if
(
tire
==
NULL
)
return
NULL
;
return
matchNextPrefix
(
tire
,
pre
);
}
...
...
@@ -1035,8 +909,8 @@ char* tireSearchWord(int type, char* pre) {
}
// create new
void
*
param
=
taosMemoryMalloc
(
sizeof
(
int
));
*
((
int
*
)
param
)
=
type
;
void
*
param
=
taosMemoryMalloc
(
sizeof
(
int
));
*
((
int
*
)
param
)
=
type
;
threads
[
type
]
=
taosCreateThread
(
varObtainThread
,
param
);
taosThreadMutexUnlock
(
&
tiresMutex
);
return
NULL
;
...
...
@@ -1069,8 +943,7 @@ bool matchVarWord(SWord* word1, SWord* word2) {
str
=
tireSearchWord
(
WT_VAR_STABLE
,
pre
);
if
(
str
==
NULL
)
{
str
=
tireSearchWord
(
WT_VAR_TABLE
,
pre
);
if
(
str
==
NULL
)
return
false
;
if
(
str
==
NULL
)
return
false
;
}
}
else
{
// OTHER
...
...
@@ -1082,7 +955,7 @@ bool matchVarWord(SWord* word1, SWord* word2) {
}
// free previous malloc
if
(
word1
->
free
&&
word1
->
word
)
{
if
(
word1
->
free
&&
word1
->
word
)
{
taosMemoryFree
(
word1
->
word
);
}
...
...
@@ -1098,11 +971,10 @@ bool matchVarWord(SWord* word1, SWord* word2) {
// ------------------- match words --------------------------
//
// compare command cmd1 come from shellCommands , cmd2 come from user input
int32_t
compareCommand
(
SWords
*
cmd1
,
SWords
*
cmd2
)
{
SWord
*
word1
=
cmd1
->
head
;
SWord
*
word2
=
cmd2
->
head
;
int32_t
compareCommand
(
SWords
*
cmd1
,
SWords
*
cmd2
)
{
SWord
*
word1
=
cmd1
->
head
;
SWord
*
word2
=
cmd2
->
head
;
if
(
word1
==
NULL
||
word2
==
NULL
)
{
return
-
1
;
...
...
@@ -1112,8 +984,7 @@ int32_t compareCommand(SWords * cmd1, SWords * cmd2) {
if
(
word1
->
type
==
WT_TEXT
)
{
// WT_TEXT match
if
(
word1
->
len
==
word2
->
len
)
{
if
(
strncasecmp
(
word1
->
word
,
word2
->
word
,
word1
->
len
)
!=
0
)
return
-
1
;
if
(
strncasecmp
(
word1
->
word
,
word2
->
word
,
word1
->
len
)
!=
0
)
return
-
1
;
}
else
if
(
word1
->
len
<
word2
->
len
)
{
return
-
1
;
}
else
{
...
...
@@ -1151,10 +1022,10 @@ int32_t compareCommand(SWords * cmd1, SWords * cmd2) {
}
// match command
SWords
*
matchCommand
(
SWords
*
input
,
bool
continueSearch
)
{
SWords
*
matchCommand
(
SWords
*
input
,
bool
continueSearch
)
{
int32_t
count
=
SHELL_COMMAND_COUNT
();
for
(
int32_t
i
=
0
;
i
<
count
;
i
++
)
{
SWords
*
shellCommand
=
shellCommands
+
i
;
for
(
int32_t
i
=
0
;
i
<
count
;
i
++
)
{
SWords
*
shellCommand
=
shellCommands
+
i
;
if
(
continueSearch
&&
lastMatchIndex
!=
-
1
&&
i
<=
lastMatchIndex
)
{
// new match must greate than lastMatchIndex
if
(
varMode
&&
i
==
lastMatchIndex
)
{
...
...
@@ -1165,15 +1036,14 @@ SWords * matchCommand(SWords * input, bool continueSearch) {
}
// command is large
if
(
input
->
count
>
shellCommand
->
count
)
{
if
(
input
->
count
>
shellCommand
->
count
)
{
continue
;
}
// compare
int32_t
index
=
compareCommand
(
shellCommand
,
input
);
if
(
index
!=
-
1
)
{
if
(
firstMatchIndex
==
-
1
)
firstMatchIndex
=
i
;
if
(
firstMatchIndex
==
-
1
)
firstMatchIndex
=
i
;
curMatchIndex
=
i
;
return
&
shellCommands
[
i
];
}
...
...
@@ -1188,7 +1058,7 @@ SWords * matchCommand(SWords * input, bool continueSearch) {
//
// delete char count
void
deleteCount
(
SShellCmd
*
cmd
,
int
count
)
{
void
deleteCount
(
SShellCmd
*
cmd
,
int
count
)
{
int
size
=
0
;
int
width
=
0
;
int
prompt_size
=
6
;
...
...
@@ -1207,30 +1077,29 @@ void deleteCount(SShellCmd * cmd, int count) {
}
// show screen
void
printScreen
(
TAOS
*
con
,
SShellCmd
*
cmd
,
SWords
*
match
)
{
void
printScreen
(
TAOS
*
con
,
SShellCmd
*
cmd
,
SWords
*
match
)
{
// modify SShellCmd
if
(
firstMatchIndex
==
-
1
||
curMatchIndex
==
-
1
)
{
// no match
return
;
return
;
}
// first tab press
const
char
*
str
=
NULL
;
const
char
*
str
=
NULL
;
int
strLen
=
0
;
if
(
firstMatchIndex
==
curMatchIndex
&&
lastWordBytes
==
-
1
)
{
// first press tab
SWord
*
word
=
MATCH_WORD
(
match
);
SWord
*
word
=
MATCH_WORD
(
match
);
str
=
word
->
word
+
match
->
matchLen
;
strLen
=
word
->
len
-
match
->
matchLen
;
lastMatchIndex
=
firstMatchIndex
;
lastWordBytes
=
word
->
len
;
}
else
{
if
(
lastWordBytes
==
-
1
)
return
;
if
(
lastWordBytes
==
-
1
)
return
;
deleteCount
(
cmd
,
lastWordBytes
);
SWord
*
word
=
MATCH_WORD
(
match
);
SWord
*
word
=
MATCH_WORD
(
match
);
str
=
word
->
word
;
strLen
=
word
->
len
;
// set current to last
...
...
@@ -1239,14 +1108,13 @@ void printScreen(TAOS * con, SShellCmd * cmd, SWords * match) {
}
// insert new
shellInsertChar
(
cmd
,
(
char
*
)
str
,
strLen
);
shellInsertChar
(
cmd
,
(
char
*
)
str
,
strLen
);
}
// main key press tab , matched return true else false
bool
firstMatchCommand
(
TAOS
*
con
,
SShellCmd
*
cmd
)
{
bool
firstMatchCommand
(
TAOS
*
con
,
SShellCmd
*
cmd
)
{
// parse command
SWords
*
input
=
(
SWords
*
)
taosMemoryMalloc
(
sizeof
(
SWords
));
SWords
*
input
=
(
SWords
*
)
taosMemoryMalloc
(
sizeof
(
SWords
));
memset
(
input
,
0
,
sizeof
(
SWords
));
input
->
source
=
cmd
->
command
;
input
->
source_len
=
cmd
->
commandSize
;
...
...
@@ -1255,7 +1123,7 @@ bool firstMatchCommand(TAOS * con, SShellCmd * cmd) {
// if have many , default match first, if press tab again , switch to next
curMatchIndex
=
-
1
;
lastMatchIndex
=
-
1
;
SWords
*
match
=
matchCommand
(
input
,
true
);
SWords
*
match
=
matchCommand
(
input
,
true
);
if
(
match
==
NULL
)
{
// not match , nothing to do
freeCommand
(
input
);
...
...
@@ -1271,14 +1139,14 @@ bool firstMatchCommand(TAOS * con, SShellCmd * cmd) {
}
// 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
//
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
for
(
int
i
=
0
;
i
<
firstMatch
->
matchIndex
&&
word
;
i
++
)
{
...
...
@@ -1297,11 +1165,11 @@ void createInputFromFirst(SWords* input, SWords * firstMatch) {
}
// 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
)
{
return
false
;
}
SWords
*
input
=
(
SWords
*
)
taosMemoryMalloc
(
sizeof
(
SWords
));
SWords
*
input
=
(
SWords
*
)
taosMemoryMalloc
(
sizeof
(
SWords
));
memset
(
input
,
0
,
sizeof
(
SWords
));
// create input from firstMatch
...
...
@@ -1311,7 +1179,7 @@ bool nextMatchCommand(TAOS * con, SShellCmd * cmd, SWords * firstMatch) {
parseCommand
(
input
,
false
);
// 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 not match , reset all index
firstMatchIndex
=
-
1
;
...
...
@@ -1319,8 +1187,7 @@ bool nextMatchCommand(TAOS * con, SShellCmd * cmd, SWords * firstMatch) {
match
=
matchCommand
(
input
,
false
);
if
(
match
==
NULL
)
{
freeCommand
(
input
);
if
(
input
->
source
)
taosMemoryFree
(
input
->
source
);
if
(
input
->
source
)
taosMemoryFree
(
input
->
source
);
taosMemoryFree
(
input
);
return
false
;
}
...
...
@@ -1341,7 +1208,7 @@ bool nextMatchCommand(TAOS * con, SShellCmd * cmd, SWords * firstMatch) {
}
// 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
STire
*
tire
=
tires
[
type
];
char
*
str
=
matchNextPrefix
(
tire
,
pre
);
...
...
@@ -1350,7 +1217,7 @@ bool fillWithType(TAOS * con, SShellCmd * cmd, char* pre, int type) {
}
// need insert part string
char
*
part
=
str
+
strlen
(
pre
);
char
*
part
=
str
+
strlen
(
pre
);
// show
int
count
=
strlen
(
part
);
...
...
@@ -1362,20 +1229,19 @@ bool fillWithType(TAOS * con, SShellCmd * cmd, char* pre, int type) {
}
// fill with type
bool
fillTableName
(
TAOS
*
con
,
SShellCmd
*
cmd
,
char
*
pre
)
{
bool
fillTableName
(
TAOS
*
con
,
SShellCmd
*
cmd
,
char
*
pre
)
{
// search stable and table
char
*
str
=
tireSearchWord
(
WT_VAR_STABLE
,
pre
);
char
*
str
=
tireSearchWord
(
WT_VAR_STABLE
,
pre
);
if
(
str
==
NULL
)
{
str
=
tireSearchWord
(
WT_VAR_TABLE
,
pre
);
if
(
str
==
NULL
)
return
false
;
if
(
str
==
NULL
)
return
false
;
}
// need insert part string
char
*
part
=
str
+
strlen
(
pre
);
char
*
part
=
str
+
strlen
(
pre
);
// delete autofill count last append
if
(
cntDel
>
0
)
{
if
(
cntDel
>
0
)
{
deleteCount
(
cmd
,
cntDel
);
cntDel
=
0
;
}
...
...
@@ -1396,16 +1262,16 @@ bool fillTableName(TAOS * con, SShellCmd * cmd, char* pre) {
// 2 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 ','
char
*
p1
=
strrchr
(
p
,
' '
);
char
*
p2
=
strrchr
(
p
,
','
);
char
*
p1
=
strrchr
(
p
,
' '
);
char
*
p2
=
strrchr
(
p
,
','
);
if
(
p1
&&
p2
)
{
return
p1
>
p2
?
p1
:
p2
+
1
;
}
else
if
(
p1
)
{
return
p1
+
1
;
}
else
if
(
p2
)
{
}
else
if
(
p2
)
{
return
p2
+
1
;
}
else
{
return
p
;
...
...
@@ -1425,18 +1291,18 @@ bool fieldsInputEnd(char* sql) {
}
// not in ','
char
*
p3
=
strrchr
(
sql
,
','
);
char
*
p
=
p3
;
char
*
p3
=
strrchr
(
sql
,
','
);
char
*
p
=
p3
;
// like select ts, age,' '
if
(
p
)
{
++
p
;
bool
allBlank
=
true
;
// after last ',' all char is blank
int
cnt
=
0
;
// blank count , like ' ' as one blank
char
*
plast
=
NULL
;
// last blank position
while
(
*
p
)
{
char
*
plast
=
NULL
;
// last blank position
while
(
*
p
)
{
if
(
*
p
==
' '
)
{
plast
=
p
;
cnt
++
;
cnt
++
;
}
else
{
allBlank
=
false
;
}
...
...
@@ -1444,7 +1310,7 @@ bool fieldsInputEnd(char* sql) {
}
// any one word is not blank
if
(
allBlank
)
{
if
(
allBlank
)
{
return
false
;
}
...
...
@@ -1454,13 +1320,13 @@ bool fieldsInputEnd(char* sql) {
}
// 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
;
}
}
char
*
p4
=
strrchr
(
sql
,
' '
);
if
(
p4
==
NULL
)
{
char
*
p4
=
strrchr
(
sql
,
' '
);
if
(
p4
==
NULL
)
{
// only one word
return
false
;
}
...
...
@@ -1469,9 +1335,9 @@ bool fieldsInputEnd(char* sql) {
}
// need insert from
bool
needInsertFrom
(
char
*
sql
,
int
len
)
{
bool
needInsertFrom
(
char
*
sql
,
int
len
)
{
// last is blank
if
(
sql
[
len
-
1
]
!=
' '
)
{
if
(
sql
[
len
-
1
]
!=
' '
)
{
// insert from keyword
return
false
;
}
...
...
@@ -1486,33 +1352,33 @@ bool needInsertFrom(char * sql, int len) {
}
// 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
);
// union all
char
*
p1
;
char
*
p1
;
do
{
p1
=
strstr
(
p
,
UNION_ALL
);
if
(
p1
)
{
if
(
p1
)
{
p
=
p1
+
strlen
(
UNION_ALL
);
}
}
while
(
p1
);
char
*
from
=
strstr
(
p
,
" from "
);
//last word , maybe empty string or some letters of a string
char
*
last
=
lastWord
(
p
);
char
*
from
=
strstr
(
p
,
" from "
);
//
last word , maybe empty string or some letters of a string
char
*
last
=
lastWord
(
p
);
bool
ret
=
false
;
if
(
from
==
NULL
)
{
bool
fieldEnd
=
fieldsInputEnd
(
p
);
// cheeck fields input end then insert from keyword
if
(
fieldEnd
&&
p
[
len
-
1
]
==
' '
)
{
if
(
fieldEnd
&&
p
[
len
-
1
]
==
' '
)
{
shellInsertChar
(
cmd
,
"from"
,
4
);
taosMemoryFree
(
p
);
return
true
;
}
// fill funciton
if
(
fieldEnd
)
{
if
(
fieldEnd
)
{
// fields is end , need match keyword
ret
=
fillWithType
(
con
,
cmd
,
last
,
WT_VAR_KEYWORD
);
}
else
{
...
...
@@ -1524,7 +1390,7 @@ bool appendAfterSelect(TAOS * con, SShellCmd * cmd, char* sql, int32_t len) {
}
// have from
char
*
blank
=
strstr
(
from
+
6
,
" "
);
char
*
blank
=
strstr
(
from
+
6
,
" "
);
if
(
blank
==
NULL
)
{
// no table name, need fill
ret
=
fillTableName
(
con
,
cmd
,
last
);
...
...
@@ -1538,13 +1404,12 @@ bool appendAfterSelect(TAOS * con, SShellCmd * cmd, char* sql, int32_t len) {
int32_t
searchAfterSelect
(
char
*
p
,
int32_t
len
)
{
// select * from st;
if
(
strncasecmp
(
p
,
"select "
,
7
)
==
0
)
{
if
(
strncasecmp
(
p
,
"select "
,
7
)
==
0
)
{
// check nest query
char
*
p1
=
p
+
7
;
while
(
1
)
{
char
*
p2
=
strstr
(
p1
,
"select "
);
if
(
p2
==
NULL
)
break
;
char
*
p1
=
p
+
7
;
while
(
1
)
{
char
*
p2
=
strstr
(
p1
,
"select "
);
if
(
p2
==
NULL
)
break
;
p1
=
p2
+
7
;
}
...
...
@@ -1552,29 +1417,29 @@ int32_t searchAfterSelect(char* p, int32_t len) {
}
// explain as select * from st;
if
(
strncasecmp
(
p
,
"explain select "
,
15
)
==
0
)
{
if
(
strncasecmp
(
p
,
"explain select "
,
15
)
==
0
)
{
return
15
;
}
char
*
as_pos_end
=
strstr
(
p
,
" as select "
);
if
(
as_pos_end
==
NULL
)
return
-
1
;
if
(
as_pos_end
==
NULL
)
return
-
1
;
as_pos_end
+=
11
;
// create stream <stream_name> as select
if
(
strncasecmp
(
p
,
"create stream "
,
14
)
==
0
)
{
return
as_pos_end
-
p
;;
if
(
strncasecmp
(
p
,
"create stream "
,
14
)
==
0
)
{
return
as_pos_end
-
p
;
;
}
// 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
-
1
;
}
bool
matchSelectQuery
(
TAOS
*
con
,
SShellCmd
*
cmd
)
{
bool
matchSelectQuery
(
TAOS
*
con
,
SShellCmd
*
cmd
)
{
// if continue press Tab , delete bytes by previous autofill
if
(
cntDel
>
0
)
{
deleteCount
(
cmd
,
cntDel
);
...
...
@@ -1583,7 +1448,7 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) {
// match select ...
int
len
=
cmd
->
commandSize
;
char
*
p
=
cmd
->
command
;
char
*
p
=
cmd
->
command
;
// remove prefix blank
while
(
p
[
0
]
==
' '
&&
len
>
0
)
{
...
...
@@ -1592,7 +1457,7 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) {
}
// special range
if
(
len
<
7
||
len
>
512
)
{
if
(
len
<
7
||
len
>
512
)
{
return
false
;
}
...
...
@@ -1600,8 +1465,7 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) {
char
*
sql_cp
=
strndup
(
p
,
len
);
int32_t
n
=
searchAfterSelect
(
sql_cp
,
len
);
taosMemoryFree
(
sql_cp
);
if
(
n
==
-
1
||
n
>
len
)
return
false
;
if
(
n
==
-
1
||
n
>
len
)
return
false
;
p
+=
n
;
len
-=
n
;
...
...
@@ -1610,15 +1474,15 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) {
}
// if is input create fields or tags area, return true
bool
isCreateFieldsArea
(
char
*
p
)
{
char
*
left
=
strrchr
(
p
,
'('
);
bool
isCreateFieldsArea
(
char
*
p
)
{
char
*
left
=
strrchr
(
p
,
'('
);
if
(
left
==
NULL
)
{
// like 'create table st'
return
false
;
}
char
*
right
=
strrchr
(
p
,
')'
);
if
(
right
==
NULL
)
{
char
*
right
=
strrchr
(
p
,
')'
);
if
(
right
==
NULL
)
{
// like 'create table st( '
return
true
;
}
...
...
@@ -1631,7 +1495,7 @@ bool isCreateFieldsArea(char * p) {
return
false
;
}
bool
matchCreateTable
(
TAOS
*
con
,
SShellCmd
*
cmd
)
{
bool
matchCreateTable
(
TAOS
*
con
,
SShellCmd
*
cmd
)
{
// if continue press Tab , delete bytes by previous autofill
if
(
cntDel
>
0
)
{
deleteCount
(
cmd
,
cntDel
);
...
...
@@ -1640,7 +1504,7 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) {
// match select ...
int
len
=
cmd
->
commandSize
;
char
*
p
=
cmd
->
command
;
char
*
p
=
cmd
->
command
;
// remove prefix blank
while
(
p
[
0
]
==
' '
&&
len
>
0
)
{
...
...
@@ -1649,12 +1513,12 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) {
}
// special range
if
(
len
<
7
||
len
>
1024
)
{
if
(
len
<
7
||
len
>
1024
)
{
return
false
;
}
// select and from
if
(
strncasecmp
(
p
,
"create table "
,
13
)
!=
0
)
{
if
(
strncasecmp
(
p
,
"create table "
,
13
)
!=
0
)
{
// not select query clause
return
false
;
}
...
...
@@ -1663,7 +1527,7 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) {
char
*
ps
=
strndup
(
p
,
len
);
bool
ret
=
false
;
char
*
last
=
lastWord
(
ps
);
char
*
last
=
lastWord
(
ps
);
// check in create fields or tags input area
if
(
isCreateFieldsArea
(
ps
))
{
...
...
@@ -1673,9 +1537,9 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) {
// tags
if
(
!
ret
)
{
// find only one ')' , can insert tags
char
*
p1
=
strchr
(
ps
,
')'
);
char
*
p1
=
strchr
(
ps
,
')'
);
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
ret
=
fillWithType
(
con
,
cmd
,
last
,
WT_VAR_KEYTAGS
);
}
...
...
@@ -1685,9 +1549,9 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) {
// tb options
if
(
!
ret
)
{
// 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
(
strchr
(
p1
+
1
,
')'
))
{
// second ')' end
if
(
strchr
(
p1
+
1
,
')'
))
{
// second ')' end
// here is tb options area, can insert option
ret
=
fillWithType
(
con
,
cmd
,
last
,
WT_VAR_TBOPTION
);
}
...
...
@@ -1698,7 +1562,7 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) {
return
ret
;
}
bool
matchOther
(
TAOS
*
con
,
SShellCmd
*
cmd
)
{
bool
matchOther
(
TAOS
*
con
,
SShellCmd
*
cmd
)
{
int
len
=
cmd
->
commandSize
;
char
*
p
=
cmd
->
command
;
...
...
@@ -1711,8 +1575,7 @@ bool matchOther(TAOS * con, SShellCmd * cmd) {
}
// too small
if
(
len
<
8
)
return
false
;
if
(
len
<
8
)
return
false
;
// like 'from ( '
char
*
sql
=
strndup
(
p
,
len
);
...
...
@@ -1731,26 +1594,25 @@ bool matchOther(TAOS * con, SShellCmd * cmd) {
// find last ' from'
while
(
from
)
{
char
*
p1
=
strstr
(
from
+
5
,
" from"
);
if
(
p1
==
NULL
)
break
;
if
(
p1
==
NULL
)
break
;
from
=
p1
;
}
if
(
from
)
{
// find next is '('
char
*
p2
=
from
+
5
;
char
*
p2
=
from
+
5
;
bool
found
=
false
;
// found 'from ... ( ...' ... is any count of blank
bool
found1
=
false
;
// found '('
while
(
1
)
{
if
(
p2
==
last
||
*
p2
==
'\0'
)
{
if
(
p2
==
last
||
*
p2
==
'\0'
)
{
// last word or string end
if
(
found1
)
{
found
=
true
;
}
break
;
}
else
if
(
*
p2
==
'('
)
{
}
else
if
(
*
p2
==
'('
)
{
found1
=
true
;
}
else
if
(
*
p2
==
' '
)
{
}
else
if
(
*
p2
==
' '
)
{
// do nothing
}
else
{
// have any other char
...
...
@@ -1770,21 +1632,19 @@ bool matchOther(TAOS * con, SShellCmd * cmd) {
// INSERT
taosMemoryFree
(
sql
);
return
false
;
}
// main key press tab
void
pressTabKey
(
SShellCmd
*
cmd
)
{
void
pressTabKey
(
SShellCmd
*
cmd
)
{
// check
if
(
cmd
->
commandSize
==
0
)
{
// empty
showHelp
();
shellShowOnScreen
(
cmd
);
return
;
return
;
}
// save connection to global
...
...
@@ -1793,8 +1653,7 @@ void pressTabKey(SShellCmd * cmd) {
// manual match like create table st( ...
matched
=
matchCreateTable
(
varCon
,
cmd
);
if
(
matched
)
return
;
if
(
matched
)
return
;
// shellCommands match
if
(
firstMatchIndex
==
-
1
)
{
...
...
@@ -1802,21 +1661,18 @@ void pressTabKey(SShellCmd * cmd) {
}
else
{
matched
=
nextMatchCommand
(
varCon
,
cmd
,
&
shellCommands
[
firstMatchIndex
]);
}
if
(
matched
)
return
;
if
(
matched
)
return
;
// NOT MATCHED ANYONE
// match other like '\G' ...
matched
=
matchOther
(
varCon
,
cmd
);
if
(
matched
)
return
;
if
(
matched
)
return
;
// manual match like select * from ...
matched
=
matchSelectQuery
(
varCon
,
cmd
);
if
(
matched
)
return
;
if
(
matched
)
return
;
return
;
return
;
}
// press othr key
...
...
@@ -1840,18 +1696,18 @@ void pressOtherKey(char c) {
}
// put name into name, return name length
int
getWordName
(
char
*
p
,
char
*
name
,
int
nameLen
)
{
//remove prefix blank
int
getWordName
(
char
*
p
,
char
*
name
,
int
nameLen
)
{
//
remove prefix blank
while
(
*
p
==
' '
)
{
p
++
;
}
// get databases name;
int
i
=
0
;
while
(
p
[
i
]
!=
0
&&
i
<
nameLen
-
1
)
{
while
(
p
[
i
]
!=
0
&&
i
<
nameLen
-
1
)
{
name
[
i
]
=
p
[
i
];
i
++
;
if
(
p
[
i
]
==
' '
||
p
[
i
]
==
';'
||
p
[
i
]
==
'('
)
{
if
(
p
[
i
]
==
' '
||
p
[
i
]
==
';'
||
p
[
i
]
==
'('
)
{
// name end
break
;
}
...
...
@@ -1862,14 +1718,14 @@ int getWordName(char* p, char * name, int nameLen) {
}
// deal use db, if have 'use' return true
bool
dealUseDB
(
char
*
sql
)
{
bool
dealUseDB
(
char
*
sql
)
{
// check use keyword
if
(
strncasecmp
(
sql
,
"use "
,
4
)
!=
0
)
{
if
(
strncasecmp
(
sql
,
"use "
,
4
)
!=
0
)
{
return
false
;
}
char
db
[
256
];
char
*
p
=
sql
+
4
;
char
*
p
=
sql
+
4
;
if
(
getWordName
(
p
,
db
,
sizeof
(
db
))
==
0
)
{
// no name , return
return
true
;
...
...
@@ -1886,13 +1742,13 @@ bool dealUseDB(char * sql) {
// STABLE set null
STire
*
tire
=
tires
[
WT_VAR_STABLE
];
tires
[
WT_VAR_STABLE
]
=
NULL
;
if
(
tire
)
{
if
(
tire
)
{
freeTire
(
tire
);
}
// TABLE set null
tire
=
tires
[
WT_VAR_TABLE
];
tires
[
WT_VAR_TABLE
]
=
NULL
;
if
(
tire
)
{
if
(
tire
)
{
freeTire
(
tire
);
}
// save
...
...
@@ -1903,14 +1759,14 @@ bool dealUseDB(char * sql) {
}
// deal create, if have 'create' return true
bool
dealCreateCommand
(
char
*
sql
)
{
bool
dealCreateCommand
(
char
*
sql
)
{
// check keyword
if
(
strncasecmp
(
sql
,
"create "
,
7
)
!=
0
)
{
if
(
strncasecmp
(
sql
,
"create "
,
7
)
!=
0
)
{
return
false
;
}
char
name
[
1024
];
char
*
p
=
sql
+
7
;
char
*
p
=
sql
+
7
;
if
(
getWordName
(
p
,
name
,
sizeof
(
name
))
==
0
)
{
// no name , return
return
true
;
...
...
@@ -1921,7 +1777,7 @@ bool dealCreateCommand(char * sql) {
if
(
strcasecmp
(
name
,
"database"
)
==
0
)
{
type
=
WT_VAR_DBNAME
;
}
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
;
else
type
=
WT_VAR_TABLE
;
...
...
@@ -1949,7 +1805,7 @@ bool dealCreateCommand(char * sql) {
taosThreadMutexLock
(
&
tiresMutex
);
// STABLE set null
STire
*
tire
=
tires
[
type
];
if
(
tire
)
{
if
(
tire
)
{
insertWord
(
tire
,
name
);
}
taosThreadMutexUnlock
(
&
tiresMutex
);
...
...
@@ -1958,14 +1814,14 @@ bool dealCreateCommand(char * sql) {
}
// deal create, if have 'drop' return true
bool
dealDropCommand
(
char
*
sql
)
{
bool
dealDropCommand
(
char
*
sql
)
{
// check keyword
if
(
strncasecmp
(
sql
,
"drop "
,
5
)
!=
0
)
{
if
(
strncasecmp
(
sql
,
"drop "
,
5
)
!=
0
)
{
return
false
;
}
char
name
[
1024
];
char
*
p
=
sql
+
5
;
char
*
p
=
sql
+
5
;
if
(
getWordName
(
p
,
name
,
sizeof
(
name
))
==
0
)
{
// no name , return
return
true
;
...
...
@@ -2002,23 +1858,20 @@ bool dealDropCommand(char * sql) {
// switch new db
taosThreadMutexLock
(
&
tiresMutex
);
// STABLE set null
if
(
type
==
WT_VAR_ALLTABLE
)
{
if
(
type
==
WT_VAR_ALLTABLE
)
{
bool
del
=
false
;
// del in stable
STire
*
tire
=
tires
[
WT_VAR_STABLE
];
if
(
tire
)
del
=
deleteWord
(
tire
,
name
);
if
(
tire
)
del
=
deleteWord
(
tire
,
name
);
// del in table
if
(
!
del
)
{
if
(
!
del
)
{
tire
=
tires
[
WT_VAR_TABLE
];
if
(
tire
)
del
=
deleteWord
(
tire
,
name
);
if
(
tire
)
del
=
deleteWord
(
tire
,
name
);
}
}
else
{
// OTHER TYPE
STire
*
tire
=
tires
[
type
];
if
(
tire
)
deleteWord
(
tire
,
name
);
if
(
tire
)
deleteWord
(
tire
,
name
);
}
taosThreadMutexUnlock
(
&
tiresMutex
);
...
...
@@ -2027,26 +1880,26 @@ bool dealDropCommand(char * sql) {
// callback autotab module after shell sql execute
void
callbackAutoTab
(
char
*
sqlstr
,
TAOS
*
pSql
,
bool
usedb
)
{
char
*
sql
=
sqlstr
;
char
*
sql
=
sqlstr
;
// remove prefix blank
while
(
*
sql
==
' '
)
{
sql
++
;
}
if
(
dealUseDB
(
sql
))
{
if
(
dealUseDB
(
sql
))
{
// change to new db
return
;
return
;
}
// create command add name to autotab
if
(
dealCreateCommand
(
sql
))
{
return
;
if
(
dealCreateCommand
(
sql
))
{
return
;
}
// drop command remove name from autotab
if
(
dealDropCommand
(
sql
))
{
return
;
if
(
dealDropCommand
(
sql
))
{
return
;
}
return
;
return
;
}
tools/shell/src/shellTire.c
浏览文件 @
1c106bfd
...
...
@@ -26,17 +26,16 @@ STire* createTire(char type) {
memset
(
tire
,
0
,
sizeof
(
STire
));
tire
->
ref
=
1
;
// init is 1
tire
->
type
=
type
;
tire
->
root
.
d
=
(
STireNode
**
)
taosMemoryCalloc
(
CHAR_CNT
,
sizeof
(
STireNode
*
));
tire
->
root
.
d
=
(
STireNode
**
)
taosMemoryCalloc
(
CHAR_CNT
,
sizeof
(
STireNode
*
));
return
tire
;
}
// free tire node
void
freeTireNode
(
STireNode
*
node
)
{
if
(
node
==
NULL
)
return
;
if
(
node
==
NULL
)
return
;
// nest free sub node on array d
if
(
node
->
d
)
{
if
(
node
->
d
)
{
for
(
int
i
=
0
;
i
<
CHAR_CNT
;
i
++
)
{
freeTireNode
(
node
->
d
[
i
]);
}
...
...
@@ -56,9 +55,9 @@ void freeTire(STire* tire) {
taosMemoryFree
(
tire
->
root
.
d
);
// free from list
StrName
*
item
=
tire
->
head
;
StrName
*
item
=
tire
->
head
;
while
(
item
)
{
StrName
*
next
=
item
->
next
;
StrName
*
next
=
item
->
next
;
// free string
taosMemoryFree
(
item
->
name
);
// free node
...
...
@@ -75,14 +74,14 @@ void freeTire(STire* tire) {
// insert a new word to list
bool
insertToList
(
STire
*
tire
,
char
*
word
)
{
StrName
*
p
=
(
StrName
*
)
taosMemoryMalloc
(
sizeof
(
StrName
));
StrName
*
p
=
(
StrName
*
)
taosMemoryMalloc
(
sizeof
(
StrName
));
p
->
name
=
strdup
(
word
);
p
->
next
=
NULL
;
if
(
tire
->
head
==
NULL
)
{
if
(
tire
->
head
==
NULL
)
{
tire
->
head
=
p
;
tire
->
tail
=
p
;
}
else
{
}
else
{
tire
->
tail
->
next
=
p
;
tire
->
tail
=
p
;
}
...
...
@@ -93,7 +92,7 @@ bool insertToList(STire* tire, char* word) {
// insert a new word to tree
bool
insertToTree
(
STire
*
tire
,
char
*
word
,
int
len
)
{
int
m
=
0
;
STireNode
**
nodes
=
tire
->
root
.
d
;
STireNode
**
nodes
=
tire
->
root
.
d
;
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
m
=
word
[
i
]
-
FIRST_ASCII
;
if
(
m
<
0
||
m
>
CHAR_CNT
)
{
...
...
@@ -102,7 +101,7 @@ bool insertToTree(STire* tire, char* word, int len) {
if
(
nodes
[
m
]
==
NULL
)
{
// no pointer
STireNode
*
p
=
(
STireNode
*
)
taosMemoryMalloc
(
sizeof
(
STireNode
));
STireNode
*
p
=
(
STireNode
*
)
taosMemoryMalloc
(
sizeof
(
STireNode
));
memset
(
p
,
0
,
sizeof
(
STireNode
));
nodes
[
m
]
=
p
;
if
(
i
==
len
-
1
)
{
...
...
@@ -114,7 +113,7 @@ bool insertToTree(STire* tire, char* word, int len) {
if
(
nodes
[
m
]
->
d
==
NULL
)
{
// malloc d
nodes
[
m
]
->
d
=
(
STireNode
**
)
taosMemoryCalloc
(
CHAR_CNT
,
sizeof
(
STireNode
*
));
nodes
[
m
]
->
d
=
(
STireNode
**
)
taosMemoryCalloc
(
CHAR_CNT
,
sizeof
(
STireNode
*
));
}
// move to next node
...
...
@@ -146,7 +145,7 @@ bool insertWord(STire* tire, char* word) {
// delete one word from list
bool
deleteFromList
(
STire
*
tire
,
char
*
word
)
{
StrName
*
item
=
tire
->
head
;
StrName
*
item
=
tire
->
head
;
while
(
item
)
{
if
(
strcmp
(
item
->
name
,
word
)
==
0
)
{
// found, reset empty to delete
...
...
@@ -176,7 +175,7 @@ bool deleteFromTree(STire* tire, char* word, int len) {
return
false
;
}
else
{
// not null
if
(
i
==
len
-
1
)
{
if
(
i
==
len
-
1
)
{
// this is last, only set end false , not free node
nodes
[
m
]
->
end
=
false
;
del
=
true
;
...
...
@@ -184,8 +183,7 @@ bool deleteFromTree(STire* tire, char* word, int len) {
}
}
if
(
nodes
[
m
]
->
d
==
NULL
)
break
;
if
(
nodes
[
m
]
->
d
==
NULL
)
break
;
// move to next node
nodes
=
nodes
[
m
]
->
d
;
}
...
...
@@ -216,9 +214,9 @@ bool deleteWord(STire* tire, char* word) {
return
false
;
}
void
addWordToMatch
(
SMatch
*
match
,
char
*
word
){
void
addWordToMatch
(
SMatch
*
match
,
char
*
word
)
{
// malloc new
SMatchNode
*
node
=
(
SMatchNode
*
)
taosMemoryMalloc
(
sizeof
(
SMatchNode
));
SMatchNode
*
node
=
(
SMatchNode
*
)
taosMemoryMalloc
(
sizeof
(
SMatchNode
));
memset
(
node
,
0
,
sizeof
(
SMatchNode
));
node
->
word
=
strdup
(
word
);
...
...
@@ -234,7 +232,7 @@ void addWordToMatch(SMatch* match, char* word){
// enum all words from node
void
enumAllWords
(
STireNode
**
nodes
,
char
*
prefix
,
SMatch
*
match
)
{
STireNode
*
c
;
STireNode
*
c
;
char
word
[
MAX_WORD_LEN
];
int
len
=
strlen
(
prefix
);
for
(
int
i
=
0
;
i
<
CHAR_CNT
;
i
++
)
{
...
...
@@ -255,18 +253,17 @@ void enumAllWords(STireNode** nodes, char* prefix, SMatch* match) {
addWordToMatch
(
match
,
word
);
}
// nested call next layer
if
(
c
->
d
)
enumAllWords
(
c
->
d
,
word
,
match
);
if
(
c
->
d
)
enumAllWords
(
c
->
d
,
word
,
match
);
}
}
}
// match prefix from list
void
matchPrefixFromList
(
STire
*
tire
,
char
*
prefix
,
SMatch
*
match
)
{
StrName
*
item
=
tire
->
head
;
StrName
*
item
=
tire
->
head
;
int
len
=
strlen
(
prefix
);
while
(
item
)
{
if
(
strncmp
(
item
->
name
,
prefix
,
len
)
==
0
)
{
if
(
strncmp
(
item
->
name
,
prefix
,
len
)
==
0
)
{
// prefix matched
addWordToMatch
(
match
,
item
->
name
);
}
...
...
@@ -304,29 +301,27 @@ void matchPrefixFromTree(STire* tire, char* prefix, SMatch* match) {
if
(
i
==
len
-
1
)
{
// malloc match if not pass by param match
if
(
root
==
NULL
)
{
root
=
(
SMatch
*
)
taosMemoryMalloc
(
sizeof
(
SMatch
));
root
=
(
SMatch
*
)
taosMemoryMalloc
(
sizeof
(
SMatch
));
memset
(
root
,
0
,
sizeof
(
SMatch
));
strcpy
(
root
->
pre
,
prefix
);
}
// prefix is match to end char
if
(
c
->
d
)
enumAllWords
(
c
->
d
,
prefix
,
root
);
if
(
c
->
d
)
enumAllWords
(
c
->
d
,
prefix
,
root
);
}
else
{
// move to next node continue match
if
(
c
->
d
==
NULL
)
break
;
if
(
c
->
d
==
NULL
)
break
;
nodes
=
c
->
d
;
}
}
// return
return
;
return
;
}
SMatch
*
matchPrefix
(
STire
*
tire
,
char
*
prefix
,
SMatch
*
match
)
{
if
(
match
==
NULL
)
{
match
=
(
SMatch
*
)
taosMemoryMalloc
(
sizeof
(
SMatch
));
if
(
match
==
NULL
)
{
match
=
(
SMatch
*
)
taosMemoryMalloc
(
sizeof
(
SMatch
));
memset
(
match
,
0
,
sizeof
(
SMatch
));
}
...
...
@@ -348,10 +343,9 @@ SMatch* matchPrefix(STire* tire, char* prefix, SMatch* match) {
return
match
;
}
// get all items from tires tree
void
enumFromList
(
STire
*
tire
,
SMatch
*
match
)
{
StrName
*
item
=
tire
->
head
;
StrName
*
item
=
tire
->
head
;
while
(
item
)
{
if
(
item
->
name
[
0
]
!=
0
)
{
// not delete
...
...
@@ -365,7 +359,7 @@ void enumFromList(STire* tire, SMatch* match) {
// get all items from tires tree
void
enumFromTree
(
STire
*
tire
,
SMatch
*
match
)
{
char
pre
[
2
]
=
{
0
,
0
};
char
pre
[
2
]
=
{
0
,
0
};
STireNode
*
c
;
// enum first layer
...
...
@@ -380,7 +374,7 @@ void enumFromTree(STire* tire, SMatch* match) {
}
// this branch have data
if
(
c
->
end
)
if
(
c
->
end
)
addWordToMatch
(
match
,
pre
);
else
matchPrefix
(
tire
,
pre
,
match
);
...
...
@@ -389,7 +383,7 @@ void enumFromTree(STire* tire, SMatch* match) {
// get all items from tires tree
SMatch
*
enumAll
(
STire
*
tire
)
{
SMatch
*
match
=
(
SMatch
*
)
taosMemoryMalloc
(
sizeof
(
SMatch
));
SMatch
*
match
=
(
SMatch
*
)
taosMemoryMalloc
(
sizeof
(
SMatch
));
memset
(
match
,
0
,
sizeof
(
SMatch
));
switch
(
tire
->
type
)
{
...
...
@@ -410,16 +404,13 @@ SMatch* enumAll(STire* tire) {
return
match
;
}
// free match result
void
freeMatchNode
(
SMatchNode
*
node
)
{
// first free next
if
(
node
->
next
)
freeMatchNode
(
node
->
next
);
if
(
node
->
next
)
freeMatchNode
(
node
->
next
);
// second free self
if
(
node
->
word
)
taosMemoryFree
(
node
->
word
);
if
(
node
->
word
)
taosMemoryFree
(
node
->
word
);
taosMemoryFree
(
node
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录