xugu_conn.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. package xugu
  2. import (
  3. "bytes"
  4. "context"
  5. "database/sql/driver"
  6. "errors"
  7. "fmt"
  8. "net"
  9. "sync"
  10. )
  11. type xuguConn struct {
  12. dsnConfig
  13. conn net.Conn
  14. mu sync.Mutex
  15. Type HANDLE_TYPE // 句柄类型
  16. useSSL bool // 是否使用加密
  17. havePrepare int //default 0
  18. bkChar byte
  19. prepareNo int //fashengqi
  20. prepareName string
  21. //presPrepareCata *Result
  22. errStr []byte
  23. sendBuff bytes.Buffer
  24. readBuff buffer
  25. }
  26. type dsnConfig struct {
  27. IP string
  28. Port string
  29. Database string
  30. User string
  31. Password string
  32. Encryptor string //加密库的解密口令
  33. CharSet string //客户端使用的字符集名
  34. TimeZone string
  35. IsoLevel string //事务隔离级别
  36. LockTimeout string //加锁超时
  37. AutoCommit string
  38. StrictCommit string
  39. Result string
  40. ReturnSchema string
  41. ReturnCursorID string
  42. LobRet string
  43. ReturnRowid string
  44. Version string
  45. }
  46. func (xgConn *xuguConn) Get_error() error {
  47. return nil
  48. }
  49. //SELECT 1 FROM DUAL
  50. func (xgConn *xuguConn) Begin() (driver.Tx, error) {
  51. return nil, nil
  52. }
  53. var prepareCount = 0
  54. func (xgConn *xuguConn) Prepare(sql string) (driver.Stmt, error) {
  55. fmt.Println(">>>>>(xgConn *xuguConn) Prepare(query string)")
  56. prepareName := fmt.Sprintf("GTONG%d", prepareCount)
  57. //判断sql类型
  58. switch switchSQLType(sql) {
  59. case SQL_PROCEDURE:
  60. return nil, errors.New("Prepare does not support stored procedures")
  61. case SQL_UNKNOWN:
  62. return nil, errors.New("Unknown SQL statement type")
  63. case SQL_CREATE:
  64. return nil, errors.New("Prepare does not support DDL.")
  65. }
  66. //参数个数
  67. parser := &xuguParse{
  68. bind_type: 0,
  69. param_count: 0,
  70. position: 0,
  71. }
  72. count := parser.assertParamCount(sql)
  73. parser.param_count = count
  74. fmt.Println("语句 参数个数:", count)
  75. //发送创建prepare
  76. err := xuguPrepare(xgConn, sql, prepareName)
  77. if err != nil {
  78. return nil, err
  79. }
  80. //sockSendPutStatement(xgConn, []byte(sql))
  81. stmt := &xuguStmt{
  82. stmt_conn: xgConn,
  83. prepared: true,
  84. prename: make([]byte, 128),
  85. curopend: false,
  86. curname: make([]byte, 128),
  87. paramCount: count,
  88. mysql: sql,
  89. parser: parser,
  90. }
  91. prepareName = fmt.Sprintf("? %s ", prepareName)
  92. stmt.prename = []byte(prepareName)
  93. xgConn.prepareName = prepareName
  94. return stmt, nil
  95. }
  96. func (xgConn *xuguConn) Close() error {
  97. fmt.Println("Close connection")
  98. err := xgConn.conn.Close()
  99. if err != nil {
  100. fmt.Println("Close connection error")
  101. return err
  102. }
  103. return nil
  104. }
  105. func (xgConn *xuguConn) Exec(sql string,
  106. args []driver.Value) (driver.Result, error) {
  107. fmt.Printf(">>> (xgConn *xuguConn) Exec: %s, %v\n", sql, args)
  108. if switchSQLType(sql) == SQL_SELECT {
  109. return nil, errors.New("The executed SQL statement is not a SELECT")
  110. }
  111. //有参数传进来
  112. if len(args) != 0 {
  113. //创建prepare
  114. _, err := xgConn.Prepare(sql)
  115. if err != nil {
  116. return nil, err
  117. }
  118. //
  119. parser := &xuguParse{
  120. bind_type: 0,
  121. param_count: len(args),
  122. position: 0,
  123. }
  124. for pos, param := range args {
  125. parser.assertParamType(param, pos)
  126. //fmt.Printf("Field Name: %s, Field Type: %s, Field Value: %v\n", v1, v1, v1)
  127. }
  128. sockSendPutStatement(xgConn, []byte(xgConn.prepareName), &parser.values, len(args))
  129. XGC_Execute(xgConn)
  130. //处理服务器返回
  131. xgConn.conn.Read(xgConn.readBuff.buf)
  132. readBuf := &xgConn.readBuff
  133. fmt.Println("Message from server EXEC:", readBuf.buf[readBuf.idx:])
  134. fmt.Println("Message from server EXEC:", string(xgConn.readBuff.buf))
  135. rs, err := parseMsg(readBuf, xgConn)
  136. if err != nil {
  137. return nil, err
  138. }
  139. return rs, nil
  140. }
  141. rs, err := xgConn.exec(sql)
  142. if err != nil {
  143. return nil, err
  144. }
  145. return rs, nil
  146. }
  147. func (xgConn *xuguConn) exec(sql string) (driver.Result, error) {
  148. sockSendPutStatement(xgConn, []byte(sql), nil, 0)
  149. XGC_Execute(xgConn)
  150. //处理服务器返回
  151. xgConn.conn.Read(xgConn.readBuff.buf)
  152. readBuf := &xgConn.readBuff
  153. fmt.Println("Message from server EXEC:", readBuf.buf[readBuf.idx:])
  154. fmt.Println("Message from server EXEC:", string(xgConn.readBuff.buf))
  155. rs, err := parseMsg(readBuf, xgConn)
  156. if err != nil {
  157. return nil, err
  158. }
  159. return rs, nil
  160. }
  161. func (xgConn *xuguConn) Query(sql string,
  162. args []driver.Value) (driver.Rows, error) {
  163. fmt.Println(">>> (xgConn *xuguConn) Query")
  164. if switchSQLType(sql) != SQL_SELECT {
  165. return nil, errors.New("The executed SQL statement is not a SELECT")
  166. }
  167. parser := &xuguParse{
  168. bind_type: 0,
  169. param_count: 0,
  170. position: 0,
  171. }
  172. if len(args) != 0 {
  173. for pos, param := range args {
  174. err := parser.assertParamType(param, pos)
  175. if err != nil {
  176. return nil, err
  177. }
  178. }
  179. if len(parser.values) != parser.assertParamCount(sql) {
  180. return nil, errors.New("The number of parameters does not match")
  181. }
  182. }
  183. //最终发送消息给服务器
  184. sockSendPutStatement(xgConn, []byte(sql), nil, 0)
  185. XGC_Execute(xgConn)
  186. //----------------处理服务器查询返回
  187. xgConn.conn.Read(xgConn.readBuff.buf)
  188. //fmt.Println("Message from server:", (buffer[:n]))
  189. fmt.Println("Message from server:", string(xgConn.readBuff.buf))
  190. //fmt.Println("\nMessage from server2:", (stmt.stmt_conn.readBuff.buf))
  191. results, err := parseSelectResult(&xgConn.readBuff)
  192. if err != nil {
  193. fmt.Println("parseSelectResult parseSelectResult err", err.Error())
  194. return nil, err
  195. }
  196. rows := &xuguRows{
  197. rows_conn: xgConn,
  198. results: results,
  199. lastRowRelt: int(0),
  200. lastRelt: int(0),
  201. prepared: false,
  202. }
  203. return rows, nil
  204. }
  205. func (xgConn *xuguConn) Ping(ctx context.Context) error {
  206. sockSendPutStatement(xgConn, []byte("select count(*) from dual;"), nil, 0)
  207. XGC_Execute(xgConn)
  208. xgConn.conn.Read(xgConn.readBuff.buf)
  209. //fmt.Println("Message from server:", (buffer[:n]))
  210. fmt.Println("Message from server:", string(xgConn.readBuff.buf))
  211. //fmt.Println("\nMessage from server2:", (stmt.stmt_conn.readBuff.buf))
  212. _, err := parseSelectResult(&xgConn.readBuff)
  213. if err != nil {
  214. fmt.Println("parseSelectResult parseSelectResult err", err.Error())
  215. return err
  216. }
  217. xgConn.readBuff.idx = 0
  218. xgConn.readBuff.buf = make([]byte, 2048)
  219. return nil
  220. }