gitee.com/curryzheng/dm@v0.0.1/zzp.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 ) 11 12 const ( 13 ARRAY_TYPE_SHORT = 1 14 15 ARRAY_TYPE_INTEGER = 2 16 17 ARRAY_TYPE_LONG = 3 18 19 ARRAY_TYPE_FLOAT = 4 20 21 ARRAY_TYPE_DOUBLE = 5 22 ) 23 24 var TypeDataSV TypeData 25 26 type InterfaceTypeData interface { 27 toBytes(x *TypeData, typeDesc *TypeDescriptor) ([]byte, error) 28 } 29 30 type TypeData struct { 31 m_dumyData interface{} 32 33 m_offset int 34 35 m_bufLen int 36 37 m_dataBuf []byte 38 39 m_objBlobDescBuf []byte 40 41 m_isFromBlob bool 42 43 m_packid int 44 45 m_objRefArr []interface{} 46 } 47 48 func newTypeData(val interface{}, dataBuf []byte) *TypeData { 49 td := new(TypeData).initTypeData() 50 td.m_dumyData = val 51 td.m_offset = 0 52 td.m_bufLen = 0 53 td.m_dataBuf = dataBuf 54 return td 55 } 56 57 func (td *TypeData) initTypeData() *TypeData { 58 td.m_dumyData = nil 59 60 td.m_offset = 0 61 62 td.m_bufLen = 0 63 64 td.m_dataBuf = nil 65 66 td.m_objBlobDescBuf = nil 67 68 td.m_isFromBlob = false 69 70 td.m_packid = -1 71 72 td.m_objRefArr = make([]interface{}, 0) 73 74 return td 75 } 76 77 func (sv TypeData) toStruct(objArr []interface{}, desc *TypeDescriptor) ([]TypeData, error) { 78 size := desc.getStrctMemSize() 79 retData := make([]TypeData, size) 80 81 for i := 0; i < size; i++ { 82 83 if objArr[i] == nil { 84 retData[i] = *newTypeData(objArr[i], nil) 85 continue 86 } 87 88 switch objArr[i].(type) { 89 case DmStruct, DmArray: 90 retData[i] = *newTypeData(objArr[i], nil) 91 default: 92 switch desc.m_fieldsObj[i].getDType() { 93 case CLASS, PLTYPE_RECORD: 94 tdArr, err := sv.toStruct(objArr[i].([]interface{}), &desc.m_fieldsObj[i]) 95 if err != nil { 96 return nil, err 97 } 98 99 retData[i] = *newTypeData(newDmStructByTypeData(tdArr, &desc.m_fieldsObj[i]), nil) 100 case ARRAY, SARRAY: 101 tdArr, err := sv.toArray(objArr[i].([]interface{}), &desc.m_fieldsObj[i]) 102 if err != nil { 103 return nil, err 104 } 105 106 retData[i] = *newTypeData(newDmArrayByTypeData(tdArr, &desc.m_fieldsObj[i]), nil) 107 default: 108 tdArr, err := sv.toMemberObj(objArr[i], &desc.m_fieldsObj[i]) 109 if err != nil { 110 return nil, err 111 } 112 retData[i] = *tdArr 113 } 114 115 } 116 } 117 return retData, nil 118 } 119 120 func (sv TypeData) toArray(objArr []interface{}, desc *TypeDescriptor) ([]TypeData, error) { 121 size := len(objArr) 122 retData := make([]TypeData, size) 123 for i := 0; i < size; i++ { 124 if objArr[i] == nil { 125 retData[i] = *newTypeData(objArr[i], nil) 126 continue 127 } 128 129 switch objArr[i].(type) { 130 case DmStruct, DmArray: 131 retData[i] = *newTypeData(objArr[i], nil) 132 default: 133 switch desc.m_arrObj.getDType() { 134 case CLASS, PLTYPE_RECORD: 135 tdArr, err := sv.toStruct(objArr[i].([]interface{}), desc.m_arrObj) 136 if err != nil { 137 return nil, err 138 } 139 retData[i] = *newTypeData(newDmStructByTypeData(tdArr, desc.m_arrObj), nil) 140 case ARRAY, SARRAY: 141 142 tmp, ok := objArr[i].([]interface{}) 143 144 if !ok && desc.m_arrObj.m_arrObj != nil { 145 obj, err := sv.makeupObjToArr(tmp[i], desc.m_arrObj) 146 if err != nil { 147 return nil, err 148 } 149 objArr[i] = obj 150 } 151 152 tdArr, err := sv.toArray(objArr[i].([]interface{}), desc.m_arrObj) 153 if err != nil { 154 return nil, err 155 } 156 157 retData[i] = *newTypeData(newDmArrayByTypeData(tdArr, desc.m_arrObj), nil) 158 default: 159 tdArr, err := sv.toMemberObj(objArr[i], desc.m_arrObj) 160 if err != nil { 161 return nil, err 162 } 163 retData[i] = *tdArr 164 } 165 } 166 } 167 168 return retData, nil 169 } 170 171 func (sv TypeData) makeupObjToArr(obj interface{}, objDesc *TypeDescriptor) ([]interface{}, error) { 172 arrType := objDesc.getDType() 173 dynamic := true 174 arrLen := 0 175 if arrType == SARRAY { 176 dynamic = false 177 arrLen = objDesc.m_length 178 } 179 180 subType := objDesc.m_arrObj.getDType() 181 if subType == BINARY || subType == VARBINARY || subType == BIT { 182 183 strRet := "" 184 switch v := obj.(type) { 185 case int: 186 strRet = strconv.FormatInt(int64(v), 2) 187 case int32: 188 strRet = strconv.FormatInt(int64(v), 2) 189 case int64: 190 strRet = strconv.FormatInt(v, 2) 191 case string: 192 strRet = v 193 default: 194 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 195 } 196 var prec int 197 if dynamic { 198 prec = len(strRet) 199 } else { 200 prec = arrLen 201 } 202 203 ret := make([]interface{}, prec) 204 rs := Dm_build_1.Dm_build_214(strRet, objDesc.getServerEncoding(), objDesc.m_conn) 205 for i := 0; i < prec; i++ { 206 ret[i] = rs[i] 207 } 208 209 return ret, nil 210 } 211 212 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 213 } 214 215 func (sv TypeData) toMemberObj(mem interface{}, desc *TypeDescriptor) (*TypeData, error) { 216 var bs []byte 217 scale := desc.getScale() 218 prec := desc.getPrec() 219 dtype := desc.getDType() 220 if mem == nil { 221 return newTypeData(nil, nil), nil 222 } 223 224 param := new(parameter).InitParameter() 225 param.colType = int32(dtype) 226 param.prec = int32(prec) 227 param.scale = int32(scale) 228 229 var err error 230 bs, err = G2DB.fromObject(mem, *param, desc.m_conn) 231 if err != nil { 232 return nil, err 233 } 234 235 return newTypeData(mem, bs), nil 236 } 237 238 func (sv TypeData) typeDataToBytes(data *TypeData, desc *TypeDescriptor) ([]byte, error) { 239 dType := desc.getDType() 240 var innerData []byte 241 var err error 242 if nil == data.m_dumyData { 243 innerData = sv.realocBuffer(nil, 0, 2) 244 Dm_build_1.Dm_build_2(innerData, 0, byte(0)) 245 Dm_build_1.Dm_build_2(innerData, 1, byte(0)) 246 return innerData, nil 247 } 248 249 var result []byte 250 var offset int 251 switch dType { 252 case ARRAY: 253 254 innerData, err = sv.arrayToBytes(data.m_dumyData.(*DmArray), desc) 255 if err != nil { 256 return nil, err 257 } 258 259 result = sv.realocBuffer(nil, 0, len(innerData)+BYTE_SIZE+BYTE_SIZE) 260 261 Dm_build_1.Dm_build_2(result, 0, byte(0)) 262 offset = 1 263 264 Dm_build_1.Dm_build_2(result, offset, byte(1)) 265 offset += 1 266 copy(result[offset:offset+len(innerData)], innerData[:len(innerData)]) 267 return result, nil 268 269 case SARRAY: 270 271 innerData, err = sv.sarrayToBytes(data.m_dumyData.(*DmArray), desc) 272 if err != nil { 273 return nil, err 274 } 275 result = sv.realocBuffer(nil, 0, len(innerData)+BYTE_SIZE+BYTE_SIZE) 276 277 Dm_build_1.Dm_build_2(result, 0, byte(0)) 278 offset = 1 279 280 Dm_build_1.Dm_build_2(result, offset, byte(1)) 281 offset += 1 282 283 copy(result[offset:offset+len(innerData)], innerData[:len(innerData)]) 284 return result, nil 285 286 case CLASS: 287 288 innerData, err = sv.objToBytes(data.m_dumyData, desc) 289 if err != nil { 290 return nil, err 291 } 292 result = sv.realocBuffer(nil, 0, len(innerData)+BYTE_SIZE+BYTE_SIZE) 293 294 Dm_build_1.Dm_build_2(result, 0, byte(0)) 295 offset = 1 296 297 Dm_build_1.Dm_build_2(result, offset, byte(1)) 298 offset += 1 299 copy(result[offset:offset+len(innerData)], innerData[:len(innerData)]) 300 return result, nil 301 302 case PLTYPE_RECORD: 303 304 innerData, err = sv.recordToBytes(data.m_dumyData.(*DmStruct), desc) 305 if err != nil { 306 return nil, err 307 } 308 result = sv.realocBuffer(nil, 0, len(innerData)+BYTE_SIZE+BYTE_SIZE) 309 310 Dm_build_1.Dm_build_2(result, 0, byte(0)) 311 offset = 1 312 313 Dm_build_1.Dm_build_2(result, offset, byte(1)) 314 offset += 1 315 316 copy(result[offset:offset+len(innerData)], innerData[:len(innerData)]) 317 return result, nil 318 319 case BLOB, CLOB: 320 innerData, err = sv.convertLobToBytes(data.m_dumyData, int(desc.column.colType), desc.getServerEncoding()) 321 322 result = sv.realocBuffer(nil, 0, len(innerData)+BYTE_SIZE+BYTE_SIZE) 323 324 Dm_build_1.Dm_build_2(result, 0, byte(0)) 325 offset = 1 326 327 Dm_build_1.Dm_build_2(result, offset, byte(1)) 328 offset += 1 329 copy(result[offset:offset+len(innerData)], innerData[:len(innerData)]) 330 return result, nil 331 332 case BOOLEAN: 333 innerData = sv.realocBuffer(nil, 0, 2) 334 Dm_build_1.Dm_build_2(innerData, 0, byte(0)) 335 if data.m_dataBuf != nil && len(data.m_dataBuf) > 0 { 336 Dm_build_1.Dm_build_2(innerData, 1, data.m_dataBuf[0]) 337 } else { 338 Dm_build_1.Dm_build_2(innerData, 1, byte(0)) 339 } 340 return innerData, nil 341 342 default: 343 344 innerData = data.m_dataBuf 345 result = sv.realocBuffer(nil, 0, len(innerData)+BYTE_SIZE+BYTE_SIZE+USINT_SIZE) 346 347 Dm_build_1.Dm_build_2(result, 0, byte(0)) 348 offset = 1 349 350 Dm_build_1.Dm_build_2(result, offset, byte(1)) 351 offset += 1 352 353 Dm_build_1.Dm_build_12(result, offset, int16(len(innerData))) 354 offset += 2 355 356 copy(result[offset:offset+len(innerData)], innerData[:len(innerData)]) 357 358 return result, nil 359 } 360 } 361 362 func (sv TypeData) convertLobToBytes(value interface{}, dtype int, serverEncoding string) ([]byte, error) { 363 var tmp []byte 364 var ret []byte 365 if dtype == BLOB { 366 lob, ok := value.(DmBlob) 367 if ok { 368 l, err := lob.GetLength() 369 if err != nil { 370 return nil, err 371 } 372 tmp, err = lob.getBytes(1, int32(l)) 373 if err != nil { 374 return nil, err 375 } 376 377 ret = make([]byte, l+ULINT_SIZE) 378 Dm_build_1.Dm_build_17(ret, 0, int32(l)) 379 copy(ret[:ULINT_SIZE:ULINT_SIZE+l], tmp[:l]) 380 return ret, nil 381 } 382 383 } 384 385 if dtype == CLOB { 386 lob, ok := value.(DmClob) 387 if ok { 388 l, err := lob.GetLength() 389 if err != nil { 390 return nil, err 391 } 392 393 subString, err := lob.getSubString(1, int32(l)) 394 if err != nil { 395 return nil, err 396 } 397 398 tmp = Dm_build_1.Dm_build_214(subString, serverEncoding, nil) 399 ret = make([]byte, len(tmp)+ULINT_SIZE) 400 Dm_build_1.Dm_build_17(ret, 0, int32(l)) 401 copy(ret[:ULINT_SIZE:ULINT_SIZE+l], tmp[:l]) 402 } 403 return ret, nil 404 } 405 406 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 407 } 408 409 func (sv TypeData) sarrayToBytes(data *DmArray, desc *TypeDescriptor) ([]byte, error) { 410 realLen := len(data.m_arrData) 411 results := make([][]byte, realLen) 412 var rdata []byte 413 var err error 414 415 if desc.getObjId() == 4 { 416 return sv.ctlnToBytes(data, desc) 417 } 418 419 totalLen := 0 420 for i := 0; i < realLen; i++ { 421 results[i], err = sv.typeDataToBytes(&data.m_arrData[i], desc.m_arrObj) 422 if err != nil { 423 return nil, err 424 } 425 totalLen += len(results[i]) 426 } 427 428 totalLen += (ULINT_SIZE + ULINT_SIZE) 429 rdata = sv.realocBuffer(nil, 0, totalLen) 430 off := 0 431 432 Dm_build_1.Dm_build_17(rdata, off, int32(totalLen)) 433 off += ULINT_SIZE 434 435 Dm_build_1.Dm_build_17(rdata, off, int32(data.m_arrDesc.getLength())) 436 off += ULINT_SIZE 437 438 for i := 0; i < realLen; i++ { 439 copy(rdata[off:off+len(results[i])], results[i][:len(results[i])]) 440 off += len(results[i]) 441 } 442 443 return rdata, nil 444 } 445 446 func (sv TypeData) ctlnToBytes(data *DmArray, desc *TypeDescriptor) ([]byte, error) { 447 results := make([][]byte, len(data.m_arrData)) 448 var rdata []byte 449 var err error 450 451 var totalLen int 452 totalLen = BYTE_SIZE + ULINT_SIZE 453 454 totalLen += USINT_SIZE + USINT_SIZE + ULINT_SIZE 455 456 for i := 0; i < len(data.m_arrData); i++ { 457 results[i], err = sv.typeDataToBytes(&data.m_arrData[i], desc.m_arrObj) 458 if err != nil { 459 return nil, err 460 } 461 totalLen += len(results[i]) 462 } 463 464 rdata = sv.realocBuffer(nil, 0, totalLen) 465 466 offset := 0 467 468 Dm_build_1.Dm_build_2(rdata, offset, byte(0)) 469 offset += BYTE_SIZE 470 471 offset += ULINT_SIZE 472 473 Dm_build_1.Dm_build_12(rdata, offset, int16(desc.getCltnType())) 474 offset += USINT_SIZE 475 476 Dm_build_1.Dm_build_12(rdata, offset, int16(desc.m_arrObj.getDType())) 477 offset += USINT_SIZE 478 479 Dm_build_1.Dm_build_17(rdata, offset, int32(len(data.m_arrData))) 480 offset += ULINT_SIZE 481 482 for i := 0; i < len(data.m_arrData); i++ { 483 copy(rdata[offset:offset+len(results[i])], results[i][:len(results[i])]) 484 offset += len(results[i]) 485 } 486 487 Dm_build_1.Dm_build_17(rdata, BYTE_SIZE, int32(offset)) 488 489 return rdata, nil 490 } 491 492 func (sv TypeData) arrayToBytes(data *DmArray, desc *TypeDescriptor) ([]byte, error) { 493 results := make([][]byte, len(data.m_arrData)) 494 var rdata []byte 495 var err error 496 if desc.getObjId() == 4 { 497 return sv.ctlnToBytes(data, desc) 498 } 499 500 totalLen := 0 501 for i := 0; i < len(data.m_arrData); i++ { 502 results[i], err = sv.typeDataToBytes(&data.m_arrData[i], desc.m_arrObj) 503 if err != nil { 504 return nil, err 505 } 506 totalLen += len(results[i]) 507 } 508 509 totalLen += (ULINT_SIZE + ULINT_SIZE + ULINT_SIZE + ULINT_SIZE + ULINT_SIZE) 510 511 total := data.m_objCount + data.m_strCount 512 if total > 0 { 513 totalLen += USINT_SIZE * total 514 } 515 516 rdata = sv.realocBuffer(nil, 0, totalLen) 517 518 Dm_build_1.Dm_build_17(rdata, 0, int32(totalLen)) 519 offset := ULINT_SIZE 520 521 Dm_build_1.Dm_build_17(rdata, offset, int32(len(data.m_arrData))) 522 offset += ULINT_SIZE 523 524 Dm_build_1.Dm_build_17(rdata, offset, 0) 525 offset += ULINT_SIZE 526 527 Dm_build_1.Dm_build_17(rdata, offset, int32(data.m_objCount)) 528 offset += ULINT_SIZE 529 530 Dm_build_1.Dm_build_17(rdata, offset, int32(data.m_strCount)) 531 offset += ULINT_SIZE 532 533 for i := 0; i < total; i++ { 534 Dm_build_1.Dm_build_17(rdata, offset, int32(data.m_objStrOffs[i])) 535 offset += ULINT_SIZE 536 } 537 538 for i := 0; i < len(data.m_arrData); i++ { 539 copy(rdata[offset:offset+len(results[i])], results[i][:len(results[i])]) 540 offset += len(results[i]) 541 } 542 543 return rdata, nil 544 } 545 546 func (sv TypeData) objToBytes(data interface{}, desc *TypeDescriptor) ([]byte, error) { 547 548 switch data.(type) { 549 case DmArray: 550 return sv.arrayToBytes(data.(*DmArray), desc) 551 default: 552 return sv.structToBytes(data.(*DmStruct), desc) 553 } 554 } 555 556 func (sv TypeData) structToBytes(data *DmStruct, desc *TypeDescriptor) ([]byte, error) { 557 size := desc.getStrctMemSize() 558 results := make([][]byte, size) 559 var rdata []byte 560 var err error 561 562 totalLen := 0 563 for i := 0; i < size; i++ { 564 results[i], err = sv.typeDataToBytes(&data.m_attribs[i], &desc.m_fieldsObj[i]) 565 if err != nil { 566 return nil, err 567 } 568 totalLen += len(results[i]) 569 } 570 571 totalLen += (BYTE_SIZE + ULINT_SIZE) 572 573 rdata = sv.realocBuffer(nil, 0, totalLen) 574 offset := 0 575 576 Dm_build_1.Dm_build_2(rdata, offset, byte(0)) 577 offset += BYTE_SIZE 578 579 Dm_build_1.Dm_build_17(rdata, offset, int32(totalLen)) 580 offset += ULINT_SIZE 581 582 for i := 0; i < size; i++ { 583 copy(rdata[offset:offset+len(results[i])], results[i][:len(results[i])]) 584 offset += len(results[i]) 585 } 586 587 return rdata, nil 588 } 589 590 func (sv TypeData) recordToBytes(data *DmStruct, desc *TypeDescriptor) ([]byte, error) { 591 size := desc.getStrctMemSize() 592 results := make([][]byte, size) 593 var rdata []byte 594 var err error 595 596 totalLen := 0 597 for i := 0; i < size; i++ { 598 results[i], err = sv.typeDataToBytes(&data.m_attribs[i], &desc.m_fieldsObj[i]) 599 if err != nil { 600 return nil, err 601 } 602 totalLen += len(results[i]) 603 } 604 605 totalLen += ULINT_SIZE 606 rdata = sv.realocBuffer(nil, 0, totalLen) 607 Dm_build_1.Dm_build_17(rdata, 0, int32(totalLen)) 608 609 offset := ULINT_SIZE 610 for i := 0; i < desc.getStrctMemSize(); i++ { 611 copy(rdata[offset:offset+len(results[i])], results[i][:len(results[i])]) 612 offset += len(results[i]) 613 } 614 615 return rdata, nil 616 } 617 618 func (sv TypeData) bytesToBlob(val []byte, out *TypeData, desc *TypeDescriptor) (*TypeData, error) { 619 offset := out.m_offset 620 l := Dm_build_1.Dm_build_103(val, offset) 621 offset += ULINT_SIZE 622 623 tmp := Dm_build_1.Dm_build_152(val, offset, int(l)) 624 offset += int(l) 625 out.m_offset = offset 626 627 return newTypeData(newBlobOfLocal(tmp, desc.m_conn), tmp), nil 628 } 629 630 func (sv TypeData) bytesToClob(val []byte, out *TypeData, desc *TypeDescriptor, serverEncoding string) (*TypeData, error) { 631 offset := out.m_offset 632 l := Dm_build_1.Dm_build_103(val, offset) 633 offset += ULINT_SIZE 634 635 tmp := Dm_build_1.Dm_build_152(val, offset, int(l)) 636 offset += int(l) 637 out.m_offset = offset 638 639 return newTypeData(newClobOfLocal(Dm_build_1.Dm_build_158(tmp, 0, len(tmp), serverEncoding, desc.m_conn), desc.m_conn), tmp), nil 640 } 641 642 func (sv TypeData) bytesToTypeData(val []byte, out *TypeData, desc *TypeDescriptor) (*TypeData, error) { 643 offset := out.m_offset 644 645 offset += 1 646 647 null_flag := Dm_build_1.Dm_build_94(val, offset) 648 offset += 1 649 650 out.m_offset = offset 651 652 if desc.getDType() == BOOLEAN { 653 b := false 654 if null_flag != byte(0) { 655 b = true 656 } 657 658 tmp := Dm_build_1.Dm_build_152(val, offset-1, 1) 659 return newTypeData(b, tmp), nil 660 } 661 662 var retObj interface{} 663 var err error 664 var retDataBuf []byte 665 switch desc.getDType() { 666 case CLASS: 667 if null_flag&byte(1) != byte(0) { 668 retObj, err = sv.bytesToObj(val, out, desc) 669 if err != nil { 670 return nil, err 671 } 672 673 if out.m_offset > offset { 674 retDataBuf = Dm_build_1.Dm_build_152(val, offset, out.m_offset-offset) 675 } 676 677 return newTypeData(retObj, retDataBuf), nil 678 } else { 679 return newTypeData(nil, nil), nil 680 } 681 682 case ARRAY: 683 if (null_flag & byte(1)) != byte(0) { 684 retObj, err = sv.bytesToArray(val, out, desc) 685 if err != nil { 686 return nil, err 687 } 688 689 if out.m_offset > offset { 690 retDataBuf = Dm_build_1.Dm_build_152(val, offset, out.m_offset-offset) 691 } 692 693 return newTypeData(retObj, retDataBuf), nil 694 } else { 695 return newTypeData(nil, nil), nil 696 } 697 698 case PLTYPE_RECORD: 699 if (null_flag & byte(1)) != byte(0) { 700 retObj, err = sv.bytesToRecord(val, out, desc) 701 if err != nil { 702 return nil, err 703 } 704 705 if out.m_offset > offset { 706 retDataBuf = Dm_build_1.Dm_build_152(val, offset, out.m_offset-offset) 707 } 708 709 return newTypeData(retObj, retDataBuf), nil 710 } else { 711 return newTypeData(nil, nil), nil 712 } 713 714 case SARRAY: 715 if (null_flag & byte(1)) != byte(0) { 716 retObj, err = sv.bytesToSArray(val, out, desc) 717 if err != nil { 718 return nil, err 719 } 720 721 if out.m_offset > offset { 722 retDataBuf = Dm_build_1.Dm_build_152(val, offset, out.m_offset-offset) 723 } 724 725 return newTypeData(retObj, retDataBuf), nil 726 } else { 727 return newTypeData(nil, nil), nil 728 } 729 730 case BLOB: 731 if null_flag&byte(1) != byte(0) { 732 return sv.bytesToBlob(val, out, desc) 733 } else { 734 return newTypeData(nil, nil), nil 735 } 736 737 case CLOB: 738 if null_flag&byte(1) != byte(0) { 739 return sv.bytesToClob(val, out, desc, desc.getServerEncoding()) 740 } else { 741 return newTypeData(nil, nil), nil 742 } 743 744 default: 745 if null_flag&byte(1) != byte(0) { 746 return sv.convertBytes2BaseData(val, out, desc) 747 } else { 748 return newTypeData(nil, nil), nil 749 } 750 751 } 752 } 753 754 func (sv TypeData) checkObjExist(val []byte, out *TypeData) bool { 755 offset := out.m_offset 756 exist_flag := Dm_build_1.Dm_build_94(val, offset) 757 offset += 1 758 759 out.m_offset = offset 760 761 if exist_flag == byte(1) { 762 return true 763 } 764 765 out.m_offset += ULINT_SIZE 766 return false 767 } 768 769 func (sv TypeData) findObjByPackId(val []byte, out *TypeData) (*DmStruct, error) { 770 offset := out.m_offset 771 772 pack_id := int(Dm_build_1.Dm_build_103(val, offset)) 773 offset += ULINT_SIZE 774 775 out.m_offset = offset 776 777 if pack_id < 0 || pack_id > out.m_packid { 778 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 779 } 780 781 return out.m_objRefArr[pack_id].(*DmStruct), nil 782 } 783 784 func (sv TypeData) addObjToRefArr(out *TypeData, objToAdd interface{}) { 785 out.m_objRefArr = append(out.m_objRefArr, objToAdd) 786 out.m_packid++ 787 } 788 789 func (sv TypeData) checkObjClnt(desc *TypeDescriptor) bool { 790 return desc.m_objId == 4 791 } 792 793 func (sv TypeData) bytesToObj_EXACT(val []byte, out *TypeData, desc *TypeDescriptor) (*DmStruct, error) { 794 strOut := newDmStructByTypeData(nil, desc) 795 var sub_desc *TypeDescriptor 796 offset := out.m_offset 797 798 size := desc.getStrctMemSize() 799 800 out.m_offset = offset 801 802 strOut.m_attribs = make([]TypeData, size) 803 for i := 0; i < size; i++ { 804 sub_desc = &desc.m_fieldsObj[i] 805 tmp, err := sv.bytesToTypeData(val, out, sub_desc) 806 if err != nil { 807 return nil, err 808 } 809 strOut.m_attribs[i] = *tmp 810 } 811 812 strOut.m_dataBuf = Dm_build_1.Dm_build_152(val, offset, out.m_offset-offset) 813 814 return strOut, nil 815 } 816 817 func (sv TypeData) bytesToNestTab(val []byte, out *TypeData, desc *TypeDescriptor) (*DmArray, error) { 818 offset := out.m_offset 819 820 offset += USINT_SIZE 821 822 count := Dm_build_1.Dm_build_103(val, offset) 823 offset += ULINT_SIZE 824 825 out.m_offset = offset 826 827 arrOut := newDmArrayByTypeData(nil, desc) 828 arrOut.m_itemCount = int(count) 829 arrOut.m_arrData = make([]TypeData, count) 830 for i := 0; i < int(count); i++ { 831 tmp, err := sv.bytesToTypeData(val, out, desc.m_arrObj) 832 if err != nil { 833 return nil, err 834 } 835 arrOut.m_arrData[i] = *tmp 836 } 837 838 arrOut.m_dataBuf = Dm_build_1.Dm_build_152(val, offset, out.m_offset-offset) 839 840 return arrOut, nil 841 } 842 843 func (sv TypeData) bytesToClnt(val []byte, out *TypeData, desc *TypeDescriptor) (*DmArray, error) { 844 var array *DmArray 845 846 offset := out.m_offset 847 848 cltn_type := Dm_build_1.Dm_build_98(val, offset) 849 offset += USINT_SIZE 850 851 out.m_offset = offset 852 switch cltn_type { 853 case CLTN_TYPE_IND_TABLE: 854 return nil, ECGO_UNSUPPORTED_TYPE.throw() 855 856 case CLTN_TYPE_NST_TABLE, CLTN_TYPE_VARRAY: 857 return sv.bytesToNestTab(val, out, desc) 858 } 859 860 return array, nil 861 } 862 863 func (sv TypeData) bytesToObj(val []byte, out *TypeData, desc *TypeDescriptor) (interface{}, error) { 864 var retObj interface{} 865 var err error 866 if out == nil { 867 out = newTypeData(nil, nil) 868 } 869 870 if sv.checkObjExist(val, out) { 871 retObj, err = sv.findObjByPackId(val, out) 872 if err != nil { 873 return nil, err 874 } 875 } else { 876 sv.addObjToRefArr(out, retObj) 877 } 878 879 if sv.checkObjClnt(desc) { 880 retObj, err = sv.bytesToClnt(val, out, desc) 881 if err != nil { 882 return nil, err 883 } 884 } else { 885 retObj, err = sv.bytesToObj_EXACT(val, out, desc) 886 if err != nil { 887 return nil, err 888 } 889 } 890 891 return retObj, nil 892 } 893 894 func (sv TypeData) bytesToArray(val []byte, out *TypeData, desc *TypeDescriptor) (*DmArray, error) { 895 arrOut := newDmArrayByTypeData(nil, desc) 896 if out == nil { 897 out = newTypeData(nil, nil) 898 } 899 900 offset := out.m_offset 901 902 arrOut.m_bufLen = int(Dm_build_1.Dm_build_103(val, offset)) 903 offset += 4 904 905 arrOut.m_itemCount = int(Dm_build_1.Dm_build_103(val, offset)) 906 offset += ULINT_SIZE 907 908 arrOut.m_itemSize = int(Dm_build_1.Dm_build_103(val, offset)) 909 offset += ULINT_SIZE 910 911 arrOut.m_objCount = int(Dm_build_1.Dm_build_103(val, offset)) 912 offset += ULINT_SIZE 913 914 arrOut.m_strCount = int(Dm_build_1.Dm_build_103(val, offset)) 915 offset += ULINT_SIZE 916 917 total := arrOut.m_objCount + arrOut.m_strCount 918 arrOut.m_objStrOffs = make([]int, total) 919 for i := 0; i < total; i++ { 920 arrOut.m_objStrOffs[i] = int(Dm_build_1.Dm_build_103(val, offset)) 921 offset += 4 922 } 923 924 out.m_offset = offset 925 926 arrOut.m_arrData = make([]TypeData, arrOut.m_itemCount) 927 for i := 0; i < arrOut.m_itemCount; i++ { 928 tmp, err := sv.bytesToTypeData(val, out, desc.m_arrObj) 929 if err != nil { 930 return nil, err 931 } 932 arrOut.m_arrData[i] = *tmp 933 } 934 935 arrOut.m_dataBuf = Dm_build_1.Dm_build_152(val, offset, out.m_offset-offset) 936 937 return arrOut, nil 938 } 939 940 func (sv TypeData) bytesToSArray(val []byte, out *TypeData, desc *TypeDescriptor) (*DmArray, error) { 941 if out == nil { 942 out = newTypeData(nil, nil) 943 } 944 945 offset := out.m_offset 946 947 arrOut := newDmArrayByTypeData(nil, desc) 948 arrOut.m_bufLen = int(Dm_build_1.Dm_build_103(val, offset)) 949 offset += ULINT_SIZE 950 951 arrOut.m_itemCount = int(Dm_build_1.Dm_build_103(val, offset)) 952 offset += ULINT_SIZE 953 954 out.m_offset = offset 955 956 arrOut.m_arrData = make([]TypeData, arrOut.m_itemCount) 957 for i := 0; i < arrOut.m_itemCount; i++ { 958 tmp, err := sv.bytesToTypeData(val, out, desc.m_arrObj) 959 if err != nil { 960 return nil, err 961 } 962 arrOut.m_arrData[i] = *tmp 963 } 964 965 arrOut.m_dataBuf = Dm_build_1.Dm_build_152(val, offset, out.m_offset-offset) 966 967 return arrOut, nil 968 } 969 970 func (sv TypeData) bytesToRecord(val []byte, out *TypeData, desc *TypeDescriptor) (*DmStruct, error) { 971 if out == nil { 972 out = newTypeData(nil, nil) 973 } 974 975 offset := out.m_offset 976 977 strOut := newDmStructByTypeData(nil, desc) 978 strOut.m_bufLen = int(Dm_build_1.Dm_build_103(val, offset)) 979 offset += ULINT_SIZE 980 981 out.m_offset = offset 982 983 strOut.m_attribs = make([]TypeData, desc.getStrctMemSize()) 984 for i := 0; i < desc.getStrctMemSize(); i++ { 985 tmp, err := sv.bytesToTypeData(val, out, desc.m_arrObj) 986 if err != nil { 987 return nil, err 988 } 989 strOut.m_attribs[i] = *tmp 990 } 991 992 strOut.m_dataBuf = Dm_build_1.Dm_build_152(val, offset, out.m_offset-offset) 993 994 return strOut, nil 995 } 996 997 func (sv TypeData) objBlob_GetChkBuf(buf []byte, typeData *TypeData) { 998 999 offset := 4 1000 1001 l := int(Dm_build_1.Dm_build_103(buf, offset)) 1002 offset += ULINT_SIZE 1003 1004 typeData.m_objBlobDescBuf = Dm_build_1.Dm_build_152(buf, offset, l) 1005 offset += l 1006 1007 typeData.m_isFromBlob = true 1008 1009 typeData.m_offset = offset 1010 } 1011 1012 func (sv TypeData) objBlobToObj(lob *DmBlob, desc *TypeDescriptor) (interface{}, error) { 1013 typeData := newTypeData(nil, nil) 1014 loblen, err := lob.GetLength() 1015 if err != nil { 1016 return nil, err 1017 } 1018 1019 buf, err := lob.getBytes(1, int32(loblen)) 1020 if err != nil { 1021 return nil, err 1022 } 1023 1024 sv.objBlob_GetChkBuf(buf, typeData) 1025 1026 return sv.bytesToObj(buf, typeData, desc) 1027 } 1028 1029 func (sv TypeData) objBlobToBytes(lobBuf []byte, desc *TypeDescriptor) ([]byte, error) { 1030 l := len(lobBuf) 1031 offset := 0 1032 1033 magic := Dm_build_1.Dm_build_103(lobBuf, offset) 1034 offset += ULINT_SIZE 1035 1036 if OBJ_BLOB_MAGIC != magic { 1037 return nil, ECGO_INVALID_OBJ_BLOB.throw() 1038 } 1039 1040 descLen := int(Dm_build_1.Dm_build_103(lobBuf, offset)) 1041 offset += ULINT_SIZE 1042 descBuf := Dm_build_1.Dm_build_152(lobBuf, offset, descLen) 1043 tmp, err := desc.getClassDescChkInfo() 1044 if err != nil { 1045 return nil, err 1046 } 1047 if !util.SliceEquals(descBuf, tmp) { 1048 return nil, ECGO_INVALID_OBJ_BLOB.throw() 1049 } 1050 offset += descLen 1051 1052 ret := make([]byte, l-offset) 1053 copy(ret[:len(ret)], lobBuf[offset:offset+len(ret)]) 1054 return ret, nil 1055 } 1056 1057 func (sv TypeData) realocBuffer(oldBuf []byte, offset int, needLen int) []byte { 1058 var retBuf []byte 1059 1060 if oldBuf == nil { 1061 return make([]byte, needLen) 1062 } else if needLen+offset > len(oldBuf) { 1063 retBuf = make([]byte, len(oldBuf)+needLen) 1064 copy(retBuf[:offset], oldBuf[:offset]) 1065 } else { 1066 retBuf = oldBuf 1067 } 1068 1069 return retBuf 1070 } 1071 1072 func (sv TypeData) convertBytes2BaseData(val []byte, out *TypeData, desc *TypeDescriptor) (*TypeData, error) { 1073 offset := out.m_offset 1074 isNull := false 1075 valueLen := int(Dm_build_1.Dm_build_125(val, offset)) 1076 offset += USINT_SIZE 1077 1078 if valueLen == int(Dm_build_1008) { 1079 valueLen = 0 1080 isNull = true 1081 } 1082 1083 if -1 == valueLen { 1084 valueLen = int(Dm_build_1.Dm_build_103(val, offset)) 1085 offset += ULINT_SIZE 1086 } 1087 1088 if isNull { 1089 out.m_offset = offset 1090 return newTypeData(nil, nil), nil 1091 } 1092 1093 var tmpObj interface{} 1094 var err error 1095 temp := Dm_build_1.Dm_build_152(val, offset, valueLen) 1096 offset += valueLen 1097 out.m_offset = offset 1098 1099 tmpObj, err = DB2G.toObject(temp, desc.column, desc.m_conn) 1100 if err != nil { 1101 return nil, err 1102 } 1103 return newTypeData(tmpObj, temp), nil 1104 } 1105 1106 func (td *TypeData) toJavaArray(arr *DmArray, index int64, l int, dType int) (interface{}, error) { 1107 if arr.m_objArray != nil { 1108 return arr.m_objArray, nil 1109 } 1110 1111 var nr = make([]interface{}, l) 1112 var tempData *TypeData 1113 switch dType { 1114 case CHAR, VARCHAR, VARCHAR2: 1115 for i := 0; i < l; i++ { 1116 tempData = &arr.m_arrData[index+int64(i)] 1117 if tempData != nil && tempData.m_dumyData != nil { 1118 nr[i] = tempData.m_dumyData 1119 } 1120 } 1121 case BIT, TINYINT: 1122 for i := 0; i < l; i++ { 1123 tempData = &arr.m_arrData[index+int64(i)] 1124 if tempData != nil && tempData.m_dumyData != nil { 1125 nr[i] = tempData.m_dumyData 1126 } else { 1127 nr[i] = nil 1128 } 1129 } 1130 1131 case BINARY, VARBINARY: 1132 for i := 0; i < l; i++ { 1133 tempData = &arr.m_arrData[index+int64(i)] 1134 if tempData != nil && tempData.m_dumyData != nil { 1135 nr[i] = tempData.m_dumyData 1136 } 1137 } 1138 1139 case BOOLEAN: 1140 for i := 0; i < l; i++ { 1141 tempData = &arr.m_arrData[index+int64(i)] 1142 if tempData != nil && tempData.m_dumyData != nil { 1143 nr[i] = tempData.m_dumyData 1144 } else { 1145 nr[i] = nil 1146 } 1147 } 1148 1149 case SMALLINT: 1150 for i := 0; i < l; i++ { 1151 tempData = &arr.m_arrData[index+int64(i)] 1152 if tempData != nil && tempData.m_dumyData != nil { 1153 nr[i] = tempData.m_dumyData 1154 } else { 1155 nr[i] = nil 1156 } 1157 } 1158 1159 case INT: 1160 for i := 0; i < l; i++ { 1161 tempData = &arr.m_arrData[index+int64(i)] 1162 if tempData != nil && tempData.m_dumyData != nil { 1163 nr[i] = tempData.m_dumyData 1164 } else { 1165 nr[i] = nil 1166 } 1167 } 1168 1169 case BIGINT: 1170 for i := 0; i < l; i++ { 1171 tempData = &arr.m_arrData[index+int64(i)] 1172 if tempData != nil && tempData.m_dumyData != nil { 1173 nr[i] = tempData.m_dumyData 1174 } else { 1175 nr[i] = nil 1176 } 1177 } 1178 1179 case DECIMAL: 1180 1181 for i := 0; i < l; i++ { 1182 tempData = &arr.m_arrData[index+int64(i)] 1183 if tempData != nil && tempData.m_dumyData != nil { 1184 nr[i] = tempData.m_dumyData 1185 } 1186 } 1187 case REAL: 1188 for i := 0; i < l; i++ { 1189 tempData = &arr.m_arrData[index+int64(i)] 1190 if tempData != nil && tempData.m_dumyData != nil { 1191 nr[i] = tempData.m_dumyData 1192 } else { 1193 nr[i] = nil 1194 } 1195 } 1196 1197 case DOUBLE: 1198 for i := 0; i < l; i++ { 1199 tempData = &arr.m_arrData[index+int64(i)] 1200 if tempData != nil && tempData.m_dumyData != nil { 1201 nr[i] = tempData.m_dumyData 1202 } else { 1203 nr[i] = nil 1204 } 1205 } 1206 1207 case DATE, TIME, DATETIME, TIME_TZ, DATETIME_TZ: 1208 for i := 0; i < l; i++ { 1209 tempData = &arr.m_arrData[index+int64(i)] 1210 if tempData != nil && tempData.m_dumyData != nil { 1211 nr[i] = tempData.m_dumyData 1212 } 1213 } 1214 1215 case INTERVAL_YM: 1216 for i := 0; i < l; i++ { 1217 tempData = &arr.m_arrData[index+int64(i)] 1218 if tempData != nil && tempData.m_dumyData != nil { 1219 nr[i] = tempData.m_dumyData 1220 } 1221 } 1222 1223 case INTERVAL_DT: 1224 for i := 0; i < l; i++ { 1225 tempData = &arr.m_arrData[index+int64(i)] 1226 if tempData != nil && tempData.m_dumyData != nil { 1227 nr[i] = tempData.m_dumyData 1228 } 1229 } 1230 1231 case PLTYPE_RECORD, CLASS, ARRAY, SARRAY: 1232 for i := 0; i < l; i++ { 1233 tempData = &arr.m_arrData[index+int64(i)] 1234 if tempData != nil { 1235 nr[i] = tempData.m_dumyData 1236 } 1237 } 1238 1239 case BLOB: 1240 for i := 0; i < l; i++ { 1241 tempData = &arr.m_arrData[index+int64(i)] 1242 if tempData != nil && tempData.m_dumyData != nil { 1243 nr[i] = tempData.m_dumyData 1244 } 1245 } 1246 1247 case CLOB: 1248 for i := 0; i < l; i++ { 1249 tempData = &arr.m_arrData[index+int64(i)] 1250 if tempData != nil && tempData.m_dumyData != nil { 1251 nr[i] = tempData.m_dumyData 1252 } 1253 } 1254 1255 default: 1256 return nil, ECGO_UNSUPPORTED_TYPE.throw() 1257 } 1258 1259 return nr, nil 1260 } 1261 1262 func (td *TypeData) toNumericArray(arr *DmArray, index int64, l int, flag int) (interface{}, error) { 1263 if nil == arr.m_objArray { 1264 return nil, nil 1265 } 1266 1267 var retObj interface{} 1268 switch arr.m_objArray.(type) { 1269 case []int16: 1270 if flag == ARRAY_TYPE_SHORT { 1271 ret := make([]int16, l) 1272 copy(ret[:l], arr.m_objArray.([]int16)[index:index+int64(l)]) 1273 retObj = ret 1274 } 1275 case []int: 1276 if flag == ARRAY_TYPE_INTEGER { 1277 ret := make([]int, l) 1278 copy(ret[:l], arr.m_objArray.([]int)[index:index+int64(l)]) 1279 retObj = ret 1280 } 1281 case []int64: 1282 if flag == ARRAY_TYPE_LONG { 1283 ret := make([]int64, l) 1284 copy(ret[:l], arr.m_objArray.([]int64)[index:index+int64(l)]) 1285 retObj = ret 1286 } 1287 case []float32: 1288 if flag == ARRAY_TYPE_FLOAT { 1289 ret := make([]float32, l) 1290 copy(ret[:l], arr.m_objArray.([]float32)[index:index+int64(l)]) 1291 retObj = ret 1292 } 1293 case []float64: 1294 if flag == ARRAY_TYPE_DOUBLE { 1295 ret := make([]float64, l) 1296 copy(ret[:l], arr.m_objArray.([]float64)[index:index+int64(l)]) 1297 retObj = ret 1298 } 1299 default: 1300 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 1301 } 1302 1303 return retObj, nil 1304 } 1305 1306 func (td *TypeData) toJavaArrayByDmStruct(st *DmStruct) ([]interface{}, error) { 1307 attrsData := st.getAttribsTypeData() 1308 if nil == st.getAttribsTypeData() || len(st.getAttribsTypeData()) <= 0 { 1309 return nil, nil 1310 } 1311 1312 fields := st.m_strctDesc.getItemsDesc() 1313 if len(attrsData) != len(fields) { 1314 return nil, ECGO_STRUCT_MEM_NOT_MATCH.throw() 1315 } 1316 1317 out := make([]interface{}, len(fields)) 1318 for i := 0; i < len(fields); i++ { 1319 out[i] = attrsData[i].m_dumyData 1320 } 1321 1322 return out, nil 1323 } 1324 1325 func (td *TypeData) toBytesFromDmArray(x *DmArray, typeDesc *TypeDescriptor) ([]byte, error) { 1326 var err error 1327 desc, err := typeDesc.getClassDescChkInfo() 1328 if err != nil { 1329 return nil, err 1330 } 1331 var data []byte 1332 switch typeDesc.getDType() { 1333 case ARRAY: 1334 data, err = TypeDataSV.arrayToBytes(x, typeDesc) 1335 if err != nil { 1336 return nil, err 1337 } 1338 case SARRAY: 1339 data, err = TypeDataSV.sarrayToBytes(x, typeDesc) 1340 if err != nil { 1341 return nil, err 1342 } 1343 case PLTYPE_RECORD: 1344 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 1345 case CLASS: 1346 data, err = TypeDataSV.objToBytes(x, typeDesc) 1347 if err != nil { 1348 return nil, err 1349 } 1350 } 1351 ret := make([]byte, ULINT_SIZE+ULINT_SIZE+len(desc)+len(data)) 1352 Dm_build_1.Dm_build_17(ret, 0, OBJ_BLOB_MAGIC) 1353 Dm_build_1.Dm_build_17(ret, ULINT_SIZE, int32(len(desc))) 1354 copy(ret[ULINT_SIZE+ULINT_SIZE:ULINT_SIZE+ULINT_SIZE+len(desc)], desc[:len(desc)]) 1355 copy(ret[ULINT_SIZE+ULINT_SIZE:ULINT_SIZE+ULINT_SIZE+len(desc)+len(data)], desc[:len(data)]) 1356 return ret, nil 1357 } 1358 1359 func (td *TypeData) toBytesFromDmStruct(x *DmStruct, typeDesc *TypeDescriptor) ([]byte, error) { 1360 var err error 1361 desc, err := typeDesc.getClassDescChkInfo() 1362 if err != nil { 1363 return nil, err 1364 } 1365 var data []byte 1366 switch typeDesc.getDType() { 1367 case ARRAY: 1368 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 1369 case SARRAY: 1370 return nil, ECGO_DATA_CONVERTION_ERROR.throw() 1371 case PLTYPE_RECORD: 1372 data, err = TypeDataSV.recordToBytes(x, typeDesc) 1373 if err != nil { 1374 return nil, err 1375 } 1376 case CLASS: 1377 data, err = TypeDataSV.objToBytes(x, typeDesc) 1378 if err != nil { 1379 return nil, err 1380 } 1381 } 1382 ret := make([]byte, ULINT_SIZE+ULINT_SIZE+len(desc)+len(data)) 1383 Dm_build_1.Dm_build_17(ret, 0, OBJ_BLOB_MAGIC) 1384 Dm_build_1.Dm_build_17(ret, ULINT_SIZE, int32(len(desc))) 1385 copy(ret[ULINT_SIZE+ULINT_SIZE:ULINT_SIZE+ULINT_SIZE+len(desc)], desc[:len(desc)]) 1386 copy(ret[ULINT_SIZE+ULINT_SIZE:ULINT_SIZE+ULINT_SIZE+len(desc)+len(data)], desc[:len(data)]) 1387 return ret, nil 1388 }