/
sql.go
87 lines (76 loc) · 2.34 KB
/
sql.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
// Copyright 2017 AMIS Technologies
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package test
import (
"os"
"github.com/getamis/sirius/database/mysql"
"github.com/getamis/sirius/database/postgresql"
)
type SQLOptions struct {
Driver string
// The following options are used in the connection string and the mysql server container itself.
Username string
Password string
Port string
Database string
// The host address that will be used to build the connection string
Host string
}
// UpdateHostFromContainer updates the mysql host field according to the current environment
//
// If we're inside the container, we need to override the hostname
// defined in the option.
// If not, we should use the default value 127.0.0.1 because we will need to connect to the host port.
// please note that the TEST_MYSQL_HOST can be overridden.
func (o *SQLOptions) UpdateHostFromContainer(c *Container) error {
if IsInsideContainer() {
inspectedContainer, err := c.dockerClient.InspectContainer(c.container.ID)
if err != nil {
return err
}
o.Host = inspectedContainer.NetworkSettings.IPAddress
}
return nil
}
func (o *SQLOptions) ToConnectionString() (string, error) {
switch o.Driver {
case "mysql":
return mysql.ToConnectionString(
mysql.Connector(mysql.DefaultProtocol, o.Host, o.Port),
mysql.Database(o.Database),
mysql.UserInfo(o.Username, o.Password),
)
case "postgres":
return postgresql.ToConnectionString(
postgresql.Connector(o.Host, o.Port),
postgresql.Database(o.Database),
postgresql.UserInfo(o.Username, o.Password),
)
}
return "", nil
}
type SQLContainer struct {
*Container
Options SQLOptions
URL string
}
func IsInsideContainer() bool {
if _, err := os.Stat("/.dockerenv"); err == nil {
return true
}
if _, err := os.Stat("/bin/running-in-container"); err == nil {
return true
}
return false
}