diff --git a/conn.go b/conn.go index 99105136..fa8c35d8 100644 --- a/conn.go +++ b/conn.go @@ -12,6 +12,8 @@ type conn struct { conn net.Conn // the underlying TCP or unix domain socket connection rowDesc rowDescription // current query rowDescription buf []byte // work buffer to avoid constant alloc and dealloc + pid int32 // backend pid + 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 } @@ -125,7 +127,8 @@ func (c *conn) processCommonMsg(t byte, body []byte) (err error) { func (c *conn) parseMsg(t byte, body []byte) (msg interface{}, err error) { switch t { case 'K': - return c.rxBackendKeyData(body), nil + c.rxBackendKeyData(body) + return nil, nil case 'R': return c.rxAuthenticationX(body) case 'Z': @@ -190,11 +193,10 @@ func (c *conn) rxParameterStatus(buf []byte) { c.runtimeParams[key] = value } -func (c *conn) rxBackendKeyData(buf []byte) (msg *backendKeyData) { - msg = new(backendKeyData) - msg.pid = int32(binary.BigEndian.Uint32(buf[:4])) - msg.secretKey = int32(binary.BigEndian.Uint32(buf[4:8])) - return +func (c *conn) rxBackendKeyData(buf []byte) { + r := newMessageReader(buf) + c.pid = r.readInt32() + c.secretKey = r.readInt32() } func (c *conn) rxReadyForQuery(buf []byte) (msg *readyForQuery) { diff --git a/conn_test.go b/conn_test.go index fce0e5d5..f43f5ca8 100644 --- a/conn_test.go +++ b/conn_test.go @@ -14,6 +14,14 @@ func TestConnect(t *testing.T) { t.Error("Runtime parameters not stored") } + if conn.pid == 0 { + t.Error("Backend PID not stored") + } + + if conn.secretKey == 0 { + t.Error("Backend secret key not stored") + } + err = conn.Close() if err != nil { t.Fatal("Unable to close connection") diff --git a/messages.go b/messages.go index 5c998e3a..e9c98c93 100644 --- a/messages.go +++ b/messages.go @@ -38,15 +38,6 @@ func (self *authenticationOk) String() string { return "AuthenticationOk" } -type backendKeyData struct { - pid int32 - secretKey int32 -} - -func (self *backendKeyData) String() string { - return fmt.Sprintf("BackendKeyData pid: %d, secretKey: %d", self.pid, self.secretKey) -} - type readyForQuery struct { txStatus byte }