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