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