123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- package xugu
- import "errors"
- type LobDataItem struct {
- ChunkNo int
- ItemData []byte
- Next *LobDataItem
- }
- const LOB_PICE = 1024 * 1024
- type XuguLob struct {
- Type HANDLE_TYPE
- ChunkNum int
- State int
- DataOff int64
- RPos int64
- CurItem *LobDataItem
- HeadItem *LobDataItem
- RdIfValue interface{}
- Desc string
- ErrStr string
- }
- func CreateLob() XuguLob {
- return XuguLob{
- Type: HT_LOB,
- ChunkNum: 0,
- State: 0,
- DataOff: 0,
- RPos: 0,
- CurItem: nil,
- HeadItem: nil,
- RdIfValue: nil,
- Desc: "",
- ErrStr: "",
- }
- }
- func (pLob *XuguLob) putLobData(data []byte, len int) (int, error) {
- if len == -1 {
- pLob.State = 2
- return 0, errors.New("LOB data input len == -1")
- }
- if len == 0 || data == nil {
- return 0, errors.New("LOB data input len == 0 or data == nil")
- }
- reLen := len
- sDataOff := 0
- if pLob.ChunkNum == 0 {
- pLob.HeadItem = new(LobDataItem)
- pLob.CurItem = pLob.HeadItem
- pLob.CurItem.ItemData = make([]byte, LOB_PICE)
- pLob.CurItem.ChunkNo = 0
- pLob.ChunkNum = 1
- cpLen := minInt(reLen, LOB_PICE)
-
- copy(pLob.CurItem.ItemData, data)
- sDataOff += cpLen
- pLob.DataOff = int64(cpLen)
- reLen -= cpLen
- }
- for reLen != 0 {
- itemOff := pLob.DataOff % LOB_PICE
- if itemOff == 0 {
- pLob.CurItem.Next = new(LobDataItem)
- pLob.CurItem.Next.ChunkNo = pLob.ChunkNum
- pLob.ChunkNum++
- pLob.CurItem = pLob.CurItem.Next
-
- cpLen := minInt(reLen, LOB_PICE)
-
- copy(pLob.CurItem.ItemData, data[sDataOff:])
- sDataOff += cpLen
- pLob.DataOff += int64(cpLen)
- reLen -= cpLen
- } else {
- cpLen := minInt(reLen, int(LOB_PICE-itemOff))
-
- copy(pLob.CurItem.ItemData[cpLen:], data[sDataOff:])
- sDataOff += cpLen
- pLob.DataOff += int64(cpLen)
- reLen -= cpLen
- }
- }
- pLob.State = 1
- return 0, nil
- }
- func minInt(a, b int) int {
- if a < b {
- return a
- }
- return b
- }
|