forked from go-pg/pg
-
Notifications
You must be signed in to change notification settings - Fork 0
/
options.go
109 lines (93 loc) · 2.43 KB
/
options.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
package pg
import (
"crypto/tls"
"net"
"time"
"gopkg.in/pg.v4/internal/pool"
)
// Database connection options.
type Options struct {
// Network type, either tcp or unix.
// Default is tcp.
Network string
// TCP host:port or Unix socket depending on Network.
Addr string
User string
Password string
Database string
// Whether to use secure TCP/IP connections (TLS).
// TODO: deprecated in favor of TLSConfig
SSL bool
// TLS config for secure connections.
TLSConfig *tls.Config
// PostgreSQL run-time configuration parameters to be set on connection.
Params map[string]interface{}
// Maximum number of retries before giving up.
// Default is to not retry failed queries.
MaxRetries int
// Dial timeout for establishing new connections.
// Default is 5 seconds.
DialTimeout time.Duration
// Timeout for socket reads. If reached, commands will fail
// with a timeout instead of blocking.
ReadTimeout time.Duration
// Timeout for socket writes. If reached, commands will fail
// with a timeout instead of blocking.
WriteTimeout time.Duration
// Maximum number of socket connections.
// Default is 20 connections.
PoolSize int
// Amount of time client waits for free connection if all
// connections are busy before returning an error.
// Default is 5 seconds.
PoolTimeout time.Duration
// Amount of time after which client closes idle connections.
// Default is to not close idle connections.
IdleTimeout time.Duration
// Frequency of idle checks.
// Default is 1 minute.
IdleCheckFrequency time.Duration
}
func (opt *Options) init() {
if opt.Network == "" {
opt.Network = "tcp"
}
if opt.Addr == "" {
switch opt.Network {
case "tcp":
opt.Addr = "localhost:5432"
case "unix":
opt.Addr = "/var/run/postgresql/.s.PGSQL.5432"
}
}
if opt.PoolSize == 0 {
opt.PoolSize = 20
}
if opt.PoolTimeout == 0 {
opt.PoolTimeout = 5 * time.Second
}
if opt.DialTimeout == 0 {
opt.DialTimeout = 5 * time.Second
}
if opt.IdleCheckFrequency == 0 {
opt.IdleCheckFrequency = time.Minute
}
}
func (opt *Options) getDialer() func() (net.Conn, error) {
return func() (net.Conn, error) {
return net.DialTimeout(opt.Network, opt.Addr, opt.DialTimeout)
}
}
func newConnPool(opt *Options) *pool.ConnPool {
p := pool.NewConnPool(
opt.getDialer(),
opt.PoolSize,
opt.PoolTimeout,
opt.IdleTimeout,
opt.IdleCheckFrequency,
)
p.OnClose = func(cn *pool.Conn) error {
return terminateConn(cn)
}
return p
}