| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- package page
- import (
- "encoding/binary"
- "unsafe"
- )
- // =============================================================================
- // DataPageHdr —— 数据页头: 公共页头 + 行计数 + pkID 极值。
- //
- // 磁盘布局 (40B):
- //
- // off 0 PageHdr 20B 公共页头
- // off 20 Count 4B 行数 (本机字节序)
- // off 24 Min 8B 页内最小 pkID ★BigEndian 编码★
- // off 32 Max 8B 页内最大 pkID ★BigEndian 编码★
- //
- // 行数据区紧接在偏移 40 之后, 每行 [len(4B)][rowData...], len 的最高位是软删除标志。
- //
- // ⚠️ Min/Max 刻意按 BigEndian 存放 (pkID 本身也按 BE 比较), 所以这里声明成
- // [8]byte 而不是 uint64 —— 若声明成 uint64, unsafe 映射在小端机上会读到字节反转
- // 的值。读写必须走 GetMin/SetMin/GetMax/SetMax。
- //
- // 这份布局原先在 wal.go(dpHdrSize/dpCountOffset/dpUseSizeOffset)、transaction.go、
- // index/datapage 三处各写一遍, 现在只有这里一处定义。
- // =============================================================================
- type DataPageHdr struct {
- PageHdr
- Count uint32 // off 20 行数
- Min [8]byte // off 24 最小 pkID (BigEndian)
- Max [8]byte // off 32 最大 pkID (BigEndian)
- }
- // DataPageHdrSize 数据页头长度; 行数据区从该偏移开始
- const DataPageHdrSize = uint32(unsafe.Sizeof(DataPageHdr{})) // 40
- // 编译期布局断言
- var (
- _ [40]byte = [unsafe.Sizeof(DataPageHdr{})]byte{} // 头必须 40 字节
- _ [20]byte = [unsafe.Offsetof(DataPageHdr{}.Count)]byte{} // Count 必须偏移 20
- _ [24]byte = [unsafe.Offsetof(DataPageHdr{}.Min)]byte{} // Min 必须偏移 24
- _ [32]byte = [unsafe.Offsetof(DataPageHdr{}.Max)]byte{} // Max 必须偏移 32
- )
- // DataHdrOf 把页缓冲区按 DataPageHdr 解析 (页头固定在偏移 0)。
- func DataHdrOf(buf []byte) *DataPageHdr {
- return (*DataPageHdr)(unsafe.Pointer(&buf[0]))
- }
- // GetMin 读页内最小 pkID。
- func (h *DataPageHdr) GetMin() uint64 { return binary.BigEndian.Uint64(h.Min[:]) }
- // SetMin 写页内最小 pkID。
- func (h *DataPageHdr) SetMin(v uint64) { binary.BigEndian.PutUint64(h.Min[:], v) }
- // GetMax 读页内最大 pkID。
- func (h *DataPageHdr) GetMax() uint64 { return binary.BigEndian.Uint64(h.Max[:]) }
- // SetMax 写页内最大 pkID。
- func (h *DataPageHdr) SetMax(v uint64) { binary.BigEndian.PutUint64(h.Max[:], v) }
|