|
@ -13,13 +13,13 @@ type NeedleValue struct { |
|
|
|
|
|
|
|
|
type NeedleMap struct { |
|
|
type NeedleMap struct { |
|
|
indexFile *os.File |
|
|
indexFile *os.File |
|
|
m map[uint64]*NeedleValue //mapping needle key(uint64) to NeedleValue
|
|
|
|
|
|
|
|
|
m map[uint64]NeedleValue //mapping needle key(uint64) to NeedleValue
|
|
|
bytes []byte |
|
|
bytes []byte |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func NewNeedleMap(file *os.File) *NeedleMap { |
|
|
func NewNeedleMap(file *os.File) *NeedleMap { |
|
|
nm := &NeedleMap{ |
|
|
nm := &NeedleMap{ |
|
|
m: make(map[uint64]*NeedleValue), |
|
|
|
|
|
|
|
|
m: make(map[uint64]NeedleValue), |
|
|
bytes: make([]byte, 16), |
|
|
bytes: make([]byte, 16), |
|
|
indexFile: file, |
|
|
indexFile: file, |
|
|
} |
|
|
} |
|
@ -44,25 +44,25 @@ func LoadNeedleMap(file *os.File) *NeedleMap { |
|
|
offset := util.BytesToUint32(bytes[i+8 : i+12]) |
|
|
offset := util.BytesToUint32(bytes[i+8 : i+12]) |
|
|
size := util.BytesToUint32(bytes[i+12 : i+16]) |
|
|
size := util.BytesToUint32(bytes[i+12 : i+16]) |
|
|
if offset>0 { |
|
|
if offset>0 { |
|
|
nm.m[key] = &NeedleValue{util.Offset: offset, Size: size} |
|
|
|
|
|
|
|
|
nm.m[key] = NeedleValue{util.Offset: offset, Size: size} |
|
|
}else{ |
|
|
}else{ |
|
|
delete(nm.m, key) |
|
|
delete(nm.m, key) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
count, e = nm.indexFile.Read(bytes) |
|
|
count, e = nm.indexFile.Read(bytes) |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
return nm |
|
|
return nm |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func (nm *NeedleMap) Put(key uint64, offset uint32, size uint32) (int, error) { |
|
|
func (nm *NeedleMap) Put(key uint64, offset uint32, size uint32) (int, error) { |
|
|
nm.m[key] = &NeedleValue{Offset: offset, Size: size} |
|
|
|
|
|
|
|
|
nm.m[key] = NeedleValue{Offset: offset, Size: size} |
|
|
util.Uint64toBytes(nm.bytes[0:8], key) |
|
|
util.Uint64toBytes(nm.bytes[0:8], key) |
|
|
util.Uint32toBytes(nm.bytes[8:12], offset) |
|
|
util.Uint32toBytes(nm.bytes[8:12], offset) |
|
|
util.Uint32toBytes(nm.bytes[12:16], size) |
|
|
util.Uint32toBytes(nm.bytes[12:16], size) |
|
|
return nm.indexFile.Write(nm.bytes) |
|
|
return nm.indexFile.Write(nm.bytes) |
|
|
} |
|
|
} |
|
|
func (nm *NeedleMap) Get(key uint64) (element *NeedleValue, ok bool) { |
|
|
|
|
|
|
|
|
func (nm *NeedleMap) Get(key uint64) (element NeedleValue, ok bool) { |
|
|
element, ok = nm.m[key] |
|
|
element, ok = nm.m[key] |
|
|
return |
|
|
return |
|
|
} |
|
|
} |
|
@ -76,3 +76,6 @@ func (nm *NeedleMap) Delete(key uint64) { |
|
|
func (nm *NeedleMap) Close() { |
|
|
func (nm *NeedleMap) Close() { |
|
|
nm.indexFile.Close() |
|
|
nm.indexFile.Close() |
|
|
} |
|
|
} |
|
|
|
|
|
func (nm *NeedleMap) Length() int{ |
|
|
|
|
|
return len(nm.m) |
|
|
|
|
|
} |