Files
qb/storage/misc.go

56 lines
1.5 KiB
Go
Raw Normal View History

2026-06-15 05:32:15 +03:00
package storage
import (
"fmt"
bin "gordenko.dev/dima/bin/little"
"gordenko.dev/dima/qb"
"gordenko.dev/dima/qb/enc"
2026-06-15 10:47:24 +00:00
"gordenko.dev/dima/qb/util"
2026-06-15 05:32:15 +03:00
)
2026-06-15 10:47:24 +00:00
func CreateTimestampDecompressor(page []byte) (qb.TimestampDecompressor, error) {
2026-06-15 05:32:15 +03:00
size, _ := bin.GetUint16(page[timestampsSizeIdx:])
2026-06-15 10:47:24 +00:00
if size > DataPageFooterSize {
return nil, fmt.Errorf("bug: invalid timestamps size %d", size)
}
2026-06-15 05:32:15 +03:00
pos := DataPagePayloadSize - int(size)
d := enc.NewTimeDeltaDecompressor()
d.RestoreFromEnd(page[pos:DataPagePayloadSize])
2026-06-15 10:47:24 +00:00
return d, nil
2026-06-15 05:32:15 +03:00
}
2026-06-15 10:47:24 +00:00
func CreateValueDecompressor(page []byte, metricType qb.MetricType, fracDigits byte) (qb.ValueDecompressor, error) {
2026-06-15 05:32:15 +03:00
size, _ := bin.GetUint16(page[valuesSizeIdx:])
2026-06-15 10:47:24 +00:00
if size > DataPageFooterSize {
return nil, fmt.Errorf("bug: invalid timestamps size %d", size)
}
2026-06-15 05:32:15 +03:00
d := enc.NewValueDeltaDecompressor(metricType, fracDigits)
d.RestoreFromEnd(page[:size])
2026-06-15 10:47:24 +00:00
return d, nil
}
func VerifyDataPageCRC32(data []byte) error {
var (
calculatedCRC = util.CalculateCRC32(data[:dataCRC32Idx])
writtenCRC, _ = bin.GetUint32(data[dataCRC32Idx:])
)
if calculatedCRC != writtenCRC {
return fmt.Errorf("calculated CRC32 %d are not equal written CRC32 %d",
calculatedCRC, writtenCRC)
}
return nil
}
func VerifyIndexPageCRC32(data []byte) error {
var (
calculatedCRC = util.CalculateCRC32(data[:indexCRC32Idx])
writtenCRC, _ = bin.GetUint32(data[indexCRC32Idx:])
)
if calculatedCRC != writtenCRC {
return fmt.Errorf("calculated CRC32 %d are not equal written CRC32 %d",
calculatedCRC, writtenCRC)
}
return nil
2026-06-15 05:32:15 +03:00
}