Files
qb/txlog/x.go

84 lines
2.0 KiB
Go
Raw Normal View History

2026-05-15 00:28:39 +00:00
package txlog
const (
payloadSize = 24
recordSize = 4 + 4 // timestamp + pageNo
)
type Page struct {
//Head []byte
//Tail []byte
Data []byte
PageNo uint32
LowerTimestamp uint32
}
type Level struct {
// вже записані дані (лише для першої в списку індексної сторінки, беремо із _metric)
// дані потрібні, якщо сторінка буде заповнена і піде на запис в .index файл
AlreadyWritten int // (заповнені одразу)
Unfilled []byte // поточні дані index сторінки (заповнені одразу)
LowerTimestamp uint32 // (заповнені одразу)
PageNo uint32 // пусто
Filled []Page // пусто
}
type Pager interface {
GetPageNumber() uint32
}
func xxx(pager Pager, levels []*Level, dataPages []*Page) {
var (
//upTimestamp uint32
lastDataIdx = len(dataPages) - 1
)
for idx, d := range dataPages {
d.PageNo = pager.GetPageNumber()
if idx < lastDataIdx {
// setPrevPageNo(dataPages[idx+1], d.PageNo)
// calc CRC32
} else {
}
var (
upTimestamp = d.LowerTimestamp
upPageNo uint32 = d.PageNo
levelIdx = 0
)
for {
if levelIdx == len(levels) {
//
newRoot := &Level{
Unfilled: nil,
//LowerTimestamp: prevPage . LowerTimestamp,
PageNo: pager.GetPageNumber(),
}
// encode prev page record + up*
levels = append(levels, newRoot)
break
}
level := levels[levelIdx]
if len(level.Unfilled)+recordSize <= payloadSize {
// append
break
}
level.Filled = append(level.Filled, Page{
Data: level.Unfilled,
LowerTimestamp: level.LowerTimestamp,
PageNo: level.PageNo,
})
//
level.Unfilled = nil
// fix - pack record
level.PageNo = pager.GetPageNumber()
level.LowerTimestamp = upTimestamp
//
upPageNo = level.PageNo
upTimestamp = level.LowerTimestamp
levelIdx++
}
}
}