/
mysql_util.go
132 lines (112 loc) · 3.54 KB
/
mysql_util.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package plugins
import (
"database/sql"
"fmt"
"os/exec"
"strings"
_ "github.com/go-sql-driver/mysql"
"github.com/WeBankPartners/wecube-plugins-saltstack/common/log"
)
var DB *sql.DB
func initDB(host, port, loginUser, loginPwd, dbName string) error {
var err error
path := strings.Join([]string{loginUser, ":", loginPwd, "@tcp(", host, ":", port, ")/", dbName, "?charset=utf8"}, "")
DB, err = sql.Open("mysql", path)
if err != nil {
return fmt.Errorf("connect to mysql fail,%s", err.Error())
}
DB.SetConnMaxLifetime(100)
DB.SetMaxIdleConns(10)
if err := DB.Ping(); err != nil {
return fmt.Errorf("keep alive to mysql fail,%s", err.Error())
}
return nil
}
func getAllUserByDB(host, port, loginUser, loginPwd, dbName, language string) ([]string, error) {
users := []string{}
// initDB param dbName = "mysql", not getUserByDB.dbName
err := initDB(host, port, loginUser, loginPwd, "mysql")
if err != nil {
return users, getMysqlConnectError(language, err)
}
querySql := fmt.Sprintf("select User from db where db.Db='%s'", dbName)
rows, err := DB.Query(querySql)
if err != nil {
return users, fmt.Errorf("Query mysql user fail,%s ", err.Error())
}
for rows.Next() {
var user string
err := rows.Scan(&user)
if err != nil {
return users, fmt.Errorf("Mysql rows scan fail,%s ", err.Error())
}
users = append(users, user)
}
return users, nil
}
func getAllDBByUser(host, port, loginUser, loginPwd, userName, language string) ([]string, error) {
dbs := []string{}
// initDB param dbName = "mysql".
err := initDB(host, port, loginUser, loginPwd, "mysql")
if err != nil {
err = getMysqlConnectError(language, err)
return dbs, err
}
querySql := fmt.Sprintf("select Db from db where db.User='%s'", userName)
rows, err := DB.Query(querySql)
if err != nil {
return dbs, fmt.Errorf("Query mysql database user fail,%s ", err.Error())
}
for rows.Next() {
var db string
err := rows.Scan(&db)
if err != nil {
return dbs, fmt.Errorf("Mysql rows scan fail,%s ", err.Error())
}
dbs = append(dbs, db)
}
return dbs, nil
}
func checkDBExistOrNot(host, port, loginUser, loginPwd, dbName, language string) (bool, error) {
// initDB param dbName = "mysql", not getUserByDB.dbName
err := initDB(host, port, loginUser, loginPwd, "mysql")
if err != nil {
return false, getMysqlConnectError(language, err)
}
querySql := fmt.Sprintf("SELECT 1 FROM mysql.db WHERE Db = '%s'", dbName)
rows, err := DB.Query(querySql)
if err != nil {
return false, fmt.Errorf("Query mysql database fail,%s ", err.Error())
}
return rows.Next(), nil
}
func checkUserExistOrNot(host, port, loginUser, loginPwd, userName, language string) (bool, error) {
// initDB param dbName = "mysql".
err := initDB(host, port, loginUser, loginPwd, "mysql")
if err != nil {
return false, getMysqlConnectError(language, err)
}
querySql := fmt.Sprintf("SELECT 1 FROM mysql.user WHERE user = '%s'", userName)
rows, err := DB.Query(querySql)
if err != nil {
return false, fmt.Errorf("Query mysql user fail,%s ", err.Error())
}
return rows.Next(), nil
}
func runDatabaseCommand(host string, port string, loginUser string, loginPwd string, cmd string) error {
argv := []string{
"-h" + host,
"-u" + loginUser,
"-p" + loginPwd,
"-P" + port,
"-e",
cmd,
}
command := exec.Command("/usr/bin/mysql", argv...)
out, err := command.CombinedOutput()
if err != nil {
log.Logger.Debug("Run mysql command", log.StringList("command", argv), log.String("output", string(out)), log.Error(err))
return fmt.Errorf("output:%s,error:%s", string(out), err.Error())
}
return nil
}