@yydb/light-db 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/dist/api/LightDB.d.ts +194 -0
  2. package/dist/api/LightDB.d.ts.map +1 -0
  3. package/dist/api/LightDB.js +299 -0
  4. package/dist/api/LightDB.js.map +1 -0
  5. package/dist/api/Transaction.d.ts +100 -0
  6. package/dist/api/Transaction.d.ts.map +1 -0
  7. package/dist/api/Transaction.js +263 -0
  8. package/dist/api/Transaction.js.map +1 -0
  9. package/dist/api/index.d.ts +24 -0
  10. package/dist/api/index.d.ts.map +1 -0
  11. package/dist/api/index.js +54 -0
  12. package/dist/api/index.js.map +1 -0
  13. package/dist/api/types.d.ts +154 -0
  14. package/dist/api/types.d.ts.map +1 -0
  15. package/dist/api/types.js +7 -0
  16. package/dist/api/types.js.map +1 -0
  17. package/dist/collection/Collection.d.ts +235 -0
  18. package/dist/collection/Collection.d.ts.map +1 -0
  19. package/dist/collection/Collection.js +671 -0
  20. package/dist/collection/Collection.js.map +1 -0
  21. package/dist/collection/QueryBuilder.d.ts +225 -0
  22. package/dist/collection/QueryBuilder.d.ts.map +1 -0
  23. package/dist/collection/QueryBuilder.js +475 -0
  24. package/dist/collection/QueryBuilder.js.map +1 -0
  25. package/dist/collection/QueryParser.d.ts +117 -0
  26. package/dist/collection/QueryParser.d.ts.map +1 -0
  27. package/dist/collection/QueryParser.js +438 -0
  28. package/dist/collection/QueryParser.js.map +1 -0
  29. package/dist/collection/index.d.ts +42 -0
  30. package/dist/collection/index.d.ts.map +1 -0
  31. package/dist/collection/index.js +41 -0
  32. package/dist/collection/index.js.map +1 -0
  33. package/dist/collection/types.d.ts +365 -0
  34. package/dist/collection/types.d.ts.map +1 -0
  35. package/dist/collection/types.js +7 -0
  36. package/dist/collection/types.js.map +1 -0
  37. package/dist/constants/index.d.ts +51 -0
  38. package/dist/constants/index.d.ts.map +1 -0
  39. package/dist/constants/index.js +68 -0
  40. package/dist/constants/index.js.map +1 -0
  41. package/dist/errors/index.d.ts +69 -0
  42. package/dist/errors/index.d.ts.map +1 -0
  43. package/dist/errors/index.js +132 -0
  44. package/dist/errors/index.js.map +1 -0
  45. package/dist/index.d.ts +220 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +729 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/indexes/BPlusTree.d.ts +181 -0
  50. package/dist/indexes/BPlusTree.d.ts.map +1 -0
  51. package/dist/indexes/BPlusTree.js +528 -0
  52. package/dist/indexes/BPlusTree.js.map +1 -0
  53. package/dist/indexes/IndexManager.d.ts +236 -0
  54. package/dist/indexes/IndexManager.d.ts.map +1 -0
  55. package/dist/indexes/IndexManager.js +502 -0
  56. package/dist/indexes/IndexManager.js.map +1 -0
  57. package/dist/indexes/PrimaryIndex.d.ts +240 -0
  58. package/dist/indexes/PrimaryIndex.d.ts.map +1 -0
  59. package/dist/indexes/PrimaryIndex.js +354 -0
  60. package/dist/indexes/PrimaryIndex.js.map +1 -0
  61. package/dist/indexes/SecondaryIndex.d.ts +204 -0
  62. package/dist/indexes/SecondaryIndex.d.ts.map +1 -0
  63. package/dist/indexes/SecondaryIndex.js +480 -0
  64. package/dist/indexes/SecondaryIndex.js.map +1 -0
  65. package/dist/indexes/errors.d.ts +66 -0
  66. package/dist/indexes/errors.d.ts.map +1 -0
  67. package/dist/indexes/errors.js +117 -0
  68. package/dist/indexes/errors.js.map +1 -0
  69. package/dist/indexes/index.d.ts +52 -0
  70. package/dist/indexes/index.d.ts.map +1 -0
  71. package/dist/indexes/index.js +131 -0
  72. package/dist/indexes/index.js.map +1 -0
  73. package/dist/indexes/types.d.ts +246 -0
  74. package/dist/indexes/types.d.ts.map +1 -0
  75. package/dist/indexes/types.js +30 -0
  76. package/dist/indexes/types.js.map +1 -0
  77. package/dist/performance/BatchWALWriter.d.ts +185 -0
  78. package/dist/performance/BatchWALWriter.d.ts.map +1 -0
  79. package/dist/performance/BatchWALWriter.js +490 -0
  80. package/dist/performance/BatchWALWriter.js.map +1 -0
  81. package/dist/performance/ColumnarStorage.d.ts +138 -0
  82. package/dist/performance/ColumnarStorage.d.ts.map +1 -0
  83. package/dist/performance/ColumnarStorage.js +875 -0
  84. package/dist/performance/ColumnarStorage.js.map +1 -0
  85. package/dist/performance/LazyQuery.d.ts +307 -0
  86. package/dist/performance/LazyQuery.d.ts.map +1 -0
  87. package/dist/performance/LazyQuery.js +588 -0
  88. package/dist/performance/LazyQuery.js.map +1 -0
  89. package/dist/performance/OptimizedBuffer.d.ts +375 -0
  90. package/dist/performance/OptimizedBuffer.d.ts.map +1 -0
  91. package/dist/performance/OptimizedBuffer.js +730 -0
  92. package/dist/performance/OptimizedBuffer.js.map +1 -0
  93. package/dist/performance/RWLock.d.ts +260 -0
  94. package/dist/performance/RWLock.d.ts.map +1 -0
  95. package/dist/performance/RWLock.js +570 -0
  96. package/dist/performance/RWLock.js.map +1 -0
  97. package/dist/performance/index.d.ts +41 -0
  98. package/dist/performance/index.d.ts.map +1 -0
  99. package/dist/performance/index.js +162 -0
  100. package/dist/performance/index.js.map +1 -0
  101. package/dist/performance/types.d.ts +247 -0
  102. package/dist/performance/types.d.ts.map +1 -0
  103. package/dist/performance/types.js +26 -0
  104. package/dist/performance/types.js.map +1 -0
  105. package/dist/storage/Checkpoint.d.ts +128 -0
  106. package/dist/storage/Checkpoint.d.ts.map +1 -0
  107. package/dist/storage/Checkpoint.js +251 -0
  108. package/dist/storage/Checkpoint.js.map +1 -0
  109. package/dist/storage/LightFile.d.ts +227 -0
  110. package/dist/storage/LightFile.d.ts.map +1 -0
  111. package/dist/storage/LightFile.js +526 -0
  112. package/dist/storage/LightFile.js.map +1 -0
  113. package/dist/storage/Recovery.d.ts +172 -0
  114. package/dist/storage/Recovery.d.ts.map +1 -0
  115. package/dist/storage/Recovery.js +399 -0
  116. package/dist/storage/Recovery.js.map +1 -0
  117. package/dist/storage/SHMFile.d.ts +243 -0
  118. package/dist/storage/SHMFile.d.ts.map +1 -0
  119. package/dist/storage/SHMFile.js +436 -0
  120. package/dist/storage/SHMFile.js.map +1 -0
  121. package/dist/storage/StorageEngine.d.ts +146 -0
  122. package/dist/storage/StorageEngine.d.ts.map +1 -0
  123. package/dist/storage/StorageEngine.js +353 -0
  124. package/dist/storage/StorageEngine.js.map +1 -0
  125. package/dist/storage/WALFile.d.ts +248 -0
  126. package/dist/storage/WALFile.d.ts.map +1 -0
  127. package/dist/storage/WALFile.js +597 -0
  128. package/dist/storage/WALFile.js.map +1 -0
  129. package/dist/storage/index.d.ts +10 -0
  130. package/dist/storage/index.d.ts.map +1 -0
  131. package/dist/storage/index.js +153 -0
  132. package/dist/storage/index.js.map +1 -0
  133. package/dist/types/index.d.ts +220 -0
  134. package/dist/types/index.d.ts.map +1 -0
  135. package/dist/types/index.js +7 -0
  136. package/dist/types/index.js.map +1 -0
  137. package/dist/utils/binary.d.ts +271 -0
  138. package/dist/utils/binary.d.ts.map +1 -0
  139. package/dist/utils/binary.js +454 -0
  140. package/dist/utils/binary.js.map +1 -0
  141. package/dist/utils/file.d.ts +166 -0
  142. package/dist/utils/file.d.ts.map +1 -0
  143. package/dist/utils/file.js +346 -0
  144. package/dist/utils/file.js.map +1 -0
  145. package/dist/utils/index.d.ts +6 -0
  146. package/dist/utils/index.d.ts.map +1 -0
  147. package/dist/utils/index.js +39 -0
  148. package/dist/utils/index.js.map +1 -0
  149. package/package.json +37 -0
  150. package/readme.md +124 -0
@@ -0,0 +1,243 @@
1
+ /**
2
+ * .shm 文件管理实现
3
+ * 存储 WAL 索引,用于加速恢复时构建脏页表
4
+ */
5
+ import { ShmHeader, ShmEntry } from "../types";
6
+ /**
7
+ * SHM 文件序列化器
8
+ * 负责 SHM 数据的二进制序列化
9
+ */
10
+ export declare class ShmSerializer {
11
+ /**
12
+ * 序列化 SHM 头部
13
+ * @param header 头部数据
14
+ */
15
+ serializeHeader(header: ShmHeader): Buffer;
16
+ /**
17
+ * 反序列化 SHM 头部
18
+ * @param buffer 包含头部数据的 Buffer
19
+ */
20
+ deserializeHeader(buffer: Buffer): ShmHeader;
21
+ /**
22
+ * 序列化 SHM 条目
23
+ * @param entry 条目数据
24
+ */
25
+ serializeEntry(entry: ShmEntry): Buffer;
26
+ /**
27
+ * 反序列化 SHM 条目
28
+ * @param buffer 包含条目数据的 Buffer
29
+ * @param offset 起始偏移量
30
+ */
31
+ deserializeEntry(buffer: Buffer, offset?: number): ShmEntry;
32
+ /**
33
+ * 计算哈希值
34
+ * @param pageId 页面ID
35
+ * @param capacity 哈希表容量
36
+ */
37
+ hash(pageId: number, capacity: number): number;
38
+ }
39
+ /**
40
+ * SHM 哈希表
41
+ * 内存中的 WAL 索引结构
42
+ */
43
+ export declare class ShmHashTable {
44
+ private entries;
45
+ private readonly capacity;
46
+ /**
47
+ * 创建哈希表
48
+ * @param capacity 容量
49
+ */
50
+ constructor(capacity?: number);
51
+ /**
52
+ * 插入或更新条目
53
+ * @param entry 条目数据
54
+ */
55
+ set(entry: ShmEntry): void;
56
+ /**
57
+ * 获取条目
58
+ * @param pageId 页面ID
59
+ */
60
+ get(pageId: number): ShmEntry | undefined;
61
+ /**
62
+ * 删除条目
63
+ * @param pageId 页面ID
64
+ */
65
+ delete(pageId: number): boolean;
66
+ /**
67
+ * 检查是否存在条目
68
+ * @param pageId 页面ID
69
+ */
70
+ has(pageId: number): boolean;
71
+ /**
72
+ * 获取所有条目
73
+ */
74
+ getAll(): ShmEntry[];
75
+ /**
76
+ * 获取条目数量
77
+ */
78
+ size(): number;
79
+ /**
80
+ * 清空哈希表
81
+ */
82
+ clear(): void;
83
+ /**
84
+ * 获取容量
85
+ */
86
+ getCapacity(): number;
87
+ /**
88
+ * 迭代器
89
+ */
90
+ [Symbol.iterator](): Iterator<ShmEntry>;
91
+ }
92
+ /**
93
+ * SHM 文件管理器
94
+ * 负责 .shm 文件的读写操作
95
+ */
96
+ export declare class ShmFileManager {
97
+ private readonly filePath;
98
+ private readonly serializer;
99
+ private hashTable;
100
+ private header;
101
+ /**
102
+ * 创建 SHM 文件管理器
103
+ * @param basePath 数据库基础路径
104
+ * @param dbName 数据库名称
105
+ * @param capacity 哈希表容量
106
+ */
107
+ constructor(basePath: string, dbName: string, capacity?: number);
108
+ /**
109
+ * 加载 SHM 文件
110
+ */
111
+ load(): Promise<boolean>;
112
+ /**
113
+ * 保存 SHM 文件
114
+ */
115
+ save(): Promise<void>;
116
+ /**
117
+ * 更新 WAL 索引条目
118
+ * @param pageId 页面ID
119
+ * @param lsn LSN
120
+ * @param walOffset WAL 偏移量
121
+ */
122
+ updateEntry(pageId: number, lsn: bigint, walOffset: bigint): void;
123
+ /**
124
+ * 获取页面的 WAL 索引
125
+ * @param pageId 页面ID
126
+ */
127
+ getEntry(pageId: number): ShmEntry | undefined;
128
+ /**
129
+ * 获取所有条目
130
+ */
131
+ getAllEntries(): ShmEntry[];
132
+ /**
133
+ * 更新头部信息
134
+ * @param walFileSize WAL 文件大小
135
+ * @param lastCompleteLsn 最后完整页的 LSN
136
+ */
137
+ updateHeader(walFileSize: bigint, lastCompleteLsn: bigint): void;
138
+ /**
139
+ * 获取头部信息
140
+ */
141
+ getHeader(): ShmHeader;
142
+ /**
143
+ * 清空索引
144
+ */
145
+ clear(): Promise<void>;
146
+ /**
147
+ * 获取条目数量
148
+ */
149
+ getEntryCount(): number;
150
+ /**
151
+ * 获取最后完整页的 LSN
152
+ */
153
+ getLastCompleteLsn(): bigint;
154
+ /**
155
+ * 获取 WAL 文件大小
156
+ */
157
+ getWalFileSize(): bigint;
158
+ /**
159
+ * 检查文件是否存在
160
+ */
161
+ exists(): Promise<boolean>;
162
+ /**
163
+ * 获取文件路径
164
+ */
165
+ getFilePath(): string;
166
+ /**
167
+ * 重建索引
168
+ * 从 WAL 记录重建 SHM 索引
169
+ * @param records WAL 记录数组
170
+ * @param getOffsetByLsn 根据 LSN 获取偏移量的函数
171
+ */
172
+ rebuildIndex(
173
+ records: Array<{
174
+ lsn: bigint;
175
+ key: string;
176
+ }>,
177
+ getOffsetByLsn: (lsn: bigint) => number,
178
+ ): void;
179
+ /**
180
+ * 将键转换为页面ID
181
+ * 简单的哈希函数
182
+ * @param key 键
183
+ */
184
+ private keyToPageId;
185
+ }
186
+ /**
187
+ * WAL 索引管理器
188
+ * 提供高级的 WAL 索引操作接口
189
+ */
190
+ export declare class WalIndexManager {
191
+ private readonly shmManager;
192
+ /**
193
+ * 创建 WAL 索引管理器
194
+ * @param basePath 数据库基础路径
195
+ * @param dbName 数据库名称
196
+ */
197
+ constructor(basePath: string, dbName: string);
198
+ /**
199
+ * 初始化索引
200
+ */
201
+ initialize(): Promise<void>;
202
+ /**
203
+ * 记录 WAL 写入
204
+ * @param pageId 页面ID
205
+ * @param lsn LSN
206
+ * @param walOffset WAL 偏移量
207
+ */
208
+ recordWrite(pageId: number, lsn: bigint, walOffset: bigint): Promise<void>;
209
+ /**
210
+ * 获取页面的最新 WAL 记录位置
211
+ * @param pageId 页面ID
212
+ */
213
+ getPageLocation(pageId: number): ShmEntry | undefined;
214
+ /**
215
+ * 获取需要回放的 WAL 范围
216
+ */
217
+ getWalReplayRange(): {
218
+ startLsn: bigint;
219
+ endLsn: bigint;
220
+ };
221
+ /**
222
+ * 获取所有脏页
223
+ */
224
+ getDirtyPages(): ShmEntry[];
225
+ /**
226
+ * 检查点完成后重置索引
227
+ * @param checkpointLsn 检查点 LSN
228
+ */
229
+ resetAfterCheckpoint(checkpointLsn: bigint): Promise<void>;
230
+ /**
231
+ * 同步索引到磁盘
232
+ */
233
+ sync(): Promise<void>;
234
+ /**
235
+ * 关闭索引管理器
236
+ */
237
+ close(): Promise<void>;
238
+ /**
239
+ * 获取 SHM 管理器
240
+ */
241
+ getShmManager(): ShmFileManager;
242
+ }
243
+ //# sourceMappingURL=SHMFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SHMFile.d.ts","sourceRoot":"","sources":["../../src/storage/SHMFile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,436 @@
1
+ "use strict";
2
+ /**
3
+ * .shm 文件管理实现
4
+ * 存储 WAL 索引,用于加速恢复时构建脏页表
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.WalIndexManager = exports.ShmFileManager = exports.ShmHashTable = exports.ShmSerializer = void 0;
8
+ const constants_1 = require("../constants");
9
+ const utils_1 = require("../utils");
10
+ const errors_1 = require("../errors");
11
+ /**
12
+ * SHM 文件序列化器
13
+ * 负责 SHM 数据的二进制序列化
14
+ */
15
+ class ShmSerializer {
16
+ /**
17
+ * 序列化 SHM 头部
18
+ * @param header 头部数据
19
+ */
20
+ serializeHeader(header) {
21
+ const writer = new utils_1.BufferWriter(constants_1.SHM_HEADER_SIZE);
22
+ writer.writeBigUInt64LE(header.walFileSize);
23
+ writer.writeBigUInt64LE(header.lastCompleteLsn);
24
+ writer.writeUInt32LE(header.recordCount);
25
+ writer.writeUInt32LE(header.checksum);
26
+ return writer.data;
27
+ }
28
+ /**
29
+ * 反序列化 SHM 头部
30
+ * @param buffer 包含头部数据的 Buffer
31
+ */
32
+ deserializeHeader(buffer) {
33
+ if (buffer.length < constants_1.SHM_HEADER_SIZE) {
34
+ throw new errors_1.FileFormatError("Invalid SHM header size", "", `at least ${constants_1.SHM_HEADER_SIZE} bytes`, buffer.length);
35
+ }
36
+ const reader = new utils_1.BufferReader(buffer);
37
+ const walFileSize = reader.readBigUInt64LE();
38
+ const lastCompleteLsn = reader.readBigUInt64LE();
39
+ const recordCount = reader.readUInt32LE();
40
+ const checksum = reader.readUInt32LE();
41
+ const calculatedChecksum = utils_1.BinaryUtils.calculateChecksum(buffer, 0, constants_1.SHM_HEADER_SIZE - 4);
42
+ if (calculatedChecksum !== checksum) {
43
+ throw new errors_1.ChecksumError("SHM header checksum verification failed", checksum, calculatedChecksum);
44
+ }
45
+ return {
46
+ walFileSize,
47
+ lastCompleteLsn,
48
+ recordCount,
49
+ checksum,
50
+ };
51
+ }
52
+ /**
53
+ * 序列化 SHM 条目
54
+ * @param entry 条目数据
55
+ */
56
+ serializeEntry(entry) {
57
+ const writer = new utils_1.BufferWriter(constants_1.SHM_ENTRY_SIZE);
58
+ writer.writeUInt32LE(entry.pageId);
59
+ writer.writeBigUInt64LE(entry.lsn);
60
+ writer.writeBigUInt64LE(entry.walOffset);
61
+ return writer.data;
62
+ }
63
+ /**
64
+ * 反序列化 SHM 条目
65
+ * @param buffer 包含条目数据的 Buffer
66
+ * @param offset 起始偏移量
67
+ */
68
+ deserializeEntry(buffer, offset = 0) {
69
+ const reader = new utils_1.BufferReader(buffer, offset);
70
+ const pageId = reader.readUInt32LE();
71
+ const lsn = reader.readBigUInt64LE();
72
+ const walOffset = reader.readBigUInt64LE();
73
+ return {
74
+ pageId,
75
+ lsn,
76
+ walOffset,
77
+ };
78
+ }
79
+ /**
80
+ * 计算哈希值
81
+ * @param pageId 页面ID
82
+ * @param capacity 哈希表容量
83
+ */
84
+ hash(pageId, capacity) {
85
+ let hash = pageId;
86
+ hash = ((hash >> 16) ^ hash) * 0x45d9f3b;
87
+ hash = ((hash >> 16) ^ hash) * 0x45d9f3b;
88
+ hash = (hash >> 16) ^ hash;
89
+ return Math.abs(hash) % capacity;
90
+ }
91
+ }
92
+ exports.ShmSerializer = ShmSerializer;
93
+ /**
94
+ * SHM 哈希表
95
+ * 内存中的 WAL 索引结构
96
+ */
97
+ class ShmHashTable {
98
+ /**
99
+ * 创建哈希表
100
+ * @param capacity 容量
101
+ */
102
+ constructor(capacity = constants_1.SHM_DEFAULT_CAPACITY) {
103
+ this.entries = new Map();
104
+ this.capacity = capacity;
105
+ }
106
+ /**
107
+ * 插入或更新条目
108
+ * @param entry 条目数据
109
+ */
110
+ set(entry) {
111
+ const existing = this.entries.get(entry.pageId);
112
+ if (!existing || entry.lsn > existing.lsn) {
113
+ this.entries.set(entry.pageId, entry);
114
+ }
115
+ }
116
+ /**
117
+ * 获取条目
118
+ * @param pageId 页面ID
119
+ */
120
+ get(pageId) {
121
+ return this.entries.get(pageId);
122
+ }
123
+ /**
124
+ * 删除条目
125
+ * @param pageId 页面ID
126
+ */
127
+ delete(pageId) {
128
+ return this.entries.delete(pageId);
129
+ }
130
+ /**
131
+ * 检查是否存在条目
132
+ * @param pageId 页面ID
133
+ */
134
+ has(pageId) {
135
+ return this.entries.has(pageId);
136
+ }
137
+ /**
138
+ * 获取所有条目
139
+ */
140
+ getAll() {
141
+ return Array.from(this.entries.values());
142
+ }
143
+ /**
144
+ * 获取条目数量
145
+ */
146
+ size() {
147
+ return this.entries.size;
148
+ }
149
+ /**
150
+ * 清空哈希表
151
+ */
152
+ clear() {
153
+ this.entries.clear();
154
+ }
155
+ /**
156
+ * 获取容量
157
+ */
158
+ getCapacity() {
159
+ return this.capacity;
160
+ }
161
+ /**
162
+ * 迭代器
163
+ */
164
+ [Symbol.iterator]() {
165
+ return this.entries.values()[Symbol.iterator]();
166
+ }
167
+ }
168
+ exports.ShmHashTable = ShmHashTable;
169
+ /**
170
+ * SHM 文件管理器
171
+ * 负责 .shm 文件的读写操作
172
+ */
173
+ class ShmFileManager {
174
+ /**
175
+ * 创建 SHM 文件管理器
176
+ * @param basePath 数据库基础路径
177
+ * @param dbName 数据库名称
178
+ * @param capacity 哈希表容量
179
+ */
180
+ constructor(basePath, dbName, capacity = constants_1.SHM_DEFAULT_CAPACITY) {
181
+ this.filePath = utils_1.FileUtils.buildFilePath(basePath, dbName, constants_1.FILE_EXTENSIONS.SHM);
182
+ this.serializer = new ShmSerializer();
183
+ this.hashTable = new ShmHashTable(capacity);
184
+ this.header = {
185
+ walFileSize: 0n,
186
+ lastCompleteLsn: 0n,
187
+ recordCount: 0,
188
+ checksum: 0,
189
+ };
190
+ }
191
+ /**
192
+ * 加载 SHM 文件
193
+ */
194
+ async load() {
195
+ const exists = await utils_1.FileUtils.exists(this.filePath);
196
+ if (!exists) {
197
+ return false;
198
+ }
199
+ try {
200
+ const data = await utils_1.FileUtils.readFile(this.filePath);
201
+ if (data.length < constants_1.SHM_HEADER_SIZE) {
202
+ return false;
203
+ }
204
+ this.header = this.serializer.deserializeHeader(data);
205
+ const entryCount = Math.floor((data.length - constants_1.SHM_HEADER_SIZE) / constants_1.SHM_ENTRY_SIZE);
206
+ for (let i = 0; i < entryCount; i++) {
207
+ const offset = constants_1.SHM_HEADER_SIZE + i * constants_1.SHM_ENTRY_SIZE;
208
+ const entry = this.serializer.deserializeEntry(data, offset);
209
+ this.hashTable.set(entry);
210
+ }
211
+ return true;
212
+ } catch (error) {
213
+ return false;
214
+ }
215
+ }
216
+ /**
217
+ * 保存 SHM 文件
218
+ */
219
+ async save() {
220
+ const entries = this.hashTable.getAll();
221
+ this.header.recordCount = entries.length;
222
+ const headerBuffer = this.serializer.serializeHeader(this.header);
223
+ const checksum = utils_1.BinaryUtils.calculateChecksum(headerBuffer, 0, constants_1.SHM_HEADER_SIZE - 4);
224
+ headerBuffer.writeUInt32LE(checksum, constants_1.SHM_HEADER_SIZE - 4);
225
+ const entryBuffers = entries.map((e) => this.serializer.serializeEntry(e));
226
+ const allBuffers = [headerBuffer, ...entryBuffers];
227
+ const data = utils_1.BinaryUtils.concat(allBuffers);
228
+ await utils_1.FileUtils.writeFile(this.filePath, data);
229
+ }
230
+ /**
231
+ * 更新 WAL 索引条目
232
+ * @param pageId 页面ID
233
+ * @param lsn LSN
234
+ * @param walOffset WAL 偏移量
235
+ */
236
+ updateEntry(pageId, lsn, walOffset) {
237
+ this.hashTable.set({ pageId, lsn, walOffset });
238
+ }
239
+ /**
240
+ * 获取页面的 WAL 索引
241
+ * @param pageId 页面ID
242
+ */
243
+ getEntry(pageId) {
244
+ return this.hashTable.get(pageId);
245
+ }
246
+ /**
247
+ * 获取所有条目
248
+ */
249
+ getAllEntries() {
250
+ return this.hashTable.getAll();
251
+ }
252
+ /**
253
+ * 更新头部信息
254
+ * @param walFileSize WAL 文件大小
255
+ * @param lastCompleteLsn 最后完整页的 LSN
256
+ */
257
+ updateHeader(walFileSize, lastCompleteLsn) {
258
+ this.header.walFileSize = walFileSize;
259
+ this.header.lastCompleteLsn = lastCompleteLsn;
260
+ }
261
+ /**
262
+ * 获取头部信息
263
+ */
264
+ getHeader() {
265
+ return { ...this.header };
266
+ }
267
+ /**
268
+ * 清空索引
269
+ */
270
+ async clear() {
271
+ this.hashTable.clear();
272
+ this.header = {
273
+ walFileSize: 0n,
274
+ lastCompleteLsn: 0n,
275
+ recordCount: 0,
276
+ checksum: 0,
277
+ };
278
+ const exists = await utils_1.FileUtils.exists(this.filePath);
279
+ if (exists) {
280
+ await utils_1.FileUtils.deleteFile(this.filePath);
281
+ }
282
+ }
283
+ /**
284
+ * 获取条目数量
285
+ */
286
+ getEntryCount() {
287
+ return this.hashTable.size();
288
+ }
289
+ /**
290
+ * 获取最后完整页的 LSN
291
+ */
292
+ getLastCompleteLsn() {
293
+ return this.header.lastCompleteLsn;
294
+ }
295
+ /**
296
+ * 获取 WAL 文件大小
297
+ */
298
+ getWalFileSize() {
299
+ return this.header.walFileSize;
300
+ }
301
+ /**
302
+ * 检查文件是否存在
303
+ */
304
+ async exists() {
305
+ return utils_1.FileUtils.exists(this.filePath);
306
+ }
307
+ /**
308
+ * 获取文件路径
309
+ */
310
+ getFilePath() {
311
+ return this.filePath;
312
+ }
313
+ /**
314
+ * 重建索引
315
+ * 从 WAL 记录重建 SHM 索引
316
+ * @param records WAL 记录数组
317
+ * @param getOffsetByLsn 根据 LSN 获取偏移量的函数
318
+ */
319
+ rebuildIndex(records, getOffsetByLsn) {
320
+ this.hashTable.clear();
321
+ for (const record of records) {
322
+ const pageId = this.keyToPageId(record.key);
323
+ const walOffset = BigInt(getOffsetByLsn(record.lsn));
324
+ this.hashTable.set({
325
+ pageId,
326
+ lsn: record.lsn,
327
+ walOffset,
328
+ });
329
+ }
330
+ if (records.length > 0) {
331
+ const lastRecord = records[records.length - 1];
332
+ this.header.lastCompleteLsn = lastRecord.lsn;
333
+ }
334
+ }
335
+ /**
336
+ * 将键转换为页面ID
337
+ * 简单的哈希函数
338
+ * @param key 键
339
+ */
340
+ keyToPageId(key) {
341
+ let hash = 0;
342
+ for (let i = 0; i < key.length; i++) {
343
+ const char = key.charCodeAt(i);
344
+ hash = (hash << 5) - hash + char;
345
+ hash = hash & hash;
346
+ }
347
+ return Math.abs(hash);
348
+ }
349
+ }
350
+ exports.ShmFileManager = ShmFileManager;
351
+ /**
352
+ * WAL 索引管理器
353
+ * 提供高级的 WAL 索引操作接口
354
+ */
355
+ class WalIndexManager {
356
+ /**
357
+ * 创建 WAL 索引管理器
358
+ * @param basePath 数据库基础路径
359
+ * @param dbName 数据库名称
360
+ */
361
+ constructor(basePath, dbName) {
362
+ this.shmManager = new ShmFileManager(basePath, dbName);
363
+ }
364
+ /**
365
+ * 初始化索引
366
+ */
367
+ async initialize() {
368
+ const loaded = await this.shmManager.load();
369
+ if (!loaded) {
370
+ await this.shmManager.clear();
371
+ }
372
+ }
373
+ /**
374
+ * 记录 WAL 写入
375
+ * @param pageId 页面ID
376
+ * @param lsn LSN
377
+ * @param walOffset WAL 偏移量
378
+ */
379
+ async recordWrite(pageId, lsn, walOffset) {
380
+ this.shmManager.updateEntry(pageId, lsn, walOffset);
381
+ this.shmManager.updateHeader(BigInt(walOffset), lsn);
382
+ await this.shmManager.save();
383
+ }
384
+ /**
385
+ * 获取页面的最新 WAL 记录位置
386
+ * @param pageId 页面ID
387
+ */
388
+ getPageLocation(pageId) {
389
+ return this.shmManager.getEntry(pageId);
390
+ }
391
+ /**
392
+ * 获取需要回放的 WAL 范围
393
+ */
394
+ getWalReplayRange() {
395
+ const header = this.shmManager.getHeader();
396
+ return {
397
+ startLsn: header.lastCompleteLsn,
398
+ endLsn: header.walFileSize,
399
+ };
400
+ }
401
+ /**
402
+ * 获取所有脏页
403
+ */
404
+ getDirtyPages() {
405
+ return this.shmManager.getAllEntries();
406
+ }
407
+ /**
408
+ * 检查点完成后重置索引
409
+ * @param checkpointLsn 检查点 LSN
410
+ */
411
+ async resetAfterCheckpoint(checkpointLsn) {
412
+ await this.shmManager.clear();
413
+ this.shmManager.updateHeader(0n, checkpointLsn);
414
+ await this.shmManager.save();
415
+ }
416
+ /**
417
+ * 同步索引到磁盘
418
+ */
419
+ async sync() {
420
+ await this.shmManager.save();
421
+ }
422
+ /**
423
+ * 关闭索引管理器
424
+ */
425
+ async close() {
426
+ await this.shmManager.save();
427
+ }
428
+ /**
429
+ * 获取 SHM 管理器
430
+ */
431
+ getShmManager() {
432
+ return this.shmManager;
433
+ }
434
+ }
435
+ exports.WalIndexManager = WalIndexManager;
436
+ //# sourceMappingURL=SHMFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SHMFile.js","sourceRoot":"","sources":["../../src/storage/SHMFile.ts"],"names":[],"mappings":"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"}