2
0

Finish migration to writeBuf

This commit is contained in:
Jack Christensen
2014-07-04 13:34:27 -05:00
parent 81cc33f1ed
commit 7083c51689
+12 -63
View File
@@ -5,7 +5,6 @@ package pgx
import ( import (
"bufio" "bufio"
"bytes"
"crypto/md5" "crypto/md5"
"crypto/tls" "crypto/tls"
"encoding/binary" "encoding/binary"
@@ -34,14 +33,13 @@ const (
// ConnConfig contains all the options used to establish a connection. // ConnConfig contains all the options used to establish a connection.
type ConnConfig struct { type ConnConfig struct {
Host string // host (e.g. localhost) or path to unix domain socket directory (e.g. /private/tmp) Host string // host (e.g. localhost) or path to unix domain socket directory (e.g. /private/tmp)
Port uint16 // default: 5432 Port uint16 // default: 5432
Database string Database string
User string // default: OS user name User string // default: OS user name
Password string Password string
MsgBufSize int // Size of work buffer used for transcoding messages. For optimal performance, it should be large enough to store a single row from any result set. Default: 1024 TLSConfig *tls.Config // config for TLS connection -- nil disables TLS
TLSConfig *tls.Config // config for TLS connection -- nil disables TLS Logger log.Logger
Logger log.Logger
} }
// Conn is a PostgreSQL connection handle. It is not safe for concurrent usage. // Conn is a PostgreSQL connection handle. It is not safe for concurrent usage.
@@ -51,8 +49,6 @@ type Conn struct {
conn net.Conn // the underlying TCP or unix domain socket connection conn net.Conn // the underlying TCP or unix domain socket connection
reader *bufio.Reader // buffered reader to improve read performance reader *bufio.Reader // buffered reader to improve read performance
wbuf [1024]byte wbuf [1024]byte
buf *bytes.Buffer
bufSize int
Pid int32 // backend pid Pid int32 // backend pid
SecretKey int32 // key to use to send a cancel query message to the server SecretKey int32 // key to use to send a cancel query message to the server
RuntimeParams map[string]string // parameters that have been reported by the server RuntimeParams map[string]string // parameters that have been reported by the server
@@ -146,10 +142,6 @@ func Connect(config ConnConfig) (c *Conn, err error) {
c.config.Port = 5432 c.config.Port = 5432
c.logger.Debug("Using default connection config", "Port", c.config.Port) c.logger.Debug("Using default connection config", "Port", c.config.Port)
} }
if c.config.MsgBufSize == 0 {
c.config.MsgBufSize = 1024
c.logger.Debug("Using default connection config", "MsgBufSize", c.config.MsgBufSize)
}
// See if host is a valid path, if yes connect with a socket // See if host is a valid path, if yes connect with a socket
_, err = os.Stat(c.config.Host) _, err = os.Stat(c.config.Host)
@@ -182,8 +174,6 @@ func Connect(config ConnConfig) (c *Conn, err error) {
} }
}() }()
c.bufSize = c.config.MsgBufSize
c.buf = bytes.NewBuffer(make([]byte, 0, c.bufSize))
c.RuntimeParams = make(map[string]string) c.RuntimeParams = make(map[string]string)
c.preparedStatements = make(map[string]*PreparedStatement) c.preparedStatements = make(map[string]*PreparedStatement)
c.alive = true c.alive = true
@@ -834,18 +824,13 @@ func (c *Conn) sendSimpleQuery(sql string, arguments ...interface{}) (err error)
} }
} }
buf := c.getBuf() wbuf := newWriteBuf(c.wbuf[0:0], 'Q')
wbuf.WriteCString(sql)
wbuf.closeMsg()
_, err = buf.WriteString(sql) _, err = c.conn.Write(wbuf.buf)
if err != nil {
return
}
err = buf.WriteByte(0)
if err != nil {
return
}
return c.txMsg('Q', buf) return err
} }
func (c *Conn) sendPreparedQuery(ps *PreparedStatement, arguments ...interface{}) (err error) { func (c *Conn) sendPreparedQuery(ps *PreparedStatement, arguments ...interface{}) (err error) {
@@ -1156,35 +1141,6 @@ func (c *Conn) txStartupMessage(msg *startupMessage) error {
return err return err
} }
func (c *Conn) txMsg(identifier byte, buf *bytes.Buffer) (err error) {
if !c.alive {
return DeadConnError
}
defer func() {
if err != nil {
c.die(err)
}
}()
err = binary.Write(c.conn, binary.BigEndian, identifier)
if err != nil {
return
}
err = binary.Write(c.conn, binary.BigEndian, int32(buf.Len()+4))
if err != nil {
return
}
_, err = buf.WriteTo(c.conn)
if err != nil {
return
}
return
}
func (c *Conn) txPasswordMessage(password string) (err error) { func (c *Conn) txPasswordMessage(password string) (err error) {
wbuf := newWriteBuf(c.wbuf[0:0], 'p') wbuf := newWriteBuf(c.wbuf[0:0], 'p')
wbuf.WriteCString(password) wbuf.WriteCString(password)
@@ -1195,13 +1151,6 @@ func (c *Conn) txPasswordMessage(password string) (err error) {
return err return err
} }
// Gets the shared connection buffer. Since bytes.Buffer never releases memory from
// its internal byte array, check on the size and create a new bytes.Buffer so the
// old one can get GC'ed
func (c *Conn) getBuf() *bytes.Buffer {
return &bytes.Buffer{}
}
func (c *Conn) die(err error) { func (c *Conn) die(err error) {
c.alive = false c.alive = false
c.causeOfDeath = err c.causeOfDeath = err