mirror of https://github.com/jackc/pgx.git
Reduce nesting in message loops
parent
928612917d
commit
5fe3dd7ecf
108
conn.go
108
conn.go
|
@ -211,7 +211,11 @@ func Connect(config ConnConfig) (c *Conn, err error) {
|
|||
for {
|
||||
var t byte
|
||||
var r *MessageReader
|
||||
if t, r, err = c.rxMsg(); err == nil {
|
||||
t, r, err = c.rxMsg()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
switch t {
|
||||
case backendKeyData:
|
||||
c.rxBackendKeyData(r)
|
||||
|
@ -229,9 +233,6 @@ func Connect(config ConnConfig) (c *Conn, err error) {
|
|||
return nil, err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -305,32 +306,37 @@ func (c *Conn) selectFunc(sql string, onDataRow func(*DataRowReader) error, argu
|
|||
return
|
||||
}
|
||||
|
||||
var softErr error
|
||||
|
||||
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 {
|
||||
case readyForQuery:
|
||||
c.rxReadyForQuery(r)
|
||||
return
|
||||
return softErr
|
||||
case rowDescription:
|
||||
fields = c.rxRowDescription(r)
|
||||
case dataRow:
|
||||
if err == nil {
|
||||
if softErr == nil {
|
||||
var drr *DataRowReader
|
||||
drr, err = newDataRowReader(r, fields)
|
||||
if err == nil {
|
||||
err = onDataRow(drr)
|
||||
drr, softErr = newDataRowReader(r, fields)
|
||||
if softErr == nil {
|
||||
softErr = onDataRow(drr)
|
||||
}
|
||||
}
|
||||
case commandComplete:
|
||||
case bindComplete:
|
||||
default:
|
||||
if e := c.processContextFreeMsg(t, r); e != nil && err == nil {
|
||||
err = e
|
||||
if e := c.processContextFreeMsg(t, r); e != nil && softErr == nil {
|
||||
softErr = e
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return rxErr
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -456,44 +462,50 @@ func (c *Conn) SelectValueTo(w io.Writer, sql string, arguments ...interface{})
|
|||
}
|
||||
|
||||
var numRowsFound int64
|
||||
var softErr error
|
||||
|
||||
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 {
|
||||
numRowsFound++
|
||||
|
||||
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
|
||||
continue
|
||||
}
|
||||
|
||||
err = c.rxDataRowValueTo(w, bodySize)
|
||||
softErr = c.rxDataRowValueTo(w, bodySize)
|
||||
} else {
|
||||
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)
|
||||
switch t {
|
||||
case readyForQuery:
|
||||
c.rxReadyForQuery(r)
|
||||
return
|
||||
return softErr
|
||||
case rowDescription:
|
||||
case commandComplete:
|
||||
case bindComplete:
|
||||
default:
|
||||
if e := c.processContextFreeMsg(t, r); e != nil && err == nil {
|
||||
err = e
|
||||
if e := c.processContextFreeMsg(t, r); e != nil && softErr == nil {
|
||||
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}
|
||||
|
||||
var softErr error
|
||||
|
||||
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 {
|
||||
case parseComplete:
|
||||
case parameterDescription:
|
||||
|
@ -628,15 +648,12 @@ func (c *Conn) Prepare(name, sql string) (err error) {
|
|||
case readyForQuery:
|
||||
c.rxReadyForQuery(r)
|
||||
c.preparedStatements[name] = &ps
|
||||
return
|
||||
return softErr
|
||||
default:
|
||||
if e := c.processContextFreeMsg(t, r); e != nil && err == nil {
|
||||
err = e
|
||||
if e := c.processContextFreeMsg(t, r); e != nil && softErr == nil {
|
||||
softErr = e
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return rxErr
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -844,25 +861,30 @@ func (c *Conn) Execute(sql string, arguments ...interface{}) (commandTag Command
|
|||
return
|
||||
}
|
||||
|
||||
var softErr error
|
||||
|
||||
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 {
|
||||
case readyForQuery:
|
||||
c.rxReadyForQuery(r)
|
||||
return
|
||||
return commandTag, softErr
|
||||
case rowDescription:
|
||||
case dataRow:
|
||||
case bindComplete:
|
||||
case commandComplete:
|
||||
commandTag = CommandTag(r.ReadCString())
|
||||
default:
|
||||
if e := c.processContextFreeMsg(t, r); e != nil && err == nil {
|
||||
err = e
|
||||
if e := c.processContextFreeMsg(t, r); e != nil && softErr == nil {
|
||||
softErr = e
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return "", rxErr
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue