aboutsummaryrefslogtreecommitdiff
path: root/page.go
diff options
context:
space:
mode:
Diffstat (limited to 'page.go')
-rw-r--r--page.go61
1 files changed, 43 insertions, 18 deletions
diff --git a/page.go b/page.go
index fe639fa..c811eeb 100644
--- a/page.go
+++ b/page.go
@@ -4,17 +4,22 @@ import (
"unsafe"
)
-const MinPageKeys = 2
-const FillThreshold = 250 // 25%
+const maxPageSize = 0x8000
+
+var _page page
+const headerSize = unsafe.Offsetof(_page.ptr)
+
+const minPageKeys = 2
+const fillThreshold = 250 // 25%
const (
- BranchPage = 0x01
- LeafPage = 0x02
- OverflowPage = 0x04
- MetaPage = 0x08
- DirtyPage = 0x10 /**< dirty page, also set for #P_SUBP pages */
- SubPage = 0x40
- KeepPage = 0x8000 /**< leave this page alone during spill */
+ p_branch = 0x01
+ p_leaf = 0x02
+ p_overflow = 0x04
+ p_meta = 0x08
+ p_dirty = 0x10 /**< dirty page, also set for #P_SUBP pages */
+ p_sub = 0x40
+ p_keep = 0x8000 /**< leave this page alone during spill */
)
// maxCommitPages is the maximum number of pages to commit in one writev() call.
@@ -36,16 +41,15 @@ const maxWriteByteCount 0x80000000U // TODO: #define MAX_WRITE 0x80000000U >>
// TODO: #define MDB_SPLIT_REPLACE MDB_APPENDDUP /**< newkey is not new */
+type pgno uint64
type page struct {
- header struct {
- id int
- next *page // (?)
- lower int
- upper int
- overflowPageCount int
- }
- metadata []byte
+ id pgno
+ flags int
+ lower int
+ upper int
+ overflow int
+ ptr int
}
type pageState struct {
@@ -53,6 +57,28 @@ type pageState struct {
last int /**< ID of last used record, or 0 if !mf_pghead */
}
+// meta returns a pointer to the metadata section of the page.
+func (p *page) meta() (*meta, error) {
+ // Exit if page is not a meta page.
+ if (p.flags & p_meta) != 0 {
+ return InvalidMetaPageError
+ }
+
+ // Cast the meta section and validate before returning.
+ m := (*meta)(unsafe.Pointer(&p.ptr))
+ if err := m.validate(); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+
+
+
+
+
+
+
// nodeCount returns the number of nodes on the page.
func (p *page) nodeCount() int {
return 0 // (p.header.lower - unsafe.Sizeof(p.header) >> 1
@@ -67,4 +93,3 @@ func (p *page) remainingSize() int {
func (p *page) remainingSize() int {
return p.header.upper - p.header.lower
}
-