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