forked from go-pg/pg
/
conn.go
106 lines (86 loc) · 1.83 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
105
106
package pool
import (
"bufio"
"encoding/hex"
"fmt"
"io"
"net"
"strconv"
"time"
)
var noDeadline = time.Time{}
type Conn struct {
netConn net.Conn
Reader *bufio.Reader
readBuf []byte
Columns [][]byte
Writer *WriteBuffer
InitedAt time.Time
UsedAt time.Time
ProcessId int32
SecretKey int32
_lastId int64
}
func NewConn(netConn net.Conn) *Conn {
cn := &Conn{
Reader: bufio.NewReader(netConn),
readBuf: make([]byte, 0, 512),
Writer: 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.Reader.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) SetTimeout(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.readBuf); d > 0 {
cn.readBuf = cn.readBuf[:cap(cn.readBuf)]
cn.readBuf = append(cn.readBuf, make([]byte, d)...)
} else {
cn.readBuf = cn.readBuf[:n]
}
_, err := io.ReadFull(cn.Reader, cn.readBuf)
return cn.readBuf, err
}
func (cn *Conn) FlushWriter() error {
_, err := cn.netConn.Write(cn.Writer.Bytes)
cn.Writer.Reset()
return err
}
func (cn *Conn) Close() error {
return cn.netConn.Close()
}
func (cn *Conn) CheckHealth() error {
if cn.Reader.Buffered() != 0 {
b, _ := cn.Reader.Peek(cn.Reader.Buffered())
err := fmt.Errorf("connection has unread data:\n%s", hex.Dump(b))
return err
}
return nil
}