github.com/wanlay/gorm-dm8@v1.0.5/dmr/zi.go (about) 1 /* 2 * Copyright (c) 2000-2018, 达梦数据库有限公司. 3 * All rights reserved. 4 */ 5 package dmr 6 7 import ( 8 "bytes" 9 "io" 10 "math/big" 11 "strconv" 12 "strings" 13 "time" 14 15 "github.com/wanlay/gorm-dm8/dmr/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_1220.Dm_build_1398(byte(1)), nil 110 } else { 111 return Dm_build_1220.Dm_build_1398(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_1220.Dm_build_1398(byte(0)), nil 123 } 124 125 return Dm_build_1220.Dm_build_1398(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_1220.Dm_build_1398(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_1220.Dm_build_1401(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_1220.Dm_build_1404(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_1220.Dm_build_1407(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_1220.Dm_build_1410(float32(val)), nil 167 case DOUBLE: 168 return Dm_build_1220.Dm_build_1413(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_1220.Dm_build_1433(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_1220.Dm_build_1398(0), nil 212 } 213 return Dm_build_1220.Dm_build_1398(1), nil 214 case TINYINT: 215 if err := G2DB.checkTinyint(float64(val)); err != nil { 216 return nil, err 217 } 218 return Dm_build_1220.Dm_build_1398(byte(val)), nil 219 case SMALLINT: 220 if err := G2DB.checkSmallint(float64(val)); err != nil { 221 return nil, err 222 } 223 return Dm_build_1220.Dm_build_1401(int16(val)), nil 224 case INT: 225 if err := G2DB.checkInt(float64(val)); err != nil { 226 return nil, err 227 } 228 return Dm_build_1220.Dm_build_1404(int32(val)), nil 229 case BIGINT: 230 if err := G2DB.checkBigint(float64(val)); err != nil { 231 return nil, err 232 } 233 return Dm_build_1220.Dm_build_1407(int64(val)), nil 234 case REAL: 235 if err := G2DB.checkReal(float64(val)); err != nil { 236 return nil, err 237 } 238 return Dm_build_1220.Dm_build_1410(val), nil 239 case DOUBLE: 240 return Dm_build_1220.Dm_build_1413(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_1220.Dm_build_1433(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_1220.Dm_build_1398(0), nil 259 } 260 return Dm_build_1220.Dm_build_1398(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_1220.Dm_build_1398(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_1220.Dm_build_1401(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_1220.Dm_build_1404(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_1220.Dm_build_1407(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_1220.Dm_build_1410(float32(val)), nil 302 case DOUBLE: 303 return Dm_build_1220.Dm_build_1413(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_1220.Dm_build_1433(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 return G2DB.toVarchar(val) 320 case CLOB: 321 b, err := G2DB.toVarchar(val) 322 if err != nil { 323 return nil, err 324 } 325 return G2DB.changeOffRowData(param, b, conn.getServerEncoding()) 326 case BINARY, VARBINARY: 327 return val, nil 328 case BLOB: 329 return G2DB.bytes2Blob(val, param, conn) 330 case ARRAY, CLASS, PLTYPE_RECORD, SARRAY: 331 if param.typeDescriptor == nil { 332 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 333 } 334 return TypeDataSV.objBlobToBytes(val, param.typeDescriptor) 335 } 336 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 337 } 338 339 func (G2DB g2db) toVarchar(bsArr []byte) ([]byte, error) { 340 if bsArr == nil || len(bsArr) == 0 { 341 return make([]byte, 0), nil 342 } 343 344 realLen := len(bsArr) * 2 345 bsRet := make([]byte, realLen) 346 for i := 0; i < len(bsArr); i++ { 347 bsTemp, err := G2DB.toChar(bsArr[i]) 348 if err != nil { 349 return nil, err 350 } 351 352 bsRet[i*2] = bsTemp[0] 353 bsRet[i*2+1] = bsTemp[1] 354 } 355 356 return bsRet, nil 357 } 358 359 func (G2DB g2db) toChar(bt byte) ([]byte, error) { 360 bytes := make([]byte, 2) 361 var err error 362 363 bytes[0], err = G2DB.getCharByNumVal((bt >> 4) & 0x0F) 364 if err != nil { 365 return nil, err 366 } 367 368 bytes[1], err = G2DB.getCharByNumVal(bt & 0x0F) 369 if err != nil { 370 return nil, err 371 } 372 373 return bytes, nil 374 } 375 376 func (G2DB g2db) getCharByNumVal(val byte) (byte, error) { 377 if val >= 0 && val <= 9 { 378 return (byte)(val + '0'), nil 379 } 380 381 if val >= 0x0a && val <= 0x0F { 382 return (byte)(val + 'A' - 0x0a), nil 383 } 384 return 0, ECGO_INVALID_HEX.throw() 385 } 386 387 func (G2DB g2db) fromString(val string, param parameter, conn *DmConnection) (interface{}, error) { 388 switch param.colType { 389 case BOOLEAN, BIT: 390 ret, err := G2DB.toBool(val) 391 if err != nil { 392 return nil, err 393 } 394 395 if ret { 396 return Dm_build_1220.Dm_build_1398(byte(1)), nil 397 } else { 398 return Dm_build_1220.Dm_build_1398(byte(0)), nil 399 } 400 401 case TINYINT, SMALLINT, INT, BIGINT: 402 f, ok := new(big.Float).SetString(val) 403 if !ok { 404 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 405 } 406 if f.Sign() < 0 { 407 f.Sub(f, big.NewFloat(0.5)) 408 } else { 409 f.Add(f, big.NewFloat(0.5)) 410 } 411 z, _ := f.Int(nil) 412 return G2DB.fromBigInt(z, param, conn) 413 case REAL, DOUBLE, DECIMAL: 414 f, ok := new(big.Float).SetString(val) 415 if ok { 416 return G2DB.fromBigFloat(f, param, conn) 417 } else { 418 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 419 } 420 421 case CHAR, VARCHAR2, VARCHAR: 422 if isBFile(int(param.colType), int(param.prec), int(param.scale)) && !checkBFileStr(val) { 423 return nil, ECGO_INVALID_BFILE_STR.throw() 424 } 425 return Dm_build_1220.Dm_build_1433(val, conn.getServerEncoding(), conn), nil 426 case CLOB: 427 return G2DB.string2Clob(val, param, conn) 428 case BINARY, VARBINARY: 429 return util.StringUtil.HexStringToBytes(val), nil 430 case BLOB: 431 return G2DB.bytes2Blob(util.StringUtil.HexStringToBytes(val), param, conn) 432 case DATE: 433 if conn.FormatDate != "" { 434 dt, err := parse(val, conn.FormatDate, int(conn.OracleDateLanguage)) 435 if err != nil { 436 return nil, err 437 } 438 439 return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone)) 440 } 441 442 return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone)) 443 case TIME: 444 if conn.FormatTime != "" { 445 dt, err := parse(val, conn.FormatTime, int(conn.OracleDateLanguage)) 446 if err != nil { 447 return nil, err 448 } 449 450 return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone)) 451 } 452 453 return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone)) 454 case DATETIME: 455 if conn.FormatTimestamp != "" { 456 dt, err := parse(val, conn.FormatTimestamp, int(conn.OracleDateLanguage)) 457 if err != nil { 458 return nil, err 459 } 460 461 return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone)) 462 } 463 464 return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone)) 465 case TIME_TZ: 466 dt, err := parse(val, conn.FormatTimeTZ, int(conn.OracleDateLanguage)) 467 if err != nil { 468 return nil, err 469 } 470 471 if conn.FormatTimeTZ != "" { 472 return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone)) 473 } 474 475 return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone)) 476 case DATETIME_TZ: 477 if conn.FormatTimestampTZ != "" { 478 dt, err := parse(val, conn.FormatTimestampTZ, int(conn.OracleDateLanguage)) 479 if err != nil { 480 return nil, err 481 } 482 483 return encode(dt, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone)) 484 } 485 486 return encodeByString(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone)) 487 case INTERVAL_DT: 488 dt, err := NewDmIntervalDTByString(val) 489 if err != nil { 490 return nil, err 491 } 492 return dt.encode(int(param.scale)) 493 494 case INTERVAL_YM: 495 ym, err := NewDmIntervalYMByString(val) 496 if err != nil { 497 return nil, err 498 } 499 return ym.encode(int(param.scale)) 500 } 501 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 502 } 503 504 func (G2DB g2db) toBool(str string) (bool, error) { 505 str = strings.TrimSpace(str) 506 if util.StringUtil.Equals(str, "0") { 507 return false, nil 508 } else if util.StringUtil.Equals(str, "1") { 509 return true, nil 510 } 511 512 return strings.ToLower(str) == "true", nil 513 } 514 515 func (G2DB g2db) fromBigInt(val *big.Int, param parameter, conn *DmConnection) ([]byte, error) { 516 var ret []byte 517 switch param.colType { 518 case BOOLEAN, BIT: 519 if val.Sign() == 0 { 520 ret = Dm_build_1220.Dm_build_1398(0) 521 } else { 522 ret = Dm_build_1220.Dm_build_1398(1) 523 } 524 case TINYINT: 525 err := G2DB.checkTinyint(float64(val.Int64())) 526 527 if err != nil { 528 return nil, err 529 } 530 531 ret = Dm_build_1220.Dm_build_1398(byte(val.Int64())) 532 case SMALLINT: 533 err := G2DB.checkSmallint(float64(val.Int64())) 534 535 if err != nil { 536 return nil, err 537 } 538 539 ret = Dm_build_1220.Dm_build_1401(int16(val.Int64())) 540 case INT: 541 err := G2DB.checkInt(float64(val.Int64())) 542 543 if err != nil { 544 return nil, err 545 } 546 547 ret = Dm_build_1220.Dm_build_1404(int32(val.Int64())) 548 case BIGINT: 549 err := G2DB.checkBigint(float64(val.Int64())) 550 551 if err != nil { 552 return nil, err 553 } 554 555 ret = Dm_build_1220.Dm_build_1407(val.Int64()) 556 case REAL: 557 err := G2DB.checkReal(float64(val.Int64())) 558 559 if err != nil { 560 return nil, err 561 } 562 563 ret = Dm_build_1220.Dm_build_1410(float32(val.Int64())) 564 case DOUBLE: 565 ret = Dm_build_1220.Dm_build_1413(float64(val.Int64())) 566 case DECIMAL, BINARY, VARBINARY, BLOB: 567 d, err := newDecimal(val, int(param.prec), int(param.scale)) 568 if err != nil { 569 return nil, err 570 } 571 ret, err = d.encodeDecimal() 572 if err != nil { 573 return nil, err 574 } 575 case CHAR, VARCHAR2, VARCHAR, CLOB: 576 ret = Dm_build_1220.Dm_build_1433(val.String(), conn.getServerEncoding(), conn) 577 default: 578 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 579 } 580 return ret, nil 581 } 582 583 func (G2DB g2db) fromBigFloat(val *big.Float, param parameter, conn *DmConnection) ([]byte, error) { 584 var ret []byte 585 switch param.colType { 586 case BOOLEAN, BIT: 587 if val.Sign() == 0 { 588 ret = Dm_build_1220.Dm_build_1398(0) 589 } else { 590 ret = Dm_build_1220.Dm_build_1398(1) 591 } 592 case TINYINT: 593 f, _ := val.Float64() 594 595 err := G2DB.checkTinyint(f) 596 597 if err != nil { 598 return nil, err 599 } 600 601 ret = Dm_build_1220.Dm_build_1398(byte(f)) 602 case SMALLINT: 603 f, _ := val.Float64() 604 605 err := G2DB.checkSmallint(f) 606 607 if err != nil { 608 return nil, err 609 } 610 611 ret = Dm_build_1220.Dm_build_1401(int16(f)) 612 case INT: 613 f, _ := val.Float64() 614 615 err := G2DB.checkInt(f) 616 617 if err != nil { 618 return nil, err 619 } 620 621 ret = Dm_build_1220.Dm_build_1404(int32(f)) 622 case BIGINT: 623 f, _ := val.Float64() 624 625 err := G2DB.checkBigint(f) 626 627 if err != nil { 628 return nil, err 629 } 630 631 ret = Dm_build_1220.Dm_build_1407(int64(f)) 632 case REAL: 633 f, _ := val.Float64() 634 635 err := G2DB.checkReal(f) 636 637 if err != nil { 638 return nil, err 639 } 640 641 ret = Dm_build_1220.Dm_build_1410(float32(f)) 642 case DOUBLE: 643 f, _ := val.Float64() 644 ret = Dm_build_1220.Dm_build_1413(f) 645 case DECIMAL: 646 d, err := newDecimal(val, int(param.prec), int(param.scale)) 647 if err != nil { 648 return nil, err 649 } 650 ret, err = d.encodeDecimal() 651 if err != nil { 652 return nil, err 653 } 654 case CHAR, VARCHAR2, VARCHAR, CLOB: 655 ret = Dm_build_1220.Dm_build_1433(val.Text('f', int(param.scale)), conn.getServerEncoding(), conn) 656 default: 657 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 658 } 659 return ret, nil 660 } 661 662 func (G2DB g2db) fromDecimal(val DmDecimal, param parameter, conn *DmConnection) ([]byte, error) { 663 var ret []byte 664 switch param.colType { 665 case BOOLEAN, BIT: 666 if val.Sign() == 0 { 667 ret = Dm_build_1220.Dm_build_1398(0) 668 } else { 669 ret = Dm_build_1220.Dm_build_1398(1) 670 } 671 case TINYINT: 672 if err := G2DB.checkTinyint(val); err != nil { 673 return nil, err 674 } 675 ret = Dm_build_1220.Dm_build_1398(byte(val.ToBigInt().Int64())) 676 case SMALLINT: 677 if err := G2DB.checkSmallint(val); err != nil { 678 return nil, err 679 } 680 ret = Dm_build_1220.Dm_build_1401(int16(val.ToBigInt().Int64())) 681 case INT: 682 if err := G2DB.checkInt(val); err != nil { 683 return nil, err 684 } 685 ret = Dm_build_1220.Dm_build_1404(int32(val.ToBigInt().Int64())) 686 case BIGINT: 687 if err := G2DB.checkBigint(val); err != nil { 688 return nil, err 689 } 690 ret = Dm_build_1220.Dm_build_1407(int64(val.ToBigInt().Int64())) 691 case REAL: 692 if err := G2DB.checkReal(val); err != nil { 693 return nil, err 694 } 695 f, _ := val.ToBigFloat().Float32() 696 ret = Dm_build_1220.Dm_build_1410(f) 697 case DOUBLE: 698 f, _ := val.ToBigFloat().Float64() 699 ret = Dm_build_1220.Dm_build_1413(f) 700 case DECIMAL: 701 var err error 702 ret, err = val.encodeDecimal() 703 if err != nil { 704 return nil, err 705 } 706 case CHAR, VARCHAR2, VARCHAR, CLOB: 707 ret = Dm_build_1220.Dm_build_1433(val.ToBigFloat().Text('f', -1), conn.getServerEncoding(), conn) 708 default: 709 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 710 } 711 return ret, nil 712 } 713 714 func (G2DB g2db) fromTime(val time.Time, param parameter, conn *DmConnection) ([]byte, error) { 715 716 switch param.colType { 717 case DATE, DATETIME, DATETIME_TZ, TIME, TIME_TZ: 718 return encodeByTime(val, int(param.colType), int(param.scale), int(conn.dmConnector.localTimezone), int(conn.DbTimezone)) 719 case CHAR, VARCHAR2, VARCHAR, CLOB: 720 return Dm_build_1220.Dm_build_1433(val.Format("2006-01-02 15:04:05.999999999 -07:00"), conn.getServerEncoding(), conn), nil 721 } 722 723 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 724 } 725 726 func (G2DB g2db) fromDmIntervalDT(val DmIntervalDT, param parameter, conn *DmConnection) ([]byte, error) { 727 switch param.colType { 728 case CHAR, VARCHAR2, VARCHAR, CLOB: 729 return Dm_build_1220.Dm_build_1433(val.String(), conn.getServerEncoding(), conn), nil 730 case INTERVAL_DT: 731 return val.encode(int(param.scale)) 732 default: 733 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 734 } 735 } 736 737 func (G2DB g2db) fromDmdbIntervalYM(val DmIntervalYM, param parameter, conn *DmConnection) ([]byte, error) { 738 739 switch param.colType { 740 case CHAR, VARCHAR, VARCHAR2, CLOB: 741 return Dm_build_1220.Dm_build_1433(val.String(), conn.getServerEncoding(), conn), nil 742 case INTERVAL_YM: 743 return val.encode(int(param.scale)) 744 default: 745 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 746 } 747 } 748 749 func (G2DB g2db) fromBlob(val DmBlob, param parameter, conn *DmConnection) (interface{}, error) { 750 var ret interface{} 751 switch param.colType { 752 case BINARY, VARBINARY: 753 len, err := val.GetLength() 754 if err != nil { 755 return nil, err 756 } 757 ret, err = val.getBytes(1, int32(len)) 758 if err != nil { 759 return nil, err 760 } 761 case BLOB: 762 var err error 763 ret, err = G2DB.blob2Blob(val, param, conn) 764 if err != nil { 765 return nil, err 766 } 767 case ARRAY, CLASS, PLTYPE_RECORD, SARRAY: 768 769 default: 770 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 771 } 772 return ret, nil 773 } 774 775 func (G2DB g2db) fromClob(val DmClob, param parameter, conn *DmConnection) (interface{}, error) { 776 var ret interface{} 777 switch param.colType { 778 case CHAR, VARCHAR, VARCHAR2: 779 var len int64 780 var s string 781 var err error 782 len, err = val.GetLength() 783 if err != nil { 784 return nil, err 785 } 786 s, err = val.getSubString(1, int32(len)) 787 if err != nil { 788 return nil, err 789 } 790 ret = []byte(s) 791 case CLOB: 792 var err error 793 ret, err = G2DB.clob2Clob(val, param, conn) 794 if err != nil { 795 return nil, err 796 } 797 default: 798 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 799 } 800 return ret, nil 801 } 802 803 func (G2DB g2db) fromReader(val io.Reader, param parameter, conn *DmConnection) (interface{}, error) { 804 var ret interface{} 805 switch param.colType { 806 case CHAR, VARCHAR2, VARCHAR: 807 var bytesBuf = new(bytes.Buffer) 808 if _, err := bytesBuf.ReadFrom(val); err != nil { 809 return nil, err 810 } 811 return Dm_build_1220.Dm_build_1433(string(bytesBuf.Bytes()), conn.getServerEncoding(), conn), nil 812 case BINARY, VARBINARY: 813 var bytesBuf = new(bytes.Buffer) 814 if _, err := bytesBuf.ReadFrom(val); err != nil { 815 return nil, err 816 } 817 return util.StringUtil.HexStringToBytes(string(bytesBuf.Bytes())), nil 818 case BLOB, CLOB: 819 var binder = newOffRowReaderBinder(val, conn.getServerEncoding()) 820 if binder.offRow { 821 ret = binder 822 } else { 823 ret = binder.readAll() 824 } 825 default: 826 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 827 } 828 return ret, nil 829 } 830 831 func (G2DB g2db) string2Clob(val string, param parameter, conn *DmConnection) (interface{}, error) { 832 return G2DB.changeOffRowData(param, Dm_build_1220.Dm_build_1433(val, conn.getServerEncoding(), conn), conn.getServerEncoding()) 833 } 834 835 func (G2DB g2db) bytes2Blob(val []byte, param parameter, conn *DmConnection) (interface{}, error) { 836 return G2DB.changeOffRowData(param, val, conn.getServerEncoding()) 837 } 838 839 func (G2DB g2db) clob2Clob(val DmClob, param parameter, conn *DmConnection) (interface{}, error) { 840 var clobLen int64 841 var err error 842 if clobLen, err = val.GetLength(); err != nil { 843 return nil, err 844 } 845 if G2DB.isOffRow(param.colType, clobLen) { 846 return newOffRowClobBinder(val, conn.getServerEncoding()), nil 847 } else { 848 var length int64 849 var str string 850 if length, err = val.GetLength(); err != nil { 851 return nil, err 852 } 853 if str, err = val.getSubString(1, int32(length)); err != nil { 854 return nil, err 855 } 856 return Dm_build_1220.Dm_build_1433(str, conn.getServerEncoding(), conn), nil 857 } 858 } 859 860 func (G2DB g2db) blob2Blob(val DmBlob, param parameter, conn *DmConnection) (interface{}, error) { 861 var clobLen int64 862 var err error 863 if clobLen, err = val.GetLength(); err != nil { 864 return nil, err 865 } 866 if G2DB.isOffRow(param.colType, clobLen) { 867 return newOffRowBlobBinder(val, conn.getServerEncoding()), nil 868 } else { 869 var length int64 870 if length, err = val.GetLength(); err != nil { 871 return nil, err 872 } 873 return val.getBytes(1, int32(length)) 874 } 875 } 876 877 func (G2DB g2db) changeOffRowData(paramDesc parameter, paramData []byte, encoding string) (interface{}, error) { 878 if G2DB.isOffRow(paramDesc.colType, int64(len(paramData))) { 879 return newOffRowBytesBinder(paramData, encoding), nil 880 } else { 881 return paramData, nil 882 } 883 } 884 885 func (G2DB g2db) isOffRow(dtype int32, length int64) bool { 886 return (dtype == BLOB || dtype == CLOB) && length > Dm_build_714 887 } 888 889 func (G2DB g2db) fromObject(mem interface{}, param parameter, conn *DmConnection) ([]byte, error) { 890 switch v := mem.(type) { 891 case bool: 892 return G2DB.fromBool(v, param, conn) 893 case rune: 894 val, err := G2DB.fromString(string(v), param, conn) 895 return val.([]byte), err 896 case string: 897 val, err := G2DB.fromString(v, param, conn) 898 return val.([]byte), err 899 case byte: 900 return G2DB.fromInt64(int64(v), param, conn) 901 case int: 902 return G2DB.fromInt64(int64(v), param, conn) 903 case int16: 904 return G2DB.fromInt64(int64(v), param, conn) 905 case int64: 906 return G2DB.fromInt64(v, param, conn) 907 case float32: 908 return G2DB.fromFloat64(float64(v), param, conn) 909 case float64: 910 return G2DB.fromFloat64(v, param, conn) 911 case time.Time: 912 return G2DB.fromTime(v, param, conn) 913 case DmDecimal: 914 return G2DB.fromDecimal(v, param, conn) 915 case DmIntervalDT: 916 return G2DB.fromDmIntervalDT(v, param, conn) 917 case DmIntervalYM: 918 return G2DB.fromDmdbIntervalYM(v, param, conn) 919 case DmBlob: 920 length, _ := v.GetLength() 921 return v.getBytes(1, int32(length)) 922 case DmClob: 923 length, _ := v.GetLength() 924 str, err := v.getSubString(1, int32(length)) 925 if err != nil { 926 return nil, err 927 } 928 return Dm_build_1220.Dm_build_1433(str, conn.getServerEncoding(), conn), nil 929 default: 930 return nil, ECGO_UNSUPPORTED_TYPE.throw() 931 } 932 933 } 934 935 func (G2DB g2db) toInt32(val int32) []byte { 936 bytes := make([]byte, 4) 937 Dm_build_1220.Dm_build_1236(bytes, 0, val) 938 return bytes 939 } 940 941 func (G2DB g2db) toInt64(val int64) []byte { 942 bytes := make([]byte, 8) 943 Dm_build_1220.Dm_build_1241(bytes, 0, val) 944 return bytes 945 } 946 947 func (G2DB g2db) toFloat32(val float32) []byte { 948 bytes := make([]byte, 4) 949 Dm_build_1220.Dm_build_1246(bytes, 0, val) 950 return bytes 951 } 952 953 func (G2DB g2db) toFloat64(val float64) []byte { 954 bytes := make([]byte, 8) 955 Dm_build_1220.Dm_build_1251(bytes, 0, val) 956 return bytes 957 } 958 959 func (G2DB g2db) toDecimal(val string, prec int, scale int) ([]byte, error) { 960 d, err := decodeDecimal([]byte(val), prec, scale) 961 if err != nil { 962 return nil, err 963 } 964 return d.encodeDecimal() 965 } 966 967 func (G2DB g2db) fromArray(x *DmArray, param parameter, connection *DmConnection) (interface{}, error) { 968 var ret interface{} 969 var err error 970 switch param.colType { 971 case SARRAY: 972 ret, err = TypeDataSV.sarrayToBytes(x, param.typeDescriptor) 973 case CLASS, ARRAY: 974 ret, err = TypeDataSV.arrayToBytes(x, param.typeDescriptor) 975 case BLOB: 976 ret, err = TypeDataSV.toBytesFromDmArray(x, param.typeDescriptor) 977 if err == nil { 978 ret, err = G2DB.bytes2Blob(ret.([]byte), param, connection) 979 } 980 default: 981 err = ECGO_DATA_CONVERTION_ERROR.throw() 982 } 983 return ret, err 984 } 985 986 func (G2DB g2db) fromStruct(x *DmStruct, param parameter, connection *DmConnection) (interface{}, error) { 987 var ret interface{} 988 var err error 989 switch param.colType { 990 case CLASS: 991 ret, err = TypeDataSV.structToBytes(x, param.typeDescriptor) 992 case PLTYPE_RECORD: 993 ret, err = TypeDataSV.recordToBytes(x, param.typeDescriptor) 994 case BLOB: 995 ret, err = TypeDataSV.toBytesFromDmStruct(x, param.typeDescriptor) 996 if err == nil { 997 ret, err = G2DB.bytes2Blob(ret.([]byte), param, connection) 998 } 999 1000 default: 1001 err = ECGO_DATA_CONVERTION_ERROR.throw() 1002 } 1003 return ret, err 1004 } 1005 1006 func checkBFileStr(s string) bool { 1007 strs := strings.Split(strings.TrimSpace(s), ":") 1008 if len(strs) != 2 { 1009 return false 1010 } 1011 if len(strs[0]) > 128 || len(strs[1]) > 256 { 1012 return false 1013 } 1014 return true 1015 }