@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,526 @@
1
+ "use strict";
2
+ /**
3
+ * .light 文件格式实现
4
+ * 主数据文件,存储数据库的完整快照
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PageManager = exports.LightFileManager = exports.LightFileSerializer = void 0;
8
+ const constants_1 = require("../constants");
9
+ const utils_1 = require("../utils");
10
+ const errors_1 = require("../errors");
11
+ /**
12
+ * Light 文件序列化器
13
+ * 负责将数据序列化为 .light 文件格式
14
+ */
15
+ class LightFileSerializer {
16
+ /**
17
+ * 创建序列化器
18
+ * @param pageSize 页面大小,默认 4KB
19
+ */
20
+ constructor(pageSize = constants_1.DEFAULT_PAGE_SIZE) {
21
+ this.pageSize = pageSize;
22
+ }
23
+ /**
24
+ * 序列化文件头部
25
+ * @param header 头部数据
26
+ */
27
+ serializeHeader(header) {
28
+ const writer = new utils_1.BufferWriter(constants_1.HEADER_SIZE);
29
+ writer.writeUInt32LE(header.magic);
30
+ writer.writeUInt32LE(header.version);
31
+ writer.writeUInt32LE(header.pageSize);
32
+ writer.writeBigUInt64LE(header.lastSnapshotLsn);
33
+ writer.writeUInt32LE(0);
34
+ writer.writeUInt32LE(0);
35
+ writer.writeUInt32LE(0);
36
+ writer.writeUInt32LE(0);
37
+ return writer.data;
38
+ }
39
+ /**
40
+ * 反序列化文件头部
41
+ * @param buffer 包含头部数据的 Buffer
42
+ */
43
+ deserializeHeader(buffer) {
44
+ if (buffer.length < constants_1.HEADER_SIZE) {
45
+ throw new errors_1.FileFormatError("Invalid header size", "", `at least ${constants_1.HEADER_SIZE} bytes`, buffer.length);
46
+ }
47
+ const reader = new utils_1.BufferReader(buffer);
48
+ const magic = reader.readUInt32LE();
49
+ const version = reader.readUInt32LE();
50
+ const pageSize = reader.readUInt32LE();
51
+ const lastSnapshotLsn = reader.readBigUInt64LE();
52
+ if (magic !== constants_1.LIGHT_MAGIC) {
53
+ throw new errors_1.FileFormatError(
54
+ `Invalid magic number: expected ${constants_1.LIGHT_MAGIC}, got ${magic}`,
55
+ "",
56
+ constants_1.LIGHT_MAGIC.toString(),
57
+ magic,
58
+ );
59
+ }
60
+ return {
61
+ magic,
62
+ version,
63
+ pageSize,
64
+ lastSnapshotLsn,
65
+ };
66
+ }
67
+ /**
68
+ * 序列化单条记录
69
+ * @param record 记录数据
70
+ */
71
+ serializeRecord(record) {
72
+ const keyLength = utils_1.BinaryUtils.stringByteLength(record.key);
73
+ const valueLength = record.value.length;
74
+ const recordSize = 4 + keyLength + 4 + valueLength + 4;
75
+ const writer = new utils_1.BufferWriter(recordSize);
76
+ writer.writeUInt32LE(keyLength);
77
+ writer.writeString(record.key);
78
+ writer.writeUInt32LE(valueLength);
79
+ writer.writeBuffer(record.value);
80
+ writer.writeChecksum(0);
81
+ return writer.data;
82
+ }
83
+ /**
84
+ * 反序列化单条记录
85
+ * @param buffer 包含记录数据的 Buffer
86
+ * @param startOffset 起始偏移量
87
+ */
88
+ deserializeRecord(buffer, startOffset = 0) {
89
+ const reader = new utils_1.BufferReader(buffer, startOffset);
90
+ const key = reader.readString();
91
+ const valueLength = reader.readUInt32LE();
92
+ const value = reader.readBuffer(valueLength);
93
+ reader.readAndVerifyChecksum(startOffset);
94
+ return {
95
+ record: { key, value },
96
+ bytesRead: reader.position - startOffset,
97
+ };
98
+ }
99
+ /**
100
+ * 序列化页面
101
+ * @param page 页面数据
102
+ */
103
+ serializePage(page) {
104
+ const pageData = [];
105
+ const recordBuffers = page.records.map((r) => this.serializeRecord(r));
106
+ const recordsData = utils_1.BinaryUtils.concat(recordBuffers);
107
+ const headerWriter = new utils_1.BufferWriter(constants_1.PAGE_HEADER_SIZE);
108
+ headerWriter.writeUInt32LE(page.pageId);
109
+ headerWriter.writeUInt16LE(page.records.length);
110
+ headerWriter.writeUInt16LE(this.pageSize - constants_1.PAGE_HEADER_SIZE - recordsData.length);
111
+ pageData.push(headerWriter.data);
112
+ pageData.push(recordsData);
113
+ const pageBuffer = utils_1.BinaryUtils.concat(pageData);
114
+ const checksum = utils_1.BinaryUtils.calculateChecksum(pageBuffer);
115
+ const finalWriter = new utils_1.BufferWriter(this.pageSize);
116
+ finalWriter.writeBuffer(pageBuffer);
117
+ finalWriter.writeUInt32LE(checksum);
118
+ const padding = this.pageSize - finalWriter.position;
119
+ if (padding > 0) {
120
+ finalWriter.writeBuffer(Buffer.alloc(padding));
121
+ }
122
+ return finalWriter.data;
123
+ }
124
+ /**
125
+ * 反序列化页面
126
+ * @param buffer 包含页面数据的 Buffer
127
+ * @param pageId 页面ID
128
+ */
129
+ deserializePage(buffer, pageId) {
130
+ if (buffer.length < this.pageSize) {
131
+ throw new errors_1.PageError(`Invalid page size: expected ${this.pageSize}, got ${buffer.length}`, pageId);
132
+ }
133
+ const checksum = buffer.readUInt32LE(this.pageSize - 4);
134
+ utils_1.BinaryUtils.verifyChecksum(buffer, checksum, 0, this.pageSize - 4);
135
+ const reader = new utils_1.BufferReader(buffer);
136
+ const readPageId = reader.readUInt32LE();
137
+ const recordCount = reader.readUInt16LE();
138
+ if (readPageId !== pageId) {
139
+ throw new errors_1.PageError(`Page ID mismatch: expected ${pageId}, got ${readPageId}`, pageId);
140
+ }
141
+ const records = [];
142
+ for (let i = 0; i < recordCount; i++) {
143
+ const { record } = this.deserializeRecord(buffer, reader.position);
144
+ records.push(record);
145
+ }
146
+ return {
147
+ pageId,
148
+ records,
149
+ checksum,
150
+ };
151
+ }
152
+ /**
153
+ * 序列化整个数据库快照
154
+ * @param pages 页面映射
155
+ * @param lastSnapshotLsn 上次快照的 LSN
156
+ */
157
+ serializeSnapshot(pages, lastSnapshotLsn) {
158
+ const buffers = [];
159
+ const header = {
160
+ magic: constants_1.LIGHT_MAGIC,
161
+ version: constants_1.LIGHT_VERSION,
162
+ pageSize: this.pageSize,
163
+ lastSnapshotLsn,
164
+ };
165
+ buffers.push(this.serializeHeader(header));
166
+ const sortedPageIds = Array.from(pages.keys()).sort((a, b) => a - b);
167
+ for (const pageId of sortedPageIds) {
168
+ const page = pages.get(pageId);
169
+ if (page) {
170
+ buffers.push(this.serializePage(page));
171
+ }
172
+ }
173
+ return utils_1.BinaryUtils.concat(buffers);
174
+ }
175
+ /**
176
+ * 获取页面大小
177
+ */
178
+ getPageSize() {
179
+ return this.pageSize;
180
+ }
181
+ }
182
+ exports.LightFileSerializer = LightFileSerializer;
183
+ /**
184
+ * Light 文件管理器
185
+ * 负责 .light 文件的读写操作
186
+ */
187
+ class LightFileManager {
188
+ /**
189
+ * 创建文件管理器
190
+ * @param basePath 数据库基础路径
191
+ * @param dbName 数据库名称
192
+ * @param pageSize 页面大小
193
+ */
194
+ constructor(basePath, dbName, pageSize = constants_1.DEFAULT_PAGE_SIZE) {
195
+ this.handle = null;
196
+ this.basePath = basePath;
197
+ this.dbName = dbName;
198
+ this.serializer = new LightFileSerializer(pageSize);
199
+ }
200
+ /**
201
+ * 获取 .light 文件路径
202
+ */
203
+ getFilePath() {
204
+ return utils_1.FileUtils.buildFilePath(this.basePath, this.dbName, constants_1.FILE_EXTENSIONS.LIGHT);
205
+ }
206
+ /**
207
+ * 获取临时文件路径
208
+ */
209
+ getTempFilePath() {
210
+ return utils_1.FileUtils.buildFilePath(this.basePath, this.dbName, constants_1.FILE_EXTENSIONS.TEMP);
211
+ }
212
+ /**
213
+ * 打开文件
214
+ */
215
+ async open() {
216
+ const filePath = this.getFilePath();
217
+ const exists = await utils_1.FileUtils.exists(filePath);
218
+ if (exists) {
219
+ this.handle = new utils_1.FileHandleWrapper(filePath, "r+");
220
+ } else {
221
+ this.handle = new utils_1.FileHandleWrapper(filePath, "w+");
222
+ }
223
+ await this.handle.open();
224
+ }
225
+ /**
226
+ * 关闭文件
227
+ */
228
+ async close() {
229
+ if (this.handle) {
230
+ await this.handle.close();
231
+ this.handle = null;
232
+ }
233
+ }
234
+ /**
235
+ * 读取文件头部
236
+ */
237
+ async readHeader() {
238
+ if (!this.handle) {
239
+ throw new errors_1.FileFormatError("File not open", this.getFilePath());
240
+ }
241
+ const size = await this.handle.size();
242
+ if (size < constants_1.HEADER_SIZE) {
243
+ return null;
244
+ }
245
+ const buffer = utils_1.BinaryUtils.alloc(constants_1.HEADER_SIZE);
246
+ await this.handle.read(buffer, 0, constants_1.HEADER_SIZE, 0);
247
+ return this.serializer.deserializeHeader(buffer);
248
+ }
249
+ /**
250
+ * 写入文件头部
251
+ * @param header 头部数据
252
+ */
253
+ async writeHeader(header) {
254
+ if (!this.handle) {
255
+ throw new errors_1.FileFormatError("File not open", this.getFilePath());
256
+ }
257
+ const buffer = this.serializer.serializeHeader(header);
258
+ await this.handle.write(buffer, 0, buffer.length, 0);
259
+ }
260
+ /**
261
+ * 读取指定页面
262
+ * @param pageId 页面ID
263
+ */
264
+ async readPage(pageId) {
265
+ if (!this.handle) {
266
+ throw new errors_1.FileFormatError("File not open", this.getFilePath());
267
+ }
268
+ const pageSize = this.serializer.getPageSize();
269
+ const position = constants_1.HEADER_SIZE + pageId * pageSize;
270
+ const size = await this.handle.size();
271
+ if (position + pageSize > size) {
272
+ return null;
273
+ }
274
+ const buffer = utils_1.BinaryUtils.alloc(pageSize);
275
+ await this.handle.read(buffer, 0, pageSize, position);
276
+ return this.serializer.deserializePage(buffer, pageId);
277
+ }
278
+ /**
279
+ * 写入指定页面
280
+ * @param page 页面数据
281
+ */
282
+ async writePage(page) {
283
+ if (!this.handle) {
284
+ throw new errors_1.FileFormatError("File not open", this.getFilePath());
285
+ }
286
+ const pageSize = this.serializer.getPageSize();
287
+ const position = constants_1.HEADER_SIZE + page.pageId * pageSize;
288
+ const buffer = this.serializer.serializePage(page);
289
+ await this.handle.write(buffer, 0, buffer.length, position);
290
+ }
291
+ /**
292
+ * 加载所有页面
293
+ */
294
+ async loadAllPages() {
295
+ if (!this.handle) {
296
+ throw new errors_1.FileFormatError("File not open", this.getFilePath());
297
+ }
298
+ const pages = new Map();
299
+ const pageSize = this.serializer.getPageSize();
300
+ const size = await this.handle.size();
301
+ if (size <= constants_1.HEADER_SIZE) {
302
+ return pages;
303
+ }
304
+ const pageCount = Math.floor((size - constants_1.HEADER_SIZE) / pageSize);
305
+ for (let pageId = 0; pageId < pageCount; pageId++) {
306
+ const page = await this.readPage(pageId);
307
+ if (page) {
308
+ pages.set(pageId, page);
309
+ }
310
+ }
311
+ return pages;
312
+ }
313
+ /**
314
+ * 加载所有记录到内存映射
315
+ */
316
+ async loadAllRecords() {
317
+ const pages = await this.loadAllPages();
318
+ const records = new Map();
319
+ for (const page of pages.values()) {
320
+ for (const record of page.records) {
321
+ records.set(record.key, record.value);
322
+ }
323
+ }
324
+ return records;
325
+ }
326
+ /**
327
+ * 原子性写入完整快照
328
+ * 先写临时文件,再 rename 确保原子性
329
+ * @param pages 页面映射
330
+ * @param lastSnapshotLsn 上次快照的 LSN
331
+ */
332
+ async writeSnapshot(pages, lastSnapshotLsn) {
333
+ const tempPath = this.getTempFilePath();
334
+ const finalPath = this.getFilePath();
335
+ const data = this.serializer.serializeSnapshot(pages, lastSnapshotLsn);
336
+ await utils_1.FileUtils.writeFile(tempPath, data);
337
+ await utils_1.FileUtils.syncFile(tempPath);
338
+ await utils_1.FileUtils.rename(tempPath, finalPath);
339
+ if (this.handle) {
340
+ await this.handle.close();
341
+ this.handle = new utils_1.FileHandleWrapper(finalPath, "r+");
342
+ await this.handle.open();
343
+ }
344
+ }
345
+ /**
346
+ * 获取文件大小
347
+ */
348
+ async getFileSize() {
349
+ if (!this.handle) {
350
+ return 0;
351
+ }
352
+ return this.handle.size();
353
+ }
354
+ /**
355
+ * 同步到磁盘
356
+ */
357
+ async sync() {
358
+ if (this.handle) {
359
+ await this.handle.sync();
360
+ }
361
+ }
362
+ /**
363
+ * 检查文件是否存在
364
+ */
365
+ async exists() {
366
+ return utils_1.FileUtils.exists(this.getFilePath());
367
+ }
368
+ /**
369
+ * 获取页面大小
370
+ */
371
+ getPageSize() {
372
+ return this.serializer.getPageSize();
373
+ }
374
+ }
375
+ exports.LightFileManager = LightFileManager;
376
+ /**
377
+ * 页面管理器
378
+ * 管理内存中的页面分配和回收
379
+ */
380
+ class PageManager {
381
+ /**
382
+ * 创建页面管理器
383
+ * @param pageSize 页面大小
384
+ */
385
+ constructor(pageSize = constants_1.DEFAULT_PAGE_SIZE) {
386
+ this.pageSize = pageSize;
387
+ this.pages = new Map();
388
+ this.nextPageId = 0;
389
+ this.dirtyPages = new Set();
390
+ }
391
+ /**
392
+ * 创建新页面
393
+ */
394
+ createPage() {
395
+ const pageId = this.nextPageId++;
396
+ const page = {
397
+ pageId,
398
+ records: [],
399
+ checksum: 0,
400
+ };
401
+ this.pages.set(pageId, page);
402
+ this.dirtyPages.add(pageId);
403
+ return page;
404
+ }
405
+ /**
406
+ * 获取页面
407
+ * @param pageId 页面ID
408
+ */
409
+ getPage(pageId) {
410
+ return this.pages.get(pageId);
411
+ }
412
+ /**
413
+ * 获取或创建页面
414
+ * @param pageId 页面ID
415
+ */
416
+ getOrCreatePage(pageId) {
417
+ let page = this.pages.get(pageId);
418
+ if (!page) {
419
+ page = {
420
+ pageId,
421
+ records: [],
422
+ checksum: 0,
423
+ };
424
+ this.pages.set(pageId, page);
425
+ if (pageId >= this.nextPageId) {
426
+ this.nextPageId = pageId + 1;
427
+ }
428
+ }
429
+ return page;
430
+ }
431
+ /**
432
+ * 标记页面为脏页
433
+ * @param pageId 页面ID
434
+ */
435
+ markDirty(pageId) {
436
+ this.dirtyPages.add(pageId);
437
+ }
438
+ /**
439
+ * 获取所有脏页
440
+ */
441
+ getDirtyPages() {
442
+ const dirty = [];
443
+ for (const pageId of this.dirtyPages) {
444
+ const page = this.pages.get(pageId);
445
+ if (page) {
446
+ dirty.push(page);
447
+ }
448
+ }
449
+ return dirty;
450
+ }
451
+ /**
452
+ * 清除脏页标记
453
+ */
454
+ clearDirtyFlags() {
455
+ this.dirtyPages.clear();
456
+ }
457
+ /**
458
+ * 加载页面数据
459
+ * @param pages 页面映射
460
+ */
461
+ loadPages(pages) {
462
+ this.pages = new Map(pages);
463
+ this.nextPageId = 0;
464
+ for (const pageId of pages.keys()) {
465
+ if (pageId >= this.nextPageId) {
466
+ this.nextPageId = pageId + 1;
467
+ }
468
+ }
469
+ this.dirtyPages.clear();
470
+ }
471
+ /**
472
+ * 获取所有页面
473
+ */
474
+ getAllPages() {
475
+ return new Map(this.pages);
476
+ }
477
+ /**
478
+ * 获取页面数量
479
+ */
480
+ getPageCount() {
481
+ return this.pages.size;
482
+ }
483
+ /**
484
+ * 计算记录在页面中的大小
485
+ * @param record 记录
486
+ */
487
+ calculateRecordSize(record) {
488
+ const keyLength = utils_1.BinaryUtils.stringByteLength(record.key);
489
+ return 4 + keyLength + 4 + record.value.length + 4;
490
+ }
491
+ /**
492
+ * 获取页面可用空间
493
+ * @param page 页面
494
+ */
495
+ getAvailableSpace(page) {
496
+ const usedSpace = page.records.reduce((sum, r) => sum + this.calculateRecordSize(r), constants_1.PAGE_HEADER_SIZE + 4);
497
+ return this.pageSize - usedSpace;
498
+ }
499
+ /**
500
+ * 查找可以容纳记录的页面
501
+ * @param record 记录
502
+ */
503
+ findPageForRecord(record) {
504
+ const recordSize = this.calculateRecordSize(record);
505
+ for (const page of this.pages.values()) {
506
+ if (this.getAvailableSpace(page) >= recordSize) {
507
+ return page;
508
+ }
509
+ }
510
+ return null;
511
+ }
512
+ /**
513
+ * 获取下一个页面ID
514
+ */
515
+ getNextPageId() {
516
+ return this.nextPageId;
517
+ }
518
+ /**
519
+ * 获取页面大小
520
+ */
521
+ getPageSize() {
522
+ return this.pageSize;
523
+ }
524
+ }
525
+ exports.PageManager = PageManager;
526
+ //# sourceMappingURL=LightFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightFile.js","sourceRoot":"","sources":["../../src/storage/LightFile.ts"],"names":[],"mappings":"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"}