-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpostgres.go
117 lines (90 loc) · 2.2 KB
/
postgres.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
package database
import (
"database/sql"
"fmt"
"net"
"strings"
"github.com/andrewpillar/mgrt/config"
"github.com/andrewpillar/mgrt/revision"
_ "github.com/lib/pq"
)
type Postgres struct {
*database
}
var (
postgresDsn = "host=%s port=%s user=%s dbname=%s password=%s sslmode=%s"
postgresInit = `
CREATE TABLE mgrt_revisions (
id INT NOT NULL,
message TEXT NOT NULL,
hash BYTEA NOT NULL,
direction INT NOT NULL,
up TEXT NULL,
down TEXT NULL,
forced BOOLEAN NOT NULL,
created_at TIMESTAMP NOT NULL
);`
postgresLastQuery = `
SELECT id, hash, direction
FROM mgrt_revisions WHERE id = $1
ORDER BY created_at DESC LIMIT 1`
postgresLogQuery = `
INSERT INTO mgrt_revisions
(id, message, hash, direction, up, down, forced, created_at)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`
postgresHashQuery = `
SELECT hash
FROM mgrt_revisions
WHERE id = $1 AND direction = $2 AND forced = false
ORDER BY created_at DESC LIMIT 1`
)
func init() {
databases["postgres"] = &Postgres{}
}
func (p *Postgres) FromConn(db *sql.DB) {
p.database = &database{
DB: db,
}
}
func (p *Postgres) Open(cfg *config.Config) error {
host, port, err := net.SplitHostPort(cfg.Address)
if err != nil {
return err
}
if cfg.SSL.Mode == "" {
cfg.SSL.Mode = "disable"
}
if cfg.SSL.Mode != "disable" {
if cfg.SSL.Cert != "" {
postgresDsn += " sslcert=" + cfg.SSL.Cert
}
if cfg.SSL.Key != "" {
postgresDsn += " sslkey=" + cfg.SSL.Key
}
if cfg.SSL.Root != "" {
postgresDsn += " sslrootcert=" + cfg.SSL.Root
}
}
dsn := fmt.Sprintf(postgresDsn, host, port, cfg.Username, cfg.Database, cfg.Password, cfg.SSL.Mode)
db, err := sql.Open("postgres", dsn)
if err != nil {
return err
}
p.database = &database{
DB: db,
}
return nil
}
func (p *Postgres) Init() error {
_, err := p.database.Exec(postgresInit)
if err != nil && strings.Contains(err.Error(), "already exists") {
return ErrInitialized
}
return err
}
func (p *Postgres) Log(r *revision.Revision, forced bool) error {
return p.database.log(r, forced, postgresLogQuery)
}
func (p *Postgres) Perform(r *revision.Revision, forced bool) error {
return p.database.perform(r, forced, postgresLastQuery, postgresHashQuery)
}