@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,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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"}
|