u.go 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495
  1. /*
  2. * Copyright (c) 2000-2018, 达梦数据库有限公司.
  3. * All rights reserved.
  4. */
  5. package dm
  6. import (
  7. "container/list"
  8. "context"
  9. "database/sql"
  10. "database/sql/driver"
  11. "fmt"
  12. "io"
  13. "math/big"
  14. "reflect"
  15. "strconv"
  16. "strings"
  17. "time"
  18. "gitee.com/chunanyong/dm/util"
  19. )
  20. var rp = newRsPool()
  21. type DmStatement struct {
  22. filterable
  23. dmConn *DmConnection
  24. rsMap map[int16]*innerRows
  25. inUse bool
  26. prepared bool
  27. innerUsed bool
  28. innerExec bool
  29. id int32
  30. cursorName string
  31. readBaseColName bool
  32. execInfo *execRetInfo
  33. resultSetType int
  34. resultSetConcurrency int
  35. resultSetHoldability int
  36. nativeSql string
  37. maxFieldSize int
  38. maxRows int64
  39. escapeProcessing bool
  40. queryTimeout int32
  41. fetchDirection int
  42. fetchSize int
  43. cursorUpdateRow int64
  44. closeOnCompletion bool
  45. isBatch bool
  46. closed bool
  47. columns []column
  48. serverParams []parameter
  49. bindParams []parameter
  50. paramCount int32
  51. preExec bool
  52. }
  53. type stmtPoolInfo struct {
  54. id int32
  55. cursorName string
  56. readBaseColName bool
  57. }
  58. type rsPoolKey struct {
  59. dbGuid string
  60. currentSchema string
  61. sql string
  62. paramCount int
  63. }
  64. func newRsPoolKey(stmt *DmStatement, sql string) rsPoolKey {
  65. rpk := new(rsPoolKey)
  66. rpk.dbGuid = stmt.dmConn.Guid
  67. rpk.currentSchema = stmt.dmConn.Schema
  68. rpk.paramCount = int(stmt.paramCount)
  69. rpk.sql = sql
  70. return *rpk
  71. }
  72. func (key rsPoolKey) equals(destKey rsPoolKey) bool {
  73. return key.dbGuid == destKey.dbGuid &&
  74. key.currentSchema == destKey.currentSchema &&
  75. key.sql == destKey.sql &&
  76. key.paramCount == destKey.paramCount
  77. }
  78. type rsPoolValue struct {
  79. m_lastChkTime int
  80. m_TbIds []int32
  81. m_TbTss []int64
  82. execInfo *execRetInfo
  83. }
  84. func newRsPoolValue(execInfo *execRetInfo) rsPoolValue {
  85. rpv := new(rsPoolValue)
  86. rpv.execInfo = execInfo
  87. rpv.m_lastChkTime = time.Now().Nanosecond()
  88. copy(rpv.m_TbIds, execInfo.tbIds)
  89. copy(rpv.m_TbTss, execInfo.tbTss)
  90. return *rpv
  91. }
  92. func (rpv rsPoolValue) refreshed(conn *DmConnection) (bool, error) {
  93. if conn.dmConnector.rsRefreshFreq == 0 {
  94. return false, nil
  95. }
  96. if rpv.m_lastChkTime+conn.dmConnector.rsRefreshFreq*int(time.Second) > time.Now().Nanosecond() {
  97. return false, nil
  98. }
  99. tss, err := conn.Access.Dm_build_1499(interface{}(rpv.m_TbIds).([]uint32))
  100. if err != nil {
  101. return false, err
  102. }
  103. rpv.m_lastChkTime = time.Now().Nanosecond()
  104. var tbCount int
  105. if tss != nil {
  106. tbCount = len(tss)
  107. }
  108. if tbCount != len(rpv.m_TbTss) {
  109. return true, nil
  110. }
  111. for i := 0; i < tbCount; i++ {
  112. if rpv.m_TbTss[i] != tss[i] {
  113. return true, nil
  114. }
  115. }
  116. return false, nil
  117. }
  118. func (rpv rsPoolValue) getResultSet(stmt *DmStatement) *innerRows {
  119. destDatas := rpv.execInfo.rsDatas
  120. var totalRows int
  121. if rpv.execInfo.rsDatas != nil {
  122. totalRows = len(rpv.execInfo.rsDatas)
  123. }
  124. if stmt.maxRows > 0 && stmt.maxRows < int64(totalRows) {
  125. destDatas = make([][][]byte, stmt.maxRows)
  126. copy(destDatas[:len(destDatas)], rpv.execInfo.rsDatas[:len(destDatas)])
  127. }
  128. rs := newLocalInnerRows(stmt, stmt.columns, destDatas)
  129. rs.id = 1
  130. return rs
  131. }
  132. func (rpv rsPoolValue) getDataLen() int {
  133. return rpv.execInfo.rsSizeof
  134. }
  135. type rsPool struct {
  136. rsMap map[rsPoolKey]rsPoolValue
  137. rsList *list.List
  138. totalDataLen int
  139. }
  140. func newRsPool() *rsPool {
  141. rp := new(rsPool)
  142. rp.rsMap = make(map[rsPoolKey]rsPoolValue, 100)
  143. rp.rsList = list.New()
  144. return rp
  145. }
  146. func (rp *rsPool) removeInList(key rsPoolKey) {
  147. for e := rp.rsList.Front(); e != nil && e.Value.(rsPoolKey).equals(key); e = e.Next() {
  148. rp.rsList.Remove(e)
  149. }
  150. }
  151. func (rp *rsPool) put(stmt *DmStatement, sql string, execInfo *execRetInfo) {
  152. var dataLen int
  153. if execInfo != nil {
  154. dataLen = execInfo.rsSizeof
  155. }
  156. cacheSize := stmt.dmConn.dmConnector.rsCacheSize * 1024 * 1024
  157. for rp.totalDataLen+dataLen > cacheSize {
  158. if rp.totalDataLen == 0 {
  159. return
  160. }
  161. lk := rp.rsList.Back().Value.(rsPoolKey)
  162. rp.totalDataLen -= rp.rsMap[lk].getDataLen()
  163. rp.rsList.Remove(rp.rsList.Back())
  164. delete(rp.rsMap, rp.rsList.Back().Value.(rsPoolKey))
  165. }
  166. key := newRsPoolKey(stmt, sql)
  167. value := newRsPoolValue(execInfo)
  168. if _, ok := rp.rsMap[key]; !ok {
  169. rp.rsList.PushFront(key)
  170. } else {
  171. rp.removeInList(key)
  172. rp.rsList.PushFront(key)
  173. }
  174. rp.rsMap[key] = value
  175. rp.totalDataLen += dataLen
  176. }
  177. func (rp *rsPool) get(stmt *DmStatement, sql string) (*rsPoolValue, error) {
  178. key := newRsPoolKey(stmt, sql)
  179. v, ok := rp.rsMap[key]
  180. if ok {
  181. b, err := v.refreshed(stmt.dmConn)
  182. if err != nil {
  183. return nil, err
  184. }
  185. if b {
  186. rp.removeInList(key)
  187. delete(rp.rsMap, key)
  188. return nil, nil
  189. }
  190. rp.removeInList(key)
  191. rp.rsList.PushFront(key)
  192. return &v, nil
  193. } else {
  194. return nil, nil
  195. }
  196. }
  197. func (s *DmStatement) Close() error {
  198. if s.closed {
  199. return nil
  200. }
  201. if len(s.filterChain.filters) == 0 {
  202. return s.close()
  203. }
  204. return s.filterChain.reset().DmStatementClose(s)
  205. }
  206. func (s *DmStatement) NumInput() int {
  207. if err := s.checkClosed(); err != nil {
  208. return -1
  209. }
  210. if len(s.filterChain.filters) == 0 {
  211. return s.numInput()
  212. }
  213. return s.filterChain.reset().DmStatementNumInput(s)
  214. }
  215. func (s *DmStatement) Exec(args []driver.Value) (driver.Result, error) {
  216. if err := s.checkClosed(); err != nil {
  217. return nil, err
  218. }
  219. if len(s.filterChain.filters) == 0 {
  220. return s.exec(args)
  221. }
  222. return s.filterChain.reset().DmStatementExec(s, args)
  223. }
  224. func (s *DmStatement) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) {
  225. if err := s.checkClosed(); err != nil {
  226. return nil, err
  227. }
  228. if len(s.filterChain.filters) == 0 {
  229. return s.execContext(ctx, args)
  230. }
  231. return s.filterChain.reset().DmStatementExecContext(s, ctx, args)
  232. }
  233. func (s *DmStatement) Query(args []driver.Value) (driver.Rows, error) {
  234. if err := s.checkClosed(); err != nil {
  235. return nil, err
  236. }
  237. if len(s.filterChain.filters) == 0 {
  238. return s.query(args)
  239. }
  240. return s.filterChain.reset().DmStatementQuery(s, args)
  241. }
  242. func (s *DmStatement) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) {
  243. if err := s.checkClosed(); err != nil {
  244. return nil, err
  245. }
  246. if len(s.filterChain.filters) == 0 {
  247. return s.queryContext(ctx, args)
  248. }
  249. return s.filterChain.reset().DmStatementQueryContext(s, ctx, args)
  250. }
  251. func (s *DmStatement) CheckNamedValue(nv *driver.NamedValue) error {
  252. if len(s.filterChain.filters) == 0 {
  253. return s.checkNamedValue(nv)
  254. }
  255. return s.filterChain.reset().DmStatementCheckNamedValue(s, nv)
  256. }
  257. func (st *DmStatement) prepare() error {
  258. var err error
  259. if st.dmConn.dmConnector.escapeProcess {
  260. st.nativeSql, err = st.dmConn.escape(st.nativeSql, st.dmConn.dmConnector.keyWords)
  261. if err != nil {
  262. return err
  263. }
  264. }
  265. st.execInfo, err = st.dmConn.Access.Dm_build_1424(st, Dm_build_95)
  266. if err != nil {
  267. return err
  268. }
  269. st.prepared = true
  270. return nil
  271. }
  272. func (stmt *DmStatement) close() error {
  273. delete(stmt.dmConn.stmtMap, stmt.id)
  274. if stmt.closed {
  275. return nil
  276. }
  277. stmt.inUse = true
  278. return stmt.free()
  279. }
  280. func (stmt *DmStatement) numInput() int {
  281. return int(stmt.paramCount)
  282. }
  283. func (stmt *DmStatement) checkNamedValue(nv *driver.NamedValue) error {
  284. var err error
  285. var cvt = converter{stmt.dmConn, false}
  286. nv.Value, err = cvt.ConvertValue(nv.Value)
  287. stmt.isBatch = cvt.isBatch
  288. return err
  289. }
  290. func (stmt *DmStatement) exec(args []driver.Value) (*DmResult, error) {
  291. var err error
  292. stmt.inUse = true
  293. if stmt.isBatch && len(args) > 0 {
  294. var tmpArg []driver.Value
  295. var arg driver.Value
  296. for i := len(args) - 1; i >= 0; i-- {
  297. if args[i] != nil {
  298. arg = args[i]
  299. break
  300. }
  301. }
  302. for _, row := range arg.([][]interface{}) {
  303. tmpArg = append(tmpArg, row)
  304. }
  305. err = stmt.executeBatch(tmpArg)
  306. } else {
  307. err = stmt.executeInner(args, Dm_build_97)
  308. }
  309. if err != nil {
  310. return nil, err
  311. }
  312. return newDmResult(stmt, stmt.execInfo), nil
  313. }
  314. func (stmt *DmStatement) execContext(ctx context.Context, args []driver.NamedValue) (*DmResult, error) {
  315. stmt.inUse = true
  316. dargs, err := namedValueToValue(stmt, args)
  317. if err != nil {
  318. return nil, err
  319. }
  320. if err := stmt.dmConn.watchCancel(ctx); err != nil {
  321. return nil, err
  322. }
  323. defer stmt.dmConn.finish()
  324. return stmt.exec(dargs)
  325. }
  326. func (stmt *DmStatement) query(args []driver.Value) (*DmRows, error) {
  327. var err error
  328. stmt.inUse = true
  329. err = stmt.executeInner(args, Dm_build_96)
  330. if err != nil {
  331. return nil, err
  332. }
  333. if stmt.execInfo.hasResultSet {
  334. return newDmRows(newInnerRows(0, stmt, stmt.execInfo)), nil
  335. } else {
  336. return newDmRows(newLocalInnerRows(stmt, nil, nil)), nil
  337. }
  338. }
  339. func (stmt *DmStatement) queryContext(ctx context.Context, args []driver.NamedValue) (*DmRows, error) {
  340. stmt.inUse = true
  341. dargs, err := namedValueToValue(stmt, args)
  342. if err != nil {
  343. return nil, err
  344. }
  345. if err := stmt.dmConn.watchCancel(ctx); err != nil {
  346. return nil, err
  347. }
  348. defer stmt.dmConn.finish()
  349. rows, err := stmt.query(dargs)
  350. if err != nil {
  351. stmt.dmConn.finish()
  352. return nil, err
  353. }
  354. rows.finish = stmt.dmConn.finish
  355. return rows, err
  356. }
  357. func NewDmStmt(conn *DmConnection, sql string) (*DmStatement, error) {
  358. var s *DmStatement
  359. if s == nil {
  360. s = new(DmStatement)
  361. s.resetFilterable(&conn.filterable)
  362. s.objId = -1
  363. s.idGenerator = dmStmtIDGenerator
  364. s.dmConn = conn
  365. s.maxRows = int64(conn.dmConnector.maxRows)
  366. s.nativeSql = sql
  367. s.rsMap = make(map[int16]*innerRows)
  368. s.inUse = true
  369. s.isBatch = conn.isBatch
  370. err := conn.Access.Dm_build_1406(s)
  371. if err != nil {
  372. return nil, err
  373. }
  374. conn.stmtMap[s.id] = s
  375. }
  376. return s, nil
  377. }
  378. func (stmt *DmStatement) checkClosed() error {
  379. if stmt.dmConn.closed.IsSet() {
  380. return driver.ErrBadConn
  381. } else if stmt.closed {
  382. return ECGO_STATEMENT_HANDLE_CLOSED.throw()
  383. }
  384. return nil
  385. }
  386. func (stmt *DmStatement) free() error {
  387. delete(stmt.dmConn.stmtMap, stmt.id)
  388. for _, rs := range stmt.rsMap {
  389. rs.Close()
  390. }
  391. err := stmt.dmConn.Access.Dm_build_1411(int32(stmt.id))
  392. if err != nil {
  393. return err
  394. }
  395. stmt.inUse = false
  396. stmt.closed = true
  397. return nil
  398. }
  399. func bindInParam(stmt *DmStatement, i int, dtype int32, firstRow bool) {
  400. if !firstRow {
  401. return
  402. }
  403. isNil := dtype == NULL
  404. serverParam := &stmt.serverParams[i]
  405. bindParam := &stmt.bindParams[i]
  406. if serverParam == nil {
  407. bindParam.resetType(dtype)
  408. } else {
  409. bindParam.name = serverParam.name
  410. bindParam.typeDescriptor = serverParam.typeDescriptor
  411. bindParam.mask = serverParam.mask
  412. bindParam.typeFlag = serverParam.typeFlag
  413. if (serverParam.colType != UNKNOWN && (isNil || serverParam.typeFlag == TYPE_FLAG_EXACT)) || serverParam.mask != 0 {
  414. bindParam.colType = serverParam.colType
  415. bindParam.prec = serverParam.prec
  416. bindParam.scale = serverParam.scale
  417. bindParam.mask = serverParam.mask
  418. } else {
  419. bindParam.resetType(dtype)
  420. }
  421. }
  422. if bindParam.ioType == IO_TYPE_OUT || bindParam.ioType == IO_TYPE_INOUT {
  423. bindParam.ioType = IO_TYPE_INOUT
  424. } else {
  425. bindParam.ioType = IO_TYPE_IN
  426. }
  427. }
  428. func checkBindParameters(stmt *DmStatement, bytes []interface{}) error {
  429. for i := 0; int32(i) < stmt.paramCount; i++ {
  430. if stmt.bindParams[i].ioType == IO_TYPE_UNKNOWN {
  431. if stmt.serverParams[i].ioType == IO_TYPE_OUT {
  432. bytes[i] = nil
  433. } else {
  434. return ECGO_UNBINDED_PARAMETER.throw()
  435. }
  436. }
  437. if stmt.bindParams[i].colType == CURSOR {
  438. stmt.bindParams[i].ioType = IO_TYPE_INOUT
  439. continue
  440. }
  441. if stmt.serverParams[i].ioType != stmt.bindParams[i].ioType {
  442. stmt.bindParams[i].ioType = stmt.serverParams[i].ioType
  443. }
  444. }
  445. for i := 0; int32(i) < stmt.paramCount; i++ {
  446. if stmt.bindParams[i].ioType == IO_TYPE_INOUT || stmt.bindParams[i].ioType == IO_TYPE_OUT {
  447. continue
  448. }
  449. switch stmt.bindParams[i].colType {
  450. case CHAR, VARCHAR, VARCHAR2:
  451. length := -1
  452. if b, ok := bytes[i].([]byte); ok {
  453. length = len(b)
  454. }
  455. if length > VARCHAR_PREC {
  456. return ECGO_STRING_CUT.throw()
  457. }
  458. if length > int(stmt.bindParams[i].prec) {
  459. if length < VARCHAR_PREC/4 {
  460. stmt.bindParams[i].prec = VARCHAR_PREC / 4
  461. } else if length < VARCHAR_PREC/2 {
  462. stmt.bindParams[i].prec = VARCHAR_PREC / 2
  463. } else if length < VARCHAR_PREC*3/4 {
  464. stmt.bindParams[i].prec = VARCHAR_PREC * 3 / 4
  465. } else {
  466. stmt.bindParams[i].prec = VARCHAR_PREC
  467. }
  468. }
  469. }
  470. }
  471. return nil
  472. }
  473. func bindOutParam(stmt *DmStatement, i int, dtype int32) error {
  474. var err error
  475. serverParam := &stmt.serverParams[i]
  476. bindParam := &stmt.bindParams[i]
  477. if bindParam.ioType == IO_TYPE_OUT || bindParam.ioType == IO_TYPE_UNKNOWN {
  478. if serverParam == nil {
  479. bindParam.resetType(dtype)
  480. } else {
  481. bindParam.name = serverParam.name
  482. bindParam.typeDescriptor = serverParam.typeDescriptor
  483. bindParam.mask = serverParam.mask
  484. bindParam.typeFlag = serverParam.typeFlag
  485. if (serverParam.colType != UNKNOWN && serverParam.typeFlag == TYPE_FLAG_EXACT) || serverParam.mask != 0 {
  486. bindParam.colType = serverParam.colType
  487. bindParam.prec = serverParam.prec
  488. bindParam.scale = serverParam.scale
  489. bindParam.mask = serverParam.mask
  490. } else {
  491. bindParam.resetType(dtype)
  492. }
  493. }
  494. if bindParam.colType == CURSOR {
  495. bindParam.ioType = IO_TYPE_INOUT
  496. if bindParam.cursorStmt == nil {
  497. bindParam.cursorStmt = &DmStatement{dmConn: stmt.dmConn}
  498. bindParam.cursorStmt.resetFilterable(&stmt.dmConn.filterable)
  499. err = bindParam.cursorStmt.dmConn.Access.Dm_build_1406(bindParam.cursorStmt)
  500. }
  501. }
  502. }
  503. if bindParam.ioType == IO_TYPE_IN || bindParam.ioType == IO_TYPE_INOUT {
  504. bindParam.ioType = IO_TYPE_INOUT
  505. } else {
  506. bindParam.ioType = IO_TYPE_OUT
  507. }
  508. return err
  509. }
  510. func encodeArgs(stmt *DmStatement, args []driver.Value, firstRow bool) ([]interface{}, error) {
  511. bytes := make([]interface{}, len(args), len(args))
  512. var err error
  513. for i, arg := range args {
  514. nextSwitch:
  515. if stmt.serverParams[i].colType == CURSOR {
  516. bindInParam(stmt, i, CURSOR, firstRow)
  517. if stmt.bindParams[i].cursorStmt == nil {
  518. stmt.bindParams[i].cursorStmt = &DmStatement{dmConn: stmt.dmConn}
  519. stmt.bindParams[i].cursorStmt.resetFilterable(&stmt.dmConn.filterable)
  520. err = stmt.bindParams[i].cursorStmt.dmConn.Access.Dm_build_1406(stmt.bindParams[i].cursorStmt)
  521. }
  522. stmt.bindParams[i].ioType = IO_TYPE_INOUT
  523. continue
  524. }
  525. if arg == nil {
  526. bindInParam(stmt, i, NULL, firstRow)
  527. bytes[i] = nil
  528. continue
  529. }
  530. switch v := arg.(type) {
  531. case bool:
  532. bindInParam(stmt, i, TINYINT, firstRow)
  533. bytes[i], err = G2DB.fromBool(v, stmt.bindParams[i], stmt.dmConn)
  534. case int8:
  535. bindInParam(stmt, i, TINYINT, firstRow)
  536. bytes[i], err = G2DB.fromInt64(int64(v), stmt.bindParams[i], stmt.dmConn)
  537. case int16:
  538. bindInParam(stmt, i, SMALLINT, firstRow)
  539. bytes[i], err = G2DB.fromInt64(int64(v), stmt.bindParams[i], stmt.dmConn)
  540. case int32:
  541. bindInParam(stmt, i, INT, firstRow)
  542. bytes[i], err = G2DB.fromInt64(int64(v), stmt.bindParams[i], stmt.dmConn)
  543. case int64:
  544. bindInParam(stmt, i, BIGINT, firstRow)
  545. bytes[i], err = G2DB.fromInt64(int64(v), stmt.bindParams[i], stmt.dmConn)
  546. case int:
  547. bindInParam(stmt, i, BIGINT, firstRow)
  548. bytes[i], err = G2DB.fromInt64(int64(v), stmt.bindParams[i], stmt.dmConn)
  549. case uint8:
  550. bindInParam(stmt, i, SMALLINT, firstRow)
  551. bytes[i], err = G2DB.fromInt64(int64(v), stmt.bindParams[i], stmt.dmConn)
  552. case uint16:
  553. bindInParam(stmt, i, INT, firstRow)
  554. bytes[i], err = G2DB.fromInt64(int64(v), stmt.bindParams[i], stmt.dmConn)
  555. case uint32:
  556. bindInParam(stmt, i, BIGINT, firstRow)
  557. bytes[i], err = G2DB.fromInt64(int64(v), stmt.bindParams[i], stmt.dmConn)
  558. case float32:
  559. bindInParam(stmt, i, REAL, firstRow)
  560. bytes[i], err = G2DB.fromFloat32(v, stmt.bindParams[i], stmt.dmConn)
  561. case float64:
  562. bindInParam(stmt, i, DOUBLE, firstRow)
  563. bytes[i], err = G2DB.fromFloat64(float64(v), stmt.bindParams[i], stmt.dmConn)
  564. case []byte:
  565. if v == nil {
  566. bindInParam(stmt, i, NULL, firstRow)
  567. bytes[i] = nil
  568. } else {
  569. dtype := VARBINARY
  570. if len(v) >= VARBINARY_PREC {
  571. dtype = BLOB
  572. }
  573. bindInParam(stmt, i, int32(dtype), firstRow)
  574. bytes[i], err = G2DB.fromBytes(v, stmt.bindParams[i], stmt.dmConn)
  575. }
  576. case string:
  577. if v == "" && emptyStringToNil(stmt.serverParams[i].colType) {
  578. arg = nil
  579. goto nextSwitch
  580. }
  581. dtype := VARCHAR
  582. if len(v) >= VARCHAR_PREC {
  583. dtype = CLOB
  584. }
  585. bindInParam(stmt, i, int32(dtype), firstRow)
  586. bytes[i], err = G2DB.fromString(v, stmt.bindParams[i], stmt.dmConn)
  587. case time.Time:
  588. bindInParam(stmt, i, DATETIME, firstRow)
  589. bytes[i], err = G2DB.fromTime(v, stmt.bindParams[i], stmt.dmConn)
  590. case DmTimestamp:
  591. bindInParam(stmt, i, DATETIME, firstRow)
  592. bytes[i], err = G2DB.fromTime(v.ToTime(), stmt.bindParams[i], stmt.dmConn)
  593. case DmIntervalDT:
  594. bindInParam(stmt, i, INTERVAL_DT, firstRow)
  595. if stmt.bindParams[i].typeFlag != TYPE_FLAG_EXACT {
  596. stmt.bindParams[i].scale = int32(v.scaleForSvr)
  597. }
  598. bytes[i], err = G2DB.fromDmIntervalDT(v, stmt.bindParams[i], stmt.dmConn)
  599. case DmIntervalYM:
  600. bindInParam(stmt, i, INTERVAL_YM, firstRow)
  601. if stmt.bindParams[i].typeFlag != TYPE_FLAG_EXACT {
  602. stmt.bindParams[i].scale = int32(v.scaleForSvr)
  603. }
  604. bytes[i], err = G2DB.fromDmdbIntervalYM(v, stmt.bindParams[i], stmt.dmConn)
  605. case DmDecimal:
  606. bindInParam(stmt, i, DECIMAL, firstRow)
  607. bytes[i], err = G2DB.fromDecimal(v, stmt.bindParams[i], stmt.dmConn)
  608. case DmBlob:
  609. bindInParam(stmt, i, BLOB, firstRow)
  610. bytes[i], err = G2DB.fromBlob(DmBlob(v), stmt.bindParams[i], stmt.dmConn)
  611. if err != nil {
  612. return nil, err
  613. }
  614. case DmClob:
  615. bindInParam(stmt, i, CLOB, firstRow)
  616. bytes[i], err = G2DB.fromClob(DmClob(v), stmt.bindParams[i], stmt.dmConn)
  617. if err != nil {
  618. return nil, err
  619. }
  620. case DmArray:
  621. bindInParam(stmt, i, ARRAY, firstRow)
  622. da := &v
  623. da, err = da.create(stmt.dmConn)
  624. if err != nil {
  625. return nil, err
  626. }
  627. bytes[i], err = G2DB.fromArray(da, stmt.bindParams[i], stmt.dmConn)
  628. case DmStruct:
  629. bindInParam(stmt, i, CLASS, firstRow)
  630. ds := &v
  631. ds, err = ds.create(stmt.dmConn)
  632. if err != nil {
  633. return nil, err
  634. }
  635. bytes[i], err = G2DB.fromStruct(ds, stmt.bindParams[i], stmt.dmConn)
  636. case sql.Out:
  637. var cvt = converter{stmt.dmConn, false}
  638. if arg, err = cvt.ConvertValue(v.Dest); err != nil {
  639. return nil, err
  640. }
  641. goto nextSwitch
  642. case *DmTimestamp:
  643. bindInParam(stmt, i, DATETIME, firstRow)
  644. bytes[i], err = G2DB.fromTime(v.ToTime(), stmt.bindParams[i], stmt.dmConn)
  645. case *DmIntervalDT:
  646. bindInParam(stmt, i, INTERVAL_DT, firstRow)
  647. if stmt.bindParams[i].typeFlag != TYPE_FLAG_EXACT {
  648. stmt.bindParams[i].scale = int32(v.scaleForSvr)
  649. }
  650. bytes[i], err = G2DB.fromDmIntervalDT(*v, stmt.bindParams[i], stmt.dmConn)
  651. case *DmIntervalYM:
  652. bindInParam(stmt, i, INTERVAL_YM, firstRow)
  653. if stmt.bindParams[i].typeFlag != TYPE_FLAG_EXACT {
  654. stmt.bindParams[i].scale = int32(v.scaleForSvr)
  655. }
  656. bytes[i], err = G2DB.fromDmdbIntervalYM(*v, stmt.bindParams[i], stmt.dmConn)
  657. case *DmDecimal:
  658. bindInParam(stmt, i, DECIMAL, firstRow)
  659. bytes[i], err = G2DB.fromDecimal(*v, stmt.bindParams[i], stmt.dmConn)
  660. case *DmBlob:
  661. bindInParam(stmt, i, BLOB, firstRow)
  662. bytes[i], err = G2DB.fromBlob(DmBlob(*v), stmt.bindParams[i], stmt.dmConn)
  663. case *DmClob:
  664. bindInParam(stmt, i, CLOB, firstRow)
  665. bytes[i], err = G2DB.fromClob(DmClob(*v), stmt.bindParams[i], stmt.dmConn)
  666. case *DmArray:
  667. bindInParam(stmt, i, ARRAY, firstRow)
  668. v, err = v.create(stmt.dmConn)
  669. if err != nil {
  670. return nil, err
  671. }
  672. bytes[i], err = G2DB.fromArray(v, stmt.bindParams[i], stmt.dmConn)
  673. case *DmStruct:
  674. bindInParam(stmt, i, CLASS, firstRow)
  675. v, err = v.create(stmt.dmConn)
  676. if err != nil {
  677. return nil, err
  678. }
  679. bytes[i], err = G2DB.fromStruct(v, stmt.bindParams[i], stmt.dmConn)
  680. case *driver.Rows:
  681. if stmt.serverParams[i].colType == CURSOR {
  682. bindInParam(stmt, i, CURSOR, firstRow)
  683. if stmt.bindParams[i].cursorStmt == nil {
  684. stmt.bindParams[i].cursorStmt = &DmStatement{dmConn: stmt.dmConn}
  685. stmt.bindParams[i].cursorStmt.resetFilterable(&stmt.dmConn.filterable)
  686. err = stmt.bindParams[i].cursorStmt.dmConn.Access.Dm_build_1406(stmt.bindParams[i].cursorStmt)
  687. }
  688. }
  689. case io.Reader:
  690. bindInParam(stmt, i, stmt.serverParams[i].colType, firstRow)
  691. bytes[i], err = G2DB.fromReader(io.Reader(v), stmt.serverParams[i], stmt.dmConn)
  692. if err != nil {
  693. return nil, err
  694. }
  695. default:
  696. err = ECGO_UNSUPPORTED_INPARAM_TYPE.throw()
  697. }
  698. if err != nil {
  699. return nil, err
  700. }
  701. }
  702. checkBindParameters(stmt, bytes)
  703. return bytes, nil
  704. }
  705. type converter struct {
  706. conn *DmConnection
  707. isBatch bool
  708. }
  709. type decimalDecompose interface {
  710. Decompose(buf []byte) (form byte, negative bool, coefficient []byte, exponent int32)
  711. }
  712. func (c *converter) ConvertValue(v interface{}) (driver.Value, error) {
  713. if driver.IsValue(v) {
  714. return v, nil
  715. }
  716. switch vr := v.(type) {
  717. case driver.Valuer:
  718. sv, err := callValuerValue(vr)
  719. if err != nil {
  720. return nil, err
  721. }
  722. return sv, nil
  723. case decimalDecompose, DmDecimal, *DmDecimal, DmTimestamp, *DmTimestamp, DmIntervalDT, *DmIntervalDT,
  724. DmIntervalYM, *DmIntervalYM, driver.Rows, *driver.Rows, DmArray, *DmArray, DmStruct, *DmStruct, sql.Out:
  725. return vr, nil
  726. case big.Int:
  727. return NewDecimalFromBigInt(&vr)
  728. case big.Float:
  729. return NewDecimalFromBigFloat(&vr)
  730. case DmClob:
  731. if vr.connection == nil {
  732. vr.connection = c.conn
  733. }
  734. return vr, nil
  735. case *DmClob:
  736. if vr.connection == nil {
  737. vr.connection = c.conn
  738. }
  739. return vr, nil
  740. case DmBlob:
  741. if vr.connection == nil {
  742. vr.connection = c.conn
  743. }
  744. return vr, nil
  745. case *DmBlob:
  746. if vr.connection == nil {
  747. vr.connection = c.conn
  748. }
  749. return vr, nil
  750. case io.Reader:
  751. return vr, nil
  752. }
  753. rv := reflect.ValueOf(v)
  754. switch rv.Kind() {
  755. case reflect.Ptr:
  756. if rv.IsNil() {
  757. return nil, nil
  758. } else {
  759. return c.ConvertValue(rv.Elem().Interface())
  760. }
  761. case reflect.Int:
  762. return rv.Int(), nil
  763. case reflect.Int8:
  764. return int8(rv.Int()), nil
  765. case reflect.Int16:
  766. return int16(rv.Int()), nil
  767. case reflect.Int32:
  768. return int32(rv.Int()), nil
  769. case reflect.Int64:
  770. return int64(rv.Int()), nil
  771. case reflect.Uint8:
  772. return uint8(rv.Uint()), nil
  773. case reflect.Uint16:
  774. return uint16(rv.Uint()), nil
  775. case reflect.Uint32:
  776. return uint32(rv.Uint()), nil
  777. case reflect.Uint64, reflect.Uint:
  778. u64 := rv.Uint()
  779. if u64 >= 1<<63 {
  780. bigInt := &big.Int{}
  781. bigInt.SetString(strconv.FormatUint(u64, 10), 10)
  782. return NewDecimalFromBigInt(bigInt)
  783. }
  784. return int64(u64), nil
  785. case reflect.Float32:
  786. return float32(rv.Float()), nil
  787. case reflect.Float64:
  788. return float64(rv.Float()), nil
  789. case reflect.Bool:
  790. return rv.Bool(), nil
  791. case reflect.Slice:
  792. ek := rv.Type().Elem().Kind()
  793. if ek == reflect.Uint8 {
  794. return rv.Bytes(), nil
  795. } else if ek == reflect.Slice {
  796. c.isBatch = true
  797. return v, nil
  798. }
  799. return nil, fmt.Errorf("unsupported type %T, a slice of %s", v, ek)
  800. case reflect.String:
  801. return rv.String(), nil
  802. }
  803. return nil, fmt.Errorf("unsupported type %T, a %s", v, rv.Kind())
  804. }
  805. var valuerReflectType = reflect.TypeOf((*driver.Valuer)(nil)).Elem()
  806. func callValuerValue(vr driver.Valuer) (v driver.Value, err error) {
  807. if rv := reflect.ValueOf(vr); rv.Kind() == reflect.Ptr &&
  808. rv.IsNil() &&
  809. rv.Type().Elem().Implements(valuerReflectType) {
  810. return nil, nil
  811. }
  812. return vr.Value()
  813. }
  814. func namedValueToValue(stmt *DmStatement, named []driver.NamedValue) ([]driver.Value, error) {
  815. dargs := make([]driver.Value, stmt.paramCount)
  816. for i, _ := range dargs {
  817. found := false
  818. for _, nv := range named {
  819. if nv.Name != "" && strings.ToUpper(nv.Name) == strings.ToUpper(stmt.serverParams[i].name) {
  820. dargs[i] = nv.Value
  821. found = true
  822. break
  823. }
  824. }
  825. if !found && i < len(named) {
  826. dargs[i] = named[i].Value
  827. }
  828. }
  829. return dargs, nil
  830. }
  831. func (stmt *DmStatement) executeInner(args []driver.Value, executeType int16) (err error) {
  832. var bytes []interface{}
  833. if stmt.paramCount > 0 {
  834. bytes, err = encodeArgs(stmt, args, true)
  835. if err != nil {
  836. return err
  837. }
  838. }
  839. stmt.execInfo, err = stmt.dmConn.Access.Dm_build_1456(stmt, bytes, false)
  840. if err != nil {
  841. return err
  842. }
  843. if stmt.execInfo.outParamDatas != nil {
  844. for i, outParamData := range stmt.execInfo.outParamDatas {
  845. if stmt.bindParams[i].ioType == IO_TYPE_IN || stmt.bindParams[i].ioType == IO_TYPE_UNKNOWN {
  846. continue
  847. }
  848. var v sql.Out
  849. ok := true
  850. for ok {
  851. if v, ok = args[i].(sql.Out); ok {
  852. args[i] = v.Dest
  853. }
  854. }
  855. if sc, ok := args[i].(sql.Scanner); ok {
  856. var v interface{}
  857. if outParamData == nil && stmt.bindParams[i].colType != CURSOR {
  858. v = nil
  859. if err = sc.Scan(v); err != nil {
  860. return err
  861. }
  862. continue
  863. }
  864. switch stmt.bindParams[i].colType {
  865. case BOOLEAN:
  866. v, err = DB2G.toBool(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  867. case BIT:
  868. if strings.ToLower(stmt.bindParams[i].typeName) == "boolean" {
  869. v, err = DB2G.toBool(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  870. }
  871. v, err = DB2G.toInt8(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  872. case TINYINT:
  873. v, err = DB2G.toInt8(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  874. case SMALLINT:
  875. v, err = DB2G.toInt16(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  876. case INT:
  877. v, err = DB2G.toInt32(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  878. case BIGINT:
  879. v, err = DB2G.toInt64(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  880. case REAL:
  881. v, err = DB2G.toFloat32(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  882. case DOUBLE:
  883. v, err = DB2G.toFloat64(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  884. case DATE, TIME, DATETIME, TIME_TZ, DATETIME_TZ, DATETIME2, DATETIME2_TZ:
  885. v, err = DB2G.toTime(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  886. case INTERVAL_DT:
  887. v = newDmIntervalDTByBytes(outParamData)
  888. case INTERVAL_YM:
  889. v = newDmIntervalYMByBytes(outParamData)
  890. case DECIMAL:
  891. v, err = DB2G.toDmDecimal(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  892. case BINARY, VARBINARY:
  893. v = util.StringUtil.BytesToHexString(outParamData, false)
  894. case BLOB:
  895. v = DB2G.toDmBlob(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  896. case CHAR, VARCHAR2, VARCHAR:
  897. v = DB2G.toString(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  898. case CLOB:
  899. v = DB2G.toDmClob(outParamData, stmt.dmConn, &stmt.bindParams[i].column)
  900. case ARRAY:
  901. v, err = TypeDataSV.bytesToArray(outParamData, nil, stmt.bindParams[i].typeDescriptor)
  902. case CLASS:
  903. v, err = TypeDataSV.bytesToObj(outParamData, nil, stmt.bindParams[i].typeDescriptor)
  904. case CURSOR:
  905. var tmpExecInfo *execRetInfo
  906. if tmpExecInfo, err = stmt.dmConn.Access.Dm_build_1466(stmt.bindParams[i].cursorStmt, 1); err != nil {
  907. return err
  908. }
  909. if tmpExecInfo.hasResultSet {
  910. v = newDmRows(newInnerRows(0, stmt.bindParams[i].cursorStmt, tmpExecInfo))
  911. }
  912. default:
  913. err = ECGO_UNSUPPORTED_OUTPARAM_TYPE.throw()
  914. }
  915. if err == nil {
  916. err = sc.Scan(v)
  917. }
  918. } else if args[i] == nil {
  919. if outParamData == nil && stmt.bindParams[i].colType != CURSOR {
  920. continue
  921. }
  922. switch stmt.bindParams[i].colType {
  923. case BOOLEAN:
  924. args[i], err = DB2G.toBool(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  925. case BIT:
  926. if strings.ToLower(stmt.bindParams[i].typeName) == "boolean" {
  927. args[i], err = DB2G.toBool(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  928. }
  929. args[i], err = DB2G.toInt8(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  930. case TINYINT:
  931. args[i], err = DB2G.toInt8(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  932. case SMALLINT:
  933. args[i], err = DB2G.toInt16(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  934. case INT:
  935. args[i], err = DB2G.toInt32(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  936. case BIGINT:
  937. args[i], err = DB2G.toInt64(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  938. case REAL:
  939. args[i], err = DB2G.toFloat32(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  940. case DOUBLE:
  941. args[i], err = DB2G.toFloat64(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  942. case DATE, TIME, DATETIME, TIME_TZ, DATETIME_TZ, DATETIME2, DATETIME2_TZ:
  943. args[i], err = DB2G.toTime(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  944. case INTERVAL_DT:
  945. args[i] = newDmIntervalDTByBytes(outParamData)
  946. case INTERVAL_YM:
  947. args[i] = newDmIntervalYMByBytes(outParamData)
  948. case DECIMAL:
  949. args[i], err = DB2G.toDmDecimal(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  950. case BINARY, VARBINARY:
  951. args[i] = util.StringUtil.BytesToHexString(outParamData, false)
  952. case BLOB:
  953. args[i] = DB2G.toDmBlob(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  954. case CHAR, VARCHAR2, VARCHAR:
  955. args[i] = DB2G.toString(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  956. case CLOB:
  957. args[i] = DB2G.toDmClob(outParamData, stmt.dmConn, &stmt.bindParams[i].column)
  958. default:
  959. err = ECGO_UNSUPPORTED_OUTPARAM_TYPE.throw()
  960. }
  961. } else {
  962. switch v := args[i].(type) {
  963. case *string:
  964. if outParamData == nil {
  965. *v = ""
  966. } else {
  967. *v = DB2G.toString(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  968. }
  969. case *sql.NullString:
  970. if outParamData == nil {
  971. v.String = ""
  972. v.Valid = false
  973. } else {
  974. v.String = DB2G.toString(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  975. v.Valid = true
  976. }
  977. case *[]byte:
  978. if outParamData == nil {
  979. *v = nil
  980. } else {
  981. var val []byte
  982. if val, err = DB2G.toBytes(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  983. return err
  984. }
  985. *v = val
  986. }
  987. case *bool:
  988. if outParamData == nil {
  989. *v = false
  990. } else {
  991. var val bool
  992. if val, err = DB2G.toBool(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  993. return err
  994. }
  995. *v = val
  996. }
  997. case *sql.NullBool:
  998. if outParamData == nil {
  999. v.Bool = false
  1000. v.Valid = false
  1001. } else {
  1002. var val bool
  1003. if val, err = DB2G.toBool(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1004. return err
  1005. }
  1006. v.Bool = val
  1007. v.Valid = true
  1008. }
  1009. case *int8:
  1010. if outParamData == nil {
  1011. *v = 0
  1012. } else {
  1013. var val int8
  1014. if val, err = DB2G.toInt8(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1015. return err
  1016. }
  1017. *v = val
  1018. }
  1019. case *int16:
  1020. if outParamData == nil {
  1021. *v = 0
  1022. } else {
  1023. var val int16
  1024. if val, err = DB2G.toInt16(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1025. return err
  1026. }
  1027. *v = val
  1028. }
  1029. case *int32:
  1030. if outParamData == nil {
  1031. *v = 0
  1032. } else {
  1033. var val int32
  1034. if val, err = DB2G.toInt32(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1035. return err
  1036. }
  1037. *v = val
  1038. }
  1039. case *sql.NullInt32:
  1040. if outParamData == nil {
  1041. v.Int32 = 0
  1042. v.Valid = false
  1043. } else {
  1044. var val int32
  1045. if val, err = DB2G.toInt32(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1046. return err
  1047. }
  1048. v.Int32 = val
  1049. v.Valid = true
  1050. }
  1051. case *int64:
  1052. if outParamData == nil {
  1053. *v = 0
  1054. } else {
  1055. var val int64
  1056. if val, err = DB2G.toInt64(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1057. return err
  1058. }
  1059. *v = val
  1060. }
  1061. case *sql.NullInt64:
  1062. if outParamData == nil {
  1063. v.Int64 = 0
  1064. v.Valid = false
  1065. } else {
  1066. var val int64
  1067. if val, err = DB2G.toInt64(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1068. return err
  1069. }
  1070. v.Int64 = val
  1071. v.Valid = true
  1072. }
  1073. case *uint8:
  1074. if outParamData == nil {
  1075. *v = 0
  1076. } else {
  1077. var val uint8
  1078. if val, err = DB2G.toByte(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1079. return err
  1080. }
  1081. *v = val
  1082. }
  1083. case *uint16:
  1084. if outParamData == nil {
  1085. *v = 0
  1086. } else {
  1087. var val uint16
  1088. if val, err = DB2G.toUInt16(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1089. return err
  1090. }
  1091. *v = val
  1092. }
  1093. case *uint32:
  1094. if outParamData == nil {
  1095. *v = 0
  1096. } else {
  1097. var val uint32
  1098. if val, err = DB2G.toUInt32(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1099. return err
  1100. }
  1101. *v = val
  1102. }
  1103. case *uint64:
  1104. if outParamData == nil {
  1105. *v = 0
  1106. } else {
  1107. var val uint64
  1108. if val, err = DB2G.toUInt64(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1109. return err
  1110. }
  1111. *v = val
  1112. }
  1113. case *int:
  1114. if outParamData == nil {
  1115. *v = 0
  1116. } else {
  1117. var val int
  1118. if val, err = DB2G.toInt(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1119. return err
  1120. }
  1121. *v = val
  1122. }
  1123. case *uint:
  1124. if outParamData == nil {
  1125. *v = 0
  1126. } else {
  1127. var val uint
  1128. if val, err = DB2G.toUInt(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1129. return err
  1130. }
  1131. *v = val
  1132. }
  1133. case *float32:
  1134. if outParamData == nil {
  1135. *v = 0.0
  1136. } else {
  1137. var val float32
  1138. if val, err = DB2G.toFloat32(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1139. return err
  1140. }
  1141. *v = val
  1142. }
  1143. case *float64:
  1144. if outParamData == nil {
  1145. *v = 0.0
  1146. } else {
  1147. var val float64
  1148. if val, err = DB2G.toFloat64(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1149. return err
  1150. }
  1151. *v = val
  1152. }
  1153. case *sql.NullFloat64:
  1154. if outParamData == nil {
  1155. v.Float64 = 0.0
  1156. v.Valid = false
  1157. } else {
  1158. var val float64
  1159. if val, err = DB2G.toFloat64(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1160. return err
  1161. }
  1162. v.Float64 = val
  1163. v.Valid = true
  1164. }
  1165. case *time.Time:
  1166. if outParamData == nil {
  1167. *v = time.Time{}
  1168. } else {
  1169. var val time.Time
  1170. if val, err = DB2G.toTime(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1171. return err
  1172. }
  1173. *v = val
  1174. }
  1175. case *sql.NullTime:
  1176. if outParamData == nil {
  1177. v.Time = time.Time{}
  1178. v.Valid = false
  1179. } else {
  1180. var val time.Time
  1181. if val, err = DB2G.toTime(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1182. return err
  1183. }
  1184. v.Time = val
  1185. v.Valid = true
  1186. }
  1187. case *DmTimestamp:
  1188. if outParamData == nil {
  1189. *v = DmTimestamp{}
  1190. } else {
  1191. *v = *newDmTimestampFromBytes(outParamData, stmt.bindParams[i].column, stmt.dmConn)
  1192. }
  1193. case *DmIntervalDT:
  1194. if outParamData == nil {
  1195. *v = DmIntervalDT{}
  1196. } else {
  1197. *v = *newDmIntervalDTByBytes(outParamData)
  1198. }
  1199. case *DmIntervalYM:
  1200. if outParamData == nil {
  1201. *v = DmIntervalYM{}
  1202. } else {
  1203. *v = *newDmIntervalYMByBytes(outParamData)
  1204. }
  1205. case *DmDecimal:
  1206. if outParamData == nil {
  1207. *v = DmDecimal{}
  1208. } else {
  1209. var val *DmDecimal
  1210. if val, err = DB2G.toDmDecimal(outParamData, &stmt.bindParams[i].column, stmt.dmConn); err != nil {
  1211. return err
  1212. }
  1213. *v = *val
  1214. }
  1215. case *DmBlob:
  1216. if outParamData == nil {
  1217. *v = DmBlob{}
  1218. } else {
  1219. *v = *DB2G.toDmBlob(outParamData, &stmt.bindParams[i].column, stmt.dmConn)
  1220. }
  1221. case *DmClob:
  1222. if outParamData == nil {
  1223. *v = DmClob{}
  1224. } else {
  1225. *v = *DB2G.toDmClob(outParamData, stmt.dmConn, &stmt.bindParams[i].column)
  1226. }
  1227. case *driver.Rows:
  1228. if stmt.bindParams[i].colType == CURSOR {
  1229. var tmpExecInfo *execRetInfo
  1230. tmpExecInfo, err = stmt.dmConn.Access.Dm_build_1466(stmt.bindParams[i].cursorStmt, 1)
  1231. if err != nil {
  1232. return err
  1233. }
  1234. if tmpExecInfo.hasResultSet {
  1235. *v = newDmRows(newInnerRows(0, stmt.bindParams[i].cursorStmt, tmpExecInfo))
  1236. } else {
  1237. *v = nil
  1238. }
  1239. }
  1240. case *DmArray:
  1241. if outParamData == nil {
  1242. *v = DmArray{}
  1243. } else {
  1244. var val *DmArray
  1245. if val, err = TypeDataSV.bytesToArray(outParamData, nil, stmt.bindParams[i].typeDescriptor); err != nil {
  1246. return err
  1247. }
  1248. *v = *val
  1249. }
  1250. case *DmStruct:
  1251. if outParamData == nil {
  1252. *v = DmStruct{}
  1253. } else {
  1254. var tmp interface{}
  1255. if tmp, err = TypeDataSV.bytesToObj(outParamData, nil, stmt.bindParams[i].typeDescriptor); err != nil {
  1256. return err
  1257. }
  1258. if val, ok := tmp.(*DmStruct); ok {
  1259. *v = *val
  1260. }
  1261. }
  1262. default:
  1263. err = ECGO_UNSUPPORTED_OUTPARAM_TYPE.throw()
  1264. }
  1265. }
  1266. if err != nil {
  1267. return err
  1268. }
  1269. }
  1270. }
  1271. return err
  1272. }
  1273. func (stmt *DmStatement) executeBatch(args []driver.Value) (err error) {
  1274. var bytes [][]interface{}
  1275. if stmt.execInfo.retSqlType == Dm_build_110 || stmt.execInfo.retSqlType == Dm_build_115 {
  1276. return ECGO_INVALID_SQL_TYPE.throw()
  1277. }
  1278. if stmt.paramCount > 0 && args != nil && len(args) > 0 {
  1279. if len(args) == 1 || stmt.dmConn.dmConnector.batchType == 2 ||
  1280. (stmt.dmConn.dmConnector.batchNotOnCall && stmt.execInfo.retSqlType == Dm_build_111) {
  1281. return stmt.executeBatchByRow(args)
  1282. } else {
  1283. for i, arg := range args {
  1284. var newArg []driver.Value
  1285. for _, a := range arg.([]interface{}) {
  1286. newArg = append(newArg, a)
  1287. }
  1288. tmpBytes, err := encodeArgs(stmt, newArg, i == 0)
  1289. if err != nil {
  1290. return err
  1291. }
  1292. bytes = append(bytes, tmpBytes)
  1293. }
  1294. stmt.execInfo, err = stmt.dmConn.Access.Dm_build_1445(stmt, bytes, stmt.preExec)
  1295. }
  1296. }
  1297. return err
  1298. }
  1299. func (stmt *DmStatement) executeBatchByRow(args []driver.Value) (err error) {
  1300. count := len(args)
  1301. stmt.execInfo = NewExceInfo()
  1302. stmt.execInfo.updateCounts = make([]int64, count)
  1303. var sqlErrBuilder strings.Builder
  1304. for i := 0; i < count; i++ {
  1305. tmpExecInfo, err := stmt.dmConn.Access.Dm_build_1456(stmt, args[i].([]interface{}), stmt.preExec || i != 0)
  1306. if err == nil {
  1307. stmt.execInfo.union(tmpExecInfo, i, 1)
  1308. } else {
  1309. stmt.execInfo.updateCounts[i] = -1
  1310. if stmt.dmConn.dmConnector.continueBatchOnError {
  1311. sqlErrBuilder.WriteString("row[" + strconv.Itoa(i) + "]:" + err.Error() + util.LINE_SEPARATOR)
  1312. } else {
  1313. return ECGO_BATCH_ERROR.addDetailln(err.Error()).throw()
  1314. }
  1315. }
  1316. }
  1317. if sqlErrBuilder.Len() > 0 {
  1318. return EC_BP_WITH_ERROR.addDetail(sqlErrBuilder.String()).throw()
  1319. }
  1320. return nil
  1321. }