i.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917
  1. /*
  2. * Copyright (c) 2000-2018, 达梦数据库有限公司.
  3. * All rights reserved.
  4. */
  5. package dm
  6. import (
  7. "strconv"
  8. "time"
  9. "gitee.com/chunanyong/dm/util"
  10. )
  11. var DB2G db2g
  12. type db2g struct {
  13. }
  14. func (DB2G db2g) processVarchar2(bytes []byte, prec int) []byte {
  15. rbytes := make([]byte, prec)
  16. copy(rbytes[:len(bytes)], bytes[:])
  17. for i := len(bytes); i < len(rbytes); i++ {
  18. rbytes[i] = ' '
  19. }
  20. return rbytes
  21. }
  22. func (DB2G db2g) charToString(bytes []byte, column *column, conn *DmConnection) string {
  23. if column.colType == VARCHAR2 {
  24. bytes = DB2G.processVarchar2(bytes, int(column.prec))
  25. } else if column.colType == CLOB {
  26. clob := newClobFromDB(bytes, conn, column, true)
  27. clobLen, _ := clob.GetLength()
  28. clobStr, _ := clob.getSubString(1, int32(clobLen))
  29. return clobStr
  30. }
  31. return Dm_build_1.Dm_build_254(bytes, conn.serverEncoding, conn)
  32. }
  33. func (DB2G db2g) charToFloat64(bytes []byte, column *column, conn *DmConnection) (float64, error) {
  34. str := DB2G.charToString(bytes, column, conn)
  35. val, err := strconv.ParseFloat(str, 64)
  36. if err != nil {
  37. return 0, ECGO_DATA_CONVERTION_ERROR.throw()
  38. }
  39. return val, nil
  40. }
  41. func (DB2G db2g) charToDeciaml(bytes []byte, column *column, conn *DmConnection) (*DmDecimal, error) {
  42. str := DB2G.charToString(bytes, column, conn)
  43. return NewDecimalFromString(str)
  44. }
  45. func (DB2G db2g) BinaryToInt64(bytes []byte, column *column, conn *DmConnection) (int64, error) {
  46. if column.colType == BLOB {
  47. blob := newBlobFromDB(bytes, conn, column, true)
  48. blobLen, err := blob.GetLength()
  49. if err != nil {
  50. return 0, err
  51. }
  52. bytes, err = blob.getBytes(1, int32(blobLen))
  53. if err != nil {
  54. return 0, err
  55. }
  56. }
  57. var n, b int64 = 0, 0
  58. startIndex := 0
  59. var length int
  60. if len(bytes) > 8 {
  61. length = 8
  62. for j := 0; j < len(bytes)-8; j++ {
  63. if bytes[j] != 0 {
  64. return 0, ECGO_DATA_CONVERTION_ERROR.throw()
  65. }
  66. startIndex = len(bytes) - 8
  67. length = 8
  68. }
  69. } else {
  70. length = len(bytes)
  71. }
  72. for j := startIndex; j < startIndex+length; j++ {
  73. b = int64(0xff & bytes[j])
  74. n = b | (n << 8)
  75. }
  76. return n, nil
  77. }
  78. func (DB2G db2g) decToDecimal(bytes []byte, prec int, scale int, compatibleOracle bool) (*DmDecimal, error) {
  79. if compatibleOracle {
  80. prec = -1
  81. scale = -1
  82. }
  83. return newDecimal(bytes, prec, scale)
  84. }
  85. func (DB2G db2g) toBytes(bytes []byte, column *column, conn *DmConnection) ([]byte, error) {
  86. retBytes := Dm_build_1.Dm_build_152(bytes, 0, len(bytes))
  87. switch column.colType {
  88. case CLOB:
  89. clob := newClobFromDB(retBytes, conn, column, true)
  90. str, err := clob.getSubString(1, int32(clob.length))
  91. if err != nil {
  92. return nil, err
  93. }
  94. return Dm_build_1.Dm_build_217(str, conn.getServerEncoding(), conn), nil
  95. case BLOB:
  96. blob := newBlobFromDB(retBytes, conn, column, true)
  97. bs, err := blob.getBytes(1, int32(blob.length))
  98. if err != nil {
  99. return nil, err
  100. }
  101. return bs, nil
  102. }
  103. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  104. }
  105. func (DB2G db2g) toString(bytes []byte, column *column, conn *DmConnection) string {
  106. switch column.colType {
  107. case CHAR, VARCHAR, VARCHAR2:
  108. return DB2G.charToString(bytes, column, conn)
  109. case BIT, BOOLEAN, TINYINT:
  110. return strconv.FormatInt(int64(bytes[0]), 10)
  111. case SMALLINT:
  112. return strconv.FormatInt(int64(Dm_build_1.Dm_build_225(bytes)), 10)
  113. case INT:
  114. return strconv.FormatInt(int64(Dm_build_1.Dm_build_228(bytes)), 10)
  115. case BIGINT:
  116. return strconv.FormatInt(int64(Dm_build_1.Dm_build_231(bytes)), 10)
  117. case REAL:
  118. return strconv.FormatFloat(float64(Dm_build_1.Dm_build_234(bytes)), 'f', -1, 32)
  119. case DOUBLE:
  120. return strconv.FormatFloat(float64(Dm_build_1.Dm_build_237(bytes)), 'f', -1, 64)
  121. case DECIMAL:
  122. case BINARY, VARBINARY:
  123. util.StringUtil.BytesToHexString(bytes, false)
  124. case BLOB:
  125. case CLOB:
  126. case DATE:
  127. dt := decode(bytes, column.isBdta, *column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  128. if conn.FormatDate != "" {
  129. return dtToStringByOracleFormat(dt, conn.FormatDate, column.scale, int(conn.OracleDateLanguage))
  130. }
  131. case TIME:
  132. dt := decode(bytes, column.isBdta, *column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  133. if conn.FormatTime != "" {
  134. return dtToStringByOracleFormat(dt, conn.FormatTime, column.scale, int(conn.OracleDateLanguage))
  135. }
  136. case DATETIME, DATETIME2:
  137. dt := decode(bytes, column.isBdta, *column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  138. if conn.FormatTimestamp != "" {
  139. return dtToStringByOracleFormat(dt, conn.FormatTimestamp, column.scale, int(conn.OracleDateLanguage))
  140. }
  141. case TIME_TZ:
  142. dt := decode(bytes, column.isBdta, *column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  143. if conn.FormatTimeTZ != "" {
  144. return dtToStringByOracleFormat(dt, conn.FormatTimeTZ, column.scale, int(conn.OracleDateLanguage))
  145. }
  146. case DATETIME_TZ, DATETIME2_TZ:
  147. dt := decode(bytes, column.isBdta, *column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  148. if conn.FormatTimestampTZ != "" {
  149. return dtToStringByOracleFormat(dt, conn.FormatTimestampTZ, column.scale, int(conn.OracleDateLanguage))
  150. }
  151. case INTERVAL_DT:
  152. return newDmIntervalDTByBytes(bytes).String()
  153. case INTERVAL_YM:
  154. return newDmIntervalYMByBytes(bytes).String()
  155. case ARRAY:
  156. case SARRAY:
  157. case CLASS:
  158. case PLTYPE_RECORD:
  159. }
  160. return ""
  161. }
  162. func (DB2G db2g) toBool(bytes []byte, column *column, conn *DmConnection) (bool, error) {
  163. switch column.colType {
  164. case BIT, BOOLEAN, TINYINT:
  165. return bytes[0] != 0, nil
  166. case SMALLINT:
  167. return Dm_build_1.Dm_build_98(bytes, 0) != 0, nil
  168. case INT:
  169. return Dm_build_1.Dm_build_103(bytes, 0) != 0, nil
  170. case BIGINT:
  171. return Dm_build_1.Dm_build_108(bytes, 0) != 0, nil
  172. case REAL:
  173. return Dm_build_1.Dm_build_113(bytes, 0) != 0, nil
  174. case DOUBLE:
  175. return Dm_build_1.Dm_build_117(bytes, 0) != 0, nil
  176. case DECIMAL:
  177. case CHAR, VARCHAR, VARCHAR2, CLOB:
  178. return G2DB.toBool(DB2G.charToString(bytes, column, conn))
  179. }
  180. return false, ECGO_DATA_CONVERTION_ERROR.throw()
  181. }
  182. func (DB2G db2g) toByte(bytes []byte, column *column, conn *DmConnection) (byte, error) {
  183. switch column.colType {
  184. case BIT, BOOLEAN, TINYINT:
  185. if bytes == nil || len(bytes) == 0 {
  186. return 0, nil
  187. } else {
  188. return bytes[0], nil
  189. }
  190. case SMALLINT:
  191. tval := Dm_build_1.Dm_build_98(bytes, 0)
  192. if tval < int16(BYTE_MIN) || tval > int16(BYTE_MAX) {
  193. return 0, ECGO_DATA_OVERFLOW.throw()
  194. }
  195. return byte(tval), nil
  196. case INT:
  197. tval := Dm_build_1.Dm_build_103(bytes, 0)
  198. if tval < int32(BYTE_MIN) || tval > int32(BYTE_MAX) {
  199. return 0, ECGO_DATA_OVERFLOW.throw()
  200. }
  201. return byte(tval), nil
  202. case BIGINT:
  203. tval := Dm_build_1.Dm_build_108(bytes, 0)
  204. if tval < int64(BYTE_MIN) || tval > int64(BYTE_MAX) {
  205. return 0, ECGO_DATA_OVERFLOW.throw()
  206. }
  207. return byte(tval), nil
  208. case REAL:
  209. tval := Dm_build_1.Dm_build_113(bytes, 0)
  210. if tval < float32(BYTE_MIN) || tval > float32(BYTE_MAX) {
  211. return 0, ECGO_DATA_OVERFLOW.throw()
  212. }
  213. return byte(tval), nil
  214. case DOUBLE:
  215. tval := Dm_build_1.Dm_build_117(bytes, 0)
  216. if tval < float64(BYTE_MIN) || tval > float64(BYTE_MAX) {
  217. return 0, ECGO_DATA_OVERFLOW.throw()
  218. }
  219. return byte(tval), nil
  220. case DECIMAL:
  221. case CHAR, VARCHAR, VARCHAR2, CLOB:
  222. tval, err := DB2G.charToFloat64(bytes, column, conn)
  223. if err != nil {
  224. return 0, err
  225. }
  226. if tval < float64(BYTE_MIN) || tval > float64(BYTE_MAX) {
  227. return 0, ECGO_DATA_OVERFLOW.throw()
  228. }
  229. return byte(tval), nil
  230. case BINARY, VARBINARY, BLOB:
  231. {
  232. tval, err := DB2G.BinaryToInt64(bytes, column, conn)
  233. if err != nil {
  234. return 0, err
  235. }
  236. if tval < int64(BYTE_MIN) || tval > int64(BYTE_MAX) {
  237. return 0, ECGO_DATA_OVERFLOW.throw()
  238. }
  239. return byte(tval), nil
  240. }
  241. }
  242. return 0, ECGO_DATA_CONVERTION_ERROR.throw()
  243. }
  244. func (DB2G db2g) toInt8(bytes []byte, column *column, conn *DmConnection) (int8, error) {
  245. switch column.colType {
  246. case BIT, BOOLEAN, TINYINT:
  247. if bytes == nil || len(bytes) == 0 {
  248. return 0, nil
  249. }
  250. return int8(bytes[0]), nil
  251. case SMALLINT:
  252. tval := Dm_build_1.Dm_build_98(bytes, 0)
  253. if tval < int16(INT8_MIN) || tval < int16(INT8_MAX) {
  254. return 0, ECGO_DATA_OVERFLOW.throw()
  255. }
  256. return int8(tval), nil
  257. case INT:
  258. tval := Dm_build_1.Dm_build_103(bytes, 0)
  259. if tval < int32(INT8_MIN) || tval > int32(INT8_MAX) {
  260. return 0, ECGO_DATA_OVERFLOW.throw()
  261. }
  262. return int8(tval), nil
  263. case BIGINT:
  264. tval := Dm_build_1.Dm_build_108(bytes, 0)
  265. if tval < int64(INT8_MIN) || tval > int64(INT8_MAX) {
  266. return 0, ECGO_DATA_OVERFLOW.throw()
  267. }
  268. return int8(tval), nil
  269. case REAL:
  270. tval := Dm_build_1.Dm_build_113(bytes, 0)
  271. if tval < float32(INT8_MIN) || tval > float32(INT8_MAX) {
  272. return 0, ECGO_DATA_OVERFLOW.throw()
  273. }
  274. return int8(tval), nil
  275. case DOUBLE:
  276. tval := Dm_build_1.Dm_build_117(bytes, 0)
  277. if tval < float64(INT8_MIN) || tval > float64(INT8_MAX) {
  278. return 0, ECGO_DATA_OVERFLOW.throw()
  279. }
  280. return int8(tval), nil
  281. case DECIMAL:
  282. case CHAR, VARCHAR, VARCHAR2, CLOB:
  283. tval, err := DB2G.charToFloat64(bytes, column, conn)
  284. if err != nil {
  285. return 0, err
  286. }
  287. if tval < float64(INT8_MIN) || tval > float64(INT8_MAX) {
  288. return 0, ECGO_DATA_OVERFLOW.throw()
  289. }
  290. return int8(tval), nil
  291. case BINARY, VARBINARY, BLOB:
  292. {
  293. tval, err := DB2G.BinaryToInt64(bytes, column, conn)
  294. if err != nil {
  295. return 0, err
  296. }
  297. if tval < int64(INT8_MIN) || tval > int64(INT8_MAX) {
  298. return 0, ECGO_DATA_OVERFLOW.throw()
  299. }
  300. return int8(tval), nil
  301. }
  302. }
  303. return 0, ECGO_DATA_CONVERTION_ERROR.throw()
  304. }
  305. func (DB2G db2g) toInt16(bytes []byte, column *column, conn *DmConnection) (int16, error) {
  306. switch column.colType {
  307. case BIT, BOOLEAN, TINYINT:
  308. if bytes == nil || len(bytes) == 0 {
  309. return 0, nil
  310. }
  311. return int16(bytes[0]), nil
  312. case SMALLINT:
  313. return Dm_build_1.Dm_build_98(bytes, 0), nil
  314. case INT:
  315. tval := Dm_build_1.Dm_build_103(bytes, 0)
  316. if tval < int32(INT16_MIN) || tval > int32(INT16_MAX) {
  317. return 0, ECGO_DATA_OVERFLOW.throw()
  318. }
  319. return int16(tval), nil
  320. case BIGINT:
  321. tval := Dm_build_1.Dm_build_108(bytes, 0)
  322. if tval < int64(INT16_MIN) || tval > int64(INT16_MAX) {
  323. return 0, ECGO_DATA_OVERFLOW.throw()
  324. }
  325. return int16(tval), nil
  326. case REAL:
  327. tval := Dm_build_1.Dm_build_113(bytes, 0)
  328. if tval < float32(INT16_MIN) || tval > float32(INT16_MAX) {
  329. return 0, ECGO_DATA_OVERFLOW.throw()
  330. }
  331. return int16(tval), nil
  332. case DOUBLE:
  333. tval := Dm_build_1.Dm_build_117(bytes, 0)
  334. if tval < float64(INT16_MIN) || tval > float64(INT16_MAX) {
  335. return 0, ECGO_DATA_OVERFLOW.throw()
  336. }
  337. return int16(tval), nil
  338. case DECIMAL:
  339. case CHAR, VARCHAR, VARCHAR2, CLOB:
  340. tval, err := DB2G.charToFloat64(bytes, column, conn)
  341. if err != nil {
  342. return 0, err
  343. }
  344. if tval < float64(INT16_MIN) || tval > float64(INT16_MAX) {
  345. return 0, ECGO_DATA_OVERFLOW.throw()
  346. }
  347. return int16(tval), nil
  348. case BINARY, VARBINARY, BLOB:
  349. {
  350. tval, err := DB2G.BinaryToInt64(bytes, column, conn)
  351. if err != nil {
  352. return 0, err
  353. }
  354. if tval < int64(INT16_MIN) || tval > int64(INT16_MAX) {
  355. return 0, ECGO_DATA_OVERFLOW.throw()
  356. }
  357. return int16(tval), nil
  358. }
  359. }
  360. return 0, ECGO_DATA_CONVERTION_ERROR.throw()
  361. }
  362. func (DB2G db2g) toUInt16(bytes []byte, column *column, conn *DmConnection) (uint16, error) {
  363. switch column.colType {
  364. case BIT, BOOLEAN, TINYINT:
  365. if bytes == nil || len(bytes) == 0 {
  366. return 0, nil
  367. }
  368. return uint16(bytes[0]), nil
  369. case SMALLINT:
  370. return uint16(Dm_build_1.Dm_build_98(bytes, 0)), nil
  371. case INT:
  372. tval := Dm_build_1.Dm_build_103(bytes, 0)
  373. if tval < int32(UINT16_MIN) || tval > int32(UINT16_MAX) {
  374. return 0, ECGO_DATA_OVERFLOW.throw()
  375. }
  376. return uint16(tval), nil
  377. case BIGINT:
  378. tval := Dm_build_1.Dm_build_108(bytes, 0)
  379. if tval < int64(UINT16_MIN) || tval > int64(UINT16_MAX) {
  380. return 0, ECGO_DATA_OVERFLOW.throw()
  381. }
  382. return uint16(tval), nil
  383. case REAL:
  384. tval := Dm_build_1.Dm_build_113(bytes, 0)
  385. if tval < float32(UINT16_MIN) || tval > float32(UINT16_MAX) {
  386. return 0, ECGO_DATA_OVERFLOW.throw()
  387. }
  388. return uint16(tval), nil
  389. case DOUBLE:
  390. tval := Dm_build_1.Dm_build_117(bytes, 0)
  391. if tval < float64(UINT16_MIN) || tval > float64(UINT16_MAX) {
  392. return 0, ECGO_DATA_OVERFLOW.throw()
  393. }
  394. return uint16(tval), nil
  395. case DECIMAL:
  396. case CHAR, VARCHAR, VARCHAR2, CLOB:
  397. tval, err := DB2G.charToFloat64(bytes, column, conn)
  398. if err != nil {
  399. return 0, err
  400. }
  401. if tval < float64(UINT16_MIN) || tval > float64(UINT16_MAX) {
  402. return 0, ECGO_DATA_OVERFLOW.throw()
  403. }
  404. return uint16(tval), nil
  405. case BINARY, VARBINARY, BLOB:
  406. {
  407. tval, err := DB2G.BinaryToInt64(bytes, column, conn)
  408. if err != nil {
  409. return 0, err
  410. }
  411. if tval < int64(UINT16_MIN) || tval > int64(UINT16_MAX) {
  412. return 0, ECGO_DATA_OVERFLOW.throw()
  413. }
  414. return uint16(tval), nil
  415. }
  416. }
  417. return 0, ECGO_DATA_CONVERTION_ERROR.throw()
  418. }
  419. func (DB2G db2g) toInt32(bytes []byte, column *column, conn *DmConnection) (int32, error) {
  420. switch column.colType {
  421. case BIT, BOOLEAN, TINYINT:
  422. if bytes == nil || len(bytes) == 0 {
  423. return 0, nil
  424. }
  425. return int32(bytes[0]), nil
  426. case SMALLINT:
  427. return int32(Dm_build_1.Dm_build_98(bytes, 0)), nil
  428. case INT:
  429. return Dm_build_1.Dm_build_103(bytes, 0), nil
  430. case BIGINT:
  431. tval := Dm_build_1.Dm_build_108(bytes, 0)
  432. if tval < int64(INT32_MIN) || tval > int64(INT32_MAX) {
  433. return 0, ECGO_DATA_OVERFLOW.throw()
  434. }
  435. return int32(tval), nil
  436. case REAL:
  437. tval := Dm_build_1.Dm_build_113(bytes, 0)
  438. if tval < float32(INT32_MIN) || tval > float32(INT32_MAX) {
  439. return 0, ECGO_DATA_OVERFLOW.throw()
  440. }
  441. return int32(tval), nil
  442. case DOUBLE:
  443. tval := Dm_build_1.Dm_build_117(bytes, 0)
  444. if tval < float64(INT32_MIN) || tval > float64(INT32_MAX) {
  445. return 0, ECGO_DATA_OVERFLOW.throw()
  446. }
  447. return int32(tval), nil
  448. case DECIMAL:
  449. case CHAR, VARCHAR, VARCHAR2, CLOB:
  450. tval, err := DB2G.charToFloat64(bytes, column, conn)
  451. if err != nil {
  452. return 0, err
  453. }
  454. if tval < float64(INT32_MIN) || tval > float64(INT32_MAX) {
  455. return 0, ECGO_DATA_OVERFLOW.throw()
  456. }
  457. return int32(tval), nil
  458. case BINARY, VARBINARY, BLOB:
  459. {
  460. tval, err := DB2G.BinaryToInt64(bytes, column, conn)
  461. if err != nil {
  462. return 0, err
  463. }
  464. if tval < int64(INT32_MIN) || tval > int64(INT32_MAX) {
  465. return 0, ECGO_DATA_OVERFLOW.throw()
  466. }
  467. return int32(tval), nil
  468. }
  469. }
  470. return 0, ECGO_DATA_CONVERTION_ERROR.throw()
  471. }
  472. func (DB2G db2g) toUInt32(bytes []byte, column *column, conn *DmConnection) (uint32, error) {
  473. switch column.colType {
  474. case BIT, BOOLEAN, TINYINT:
  475. if bytes == nil || len(bytes) == 0 {
  476. return 0, nil
  477. }
  478. return uint32(bytes[0]), nil
  479. case SMALLINT:
  480. return uint32(Dm_build_1.Dm_build_98(bytes, 0)), nil
  481. case INT:
  482. return uint32(Dm_build_1.Dm_build_103(bytes, 0)), nil
  483. case BIGINT:
  484. tval := Dm_build_1.Dm_build_108(bytes, 0)
  485. if tval < int64(UINT32_MIN) || tval > int64(UINT32_MAX) {
  486. return 0, ECGO_DATA_OVERFLOW.throw()
  487. }
  488. return uint32(tval), nil
  489. case REAL:
  490. tval := Dm_build_1.Dm_build_113(bytes, 0)
  491. if tval < float32(UINT32_MIN) || tval > float32(UINT32_MAX) {
  492. return 0, ECGO_DATA_OVERFLOW.throw()
  493. }
  494. return uint32(tval), nil
  495. case DOUBLE:
  496. tval := Dm_build_1.Dm_build_117(bytes, 0)
  497. if tval < float64(UINT32_MIN) || tval > float64(UINT32_MAX) {
  498. return 0, ECGO_DATA_OVERFLOW.throw()
  499. }
  500. return uint32(tval), nil
  501. case DECIMAL:
  502. case CHAR, VARCHAR, VARCHAR2, CLOB:
  503. tval, err := DB2G.charToFloat64(bytes, column, conn)
  504. if err != nil {
  505. return 0, err
  506. }
  507. if tval < float64(UINT32_MIN) || tval > float64(UINT32_MAX) {
  508. return 0, ECGO_DATA_OVERFLOW.throw()
  509. }
  510. return uint32(tval), nil
  511. case BINARY, VARBINARY, BLOB:
  512. {
  513. tval, err := DB2G.BinaryToInt64(bytes, column, conn)
  514. if err != nil {
  515. return 0, err
  516. }
  517. if tval < int64(UINT32_MIN) || tval > int64(UINT32_MAX) {
  518. return 0, ECGO_DATA_OVERFLOW.throw()
  519. }
  520. return uint32(tval), nil
  521. }
  522. }
  523. return 0, ECGO_DATA_CONVERTION_ERROR.throw()
  524. }
  525. func (DB2G db2g) toInt64(bytes []byte, column *column, conn *DmConnection) (int64, error) {
  526. switch column.colType {
  527. case BOOLEAN, BIT, TINYINT:
  528. if bytes == nil || len(bytes) == 0 {
  529. return int64(0), nil
  530. } else {
  531. return int64(bytes[0]), nil
  532. }
  533. case SMALLINT:
  534. return int64(Dm_build_1.Dm_build_225(bytes)), nil
  535. case INT:
  536. return int64(Dm_build_1.Dm_build_228(bytes)), nil
  537. case BIGINT:
  538. return int64(Dm_build_1.Dm_build_231(bytes)), nil
  539. case REAL:
  540. return int64(Dm_build_1.Dm_build_234(bytes)), nil
  541. case DOUBLE:
  542. return int64(Dm_build_1.Dm_build_237(bytes)), nil
  543. case CHAR, VARCHAR2, VARCHAR, CLOB:
  544. tval, err := DB2G.charToFloat64(bytes, column, conn)
  545. if err != nil {
  546. return 0, err
  547. }
  548. if int64(tval) < INT64_MIN || int64(tval) > INT64_MAX {
  549. return 0, ECGO_DATA_OVERFLOW.throw()
  550. }
  551. return int64(tval), nil
  552. case BINARY, VARBINARY, BLOB:
  553. tval, err := DB2G.BinaryToInt64(bytes, column, conn)
  554. if err != nil {
  555. return 0, err
  556. }
  557. return tval, nil
  558. }
  559. return 0, ECGO_DATA_CONVERTION_ERROR.throw()
  560. }
  561. func (DB2G db2g) toUInt64(bytes []byte, column *column, conn *DmConnection) (uint64, error) {
  562. switch column.colType {
  563. case BOOLEAN, BIT, TINYINT:
  564. if bytes == nil || len(bytes) == 0 {
  565. return uint64(0), nil
  566. } else {
  567. return uint64(bytes[0]), nil
  568. }
  569. case SMALLINT:
  570. return uint64(Dm_build_1.Dm_build_225(bytes)), nil
  571. case INT:
  572. return uint64(Dm_build_1.Dm_build_228(bytes)), nil
  573. case BIGINT:
  574. return uint64(Dm_build_1.Dm_build_231(bytes)), nil
  575. case REAL:
  576. return uint64(Dm_build_1.Dm_build_234(bytes)), nil
  577. case DOUBLE:
  578. return uint64(Dm_build_1.Dm_build_237(bytes)), nil
  579. case CHAR, VARCHAR2, VARCHAR, CLOB:
  580. tval, err := DB2G.charToFloat64(bytes, column, conn)
  581. if err != nil {
  582. return 0, err
  583. }
  584. if uint64(tval) < UINT64_MIN || uint64(tval) > UINT64_MAX {
  585. return 0, ECGO_DATA_OVERFLOW.throw()
  586. }
  587. return uint64(tval), nil
  588. case BINARY, VARBINARY, BLOB:
  589. tval, err := DB2G.BinaryToInt64(bytes, column, conn)
  590. if err != nil {
  591. return 0, err
  592. }
  593. return uint64(tval), nil
  594. }
  595. return 0, ECGO_DATA_CONVERTION_ERROR.throw()
  596. }
  597. func (DB2G db2g) toInt(bytes []byte, column *column, conn *DmConnection) (int, error) {
  598. if strconv.IntSize == 32 {
  599. tmp, err := DB2G.toInt32(bytes, column, conn)
  600. return int(tmp), err
  601. } else {
  602. tmp, err := DB2G.toInt64(bytes, column, conn)
  603. return int(tmp), err
  604. }
  605. }
  606. func (DB2G db2g) toUInt(bytes []byte, column *column, conn *DmConnection) (uint, error) {
  607. if strconv.IntSize == 32 {
  608. tmp, err := DB2G.toUInt32(bytes, column, conn)
  609. return uint(tmp), err
  610. } else {
  611. tmp, err := DB2G.toUInt64(bytes, column, conn)
  612. return uint(tmp), err
  613. }
  614. }
  615. func (DB2G db2g) toFloat32(bytes []byte, column *column, conn *DmConnection) (float32, error) {
  616. switch column.colType {
  617. case BIT, BOOLEAN, TINYINT:
  618. if bytes == nil || len(bytes) == 0 {
  619. return 0, nil
  620. }
  621. return float32(bytes[0]), nil
  622. case SMALLINT:
  623. return float32(Dm_build_1.Dm_build_98(bytes, 0)), nil
  624. case INT:
  625. return float32(Dm_build_1.Dm_build_103(bytes, 0)), nil
  626. case BIGINT:
  627. return float32(Dm_build_1.Dm_build_108(bytes, 0)), nil
  628. case REAL:
  629. return Dm_build_1.Dm_build_113(bytes, 0), nil
  630. case DOUBLE:
  631. dval := Dm_build_1.Dm_build_117(bytes, 0)
  632. return float32(dval), nil
  633. case DECIMAL:
  634. dval, err := DB2G.decToDecimal(bytes, int(column.prec), int(column.scale), conn.CompatibleOracle())
  635. if err != nil {
  636. return 0, err
  637. }
  638. return float32(dval.ToFloat64()), nil
  639. case CHAR, VARCHAR2, VARCHAR, CLOB:
  640. dval, err := DB2G.charToDeciaml(bytes, column, conn)
  641. if err != nil {
  642. return 0, err
  643. }
  644. return float32(dval.ToFloat64()), nil
  645. }
  646. return 0, ECGO_DATA_CONVERTION_ERROR.throw()
  647. }
  648. func (DB2G db2g) toFloat64(bytes []byte, column *column, conn *DmConnection) (float64, error) {
  649. switch column.colType {
  650. case BIT, BOOLEAN, TINYINT:
  651. if bytes == nil || len(bytes) == 0 {
  652. return 0, nil
  653. }
  654. return float64(bytes[0]), nil
  655. case SMALLINT:
  656. return float64(Dm_build_1.Dm_build_98(bytes, 0)), nil
  657. case INT:
  658. return float64(Dm_build_1.Dm_build_103(bytes, 0)), nil
  659. case BIGINT:
  660. return float64(Dm_build_1.Dm_build_108(bytes, 0)), nil
  661. case REAL:
  662. return float64(Dm_build_1.Dm_build_113(bytes, 0)), nil
  663. case DOUBLE:
  664. return Dm_build_1.Dm_build_117(bytes, 0), nil
  665. case DECIMAL:
  666. dval, err := DB2G.decToDecimal(bytes, int(column.prec), int(column.scale), conn.CompatibleOracle())
  667. if err != nil {
  668. return 0, err
  669. }
  670. return dval.ToFloat64(), nil
  671. case CHAR, VARCHAR2, VARCHAR, CLOB:
  672. dval, err := DB2G.charToDeciaml(bytes, column, conn)
  673. if err != nil {
  674. return 0, err
  675. }
  676. return dval.ToFloat64(), nil
  677. }
  678. return 0, ECGO_DATA_CONVERTION_ERROR.throw()
  679. }
  680. func (DB2G db2g) toDmBlob(value []byte, column *column, conn *DmConnection) *DmBlob {
  681. switch column.colType {
  682. case BLOB:
  683. return newBlobFromDB(value, conn, column, conn.lobFetchAll())
  684. default:
  685. return newBlobOfLocal(value, conn)
  686. }
  687. }
  688. func (DB2G db2g) toDmClob(value []byte, conn *DmConnection, column *column) *DmClob {
  689. switch column.colType {
  690. case CLOB:
  691. return newClobFromDB(value, conn, column, conn.lobFetchAll())
  692. default:
  693. return newClobOfLocal(DB2G.toString(value, column, conn), conn)
  694. }
  695. }
  696. func (DB2G db2g) toDmDecimal(value []byte, column *column, conn *DmConnection) (*DmDecimal, error) {
  697. switch column.colType {
  698. case BIT, BOOLEAN, TINYINT:
  699. if value == nil || len(value) == 0 {
  700. return NewDecimalFromInt64(0)
  701. } else {
  702. return NewDecimalFromInt64(int64(value[0]))
  703. }
  704. case SMALLINT:
  705. return NewDecimalFromInt64(int64(Dm_build_1.Dm_build_98(value, 0)))
  706. case INT:
  707. return NewDecimalFromInt64(int64(Dm_build_1.Dm_build_103(value, 0)))
  708. case BIGINT:
  709. return NewDecimalFromInt64(Dm_build_1.Dm_build_108(value, 0))
  710. case REAL:
  711. return NewDecimalFromFloat64(float64(Dm_build_1.Dm_build_113(value, 0)))
  712. case DOUBLE:
  713. return NewDecimalFromFloat64(Dm_build_1.Dm_build_117(value, 0))
  714. case DECIMAL:
  715. return decodeDecimal(value, int(column.prec), int(column.scale))
  716. case CHAR, VARCHAR, VARCHAR2, CLOB:
  717. return DB2G.charToDeciaml(value, column, conn)
  718. }
  719. return nil, ECGO_DATA_CONVERTION_ERROR
  720. }
  721. func (DB2G db2g) toTime(bytes []byte, column *column, conn *DmConnection) (time.Time, error) {
  722. switch column.colType {
  723. case DATE, TIME, TIME_TZ, DATETIME_TZ, DATETIME, DATETIME2_TZ, DATETIME2:
  724. dt := decode(bytes, column.isBdta, *column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  725. return toTimeFromDT(dt, int(conn.dmConnector.localTimezone)), nil
  726. case CHAR, VARCHAR2, VARCHAR, CLOB:
  727. return toTimeFromString(DB2G.charToString(bytes, column, conn), int(conn.dmConnector.localTimezone)), nil
  728. }
  729. return time.Now(), ECGO_DATA_CONVERTION_ERROR.throw()
  730. }
  731. func (DB2G db2g) toObject(bytes []byte, column *column, conn *DmConnection) (interface{}, error) {
  732. switch column.colType {
  733. case BIT, BOOLEAN:
  734. return bytes[0] != 0, nil
  735. case TINYINT:
  736. return Dm_build_1.Dm_build_94(bytes, 0), nil
  737. case SMALLINT:
  738. return Dm_build_1.Dm_build_98(bytes, 0), nil
  739. case INT:
  740. return Dm_build_1.Dm_build_103(bytes, 0), nil
  741. case BIGINT:
  742. return Dm_build_1.Dm_build_108(bytes, 0), nil
  743. case DECIMAL:
  744. return DB2G.decToDecimal(bytes, int(column.prec), int(column.scale), conn.CompatibleOracle())
  745. case REAL:
  746. return Dm_build_1.Dm_build_113(bytes, 0), nil
  747. case DOUBLE:
  748. return Dm_build_1.Dm_build_117(bytes, 0), nil
  749. case DATE, TIME, DATETIME, TIME_TZ, DATETIME_TZ, DATETIME2, DATETIME2_TZ:
  750. dt := decode(bytes, column.isBdta, *column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  751. return toTimeFromDT(dt, int(conn.dmConnector.localTimezone)), nil
  752. case BINARY, VARBINARY:
  753. return bytes, nil
  754. case BLOB:
  755. blob := newBlobFromDB(bytes, conn, column, conn.lobFetchAll())
  756. if util.StringUtil.EqualsIgnoreCase(column.typeName, "LONGVARBINARY") {
  757. l, err := blob.GetLength()
  758. if err != nil {
  759. return nil, err
  760. }
  761. return blob.getBytes(1, int32(l))
  762. } else {
  763. return blob, nil
  764. }
  765. case CHAR, VARCHAR, VARCHAR2:
  766. val := DB2G.charToString(bytes, column, conn)
  767. if column.mask == MASK_BFILE {
  768. }
  769. return val, nil
  770. case CLOB:
  771. clob := newClobFromDB(bytes, conn, column, conn.lobFetchAll())
  772. if util.StringUtil.EqualsIgnoreCase(column.typeName, "LONGVARCHAR") {
  773. l, err := clob.GetLength()
  774. if err != nil {
  775. return nil, err
  776. }
  777. return clob.getSubString(1, int32(l))
  778. } else {
  779. return clob, nil
  780. }
  781. case INTERVAL_YM:
  782. return newDmIntervalYMByBytes(bytes), nil
  783. case INTERVAL_DT:
  784. return newDmIntervalDTByBytes(bytes), nil
  785. case ARRAY:
  786. return TypeDataSV.bytesToArray(bytes, nil, column.typeDescriptor)
  787. case SARRAY:
  788. return TypeDataSV.bytesToSArray(bytes, nil, column.typeDescriptor)
  789. case CLASS:
  790. case PLTYPE_RECORD:
  791. default:
  792. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  793. }
  794. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  795. }
  796. func (DB2G db2g) toComplexType(bytes []byte, column *column, conn *DmConnection) (interface{}, error) {
  797. switch column.colType {
  798. case BLOB:
  799. if !isComplexType(int(column.colType), int(column.scale)) {
  800. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  801. }
  802. blob := newBlobFromDB(bytes, conn, column, true)
  803. return TypeDataSV.objBlobToObj(blob, column.typeDescriptor)
  804. case ARRAY:
  805. return TypeDataSV.bytesToArray(bytes, nil, column.typeDescriptor)
  806. case SARRAY:
  807. return TypeDataSV.bytesToSArray(bytes, nil, column.typeDescriptor)
  808. case CLASS:
  809. return TypeDataSV.bytesToObj(bytes, nil, column.typeDescriptor)
  810. case PLTYPE_RECORD:
  811. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  812. default:
  813. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  814. }
  815. }