Browse Source

feat: 添加多结果集

GTong 7 months ago
parent
commit
94d127c7b3

+ 0 - 0
xugu/xugu_buffer.go → xugu/xugu/xugu_buffer.go


+ 1 - 0
xugu/xugu_conn.go → xugu/xugu/xugu_conn.go

@@ -125,6 +125,7 @@ func (xgConn *xuguConn) Query(sql string,
 
 		rows := &xuguRows{
 			rows_conn: xgConn,
+			aR:        aR,
 			results:   aR.s,
 			colIdx:    0,
 			prepared:  false,

+ 0 - 0
xugu/xugu_connector.go → xugu/xugu/xugu_connector.go


+ 0 - 0
xugu/xugu_define.go → xugu/xugu/xugu_define.go


+ 0 - 0
xugu/xugu_driver.go → xugu/xugu/xugu_driver.go


+ 0 - 0
xugu/xugu_fields.go → xugu/xugu/xugu_fields.go


+ 12 - 11
xugu/xugu_model.go → xugu/xugu/xugu_model.go

@@ -68,15 +68,16 @@ type ArgDescri struct {
 }
 
 type allResult struct {
-	rt msgType
-	s  *SelectResult
-	i  *InsertResult
-	u  *UpdateResult
-	d  *DeleteResult
-	p  *ProcRet
-	o  *OutParamRet
-	e  *ErrInfo
-	w  *WarnInfo
-	m  *Message
-	f  *FormArgDescri
+	rt   msgType
+	s    *SelectResult
+	i    *InsertResult
+	u    *UpdateResult
+	d    *DeleteResult
+	p    *ProcRet
+	o    *OutParamRet
+	e    *ErrInfo
+	w    *WarnInfo
+	m    *Message
+	f    *FormArgDescri
+	next *allResult
 }

+ 50 - 50
xugu/xugu_parse.go → xugu/xugu/xugu_parse.go

@@ -110,14 +110,24 @@ func assertParamType(dV driver.Value, values *[]xuguValue) error {
 
 func parseMsg(readBuf *buffer, pConn *xuguConn) (*allResult, error) {
 	var err error
-	aR := allResult{}
+	i := 0
+	//aR := allResult{}
+	aRPoint := &allResult{}
+	aR := aRPoint
 	for {
 		char := readBuf.peekChar()
+		if i != 0 {
+			re := &allResult{}
+			aR.next = re
+			aR = re
+		}
+		i++
 		switch char {
 
 		case 'K':
 			readBuf.reset()
-			return &aR, nil
+			fmt.Printf("这他妈的 %#v \n 他们2222  %#v \n", aRPoint.s, aRPoint.next)
+			return aRPoint, nil
 
 		case '$':
 			readBuf.idx++
@@ -193,7 +203,7 @@ func parseMsg(readBuf *buffer, pConn *xuguConn) (*allResult, error) {
 func parseSelectResult(readBuf *buffer) (*SelectResult, error) {
 	data := &SelectResult{}
 
-	char := readBuf.peekChar()
+	var char byte
 
 	//Field_Num
 	fn, err := readBuf.readNext(4, true)
@@ -223,7 +233,7 @@ func parseSelectResult(readBuf *buffer) (*SelectResult, error) {
 			return nil, err
 		}
 		parts := strings.Split(string(Field_Name), ".")
-		field.FieldName =  parts[len(parts)-1]
+		field.FieldName = parts[len(parts)-1]
 
 		//Field_DType:
 		Field_DType, err := readBuf.readNext(4, true)
@@ -264,65 +274,55 @@ func parseSelectResult(readBuf *buffer) (*SelectResult, error) {
 
 	//获取字段的行值,并判断类型
 	// 使用 Peek 方法检查下一个字节是否为'R'或'K'
+	for {
+		char = readBuf.peekChar()
+		//readBuf.idx++
+		if char == 'K' {
+			return data, nil
+		} else if char == 'R' { //接收字段信息后不是k 那一定是 R
+			fmt.Println("读取字段值")
 
-	char = readBuf.peekChar()
-	//readBuf.idx++
-	if char == 'K' {
-		return data, nil
-	} else if char == 'R' {
-		colIdx := 0
-		//typeIdx := 0
-		readBuf.idx++
-		for {
-			col := FieldValue{}
-			//获取数据的大小
-			Col_len, err := readBuf.readNext(4, true)
-			if err != nil {
-				return nil, err
-			}
-			col.Col_len = binary.LittleEndian.Uint32(Col_len)
-
-			//获取数据的值
-			col.Col_Data, err = readBuf.readNext(int(col.Col_len), false)
+			colIdx := 0
+			//typeIdx := 0
+			readBuf.idx++
+			for i := 0; i < int(Field_Num); i++ {
+				col := FieldValue{}
+				//获取数据的大小
+				Col_len, err := readBuf.readNext(4, true)
+				if err != nil {
+					return nil, err
+				}
+				col.Col_len = binary.LittleEndian.Uint32(Col_len)
+
+				//获取数据的值
+				col.Col_Data, err = readBuf.readNext(int(col.Col_len), false)
+				if err != nil {
+					return nil, err
+				}
+
+				data.Values[colIdx] = append(data.Values[colIdx], col)
+				colIdx++
+
+			} //for end
+
+		} else if char == '$' {
+			fad, err := parseFormArgDescri(readBuf)
 			if err != nil {
 				return nil, err
 			}
 
-			data.Values[colIdx] = append(data.Values[colIdx], col)
-			colIdx++
-
 			char := readBuf.peekChar()
-
 			//既不是R 也不是K 代表该行还有其他字段内容没有读取完成
-			if char == 'R' {
-				readBuf.idx++
-				colIdx = 0
-				continue
-			} else if char == 'K' {
-
+			if char == 'K' {
+				data.fad = fad
 				return data, nil
 				//break
 			}
 
-		} //for end
-
-	} else if char == '$' {
-		fad, err := parseFormArgDescri(readBuf)
-		if err != nil {
-			return nil, err
-		}
-
-		char := readBuf.peekChar()
-		//既不是R 也不是K 代表该行还有其他字段内容没有读取完成
-		if char == 'K' {
-			data.fad = fad
+			return nil, errors.New("select to $ 解析失败")
+		} else {
 			return data, nil
-			//break
 		}
-
-		return nil, errors.New("select to $ 解析失败")
-	} else {
-		return nil, errors.New("解析失败")
 	}
 
 }

+ 0 - 0
xugu/xugu_parse_time.go → xugu/xugu/xugu_parse_time.go


+ 4 - 4
xugu/xugu_result.go → xugu/xugu/xugu_result.go

@@ -16,13 +16,13 @@ type xuguResult struct {
 // "auto increment" column when inserting a new row. Not all
 // databases support this feature, and the syntax of such
 // statements varies.
-func (self *xuguResult) LastInsertId() (int64, error) {
-	return self.insertId, nil
+func (result *xuguResult) LastInsertId() (int64, error) {
+	return result.insertId, nil
 }
 
 // RowsAffected returns the number of rows affected by an
 // update, insert, or delete. Not every database or database
 // driver may support this.
-func (self *xuguResult) RowsAffected() (int64, error) {
-	return self.affectedRows, nil
+func (result *xuguResult) RowsAffected() (int64, error) {
+	return result.affectedRows, nil
 }

+ 39 - 5
xugu/xugu_rows.go → xugu/xugu/xugu_rows.go

@@ -3,6 +3,7 @@ package xugu
 import (
 	"database/sql/driver"
 	"encoding/binary"
+	"fmt"
 	"io"
 	"math"
 	"reflect"
@@ -11,10 +12,10 @@ import (
 
 type xuguRows struct {
 	rows_conn *xuguConn
-
-	results  *SelectResult
-	colIdx   int
-	prepared bool
+	aR        *allResult
+	results   *SelectResult
+	colIdx    int
+	prepared  bool
 }
 
 func (row *xuguRows) Next(dest []driver.Value) error {
@@ -160,6 +161,39 @@ func (row *xuguRows) ColumnTypeScanType(index int) reflect.Type {
 	return row.results.Fields[index].scanType()
 }
 
-func (self *xuguRows) Close() error {
+// The driver is at the end of the current result set.
+// Test to see if there is another result set after the current one.
+// Only close Rows if there is no further result sets to read.
+func (row *xuguRows) HasNextResultSet() bool {
+	return row.aR.next != nil
+
+}
+
+// NextResultSet prepares the next result set for reading. It reports whether
+// there is further result sets, or false if there is no further result set
+// or if there is an error advancing to it. The Err method should be consulted
+// to distinguish between the two cases.
+//
+// After calling NextResultSet, the Next method should always be called before
+// scanning. If there are further result sets they may not have rows in the result
+// set.
+func (row *xuguRows) NextResultSet() error {
+	fmt.Println("NextResultSet")
+	if row.aR.next == nil {
+		return fmt.Errorf("there are no multiple result sets available")
+	}
+	switch row.aR.next.rt {
+	case errInfo:
+		return fmt.Errorf("error: %s", string(row.aR.next.e.ErrStr))
+
+	}
+
+	row.results = row.aR.next.s
+	row.aR = row.aR.next
+
+	return nil
+}
+
+func (row *xuguRows) Close() error {
 	return nil
 }

+ 0 - 0
xugu/xugu_sock.go → xugu/xugu/xugu_sock.go


+ 0 - 0
xugu/xugu_stmt.go → xugu/xugu/xugu_stmt.go


+ 0 - 0
xugu/xugu_tranx.go → xugu/xugu/xugu_tranx.go


+ 3 - 3
xugu/xugu_utils.go → xugu/xugu/xugu_utils.go

@@ -147,9 +147,9 @@ func switchSQLType(sql string) int {
 	// 根据SQL语句前缀判断类型
 	switch {
 	case strings.HasPrefix(kstr, "SELECT"):
-		if strings.Contains(sql, ";") && len(sql[strings.Index(sql, ";"):]) > 5 {
-			return SQL_OTHER // 多结果集
-		}
+		// if strings.Contains(sql, ";") && len(sql[strings.Index(sql, ";"):]) > 5 {
+		// 	return SQL_OTHER // 多结果集
+		// }
 		return SQL_SELECT
 	case strings.HasPrefix(kstr, "INSERT"):
 		return SQL_INSERT