forked from go-pg/pg
/
conn.go
104 lines (86 loc) · 1.78 KB
/
conn.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
package pool
import (
"bufio"
"encoding/hex"
"fmt"
"io"
"net"
"strconv"
"time"
)
var noDeadline = time.Time{}
type Conn struct {
netConn net.Conn
buf []byte // read buffer
Rd *bufio.Reader
Columns [][]byte
Wr *WriteBuffer
InitedAt time.Time
UsedAt time.Time
ProcessId int32
SecretKey int32
_lastId int64
}
func NewConn(netConn net.Conn) *Conn {
cn := &Conn{
buf: make([]byte, 0, 512),
Rd: bufio.NewReader(netConn),
Wr: NewWriteBuffer(),
UsedAt: time.Now(),
}
cn.SetNetConn(netConn)
return cn
}
func (cn *Conn) RemoteAddr() net.Addr {
return cn.netConn.RemoteAddr()
}
func (cn *Conn) SetNetConn(netConn net.Conn) {
cn.netConn = netConn
cn.Rd.Reset(netConn)
}
func (cn *Conn) NetConn() net.Conn {
return cn.netConn
}
func (cn *Conn) NextId() string {
cn._lastId++
return strconv.FormatInt(cn._lastId, 10)
}
func (cn *Conn) SetReadWriteTimeout(rt, wt time.Duration) {
cn.UsedAt = time.Now()
if rt > 0 {
cn.netConn.SetReadDeadline(cn.UsedAt.Add(rt))
} else {
cn.netConn.SetReadDeadline(noDeadline)
}
if wt > 0 {
cn.netConn.SetWriteDeadline(cn.UsedAt.Add(wt))
} else {
cn.netConn.SetWriteDeadline(noDeadline)
}
}
func (cn *Conn) ReadN(n int) ([]byte, error) {
if d := n - cap(cn.buf); d > 0 {
cn.buf = cn.buf[:cap(cn.buf)]
cn.buf = append(cn.buf, make([]byte, d)...)
} else {
cn.buf = cn.buf[:n]
}
_, err := io.ReadFull(cn.Rd, cn.buf)
return cn.buf, err
}
func (cn *Conn) FlushWriter() error {
_, err := cn.netConn.Write(cn.Wr.Bytes)
cn.Wr.Reset()
return err
}
func (cn *Conn) Close() error {
return cn.netConn.Close()
}
func (cn *Conn) CheckHealth() error {
if cn.Rd.Buffered() != 0 {
b, _ := cn.Rd.Peek(cn.Rd.Buffered())
err := fmt.Errorf("connection has unread data:\n%s", hex.Dump(b))
return err
}
return nil
}