Browse Source

fix: 修复查询返回消息,在结果集没有实际字段数据时,buf下标索引++导致越过K信息

GTong 9 months ago
parent
commit
82437b97fc
5 changed files with 8 additions and 6 deletions
  1. 1 0
      .gitignore
  2. 1 1
      xugu/xugu_buffer.go
  3. 1 1
      xugu/xugu_conn.go
  4. 2 2
      xugu/xugu_parse.go
  5. 3 2
      xugu/xugu_sock.go

+ 1 - 0
.gitignore

@@ -6,3 +6,4 @@ xugu_zhushi/
 2000w.go
 协议.ini
 .vscode/
+xugu_bak/

+ 1 - 1
xugu/xugu_buffer.go

@@ -27,7 +27,7 @@ func newBuffer(nc net.Conn) buffer {
 }
 
 func (b *buffer) peekChar() byte {
-	if b.idx >= int64(len(b.buf[b.idx:b.length])) {
+	if b.idx > int64(len(b.buf[b.idx:b.length])) {
 		b.readNext(1, false)
 		b.idx-- //peekchar 只查看当前字符,不移动指针,但是readNext会移动指针,所以需要-1
 	}

+ 1 - 1
xugu/xugu_conn.go

@@ -119,7 +119,7 @@ func (xgConn *xuguConn) Query(sql string,
 	if err != nil {
 		return nil, err
 	}
-
+	fmt.Println("驱动接收消息:", aR)
 	switch aR.rt {
 	case selectResult:
 

+ 2 - 2
xugu/xugu_parse.go

@@ -266,13 +266,13 @@ func parseSelectResult(readBuf *buffer) (*SelectResult, error) {
 	// 使用 Peek 方法检查下一个字节是否为'R'或'K'
 
 	char = readBuf.peekChar()
-	readBuf.idx++
+	//readBuf.idx++
 	if char == 'K' {
 		return data, nil
 	} else if char == 'R' {
 		colIdx := 0
 		//typeIdx := 0
-
+		readBuf.idx++
 		for {
 			col := FieldValue{}
 			//获取数据的大小

+ 3 - 2
xugu/xugu_sock.go

@@ -5,6 +5,7 @@ import (
 	"context"
 	"encoding/binary"
 	"errors"
+	"fmt"
 )
 
 func xgSockOpenConn(ctx context.Context, pConn *xuguConn) error {
@@ -20,7 +21,7 @@ func xgSockOpenConn(ctx context.Context, pConn *xuguConn) error {
 	buffer := make([]byte, 1)
 	n, err := pConn.conn.Read(buffer)
 	if err != nil {
-		return errors.New("接收数据库连接失败:")
+		return errors.New(fmt.Sprintln("接收数据库连接失败: ", err.Error()))
 	}
 
 	if !bytes.Equal(buffer[:n], []byte("K")) {
@@ -121,7 +122,7 @@ func xuguSockRecvMsg(pConn *xuguConn) (*allResult, error) {
 	pConn.readBuff.length += n
 	rs, err := parseMsg(&pConn.readBuff, pConn)
 	if err != nil {
-		pConn.readBuff.reset()
+
 		return nil, err
 	}
 	pConn.readBuff.reset()