peekMessage peeks at the next message without setting up context cancellation.
()
| 623 | |
| 624 | // peekMessage peeks at the next message without setting up context cancellation. |
| 625 | func (pgConn *PgConn) peekMessage() (pgproto3.BackendMessage, error) { |
| 626 | if pgConn.peekedMsg != nil { |
| 627 | return pgConn.peekedMsg, nil |
| 628 | } |
| 629 | |
| 630 | var msg pgproto3.BackendMessage |
| 631 | var err error |
| 632 | if pgConn.bufferingReceive { |
| 633 | pgConn.bufferingReceiveMux.Lock() |
| 634 | msg = pgConn.bufferingReceiveMsg |
| 635 | err = pgConn.bufferingReceiveErr |
| 636 | pgConn.bufferingReceiveMux.Unlock() |
| 637 | pgConn.bufferingReceive = false |
| 638 | |
| 639 | // If a timeout error happened in the background try the read again. |
| 640 | var netErr net.Error |
| 641 | if errors.As(err, &netErr) && netErr.Timeout() { |
| 642 | msg, err = pgConn.frontend.Receive() |
| 643 | } |
| 644 | } else { |
| 645 | msg, err = pgConn.frontend.Receive() |
| 646 | } |
| 647 | |
| 648 | if err != nil { |
| 649 | // Close on anything other than timeout error - everything else is fatal |
| 650 | var netErr net.Error |
| 651 | isNetErr := errors.As(err, &netErr) |
| 652 | if !(isNetErr && netErr.Timeout()) { |
| 653 | pgConn.asyncClose() |
| 654 | } |
| 655 | |
| 656 | return nil, err |
| 657 | } |
| 658 | |
| 659 | pgConn.peekedMsg = msg |
| 660 | return msg, nil |
| 661 | } |
| 662 | |
| 663 | // receiveMessage receives a message without setting up context cancellation |
| 664 | func (pgConn *PgConn) receiveMessage() (pgproto3.BackendMessage, error) { |
no test coverage detected