Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Xiaomi
soar
提交
5de903a2
S
soar
项目概览
Xiaomi
/
soar
大约 1 年 前同步成功
通知
388
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,发现更多精彩内容 >>
提交
5de903a2
编写于
1月 09, 2019
作者:
martianzhang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
polish code
上级
906ce846
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
17 addition
and
22 deletion
+17
-22
.travis.yml
.travis.yml
+0
-3
database/profiling.go
database/profiling.go
+5
-5
database/profiling_test.go
database/profiling_test.go
+1
-0
env/env.go
env/env.go
+11
-13
test/test_helper.bash
test/test_helper.bash
+0
-1
未找到文件。
.travis.yml
浏览文件 @
5de903a2
...
@@ -29,6 +29,3 @@ script:
...
@@ -29,6 +29,3 @@ script:
-
make docker
-
make docker
-
make cover
-
make cover
-
make test-cli
-
make test-cli
after_success
:
-
bash <(curl -s https://codecov.io/bash)
database/profiling.go
浏览文件 @
5de903a2
...
@@ -26,7 +26,7 @@ import (
...
@@ -26,7 +26,7 @@ import (
"vitess.io/vitess/go/vt/sqlparser"
"vitess.io/vitess/go/vt/sqlparser"
)
)
// Profiling show profile输出的结果
// Profiling show profile
输出的结果
type
Profiling
struct
{
type
Profiling
struct
{
Rows
[]
ProfilingRow
Rows
[]
ProfilingRow
}
}
...
@@ -35,7 +35,7 @@ type Profiling struct {
...
@@ -35,7 +35,7 @@ type Profiling struct {
type
ProfilingRow
struct
{
type
ProfilingRow
struct
{
Status
string
Status
string
Duration
float64
Duration
float64
// TODO: 支持show profile all
,不过目前看all
的信息过多有点眼花缭乱
// TODO: 支持show profile all
, 不过目前看所有
的信息过多有点眼花缭乱
}
}
// Profiling 执行SQL,并对其 Profile
// Profiling 执行SQL,并对其 Profile
...
@@ -48,14 +48,14 @@ func (db *Connector) Profiling(sql string, params ...interface{}) ([]ProfilingRo
...
@@ -48,14 +48,14 @@ func (db *Connector) Profiling(sql string, params ...interface{}) ([]ProfilingRo
return
rows
,
errors
.
New
(
"no need profiling"
)
return
rows
,
errors
.
New
(
"no need profiling"
)
}
}
// 测试环境如果检查是关闭的,则
SQL
不会被执行
// 测试环境如果检查是关闭的,则
SQL
不会被执行
if
common
.
Config
.
TestDSN
.
Disable
{
if
common
.
Config
.
TestDSN
.
Disable
{
return
rows
,
errors
.
New
(
"dsn is disable"
)
return
rows
,
errors
.
New
(
"dsn is disable"
)
}
}
// 数据库安全性检查:如果 Connector 的 IP 端口与 TEST 环境不一致,则启用 SQL 白名单
// 数据库安全性检查:如果 Connector 的 IP 端口与 TEST 环境不一致,则启用 SQL 白名单
// 不在白名单中的 SQL 不允许执行
// 不在白名单中的 SQL 不允许执行
// 执行环境与
test
环境不相同
// 执行环境与
test
环境不相同
if
db
.
Addr
!=
common
.
Config
.
TestDSN
.
Addr
&&
db
.
dangerousQuery
(
sql
)
{
if
db
.
Addr
!=
common
.
Config
.
TestDSN
.
Addr
&&
db
.
dangerousQuery
(
sql
)
{
return
rows
,
fmt
.
Errorf
(
"query execution deny: Execute SQL with DSN(%s/%s) '%s'"
,
return
rows
,
fmt
.
Errorf
(
"query execution deny: Execute SQL with DSN(%s/%s) '%s'"
,
db
.
Addr
,
db
.
Database
,
fmt
.
Sprintf
(
sql
,
params
...
))
db
.
Addr
,
db
.
Database
,
fmt
.
Sprintf
(
sql
,
params
...
))
...
@@ -114,7 +114,7 @@ func (db *Connector) Profiling(sql string, params ...interface{}) ([]ProfilingRo
...
@@ -114,7 +114,7 @@ func (db *Connector) Profiling(sql string, params ...interface{}) ([]ProfilingRo
return
rows
,
err
return
rows
,
err
}
}
// FormatProfiling 格式化输出
Profiling
信息
// FormatProfiling 格式化输出
Profiling
信息
func
FormatProfiling
(
rows
[]
ProfilingRow
)
string
{
func
FormatProfiling
(
rows
[]
ProfilingRow
)
string
{
str
:=
[]
string
{
"| Status | Duration |"
}
str
:=
[]
string
{
"| Status | Duration |"
}
str
=
append
(
str
,
"| --- | --- |"
)
str
=
append
(
str
,
"| --- | --- |"
)
...
...
database/profiling_test.go
浏览文件 @
5de903a2
...
@@ -20,6 +20,7 @@ import (
...
@@ -20,6 +20,7 @@ import (
"testing"
"testing"
"github.com/XiaoMi/soar/common"
"github.com/XiaoMi/soar/common"
"github.com/kr/pretty"
"github.com/kr/pretty"
)
)
...
...
env/env.go
浏览文件 @
5de903a2
...
@@ -90,7 +90,7 @@ func BuildEnv() (*VirtualEnv, *database.Connector) {
...
@@ -90,7 +90,7 @@ func BuildEnv() (*VirtualEnv, *database.Connector) {
common
.
Config
.
TestDSN
.
Disable
=
true
common
.
Config
.
TestDSN
.
Disable
=
true
}
}
// 检查是否允许
Online和Test
一致,防止误操作
// 检查是否允许
Online 和 Test
一致,防止误操作
if
common
.
FormatDSN
(
common
.
Config
.
OnlineDSN
)
==
common
.
FormatDSN
(
common
.
Config
.
TestDSN
)
&&
if
common
.
FormatDSN
(
common
.
Config
.
OnlineDSN
)
==
common
.
FormatDSN
(
common
.
Config
.
TestDSN
)
&&
!
common
.
Config
.
AllowOnlineAsTest
{
!
common
.
Config
.
AllowOnlineAsTest
{
common
.
Log
.
Warn
(
"BuildEnv AllowOnlineAsTest: %s:********@%s/%s OnlineDSN can't config as TestDSN"
,
common
.
Log
.
Warn
(
"BuildEnv AllowOnlineAsTest: %s:********@%s/%s OnlineDSN can't config as TestDSN"
,
...
@@ -108,7 +108,7 @@ func BuildEnv() (*VirtualEnv, *database.Connector) {
...
@@ -108,7 +108,7 @@ func BuildEnv() (*VirtualEnv, *database.Connector) {
return
vEnv
,
connOnline
return
vEnv
,
connOnline
}
}
// RealDB 从测试环境中获取通过
hash后的
DB
// RealDB 从测试环境中获取通过
hash 后的
DB
func
(
vEnv
*
VirtualEnv
)
RealDB
(
hash
string
)
string
{
func
(
vEnv
*
VirtualEnv
)
RealDB
(
hash
string
)
string
{
if
_
,
ok
:=
vEnv
.
Hash2DB
[
hash
];
ok
{
if
_
,
ok
:=
vEnv
.
Hash2DB
[
hash
];
ok
{
return
vEnv
.
Hash2DB
[
hash
]
return
vEnv
.
Hash2DB
[
hash
]
...
@@ -120,7 +120,7 @@ func (vEnv *VirtualEnv) RealDB(hash string) string {
...
@@ -120,7 +120,7 @@ func (vEnv *VirtualEnv) RealDB(hash string) string {
return
hash
return
hash
}
}
// DBHash 从测试环境中根据
DB找到对应的hash
值
// DBHash 从测试环境中根据
DB 找到对应的 hash
值
func
(
vEnv
*
VirtualEnv
)
DBHash
(
db
string
)
string
{
func
(
vEnv
*
VirtualEnv
)
DBHash
(
db
string
)
string
{
if
_
,
ok
:=
vEnv
.
DBRef
[
db
];
ok
{
if
_
,
ok
:=
vEnv
.
DBRef
[
db
];
ok
{
return
vEnv
.
DBRef
[
db
]
return
vEnv
.
DBRef
[
db
]
...
@@ -194,15 +194,15 @@ func (vEnv *VirtualEnv) CleanupTestDatabase() {
...
@@ -194,15 +194,15 @@ func (vEnv *VirtualEnv) CleanupTestDatabase() {
common
.
Log
.
Debug
(
"CleanupTestDatabase done"
)
common
.
Log
.
Debug
(
"CleanupTestDatabase done"
)
}
}
// BuildVirtualEnv rEnv
为SQL源环境,DB
使用的信息从接口获取
// BuildVirtualEnv rEnv
为 SQL 源环境,DB
使用的信息从接口获取
// 注意:如果是
USE,DDL等语句,执行完第一条就会返回,后面的SQL
不会执行
// 注意:如果是
USE, DDL 等语句,执行完第一条就会返回,后面的 SQL
不会执行
func
(
vEnv
*
VirtualEnv
)
BuildVirtualEnv
(
rEnv
*
database
.
Connector
,
SQLs
...
string
)
bool
{
func
(
vEnv
*
VirtualEnv
)
BuildVirtualEnv
(
rEnv
*
database
.
Connector
,
SQLs
...
string
)
bool
{
var
stmt
sqlparser
.
Statement
var
stmt
sqlparser
.
Statement
var
err
error
var
err
error
// 置空错误信息
// 置空错误信息
vEnv
.
Error
=
nil
vEnv
.
Error
=
nil
// 检测是否已经创建初始数据库,如果未创建则创建一个名称
hash
过的映射数据库
// 检测是否已经创建初始数据库,如果未创建则创建一个名称
hash
过的映射数据库
err
=
vEnv
.
createDatabase
(
rEnv
)
err
=
vEnv
.
createDatabase
(
rEnv
)
common
.
LogIfWarn
(
err
,
""
)
common
.
LogIfWarn
(
err
,
""
)
...
@@ -212,7 +212,7 @@ func (vEnv *VirtualEnv) BuildVirtualEnv(rEnv *database.Connector, SQLs ...string
...
@@ -212,7 +212,7 @@ func (vEnv *VirtualEnv) BuildVirtualEnv(rEnv *database.Connector, SQLs ...string
return
true
return
true
}
}
// 判断
rEnv中是否指定了
DB
// 判断
rEnv 中是否指定了
DB
if
rEnv
.
Database
==
""
{
if
rEnv
.
Database
==
""
{
common
.
Log
.
Error
(
"BuildVirtualEnv no database specified, TestDSN init failed"
)
common
.
Log
.
Error
(
"BuildVirtualEnv no database specified, TestDSN init failed"
)
return
false
return
false
...
@@ -221,9 +221,7 @@ func (vEnv *VirtualEnv) BuildVirtualEnv(rEnv *database.Connector, SQLs ...string
...
@@ -221,9 +221,7 @@ func (vEnv *VirtualEnv) BuildVirtualEnv(rEnv *database.Connector, SQLs ...string
// 库表提取
// 库表提取
meta
:=
make
(
map
[
string
]
*
common
.
DB
)
meta
:=
make
(
map
[
string
]
*
common
.
DB
)
for
_
,
sql
:=
range
SQLs
{
for
_
,
sql
:=
range
SQLs
{
common
.
Log
.
Debug
(
"BuildVirtualEnv Database&TableName Mapping, SQL: %s"
,
sql
)
common
.
Log
.
Debug
(
"BuildVirtualEnv Database&TableName Mapping, SQL: %s"
,
sql
)
stmt
,
err
=
sqlparser
.
Parse
(
sql
)
stmt
,
err
=
sqlparser
.
Parse
(
sql
)
if
err
!=
nil
{
if
err
!=
nil
{
common
.
Log
.
Error
(
"BuildVirtualEnv Error : %v"
,
err
)
common
.
Log
.
Error
(
"BuildVirtualEnv Error : %v"
,
err
)
...
@@ -249,7 +247,7 @@ func (vEnv *VirtualEnv) BuildVirtualEnv(rEnv *database.Connector, SQLs ...string
...
@@ -249,7 +247,7 @@ func (vEnv *VirtualEnv) BuildVirtualEnv(rEnv *database.Connector, SQLs ...string
// 为不影响其他SQL操作,复制一个Connector对象,将数据库切换到对应的DB上直接执行
// 为不影响其他SQL操作,复制一个Connector对象,将数据库切换到对应的DB上直接执行
vEnv
.
Database
=
vEnv
.
DBRef
[
rEnv
.
Database
]
vEnv
.
Database
=
vEnv
.
DBRef
[
rEnv
.
Database
]
// 为了支持并发,需要将DB进行映射,但
db.table这种形式无法保证DB
的映射是正确的
// 为了支持并发,需要将DB进行映射,但
db.table 这种形式无法保证 DB
的映射是正确的
// TODO:暂不支持 create db.tableName (id int) 形式的建表语句
// TODO:暂不支持 create db.tableName (id int) 形式的建表语句
if
stmt
.
Table
.
Qualifier
.
String
()
!=
""
{
if
stmt
.
Table
.
Qualifier
.
String
()
!=
""
{
common
.
Log
.
Error
(
"BuildVirtualEnv DDL Not support db.tb format"
)
common
.
Log
.
Error
(
"BuildVirtualEnv DDL Not support db.tb format"
)
...
@@ -300,7 +298,7 @@ func (vEnv *VirtualEnv) BuildVirtualEnv(rEnv *database.Connector, SQLs ...string
...
@@ -300,7 +298,7 @@ func (vEnv *VirtualEnv) BuildVirtualEnv(rEnv *database.Connector, SQLs ...string
meta
:=
ast
.
GetMeta
(
stmt
,
nil
)
meta
:=
ast
.
GetMeta
(
stmt
,
nil
)
// 由于
DB环境可能是变的,所以需要每一次都单独的提取库表结构,整体随着rEnv
的变动而发生变化
// 由于
DB 环境可能是变的,所以需要每一次都单独的提取库表结构,整体随着 rEnv
的变动而发生变化
for
db
,
table
:=
range
meta
{
for
db
,
table
:=
range
meta
{
if
db
==
""
{
if
db
==
""
{
db
=
rEnv
.
Database
db
=
rEnv
.
Database
...
@@ -361,7 +359,7 @@ func (vEnv *VirtualEnv) createDatabase(rEnv *database.Connector) error {
...
@@ -361,7 +359,7 @@ func (vEnv *VirtualEnv) createDatabase(rEnv *database.Connector) error {
// optimizer_YYMMDDHHmmss_xxxx
// optimizer_YYMMDDHHmmss_xxxx
dbHash
:=
fmt
.
Sprintf
(
"optimizer_%s_%s"
,
// Total 39 bytes
dbHash
:=
fmt
.
Sprintf
(
"optimizer_%s_%s"
,
// Total 39 bytes
time
.
Now
()
.
Format
(
"060102150405"
),
// 12 Bytes
20
180102030405
time
.
Now
()
.
Format
(
"060102150405"
),
// 12 Bytes 180102030405
strings
.
ToLower
(
uniuri
.
New
()))
// 16 Bytes random string
strings
.
ToLower
(
uniuri
.
New
()))
// 16 Bytes random string
common
.
Log
.
Debug
(
"createDatabase, mapping `%s` :`%s`-->`%s`"
,
rEnv
.
Database
,
rEnv
.
Database
,
dbHash
)
common
.
Log
.
Debug
(
"createDatabase, mapping `%s` :`%s`-->`%s`"
,
rEnv
.
Database
,
rEnv
.
Database
,
dbHash
)
ddl
,
err
:=
rEnv
.
ShowCreateDatabase
(
rEnv
.
Database
)
ddl
,
err
:=
rEnv
.
ShowCreateDatabase
(
rEnv
.
Database
)
...
@@ -496,7 +494,7 @@ func (vEnv *VirtualEnv) GenTableColumns(meta common.Meta) common.TableColumns {
...
@@ -496,7 +494,7 @@ func (vEnv *VirtualEnv) GenTableColumns(meta common.Meta) common.TableColumns {
}
}
if
len
(
tb
.
Column
)
==
0
{
if
len
(
tb
.
Column
)
==
0
{
// tb.column
为空说明SQL
里这个表是用的*来查询
// tb.column
为空说明 SQL
里这个表是用的*来查询
if
err
!=
nil
{
if
err
!=
nil
{
common
.
Log
.
Error
(
"ast.Rewrite ShowColumns, Error: %v"
,
err
)
common
.
Log
.
Error
(
"ast.Rewrite ShowColumns, Error: %v"
,
err
)
break
break
...
...
test/test_helper.bash
浏览文件 @
5de903a2
...
@@ -10,5 +10,4 @@ setup() {
...
@@ -10,5 +10,4 @@ setup() {
golden_diff
()
{
golden_diff
()
{
FUNC_NAME
=
$1
FUNC_NAME
=
$1
diff
"
${
BATS_TMP_DIRNAME
}
/
${
FUNC_NAME
}
.golden"
"
${
BATS_FIXTURE_DIRNAME
}
/
${
FUNC_NAME
}
.golden"
>
/dev/null
diff
"
${
BATS_TMP_DIRNAME
}
/
${
FUNC_NAME
}
.golden"
"
${
BATS_FIXTURE_DIRNAME
}
/
${
FUNC_NAME
}
.golden"
>
/dev/null
return
$?
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录