generated from hashicorp/terraform-provider-scaffolding-framework
/
grant_privilege_parser.go
99 lines (85 loc) · 2.08 KB
/
grant_privilege_parser.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package provider
import (
"strings"
"github.com/pingcap/tidb/parser"
"github.com/pingcap/tidb/parser/ast"
_ "github.com/pingcap/tidb/parser/test_driver"
)
type GrantPrivilege struct {
DBName string
TableName string
Username string
Hostname string
Privileges []*ast.PrivElem
GrantOption bool
}
func (v *GrantPrivilege) Enter(in ast.Node) (ast.Node, bool) {
if g, ok := in.(*ast.GrantStmt); ok {
us := g.Users[0]
v.Username = us.User.Username
v.Hostname = us.User.Hostname
if len(g.Level.DBName) == 0 {
v.DBName = "*"
} else {
v.DBName = g.Level.DBName
}
if len(g.Level.TableName) == 0 {
v.TableName = "*"
} else {
v.TableName = g.Level.TableName
}
v.GrantOption = g.WithGrant
}
if priv, ok := in.(*ast.PrivElem); ok {
v.Privileges = append(v.Privileges, priv)
}
return in, false
}
func (v *GrantPrivilege) Leave(in ast.Node) (ast.Node, bool) {
return in, true
}
func (v *GrantPrivilege) PrivString() string {
if len(v.Privileges) == 0 {
return ""
}
privs := make([]string, len(v.Privileges))
for privIndex, priv := range v.Privileges {
if len(priv.Cols) > 0 {
s := priv.Priv.String()
columnNames := make([]string, len(priv.Cols))
for colIndex, col := range priv.Cols {
columnNames[colIndex] = col.Name.O
}
privs[privIndex] = s + " " + strings.Join(columnNames, ",")
} else {
privs[privIndex] = priv.Priv.String()
}
}
return strings.Join(privs, ",")
}
func (v *GrantPrivilege) Match(dbName, tableName, username, hostname string) bool {
return v.DBName == dbName &&
v.TableName == tableName &&
v.Username == username &&
v.Hostname == hostname
}
func extract(rootNode *ast.StmtNode) *GrantPrivilege {
v := &GrantPrivilege{}
(*rootNode).Accept(v)
return v
}
func parse(sql string) (*ast.StmtNode, error) {
p := parser.New()
stmtNodes, _, err := p.Parse(sql, "", "")
if err != nil {
return nil, err
}
return &stmtNodes[0], nil
}
func ParseGrantPrivilegeStatement(sql string) (*GrantPrivilege, error) {
astNode, err := parse(sql)
if err != nil {
return nil, err
}
return extract(astNode), nil
}