xugu_param.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. package xugu
  2. import "fmt"
  3. //定义 XGCSParam 结构体
  4. type XGCSParam struct {
  5. Type HANDLE_TYPE // 句柄类型
  6. ParamNum uint32 // 单行参数数量
  7. PResourceNum int // 参数名称资源数量,步长128
  8. ParamArraySize int // 参数数组长度(数组大小)
  9. ValueP []byte // 实际参数指针数组,指向参数地址
  10. VType []uint32 // 参数类型:数组,参数数量
  11. VParamSize []uint32 // 参数缓冲区长度,参数数量
  12. VDbType *int // 参考数据库数据类型,参数数量
  13. VActuallenp [][]int // 参数数据实际大小数组,[参数数组大小][参数数量]
  14. VParamName [][]byte // 参数名称
  15. VParamNo []uint32 // 参数序列数组
  16. VInOut []int // 输入输出类型
  17. ErrStr []byte // 错误字符串
  18. MemType int // 内存使用模式(0:引用,1:驱动程序分配)
  19. ImpExpType int // 0 隐式创建,1 显式创建,2 由服务器提供的准备语句获取
  20. }
  21. //按序号绑定
  22. /*=====================================
  23. p_conn 连接句柄
  24. param_no 参数号: 从1开始
  25. param_type 参数输入输出型
  26. datatype 参数数据类型
  27. value 参数值
  28. param_size 单个参数的空间大小 buffer
  29. rlen_val 具体的每个参数 的对应实际大小
  30. ======================================*/
  31. func xgSockBindparamByPos(pconn *xuguConn, param_no int, param_type int, datatype int, value []byte, param_size int, rlen_val []int) int {
  32. if pconn.Type == HT_CONN {
  33. if pconn.params == nil {
  34. pconn.params = &XGCSParam{Type: HT_PARAMS}
  35. }
  36. if param_no > 4000 {
  37. pconn.errStr = []byte(fmt.Sprintf("[EC051]Error invalid param NO %d out of range paramnum", param_no))
  38. return -51
  39. }
  40. if !(param_type == 1 || param_type == 2 || param_type == 3 || param_type == 6) {
  41. pconn.errStr = []byte(fmt.Sprintf("[EC052]Error invalid param type %d", param_type))
  42. return -52
  43. }
  44. if param_no < 1 {
  45. pconn.errStr = []byte(fmt.Sprintf("[EC054]Error param_no param seq %d invalid", param_no))
  46. return -54
  47. }
  48. } else if pconn.params.Type == HT_PARAMS {
  49. if param_no > 4000 {
  50. pconn.params.ErrStr = []byte(fmt.Sprintf("[EC051]Error invalid param NO %d out of range paramnum", param_no))
  51. //set error 参数绑定序列值 超过合理范围
  52. return -51
  53. }
  54. if !(param_type == 1 || param_type == 2 || param_type == 3 || param_type == 6) {
  55. pconn.params.ErrStr = []byte(fmt.Sprintf("[EC052]Error invalid param type %d", param_type))
  56. return -52 //参数绑定类型非法
  57. }
  58. if param_no < 1 {
  59. pconn.errStr = []byte(fmt.Sprintf("[EC054]Error param_no param seq %d invalid", param_no))
  60. return -54
  61. }
  62. } else {
  63. //invalid ptr set
  64. return XG_INVALID_ARG
  65. }
  66. ret := xgSockBindParamsByPos(*pconn.params, param_no, param_type, datatype, value, param_size, rlen_val)
  67. if ret < 0 {
  68. if ret == -55 {
  69. pconn.errStr = []byte(fmt.Sprintf("[EC055]Error bindparam jump long %d invalid", ret))
  70. return -55
  71. } else if ret == -8 {
  72. pconn.errStr = []byte(fmt.Sprintf("[EC056]Error bindparam unsurpported ret %d invalid", ret))
  73. return -8
  74. }
  75. }
  76. return ret
  77. }
  78. func xgSockBindParamsByPos(pParams XGCSParam, param_no int, param_type int, datatype int, value []byte, param_size int, rlen_val []int) int {
  79. ipar := param_no
  80. ipar--
  81. if pParams.ParamNum == 0 { // 初始化空间
  82. pParams.PResourceNum = 128
  83. pParams.VType = make([]uint32, 128)
  84. pParams.VParamSize = make([]uint32, 128)
  85. //pParams.VDbType = make([][]int, 128)
  86. pParams.VActuallenp = make([][]int, 128)
  87. pParams.VParamNo = make([]uint32, 128)
  88. pParams.VInOut = make([]int, 128)
  89. pParams.VParamName = nil
  90. }
  91. if int(pParams.ParamNum) < param_no { //分配空间(加增)
  92. if pParams.PResourceNum < param_no { //资源分配
  93. if pParams.PResourceNum+128 < param_no {
  94. return -55 // set error 参数绑定跳跃度过大
  95. }
  96. }
  97. //go 切片会自动分配内存 切片扩容机制
  98. }
  99. if param_type == 6 {
  100. //函数返回值绑定
  101. pParams.VParamNo[uint32(ipar)] = uint32(ipar) //意义不大 或者可以改成valid
  102. pParams.VType[uint32(ipar)] = uint32(datatype)
  103. pParams.ValueP = value
  104. pParams.VParamSize[uint32(ipar)] = uint32(param_size)
  105. pParams.VActuallenp[uint32(ipar)] = rlen_val
  106. pParams.VInOut[uint32(ipar)] = param_type
  107. } else if param_type == 1 { //input
  108. pParams.VParamNo[uint32(ipar)] = uint32(ipar) //意义不大 或者可以改成valid
  109. pParams.VType[uint32(ipar)] = uint32(datatype)
  110. //tmp ===================== value cpoy ================================
  111. pParams.ValueP = value
  112. pParams.VActuallenp[uint32(ipar)] = rlen_val //tmp end
  113. pParams.MemType = 1
  114. pParams.VInOut[uint32(ipar)] = 1
  115. } else if param_type == 2 || param_type == 3 { //output ||inoutput
  116. pParams.VParamNo[uint32(ipar)] = uint32(ipar)
  117. pParams.VType[uint32(ipar)] = uint32(datatype)
  118. pParams.ValueP = value
  119. pParams.VParamSize[uint32(ipar)] = uint32(param_size) //buff长度
  120. pParams.VActuallenp[uint32(ipar)] = rlen_val
  121. pParams.VInOut[uint32(ipar)] = param_type
  122. } else { //3
  123. return -8 //尚未实现
  124. //参数绑定类型不合格
  125. }
  126. return 0
  127. }
  128. //批量
  129. /*=============================================
  130. p_conn 连接句柄
  131. param_no 参数号: 从1开始
  132. param_type 参数输入输出型
  133. datatype 参数数据类型
  134. array_size 数组的大小长度
  135. array_value 参数值数组
  136. param_size 单个参数的空间大小 buffer
  137. rlen_val 具体的每个参数 的对应实际大小[与参数值大小一一对应]
  138. ==============================================*/
  139. func xgSockBindParamArrayByPos(pConn *xuguConn, param_no int, param_num int, param_type int, datatype int, array_size int, array_value []byte, param_size int, rlen_val []int) int {
  140. if pConn.Type == HT_CONN {
  141. if pConn.params == nil {
  142. pConn.params = new(XGCSParam)
  143. pConn.params.Type = HT_PARAMS //imp_exp_type= 0;
  144. }
  145. if param_no > 4000 || param_num > 4000 || param_num < -1 {
  146. //set error 参数绑定序列值 超过合理范围
  147. pConn.errStr = []byte(fmt.Sprintf("[EC051]Error invalid param NO %d out of range paramnum", param_num))
  148. return -51
  149. }
  150. if !(param_type == 1 || param_type == 2 || param_type == 3 || param_type == 6) {
  151. pConn.errStr = []byte(fmt.Sprintf("[EC052]Error invalid param type %d", param_type))
  152. return -52 //参数绑定类型非法
  153. }
  154. if param_no < 1 {
  155. pConn.errStr = []byte(fmt.Sprintf("[EC054]Error param_no param seq %d invalid", param_no))
  156. return -54
  157. }
  158. } else if pConn.Type == HT_PARAMS {
  159. //pParams := pConn.params
  160. if param_no > 4000 {
  161. pConn.params.ErrStr = []byte(fmt.Sprintf("[EC051]Error invalid param NO %d out of range paramnum", param_no))
  162. return -51
  163. }
  164. if !(param_type == 1 || param_type == 2 || param_type == 3 || param_type == 6) {
  165. pConn.params.ErrStr = []byte(fmt.Sprintf("[EC052]Error invalid param type %d", param_type))
  166. return -52 //参数绑定类型非法
  167. }
  168. if param_no < 1 {
  169. pConn.params.ErrStr = []byte(fmt.Sprintf("[EC054]Error param_no param seq %d invalid", param_no))
  170. return -54
  171. }
  172. } else {
  173. return XG_INVALID_ARG
  174. }
  175. ret := xgSockBindParamsArrayByPos(pConn.params, param_no, param_num, param_type, datatype, array_size, array_value, param_size, rlen_val)
  176. return ret
  177. }
  178. func xgSockBindParamsArrayByPos(pParams *XGCSParam, param_no int, param_num int, param_type int, datatype int, array_size int,
  179. array_value []byte, param_size int, rlen_val []int) int {
  180. ipar := param_no - 1
  181. if pParams.ParamNum == 0 {
  182. //以下部分需要重新封装 使得看起来比较代码简练
  183. if param_num == 0 { //顶层资源 一次分配128
  184. pParams.PResourceNum = 128
  185. pParams.VType = make([]uint32, 128)
  186. pParams.VParamSize = make([]uint32, 128)
  187. //pParams.VDbType = make([][]int, 128)
  188. pParams.VActuallenp = make([][]int, 128)
  189. pParams.VParamNo = make([]uint32, 128)
  190. pParams.VInOut = make([]int, 128)
  191. pParams.VParamName = nil
  192. } else { //已知参数列数
  193. pParams.ParamArraySize = array_size //数组容量确定
  194. pParams.VType = make([]uint32, param_num)
  195. pParams.VParamSize = make([]uint32, param_num)
  196. //pParams.VDbType = make([][]int, 128)
  197. pParams.VActuallenp = make([][]int, param_num) //这个p_params->v_actuallenp[ipar][0]指向传入数组就行了
  198. pParams.VParamNo = make([]uint32, param_num)
  199. pParams.VInOut = make([]int, param_num)
  200. //pParams.VParamName = nil
  201. }
  202. }
  203. if pParams.ParamNum < uint32(param_no) {
  204. if pParams.PResourceNum < param_no { //资源分配
  205. }
  206. pParams.ParamNum = uint32(param_no) //允许了中间的空洞
  207. }
  208. if param_type == 6 { //1236 in out inout return value
  209. //函数返回值绑定
  210. } else if param_type == 1 { //input
  211. pParams.VParamNo[ipar] = uint32(param_no) ////意义不大 或者可以改成valid
  212. pParams.VType[ipar] = uint32(datatype)
  213. //off := 0
  214. //ptrLen := 0 //varchar长度指示器
  215. var ptr []byte
  216. copy(pParams.VActuallenp[ipar], rlen_val)
  217. if needCopyV(datatype) {
  218. //m_ele_siz := getDbTypeLen(datatype)
  219. copy(ptr, array_value)
  220. } else if datatype == XG_C_CHAR || datatype == XG_C_NCHAR {
  221. copy(ptr, array_value)
  222. } else {
  223. // ptr=(char*)malloc(param_size);//no
  224. //memcpy(ptr,array_value,param_size);
  225. }
  226. for irow := 0; irow < array_size; irow++ {
  227. switch datatype {
  228. // case XG_C_INTEGER, XG_C_FLOAT:
  229. // pParams.ValueP[irow][ipar] = ptr[off]
  230. // off++
  231. // case XG_C_NCHAR, XG_C_CHAR:
  232. // pParams.ValueP[irow][ipar] = ptr[off]
  233. // off++
  234. // case XG_C_BIGINT, DATETIME_ASLONG:
  235. // pParams.ValueP[irow][ipar] = ptr[off]
  236. // off++
  237. // case XG_C_DOUBLE:
  238. // pParams.ValueP[irow][ipar] = ptr[off]
  239. // off++
  240. // case XG_C_NUMERIC:
  241. // pParams.ValueP[irow][ipar] = ptr[off]
  242. // off++
  243. // case XG_C_DATE, XG_C_TIME, XG_C_DATETIME, XG_C_TIME_TZ, XG_C_DATETIME_TZ, XG_C_BINARY, XG_C_INTERVAL_YEAR_TO_MONTH, XG_C_INTERVAL_DAY_TO_SECOND:
  244. // pParams.ValueP[irow][ipar] = ptr[off]
  245. // off++
  246. // case XG_C_SHORT:
  247. // pParams.ValueP[irow][ipar] = ptr[off]
  248. // off++
  249. // case XG_C_TINYINT, XG_C_BOOL, XG_C_CHARN1:
  250. // pParams.ValueP[irow][ipar] = ptr[off]
  251. // off++
  252. default:
  253. fmt.Println("bindparam unsurpported datatype")
  254. pParams.ErrStr = []byte(fmt.Sprintf("[EC058]Error bindparam unsurpported datatype %d invalid", datatype))
  255. return -58
  256. }
  257. }
  258. pParams.VParamSize[ipar] = uint32(param_size) //buff长度
  259. pParams.VInOut[ipar] = 1
  260. } else if param_type == 2 { //output
  261. // p_params->v_actuallenp[ipar] = rlen_val;//这里之所以是引用传递 那是因为 out or inout 型时 需要反馈实际的参数的长度
  262. return -8 //尚未实现
  263. } else { //3
  264. return -8 //尚未实现
  265. //参数绑定类型不合格
  266. }
  267. return XG_OK
  268. }
  269. //按名绑定
  270. /*=====================================
  271. p_conn 连接句柄 2 p_conn 参数句柄(显式创建参数句柄)
  272. param_name 参数名: 当出现一样的参数名时,会进行覆盖但是不会报错
  273. param_type 参数输入输出型
  274. datatype 参数数据类型
  275. value 参数值
  276. param_size 单个参数的空间大小 buffer
  277. rlen_val 具体的每个参数 的对应实际大小
  278. ======================================*/
  279. func xgSockBindParamByName(pConn *xuguConn, param_name []byte, param_type int, datatype int, void []byte, param_sizeint, rt_code *int, rlen_val []int) int {
  280. pParams := pConn.params
  281. if pConn.Type == HT_CONN {
  282. if nil == pConn.params {
  283. pConn.params = &XGCSParam{}
  284. pConn.params.Type = HT_PARAMS //imp_exp_type= 0;
  285. }
  286. pParams = pConn.params
  287. } else if pConn.Type == HT_PARAMS {
  288. pParams = pConn.params
  289. } else {
  290. //invalid ptr set
  291. return XG_INVALID_ARG
  292. }
  293. if !(param_type == 1 || param_type == 2 || param_type == 3 || param_type == 6) {
  294. if pConn.Type == HT_CONN {
  295. pConn.params.ErrStr = []byte(fmt.Sprintf("[EC052]Error invalis param type %d", param_type))
  296. } else {
  297. pParams.ErrStr = []byte(fmt.Sprintf("[EC052]Error invalis param type %d", param_type))
  298. }
  299. return -52
  300. }
  301. return 0
  302. }
  303. func xgSockBindParamByNameSub(pParams *XGCSParam) {
  304. if pParams.ParamNum == 0 { //优先考虑 参数不足128个时的情况
  305. pParams.PResourceNum = 128
  306. pParams.ValueP = make([]byte, 128)
  307. pParams.VType = make([]uint32, 128)
  308. pParams.VParamSize = make([]uint32, 128)
  309. //pParams.VDbType = make([][]int, 128)
  310. pParams.VActuallenp = make([][]int, 128)
  311. pParams.VParamNo = make([]uint32, 128)
  312. pParams.VInOut = make([]int, 128)
  313. pParams.VParamName = nil
  314. }
  315. }