xugu_lob.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package xugu
  2. import "errors"
  3. // LobDataItem 结构体定义
  4. type LobDataItem struct {
  5. ChunkNo int
  6. ItemData []byte // 使用 interface{} 表示任意类型的数据
  7. Next *LobDataItem
  8. }
  9. // LOB_PICE 常量定义
  10. const LOB_PICE = 1024 * 1024 // 1 MB
  11. // XuguLob 结构体定义
  12. type XuguLob struct {
  13. Type HANDLE_TYPE
  14. ChunkNum int
  15. State int // 0 inited 1 inputing 2 inputed ok
  16. DataOff int64
  17. RPos int64 // 增加于 2017-09-08
  18. CurItem *LobDataItem
  19. HeadItem *LobDataItem
  20. RdIfValue interface{}
  21. Desc string // 增加于 2017-09-12
  22. ErrStr string
  23. }
  24. func CreateLob() XuguLob {
  25. return XuguLob{
  26. Type: HT_LOB,
  27. ChunkNum: 0,
  28. State: 0,
  29. DataOff: 0,
  30. RPos: 0,
  31. CurItem: nil,
  32. HeadItem: nil,
  33. RdIfValue: nil,
  34. Desc: "",
  35. ErrStr: "",
  36. }
  37. }
  38. /* 大对象 数据填入
  39. * Lob_ptr 大对象指针 由XGC_Create_Lob生成,
  40. * data 数据缓冲区,其内容长度 由 len决定
  41. * len 数据缓冲区填入数据的长度, 数据存放入大对象 内部是分片存放的,非一块整的大对象,因此较为灵活
  42. * 注意 当 len 填入长度是 -1 表示整个大对象写入最终完成,此时data区域不起作用,仅标识大对象录入最终完成。
  43. * 如果最终没有 len 填入长度是 -1 那么无法标识 大对象的录入已经完成,数据录入会失败
  44. * 返回值 0
  45. */
  46. func (pLob *XuguLob) putLobData(data []byte, len int) (int, error) {
  47. if len == -1 {
  48. pLob.State = 2
  49. return 0, errors.New("LOB data input len == -1")
  50. }
  51. if len == 0 || data == nil {
  52. return 0, errors.New("LOB data input len == 0 or data == nil")
  53. }
  54. reLen := len
  55. sDataOff := 0
  56. if pLob.ChunkNum == 0 {
  57. pLob.HeadItem = new(LobDataItem)
  58. pLob.CurItem = pLob.HeadItem
  59. pLob.CurItem.ItemData = make([]byte, LOB_PICE)
  60. pLob.CurItem.ChunkNo = 0 // begin from 0
  61. pLob.ChunkNum = 1
  62. cpLen := minInt(reLen, LOB_PICE)
  63. //memcpy(pLob->p_cur_item->p_item_data, data, cp_len);
  64. copy(pLob.CurItem.ItemData, data)
  65. sDataOff += cpLen
  66. pLob.DataOff = int64(cpLen)
  67. reLen -= cpLen
  68. }
  69. for reLen != 0 { //=================满了 填入前半段////
  70. itemOff := pLob.DataOff % LOB_PICE
  71. if itemOff == 0 {
  72. pLob.CurItem.Next = new(LobDataItem)
  73. pLob.CurItem.Next.ChunkNo = pLob.ChunkNum
  74. pLob.ChunkNum++
  75. pLob.CurItem = pLob.CurItem.Next
  76. //copy data
  77. cpLen := minInt(reLen, LOB_PICE)
  78. //memcpy(pLob->p_cur_item->p_item_data, data, cp_len);
  79. copy(pLob.CurItem.ItemData, data[sDataOff:])
  80. sDataOff += cpLen
  81. pLob.DataOff += int64(cpLen)
  82. reLen -= cpLen
  83. } else {
  84. cpLen := minInt(reLen, int(LOB_PICE-itemOff))
  85. //memcpy(pLob->p_cur_item->p_item_data, data, cp_len);
  86. copy(pLob.CurItem.ItemData[cpLen:], data[sDataOff:])
  87. sDataOff += cpLen
  88. pLob.DataOff += int64(cpLen)
  89. reLen -= cpLen
  90. }
  91. }
  92. pLob.State = 1
  93. return 0, nil
  94. }
  95. func minInt(a, b int) int {
  96. if a < b {
  97. return a
  98. }
  99. return b
  100. }