Reduce nesting in message loops

scan-io
Jack Christensen 2014-06-17 16:39:44 -05:00
parent 928612917d
commit 5fe3dd7ecf
1 changed files with 133 additions and 111 deletions

108
conn.go
View File

@ -211,7 +211,11 @@ func Connect(config ConnConfig) (c *Conn, err error) {
for { for {
var t byte var t byte
var r *MessageReader var r *MessageReader
if t, r, err = c.rxMsg(); err == nil { t, r, err = c.rxMsg()
if err != nil {
return nil, err
}
switch t { switch t {
case backendKeyData: case backendKeyData:
c.rxBackendKeyData(r) c.rxBackendKeyData(r)
@ -229,9 +233,6 @@ func Connect(config ConnConfig) (c *Conn, err error) {
return nil, err return nil, err
} }
} }
} else {
return nil, err
}
} }
} }
@ -305,32 +306,37 @@ func (c *Conn) selectFunc(sql string, onDataRow func(*DataRowReader) error, argu
return return
} }
var softErr error
for { for {
if t, r, rxErr := c.rxMsg(); rxErr == nil { var t byte
var r *MessageReader
t, r, err = c.rxMsg()
if err != nil {
return err
}
switch t { switch t {
case readyForQuery: case readyForQuery:
c.rxReadyForQuery(r) c.rxReadyForQuery(r)
return return softErr
case rowDescription: case rowDescription:
fields = c.rxRowDescription(r) fields = c.rxRowDescription(r)
case dataRow: case dataRow:
if err == nil { if softErr == nil {
var drr *DataRowReader var drr *DataRowReader
drr, err = newDataRowReader(r, fields) drr, softErr = newDataRowReader(r, fields)
if err == nil { if softErr == nil {
err = onDataRow(drr) softErr = onDataRow(drr)
} }
} }
case commandComplete: case commandComplete:
case bindComplete: case bindComplete:
default: default:
if e := c.processContextFreeMsg(t, r); e != nil && err == nil { if e := c.processContextFreeMsg(t, r); e != nil && softErr == nil {
err = e softErr = e
} }
} }
} else {
return rxErr
}
} }
} }
@ -456,44 +462,50 @@ func (c *Conn) SelectValueTo(w io.Writer, sql string, arguments ...interface{})
} }
var numRowsFound int64 var numRowsFound int64
var softErr error
for { for {
if t, bodySize, rxErr := c.rxMsgHeader(); rxErr == nil { var t byte
var bodySize int32
t, bodySize, err = c.rxMsgHeader()
if err != nil {
return err
}
if t == dataRow { if t == dataRow {
numRowsFound++ numRowsFound++
if numRowsFound > 1 { if numRowsFound > 1 {
err = NotSingleRowError{RowCount: numRowsFound} softErr = NotSingleRowError{RowCount: numRowsFound}
} }
if err != nil { if softErr != nil {
c.rxMsgBody(bodySize) // Read and discard rest of message c.rxMsgBody(bodySize) // Read and discard rest of message
continue continue
} }
err = c.rxDataRowValueTo(w, bodySize) softErr = c.rxDataRowValueTo(w, bodySize)
} else { } else {
var body *bytes.Buffer var body *bytes.Buffer
if body, rxErr = c.rxMsgBody(bodySize); rxErr == nil { body, err = c.rxMsgBody(bodySize)
if err != nil {
return err
}
r := newMessageReader(body) r := newMessageReader(body)
switch t { switch t {
case readyForQuery: case readyForQuery:
c.rxReadyForQuery(r) c.rxReadyForQuery(r)
return return softErr
case rowDescription: case rowDescription:
case commandComplete: case commandComplete:
case bindComplete: case bindComplete:
default: default:
if e := c.processContextFreeMsg(t, r); e != nil && err == nil { if e := c.processContextFreeMsg(t, r); e != nil && softErr == nil {
err = e softErr = e
} }
} }
} else {
return rxErr
}
}
} else {
return rxErr
} }
} }
} }
@ -610,8 +622,16 @@ func (c *Conn) Prepare(name, sql string) (err error) {
ps := preparedStatement{Name: name} ps := preparedStatement{Name: name}
var softErr error
for { for {
if t, r, rxErr := c.rxMsg(); rxErr == nil { var t byte
var r *MessageReader
t, r, err := c.rxMsg()
if err != nil {
return err
}
switch t { switch t {
case parseComplete: case parseComplete:
case parameterDescription: case parameterDescription:
@ -628,15 +648,12 @@ func (c *Conn) Prepare(name, sql string) (err error) {
case readyForQuery: case readyForQuery:
c.rxReadyForQuery(r) c.rxReadyForQuery(r)
c.preparedStatements[name] = &ps c.preparedStatements[name] = &ps
return return softErr
default: default:
if e := c.processContextFreeMsg(t, r); e != nil && err == nil { if e := c.processContextFreeMsg(t, r); e != nil && softErr == nil {
err = e softErr = e
} }
} }
} else {
return rxErr
}
} }
} }
@ -844,25 +861,30 @@ func (c *Conn) Execute(sql string, arguments ...interface{}) (commandTag Command
return return
} }
var softErr error
for { for {
if t, r, rxErr := c.rxMsg(); rxErr == nil { var t byte
var r *MessageReader
t, r, err = c.rxMsg()
if err != nil {
return commandTag, err
}
switch t { switch t {
case readyForQuery: case readyForQuery:
c.rxReadyForQuery(r) c.rxReadyForQuery(r)
return return commandTag, softErr
case rowDescription: case rowDescription:
case dataRow: case dataRow:
case bindComplete: case bindComplete:
case commandComplete: case commandComplete:
commandTag = CommandTag(r.ReadCString()) commandTag = CommandTag(r.ReadCString())
default: default:
if e := c.processContextFreeMsg(t, r); e != nil && err == nil { if e := c.processContextFreeMsg(t, r); e != nil && softErr == nil {
err = e softErr = e
} }
} }
} else {
return "", rxErr
}
} }
} }