u.go 38 KB

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