@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.
- package/dist/api/LightDB.d.ts +194 -0
- package/dist/api/LightDB.d.ts.map +1 -0
- package/dist/api/LightDB.js +299 -0
- package/dist/api/LightDB.js.map +1 -0
- package/dist/api/Transaction.d.ts +100 -0
- package/dist/api/Transaction.d.ts.map +1 -0
- package/dist/api/Transaction.js +263 -0
- package/dist/api/Transaction.js.map +1 -0
- package/dist/api/index.d.ts +24 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +54 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/types.d.ts +154 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +7 -0
- package/dist/api/types.js.map +1 -0
- package/dist/collection/Collection.d.ts +235 -0
- package/dist/collection/Collection.d.ts.map +1 -0
- package/dist/collection/Collection.js +671 -0
- package/dist/collection/Collection.js.map +1 -0
- package/dist/collection/QueryBuilder.d.ts +225 -0
- package/dist/collection/QueryBuilder.d.ts.map +1 -0
- package/dist/collection/QueryBuilder.js +475 -0
- package/dist/collection/QueryBuilder.js.map +1 -0
- package/dist/collection/QueryParser.d.ts +117 -0
- package/dist/collection/QueryParser.d.ts.map +1 -0
- package/dist/collection/QueryParser.js +438 -0
- package/dist/collection/QueryParser.js.map +1 -0
- package/dist/collection/index.d.ts +42 -0
- package/dist/collection/index.d.ts.map +1 -0
- package/dist/collection/index.js +41 -0
- package/dist/collection/index.js.map +1 -0
- package/dist/collection/types.d.ts +365 -0
- package/dist/collection/types.d.ts.map +1 -0
- package/dist/collection/types.js +7 -0
- package/dist/collection/types.js.map +1 -0
- package/dist/constants/index.d.ts +51 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +68 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/errors/index.d.ts +69 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +132 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +220 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +729 -0
- package/dist/index.js.map +1 -0
- package/dist/indexes/BPlusTree.d.ts +181 -0
- package/dist/indexes/BPlusTree.d.ts.map +1 -0
- package/dist/indexes/BPlusTree.js +528 -0
- package/dist/indexes/BPlusTree.js.map +1 -0
- package/dist/indexes/IndexManager.d.ts +236 -0
- package/dist/indexes/IndexManager.d.ts.map +1 -0
- package/dist/indexes/IndexManager.js +502 -0
- package/dist/indexes/IndexManager.js.map +1 -0
- package/dist/indexes/PrimaryIndex.d.ts +240 -0
- package/dist/indexes/PrimaryIndex.d.ts.map +1 -0
- package/dist/indexes/PrimaryIndex.js +354 -0
- package/dist/indexes/PrimaryIndex.js.map +1 -0
- package/dist/indexes/SecondaryIndex.d.ts +204 -0
- package/dist/indexes/SecondaryIndex.d.ts.map +1 -0
- package/dist/indexes/SecondaryIndex.js +480 -0
- package/dist/indexes/SecondaryIndex.js.map +1 -0
- package/dist/indexes/errors.d.ts +66 -0
- package/dist/indexes/errors.d.ts.map +1 -0
- package/dist/indexes/errors.js +117 -0
- package/dist/indexes/errors.js.map +1 -0
- package/dist/indexes/index.d.ts +52 -0
- package/dist/indexes/index.d.ts.map +1 -0
- package/dist/indexes/index.js +131 -0
- package/dist/indexes/index.js.map +1 -0
- package/dist/indexes/types.d.ts +246 -0
- package/dist/indexes/types.d.ts.map +1 -0
- package/dist/indexes/types.js +30 -0
- package/dist/indexes/types.js.map +1 -0
- package/dist/performance/BatchWALWriter.d.ts +185 -0
- package/dist/performance/BatchWALWriter.d.ts.map +1 -0
- package/dist/performance/BatchWALWriter.js +490 -0
- package/dist/performance/BatchWALWriter.js.map +1 -0
- package/dist/performance/ColumnarStorage.d.ts +138 -0
- package/dist/performance/ColumnarStorage.d.ts.map +1 -0
- package/dist/performance/ColumnarStorage.js +875 -0
- package/dist/performance/ColumnarStorage.js.map +1 -0
- package/dist/performance/LazyQuery.d.ts +307 -0
- package/dist/performance/LazyQuery.d.ts.map +1 -0
- package/dist/performance/LazyQuery.js +588 -0
- package/dist/performance/LazyQuery.js.map +1 -0
- package/dist/performance/OptimizedBuffer.d.ts +375 -0
- package/dist/performance/OptimizedBuffer.d.ts.map +1 -0
- package/dist/performance/OptimizedBuffer.js +730 -0
- package/dist/performance/OptimizedBuffer.js.map +1 -0
- package/dist/performance/RWLock.d.ts +260 -0
- package/dist/performance/RWLock.d.ts.map +1 -0
- package/dist/performance/RWLock.js +570 -0
- package/dist/performance/RWLock.js.map +1 -0
- package/dist/performance/index.d.ts +41 -0
- package/dist/performance/index.d.ts.map +1 -0
- package/dist/performance/index.js +162 -0
- package/dist/performance/index.js.map +1 -0
- package/dist/performance/types.d.ts +247 -0
- package/dist/performance/types.d.ts.map +1 -0
- package/dist/performance/types.js +26 -0
- package/dist/performance/types.js.map +1 -0
- package/dist/storage/Checkpoint.d.ts +128 -0
- package/dist/storage/Checkpoint.d.ts.map +1 -0
- package/dist/storage/Checkpoint.js +251 -0
- package/dist/storage/Checkpoint.js.map +1 -0
- package/dist/storage/LightFile.d.ts +227 -0
- package/dist/storage/LightFile.d.ts.map +1 -0
- package/dist/storage/LightFile.js +526 -0
- package/dist/storage/LightFile.js.map +1 -0
- package/dist/storage/Recovery.d.ts +172 -0
- package/dist/storage/Recovery.d.ts.map +1 -0
- package/dist/storage/Recovery.js +399 -0
- package/dist/storage/Recovery.js.map +1 -0
- package/dist/storage/SHMFile.d.ts +243 -0
- package/dist/storage/SHMFile.d.ts.map +1 -0
- package/dist/storage/SHMFile.js +436 -0
- package/dist/storage/SHMFile.js.map +1 -0
- package/dist/storage/StorageEngine.d.ts +146 -0
- package/dist/storage/StorageEngine.d.ts.map +1 -0
- package/dist/storage/StorageEngine.js +353 -0
- package/dist/storage/StorageEngine.js.map +1 -0
- package/dist/storage/WALFile.d.ts +248 -0
- package/dist/storage/WALFile.d.ts.map +1 -0
- package/dist/storage/WALFile.js +597 -0
- package/dist/storage/WALFile.js.map +1 -0
- package/dist/storage/index.d.ts +10 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +153 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/types/index.d.ts +220 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/binary.d.ts +271 -0
- package/dist/utils/binary.d.ts.map +1 -0
- package/dist/utils/binary.js +454 -0
- package/dist/utils/binary.js.map +1 -0
- package/dist/utils/file.d.ts +166 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +346 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +39 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +37 -0
- package/readme.md +124 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 检查点(Checkpoint)机制实现
|
|
4
|
+
* 将内存中的完整数据原子性写入新的 .light 文件
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.IncrementalCheckpointManager = exports.AutoCheckpointScheduler = exports.CheckpointManager = void 0;
|
|
8
|
+
const constants_1 = require("../constants");
|
|
9
|
+
const errors_1 = require("../errors");
|
|
10
|
+
/**
|
|
11
|
+
* 检查点管理器
|
|
12
|
+
* 负责管理检查点的创建和协调
|
|
13
|
+
*/
|
|
14
|
+
class CheckpointManager {
|
|
15
|
+
/**
|
|
16
|
+
* 创建检查点管理器
|
|
17
|
+
* @param lightFileManager Light 文件管理器
|
|
18
|
+
* @param walManager WAL 管理器
|
|
19
|
+
* @param walIndexManager WAL 索引管理器
|
|
20
|
+
* @param pageManager 页面管理器
|
|
21
|
+
* @param walThreshold WAL 文件大小阈值
|
|
22
|
+
*/
|
|
23
|
+
constructor(lightFileManager, walManager, walIndexManager, pageManager, walThreshold = constants_1.DEFAULT_WAL_THRESHOLD) {
|
|
24
|
+
this.lightFileManager = lightFileManager;
|
|
25
|
+
this.walManager = walManager;
|
|
26
|
+
this.walIndexManager = walIndexManager;
|
|
27
|
+
this.pageManager = pageManager;
|
|
28
|
+
this.walThreshold = walThreshold;
|
|
29
|
+
this.lastCheckpointTime = null;
|
|
30
|
+
this.checkpointInProgress = false;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 检查是否需要执行检查点
|
|
34
|
+
*/
|
|
35
|
+
async shouldCheckpoint() {
|
|
36
|
+
if (this.checkpointInProgress) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
const walSize = await this.walManager.getFileSize();
|
|
40
|
+
return walSize >= this.walThreshold;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 执行检查点
|
|
44
|
+
* @param records 当前内存中的所有记录
|
|
45
|
+
*/
|
|
46
|
+
async execute(records) {
|
|
47
|
+
if (this.checkpointInProgress) {
|
|
48
|
+
throw new errors_1.CheckpointError("Checkpoint already in progress");
|
|
49
|
+
}
|
|
50
|
+
this.checkpointInProgress = true;
|
|
51
|
+
try {
|
|
52
|
+
const currentLsn = this.walManager.getCurrentLsn();
|
|
53
|
+
await this.walManager.writeCheckpoint();
|
|
54
|
+
await this.walManager.sync();
|
|
55
|
+
const pages = this.buildPages(records);
|
|
56
|
+
await this.lightFileManager.writeSnapshot(pages, currentLsn);
|
|
57
|
+
await this.walManager.clear();
|
|
58
|
+
await this.walIndexManager.resetAfterCheckpoint(currentLsn);
|
|
59
|
+
this.pageManager.loadPages(pages);
|
|
60
|
+
this.pageManager.clearDirtyFlags();
|
|
61
|
+
this.lastCheckpointTime = Date.now();
|
|
62
|
+
const endTime = Date.now();
|
|
63
|
+
const bytesWritten = await this.lightFileManager.getFileSize();
|
|
64
|
+
return {
|
|
65
|
+
timestamp: endTime,
|
|
66
|
+
lsn: currentLsn,
|
|
67
|
+
pagesWritten: pages.size,
|
|
68
|
+
bytesWritten,
|
|
69
|
+
};
|
|
70
|
+
} catch (error) {
|
|
71
|
+
const err = error;
|
|
72
|
+
throw new errors_1.CheckpointError(`Checkpoint failed: ${err.message}`, this.walManager.getCurrentLsn());
|
|
73
|
+
} finally {
|
|
74
|
+
this.checkpointInProgress = false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 将记录转换为页面
|
|
79
|
+
* @param records 记录映射
|
|
80
|
+
*/
|
|
81
|
+
buildPages(records) {
|
|
82
|
+
const pages = new Map();
|
|
83
|
+
const pageSize = this.pageManager.getPageSize();
|
|
84
|
+
let currentPageId = 0;
|
|
85
|
+
let currentRecords = [];
|
|
86
|
+
let currentSize = 0;
|
|
87
|
+
const headerSize = 12;
|
|
88
|
+
const recordOverhead = 4 + 4 + 4;
|
|
89
|
+
for (const [key, value] of records) {
|
|
90
|
+
const keyLength = Buffer.byteLength(key, "utf8");
|
|
91
|
+
const recordSize = recordOverhead + keyLength + value.length;
|
|
92
|
+
if (currentSize + recordSize > pageSize - headerSize - 4 && currentRecords.length > 0) {
|
|
93
|
+
pages.set(currentPageId, {
|
|
94
|
+
pageId: currentPageId,
|
|
95
|
+
records: currentRecords.map((r) => ({ key: r.key, value: r.value })),
|
|
96
|
+
checksum: 0,
|
|
97
|
+
});
|
|
98
|
+
currentPageId++;
|
|
99
|
+
currentRecords = [];
|
|
100
|
+
currentSize = 0;
|
|
101
|
+
}
|
|
102
|
+
currentRecords.push({ key, value });
|
|
103
|
+
currentSize += recordSize;
|
|
104
|
+
}
|
|
105
|
+
if (currentRecords.length > 0) {
|
|
106
|
+
pages.set(currentPageId, {
|
|
107
|
+
pageId: currentPageId,
|
|
108
|
+
records: currentRecords.map((r) => ({ key: r.key, value: r.value })),
|
|
109
|
+
checksum: 0,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
return pages;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 获取上次检查点时间
|
|
116
|
+
*/
|
|
117
|
+
getLastCheckpointTime() {
|
|
118
|
+
return this.lastCheckpointTime;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 检查是否有检查点正在进行
|
|
122
|
+
*/
|
|
123
|
+
isCheckpointInProgress() {
|
|
124
|
+
return this.checkpointInProgress;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 获取 WAL 阈值
|
|
128
|
+
*/
|
|
129
|
+
getWalThreshold() {
|
|
130
|
+
return this.walThreshold;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
exports.CheckpointManager = CheckpointManager;
|
|
134
|
+
/**
|
|
135
|
+
* 自动检查点调度器
|
|
136
|
+
* 根据配置自动触发检查点
|
|
137
|
+
*/
|
|
138
|
+
class AutoCheckpointScheduler {
|
|
139
|
+
/**
|
|
140
|
+
* 创建自动检查点调度器
|
|
141
|
+
* @param checkpointManager 检查点管理器
|
|
142
|
+
* @param interval 检查间隔(毫秒)
|
|
143
|
+
* @param getRecords 获取当前记录的函数
|
|
144
|
+
*/
|
|
145
|
+
constructor(checkpointManager, interval, getRecords) {
|
|
146
|
+
this.checkpointManager = checkpointManager;
|
|
147
|
+
this.interval = interval;
|
|
148
|
+
this.timer = null;
|
|
149
|
+
this.running = false;
|
|
150
|
+
this.getRecords = getRecords;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 启动调度器
|
|
154
|
+
*/
|
|
155
|
+
start() {
|
|
156
|
+
if (this.running) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
this.running = true;
|
|
160
|
+
this.timer = setInterval(async () => {
|
|
161
|
+
try {
|
|
162
|
+
if (await this.checkpointManager.shouldCheckpoint()) {
|
|
163
|
+
await this.checkpointManager.execute(this.getRecords());
|
|
164
|
+
}
|
|
165
|
+
} catch {
|
|
166
|
+
// 静默处理错误,避免影响定时器
|
|
167
|
+
}
|
|
168
|
+
}, this.interval);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* 停止调度器
|
|
172
|
+
*/
|
|
173
|
+
stop() {
|
|
174
|
+
if (this.timer) {
|
|
175
|
+
clearInterval(this.timer);
|
|
176
|
+
this.timer = null;
|
|
177
|
+
}
|
|
178
|
+
this.running = false;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* 检查是否正在运行
|
|
182
|
+
*/
|
|
183
|
+
isRunning() {
|
|
184
|
+
return this.running;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
exports.AutoCheckpointScheduler = AutoCheckpointScheduler;
|
|
188
|
+
/**
|
|
189
|
+
* 增量检查点管理器
|
|
190
|
+
* 只将脏页写入文件,减少 I/O
|
|
191
|
+
*/
|
|
192
|
+
class IncrementalCheckpointManager {
|
|
193
|
+
/**
|
|
194
|
+
* 创建增量检查点管理器
|
|
195
|
+
* @param lightFileManager Light 文件管理器
|
|
196
|
+
* @param walManager WAL 管理器
|
|
197
|
+
* @param pageManager 页面管理器
|
|
198
|
+
* @param walThreshold WAL 阈值
|
|
199
|
+
*/
|
|
200
|
+
constructor(lightFileManager, walManager, pageManager, walThreshold = constants_1.DEFAULT_WAL_THRESHOLD) {
|
|
201
|
+
this.lightFileManager = lightFileManager;
|
|
202
|
+
this.walManager = walManager;
|
|
203
|
+
this.pageManager = pageManager;
|
|
204
|
+
this.walThreshold = walThreshold;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* 执行增量检查点
|
|
208
|
+
*/
|
|
209
|
+
async executeIncremental() {
|
|
210
|
+
const dirtyPages = this.pageManager.getDirtyPages();
|
|
211
|
+
if (dirtyPages.length === 0) {
|
|
212
|
+
return {
|
|
213
|
+
timestamp: Date.now(),
|
|
214
|
+
lsn: this.walManager.getCurrentLsn(),
|
|
215
|
+
pagesWritten: 0,
|
|
216
|
+
bytesWritten: 0,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
const currentLsn = this.walManager.getCurrentLsn();
|
|
220
|
+
for (const page of dirtyPages) {
|
|
221
|
+
await this.lightFileManager.writePage(page);
|
|
222
|
+
}
|
|
223
|
+
await this.lightFileManager.sync();
|
|
224
|
+
const header = await this.lightFileManager.readHeader();
|
|
225
|
+
if (header) {
|
|
226
|
+
header.lastSnapshotLsn = currentLsn;
|
|
227
|
+
await this.lightFileManager.writeHeader(header);
|
|
228
|
+
}
|
|
229
|
+
this.pageManager.clearDirtyFlags();
|
|
230
|
+
const totalBytes = dirtyPages.length * this.pageManager.getPageSize();
|
|
231
|
+
return {
|
|
232
|
+
timestamp: Date.now(),
|
|
233
|
+
lsn: currentLsn,
|
|
234
|
+
pagesWritten: dirtyPages.length,
|
|
235
|
+
bytesWritten: totalBytes,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* 检查是否需要增量检查点
|
|
240
|
+
*/
|
|
241
|
+
async shouldCheckpoint() {
|
|
242
|
+
const dirtyPages = this.pageManager.getDirtyPages();
|
|
243
|
+
if (dirtyPages.length > 100) {
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
const walSize = await this.walManager.getFileSize();
|
|
247
|
+
return walSize >= this.walThreshold;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
exports.IncrementalCheckpointManager = IncrementalCheckpointManager;
|
|
251
|
+
//# sourceMappingURL=Checkpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkpoint.js","sourceRoot":"","sources":["../../src/storage/Checkpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* .light 文件格式实现
|
|
3
|
+
* 主数据文件,存储数据库的完整快照
|
|
4
|
+
*/
|
|
5
|
+
import { LightHeader, Page, Record, PageMap, RecordMap } from "../types";
|
|
6
|
+
/**
|
|
7
|
+
* Light 文件序列化器
|
|
8
|
+
* 负责将数据序列化为 .light 文件格式
|
|
9
|
+
*/
|
|
10
|
+
export declare class LightFileSerializer {
|
|
11
|
+
private readonly pageSize;
|
|
12
|
+
/**
|
|
13
|
+
* 创建序列化器
|
|
14
|
+
* @param pageSize 页面大小,默认 4KB
|
|
15
|
+
*/
|
|
16
|
+
constructor(pageSize?: number);
|
|
17
|
+
/**
|
|
18
|
+
* 序列化文件头部
|
|
19
|
+
* @param header 头部数据
|
|
20
|
+
*/
|
|
21
|
+
serializeHeader(header: LightHeader): Buffer;
|
|
22
|
+
/**
|
|
23
|
+
* 反序列化文件头部
|
|
24
|
+
* @param buffer 包含头部数据的 Buffer
|
|
25
|
+
*/
|
|
26
|
+
deserializeHeader(buffer: Buffer): LightHeader;
|
|
27
|
+
/**
|
|
28
|
+
* 序列化单条记录
|
|
29
|
+
* @param record 记录数据
|
|
30
|
+
*/
|
|
31
|
+
serializeRecord(record: Record): Buffer;
|
|
32
|
+
/**
|
|
33
|
+
* 反序列化单条记录
|
|
34
|
+
* @param buffer 包含记录数据的 Buffer
|
|
35
|
+
* @param startOffset 起始偏移量
|
|
36
|
+
*/
|
|
37
|
+
deserializeRecord(
|
|
38
|
+
buffer: Buffer,
|
|
39
|
+
startOffset?: number,
|
|
40
|
+
): {
|
|
41
|
+
record: Record;
|
|
42
|
+
bytesRead: number;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* 序列化页面
|
|
46
|
+
* @param page 页面数据
|
|
47
|
+
*/
|
|
48
|
+
serializePage(page: Page): Buffer;
|
|
49
|
+
/**
|
|
50
|
+
* 反序列化页面
|
|
51
|
+
* @param buffer 包含页面数据的 Buffer
|
|
52
|
+
* @param pageId 页面ID
|
|
53
|
+
*/
|
|
54
|
+
deserializePage(buffer: Buffer, pageId: number): Page;
|
|
55
|
+
/**
|
|
56
|
+
* 序列化整个数据库快照
|
|
57
|
+
* @param pages 页面映射
|
|
58
|
+
* @param lastSnapshotLsn 上次快照的 LSN
|
|
59
|
+
*/
|
|
60
|
+
serializeSnapshot(pages: PageMap, lastSnapshotLsn: bigint): Buffer;
|
|
61
|
+
/**
|
|
62
|
+
* 获取页面大小
|
|
63
|
+
*/
|
|
64
|
+
getPageSize(): number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Light 文件管理器
|
|
68
|
+
* 负责 .light 文件的读写操作
|
|
69
|
+
*/
|
|
70
|
+
export declare class LightFileManager {
|
|
71
|
+
private readonly basePath;
|
|
72
|
+
private readonly dbName;
|
|
73
|
+
private readonly serializer;
|
|
74
|
+
private handle;
|
|
75
|
+
/**
|
|
76
|
+
* 创建文件管理器
|
|
77
|
+
* @param basePath 数据库基础路径
|
|
78
|
+
* @param dbName 数据库名称
|
|
79
|
+
* @param pageSize 页面大小
|
|
80
|
+
*/
|
|
81
|
+
constructor(basePath: string, dbName: string, pageSize?: number);
|
|
82
|
+
/**
|
|
83
|
+
* 获取 .light 文件路径
|
|
84
|
+
*/
|
|
85
|
+
getFilePath(): string;
|
|
86
|
+
/**
|
|
87
|
+
* 获取临时文件路径
|
|
88
|
+
*/
|
|
89
|
+
private getTempFilePath;
|
|
90
|
+
/**
|
|
91
|
+
* 打开文件
|
|
92
|
+
*/
|
|
93
|
+
open(): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* 关闭文件
|
|
96
|
+
*/
|
|
97
|
+
close(): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* 读取文件头部
|
|
100
|
+
*/
|
|
101
|
+
readHeader(): Promise<LightHeader | null>;
|
|
102
|
+
/**
|
|
103
|
+
* 写入文件头部
|
|
104
|
+
* @param header 头部数据
|
|
105
|
+
*/
|
|
106
|
+
writeHeader(header: LightHeader): Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* 读取指定页面
|
|
109
|
+
* @param pageId 页面ID
|
|
110
|
+
*/
|
|
111
|
+
readPage(pageId: number): Promise<Page | null>;
|
|
112
|
+
/**
|
|
113
|
+
* 写入指定页面
|
|
114
|
+
* @param page 页面数据
|
|
115
|
+
*/
|
|
116
|
+
writePage(page: Page): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* 加载所有页面
|
|
119
|
+
*/
|
|
120
|
+
loadAllPages(): Promise<PageMap>;
|
|
121
|
+
/**
|
|
122
|
+
* 加载所有记录到内存映射
|
|
123
|
+
*/
|
|
124
|
+
loadAllRecords(): Promise<RecordMap>;
|
|
125
|
+
/**
|
|
126
|
+
* 原子性写入完整快照
|
|
127
|
+
* 先写临时文件,再 rename 确保原子性
|
|
128
|
+
* @param pages 页面映射
|
|
129
|
+
* @param lastSnapshotLsn 上次快照的 LSN
|
|
130
|
+
*/
|
|
131
|
+
writeSnapshot(pages: PageMap, lastSnapshotLsn: bigint): Promise<void>;
|
|
132
|
+
/**
|
|
133
|
+
* 获取文件大小
|
|
134
|
+
*/
|
|
135
|
+
getFileSize(): Promise<number>;
|
|
136
|
+
/**
|
|
137
|
+
* 同步到磁盘
|
|
138
|
+
*/
|
|
139
|
+
sync(): Promise<void>;
|
|
140
|
+
/**
|
|
141
|
+
* 检查文件是否存在
|
|
142
|
+
*/
|
|
143
|
+
exists(): Promise<boolean>;
|
|
144
|
+
/**
|
|
145
|
+
* 获取页面大小
|
|
146
|
+
*/
|
|
147
|
+
getPageSize(): number;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* 页面管理器
|
|
151
|
+
* 管理内存中的页面分配和回收
|
|
152
|
+
*/
|
|
153
|
+
export declare class PageManager {
|
|
154
|
+
private readonly pageSize;
|
|
155
|
+
private pages;
|
|
156
|
+
private nextPageId;
|
|
157
|
+
private dirtyPages;
|
|
158
|
+
/**
|
|
159
|
+
* 创建页面管理器
|
|
160
|
+
* @param pageSize 页面大小
|
|
161
|
+
*/
|
|
162
|
+
constructor(pageSize?: number);
|
|
163
|
+
/**
|
|
164
|
+
* 创建新页面
|
|
165
|
+
*/
|
|
166
|
+
createPage(): Page;
|
|
167
|
+
/**
|
|
168
|
+
* 获取页面
|
|
169
|
+
* @param pageId 页面ID
|
|
170
|
+
*/
|
|
171
|
+
getPage(pageId: number): Page | undefined;
|
|
172
|
+
/**
|
|
173
|
+
* 获取或创建页面
|
|
174
|
+
* @param pageId 页面ID
|
|
175
|
+
*/
|
|
176
|
+
getOrCreatePage(pageId: number): Page;
|
|
177
|
+
/**
|
|
178
|
+
* 标记页面为脏页
|
|
179
|
+
* @param pageId 页面ID
|
|
180
|
+
*/
|
|
181
|
+
markDirty(pageId: number): void;
|
|
182
|
+
/**
|
|
183
|
+
* 获取所有脏页
|
|
184
|
+
*/
|
|
185
|
+
getDirtyPages(): Page[];
|
|
186
|
+
/**
|
|
187
|
+
* 清除脏页标记
|
|
188
|
+
*/
|
|
189
|
+
clearDirtyFlags(): void;
|
|
190
|
+
/**
|
|
191
|
+
* 加载页面数据
|
|
192
|
+
* @param pages 页面映射
|
|
193
|
+
*/
|
|
194
|
+
loadPages(pages: PageMap): void;
|
|
195
|
+
/**
|
|
196
|
+
* 获取所有页面
|
|
197
|
+
*/
|
|
198
|
+
getAllPages(): PageMap;
|
|
199
|
+
/**
|
|
200
|
+
* 获取页面数量
|
|
201
|
+
*/
|
|
202
|
+
getPageCount(): number;
|
|
203
|
+
/**
|
|
204
|
+
* 计算记录在页面中的大小
|
|
205
|
+
* @param record 记录
|
|
206
|
+
*/
|
|
207
|
+
calculateRecordSize(record: Record): number;
|
|
208
|
+
/**
|
|
209
|
+
* 获取页面可用空间
|
|
210
|
+
* @param page 页面
|
|
211
|
+
*/
|
|
212
|
+
getAvailableSpace(page: Page): number;
|
|
213
|
+
/**
|
|
214
|
+
* 查找可以容纳记录的页面
|
|
215
|
+
* @param record 记录
|
|
216
|
+
*/
|
|
217
|
+
findPageForRecord(record: Record): Page | null;
|
|
218
|
+
/**
|
|
219
|
+
* 获取下一个页面ID
|
|
220
|
+
*/
|
|
221
|
+
getNextPageId(): number;
|
|
222
|
+
/**
|
|
223
|
+
* 获取页面大小
|
|
224
|
+
*/
|
|
225
|
+
getPageSize(): number;
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=LightFile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LightFile.d.ts","sourceRoot":"","sources":["../../src/storage/LightFile.ts"],"names":[],"mappings":"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"}
|