zi.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017
  1. /*
  2. * Copyright (c) 2000-2018, 达梦数据库有限公司.
  3. * All rights reserved.
  4. */
  5. package dm
  6. import (
  7. "bytes"
  8. "io"
  9. "math/big"
  10. "strconv"
  11. "strings"
  12. "time"
  13. "gitee.com/chunanyong/dm/util"
  14. )
  15. var G2DB g2db
  16. type g2db struct {
  17. }
  18. func (G2DB g2db) checkTinyint(val interface{}) error {
  19. switch v := val.(type) {
  20. case float64:
  21. if v < float64(INT8_MIN) || v > float64(INT8_MAX) {
  22. return ECGO_DATA_OVERFLOW.throw()
  23. }
  24. case DmDecimal:
  25. if v.ToBigInt().Cmp(big.NewInt(int64(INT8_MIN))) < 0 ||
  26. v.ToBigInt().Cmp(big.NewInt(int64(INT8_MAX))) > 0 {
  27. return ECGO_DATA_OVERFLOW.throw()
  28. }
  29. }
  30. return nil
  31. }
  32. func (G2DB g2db) checkSmallint(val interface{}) error {
  33. switch v := val.(type) {
  34. case float64:
  35. if v < float64(INT16_MIN) || v > float64(INT16_MAX) {
  36. return ECGO_DATA_OVERFLOW.throw()
  37. }
  38. case DmDecimal:
  39. if v.ToBigInt().Cmp(big.NewInt(int64(INT16_MIN))) < 0 ||
  40. v.ToBigInt().Cmp(big.NewInt(int64(INT16_MAX))) > 0 {
  41. return ECGO_DATA_OVERFLOW.throw()
  42. }
  43. }
  44. return nil
  45. }
  46. func (G2DB g2db) checkInt(val interface{}) error {
  47. switch v := val.(type) {
  48. case float64:
  49. if v < float64(INT32_MIN) || v > float64(INT32_MAX) {
  50. return ECGO_DATA_OVERFLOW.throw()
  51. }
  52. case DmDecimal:
  53. if v.ToBigInt().Cmp(big.NewInt(int64(INT32_MIN))) < 0 ||
  54. v.ToBigInt().Cmp(big.NewInt(int64(INT32_MAX))) > 0 {
  55. return ECGO_DATA_OVERFLOW.throw()
  56. }
  57. }
  58. return nil
  59. }
  60. func (G2DB g2db) checkBigint(val interface{}) error {
  61. switch v := val.(type) {
  62. case float64:
  63. if v < float64(INT64_MIN) || v > float64(INT64_MAX) {
  64. return ECGO_DATA_OVERFLOW.throw()
  65. }
  66. case DmDecimal:
  67. if v.ToBigInt().Cmp(big.NewInt(INT64_MIN)) < 0 ||
  68. v.ToBigInt().Cmp(big.NewInt(INT64_MAX)) > 0 {
  69. return ECGO_DATA_OVERFLOW.throw()
  70. }
  71. }
  72. return nil
  73. }
  74. func (G2DB g2db) checkReal(val interface{}) error {
  75. switch v := val.(type) {
  76. case float64:
  77. if v < float64(FLOAT32_MIN) || v > float64(FLOAT32_MAX) {
  78. return ECGO_DATA_OVERFLOW.throw()
  79. }
  80. case DmDecimal:
  81. if v.ToBigFloat().Cmp(big.NewFloat(float64(FLOAT32_MIN))) < 0 ||
  82. v.ToBigFloat().Cmp(big.NewFloat(float64(FLOAT32_MAX))) > 0 {
  83. return ECGO_DATA_OVERFLOW.throw()
  84. }
  85. }
  86. return nil
  87. }
  88. func (G2DB g2db) fromBool(val bool, param parameter, conn *DmConnection) ([]byte, error) {
  89. switch param.colType {
  90. case BOOLEAN, BIT, TINYINT, SMALLINT, INT, BIGINT, REAL, DOUBLE, DECIMAL, CHAR,
  91. VARCHAR2, VARCHAR, CLOB:
  92. if val {
  93. return G2DB.fromInt64(1, param, conn)
  94. } else {
  95. return G2DB.fromInt64(0, param, conn)
  96. }
  97. case BINARY, VARBINARY, BLOB:
  98. if val {
  99. return Dm_build_1.Dm_build_179(byte(1)), nil
  100. } else {
  101. return Dm_build_1.Dm_build_179(byte(0)), nil
  102. }
  103. }
  104. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  105. }
  106. func (G2DB g2db) fromInt64(val int64, param parameter, conn *DmConnection) ([]byte, error) {
  107. switch param.colType {
  108. case BOOLEAN, BIT:
  109. if val == 0 {
  110. return Dm_build_1.Dm_build_179(byte(0)), nil
  111. }
  112. return Dm_build_1.Dm_build_179(byte(1)), nil
  113. case TINYINT:
  114. err := G2DB.checkTinyint(float64(val))
  115. if err != nil {
  116. return nil, err
  117. }
  118. return Dm_build_1.Dm_build_179(byte(val)), nil
  119. case SMALLINT:
  120. err := G2DB.checkSmallint(float64(val))
  121. if err != nil {
  122. return nil, err
  123. }
  124. return Dm_build_1.Dm_build_185(int16(val)), nil
  125. case INT:
  126. err := G2DB.checkInt(float64(val))
  127. if err != nil {
  128. return nil, err
  129. }
  130. return Dm_build_1.Dm_build_188(int32(val)), nil
  131. case BIGINT:
  132. err := G2DB.checkBigint(float64(val))
  133. if err != nil {
  134. return nil, err
  135. }
  136. return Dm_build_1.Dm_build_191(int64(val)), nil
  137. case REAL:
  138. err := G2DB.checkReal(float64(val))
  139. if err != nil {
  140. return nil, err
  141. }
  142. return Dm_build_1.Dm_build_194(float32(val)), nil
  143. case DOUBLE:
  144. return Dm_build_1.Dm_build_197(float64(val)), nil
  145. case DECIMAL:
  146. d, err := newDecimal(big.NewInt(val), int(param.prec), int(param.scale))
  147. if err != nil {
  148. return nil, err
  149. }
  150. return d.encodeDecimal()
  151. case CHAR, VARCHAR2, VARCHAR, CLOB:
  152. return Dm_build_1.Dm_build_217(strconv.FormatInt(val, 10), conn.getServerEncoding(), conn), nil
  153. case BINARY, VARBINARY, BLOB:
  154. return G2DB.ToBinary(val, int(param.prec)), nil
  155. case DATE, TIME, DATETIME, DATETIME2:
  156. if err := G2DB.checkInt(float64(val)); err != nil {
  157. return nil, err
  158. }
  159. return toDate(val, param.column, *conn)
  160. }
  161. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  162. }
  163. func (G2DB g2db) ToBinary(x int64, prec int) []byte {
  164. b := make([]byte, 8)
  165. b[7] = byte(x)
  166. b[6] = byte(x >> 8)
  167. b[5] = byte(x >> 16)
  168. b[4] = byte(x >> 24)
  169. b[3] = byte(x >> 32)
  170. b[2] = byte(x >> 40)
  171. b[1] = byte(x >> 48)
  172. b[0] = byte(x >> 56)
  173. if prec > 0 && prec < len(b) {
  174. dest := make([]byte, prec)
  175. copy(dest, b[len(b)-prec:])
  176. return dest
  177. }
  178. return b
  179. }
  180. func (G2DB g2db) fromFloat32(val float32, param parameter, conn *DmConnection) ([]byte, error) {
  181. switch param.colType {
  182. case BOOLEAN, BIT:
  183. if val == 0.0 {
  184. return Dm_build_1.Dm_build_179(0), nil
  185. }
  186. return Dm_build_1.Dm_build_179(1), nil
  187. case TINYINT:
  188. if err := G2DB.checkTinyint(float64(val)); err != nil {
  189. return nil, err
  190. }
  191. return Dm_build_1.Dm_build_179(byte(val)), nil
  192. case SMALLINT:
  193. if err := G2DB.checkSmallint(float64(val)); err != nil {
  194. return nil, err
  195. }
  196. return Dm_build_1.Dm_build_185(int16(val)), nil
  197. case INT:
  198. if err := G2DB.checkInt(float64(val)); err != nil {
  199. return nil, err
  200. }
  201. return Dm_build_1.Dm_build_188(int32(val)), nil
  202. case BIGINT:
  203. if err := G2DB.checkBigint(float64(val)); err != nil {
  204. return nil, err
  205. }
  206. return Dm_build_1.Dm_build_191(int64(val)), nil
  207. case REAL:
  208. if err := G2DB.checkReal(float64(val)); err != nil {
  209. return nil, err
  210. }
  211. return Dm_build_1.Dm_build_194(val), nil
  212. case DOUBLE:
  213. return Dm_build_1.Dm_build_197(float64(val)), nil
  214. case DECIMAL:
  215. d, err := newDecimal(big.NewFloat(float64(val)), int(param.prec), int(param.scale))
  216. if err != nil {
  217. return nil, err
  218. }
  219. return d.encodeDecimal()
  220. case CHAR, VARCHAR2, VARCHAR, CLOB:
  221. return Dm_build_1.Dm_build_217(strconv.FormatFloat(float64(val), 'f', -1, 32), conn.getServerEncoding(), conn), nil
  222. }
  223. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  224. }
  225. func (G2DB g2db) fromFloat64(val float64, param parameter, conn *DmConnection) ([]byte, error) {
  226. switch param.colType {
  227. case BOOLEAN, BIT:
  228. if val == 0.0 {
  229. return Dm_build_1.Dm_build_179(0), nil
  230. }
  231. return Dm_build_1.Dm_build_179(1), nil
  232. case TINYINT:
  233. err := G2DB.checkTinyint(val)
  234. if err != nil {
  235. return nil, err
  236. }
  237. return Dm_build_1.Dm_build_179(byte(val)), nil
  238. case SMALLINT:
  239. err := G2DB.checkSmallint(val)
  240. if err != nil {
  241. return nil, err
  242. }
  243. return Dm_build_1.Dm_build_185(int16(val)), nil
  244. case INT:
  245. err := G2DB.checkInt(val)
  246. if err != nil {
  247. return nil, err
  248. }
  249. return Dm_build_1.Dm_build_188(int32(val)), nil
  250. case BIGINT:
  251. err := G2DB.checkBigint(val)
  252. if err != nil {
  253. return nil, err
  254. }
  255. return Dm_build_1.Dm_build_191(int64(val)), nil
  256. case REAL:
  257. err := G2DB.checkReal(val)
  258. if err != nil {
  259. return nil, err
  260. }
  261. return Dm_build_1.Dm_build_194(float32(val)), nil
  262. case DOUBLE:
  263. return Dm_build_1.Dm_build_197(float64(val)), nil
  264. case DECIMAL:
  265. d, err := newDecimal(big.NewFloat(val), int(param.prec), int(param.scale))
  266. if err != nil {
  267. return nil, err
  268. }
  269. return d.encodeDecimal()
  270. case CHAR, VARCHAR2, VARCHAR, CLOB:
  271. return Dm_build_1.Dm_build_217(strconv.FormatFloat(val, 'f', -1, 64), conn.getServerEncoding(), conn), nil
  272. }
  273. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  274. }
  275. func (G2DB g2db) fromBytes(val []byte, param parameter, conn *DmConnection) (interface{}, error) {
  276. switch param.colType {
  277. case CHAR, VARCHAR2, VARCHAR:
  278. return G2DB.toVarchar(val)
  279. case CLOB:
  280. b, err := G2DB.toVarchar(val)
  281. if err != nil {
  282. return nil, err
  283. }
  284. return G2DB.changeOffRowData(param, b, conn.getServerEncoding())
  285. case BINARY, VARBINARY:
  286. return val, nil
  287. case BLOB:
  288. return G2DB.bytes2Blob(val, param, conn)
  289. case ARRAY, CLASS, PLTYPE_RECORD, SARRAY:
  290. if param.typeDescriptor == nil {
  291. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  292. }
  293. return TypeDataSV.objBlobToBytes(val, param.typeDescriptor)
  294. }
  295. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  296. }
  297. func (G2DB g2db) toVarchar(bsArr []byte) ([]byte, error) {
  298. if bsArr == nil || len(bsArr) == 0 {
  299. return make([]byte, 0), nil
  300. }
  301. realLen := len(bsArr) * 2
  302. bsRet := make([]byte, realLen)
  303. for i := 0; i < len(bsArr); i++ {
  304. bsTemp, err := G2DB.toChar(bsArr[i])
  305. if err != nil {
  306. return nil, err
  307. }
  308. bsRet[i*2] = bsTemp[0]
  309. bsRet[i*2+1] = bsTemp[1]
  310. }
  311. return bsRet, nil
  312. }
  313. func (G2DB g2db) toChar(bt byte) ([]byte, error) {
  314. bytes := make([]byte, 2)
  315. var err error
  316. bytes[0], err = G2DB.getCharByNumVal((bt >> 4) & 0x0F)
  317. if err != nil {
  318. return nil, err
  319. }
  320. bytes[1], err = G2DB.getCharByNumVal(bt & 0x0F)
  321. if err != nil {
  322. return nil, err
  323. }
  324. return bytes, nil
  325. }
  326. func (G2DB g2db) getCharByNumVal(val byte) (byte, error) {
  327. if val >= 0 && val <= 9 {
  328. return (byte)(val + '0'), nil
  329. }
  330. if val >= 0x0a && val <= 0x0F {
  331. return (byte)(val + 'A' - 0x0a), nil
  332. }
  333. return 0, ECGO_INVALID_HEX.throw()
  334. }
  335. func (G2DB g2db) fromString(val string, param parameter, conn *DmConnection) (interface{}, error) {
  336. switch param.colType {
  337. case BOOLEAN, BIT:
  338. ret, err := G2DB.toBool(val)
  339. if err != nil {
  340. return nil, err
  341. }
  342. if ret {
  343. return Dm_build_1.Dm_build_179(byte(1)), nil
  344. } else {
  345. return Dm_build_1.Dm_build_179(byte(0)), nil
  346. }
  347. case TINYINT, SMALLINT, INT, BIGINT:
  348. f, ok := new(big.Float).SetString(val)
  349. if !ok {
  350. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  351. }
  352. if f.Sign() < 0 {
  353. f.Sub(f, big.NewFloat(0.5))
  354. } else {
  355. f.Add(f, big.NewFloat(0.5))
  356. }
  357. z, _ := f.Int(nil)
  358. return G2DB.fromBigInt(z, param, conn)
  359. case REAL, DOUBLE, DECIMAL:
  360. f, ok := new(big.Float).SetString(val)
  361. if ok {
  362. return G2DB.fromBigFloat(f, param, conn)
  363. } else {
  364. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  365. }
  366. case CHAR, VARCHAR2, VARCHAR:
  367. if param.mask == MASK_BFILE && !isValidBFileStr(val) {
  368. return nil, ECGO_INVALID_BFILE_STR.throw()
  369. }
  370. return Dm_build_1.Dm_build_217(val, conn.getServerEncoding(), conn), nil
  371. case CLOB:
  372. return G2DB.string2Clob(val, param, conn)
  373. case BINARY, VARBINARY:
  374. return util.StringUtil.HexStringToBytes(val), nil
  375. case BLOB:
  376. return G2DB.bytes2Blob(util.StringUtil.HexStringToBytes(val), param, conn)
  377. case DATE:
  378. if conn.FormatDate != "" {
  379. dt, err := parse(val, conn.FormatDate, int(conn.OracleDateLanguage))
  380. if err != nil {
  381. return nil, err
  382. }
  383. return encode(dt, param.column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  384. }
  385. return encodeByString(val, param.column, *conn)
  386. case TIME:
  387. if conn.FormatTime != "" {
  388. dt, err := parse(val, conn.FormatTime, int(conn.OracleDateLanguage))
  389. if err != nil {
  390. return nil, err
  391. }
  392. return encode(dt, param.column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  393. }
  394. return encodeByString(val, param.column, *conn)
  395. case DATETIME, DATETIME2:
  396. if conn.FormatTimestamp != "" {
  397. dt, err := parse(val, conn.FormatTimestamp, int(conn.OracleDateLanguage))
  398. if err != nil {
  399. return nil, err
  400. }
  401. return encode(dt, param.column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  402. }
  403. return encodeByString(val, param.column, *conn)
  404. case TIME_TZ:
  405. dt, err := parse(val, conn.FormatTimeTZ, int(conn.OracleDateLanguage))
  406. if err != nil {
  407. return nil, err
  408. }
  409. if conn.FormatTimeTZ != "" {
  410. return encode(dt, param.column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  411. }
  412. return encodeByString(val, param.column, *conn)
  413. case DATETIME_TZ, DATETIME2_TZ:
  414. if conn.FormatTimestampTZ != "" {
  415. dt, err := parse(val, conn.FormatTimestampTZ, int(conn.OracleDateLanguage))
  416. if err != nil {
  417. return nil, err
  418. }
  419. return encode(dt, param.column, int(conn.dmConnector.localTimezone), int(conn.DbTimezone))
  420. }
  421. return encodeByString(val, param.column, *conn)
  422. case INTERVAL_DT:
  423. dt, err := NewDmIntervalDTByString(val)
  424. if err != nil {
  425. return nil, err
  426. }
  427. return dt.encode(int(param.scale))
  428. case INTERVAL_YM:
  429. ym, err := NewDmIntervalYMByString(val)
  430. if err != nil {
  431. return nil, err
  432. }
  433. return ym.encode(int(param.scale))
  434. }
  435. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  436. }
  437. func (G2DB g2db) toBool(str string) (bool, error) {
  438. str = strings.TrimSpace(str)
  439. if util.StringUtil.Equals(str, "0") {
  440. return false, nil
  441. } else if util.StringUtil.Equals(str, "1") {
  442. return true, nil
  443. }
  444. return strings.ToLower(str) == "true", nil
  445. }
  446. func (G2DB g2db) fromBigInt(val *big.Int, param parameter, conn *DmConnection) ([]byte, error) {
  447. var ret []byte
  448. switch param.colType {
  449. case BOOLEAN, BIT:
  450. if val.Sign() == 0 {
  451. ret = Dm_build_1.Dm_build_179(0)
  452. } else {
  453. ret = Dm_build_1.Dm_build_179(1)
  454. }
  455. case TINYINT:
  456. err := G2DB.checkTinyint(float64(val.Int64()))
  457. if err != nil {
  458. return nil, err
  459. }
  460. ret = Dm_build_1.Dm_build_179(byte(val.Int64()))
  461. case SMALLINT:
  462. err := G2DB.checkSmallint(float64(val.Int64()))
  463. if err != nil {
  464. return nil, err
  465. }
  466. ret = Dm_build_1.Dm_build_185(int16(val.Int64()))
  467. case INT:
  468. err := G2DB.checkInt(float64(val.Int64()))
  469. if err != nil {
  470. return nil, err
  471. }
  472. ret = Dm_build_1.Dm_build_188(int32(val.Int64()))
  473. case BIGINT:
  474. err := G2DB.checkBigint(float64(val.Int64()))
  475. if err != nil {
  476. return nil, err
  477. }
  478. ret = Dm_build_1.Dm_build_191(val.Int64())
  479. case REAL:
  480. err := G2DB.checkReal(float64(val.Int64()))
  481. if err != nil {
  482. return nil, err
  483. }
  484. ret = Dm_build_1.Dm_build_194(float32(val.Int64()))
  485. case DOUBLE:
  486. ret = Dm_build_1.Dm_build_197(float64(val.Int64()))
  487. case DECIMAL, BINARY, VARBINARY, BLOB:
  488. d, err := newDecimal(val, int(param.prec), int(param.scale))
  489. if err != nil {
  490. return nil, err
  491. }
  492. ret, err = d.encodeDecimal()
  493. if err != nil {
  494. return nil, err
  495. }
  496. case CHAR, VARCHAR2, VARCHAR, CLOB:
  497. ret = Dm_build_1.Dm_build_217(val.String(), conn.getServerEncoding(), conn)
  498. default:
  499. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  500. }
  501. return ret, nil
  502. }
  503. func (G2DB g2db) fromBigFloat(val *big.Float, param parameter, conn *DmConnection) ([]byte, error) {
  504. var ret []byte
  505. switch param.colType {
  506. case BOOLEAN, BIT:
  507. if val.Sign() == 0 {
  508. ret = Dm_build_1.Dm_build_179(0)
  509. } else {
  510. ret = Dm_build_1.Dm_build_179(1)
  511. }
  512. case TINYINT:
  513. f, _ := val.Float64()
  514. err := G2DB.checkTinyint(f)
  515. if err != nil {
  516. return nil, err
  517. }
  518. ret = Dm_build_1.Dm_build_179(byte(f))
  519. case SMALLINT:
  520. f, _ := val.Float64()
  521. err := G2DB.checkSmallint(f)
  522. if err != nil {
  523. return nil, err
  524. }
  525. ret = Dm_build_1.Dm_build_185(int16(f))
  526. case INT:
  527. f, _ := val.Float64()
  528. err := G2DB.checkInt(f)
  529. if err != nil {
  530. return nil, err
  531. }
  532. ret = Dm_build_1.Dm_build_188(int32(f))
  533. case BIGINT:
  534. f, _ := val.Float64()
  535. err := G2DB.checkBigint(f)
  536. if err != nil {
  537. return nil, err
  538. }
  539. ret = Dm_build_1.Dm_build_191(int64(f))
  540. case REAL:
  541. f, _ := val.Float64()
  542. err := G2DB.checkReal(f)
  543. if err != nil {
  544. return nil, err
  545. }
  546. ret = Dm_build_1.Dm_build_194(float32(f))
  547. case DOUBLE:
  548. f, _ := val.Float64()
  549. ret = Dm_build_1.Dm_build_197(f)
  550. case DECIMAL:
  551. d, err := newDecimal(val, int(param.prec), int(param.scale))
  552. if err != nil {
  553. return nil, err
  554. }
  555. ret, err = d.encodeDecimal()
  556. if err != nil {
  557. return nil, err
  558. }
  559. case CHAR, VARCHAR2, VARCHAR, CLOB:
  560. ret = Dm_build_1.Dm_build_217(val.Text('f', int(param.scale)), conn.getServerEncoding(), conn)
  561. default:
  562. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  563. }
  564. return ret, nil
  565. }
  566. func (G2DB g2db) fromDecimal(val DmDecimal, param parameter, conn *DmConnection) ([]byte, error) {
  567. var ret []byte
  568. switch param.colType {
  569. case BOOLEAN, BIT:
  570. if val.Sign() == 0 {
  571. ret = Dm_build_1.Dm_build_179(0)
  572. } else {
  573. ret = Dm_build_1.Dm_build_179(1)
  574. }
  575. case TINYINT:
  576. if err := G2DB.checkTinyint(val); err != nil {
  577. return nil, err
  578. }
  579. ret = Dm_build_1.Dm_build_179(byte(val.ToBigInt().Int64()))
  580. case SMALLINT:
  581. if err := G2DB.checkSmallint(val); err != nil {
  582. return nil, err
  583. }
  584. ret = Dm_build_1.Dm_build_185(int16(val.ToBigInt().Int64()))
  585. case INT:
  586. if err := G2DB.checkInt(val); err != nil {
  587. return nil, err
  588. }
  589. ret = Dm_build_1.Dm_build_188(int32(val.ToBigInt().Int64()))
  590. case BIGINT:
  591. if err := G2DB.checkBigint(val); err != nil {
  592. return nil, err
  593. }
  594. ret = Dm_build_1.Dm_build_191(int64(val.ToBigInt().Int64()))
  595. case REAL:
  596. if err := G2DB.checkReal(val); err != nil {
  597. return nil, err
  598. }
  599. f, _ := val.ToBigFloat().Float32()
  600. ret = Dm_build_1.Dm_build_194(f)
  601. case DOUBLE:
  602. f, _ := val.ToBigFloat().Float64()
  603. ret = Dm_build_1.Dm_build_197(f)
  604. case DECIMAL:
  605. var err error
  606. ret, err = val.encodeDecimal()
  607. if err != nil {
  608. return nil, err
  609. }
  610. case CHAR, VARCHAR2, VARCHAR, CLOB:
  611. ret = Dm_build_1.Dm_build_217(val.ToBigFloat().Text('f', -1), conn.getServerEncoding(), conn)
  612. default:
  613. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  614. }
  615. return ret, nil
  616. }
  617. func (G2DB g2db) fromTime(val time.Time, param parameter, conn *DmConnection) ([]byte, error) {
  618. switch param.colType {
  619. case DATE, DATETIME, DATETIME_TZ, TIME, TIME_TZ, DATETIME2, DATETIME2_TZ:
  620. return encodeByTime(val, param.column, *conn)
  621. case CHAR, VARCHAR2, VARCHAR, CLOB:
  622. return Dm_build_1.Dm_build_217(val.Format("2006-01-02 15:04:05.999999999 -07:00"), conn.getServerEncoding(), conn), nil
  623. }
  624. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  625. }
  626. func (G2DB g2db) fromDmIntervalDT(val DmIntervalDT, param parameter, conn *DmConnection) ([]byte, error) {
  627. switch param.colType {
  628. case CHAR, VARCHAR2, VARCHAR, CLOB:
  629. return Dm_build_1.Dm_build_217(val.String(), conn.getServerEncoding(), conn), nil
  630. case INTERVAL_DT:
  631. return val.encode(int(param.scale))
  632. default:
  633. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  634. }
  635. }
  636. func (G2DB g2db) fromDmdbIntervalYM(val DmIntervalYM, param parameter, conn *DmConnection) ([]byte, error) {
  637. switch param.colType {
  638. case CHAR, VARCHAR, VARCHAR2, CLOB:
  639. return Dm_build_1.Dm_build_217(val.String(), conn.getServerEncoding(), conn), nil
  640. case INTERVAL_YM:
  641. return val.encode(int(param.scale))
  642. default:
  643. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  644. }
  645. }
  646. func (G2DB g2db) fromBlob(val DmBlob, param parameter, conn *DmConnection) (interface{}, error) {
  647. var ret interface{}
  648. switch param.colType {
  649. case BINARY, VARBINARY:
  650. len, err := val.GetLength()
  651. if err != nil {
  652. return nil, err
  653. }
  654. ret, err = val.getBytes(1, int32(len))
  655. if err != nil {
  656. return nil, err
  657. }
  658. case BLOB:
  659. var err error
  660. ret, err = G2DB.blob2Blob(val, param, conn)
  661. if err != nil {
  662. return nil, err
  663. }
  664. case ARRAY, CLASS, PLTYPE_RECORD, SARRAY:
  665. default:
  666. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  667. }
  668. return ret, nil
  669. }
  670. func (G2DB g2db) fromClob(val DmClob, param parameter, conn *DmConnection) (interface{}, error) {
  671. var ret interface{}
  672. switch param.colType {
  673. case CHAR, VARCHAR, VARCHAR2:
  674. var len int64
  675. var s string
  676. var err error
  677. len, err = val.GetLength()
  678. if err != nil {
  679. return nil, err
  680. }
  681. s, err = val.getSubString(1, int32(len))
  682. if err != nil {
  683. return nil, err
  684. }
  685. ret = []byte(s)
  686. case CLOB:
  687. var err error
  688. ret, err = G2DB.clob2Clob(val, param, conn)
  689. if err != nil {
  690. return nil, err
  691. }
  692. default:
  693. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  694. }
  695. return ret, nil
  696. }
  697. func (G2DB g2db) fromReader(val io.Reader, param parameter, conn *DmConnection) (interface{}, error) {
  698. var ret interface{}
  699. switch param.colType {
  700. case CHAR, VARCHAR2, VARCHAR:
  701. var bytesBuf = new(bytes.Buffer)
  702. if _, err := bytesBuf.ReadFrom(val); err != nil {
  703. return nil, err
  704. }
  705. return Dm_build_1.Dm_build_217(string(bytesBuf.Bytes()), conn.getServerEncoding(), conn), nil
  706. case BINARY, VARBINARY:
  707. var bytesBuf = new(bytes.Buffer)
  708. if _, err := bytesBuf.ReadFrom(val); err != nil {
  709. return nil, err
  710. }
  711. return util.StringUtil.HexStringToBytes(string(bytesBuf.Bytes())), nil
  712. case BLOB, CLOB:
  713. var binder = newOffRowReaderBinder(val, conn.getServerEncoding())
  714. if binder.offRow {
  715. ret = binder
  716. } else {
  717. ret = binder.readAll()
  718. }
  719. default:
  720. return nil, ECGO_DATA_CONVERTION_ERROR.throw()
  721. }
  722. return ret, nil
  723. }
  724. func (G2DB g2db) string2Clob(val string, param parameter, conn *DmConnection) (interface{}, error) {
  725. return G2DB.changeOffRowData(param, Dm_build_1.Dm_build_217(val, conn.getServerEncoding(), conn), conn.getServerEncoding())
  726. }
  727. func (G2DB g2db) bytes2Blob(val []byte, param parameter, conn *DmConnection) (interface{}, error) {
  728. return G2DB.changeOffRowData(param, val, conn.getServerEncoding())
  729. }
  730. func (G2DB g2db) clob2Clob(val DmClob, param parameter, conn *DmConnection) (interface{}, error) {
  731. var clobLen int64
  732. var err error
  733. if clobLen, err = val.GetLength(); err != nil {
  734. return nil, err
  735. }
  736. if G2DB.isOffRow(param.colType, clobLen) {
  737. return newOffRowClobBinder(val, conn.getServerEncoding()), nil
  738. } else {
  739. var length int64
  740. var str string
  741. if length, err = val.GetLength(); err != nil {
  742. return nil, err
  743. }
  744. if str, err = val.getSubString(1, int32(length)); err != nil {
  745. return nil, err
  746. }
  747. return Dm_build_1.Dm_build_217(str, conn.getServerEncoding(), conn), nil
  748. }
  749. }
  750. func (G2DB g2db) blob2Blob(val DmBlob, param parameter, conn *DmConnection) (interface{}, error) {
  751. var clobLen int64
  752. var err error
  753. if clobLen, err = val.GetLength(); err != nil {
  754. return nil, err
  755. }
  756. if G2DB.isOffRow(param.colType, clobLen) {
  757. return newOffRowBlobBinder(val, conn.getServerEncoding()), nil
  758. } else {
  759. var length int64
  760. if length, err = val.GetLength(); err != nil {
  761. return nil, err
  762. }
  763. return val.getBytes(1, int32(length))
  764. }
  765. }
  766. func (G2DB g2db) changeOffRowData(paramDesc parameter, paramData []byte, encoding string) (interface{}, error) {
  767. if G2DB.isOffRow(paramDesc.colType, int64(len(paramData))) {
  768. return newOffRowBytesBinder(paramData, encoding), nil
  769. } else {
  770. return paramData, nil
  771. }
  772. }
  773. func (G2DB g2db) isOffRow(dtype int32, length int64) bool {
  774. return (dtype == BLOB || dtype == CLOB) && length > Dm_build_1086
  775. }
  776. func (G2DB g2db) fromObject(mem interface{}, param parameter, conn *DmConnection) ([]byte, error) {
  777. switch v := mem.(type) {
  778. case bool:
  779. return G2DB.fromBool(v, param, conn)
  780. case string:
  781. val, err := G2DB.fromString(v, param, conn)
  782. if err != nil {
  783. return nil, err
  784. }
  785. return val.([]byte), err
  786. case byte:
  787. return G2DB.fromInt64(int64(v), param, conn)
  788. case int:
  789. return G2DB.fromInt64(int64(v), param, conn)
  790. case int16:
  791. return G2DB.fromInt64(int64(v), param, conn)
  792. case int32:
  793. return G2DB.fromInt64(int64(v), param, conn)
  794. case int64:
  795. return G2DB.fromInt64(v, param, conn)
  796. case float32:
  797. return G2DB.fromFloat64(float64(v), param, conn)
  798. case float64:
  799. return G2DB.fromFloat64(v, param, conn)
  800. case time.Time:
  801. return G2DB.fromTime(v, param, conn)
  802. case DmDecimal:
  803. return G2DB.fromDecimal(v, param, conn)
  804. case DmIntervalDT:
  805. return G2DB.fromDmIntervalDT(v, param, conn)
  806. case DmIntervalYM:
  807. return G2DB.fromDmdbIntervalYM(v, param, conn)
  808. case DmBlob:
  809. length, _ := v.GetLength()
  810. return v.getBytes(1, int32(length))
  811. case DmClob:
  812. length, _ := v.GetLength()
  813. str, err := v.getSubString(1, int32(length))
  814. if err != nil {
  815. return nil, err
  816. }
  817. return Dm_build_1.Dm_build_217(str, conn.getServerEncoding(), conn), nil
  818. default:
  819. return nil, ECGO_UNSUPPORTED_TYPE.throw()
  820. }
  821. }
  822. func (G2DB g2db) toInt32(val int32) []byte {
  823. bytes := make([]byte, 4)
  824. Dm_build_1.Dm_build_17(bytes, 0, val)
  825. return bytes
  826. }
  827. func (G2DB g2db) toInt64(val int64) []byte {
  828. bytes := make([]byte, 8)
  829. Dm_build_1.Dm_build_22(bytes, 0, val)
  830. return bytes
  831. }
  832. func (G2DB g2db) toFloat32(val float32) []byte {
  833. bytes := make([]byte, 4)
  834. Dm_build_1.Dm_build_27(bytes, 0, val)
  835. return bytes
  836. }
  837. func (G2DB g2db) toFloat64(val float64) []byte {
  838. bytes := make([]byte, 8)
  839. Dm_build_1.Dm_build_32(bytes, 0, val)
  840. return bytes
  841. }
  842. func (G2DB g2db) toDecimal(val string, prec int, scale int) ([]byte, error) {
  843. d, err := decodeDecimal([]byte(val), prec, scale)
  844. if err != nil {
  845. return nil, err
  846. }
  847. return d.encodeDecimal()
  848. }
  849. func (G2DB g2db) fromArray(x *DmArray, param parameter, connection *DmConnection) (interface{}, error) {
  850. var ret interface{}
  851. var err error
  852. switch param.colType {
  853. case SARRAY:
  854. ret, err = TypeDataSV.sarrayToBytes(x, param.typeDescriptor)
  855. case CLASS, ARRAY:
  856. ret, err = TypeDataSV.arrayToBytes(x, param.typeDescriptor)
  857. case BLOB:
  858. ret, err = TypeDataSV.toBytesFromDmArray(x, param.typeDescriptor)
  859. if err == nil {
  860. ret, err = G2DB.bytes2Blob(ret.([]byte), param, connection)
  861. }
  862. default:
  863. err = ECGO_DATA_CONVERTION_ERROR.throw()
  864. }
  865. return ret, err
  866. }
  867. func (G2DB g2db) fromStruct(x *DmStruct, param parameter, connection *DmConnection) (interface{}, error) {
  868. var ret interface{}
  869. var err error
  870. switch param.colType {
  871. case CLASS:
  872. ret, err = TypeDataSV.structToBytes(x, param.typeDescriptor)
  873. case PLTYPE_RECORD:
  874. ret, err = TypeDataSV.recordToBytes(x, param.typeDescriptor)
  875. case BLOB:
  876. ret, err = TypeDataSV.toBytesFromDmStruct(x, param.typeDescriptor)
  877. if err == nil {
  878. ret, err = G2DB.bytes2Blob(ret.([]byte), param, connection)
  879. }
  880. default:
  881. err = ECGO_DATA_CONVERTION_ERROR.throw()
  882. }
  883. return ret, err
  884. }
  885. func isValidBFileStr(s string) bool {
  886. strs := strings.Split(strings.TrimSpace(s), ":")
  887. if len(strs) != 2 {
  888. return false
  889. }
  890. if len(strs[0]) > Dm_build_1014 || len(strs[1]) > Dm_build_1015 {
  891. return false
  892. }
  893. return true
  894. }