zzo.go 32 KB

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