Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
oceanbase
miniob
提交
7ad72565
M
miniob
项目概览
oceanbase
/
miniob
大约 1 年 前同步成功
通知
74
Star
1521
Fork
537
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
分析
仓库
DevOps
项目成员
Pages
M
miniob
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Pages
分析
分析
仓库分析
DevOps
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
提交
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
7ad72565
编写于
4月 06, 2022
作者:
羽飞
提交者:
GitHub
4月 06, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #28 from hnwyllmm/feature/readline
use readline in obclient
上级
cf52f463
2376e3d5
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
57 addition
and
52 deletion
+57
-52
src/obclient/CMakeLists.txt
src/obclient/CMakeLists.txt
+20
-11
src/obclient/client.cpp
src/obclient/client.cpp
+37
-41
未找到文件。
src/obclient/CMakeLists.txt
浏览文件 @
7ad72565
PROJECT
(
obclient
)
MESSAGE
(
"Begin to build "
${
PROJECT_NAME
}
)
MESSAGE
(
STATUS
"This is PROJECT_BINARY_DIR dir "
${
PROJECT_BINARY_DIR
}
)
MESSAGE
(
STATUS
"This is PROJECT_SOURCE_DIR dir "
${
PROJECT_SOURCE_DIR
}
)
ADD_EXECUTABLE
(
obclient
)
MESSAGE
(
"Begin to build "
obclient
)
INCLUDE
(
CheckIncludeFiles
)
#INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
INCLUDE_DIRECTORIES
(
.
${
PROJECT_SOURCE_DIR
}
/../../deps /usr/local/include SYSTEM
)
TARGET_INCLUDE_DIRECTORIES
(
obclient PRIVATE .
${
PROJECT_SOURCE_DIR
}
/../deps /usr/local/include /usr/include
)
# 父cmake 设置的include_directories 和link_directories并不传导到子cmake里面
#INCLUDE_DIRECTORIES(BEFORE ${CMAKE_INSTALL_PREFIX}/include)
LINK_DIRECTORIES
(
/usr/local/lib
${
PROJECT_BINARY_DIR
}
/../../lib
)
TARGET_LINK_DIRECTORIES
(
obclient PRIVATE /usr/local/lib
${
PROJECT_BINARY_DIR
}
/../../lib
)
# stdio.h 必须放在readline/readline.h 前面,因为readline头文件不能直接单独编译
CHECK_INCLUDE_FILES
(
"stdio.h;readline/readline.h"
HAVE_READLINE_HEADER
)
FIND_LIBRARY
(
READLINE_LIBRARY readline
)
IF
(
HAVE_READLINE_HEADER AND READLINE_LIBRARY
)
TARGET_LINK_LIBRARIES
(
obclient
${
READLINE_LIBRARY
}
)
ADD_DEFINITIONS
(
-DUSE_READLINE
)
ELSE
()
MESSAGE
(
"readline is not found"
)
ENDIF
()
FILE
(
GLOB_RECURSE ALL_SRC *.cpp
)
FOREACH
(
F
${
ALL_SRC
}
)
...
...
@@ -19,15 +29,14 @@ FOREACH (F ${ALL_SRC})
ENDFOREACH
(
F
)
# 指定目标文件位置
SET
(
EXECUTABLE_OUTPUT_PATH
${
PROJECT_BINARY_DIR
}
/../
../
bin
)
SET
(
EXECUTABLE_OUTPUT_PATH
${
PROJECT_BINARY_DIR
}
/../bin
)
MESSAGE
(
"Binary directory:"
${
EXECUTABLE_OUTPUT_PATH
}
)
ADD_EXECUTABLE
(
${
PROJECT_NAME
}
${
PRJ_SRC
}
)
TARGET_LINK_LIBRARIES
(
${
PROJECT_NAME
}
common pthread dl
)
TARGET_SOURCES
(
obclient PRIVATE
${
PRJ_SRC
}
)
TARGET_LINK_LIBRARIES
(
obclient
common pthread dl
)
# Target 必须在定义 ADD_EXECUTABLE 之后, programs 不受这个限制
# TARGETS和PROGRAMS 的默认权限是OWNER_EXECUTE, GROUP_EXECUTE, 和WORLD_EXECUTE,即755权限, programs 都是处理脚步类
# 类型分为RUNTIME/LIBRARY/ARCHIVE, prog
INSTALL
(
TARGETS
${
PROJECT_NAME
}
RUNTIME DESTINATION bin
)
\ No newline at end of file
INSTALL
(
TARGETS obclient RUNTIME DESTINATION bin
)
src/obclient/client.cpp
浏览文件 @
7ad72565
...
...
@@ -29,14 +29,41 @@ See the Mulan PSL v2 for more details. */
#include "common/defs.h"
#include "common/lang/string.h"
#ifdef USE_READLINE
#include "readline/readline.h"
#endif
#define MAX_MEM_BUFFER_SIZE 8192
#define PORT_DEFAULT 6789
using
namespace
common
;
bool
is_exit_command
(
const
char
*
cmd
)
#ifdef USE_READLINE
char
*
my_readline
(
const
char
*
prompt
)
{
return
readline
(
prompt
);
}
#else // USE_READLINE
char
*
my_readline
(
const
char
*
prompt
)
{
return
0
==
strncasecmp
(
"exit"
,
cmd
,
4
)
||
0
==
strncasecmp
(
"bye"
,
cmd
,
3
);
char
*
buffer
=
(
char
*
)
malloc
(
MAX_MEM_BUFFER_SIZE
);
if
(
nullptr
==
buffer
)
{
fprintf
(
stderr
,
"failed to alloc line buffer"
);
return
nullptr
;
}
char
*
s
=
fgets
(
buffer
,
MAX_MEM_BUFFER_SIZE
,
stdin
);
if
(
nullptr
==
s
)
{
fprintf
(
stderr
,
"failed to read message from console"
);
free
(
buffer
);
return
nullptr
;
}
return
buffer
;
}
#endif // USE_READLINE
bool
is_exit_command
(
const
char
*
cmd
)
{
return
0
==
strncasecmp
(
"exit"
,
cmd
,
4
)
||
0
==
strncasecmp
(
"bye"
,
cmd
,
3
);
}
int
init_unix_sock
(
const
char
*
unix_sock_path
)
...
...
@@ -89,38 +116,8 @@ int init_tcp_sock(const char *server_host, int server_port)
return
sockfd
;
}
// 这里的代码本来是为了处理控制台不能接收超长字符串的问题
// 但是设置控制台模式为非 ICANON 后,不能再正常的处理 backspace
// 所以暂时不调用这个函数
// 需要测试超长字符串场景的同学,可以通过文本重定向的方式测试
int
set_terminal_noncanonical
()
{
int
fd
=
STDIN_FILENO
;
struct
termios
old_termios
;
int
ret
=
tcgetattr
(
fd
,
&
old_termios
);
if
(
ret
<
0
)
{
printf
(
"Failed to get tc attr. error=%s
\n
"
,
strerror
(
errno
));
return
-
1
;
}
struct
termios
new_attr
=
old_termios
;
new_attr
.
c_lflag
&=
~
ICANON
;
new_attr
.
c_cc
[
VERASE
]
=
'\b'
;
ret
=
tcsetattr
(
fd
,
TCSANOW
,
&
new_attr
);
if
(
ret
<
0
)
{
printf
(
"Failed to set tc attr. error=%s
\n
"
,
strerror
(
errno
));
return
-
1
;
}
return
0
;
}
int
main
(
int
argc
,
char
*
argv
[])
{
int
ret
=
0
;
// set_terminal_noncanonical();
if
(
ret
<
0
)
{
printf
(
"Warning: failed to set terminal non canonical. Long command may be handled incorrect
\n
"
);
}
const
char
*
unix_socket_path
=
nullptr
;
const
char
*
server_host
=
"127.0.0.1"
;
int
server_port
=
PORT_DEFAULT
;
...
...
@@ -143,7 +140,6 @@ int main(int argc, char *argv[])
const
char
*
prompt_str
=
"miniob > "
;
int
sockfd
,
send_bytes
;
// char send[MAXLINE];
if
(
unix_socket_path
!=
nullptr
)
{
sockfd
=
init_unix_sock
(
unix_socket_path
);
...
...
@@ -155,23 +151,24 @@ int main(int argc, char *argv[])
}
char
send_buf
[
MAX_MEM_BUFFER_SIZE
];
// char buf[MAXDATASIZE];
fputs
(
prompt_str
,
stdout
)
;
while
(
fgets
(
send_buf
,
MAX_MEM_BUFFER_SIZE
,
stdin
)
!=
NULL
)
{
if
(
common
::
is_blank
(
send_buf
))
{
f
puts
(
prompt_str
,
stdout
);
char
*
input_command
=
nullptr
;
while
(
(
input_command
=
my_readline
(
prompt_str
))
!=
nullptr
)
{
if
(
common
::
is_blank
(
input_command
))
{
f
ree
(
input_command
);
continue
;
}
if
(
is_exit_command
(
send_buf
))
{
if
(
is_exit_command
(
input_command
))
{
free
(
input_command
);
break
;
}
if
((
send_bytes
=
write
(
sockfd
,
send_buf
,
strlen
(
send_buf
)
+
1
))
==
-
1
)
{
if
((
send_bytes
=
write
(
sockfd
,
input_command
,
strlen
(
input_command
)
+
1
))
==
-
1
)
{
// TODO writen
fprintf
(
stderr
,
"send error: %d:%s
\n
"
,
errno
,
strerror
(
errno
));
exit
(
1
);
}
free
(
input_command
);
memset
(
send_buf
,
0
,
sizeof
(
send_buf
));
int
len
=
0
;
...
...
@@ -198,7 +195,6 @@ int main(int argc, char *argv[])
printf
(
"Connection has been closed
\n
"
);
break
;
}
fputs
(
prompt_str
,
stdout
);
}
close
(
sockfd
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录