This commit is contained in:
2026-06-19 07:25:46 +03:00
parent 06823ee547
commit 2d73ce1727
52 changed files with 5173 additions and 547 deletions

View File

@@ -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) {