| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | 
							- package mssql
 
- import (
 
- 	"fmt"
 
- 	"net"
 
- 	"time"
 
- )
 
- type timeoutConn struct {
 
- 	c             net.Conn
 
- 	timeout       time.Duration
 
- 	buf           *tdsBuffer
 
- 	packetPending bool
 
- 	continueRead  bool
 
- }
 
- func NewTimeoutConn(conn net.Conn, timeout time.Duration) *timeoutConn {
 
- 	return &timeoutConn{
 
- 		c:       conn,
 
- 		timeout: timeout,
 
- 	}
 
- }
 
- func (c *timeoutConn) Read(b []byte) (n int, err error) {
 
- 	if c.buf != nil {
 
- 		if c.packetPending {
 
- 			c.packetPending = false
 
- 			err = c.buf.FinishPacket()
 
- 			if err != nil {
 
- 				err = fmt.Errorf("Cannot send handshake packet: %s", err.Error())
 
- 				return
 
- 			}
 
- 			c.continueRead = false
 
- 		}
 
- 		if !c.continueRead {
 
- 			var packet packetType
 
- 			packet, err = c.buf.BeginRead()
 
- 			if err != nil {
 
- 				err = fmt.Errorf("Cannot read handshake packet: %s", err.Error())
 
- 				return
 
- 			}
 
- 			if packet != packPrelogin {
 
- 				err = fmt.Errorf("unexpected packet %d, expecting prelogin", packet)
 
- 				return
 
- 			}
 
- 			c.continueRead = true
 
- 		}
 
- 		n, err = c.buf.Read(b)
 
- 		return
 
- 	}
 
- 	err = c.c.SetDeadline(time.Now().Add(c.timeout))
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	return c.c.Read(b)
 
- }
 
- func (c *timeoutConn) Write(b []byte) (n int, err error) {
 
- 	if c.buf != nil {
 
- 		if !c.packetPending {
 
- 			c.buf.BeginPacket(packPrelogin)
 
- 			c.packetPending = true
 
- 		}
 
- 		n, err = c.buf.Write(b)
 
- 		if err != nil {
 
- 			return
 
- 		}
 
- 		return
 
- 	}
 
- 	err = c.c.SetDeadline(time.Now().Add(c.timeout))
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	return c.c.Write(b)
 
- }
 
- func (c timeoutConn) Close() error {
 
- 	return c.c.Close()
 
- }
 
- func (c timeoutConn) LocalAddr() net.Addr {
 
- 	return c.c.LocalAddr()
 
- }
 
- func (c timeoutConn) RemoteAddr() net.Addr {
 
- 	return c.c.RemoteAddr()
 
- }
 
- func (c timeoutConn) SetDeadline(t time.Time) error {
 
- 	panic("Not implemented")
 
- }
 
- func (c timeoutConn) SetReadDeadline(t time.Time) error {
 
- 	panic("Not implemented")
 
- }
 
- func (c timeoutConn) SetWriteDeadline(t time.Time) error {
 
- 	panic("Not implemented")
 
- }
 
 
  |