|
@@ -202,7 +202,12 @@ func parseSelectResult(readBuf *buffer) (*SelectResult, error) {
|
|
|
fmt.Println("--=char: ", string(char), char)
|
|
|
|
|
|
//Field_Num
|
|
|
- Field_Num := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ fn, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ Field_Num := binary.LittleEndian.Uint32(fn)
|
|
|
data.Field_Num = Field_Num
|
|
|
data.rowIdx = 0
|
|
|
fmt.Println("Field_Num: ", data.Field_Num)
|
|
@@ -213,16 +218,36 @@ func parseSelectResult(readBuf *buffer) (*SelectResult, error) {
|
|
|
field := FieldDescri{}
|
|
|
|
|
|
//Field_Name_Len
|
|
|
- field.FieldNameLen = int(binary.LittleEndian.Uint32(readBuf.readNext(4, true)))
|
|
|
+ Field_Name_Len, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ field.FieldNameLen = int(binary.LittleEndian.Uint32(Field_Name_Len))
|
|
|
fmt.Println("field.FieldNameLen: ", field.FieldNameLen)
|
|
|
+
|
|
|
//Field_Name:
|
|
|
- field.FieldName = string(readBuf.readNext(field.FieldNameLen, false))
|
|
|
+ Field_Name, err := readBuf.readNext(field.FieldNameLen, false)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ field.FieldName = string(Field_Name)
|
|
|
fmt.Println("field.Field_Name: ", field.FieldName)
|
|
|
+
|
|
|
//Field_DType:
|
|
|
- field.FieldType = fieldType(binary.LittleEndian.Uint32(readBuf.readNext(4, true)))
|
|
|
+ Field_DType, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ field.FieldType = fieldType(binary.LittleEndian.Uint32(Field_DType))
|
|
|
fmt.Println("field.FieldType: ", field.FieldType)
|
|
|
+
|
|
|
//Field_Preci_Scale:
|
|
|
- fieldPreciScale := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ Field_Preci_Scale, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ fieldPreciScale := binary.LittleEndian.Uint32(Field_Preci_Scale)
|
|
|
if int32(fieldPreciScale) <= 0 {
|
|
|
field.FieldPreciScale = fieldPreciScaleInfo{
|
|
|
scale: 0,
|
|
@@ -235,8 +260,13 @@ func parseSelectResult(readBuf *buffer) (*SelectResult, error) {
|
|
|
}
|
|
|
}
|
|
|
fmt.Println("field.FieldPreciScale: ", field.FieldPreciScale)
|
|
|
+
|
|
|
//Field_Flag:
|
|
|
- field.FieldFlag = binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ Field_Flag, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ field.FieldFlag = binary.LittleEndian.Uint32(Field_Flag)
|
|
|
fmt.Println("field.FieldFlag: ", field.FieldFlag)
|
|
|
data.Fields = append(data.Fields, field)
|
|
|
}
|
|
@@ -263,15 +293,26 @@ func parseSelectResult(readBuf *buffer) (*SelectResult, error) {
|
|
|
for {
|
|
|
col := FieldValue{}
|
|
|
//获取数据的大小
|
|
|
- col.Col_len = binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
- fmt.Println("数据大小为: ", col.Col_len)
|
|
|
+ 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
|
|
|
+ }
|
|
|
|
|
|
- col.Col_Data = readBuf.readNext(int(col.Col_len), false)
|
|
|
- fmt.Println("fieldTypeVarChar data: ", col.Col_Data, string(col.Col_Data))
|
|
|
data.Values[colIdx] = append(data.Values[colIdx], col)
|
|
|
colIdx++
|
|
|
- fmt.Println("从查询返回 解析出的值 :", col.Col_Data, string(col.Col_Data))
|
|
|
+ // if col.Col_len > 8000 {
|
|
|
+ // fmt.Println("数据为: ", col.Col_Data)
|
|
|
+ // }
|
|
|
char := readBuf.peekChar()
|
|
|
+
|
|
|
+ //fmt.Println("buf is ", readBuf.buf[readBuf.idx:])
|
|
|
//既不是R 也不是K 代表该行还有其他字段内容没有读取完成
|
|
|
if char == 'R' {
|
|
|
readBuf.idx++
|
|
@@ -306,111 +347,19 @@ func parseSelectResult(readBuf *buffer) (*SelectResult, error) {
|
|
|
|
|
|
}
|
|
|
|
|
|
-// func parseSelectResult2(readBuf *buffer) (*SelectResult, error) {
|
|
|
-
|
|
|
-// data := &SelectResult{}
|
|
|
-// char := readBuf.peekChar()
|
|
|
-// if char == 'K' {
|
|
|
-// return nil, errors.New("parseSelectResult error char is K")
|
|
|
-// }
|
|
|
-
|
|
|
-// fmt.Println("--=char: ", string(char))
|
|
|
-// //Field_Num
|
|
|
-// Field_Num := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
-// data.Field_Num = Field_Num
|
|
|
-// //data.rowIdx = 0
|
|
|
-// fmt.Println("Field_Num: ", data.Field_Num)
|
|
|
-
|
|
|
-// //获取字段信息
|
|
|
-// for i := 0; i < int(Field_Num); i++ {
|
|
|
-
|
|
|
-// field := FieldDescri{}
|
|
|
-
|
|
|
-// //Field_Name_Len
|
|
|
-// field.FieldNameLen = int(binary.LittleEndian.Uint32(readBuf.readNext(4, true)))
|
|
|
-// fmt.Println("field.FieldNameLen: ", field.FieldNameLen)
|
|
|
-// //Field_Name:
|
|
|
-// field.FieldName = string(readBuf.readNext(field.FieldNameLen, false))
|
|
|
-// fmt.Println("field.Field_Name: ", field.FieldName)
|
|
|
-// //Field_DType:
|
|
|
-// field.FieldType = fieldType(binary.LittleEndian.Uint32(readBuf.readNext(4, true)))
|
|
|
-// fmt.Println("field.FieldType: ", field.FieldType)
|
|
|
-// //Field_Preci_Scale:
|
|
|
-// fieldPreciScale := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
-// if int32(fieldPreciScale) <= 0 {
|
|
|
-// field.FieldPreciScale = fieldPreciScaleInfo{
|
|
|
-// scale: 0,
|
|
|
-// accuracy: 0,
|
|
|
-// }
|
|
|
-// } else {
|
|
|
-// field.FieldPreciScale = fieldPreciScaleInfo{
|
|
|
-// scale: uint16(fieldPreciScale >> 16),
|
|
|
-// accuracy: uint16(fieldPreciScale & 0xFFFF),
|
|
|
-// }
|
|
|
-// }
|
|
|
-// fmt.Println("field.FieldPreciScale: ", field.FieldPreciScale)
|
|
|
-// //Field_Flag:
|
|
|
-// field.FieldFlag = binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
-// fmt.Println("field.FieldFlag: ", field.FieldFlag)
|
|
|
-// data.Fields = append(data.Fields, field)
|
|
|
-// }
|
|
|
-
|
|
|
-// //获取字段的行值,并判断类型
|
|
|
-// // 使用 Peek 方法检查下一个字节是否为'R'或'K'
|
|
|
-// fmt.Println("\n\n=========开始获取行数据=================================")
|
|
|
-// defer func() {
|
|
|
-// fmt.Println("\n\n=========获取行数据结束=================================")
|
|
|
-// }()
|
|
|
-
|
|
|
-// //data.Values = make([][]FieldValue, 0)
|
|
|
-// data.Values = [][]FieldValue
|
|
|
-// colIdx := 0
|
|
|
-// char = readBuf.peekChar()
|
|
|
-// fmt.Println(" --char: ", string(char))
|
|
|
-// readBuf.idx++
|
|
|
-// if char == 'K' {
|
|
|
-// return data, nil
|
|
|
-// } else if char == 'R' {
|
|
|
-// for {
|
|
|
-// col := FieldValue{}
|
|
|
-// //获取数据的大小
|
|
|
-// col.Col_len = binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
-// fmt.Println("数据大小为: ", col.Col_len)
|
|
|
-
|
|
|
-// col.Col_Data = readBuf.readNext(int(col.Col_len), false)
|
|
|
-// fmt.Println("fieldTypeVarChar data: ", col.Col_Data, string(col.Col_Data))
|
|
|
-// data.Values[colIdx] = append(data.Values[colIdx], col)
|
|
|
-// colIdx++
|
|
|
-// fmt.Println("从查询返回 解析出的值 :", col.Col_Data, string(col.Col_Data))
|
|
|
-
|
|
|
-// char := readBuf.peekChar()
|
|
|
-// //next for
|
|
|
-// if char == 'R' {
|
|
|
-// readBuf.idx++
|
|
|
-// continue
|
|
|
-
|
|
|
-// //end parse
|
|
|
-// } else if char == 'K' {
|
|
|
-// return data, nil
|
|
|
-
|
|
|
-// }
|
|
|
-// //swich end
|
|
|
-// fmt.Println("循环结束")
|
|
|
-// fmt.Printf("解析请求 data:%#v\n", data.Fields)
|
|
|
-// return data, nil
|
|
|
-// } //for end
|
|
|
-// } else {
|
|
|
-// return data, errors.New("select parse error")
|
|
|
-// }
|
|
|
-
|
|
|
-// }
|
|
|
-
|
|
|
func parseInsertResult(readBuf *buffer) (*InsertResult, error) {
|
|
|
|
|
|
//Rowid_Len
|
|
|
- Rowid_Len := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ Rowid_L, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ Rowid_Len := binary.LittleEndian.Uint32(Rowid_L)
|
|
|
//Rowid_Data
|
|
|
- encoded := readBuf.readNext(int(Rowid_Len), false)
|
|
|
+ encoded, err := readBuf.readNext(int(Rowid_Len), false)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
|
|
|
//检测是否结束
|
|
|
char := readBuf.peekChar()
|
|
@@ -425,34 +374,67 @@ func parseInsertResult(readBuf *buffer) (*InsertResult, error) {
|
|
|
}
|
|
|
|
|
|
func parseUpdateResult(readBuf *buffer) (*UpdateResult, error) {
|
|
|
- updateNum := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ updatas, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ updateNum := binary.LittleEndian.Uint32(updatas)
|
|
|
|
|
|
return &UpdateResult{UpdateNum: updateNum}, nil
|
|
|
}
|
|
|
|
|
|
func parseDeleteResult(readBuf *buffer) (*DeleteResult, error) {
|
|
|
- deleteNum := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ deletes, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ deleteNum := binary.LittleEndian.Uint32(deletes)
|
|
|
|
|
|
return &DeleteResult{DeleteNum: deleteNum}, nil
|
|
|
}
|
|
|
|
|
|
func parseProcRet(readBuf *buffer) (*ProcRet, error) {
|
|
|
- retDType := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
-
|
|
|
- retDataLen := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
- retData := readBuf.readNext(int(retDataLen), false)
|
|
|
+ retDypes, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ retDType := binary.LittleEndian.Uint32(retDypes)
|
|
|
+ retDataLens, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ retDataLen := binary.LittleEndian.Uint32(retDataLens)
|
|
|
+ retData, err := readBuf.readNext(int(retDataLen), false)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
|
|
|
return &ProcRet{RetDType: retDType, RetDataLen: retDataLen, RetData: retData}, nil
|
|
|
}
|
|
|
|
|
|
func parseOutParamRet(readBuf *buffer) (*OutParamRet, error) {
|
|
|
- outParamNo := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ outParamNos, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ outParamNo := binary.LittleEndian.Uint32(outParamNos)
|
|
|
|
|
|
- outParamDType := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ outParamDTypes, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ outParamDType := binary.LittleEndian.Uint32(outParamDTypes)
|
|
|
|
|
|
- outParamLen := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ outParamLens, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ outParamLen := binary.LittleEndian.Uint32(outParamLens)
|
|
|
|
|
|
- outParamData := readBuf.readNext(int(outParamLen), false)
|
|
|
+ outParamData, err := readBuf.readNext(int(outParamLen), false)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
|
|
|
return &OutParamRet{
|
|
|
OutParamNo: outParamNo,
|
|
@@ -463,47 +445,89 @@ func parseOutParamRet(readBuf *buffer) (*OutParamRet, error) {
|
|
|
}
|
|
|
|
|
|
func parseErrInfo(readBuf *buffer) (*ErrInfo, error) {
|
|
|
- errStrLen := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
-
|
|
|
- errStr := readBuf.readNext(int(errStrLen), false)
|
|
|
+ errStrLens, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ errStrLen := binary.LittleEndian.Uint32(errStrLens)
|
|
|
|
|
|
+ errStr, err := readBuf.readNext(int(errStrLen), false)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
return &ErrInfo{ErrStrLen: errStrLen, ErrStr: errStr}, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
func parseWarnInfo(readBuf *buffer) (*WarnInfo, error) {
|
|
|
- warnStrLen := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
-
|
|
|
- warnStr := readBuf.readNext(int(warnStrLen), false)
|
|
|
+ warnStrLens, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ warnStrLen := binary.LittleEndian.Uint32(warnStrLens)
|
|
|
|
|
|
+ warnStr, err := readBuf.readNext(int(warnStrLen), false)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
return &WarnInfo{WarnStrLen: warnStrLen, WarnStr: warnStr}, nil
|
|
|
}
|
|
|
|
|
|
func parseMessage(readBuf *buffer) (*Message, error) {
|
|
|
- msgStrLen := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ msgStrLens, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ msgStrLen := binary.LittleEndian.Uint32(msgStrLens)
|
|
|
|
|
|
- msgStr := readBuf.readNext(int(msgStrLen), false)
|
|
|
+ msgStr, err := readBuf.readNext(int(msgStrLen), false)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
|
|
|
return &Message{MsgStrLen: msgStrLen, MsgStr: msgStr}, nil
|
|
|
}
|
|
|
|
|
|
func parseFormArgDescri(readBuf *buffer) (*FormArgDescri, error) {
|
|
|
// FormArgDescri: '$' Arg_Num { Arg_Name_Len Arg_Name Arg_No Arg_DType Arg_Preci_Scale }+
|
|
|
- Arg_Num := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ Arg_Nums, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ Arg_Num := binary.LittleEndian.Uint32(Arg_Nums)
|
|
|
formArgDescri := &FormArgDescri{ArgNum: Arg_Num}
|
|
|
fmt.Println("-- parseFormArgDescri Arg_Num:", Arg_Num)
|
|
|
for i := 0; i < int(Arg_Num); i++ {
|
|
|
arg := ArgDescri{}
|
|
|
//Arg_Name_Len
|
|
|
- arg.ArgNameLen = binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ ArgNameLen, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ arg.ArgNameLen = binary.LittleEndian.Uint32(ArgNameLen)
|
|
|
//Arg_Name
|
|
|
- arg.ArgName = readBuf.readNext(int(arg.ArgNameLen), false)
|
|
|
+ arg.ArgName, err = readBuf.readNext(int(arg.ArgNameLen), false)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
//Arg_No
|
|
|
- arg.ArgNo = binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ ArgNo, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ arg.ArgNo = binary.LittleEndian.Uint32(ArgNo)
|
|
|
//Argg_DType
|
|
|
- arg.ArgDType = binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ ArgDType, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ arg.ArgDType = binary.LittleEndian.Uint32(ArgDType)
|
|
|
//Arg_Preci_Scale
|
|
|
- arg.ArgPreciScale = binary.LittleEndian.Uint32(readBuf.readNext(4, true))
|
|
|
+ ArgPreciScale, err := readBuf.readNext(4, true)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ arg.ArgPreciScale = binary.LittleEndian.Uint32(ArgPreciScale)
|
|
|
formArgDescri.Args = append(formArgDescri.Args, arg)
|
|
|
}
|
|
|
fmt.Printf("formArgDescri %#v \n", formArgDescri)
|