wp
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
package storage
|
||||
|
||||
import bin "gordenko.dev/dima/bin/little"
|
||||
import (
|
||||
bin "gordenko.dev/dima/bin/little"
|
||||
)
|
||||
|
||||
const (
|
||||
PageNoSize = 4
|
||||
@@ -61,16 +63,6 @@ func BinarySearch(qty int, keyComparator KeyComparator) (elemIdx int, isFound bo
|
||||
}
|
||||
}
|
||||
|
||||
// func getPrevPageNo(buf []byte) uint32 {
|
||||
// pageNo, _ := bin.GetUint32(buf[prevPageIdx:])
|
||||
// return pageNo
|
||||
// }
|
||||
|
||||
// func GetIndexRecordsSince(buf []byte) (pageNo uint32) {
|
||||
// pageNo, _ = bin.GetUint32(buf)
|
||||
// return
|
||||
// }
|
||||
|
||||
func FindPageOnIndexLevelTail(level IndexLevelTail, timestamp uint32) (pageNo uint32) {
|
||||
comparator := ValueAtComparator{
|
||||
buf: level.Buffer,
|
||||
@@ -82,17 +74,6 @@ func FindPageOnIndexLevelTail(level IndexLevelTail, timestamp uint32) (pageNo ui
|
||||
return
|
||||
}
|
||||
|
||||
// func FindPageOnRecords(records []byte, timestamp uint32) (pageNo uint32) {
|
||||
// comparator := ValueAtComparator{
|
||||
// buf: records,
|
||||
// timestamp: timestamp,
|
||||
// }
|
||||
// count := len(records) / IndexRecordSize
|
||||
// elemIdx, _ := BinarySearch(count, comparator)
|
||||
// pageNo, _ = bin.GetUint32(records[elemIdx*IndexRecordSize:])
|
||||
// return
|
||||
// }
|
||||
|
||||
func FindPageOnIndexPage(page []byte, timestamp uint32) (pageNo uint32) {
|
||||
comparator := ValueAtComparator{
|
||||
buf: page,
|
||||
@@ -123,6 +104,108 @@ func FindPageOnIndexLevelTails(levels []IndexLevelTail, timestamp uint32) (pageN
|
||||
return
|
||||
}
|
||||
|
||||
type DeleteSinceOnIndexPageResult struct {
|
||||
Buffer []byte
|
||||
RecordsCount int
|
||||
PageNumbers []uint32
|
||||
//Idx int
|
||||
}
|
||||
|
||||
func DeleteSinceOnIndexPage(buf []byte, since uint32) DeleteSinceOnIndexPageResult {
|
||||
comparator := ValueAtComparator{
|
||||
buf: buf,
|
||||
timestamp: since,
|
||||
}
|
||||
count, _ := bin.GetUint16(buf[indexRecordsCountIdx:])
|
||||
elemIdx, _ := BinarySearch(int(count), comparator)
|
||||
newbuf := make([]byte, IndexPageSize)
|
||||
copy(newbuf, buf[:elemIdx*IndexRecordSize]) // [0..idx)
|
||||
pos := elemIdx*IndexRecordSize + 4 // timestamp size
|
||||
deleteCount := int(count) - elemIdx
|
||||
var pageNumbers []uint32
|
||||
for range deleteCount {
|
||||
pageNo, _ := bin.GetUint32(buf[pos:])
|
||||
pageNumbers = append(pageNumbers, pageNo)
|
||||
pos += IndexRecordSize
|
||||
}
|
||||
|
||||
return DeleteSinceOnIndexPageResult{
|
||||
Buffer: newbuf,
|
||||
RecordsCount: elemIdx,
|
||||
PageNumbers: pageNumbers,
|
||||
//Idx: elemIdx,
|
||||
}
|
||||
}
|
||||
|
||||
type DeleteOnIndexTailResult struct {
|
||||
RecordsCount int
|
||||
PageNumbers []uint32
|
||||
}
|
||||
|
||||
func DeleteSinceOnIndexTail(level IndexLevelTail, since uint32) DeleteOnIndexTailResult {
|
||||
comparator := ValueAtComparator{
|
||||
buf: level.Buffer,
|
||||
timestamp: since,
|
||||
}
|
||||
elemIdx, _ := BinarySearch(level.RecordsCount, comparator)
|
||||
pos := elemIdx*IndexRecordSize + 4 // timestamp size
|
||||
deleteCount := level.RecordsCount - elemIdx
|
||||
var pageNumbers []uint32
|
||||
for range deleteCount {
|
||||
pageNo, _ := bin.GetUint32(level.Buffer[pos:])
|
||||
pageNumbers = append(pageNumbers, pageNo)
|
||||
pos += IndexRecordSize
|
||||
}
|
||||
return DeleteOnIndexTailResult{
|
||||
RecordsCount: elemIdx,
|
||||
PageNumbers: pageNumbers,
|
||||
//Idx: elemIdx,
|
||||
}
|
||||
}
|
||||
|
||||
func DeleteUntilOnIndexTail(level IndexLevelTail, until uint32) DeleteOnIndexTailResult {
|
||||
comparator := ValueAtComparator{
|
||||
buf: level.Buffer,
|
||||
timestamp: until,
|
||||
}
|
||||
elemIdx, _ := BinarySearch(level.RecordsCount, comparator)
|
||||
pos := 4 // timestamp size
|
||||
deleteCount := elemIdx + 1
|
||||
var pageNumbers []uint32
|
||||
for range deleteCount {
|
||||
pageNo, _ := bin.GetUint32(level.Buffer[pos:])
|
||||
pageNumbers = append(pageNumbers, pageNo)
|
||||
pos += IndexRecordSize
|
||||
}
|
||||
copy(level.Buffer, level.Buffer[:])
|
||||
return DeleteOnIndexTailResult{
|
||||
RecordsCount: elemIdx,
|
||||
PageNumbers: pageNumbers,
|
||||
//Idx: elemIdx,
|
||||
}
|
||||
}
|
||||
|
||||
// func getPrevPageNo(buf []byte) uint32 {
|
||||
// pageNo, _ := bin.GetUint32(buf[prevPageIdx:])
|
||||
// return pageNo
|
||||
// }
|
||||
|
||||
// func GetIndexRecordsSince(buf []byte) (pageNo uint32) {
|
||||
// pageNo, _ = bin.GetUint32(buf)
|
||||
// return
|
||||
// }
|
||||
|
||||
// func FindPageOnRecords(records []byte, timestamp uint32) (pageNo uint32) {
|
||||
// comparator := ValueAtComparator{
|
||||
// buf: records,
|
||||
// timestamp: timestamp,
|
||||
// }
|
||||
// count := len(records) / IndexRecordSize
|
||||
// elemIdx, _ := BinarySearch(count, comparator)
|
||||
// pageNo, _ = bin.GetUint32(records[elemIdx*IndexRecordSize:])
|
||||
// return
|
||||
// }
|
||||
|
||||
// func findPageNoIdx(buf []byte, timestamp uint32) (idx int) {
|
||||
// comparator := ValueAtComparator{
|
||||
// buf: buf,
|
||||
@@ -167,16 +250,17 @@ func FindPageOnIndexLevelTails(levels []IndexLevelTail, timestamp uint32) (pageN
|
||||
// return
|
||||
// }
|
||||
|
||||
// func listPageNumbers(buf []byte) (pageNumbers []uint32) {
|
||||
// qty, _ := bin.GetUint16(buf[indexRecordsQtyIdx:])
|
||||
// pos := indexFooterIdx - PageNoSize
|
||||
// for range qty {
|
||||
// pageNo, _ := bin.GetUint32(buf[pos:])
|
||||
// pageNumbers = append(pageNumbers, pageNo)
|
||||
// pos -= PageNoSize
|
||||
// }
|
||||
// return
|
||||
// }
|
||||
// from index page
|
||||
func ListPageNumbers(buf []byte) (pageNumbers []uint32) {
|
||||
count, _ := bin.GetUint16(buf[indexRecordsCountIdx:])
|
||||
pos := timestampSize
|
||||
for range count {
|
||||
pageNo, _ := bin.GetUint32(buf[pos:])
|
||||
pageNumbers = append(pageNumbers, pageNo)
|
||||
pos += IndexRecordSize
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// // include since timestamp
|
||||
// func listPageNumbersSince(buf []byte, timestamp uint32) (pageNumbers []uint32) {
|
||||
|
||||
Reference in New Issue
Block a user