xugu_parse.go 14 KB

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