/
in_memory_location_record_array.go
51 lines (46 loc) · 1.64 KB
/
in_memory_location_record_array.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package local
type inMemoryLocationRecord struct {
recordKey LocationRecordKey
blockReference BlockReference
offsetBytes int64
sizeBytes int64
}
type inMemoryLocationRecordArray struct {
records []inMemoryLocationRecord
resolver BlockReferenceResolver
}
// NewInMemoryLocationRecordArray creates a LocationRecordArray that
// stores its data in memory. HashingKeyLocationMap relies on being able
// to store a mapping from Keys to a Location in memory or on disk. This
// type implements a non-persistent storage of such a map in memory.
func NewInMemoryLocationRecordArray(size int, resolver BlockReferenceResolver) LocationRecordArray {
return &inMemoryLocationRecordArray{
records: make([]inMemoryLocationRecord, size),
resolver: resolver,
}
}
func (lra *inMemoryLocationRecordArray) Get(index int) (LocationRecord, error) {
record := lra.records[index]
blockIndex, _, found := lra.resolver.BlockReferenceToBlockIndex(record.blockReference)
if !found {
return LocationRecord{}, ErrLocationRecordInvalid
}
return LocationRecord{
RecordKey: record.recordKey,
Location: Location{
BlockIndex: blockIndex,
OffsetBytes: record.offsetBytes,
SizeBytes: record.sizeBytes,
},
}, nil
}
func (lra *inMemoryLocationRecordArray) Put(index int, locationRecord LocationRecord) error {
blockReference, _ := lra.resolver.BlockIndexToBlockReference(locationRecord.Location.BlockIndex)
lra.records[index] = inMemoryLocationRecord{
recordKey: locationRecord.RecordKey,
blockReference: blockReference,
offsetBytes: locationRecord.Location.OffsetBytes,
sizeBytes: locationRecord.Location.SizeBytes,
}
return nil
}