-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdump.go
84 lines (69 loc) · 1.65 KB
/
dump.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
package db
import (
"github.com/alomerry/go-tools/static/cons"
"github.com/alomerry/go-tools/utils/db/mysql"
)
const (
defaultDumpPath = "/tmp/db-dump"
)
type DumpTool struct {
dbCfg map[cons.DatabaseType]map[string]any
clientMap map[cons.DatabaseType]innerDumpTool
dumpPath string
}
type innerDumpTool interface {
Dump(prefix string, param map[string]any, db cons.Database) (string, error)
}
type GenDumpCmdParamFunc func(*DumpTool)
func MySQLDumpCmdParam(dsn string) GenDumpCmdParamFunc {
return func(tool *DumpTool) {
info, err := cons.ParseDbDsn(dsn)
if err != nil {
panic(err)
}
tool.dbCfg[cons.MySQL] = map[string]any{
"user": info.User,
"host": info.Host,
"port": info.Port,
"password": info.Password,
}
}
}
func SetDumpPath(path string) GenDumpCmdParamFunc {
return func(tool *DumpTool) {
tool.dumpPath = path
}
}
func NewDumpTool(paramFunc ...GenDumpCmdParamFunc) *DumpTool {
tool := &DumpTool{
dumpPath: defaultDumpPath,
dbCfg: map[cons.DatabaseType]map[string]any{},
}
tool.clientMap = map[cons.DatabaseType]innerDumpTool{
cons.MySQL: &mysql.DumpTool{},
}
for i := range paramFunc {
paramFunc[i](tool)
}
return tool
}
func (d *DumpTool) DumpDbs(dbs ...cons.Database) ([]string, error) {
var result []string
for i := range dbs {
sql, err := d.dumpDatabase(dbs[i])
if err != nil {
return nil, err
}
result = append(result, sql)
}
return result, nil
}
func (d *DumpTool) dumpDatabase(db cons.Database) (string, error) {
switch db.Type {
case cons.MySQL:
break
default:
return cons.EmptyStr, nil
}
return d.clientMap[db.Type].Dump(d.dumpPath, d.dbCfg[db.Type], db)
}