/
dbSync.go
118 lines (98 loc) · 2.8 KB
/
dbSync.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
/*
Nging is a toolbox for webmasters
Copyright (C) 2018-present Wenhui Shen <swh@admpub.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package model
import (
"net/url"
"strings"
"github.com/webx-top/db"
"github.com/webx-top/echo"
"github.com/admpub/nging/application/dbschema"
"github.com/admpub/nging/application/model/base"
)
type DbSyncWithAccount struct {
*dbschema.NgingDbSync
SrcAccount *dbschema.NgingDbAccount `db:"-,relation=id:source_account_id"`
DstAccount *dbschema.NgingDbAccount `db:"-,relation=id:destination_account_id"`
}
func NewDbSync(ctx echo.Context) *DbSync {
return &DbSync{
NgingDbSync: &dbschema.NgingDbSync{},
Base: base.New(ctx),
}
}
type DbSync struct {
*dbschema.NgingDbSync
*base.Base
}
func (a *DbSync) ToDSNFromAccount(acc *dbschema.NgingDbAccount) string {
return a.ToDSN(acc.User, acc.Password, acc.Host, acc.Name)
}
func (a *DbSync) ToDSN(user, pwd, host, db string) string {
//test:test@(127.0.0.1:3306)/test_0
if len(user) == 0 {
user = `root`
}
if len(pwd) == 0 {
pwd = `root`
}
if len(host) == 0 {
host = `127.0.0.1:3306`
}
return url.QueryEscape(user) + `:` + url.QueryEscape(pwd) + `@(` + host + `)/` + db
}
func (a *DbSync) ParseDSN(dsn string) (user string, pwd string, host string, dbName string) {
if len(dsn) == 0 {
return
}
idx := strings.Index(dsn, `:`)
if idx > 0 {
user, _ = url.QueryUnescape(dsn[0:idx])
}
dsn = dsn[idx+1:]
idx = strings.Index(dsn, `@`)
if idx > 0 {
pwd, _ = url.QueryUnescape(dsn[0:idx])
}
dsn = dsn[idx+1:]
idx = strings.Index(dsn, `/`)
if idx > 0 {
host = dsn[0:idx]
}
host = strings.TrimPrefix(host, `(`)
host = strings.TrimSuffix(host, `)`)
if len(dsn) > idx+1 {
dbName = dsn[idx+1:]
}
return
}
func (a *DbSync) HidePassword(dsn string) string {
if len(dsn) == 0 {
return dsn
}
idx := strings.Index(dsn, `:`)
var user string
if idx > 0 {
user, _ = url.QueryUnescape(dsn[0:idx])
}
dsn = dsn[idx+1:]
idx = strings.Index(dsn, `@`)
return user + `:***@` + dsn[idx+1:]
}
func (a *DbSync) Add() (interface{}, error) {
return a.NgingDbSync.Add()
}
func (a *DbSync) Edit(mw func(db.Result) db.Result, args ...interface{}) error {
return a.NgingDbSync.Edit(mw, args...)
}