discard.go 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. package xugu
  2. import (
  3. "bufio"
  4. "encoding/binary"
  5. "errors"
  6. "fmt"
  7. "net"
  8. )
  9. // ----------------------------------------------------------------------------------------------------
  10. type SrvResponse struct {
  11. FormArgDescri []*FormArgDescri
  12. SelectResult []*SelectResult
  13. InsertResult []*InsertResult
  14. UpdateResult []*UpdateResult
  15. DeleteResult []*DeleteResult
  16. ProcRet []*ProcRet
  17. OutParamRet []*OutParamRet
  18. ErrInfo []*ErrInfo
  19. WarnInfo []*WarnInfo
  20. Message []*Message
  21. }
  22. // func parseResponse(conn net.Conn) (*SrvResponse, error) {
  23. // response := &SrvResponse{}
  24. // reader := bufio.NewReader(conn)
  25. // for {
  26. // msgType, err := reader.ReadByte()
  27. // if err != nil {
  28. // return nil, err
  29. // }
  30. // switch msgType {
  31. // case '$':
  32. // argDescri, err := parseFormArgDescri(reader)
  33. // if err != nil {
  34. // return nil, err
  35. // }
  36. // response.FormArgDescri = append(response.FormArgDescri, argDescri)
  37. // case 'I':
  38. // insertResult, err := parseInsertResult(reader)
  39. // if err != nil {
  40. // return nil, err
  41. // }
  42. // response.InsertResult = append(response.InsertResult, insertResult)
  43. // case 'U':
  44. // updateResult, err := parseUpdateResult(reader)
  45. // if err != nil {
  46. // return nil, err
  47. // }
  48. // response.UpdateResult = append(response.UpdateResult, updateResult)
  49. // case 'D':
  50. // deleteResult, err := parseDeleteResult(reader)
  51. // if err != nil {
  52. // return nil, err
  53. // }
  54. // response.DeleteResult = append(response.DeleteResult, deleteResult)
  55. // case 'O':
  56. // procRet, err := parseProcRet(reader)
  57. // if err != nil {
  58. // return nil, err
  59. // }
  60. // response.ProcRet = append(response.ProcRet, procRet)
  61. // case 'P':
  62. // outParamRet, err := parseOutParamRet(reader)
  63. // if err != nil {
  64. // return nil, err
  65. // }
  66. // response.OutParamRet = append(response.OutParamRet, outParamRet)
  67. // case 'E':
  68. // errInfo, err := parseErrInfo(reader)
  69. // if err != nil {
  70. // return nil, err
  71. // }
  72. // response.ErrInfo = append(response.ErrInfo, errInfo)
  73. // case 'W':
  74. // warnInfo, err := parseWarnInfo(reader)
  75. // if err != nil {
  76. // return nil, err
  77. // }
  78. // response.WarnInfo = append(response.WarnInfo, warnInfo)
  79. // case 'M':
  80. // message, err := parseMessage(reader)
  81. // if err != nil {
  82. // return nil, err
  83. // }
  84. // response.Message = append(response.Message, message)
  85. // case 'K':
  86. // return response, nil
  87. // default:
  88. // return nil, fmt.Errorf("未知的消息类型: %v", msgType)
  89. // }
  90. // }
  91. // }
  92. // 解析函数的实现,例如 parseFormArgDescri 等
  93. func readString(reader *bufio.Reader, length int) (string, error) {
  94. bytes := make([]byte, length)
  95. _, err := reader.Read(bytes)
  96. return string(bytes), err
  97. }
  98. func parseFieldDescri(reader *bufio.Reader) (FieldDescri, error) {
  99. fieldDescri := FieldDescri{}
  100. var err error
  101. fieldDescri.FieldNameLen, err = readInt32(reader)
  102. if err != nil {
  103. return fieldDescri, err
  104. }
  105. fieldDescri.FieldName, err = readString(reader, fieldDescri.FieldNameLen)
  106. if err != nil {
  107. return fieldDescri, err
  108. }
  109. // fieldDescri.FieldType, err = fieldType(reader)
  110. // if err != nil {
  111. // return fieldDescri, err
  112. // }
  113. fieldDescri.FieldPreciScale, err = readInt32(reader)
  114. if err != nil {
  115. return fieldDescri, err
  116. }
  117. fieldDescri.FieldFlag, err = readInt32(reader)
  118. if err != nil {
  119. return fieldDescri, err
  120. }
  121. return fieldDescri, nil
  122. }
  123. func xgSockRecvCommand(pConn *xuguConn) {
  124. }
  125. func xgSockRecvData(conn net.Conn, buffer *[]byte) (int, error) {
  126. // 接收服务器的返回消息
  127. n, err := conn.Read(*buffer)
  128. if err != nil {
  129. fmt.Println("接收服务器消息错误Error reading from server:", err)
  130. return 0, err
  131. }
  132. return n, nil
  133. }
  134. // TODO : pConn.bkChar != 0x0 这一部分代码需要修改
  135. func rhRecv(pConn *xuguConn, buff []byte, dLen uint32) error {
  136. //old_len := dLen
  137. if pConn.bkChar != 0x0 {
  138. buff[0] = pConn.bkChar
  139. pConn.bkChar = 0x0
  140. //buff = buff[1:]
  141. dLen--
  142. }
  143. //接收加密登录信息
  144. if dLen != 0 {
  145. for dLen != 0 {
  146. if pConn.useSSL {
  147. buffer := make([]byte, 1024)
  148. n, err := pConn.conn.Read(buffer)
  149. if err != nil {
  150. return err
  151. } else {
  152. //xgCacheRecv(pConn, buffer, int32(n))
  153. }
  154. if n <= 0 {
  155. return errors.New("read error")
  156. }
  157. }
  158. }
  159. // DECRYPT(p_conn, buff, old_len); //解密缓冲
  160. }
  161. return nil
  162. }
  163. // 接收单个字符
  164. func rhRecvChar(pConn *xuguConn, valp *byte) (bool, error) {
  165. var ch [1]byte
  166. err := rhRecv(pConn, ch[:], 1)
  167. if err != nil {
  168. return false, err
  169. }
  170. fmt.Println("ch[] = ", ch[:])
  171. *valp = ch[0]
  172. return true, nil
  173. }
  174. //读取检查一个字符
  175. func rhRecvStr(pConn *xuguConn, valp *[]byte) (int, error) {
  176. var len uint32
  177. if err := rhRecvInt32(pConn, &len); err != nil {
  178. return -4, err
  179. }
  180. pBuff := make([]byte, len+1)
  181. if err := rhRecv(pConn, pBuff, len); err != nil {
  182. return -4, err
  183. }
  184. pBuff[len] = 0x0
  185. *valp = pBuff
  186. return 0, nil
  187. }
  188. func rhRecvInt32(pconn *xuguConn, i *uint32) error {
  189. var buff [4]byte
  190. err := rhRecv(pconn, buff[:], 4)
  191. if err != nil {
  192. return err
  193. }
  194. // 将大端字节序转换为主机字节序
  195. *i = binary.BigEndian.Uint32(buff[:])
  196. return nil
  197. }
  198. // // 从连接中接收字段信息,并将其存储在 Result 结构体中。
  199. // func recvFiledsInfo(pConn *xuguConn, pRes *Result) (int, error) {
  200. // var fieldNum uint32
  201. // //var pRet *FieldInfo
  202. // if err := rhRecvInt32(pConn, &fieldNum); err != nil {
  203. // return XG_NET_ERROR, err
  204. // }
  205. // if fieldNum > 4000 {
  206. // return XG_NET_ERROR, errors.New("fieldNum >4000")
  207. // }
  208. // pRes.FieldNum = fieldNum
  209. // pRet := make([]FieldInfo, fieldNum)
  210. // //接收字段详细信息
  211. // for n := uint32(0); n < fieldNum; n++ {
  212. // if ret, err := recvAttrDesItem(pConn, &pRet[n]); err != nil {
  213. // return ret, err
  214. // }
  215. // }
  216. // bytesN := (fieldNum*2 + 7) / 8
  217. // for n := uint32(0); n < fieldNum; n++ {
  218. // pRet[n].Offset = bytesN
  219. // bytesN += uint32(getSQLCType(pRet[n].TypeID))
  220. // }
  221. // // TODO : 这里需要重新修改
  222. // // 在c代码中这里还加上了 ROW_HEAD_SIZE
  223. // pRes.RowSize = bytesN + 24
  224. // pRes.ColInfos = pRet
  225. // return 0, nil
  226. // }
  227. // // 接收字段属性描述
  228. // func recvAttrDesItem(pConn *xuguConn, pItem *FieldInfo) (int, error) {
  229. // var nameLen uint32
  230. // var tabName []byte
  231. // var alias []byte
  232. // if err := rhRecvInt32(pConn, &nameLen); err != nil {
  233. // return XG_NET_ERROR, err
  234. // }
  235. // if nameLen > 1024 {
  236. // return XG_NET_ERROR, errors.New("nameLen >1024")
  237. // }
  238. // var name []byte
  239. // if err := rhRecv(pConn, name, nameLen); err != nil {
  240. // return XG_NET_ERROR, err
  241. // }
  242. // if ret := bytes.IndexByte(name, '%'); ret != -1 {
  243. // alias = name[ret+1:]
  244. // name = name[:ret-1]
  245. // }
  246. // if ret := bytes.IndexByte(name, '.'); ret != -1 {
  247. // //如果 return_schema_on 为真,那么这里将得到 schema_name.tab_name。
  248. // tabName = name[:ret-1]
  249. // name = name[ret+1:]
  250. // }
  251. // pItem.TabName = string(tabName)
  252. // pItem.Name = string(name)
  253. // pItem.Alias = string(alias)
  254. // if err := rhRecvInt32(pConn, &pItem.TypeID); err != nil {
  255. // return XG_NET_ERROR, err
  256. // }
  257. // if err := rhRecvInt32(pConn, &pItem.Modi); err != nil {
  258. // return XG_NET_ERROR, err
  259. // }
  260. // if err := rhRecvInt32(pConn, &pItem.Flags); err != nil {
  261. // return XG_NET_ERROR, err
  262. // }
  263. // pItem.CTypeID = uint32(getSQLCType(pItem.TypeID))
  264. // return 0, nil
  265. // }
  266. func readInt32(reader *bufio.Reader) (int, error) {
  267. var value int32
  268. err := binary.Read(reader, binary.BigEndian, &value)
  269. return int(value), err
  270. }
  271. //接收结果集
  272. //int recv_Query_Rs(Conn_Attrs* p_conn,Result** pp_res,int*field_num,int64* rowcount,int* effected_num)
  273. /* recv_Query_Rs :
  274. * p_conn conn inout
  275. * pp_res output
  276. */
  277. // func recvQueryRs(pConn *xuguConn, ppRes **Result) int {
  278. // ret := 0
  279. // pres := &Result{}
  280. // pres_H := &Result{}
  281. // for {
  282. // var ch byte
  283. // rhRecvChar(pConn, &ch)
  284. // switch ch {
  285. // case 'k':
  286. // if pres_H != nil {
  287. // *ppRes = pres_H
  288. // } else {
  289. // *ppRes = pres
  290. // }
  291. // return ret
  292. // case 'E', 'F':
  293. // var errStr []byte
  294. // rhRecvStr(pConn, &errStr)
  295. // fmt.Printf("[EC031]Error in recv result :%s \n", errStr)
  296. // pConn.errStr = errStr
  297. // ret = XG_ERROR
  298. // continue
  299. // case 'W', 'M':
  300. // var errStr []byte
  301. // rhRecvStr(pConn, &errStr)
  302. // fmt.Printf("[EC032]Server Warning in recv result :%s \n", errStr)
  303. // pConn.errStr = errStr
  304. // ret = XG_ERROR // cyj 是否有点错误
  305. // case 'I':
  306. // //var len uint32
  307. // // if !rhRecvInt32(pConn, &len) {
  308. // // }
  309. // case 'U', 'D':
  310. // case 'A':
  311. // if pres == nil {
  312. // pres := &Result{}
  313. // pres.Type = HT_RS
  314. // } else {
  315. // var prev = &Result{}
  316. // if pres_H != nil {
  317. // prev = pres_H
  318. // for prev.NextResult != nil {
  319. // prev = prev.NextResult
  320. // }
  321. // } else {
  322. // pres_H = pres
  323. // prev = pres_H
  324. // }
  325. // pres = &Result{}
  326. // pres.Type = HT_RS
  327. // prev.NextResult = pres
  328. // }
  329. // pres.SQLType = SQL_SELECT
  330. // pres.DbcFlob = pConn
  331. // // _, err := recvFiledsInfo(pConn, pres)
  332. // // if err != nil {
  333. // // return XG_SOCKET_ERROR,
  334. // // }
  335. // }
  336. // }
  337. // return 0
  338. // }
  339. // recv_record
  340. // func recvRecords20000(p_conn *Conn_Attrs, p_res *Result) int {
  341. // pRow := RhRow{}
  342. // // if p_res.PBlokmemls == nil{
  343. // // p_res.PBlokmemls =
  344. // // }
  345. // for i := 0; i < 20000; i++ {
  346. // //recvRecord(p_conn, p_res, &pRow)
  347. // }
  348. // }
  349. func recvRecord() {
  350. }