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  }