diff options
Diffstat (limited to 'page.go')
-rw-r--r-- | page.go | 48 |
1 files changed, 27 insertions, 21 deletions
@@ -5,9 +5,11 @@ import ( ) const maxPageSize = 0x8000 +const minKeyCount = 2 var _page page -const headerSize = unsafe.Offsetof(_page.ptr) + +const pageHeaderSize = int(unsafe.Offsetof(_page.ptr)) const minPageKeys = 2 const fillThreshold = 250 // 25% @@ -20,13 +22,15 @@ const ( p_dirty = 0x10 /**< dirty page, also set for #P_SUBP pages */ p_sub = 0x40 p_keep = 0x8000 /**< leave this page alone during spill */ + + p_invalid = ^pgno(0) ) // maxCommitPages is the maximum number of pages to commit in one writev() call. -const maxCommitPages 64 +const maxCommitPages = 64 /* max bytes to write in one call */ -const maxWriteByteCount 0x80000000U // TODO: #define MAX_WRITE 0x80000000U >> (sizeof(ssize_t) == 4)) +const maxWriteByteCount uint = 0x80000000 // TODO: #define MAX_WRITE 0x80000000U >> (sizeof(ssize_t) == 4)) // TODO: // #if defined(IOV_MAX) && IOV_MAX < MDB_COMMIT_PAGES @@ -42,26 +46,28 @@ const maxWriteByteCount 0x80000000U // TODO: #define MAX_WRITE 0x80000000U >> // TODO: #define MDB_SPLIT_REPLACE MDB_APPENDDUP /**< newkey is not new */ type pgno uint64 +type txnid uint64 +type indx uint16 type page struct { id pgno flags int - lower int - upper int + lower indx + upper indx overflow int ptr int } type pageState struct { - head int /**< Reclaimed freeDB pages, or NULL before use */ - last int /**< ID of last used record, or 0 if !mf_pghead */ + head int /**< Reclaimed freeDB pages, or NULL before use */ + 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 + if (p.flags & p_meta) == 0 { + return nil, InvalidMetaPageError } // Cast the meta section and validate before returning. @@ -72,12 +78,17 @@ func (p *page) meta() (*meta, error) { return m, nil } - - - - - - +// initMeta initializes a page as a new meta page. +func (p *page) initMeta(pageSize int) { + p.flags = p_meta + m := (*meta)(unsafe.Pointer(&p.ptr)) + m.magic = magic + m.version = version + m.free.pad = uint32(pageSize) + m.pgno = 1 + m.free.root = p_invalid + m.main.root = p_invalid +} // nodeCount returns the number of nodes on the page. func (p *page) nodeCount() int { @@ -86,10 +97,5 @@ func (p *page) nodeCount() int { // remainingSize returns the number of bytes left in the page. func (p *page) remainingSize() int { - return p.header.upper - p.header.lower -} - -// remainingSize returns the number of bytes left in the page. -func (p *page) remainingSize() int { - return p.header.upper - p.header.lower + return int(p.upper - p.lower) } |