This commit is contained in:
2026-05-10 00:59:47 +00:00
parent 271046231c
commit 9b38586ed8
30 changed files with 3560 additions and 1823 deletions

View File

@@ -9,9 +9,7 @@ import (
"io"
"os"
diploma "gordenko.dev/dima/qb"
"gordenko.dev/dima/qb/bin"
"gordenko.dev/dima/qb/proto"
)
type Reader struct {
@@ -102,49 +100,43 @@ func (s *Reader) parseRecords(body []byte) ([]any, error) {
switch recordType {
case CodeAddedMetric:
var rec AddedMetric
rec, err = s.readAddedMetric(src)
if err != nil {
rec := new(AddedMetric)
if err = rec.Parse(src); err != nil {
return nil, err
}
records = append(records, rec)
case CodeDeletedMetric:
var rec DeletedMetric
rec, err = s.readDeletedMetric(src)
if err != nil {
rec := new(DeletedMetric)
if err = rec.Parse(src); err != nil {
return nil, err
}
records = append(records, rec)
case CodeAppendedMeasure:
var rec AppendedMeasure
rec, err = s.readAppendedMeasure(src)
if err != nil {
rec := new(AppendedMeasure)
if err = rec.Parse(src); err != nil {
return nil, err
}
records = append(records, rec)
case CodeAppendedMeasures:
var rec AppendedMeasures
rec, err = s.readAppendedMeasures(src)
if err != nil {
rec := new(AppendedMeasures)
if err = rec.Parse(src); err != nil {
return nil, err
}
records = append(records, rec)
case CodeAppendedMeasureWithOverflow:
var rec AppendedMeasureWithOverflow
rec, err = s.readAppendedMeasureWithOverflow(src)
if err != nil {
case CodeAppendedPages:
rec := new(AppendedPages)
if err = rec.Parse(src); err != nil {
return nil, err
}
records = append(records, rec)
case CodeDeletedMeasures:
var rec DeletedMeasures
rec, err = s.readDeletedMeasures(src)
if err != nil {
rec := new(DeletedMeasures)
if err = rec.Parse(src); err != nil {
return nil, err
}
records = append(records, rec)
@@ -155,183 +147,183 @@ func (s *Reader) parseRecords(body []byte) ([]any, error) {
}
}
func (s *Reader) readAddedMetric(src *bytes.Buffer) (_ AddedMetric, err error) {
arr, err := bin.ReadN(src, 6)
if err != nil {
return
}
return AddedMetric{
MetricID: bin.GetUint32(arr),
MetricType: diploma.MetricType(arr[4]),
FracDigits: int(arr[5]),
}, nil
}
// func (s *Reader) readAddedMetric(src *bytes.Buffer) (_ AddedMetric, err error) {
// arr, err := bin.ReadN(src, 6)
// if err != nil {
// return
// }
// return AddedMetric{
// MetricID: bin.GetUint32(arr),
// MetricType: diploma.MetricType(arr[4]),
// FracDigits: int(arr[5]),
// }, nil
// }
func (s *Reader) readDeletedMetric(src *bytes.Buffer) (_ DeletedMetric, err error) {
var rec DeletedMetric
rec.MetricID, err = bin.ReadUint32(src)
if err != nil {
return
}
// free data pages
dataQty, _, err := bin.ReadVarUint64(src)
if err != nil {
return
}
for range dataQty {
var pageNo uint32
pageNo, err = bin.ReadUint32(src)
if err != nil {
return
}
rec.FreeDataPages = append(rec.FreeDataPages, pageNo)
}
// free index pages
indexQty, _, err := bin.ReadVarUint64(src)
if err != nil {
return
}
for range indexQty {
var pageNo uint32
pageNo, err = bin.ReadUint32(src)
if err != nil {
return
}
rec.FreeIndexPages = append(rec.FreeIndexPages, pageNo)
}
return rec, nil
}
// func (s *Reader) readDeletedMetric(src *bytes.Buffer) (_ DeletedMetric, err error) {
// var rec DeletedMetric
// rec.MetricID, err = bin.ReadUint32(src)
// if err != nil {
// return
// }
// // free data pages
// dataQty, _, err := bin.ReadVarUint64(src)
// if err != nil {
// return
// }
// for range dataQty {
// var pageNo uint32
// pageNo, err = bin.ReadUint32(src)
// if err != nil {
// return
// }
// rec.FreeDataPages = append(rec.FreeDataPages, pageNo)
// }
// // free index pages
// indexQty, _, err := bin.ReadVarUint64(src)
// if err != nil {
// return
// }
// for range indexQty {
// var pageNo uint32
// pageNo, err = bin.ReadUint32(src)
// if err != nil {
// return
// }
// rec.FreeIndexPages = append(rec.FreeIndexPages, pageNo)
// }
// return rec, nil
// }
func (s *Reader) readAppendedMeasure(src *bytes.Buffer) (_ AppendedMeasure, err error) {
arr, err := bin.ReadN(src, 16)
if err != nil {
return
}
return AppendedMeasure{
MetricID: bin.GetUint32(arr[0:]),
Timestamp: bin.GetUint32(arr[4:]),
Value: bin.GetFloat64(arr[8:]),
}, nil
}
// func (s *Reader) readAppendedMeasure(src *bytes.Buffer) (_ AppendedMeasure, err error) {
// arr, err := bin.ReadN(src, 16)
// if err != nil {
// return
// }
// return AppendedMeasure{
// MetricID: bin.GetUint32(arr[0:]),
// Timestamp: bin.GetUint32(arr[4:]),
// Value: bin.GetFloat64(arr[8:]),
// }, nil
// }
func (s *Reader) readAppendedMeasures(src *bytes.Buffer) (_ AppendedMeasures, err error) {
var rec AppendedMeasures
rec.MetricID, err = bin.ReadUint32(src)
if err != nil {
return
}
qty, err := bin.ReadUint16(src)
if err != nil {
return
}
for range qty {
var measure proto.Measure
measure.Timestamp, err = bin.ReadUint32(src)
if err != nil {
return
}
measure.Value, err = bin.ReadFloat64(src)
if err != nil {
return
}
rec.Measures = append(rec.Measures, measure)
}
return rec, nil
}
// func (s *Reader) readAppendedMeasures(src *bytes.Buffer) (_ AppendedMeasures, err error) {
// var rec AppendedMeasures
// rec.MetricID, err = bin.ReadUint32(src)
// if err != nil {
// return
// }
// qty, err := bin.ReadUint16(src)
// if err != nil {
// return
// }
// for range qty {
// var measure proto.Measure
// measure.Timestamp, err = bin.ReadUint32(src)
// if err != nil {
// return
// }
// measure.Value, err = bin.ReadFloat64(src)
// if err != nil {
// return
// }
// rec.Measures = append(rec.Measures, measure)
// }
// return rec, nil
// }
func (s *Reader) readAppendedMeasureWithOverflow(src *bytes.Buffer) (_ AppendedMeasureWithOverflow, err error) {
var (
b byte
rec AppendedMeasureWithOverflow
)
rec.MetricID, err = bin.ReadUint32(src)
if err != nil {
return
}
rec.Timestamp, err = bin.ReadUint32(src)
if err != nil {
return
}
rec.Value, err = bin.ReadFloat64(src)
if err != nil {
return
}
b, err = src.ReadByte()
if err != nil {
return
}
rec.IsDataPageReused = b == 1
// func (s *Reader) readAppendedMeasureWithOverflow(src *bytes.Buffer) (_ AppendedMeasureWithOverflow, err error) {
// var (
// b byte
// rec AppendedMeasureWithOverflow
// )
// rec.MetricID, err = bin.ReadUint32(src)
// if err != nil {
// return
// }
// rec.Timestamp, err = bin.ReadUint32(src)
// if err != nil {
// return
// }
// rec.Value, err = bin.ReadFloat64(src)
// if err != nil {
// return
// }
// b, err = src.ReadByte()
// if err != nil {
// return
// }
// rec.IsDataPageReused = b == 1
rec.DataPageNo, err = bin.ReadUint32(src)
if err != nil {
return
}
b, err = src.ReadByte()
if err != nil {
return
}
if b == 1 {
rec.IsRootChanged = true
rec.RootPageNo, err = bin.ReadUint32(src)
if err != nil {
return
}
}
// index pages
indexQty, err := src.ReadByte()
if err != nil {
return
}
for range indexQty {
var pageNo uint32
pageNo, err = bin.ReadUint32(src)
if err != nil {
return
}
rec.ReusedIndexPages = append(rec.ReusedIndexPages, pageNo)
}
return rec, nil
}
// rec.DataPageNo, err = bin.ReadUint32(src)
// if err != nil {
// return
// }
// b, err = src.ReadByte()
// if err != nil {
// return
// }
// if b == 1 {
// rec.IsRootChanged = true
// rec.RootPageNo, err = bin.ReadUint32(src)
// if err != nil {
// return
// }
// }
// // index pages
// indexQty, err := src.ReadByte()
// if err != nil {
// return
// }
// for range indexQty {
// var pageNo uint32
// pageNo, err = bin.ReadUint32(src)
// if err != nil {
// return
// }
// rec.ReusedIndexPages = append(rec.ReusedIndexPages, pageNo)
// }
// return rec, nil
// }
func (s *Reader) readDeletedMeasures(src *bytes.Buffer) (_ DeletedMeasures, err error) {
var (
rec DeletedMeasures
)
rec.MetricID, err = bin.ReadUint32(src)
if err != nil {
return
}
// free data pages
rec.FreeDataPages, err = s.readFreePageNumbers(src)
if err != nil {
return
}
// free index pages
rec.FreeIndexPages, err = s.readFreePageNumbers(src)
if err != nil {
return
}
return rec, nil
}
// func (s *Reader) readDeletedMeasures(src *bytes.Buffer) (_ DeletedMeasures, err error) {
// var (
// rec DeletedMeasures
// )
// rec.MetricID, err = bin.ReadUint32(src)
// if err != nil {
// return
// }
// // free data pages
// rec.FreeDataPages, err = s.readFreePageNumbers(src)
// if err != nil {
// return
// }
// // free index pages
// rec.FreeIndexPages, err = s.readFreePageNumbers(src)
// if err != nil {
// return
// }
// return rec, nil
// }
// HELPERS
func (s *Reader) readFreePageNumbers(src *bytes.Buffer) ([]uint32, error) {
var freePages []uint32
qty, _, err := bin.ReadVarUint64(src)
if err != nil {
return nil, err
}
for range qty {
var pageNo uint32
pageNo, err = bin.ReadUint32(src)
if err != nil {
return nil, err
}
freePages = append(freePages, pageNo)
}
return freePages, nil
}
// func (s *Reader) readFreePageNumbers(src *bytes.Buffer) ([]uint32, error) {
// var freePages []uint32
// qty, _, err := bin.ReadVarUint64(src)
// if err != nil {
// return nil, err
// }
// for range qty {
// var pageNo uint32
// pageNo, err = bin.ReadUint32(src)
// if err != nil {
// return nil, err
// }
// freePages = append(freePages, pageNo)
// }
// return freePages, nil
// }
func (s *Reader) Seek(offset int64) error {
ret, err := s.file.Seek(offset, 0)