|
|
@@ -18,7 +18,9 @@ import (
|
|
|
// [48,76) 表/空闲链/WAL: TablePage/TableCount/FreePageStart/FreePageEnd/
|
|
|
// FreePageCount/FirstWALPage/LastWALPage (4 字节标量, 两两紧邻无填充)
|
|
|
// [76,332) 扩展: ExtConfig[256]
|
|
|
-// [332,844) 介绍区: Comment[512]
|
|
|
+// [332,4096) 介绍区: Comment[3764] — 占满头页余下全部空间 (建库默认写入
|
|
|
+// 当前版本的功能介绍与修复点, 见 VersionComment; 用户可用
|
|
|
+// DB.SetComment 改写, 上限即本字段容量)
|
|
|
//
|
|
|
// 8 字节标量全部排在前半段 (偏移 16~48), 4 字节标量排在后半段 (偏移 48~76),
|
|
|
// 任何字段后面都不留填充字节。
|
|
|
@@ -35,6 +37,8 @@ var (
|
|
|
_ [32]byte = [unsafe.Offsetof(HeaderPage{}.NextTxnID)]byte{}
|
|
|
_ [40]byte = [unsafe.Offsetof(HeaderPage{}.GlobalFlags)]byte{}
|
|
|
_ [332]byte = [unsafe.Offsetof(HeaderPage{}.Comment)]byte{}
|
|
|
+ // Comment 必须恰好占满头页剩余空间 (字段区 332 字节, 介绍区 3764 字节)。
|
|
|
+ _ [PageSize4K - 332]byte = [unsafe.Sizeof(HeaderPage{}.Comment)]byte{}
|
|
|
)
|
|
|
|
|
|
// 数据库全局头页(PageID=0 固定)
|
|
|
@@ -50,17 +54,15 @@ type HeaderPage struct {
|
|
|
TablePage uint32 // 48 【唯一重要】表链起始页ID
|
|
|
TableCount uint32 // 52 表数量
|
|
|
FreePageStart uint32 // 56 空闲页链表头
|
|
|
- FreePageEnd uint32 // 60 空闲页链表尾 (0 = 空闲链为空)
|
|
|
+ FreePageEnd uint32 // 60 空闲页链表尾 (0 = 空闲链为空)。
|
|
|
+ // 不变量: FreePageStart == 0 当且仅当 FreePageEnd == 0,
|
|
|
+ // 两者必须同生同灭 (摘链/还链处维护)。
|
|
|
FreePageCount uint32 // 64 空闲页数量
|
|
|
FirstWALPage uint32 // 68 未恢复的 WAL 链首页 ID (0=无待恢复WAL)
|
|
|
LastWALPage uint32 // 72 WAL 链尾页 ID (追加写入用)
|
|
|
- ExtConfig [256]byte // 76 扩展配置
|
|
|
- Comment [512]byte // 332 数据库介绍区 (建库时自动写入, 见 DB.Comment/SetComment)
|
|
|
-
|
|
|
- // 保留区, 填充对齐到整页。
|
|
|
- // 不变量 (适用于 FreePageStart/FreePageEnd):
|
|
|
- // FreePageStart == 0 当且仅当 FreePageEnd == 0, 两者必须同生同灭。
|
|
|
- _ [PageSize4K - 844]byte
|
|
|
+ ExtConfig [256]byte // 76 扩展配置
|
|
|
+ Comment [PageSize4K - 332]byte // 332 数据库介绍区 (3764B, 占满整页余下空间;
|
|
|
+ // 建库默认写入 VersionComment, 可用 DB.SetComment 改写)
|
|
|
}
|
|
|
|
|
|
// newPageWithReader 分配新页:优先从空闲链表头取, 否则递增分配。
|
|
|
@@ -197,7 +199,11 @@ func recycleChainWithCache(ff *File, header *HeaderPage, head, tail, count uint3
|
|
|
}
|
|
|
|
|
|
func newHeader(desc string) (*HeaderPage, error) {
|
|
|
- var comment [512]byte
|
|
|
+ // 未提供介绍 → 默认写入当前版本的功能介绍与修复点 (VersionComment)
|
|
|
+ if desc == "" {
|
|
|
+ desc = VersionComment
|
|
|
+ }
|
|
|
+ var comment [PageSize4K - 332]byte
|
|
|
|
|
|
// 1. 安全判断:防止描述超长
|
|
|
if len(desc) > len(comment) {
|