Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
b6c6f866
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
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看板
未验证
提交
b6c6f866
编写于
8月 31, 2022
作者:
S
Shengliang Guan
提交者:
GitHub
8月 31, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #16514 from taosdata/fix/ZhiqiangWang/TD-18733-shell-csv-rfc-4180
feature: shell csv rfc 4180
上级
fc99cfcd
500cf0c7
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
101 addition
and
61 deletion
+101
-61
source/util/src/version.c.in
source/util/src/version.c.in
+1
-1
tests/test/c/tmqSim.c
tests/test/c/tmqSim.c
+25
-5
tools/shell/inc/shellInt.h
tools/shell/inc/shellInt.h
+1
-1
tools/shell/src/shellEngine.c
tools/shell/src/shellEngine.c
+25
-5
tools/shell/src/shellWebsocket.c
tools/shell/src/shellWebsocket.c
+49
-49
未找到文件。
source/util/src/version.c.in
浏览文件 @
b6c6f866
char version[
12
] = "${TD_VER_NUMBER}";
char version[
64
] = "${TD_VER_NUMBER}";
char compatible_version[12] = "${TD_VER_COMPATIBLE}";
char gitinfo[48] = "${TD_VER_GIT}";
char buildinfo[64] = "Built at ${TD_VER_DATE}";
...
...
tests/test/c/tmqSim.c
浏览文件 @
b6c6f866
...
...
@@ -492,7 +492,6 @@ static char* shellFormatTimestamp(char* buf, int64_t val, int32_t precision) {
static
void
shellDumpFieldToFile
(
TdFilePtr
pFile
,
const
char
*
val
,
TAOS_FIELD
*
field
,
int32_t
length
,
int32_t
precision
)
{
if
(
val
==
NULL
)
{
taosFprintfFile
(
pFile
,
"%s"
,
TSDB_DATA_NULL_STR
);
return
;
}
...
...
@@ -540,13 +539,34 @@ static void shellDumpFieldToFile(TdFilePtr pFile, const char* val, TAOS_FIELD* f
case
TSDB_DATA_TYPE_BINARY
:
case
TSDB_DATA_TYPE_NCHAR
:
case
TSDB_DATA_TYPE_JSON
:
memcpy
(
buf
,
val
,
length
);
buf
[
length
]
=
0
;
taosFprintfFile
(
pFile
,
"
\'
%s
\'
"
,
buf
);
{
char
quotationStr
[
2
];
int32_t
bufIndex
=
0
;
quotationStr
[
0
]
=
0
;
quotationStr
[
1
]
=
0
;
for
(
int32_t
i
=
0
;
i
<
length
;
i
++
)
{
buf
[
bufIndex
]
=
val
[
i
];
bufIndex
++
;
if
(
val
[
i
]
==
'\"'
)
{
buf
[
bufIndex
]
=
val
[
i
];
bufIndex
++
;
quotationStr
[
0
]
=
'\"'
;
}
if
(
val
[
i
]
==
','
)
{
quotationStr
[
0
]
=
'\"'
;
}
}
buf
[
bufIndex
]
=
0
;
if
(
length
==
0
)
{
quotationStr
[
0
]
=
'\"'
;
}
taosFprintfFile
(
pFile
,
"%s%s%s"
,
quotationStr
,
buf
,
quotationStr
);
}
break
;
case
TSDB_DATA_TYPE_TIMESTAMP
:
shellFormatTimestamp
(
buf
,
*
(
int64_t
*
)
val
,
precision
);
taosFprintfFile
(
pFile
,
"
'%s'
"
,
buf
);
taosFprintfFile
(
pFile
,
"
%s
"
,
buf
);
break
;
default:
break
;
...
...
tools/shell/inc/shellInt.h
浏览文件 @
b6c6f866
...
...
@@ -113,7 +113,7 @@ int32_t shellExecute();
int32_t
shellCalcColWidth
(
TAOS_FIELD
*
field
,
int32_t
precision
);
void
shellPrintHeader
(
TAOS_FIELD
*
fields
,
int32_t
*
width
,
int32_t
num_fields
);
void
shellPrintField
(
const
char
*
val
,
TAOS_FIELD
*
field
,
int32_t
width
,
int32_t
length
,
int32_t
precision
);
void
shellDumpFieldToFile
(
TdFilePtr
pFile
,
const
char
*
val
,
TAOS_FIELD
*
field
,
int32_t
length
,
int32_t
precision
);
void
shellDumpFieldToFile
(
TdFilePtr
pFile
,
const
char
*
val
,
TAOS_FIELD
*
field
,
int32_t
length
,
int32_t
precision
);
// shellUtil.c
int32_t
shellCheckIntSize
();
void
shellPrintVersion
();
...
...
tools/shell/src/shellEngine.c
浏览文件 @
b6c6f866
...
...
@@ -266,7 +266,6 @@ char *shellFormatTimestamp(char *buf, int64_t val, int32_t precision) {
void
shellDumpFieldToFile
(
TdFilePtr
pFile
,
const
char
*
val
,
TAOS_FIELD
*
field
,
int32_t
length
,
int32_t
precision
)
{
if
(
val
==
NULL
)
{
taosFprintfFile
(
pFile
,
"%s"
,
TSDB_DATA_NULL_STR
);
return
;
}
...
...
@@ -314,13 +313,34 @@ void shellDumpFieldToFile(TdFilePtr pFile, const char *val, TAOS_FIELD *field, i
case
TSDB_DATA_TYPE_BINARY
:
case
TSDB_DATA_TYPE_NCHAR
:
case
TSDB_DATA_TYPE_JSON
:
memcpy
(
buf
,
val
,
length
);
buf
[
length
]
=
0
;
taosFprintfFile
(
pFile
,
"
\'
%s
\'
"
,
buf
);
{
char
quotationStr
[
2
];
int32_t
bufIndex
=
0
;
quotationStr
[
0
]
=
0
;
quotationStr
[
1
]
=
0
;
for
(
int32_t
i
=
0
;
i
<
length
;
i
++
)
{
buf
[
bufIndex
]
=
val
[
i
];
bufIndex
++
;
if
(
val
[
i
]
==
'\"'
)
{
buf
[
bufIndex
]
=
val
[
i
];
bufIndex
++
;
quotationStr
[
0
]
=
'\"'
;
}
if
(
val
[
i
]
==
','
)
{
quotationStr
[
0
]
=
'\"'
;
}
}
buf
[
bufIndex
]
=
0
;
if
(
length
==
0
)
{
quotationStr
[
0
]
=
'\"'
;
}
taosFprintfFile
(
pFile
,
"%s%s%s"
,
quotationStr
,
buf
,
quotationStr
);
}
break
;
case
TSDB_DATA_TYPE_TIMESTAMP
:
shellFormatTimestamp
(
buf
,
*
(
int64_t
*
)
val
,
precision
);
taosFprintfFile
(
pFile
,
"
'%s'
"
,
buf
);
taosFprintfFile
(
pFile
,
"
%s
"
,
buf
);
break
;
default:
break
;
...
...
tools/shell/src/shellWebsocket.c
浏览文件 @
b6c6f866
...
...
@@ -18,19 +18,19 @@
#include "shellInt.h"
int
shell_conn_ws_server
(
bool
first
)
{
shell
.
ws_conn
=
ws_connect_with_dsn
(
shell
.
args
.
dsn
);
if
(
!
shell
.
ws_conn
)
{
fprintf
(
stderr
,
"failed to connect %s, reason: %s
\n
"
,
shell
.
args
.
dsn
,
ws_errstr
(
NULL
));
return
-
1
;
}
if
(
first
&&
shell
.
args
.
restful
)
{
fprintf
(
stdout
,
"successfully connect to %s
\n\n
"
,
shell
.
args
.
dsn
);
}
else
if
(
first
&&
shell
.
args
.
cloud
)
{
fprintf
(
stdout
,
"successfully connect to cloud service
\n
"
);
}
return
0
;
shell
.
ws_conn
=
ws_connect_with_dsn
(
shell
.
args
.
dsn
);
if
(
!
shell
.
ws_conn
)
{
fprintf
(
stderr
,
"failed to connect %s, reason: %s
\n
"
,
shell
.
args
.
dsn
,
ws_errstr
(
NULL
));
return
-
1
;
}
if
(
first
&&
shell
.
args
.
restful
)
{
fprintf
(
stdout
,
"successfully connect to %s
\n\n
"
,
shell
.
args
.
dsn
);
}
else
if
(
first
&&
shell
.
args
.
cloud
)
{
fprintf
(
stdout
,
"successfully connect to cloud service
\n
"
);
}
return
0
;
}
static
int
horizontalPrintWebsocket
(
WS_RES
*
wres
,
double
*
execute_time
)
{
...
...
@@ -39,7 +39,7 @@ static int horizontalPrintWebsocket(WS_RES* wres, double* execute_time) {
ws_fetch_block
(
wres
,
&
data
,
&
rows
);
*
execute_time
+=
(
double
)(
ws_take_timing
(
wres
)
/
1E6
);
if
(
!
rows
)
{
return
0
;
return
0
;
}
int
num_fields
=
ws_field_count
(
wres
);
TAOS_FIELD
*
fields
=
(
TAOS_FIELD
*
)
ws_fetch_fields
(
wres
);
...
...
@@ -64,7 +64,7 @@ static int horizontalPrintWebsocket(WS_RES* wres, double* execute_time) {
putchar
(
' '
);
putchar
(
'|'
);
}
putchar
(
'\r'
);
putchar
(
'\r'
);
putchar
(
'\n'
);
}
numOfRows
+=
rows
;
...
...
@@ -79,7 +79,7 @@ static int verticalPrintWebsocket(WS_RES* wres, double* pexecute_time) {
ws_fetch_block
(
wres
,
&
data
,
&
rows
);
*
pexecute_time
+=
(
double
)(
ws_take_timing
(
wres
)
/
1E6
);
if
(
!
rows
)
{
return
0
;
return
0
;
}
int
num_fields
=
ws_field_count
(
wres
);
TAOS_FIELD
*
fields
=
(
TAOS_FIELD
*
)
ws_fetch_fields
(
wres
);
...
...
@@ -98,7 +98,7 @@ static int verticalPrintWebsocket(WS_RES* wres, double* pexecute_time) {
uint32_t
len
;
for
(
int
i
=
0
;
i
<
rows
;
i
++
)
{
printf
(
"*************************** %d.row ***************************
\n
"
,
numOfRows
+
1
);
numOfRows
+
1
);
for
(
int
j
=
0
;
j
<
num_fields
;
j
++
)
{
TAOS_FIELD
*
field
=
fields
+
j
;
int
padding
=
(
int
)(
maxColNameLen
-
strlen
(
field
->
name
));
...
...
@@ -121,7 +121,7 @@ static int dumpWebsocketToFile(const char* fname, WS_RES* wres, double* pexecute
}
TdFilePtr
pFile
=
taosOpenFile
(
fullname
,
TD_FILE_CREATE
|
TD_FILE_WRITE
|
TD_FILE_TRUNC
|
TD_FILE_STREAM
);
TD_FILE_CREATE
|
TD_FILE_WRITE
|
TD_FILE_TRUNC
|
TD_FILE_STREAM
);
if
(
pFile
==
NULL
)
{
fprintf
(
stderr
,
"failed to open file: %s
\r\n
"
,
fullname
);
return
-
1
;
...
...
@@ -132,7 +132,7 @@ static int dumpWebsocketToFile(const char* fname, WS_RES* wres, double* pexecute
*
pexecute_time
+=
(
double
)(
ws_take_timing
(
wres
)
/
1E6
);
if
(
!
rows
)
{
taosCloseFile
(
&
pFile
);
return
0
;
return
0
;
}
int
numOfRows
=
0
;
TAOS_FIELD
*
fields
=
(
TAOS_FIELD
*
)
ws_fetch_fields
(
wres
);
...
...
@@ -207,7 +207,7 @@ void shellRunSingleCommandWebsocketImp(char *command) {
}
if
(
!
shell
.
ws_conn
&&
shell_conn_ws_server
(
0
))
{
return
;
return
;
}
shell
.
stop_query
=
false
;
...
...
@@ -216,16 +216,16 @@ void shellRunSingleCommandWebsocketImp(char *command) {
WS_RES
*
res
=
ws_query_timeout
(
shell
.
ws_conn
,
command
,
shell
.
args
.
timeout
);
int
code
=
ws_errno
(
res
);
if
(
code
!=
0
)
{
et
=
taosGetTimestampUs
();
fprintf
(
stderr
,
"
\n
DB: error: %s (%.6fs)
\n
"
,
ws_errstr
(
res
),
(
et
-
st
)
/
1E6
);
if
(
code
==
TSDB_CODE_WS_SEND_TIMEOUT
||
code
==
TSDB_CODE_WS_RECV_TIMEOUT
)
{
fprintf
(
stderr
,
"Hint: use -t to increase the timeout in seconds
\n
"
);
}
else
if
(
code
==
TSDB_CODE_WS_INTERNAL_ERRO
||
code
==
TSDB_CODE_WS_CLOSED
)
{
fprintf
(
stderr
,
"TDengine server is down, will try to reconnect
\n
"
);
shell
.
ws_conn
=
NULL
;
}
ws_free_result
(
res
);
return
;
et
=
taosGetTimestampUs
();
fprintf
(
stderr
,
"
\n
DB: error: %s (%.6fs)
\n
"
,
ws_errstr
(
res
),
(
et
-
st
)
/
1E6
);
if
(
code
==
TSDB_CODE_WS_SEND_TIMEOUT
||
code
==
TSDB_CODE_WS_RECV_TIMEOUT
)
{
fprintf
(
stderr
,
"Hint: use -t to increase the timeout in seconds
\n
"
);
}
else
if
(
code
==
TSDB_CODE_WS_INTERNAL_ERRO
||
code
==
TSDB_CODE_WS_CLOSED
)
{
fprintf
(
stderr
,
"TDengine server is down, will try to reconnect
\n
"
);
shell
.
ws_conn
=
NULL
;
}
ws_free_result
(
res
);
return
;
}
double
execute_time
=
ws_take_timing
(
res
)
/
1E6
;
...
...
@@ -233,36 +233,36 @@ void shellRunSingleCommandWebsocketImp(char *command) {
if
(
shellRegexMatch
(
command
,
"^
\\
s*use
\\
s+[a-zA-Z0-9_]+
\\
s*;
\\
s*$"
,
REG_EXTENDED
|
REG_ICASE
))
{
fprintf
(
stdout
,
"Database changed.
\r\n\r\n
"
);
fflush
(
stdout
);
ws_free_result
(
res
);
ws_free_result
(
res
);
return
;
}
int
numOfRows
=
0
;
if
(
ws_is_update_query
(
res
))
{
numOfRows
=
ws_affected_rows
(
res
);
et
=
taosGetTimestampUs
();
numOfRows
=
ws_affected_rows
(
res
);
et
=
taosGetTimestampUs
();
double
total_time
=
(
et
-
st
)
/
1E3
;
double
net_time
=
total_time
-
(
double
)
execute_time
;
printf
(
"Query Ok, %d of %d row(s) in database
\n
"
,
numOfRows
,
numOfRows
);
printf
(
"Query Ok, %d of %d row(s) in database
\n
"
,
numOfRows
,
numOfRows
);
printf
(
"Execute: %.2f ms Network: %.2f ms Total: %.2f ms
\n
"
,
execute_time
,
net_time
,
total_time
);
}
else
{
int
error_no
=
0
;
numOfRows
=
shellDumpWebsocket
(
res
,
fname
,
&
error_no
,
printMode
,
&
execute_time
);
if
(
numOfRows
<
0
)
{
ws_free_result
(
res
);
return
;
}
et
=
taosGetTimestampUs
();
int
error_no
=
0
;
numOfRows
=
shellDumpWebsocket
(
res
,
fname
,
&
error_no
,
printMode
,
&
execute_time
);
if
(
numOfRows
<
0
)
{
ws_free_result
(
res
);
return
;
}
et
=
taosGetTimestampUs
();
double
total_time
=
(
et
-
st
)
/
1E3
;
double
net_time
=
total_time
-
execute_time
;
if
(
error_no
==
0
&&
!
shell
.
stop_query
)
{
printf
(
"Query OK, %d row(s) in set
\n
"
,
numOfRows
);
printf
(
"Execute: %.2f ms Network: %.2f ms Total: %.2f ms
\n
"
,
execute_time
,
net_time
,
total_time
);
}
else
{
printf
(
"Query interrupted, %d row(s) in set (%.6fs)
\n
"
,
numOfRows
,
(
et
-
st
)
/
1E6
);
printf
(
"Execute: %.2f ms Network: %.2f ms Total: %.2f ms
\n
"
,
execute_time
,
net_time
,
total_time
);
}
if
(
error_no
==
0
&&
!
shell
.
stop_query
)
{
printf
(
"Query OK, %d row(s) in set
\n
"
,
numOfRows
);
printf
(
"Execute: %.2f ms Network: %.2f ms Total: %.2f ms
\n
"
,
execute_time
,
net_time
,
total_time
);
}
else
{
printf
(
"Query interrupted, %d row(s) in set (%.6fs)
\n
"
,
numOfRows
,
(
et
-
st
)
/
1E6
);
printf
(
"Execute: %.2f ms Network: %.2f ms Total: %.2f ms
\n
"
,
execute_time
,
net_time
,
total_time
);
}
}
printf
(
"
\n
"
);
ws_free_result
(
res
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录