-
Notifications
You must be signed in to change notification settings - Fork 0
/
target.go
122 lines (102 loc) · 2.4 KB
/
target.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
package pgsql
import (
"database/sql"
"fmt"
"syscall"
"github.com/kzaag/dp/rdbms"
"github.com/kzaag/dp/target"
"golang.org/x/crypto/ssh/terminal"
)
func TargetGetCS(target *target.Target) (string, error) {
if target.ConnectionString != "" {
return target.ConnectionString, nil
}
if target.Password == "" {
fmt.Printf("password for %s: ", target.Name)
bytes, err := terminal.ReadPassword(int(syscall.Stdin))
if err != nil {
return "", err
}
fmt.Println()
target.Password = string(bytes)
}
host := ""
if len(target.Server) == 1 && target.Server[0] != "" {
host = fmt.Sprintf("host=%s", target.Server[0])
}
user := ""
if target.User != "" {
user = fmt.Sprintf("user=%s", target.User)
}
password := ""
if target.Password != "" {
password = fmt.Sprintf("password=%s", target.Password)
}
database := ""
if target.Database != "" {
database = fmt.Sprintf("dbname=%s", target.Database)
}
cs := fmt.Sprintf(
"%s %s %s %s",
host,
user,
password,
database)
if target.Args != nil {
for k := range target.Args {
cs += fmt.Sprintf(" %s=%s", k, target.Args[k])
}
}
return cs, nil
}
func TargetGetDB(target *target.Target) (interface{}, error) {
var cs string
var err error
if cs, err = TargetGetCS(target); err != nil {
return nil, err
}
return sql.Open("postgres", cs)
}
func TargetGetMergeScript(
dbCtx interface{}, ectx *target.Target, args []string,
) (string, error) {
db := dbCtx.(*sql.DB)
ts := rdbms.MergeTableCtx{}
tt := MergeTypeCtx{}
ctx := StmtNew()
var mergeScript string
var err error
var dd []DDObject
for _, arg := range args {
if dd, err = ParserGetObjectsInDir(ctx, arg); err != nil {
return "", err
}
for _, obj := range dd {
if obj.Table != nil {
ts.LocalTables = append(ts.LocalTables, *obj.Table)
} else {
tt.localTypes = append(tt.localTypes, *obj.Type)
}
}
}
if ts.RemoteTables, err = RemoteGetMatchedTables(db, ts.LocalTables); err != nil {
return "", err
}
if tt.remoteTypes, err = RemoteGetTypes(db, tt.localTypes); err != nil {
return "", err
}
if mergeScript, err = Merge(ctx, &ts, &tt); err != nil {
return "", err
}
return mergeScript, nil
}
func TargetCtxNew() *target.Ctx {
return &target.Ctx{
DbClose: rdbms.DbClose,
DbExec: rdbms.DbExec,
DbNew: TargetGetDB,
DbPing: rdbms.DbPing,
DbSuffix: ".sql",
GetMergeScript: TargetGetMergeScript,
}
}