Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Xiaomi
soar
提交
45a48465
S
soar
项目概览
Xiaomi
/
soar
大约 1 年 前同步成功
通知
387
Star
8512
Fork
1328
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
soar
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
45a48465
编写于
12月 17, 2018
作者:
martianzhang
提交者:
GitHub
12月 17, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #167 from xiyangxixian/master
DSN 解析优化, 并支持密码特殊字符
上级
bc968ba4
8cdf70b5
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
52 addition
and
66 deletion
+52
-66
common/config.go
common/config.go
+48
-66
common/config_test.go
common/config_test.go
+2
-0
common/testdata/TestParseDSN.golden
common/testdata/TestParseDSN.golden
+2
-0
未找到文件。
common/config.go
浏览文件 @
45a48465
...
...
@@ -256,7 +256,8 @@ func parseDSN(odbc string, d *dsn) *dsn {
}
if
d
!=
nil
{
addr
=
d
.
Addr
// 原来有个判断,后来判断条件被删除了就导致第一次addr无论如何都会被修改。所以这边先注释掉
//addr = d.Addr
user
=
d
.
User
password
=
d
.
Password
schema
=
d
.
Schema
...
...
@@ -269,60 +270,55 @@ func parseDSN(odbc string, d *dsn) *dsn {
return
&
dsn
{
Disable
:
true
}
}
// username:password@ip:port/database
l1
:=
strings
.
Split
(
odbc
,
"@"
)
if
len
(
l1
)
<
2
{
if
strings
.
HasPrefix
(
l1
[
0
],
":"
)
{
// ":port/database"
l2
:=
strings
.
Split
(
strings
.
TrimLeft
(
l1
[
0
],
":"
),
"/"
)
if
l2
[
0
]
==
""
{
addr
=
strings
.
Split
(
addr
,
":"
)[
0
]
+
":3306"
if
len
(
l2
)
>
1
{
schema
=
strings
.
Split
(
l2
[
1
],
"?"
)[
0
]
}
}
else
{
addr
=
strings
.
Split
(
addr
,
":"
)[
0
]
+
":"
+
l2
[
0
]
if
len
(
l2
)
>
1
{
schema
=
strings
.
Split
(
l2
[
1
],
"?"
)[
0
]
}
}
}
else
if
strings
.
HasPrefix
(
l1
[
0
],
"/"
)
{
// "/database"
l2
:=
strings
.
TrimLeft
(
l1
[
0
],
"/"
)
schema
=
l2
}
else
{
// ip:port/database
l2
:=
strings
.
Split
(
l1
[
0
],
"/"
)
if
len
(
l2
)
==
2
{
addr
=
l2
[
0
]
schema
=
strings
.
Split
(
l2
[
1
],
"?"
)[
0
]
}
else
{
addr
=
l2
[
0
]
}
}
var
userInfo
,
hostInfo
,
query
string
// DSN 格式匹配
// userInfo@hostInfo/database
if
res
:=
regexp
.
MustCompile
(
`^(.*)@(.*?)/(.*?)($|\?)(.*)`
)
.
FindStringSubmatch
(
odbc
);
len
(
res
)
>
5
{
userInfo
=
res
[
1
]
hostInfo
=
res
[
2
]
schema
=
res
[
3
]
query
=
res
[
5
]
// hostInfo/database
}
else
if
res
:=
regexp
.
MustCompile
(
`^(.*)/(.*?)($|\?)(.*)`
)
.
FindStringSubmatch
(
odbc
);
len
(
res
)
>
4
{
hostInfo
=
res
[
1
]
schema
=
res
[
2
]
query
=
res
[
4
]
// userInfo@hostInfo
}
else
if
res
:=
regexp
.
MustCompile
(
`^(.*)@(.*?)($|\?)(.*)`
)
.
FindStringSubmatch
(
odbc
);
len
(
res
)
>
4
{
userInfo
=
res
[
1
]
hostInfo
=
res
[
2
]
query
=
res
[
4
]
// hostInfo
}
else
{
// user:password
l2
:=
strings
.
Split
(
l1
[
0
],
":"
)
if
len
(
l2
)
==
2
{
user
=
l2
[
0
]
password
=
l2
[
1
]
}
else
{
user
=
l2
[
0
]
}
// ip:port/database
l3
:=
strings
.
Split
(
l1
[
1
],
"/"
)
if
len
(
l3
)
==
2
{
addr
=
l3
[
0
]
schema
=
strings
.
Split
(
l3
[
1
],
"?"
)[
0
]
}
else
{
addr
=
l3
[
0
]
}
hostInfo
=
odbc
}
// 解析用户信息
if
userInfo
!=
""
{
user
=
strings
.
Split
(
userInfo
,
":"
)[
0
]
// 防止密码中含有与用户名相同的字符, 所以用正则替换, 剩下的就是密码
password
=
strings
.
TrimLeft
(
regexp
.
MustCompile
(
"^"
+
user
)
.
ReplaceAllString
(
userInfo
,
""
),
":"
)
}
// 其他flag参数,目前只支持charset :(
if
len
(
strings
.
Split
(
odbc
,
"?"
))
>
1
{
flags
:=
strings
.
Split
(
strings
.
Split
(
odbc
,
"?"
)[
1
],
"&"
)
for
_
,
f
:=
range
flags
{
// 解析主机信息
host
:=
strings
.
Split
(
hostInfo
,
":"
)[
0
]
port
:=
strings
.
TrimLeft
(
strings
.
Replace
(
hostInfo
,
host
,
""
,
1
),
":"
)
if
host
==
""
{
host
=
"127.0.0.1"
}
if
port
==
""
{
port
=
"3306"
}
addr
=
host
+
":"
+
port
// 解析查询字符串
if
(
query
!=
""
)
{
params
:=
strings
.
Split
(
query
,
"&"
)
for
_
,
f
:=
range
params
{
attr
:=
strings
.
Split
(
f
,
"="
)
if
len
(
attr
)
>
1
{
arg
:=
strings
.
TrimSpace
(
attr
[
0
])
...
...
@@ -336,20 +332,6 @@ func parseDSN(odbc string, d *dsn) *dsn {
}
}
// 自动补端口
if
!
strings
.
Contains
(
addr
,
":"
)
{
addr
=
addr
+
":3306"
}
else
{
if
strings
.
HasSuffix
(
addr
,
":"
)
{
addr
=
addr
+
"3306"
}
}
// 默认走127.0.0.1
if
strings
.
HasPrefix
(
addr
,
":"
)
{
addr
=
"127.0.0.1"
+
addr
}
// 默认用information_schema库
if
schema
==
""
{
schema
=
"information_schema"
...
...
common/config_test.go
浏览文件 @
45a48465
...
...
@@ -48,6 +48,8 @@ func TestParseDSN(t *testing.T) {
"user:password@hostname:3307"
,
"user:password@hostname:/database"
,
"user:password@:3307/database"
,
"user@hostname/dbname"
,
"user:pwd:pwd@pwd/pwd@hostname/dbname"
,
"user:password@"
,
"hostname:3307/database"
,
"@hostname:3307/database"
,
...
...
common/testdata/TestParseDSN.golden
浏览文件 @
45a48465
...
...
@@ -3,6 +3,8 @@
&common.dsn{Addr:"hostname:3307", Schema:"information_schema", User:"user", Password:"password", Charset:"utf8mb4", Disable:false, Version:999}
&common.dsn{Addr:"hostname:3306", Schema:"database", User:"user", Password:"password", Charset:"utf8mb4", Disable:false, Version:999}
&common.dsn{Addr:"127.0.0.1:3307", Schema:"database", User:"user", Password:"password", Charset:"utf8mb4", Disable:false, Version:999}
&common.dsn{Addr:"hostname:3306", Schema:"dbname", User:"user", Password:"", Charset:"utf8mb4", Disable:false, Version:999}
&common.dsn{Addr:"hostname:3306", Schema:"dbname", User:"user", Password:"pwd:pwd@pwd/pwd", Charset:"utf8mb4", Disable:false, Version:999}
&common.dsn{Addr:"127.0.0.1:3306", Schema:"information_schema", User:"user", Password:"password", Charset:"utf8mb4", Disable:false, Version:999}
&common.dsn{Addr:"hostname:3307", Schema:"database", User:"", Password:"", Charset:"utf8mb4", Disable:false, Version:999}
&common.dsn{Addr:"hostname:3307", Schema:"database", User:"", Password:"", Charset:"utf8mb4", Disable:false, Version:999}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录