xugu_parse.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. package xugu
  2. import (
  3. "database/sql/driver"
  4. "encoding/binary"
  5. "errors"
  6. "fmt"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. // 辅助结构体
  12. type xuguValue struct {
  13. // 布尔值,如果值为 true,表示当前字段的数据类型是大对象数据类型
  14. islob bool
  15. //字段名
  16. paramName []byte
  17. //paramNameLength [2]byte
  18. // 字段的实际值
  19. value []byte
  20. // 值的长度
  21. valueLength int
  22. // 字段的类型
  23. types fieldType
  24. }
  25. type xuguParse struct {
  26. // bind_type 用于标识参数绑定的类型。
  27. // 参数绑定类型包括按参数名称绑定和按参数占位符绑定
  28. bind_type int
  29. // param_count 用于指定在 SQL 语句中需要绑定的参数数量
  30. param_count int
  31. // 当参数绑定类型为按参数名称绑定时,param_names 是参数名称的集合
  32. param_names []byte
  33. values []xuguValue
  34. // 当参数绑定类型为按参数占位符绑定时,position 标识参数的位置
  35. //position int
  36. }
  37. // 判断参数个数
  38. func (Parse *xuguParse) assertParamCount(query string) int {
  39. fmt.Println("----assertParamCount func 判断参数个数")
  40. if Parse.bind_type == 0 {
  41. Parse.bind_type = Parse.assertBindType(query)
  42. }
  43. switch Parse.bind_type {
  44. case BIND_PARAM_BY_POS:
  45. Parse.param_count = strings.Count(query, "?")
  46. fmt.Println("Parse.param_count ", Parse.param_count)
  47. case BIND_PARAM_BY_NAME:
  48. Parse.param_count = 0
  49. pos := 0
  50. phead := -1
  51. for {
  52. pos = strings.IndexByte(query[phead+1:], ':')
  53. if pos == -1 {
  54. break
  55. }
  56. pos += phead + 1
  57. tmp := pos
  58. for tmp > phead {
  59. tmp--
  60. if query[tmp] == ' ' {
  61. continue
  62. }
  63. if query[tmp] == ',' || query[tmp] == '(' {
  64. Parse.param_count++
  65. }
  66. break
  67. }
  68. phead = pos
  69. }
  70. }
  71. return Parse.param_count
  72. }
  73. // 判断绑定类型 ? 或者 :name
  74. func (Parse *xuguParse) assertBindType(query string) int {
  75. fmt.Println("--assertBindType")
  76. Parse.bind_type = strings.IndexByte(query, '?')
  77. fmt.Println("Parse.bind_type", Parse.bind_type)
  78. if Parse.bind_type != -1 {
  79. Parse.bind_type = BIND_PARAM_BY_POS
  80. return BIND_PARAM_BY_POS
  81. }
  82. Parse.bind_type = BIND_PARAM_BY_NAME
  83. return BIND_PARAM_BY_NAME
  84. }
  85. // 判断参数变量类型
  86. func (param *xuguParse) assertParamType(dV driver.Value, pos int) error {
  87. fmt.Println("-----(param *xuguParse) assertParamType 判断参数类型")
  88. var dest xuguValue
  89. switch dV.(type) {
  90. case int64:
  91. srcv, ok := dV.(int64)
  92. if !ok {
  93. return errors.New("assertParamType int64 error")
  94. }
  95. S := strconv.FormatInt(srcv, 10)
  96. dest.value = []byte(S)
  97. dest.valueLength = strings.Count(S, "") - 1
  98. dest.islob = false
  99. dest.types = fieldType_I8
  100. case float32:
  101. srcv, ok := dV.(float64)
  102. if !ok {
  103. return errors.New("assertParamType float32 error")
  104. }
  105. S := strconv.FormatFloat(srcv, 'f', 6, 64)
  106. dest.value = []byte(S)
  107. dest.valueLength = strings.Count(S, "") - 1
  108. dest.islob = false
  109. dest.types = fieldType_R4
  110. case float64:
  111. srcv, ok := dV.(float64)
  112. if !ok {
  113. return errors.New("assertParamType float64 error")
  114. }
  115. S := strconv.FormatFloat(srcv, 'f', 15, 64)
  116. dest.value = []byte(S)
  117. dest.valueLength = strings.Count(S, "") - 1
  118. dest.islob = false
  119. dest.types = fieldType_R8
  120. case bool:
  121. srcv, ok := dV.(bool)
  122. if !ok {
  123. return errors.New("assertParamType bool error")
  124. }
  125. S := strconv.FormatBool(srcv)
  126. dest.value = []byte(S)
  127. dest.valueLength = strings.Count(S, "") - 1
  128. dest.islob = false
  129. dest.types = fieldType_BOOL
  130. case string:
  131. S, ok := dV.(string)
  132. if !ok {
  133. return errors.New("assertParamType string error")
  134. }
  135. fmt.Println("是string")
  136. dest.value = []byte(S)
  137. dest.valueLength = strings.Count(S, "") - 1
  138. dest.islob = false
  139. dest.types = fieldType_CHAR
  140. fmt.Printf("是string类型: %#v\n", dest)
  141. case time.Time:
  142. srcv, ok := dV.(time.Time)
  143. if !ok {
  144. return errors.New("assertParamType time error")
  145. }
  146. tm := fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d",
  147. srcv.Year(), int(srcv.Month()), srcv.Day(),
  148. srcv.Hour(), srcv.Minute(), srcv.Second())
  149. dest.value = []byte(tm)
  150. dest.valueLength = strings.Count(tm, "") - 1
  151. dest.islob = false
  152. dest.types = fieldType_TIME
  153. case []byte:
  154. srcv, ok := dV.([]byte)
  155. if !ok {
  156. return errors.New("assertParamType []byte error")
  157. }
  158. dest.value = srcv
  159. dest.valueLength = len(srcv)
  160. dest.islob = true
  161. dest.types = fieldType_BLOB
  162. fmt.Println("-----判断参数类型为 byte[]")
  163. case nil:
  164. dest.value = []byte("xugusql")
  165. dest.valueLength = 0
  166. dest.islob = false
  167. dest.types = fieldType_CHAR
  168. default:
  169. /* OTHER DATA TYPE */
  170. return errors.New("Unknown data type")
  171. }
  172. param.values = append(param.values, dest)
  173. return nil
  174. }
  175. // 判断参数名
  176. func (param *xuguParse) assertParamName(query string) error {
  177. fmt.Println("----(param *xuguParse) assertParamName 判断参数名")
  178. if param.param_count <= 0 {
  179. param.assertParamCount(query)
  180. }
  181. pos := 0
  182. phead := -1
  183. for {
  184. pos = strings.IndexByte(query[phead+1:], ':')
  185. if pos == -1 {
  186. break
  187. }
  188. pos += phead + 1
  189. tmp := pos
  190. for tmp > phead {
  191. tmp--
  192. if query[tmp] == ' ' {
  193. continue
  194. }
  195. // Parse parameter positions bound by parameter name
  196. if query[tmp] == ',' || query[tmp] == '(' {
  197. parg := pos
  198. for true {
  199. parg++
  200. if query[parg] == ',' || query[parg] == ')' || query[parg] == ' ' {
  201. param.param_names = append(param.param_names, query[pos+1:parg]...)
  202. break
  203. }
  204. }
  205. }
  206. break
  207. }
  208. phead = pos
  209. }
  210. fmt.Printf("param: %#v", param)
  211. fmt.Printf("param: %#v", query)
  212. fmt.Println("----(param *xuguParse) assertParamName 判断参数名结束")
  213. return nil
  214. }
  215. func (param *xuguParse) bindParamByPos(query string) string {
  216. fmt.Println("----(param *xuguParse) bindParamByPos ")
  217. fmt.Printf("param: %#v \n", param)
  218. for i := 0; i < param.param_count; i++ {
  219. //sql语句里替换夫的下标, 替换为
  220. query = strings.Replace(query, "?", string(param.values[i].value), 1)
  221. }
  222. return query
  223. }
  224. type SelectResult struct {
  225. Field_Num uint32
  226. Fields []FieldDescri
  227. Values [][]ValueData //[字段][字段所有值]
  228. rowIdx int
  229. }
  230. type FieldDescri struct {
  231. FieldNameLen int
  232. FieldName string
  233. FieldType fieldType
  234. FieldPreciScale int
  235. FieldFlag int
  236. }
  237. type ValueData struct {
  238. Col_len uint32
  239. Col_Data []byte
  240. }
  241. type InsertResult struct {
  242. RowidLen uint32
  243. RowidData []byte
  244. }
  245. type UpdateResult struct {
  246. UpdateNum uint32
  247. }
  248. type DeleteResult struct {
  249. DeleteNum uint32
  250. }
  251. type ProcRet struct {
  252. RetDType uint32
  253. RetDataLen uint32
  254. RetData []byte
  255. }
  256. type OutParamRet struct {
  257. OutParamNo uint32
  258. OutParamDType uint32
  259. OutParamLen uint32
  260. OutParamData []byte
  261. }
  262. type ErrInfo struct {
  263. ErrStrLen uint32
  264. ErrStr []byte
  265. }
  266. type WarnInfo struct {
  267. WarnStrLen uint32
  268. WarnStr []byte
  269. }
  270. type Message struct {
  271. MsgStrLen uint32
  272. MsgStr []byte
  273. }
  274. type FormArgDescri struct {
  275. ArgNum uint32
  276. Args []ArgDescri
  277. }
  278. type ArgDescri struct {
  279. ArgNameLen uint32
  280. ArgName []byte
  281. ArgNo uint32
  282. ArgDType uint32
  283. ArgPreciScale uint32
  284. }
  285. type allResult struct {
  286. rt msgType
  287. s *SelectResult
  288. i *InsertResult
  289. u *UpdateResult
  290. d *DeleteResult
  291. p *ProcRet
  292. o *OutParamRet
  293. e *ErrInfo
  294. w *WarnInfo
  295. m *Message
  296. f *FormArgDescri
  297. }
  298. func parseSelectResult(readBuf *buffer) (*SelectResult, error) {
  299. fmt.Println("调用 parseSelectResult")
  300. data := &SelectResult{}
  301. char := readBuf.peekChar()
  302. fmt.Println("--=char: ", string(char))
  303. switch char {
  304. case 'A':
  305. readBuf.idx++
  306. //Field_Num
  307. Field_Num := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  308. data.Field_Num = Field_Num
  309. data.rowIdx = 0
  310. fmt.Println("Field_Num: ", data.Field_Num)
  311. //获取字段信息
  312. for i := 0; i < int(Field_Num); i++ {
  313. field := FieldDescri{}
  314. //Field_Name_Len
  315. field.FieldNameLen = int(binary.LittleEndian.Uint32(readBuf.readNext(4, true)))
  316. fmt.Println("field.FieldNameLen: ", field.FieldNameLen)
  317. //Field_Name:
  318. field.FieldName = string(readBuf.readNext(field.FieldNameLen, false))
  319. fmt.Println("field.Field_Name: ", field.FieldName)
  320. //Field_DType:
  321. field.FieldType = fieldType(binary.LittleEndian.Uint32(readBuf.readNext(4, true)))
  322. fmt.Println("field.FieldType: ", field.FieldType)
  323. //Field_Preci_Scale:
  324. field.FieldPreciScale = int(binary.LittleEndian.Uint32(readBuf.readNext(4, true)))
  325. fmt.Println("field.FieldPreciScale: ", field.FieldPreciScale)
  326. //Field_Flag:
  327. field.FieldFlag = int(binary.LittleEndian.Uint32(readBuf.readNext(4, true)))
  328. fmt.Println("field.FieldFlag: ", field.FieldFlag)
  329. data.Fields = append(data.Fields, field)
  330. }
  331. data.Values = make([][]ValueData, data.Field_Num)
  332. //获取字段的行值,并判断类型
  333. // 使用 Peek 方法检查下一个字节是否为'R'或'K'
  334. fmt.Println("\n\n=========开始获取行数据=================================")
  335. defer func() {
  336. fmt.Println("\n\n=========获取行数据结束=================================")
  337. }()
  338. char := readBuf.peekChar()
  339. fmt.Println(" --char: ", string(char))
  340. readBuf.idx++
  341. if char == 'K' {
  342. break
  343. } else if char == 'R' {
  344. colIdx := 0
  345. typeIdx := 0
  346. fmt.Println("开始循环 ")
  347. for {
  348. col := ValueData{}
  349. //获取数据的大小
  350. col.Col_len = binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  351. fmt.Println("数据大小为: ", col.Col_len)
  352. //获取数据
  353. //判断类型
  354. fmt.Println("查看类型", data.Fields[typeIdx].FieldType)
  355. switch data.Fields[typeIdx].FieldType {
  356. case fieldType_CHAR, fieldType_NCHAR:
  357. col.Col_Data = readBuf.readNext(int(col.Col_len), false)
  358. fmt.Println("fieldTypeVarChar data: ", col.Col_Data, string(col.Col_Data))
  359. data.Values[colIdx] = append(data.Values[colIdx], col)
  360. colIdx++
  361. fmt.Println("从查询返回 解析出的值 :", col.Col_Data, string(col.Col_Data))
  362. char := readBuf.peekChar()
  363. if char == 'R' {
  364. readBuf.idx++
  365. colIdx = 0
  366. if typeIdx >= int(data.Field_Num)-1 {
  367. typeIdx = 0
  368. } else {
  369. typeIdx++
  370. }
  371. continue
  372. } else if char == 'K' {
  373. return data, nil
  374. //break
  375. }
  376. typeIdx++
  377. //fieldTypeTinyint,
  378. case fieldType_I1, fieldType_I2, fieldType_I4, fieldType_I8, fieldType_R4, fieldType_R8,
  379. fieldType_DATE, fieldType_TIME, fieldType_DATETIME,
  380. fieldType_TIME_TZ:
  381. col.Col_Data = reverseBytes(readBuf.readNext(int(col.Col_len), false))
  382. data.Values[colIdx] = append(data.Values[colIdx], col)
  383. colIdx++
  384. char := readBuf.peekChar()
  385. fmt.Println("从查询返回 解析出的值 :", col.Col_Data, string(col.Col_Data))
  386. if char == 'R' {
  387. readBuf.idx++
  388. colIdx = 0
  389. if typeIdx >= int(data.Field_Num)-1 {
  390. fmt.Println("typeIdx <= int(data.Field_Num)-1: ", typeIdx, int(data.Field_Num)-1)
  391. typeIdx = 0
  392. } else {
  393. typeIdx++
  394. }
  395. continue
  396. } else if char == 'K' {
  397. return data, nil
  398. //break
  399. }
  400. typeIdx++
  401. case fieldType_CLOB, fieldType_BLOB, fieldType_BINARY:
  402. col.Col_Data = readBuf.readNext(int(col.Col_len), false)
  403. data.Values[colIdx] = append(data.Values[colIdx], col)
  404. colIdx++
  405. char := readBuf.peekChar()
  406. fmt.Println("从查询返回 解析出的值 :", col.Col_Data, string(col.Col_Data))
  407. if char == 'R' {
  408. readBuf.idx++
  409. colIdx = 0
  410. if typeIdx >= int(data.Field_Num)-1 {
  411. fmt.Println("typeIdx <= int(data.Field_Num)-1: ", typeIdx, int(data.Field_Num)-1)
  412. typeIdx = 0
  413. } else {
  414. typeIdx++
  415. }
  416. continue
  417. } else if char == 'K' {
  418. return data, nil
  419. //break
  420. }
  421. } //swich end
  422. fmt.Println("循环结束")
  423. fmt.Printf("解析请求 data:%#v\n", data.Fields)
  424. return data, nil
  425. } //for end
  426. } else {
  427. break
  428. }
  429. default:
  430. fmt.Println("解析请求 错误", data.Fields)
  431. return nil, errors.New("parseQueryResult error")
  432. } //swich end
  433. fmt.Println("解析请求 data", data.Fields)
  434. return data, nil
  435. }
  436. func parseInsertResult(readBuf *buffer) (*InsertResult, error) {
  437. //Rowid_Len
  438. Rowid_Len := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  439. //Rowid_Data
  440. encoded := readBuf.readNext(int(Rowid_Len), false)
  441. //检测是否结束
  442. char := readBuf.peekChar()
  443. if char == 'K' {
  444. return &InsertResult{
  445. RowidLen: Rowid_Len,
  446. RowidData: encoded,
  447. }, nil
  448. }
  449. return nil, errors.New("parseInsertResult error")
  450. }
  451. func parseUpdateResult(readBuf *buffer) (*UpdateResult, error) {
  452. updateNum := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  453. return &UpdateResult{UpdateNum: updateNum}, nil
  454. }
  455. func parseDeleteResult(readBuf *buffer) (*DeleteResult, error) {
  456. deleteNum := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  457. return &DeleteResult{DeleteNum: deleteNum}, nil
  458. }
  459. func parseProcRet(readBuf *buffer) (*ProcRet, error) {
  460. retDType := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  461. retDataLen := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  462. retData := readBuf.readNext(int(retDataLen), false)
  463. return &ProcRet{RetDType: retDType, RetDataLen: retDataLen, RetData: retData}, nil
  464. }
  465. func parseOutParamRet(readBuf *buffer) (*OutParamRet, error) {
  466. outParamNo := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  467. outParamDType := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  468. outParamLen := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  469. outParamData := readBuf.readNext(int(outParamLen), false)
  470. return &OutParamRet{
  471. OutParamNo: outParamNo,
  472. OutParamDType: outParamDType,
  473. OutParamLen: outParamLen,
  474. OutParamData: outParamData,
  475. }, nil
  476. }
  477. func parseErrInfo(readBuf *buffer) (*ErrInfo, error) {
  478. errStrLen := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  479. errStr := readBuf.readNext(int(errStrLen), false)
  480. return &ErrInfo{ErrStrLen: errStrLen, ErrStr: errStr}, nil
  481. }
  482. func parseWarnInfo(readBuf *buffer) (*WarnInfo, error) {
  483. warnStrLen := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  484. warnStr := readBuf.readNext(int(warnStrLen), false)
  485. return &WarnInfo{WarnStrLen: warnStrLen, WarnStr: warnStr}, nil
  486. }
  487. func parseMessage(readBuf *buffer) (*Message, error) {
  488. msgStrLen := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  489. msgStr := readBuf.readNext(int(msgStrLen), false)
  490. return &Message{MsgStrLen: msgStrLen, MsgStr: msgStr}, nil
  491. }
  492. func parseFormArgDescri(readBuf *buffer) (*FormArgDescri, error) {
  493. // FormArgDescri: '$' Arg_Num { Arg_Name_Len Arg_Name Arg_No Arg_DType Arg_Preci_Scale }+
  494. Arg_Num := binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  495. formArgDescri := &FormArgDescri{ArgNum: Arg_Num}
  496. fmt.Println("-- parseFormArgDescri Arg_Num:", Arg_Num)
  497. for i := 0; i < int(Arg_Num); i++ {
  498. arg := ArgDescri{}
  499. //Arg_Name_Len
  500. arg.ArgNameLen = binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  501. //Arg_Name
  502. arg.ArgName = readBuf.readNext(int(arg.ArgNameLen), false)
  503. //Arg_No
  504. arg.ArgNo = binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  505. //Argg_DType
  506. arg.ArgDType = binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  507. //Arg_Preci_Scale
  508. arg.ArgPreciScale = binary.LittleEndian.Uint32(readBuf.readNext(4, true))
  509. formArgDescri.Args = append(formArgDescri.Args, arg)
  510. }
  511. fmt.Printf("formArgDescri %#v \n", formArgDescri)
  512. return formArgDescri, nil
  513. }
  514. func parseMsg(readBuf *buffer, pConn *xuguConn) (*allResult, error) {
  515. var err error
  516. aR := allResult{}
  517. for {
  518. char := readBuf.peekChar()
  519. fmt.Println("parseMsg 内的 peekChar: ", char, "-", string(char))
  520. switch char {
  521. case 'K':
  522. fmt.Println("消息类型为K")
  523. // readBuf.buf = make([]byte, 2048)
  524. //readBuf.idx++
  525. // readBuf.buf = make([]byte, 2048)
  526. // readBuf.idx = 0
  527. readBuf.reset()
  528. return &aR, nil
  529. case '$':
  530. readBuf.idx++
  531. fmt.Println("消息类型为$")
  532. if aR.f, err = parseFormArgDescri(readBuf); err != nil {
  533. return nil, err
  534. }
  535. aR.rt = '$'
  536. return &aR, err
  537. case 'A':
  538. //readBuf.idx++
  539. fmt.Println("消息类型为A")
  540. if aR.s, err = parseSelectResult(readBuf); err != nil {
  541. return nil, err
  542. }
  543. aR.rt = 'A'
  544. return &aR, err
  545. case 'I':
  546. readBuf.idx++
  547. fmt.Println("消息类型为I")
  548. if aR.i, err = parseInsertResult(readBuf); err != nil {
  549. return nil, err
  550. }
  551. aR.rt = 'I'
  552. return &aR, err
  553. case 'U':
  554. fmt.Println("消息类型为U")
  555. readBuf.idx++
  556. if aR.u, err = parseUpdateResult(readBuf); err != nil {
  557. return nil, err
  558. }
  559. aR.rt = 'U'
  560. return &aR, err
  561. case 'D':
  562. fmt.Println("消息类型为D")
  563. readBuf.idx++
  564. readBuf.idx++
  565. if aR.d, err = parseDeleteResult(readBuf); err != nil {
  566. return nil, err
  567. }
  568. aR.rt = 'D'
  569. return &aR, err
  570. case 'E':
  571. fmt.Println("消息类型为E")
  572. readBuf.idx++
  573. if aR.e, err = parseErrInfo(readBuf); err != nil {
  574. return nil, err
  575. }
  576. pConn.errStr = aR.e.ErrStr
  577. aR.rt = 'E'
  578. return &aR, err
  579. case 'W':
  580. fmt.Println("消息类型为W")
  581. readBuf.idx++
  582. if aR.w, err = parseWarnInfo(readBuf); err != nil {
  583. return nil, err
  584. }
  585. aR.rt = 'W'
  586. return &aR, err
  587. case 'M':
  588. fmt.Println("消息类型为M")
  589. readBuf.idx++
  590. if aR.m, err = parseMessage(readBuf); err != nil {
  591. return nil, err
  592. }
  593. aR.rt = 'M'
  594. return &aR, err
  595. default:
  596. fmt.Println("消息类型为其他")
  597. return nil, errors.New("parseMsg: unknown message type")
  598. }
  599. }
  600. }
  601. // func handleParsedMsg(params ParseMsgParams) (ParseResult, error) {
  602. // result, err := parseMsg(params)
  603. // if err != nil {
  604. // return nil, err
  605. // }
  606. // result.Process()
  607. // return result, nil
  608. // }