This commit is contained in:
2026-06-13 22:43:17 +00:00
parent 1d1fdb1f0b
commit 685c48f94f
28 changed files with 2492 additions and 2657 deletions

View File

@@ -0,0 +1,55 @@
package storage
import (
"errors"
"math"
"os"
"gordenko.dev/dima/qb/freelist"
)
type PageNoProvider struct {
freeList *freelist.FreeList
pagesCount uint32
}
type PageNoProviderOptions struct {
FilePath string
PageSize int
FreeList *freelist.FreeList
}
func NewPageNoProvider(opt PageNoProviderOptions) (_ *PageNoProvider, err error) {
if opt.FreeList == nil {
return nil, errors.New("FreeList option is required")
}
file, err := os.Open(opt.FilePath)
if err != nil {
return
}
defer file.Close()
info, err := file.Stat()
if err != nil {
return
}
pagesCount := info.Size() / int64(opt.PageSize)
return &PageNoProvider{
freeList: opt.FreeList,
pagesCount: uint32(pagesCount),
}, nil
}
func (s *PageNoProvider) GetPageNumber() (uint32, bool, error) {
pageNo, err := s.freeList.GetPageNumber()
if err != nil {
return 0, false, err
}
if pageNo > 0 {
return pageNo, true, nil
}
if s.pagesCount < math.MaxUint32 {
s.pagesCount++
return s.pagesCount, false, nil
}
return 0, false, errors.New("no space")
}