Bumps the go-modules-updates group in /backend with 8 updates: | Package | From | To | | --- | --- | --- | | [github.com/PuerkitoBio/goquery](https://github.com/PuerkitoBio/goquery) | `1.10.1` | `1.10.2` | | [github.com/alecthomas/chroma/v2](https://github.com/alecthomas/chroma) | `2.14.0` | `2.15.0` | | [github.com/go-chi/chi/v5](https://github.com/go-chi/chi) | `5.2.0` | `5.2.1` | | [github.com/go-pkgz/jrpc](https://github.com/go-pkgz/jrpc) | `0.3.0` | `0.3.1` | | [go.etcd.io/bbolt](https://github.com/etcd-io/bbolt) | `1.3.11` | `1.4.0` | | [golang.org/x/crypto](https://github.com/golang/crypto) | `0.31.0` | `0.33.0` | | [golang.org/x/image](https://github.com/golang/image) | `0.23.0` | `0.25.0` | | [golang.org/x/net](https://github.com/golang/net) | `0.33.0` | `0.35.0` | Updates `github.com/PuerkitoBio/goquery` from 1.10.1 to 1.10.2 - [Release notes](https://github.com/PuerkitoBio/goquery/releases) - [Commits](https://github.com/PuerkitoBio/goquery/compare/v1.10.1...v1.10.2) Updates `github.com/alecthomas/chroma/v2` from 2.14.0 to 2.15.0 - [Release notes](https://github.com/alecthomas/chroma/releases) - [Changelog](https://github.com/alecthomas/chroma/blob/master/.goreleaser.yml) - [Commits](https://github.com/alecthomas/chroma/compare/v2.14.0...v2.15.0) Updates `github.com/go-chi/chi/v5` from 5.2.0 to 5.2.1 - [Release notes](https://github.com/go-chi/chi/releases) - [Changelog](https://github.com/go-chi/chi/blob/master/CHANGELOG.md) - [Commits](https://github.com/go-chi/chi/compare/v5.2.0...v5.2.1) Updates `github.com/go-pkgz/jrpc` from 0.3.0 to 0.3.1 - [Release notes](https://github.com/go-pkgz/jrpc/releases) - [Commits](https://github.com/go-pkgz/jrpc/compare/v0.3.0...v0.3.1) Updates `go.etcd.io/bbolt` from 1.3.11 to 1.4.0 - [Release notes](https://github.com/etcd-io/bbolt/releases) - [Commits](https://github.com/etcd-io/bbolt/compare/v1.3.11...v1.4.0) Updates `golang.org/x/crypto` from 0.31.0 to 0.33.0 - [Commits](https://github.com/golang/crypto/compare/v0.31.0...v0.33.0) Updates `golang.org/x/image` from 0.23.0 to 0.25.0 - [Commits](https://github.com/golang/image/compare/v0.23.0...v0.25.0) Updates `golang.org/x/net` from 0.33.0 to 0.35.0 - [Commits](https://github.com/golang/net/compare/v0.33.0...v0.35.0) --- updated-dependencies: - dependency-name: github.com/PuerkitoBio/goquery dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-modules-updates - dependency-name: github.com/alecthomas/chroma/v2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-modules-updates - dependency-name: github.com/go-chi/chi/v5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-modules-updates - dependency-name: github.com/go-pkgz/jrpc dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-modules-updates - dependency-name: go.etcd.io/bbolt dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-modules-updates - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-modules-updates - dependency-name: golang.org/x/image dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-modules-updates - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-modules-updates ... Signed-off-by: dependabot[bot] <support@github.com>
116 lines
2.7 KiB
Go
116 lines
2.7 KiB
Go
package common
|
|
|
|
import "unsafe"
|
|
|
|
// Inode represents an internal node inside of a node.
|
|
// It can be used to point to elements in a page or point
|
|
// to an element which hasn't been added to a page yet.
|
|
type Inode struct {
|
|
flags uint32
|
|
pgid Pgid
|
|
key []byte
|
|
value []byte
|
|
}
|
|
|
|
type Inodes []Inode
|
|
|
|
func (in *Inode) Flags() uint32 {
|
|
return in.flags
|
|
}
|
|
|
|
func (in *Inode) SetFlags(flags uint32) {
|
|
in.flags = flags
|
|
}
|
|
|
|
func (in *Inode) Pgid() Pgid {
|
|
return in.pgid
|
|
}
|
|
|
|
func (in *Inode) SetPgid(id Pgid) {
|
|
in.pgid = id
|
|
}
|
|
|
|
func (in *Inode) Key() []byte {
|
|
return in.key
|
|
}
|
|
|
|
func (in *Inode) SetKey(key []byte) {
|
|
in.key = key
|
|
}
|
|
|
|
func (in *Inode) Value() []byte {
|
|
return in.value
|
|
}
|
|
|
|
func (in *Inode) SetValue(value []byte) {
|
|
in.value = value
|
|
}
|
|
|
|
func ReadInodeFromPage(p *Page) Inodes {
|
|
inodes := make(Inodes, int(p.Count()))
|
|
isLeaf := p.IsLeafPage()
|
|
for i := 0; i < int(p.Count()); i++ {
|
|
inode := &inodes[i]
|
|
if isLeaf {
|
|
elem := p.LeafPageElement(uint16(i))
|
|
inode.SetFlags(elem.Flags())
|
|
inode.SetKey(elem.Key())
|
|
inode.SetValue(elem.Value())
|
|
} else {
|
|
elem := p.BranchPageElement(uint16(i))
|
|
inode.SetPgid(elem.Pgid())
|
|
inode.SetKey(elem.Key())
|
|
}
|
|
Assert(len(inode.Key()) > 0, "read: zero-length inode key")
|
|
}
|
|
|
|
return inodes
|
|
}
|
|
|
|
func WriteInodeToPage(inodes Inodes, p *Page) uint32 {
|
|
// Loop over each item and write it to the page.
|
|
// off tracks the offset into p of the start of the next data.
|
|
off := unsafe.Sizeof(*p) + p.PageElementSize()*uintptr(len(inodes))
|
|
isLeaf := p.IsLeafPage()
|
|
for i, item := range inodes {
|
|
Assert(len(item.Key()) > 0, "write: zero-length inode key")
|
|
|
|
// Create a slice to write into of needed size and advance
|
|
// byte pointer for next iteration.
|
|
sz := len(item.Key()) + len(item.Value())
|
|
b := UnsafeByteSlice(unsafe.Pointer(p), off, 0, sz)
|
|
off += uintptr(sz)
|
|
|
|
// Write the page element.
|
|
if isLeaf {
|
|
elem := p.LeafPageElement(uint16(i))
|
|
elem.SetPos(uint32(uintptr(unsafe.Pointer(&b[0])) - uintptr(unsafe.Pointer(elem))))
|
|
elem.SetFlags(item.Flags())
|
|
elem.SetKsize(uint32(len(item.Key())))
|
|
elem.SetVsize(uint32(len(item.Value())))
|
|
} else {
|
|
elem := p.BranchPageElement(uint16(i))
|
|
elem.SetPos(uint32(uintptr(unsafe.Pointer(&b[0])) - uintptr(unsafe.Pointer(elem))))
|
|
elem.SetKsize(uint32(len(item.Key())))
|
|
elem.SetPgid(item.Pgid())
|
|
Assert(elem.Pgid() != p.Id(), "write: circular dependency occurred")
|
|
}
|
|
|
|
// Write data for the element to the end of the page.
|
|
l := copy(b, item.Key())
|
|
copy(b[l:], item.Value())
|
|
}
|
|
|
|
return uint32(off)
|
|
}
|
|
|
|
func UsedSpaceInPage(inodes Inodes, p *Page) uint32 {
|
|
off := unsafe.Sizeof(*p) + p.PageElementSize()*uintptr(len(inodes))
|
|
for _, item := range inodes {
|
|
sz := len(item.Key()) + len(item.Value())
|
|
off += uintptr(sz)
|
|
}
|
|
|
|
return uint32(off)
|
|
}
|