@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,146 @@
1
+ /**
2
+ * 存储引擎核心模块
3
+ * 整合所有存储组件,提供统一的 API
4
+ */
5
+ import { StorageEngineOptions, WriteResult, BatchWriteResult, CheckpointResult, RecoveryResult, StorageStats, RecordMap } from "../types";
6
+ /**
7
+ * 存储引擎
8
+ * LightDB 的核心存储层,提供完整的数据持久化能力
9
+ */
10
+ export declare class StorageEngine {
11
+ private readonly basePath;
12
+ private readonly dbName;
13
+ private readonly options;
14
+ private lightFileManager;
15
+ private walManager;
16
+ private walIndexManager;
17
+ private pageManager;
18
+ private checkpointManager;
19
+ private autoCheckpointScheduler;
20
+ private records;
21
+ private initialized;
22
+ private closed;
23
+ /**
24
+ * 创建存储引擎实例
25
+ * @param basePath 数据库基础路径
26
+ * @param dbName 数据库名称
27
+ * @param options 配置选项
28
+ */
29
+ constructor(basePath: string, dbName: string, options?: StorageEngineOptions);
30
+ /**
31
+ * 初始化存储引擎
32
+ * 创建必要的目录和文件,执行恢复流程
33
+ */
34
+ initialize(): Promise<RecoveryResult>;
35
+ /**
36
+ * 启动自动检查点
37
+ */
38
+ private startAutoCheckpoint;
39
+ /**
40
+ * 停止自动检查点
41
+ */
42
+ private stopAutoCheckpoint;
43
+ /**
44
+ * 确保引擎已初始化
45
+ */
46
+ private ensureInitialized;
47
+ /**
48
+ * 插入记录
49
+ * @param key 键
50
+ * @param value 值
51
+ */
52
+ insert(key: string, value: Buffer): Promise<WriteResult>;
53
+ /**
54
+ * 更新记录
55
+ * @param key 键
56
+ * @param value 新值
57
+ */
58
+ update(key: string, value: Buffer): Promise<WriteResult>;
59
+ /**
60
+ * 插入或更新记录
61
+ * @param key 键
62
+ * @param value 值
63
+ */
64
+ upsert(key: string, value: Buffer): Promise<WriteResult>;
65
+ /**
66
+ * 删除记录
67
+ * @param key 键
68
+ */
69
+ delete(key: string): Promise<WriteResult>;
70
+ /**
71
+ * 读取记录
72
+ * @param key 键
73
+ */
74
+ get(key: string): Promise<Buffer | null>;
75
+ /**
76
+ * 检查记录是否存在
77
+ * @param key 键
78
+ */
79
+ exists(key: string): Promise<boolean>;
80
+ /**
81
+ * 批量插入
82
+ * @param entries 键值对数组
83
+ */
84
+ insertBatch(
85
+ entries: Array<{
86
+ key: string;
87
+ value: Buffer;
88
+ }>,
89
+ ): Promise<BatchWriteResult>;
90
+ /**
91
+ * 执行检查点
92
+ */
93
+ checkpoint(): Promise<CheckpointResult>;
94
+ /**
95
+ * 获取所有键
96
+ */
97
+ getAllKeys(): Promise<string[]>;
98
+ /**
99
+ * 获取所有记录
100
+ */
101
+ getAllRecords(): Promise<RecordMap>;
102
+ /**
103
+ * 获取记录数量
104
+ */
105
+ getRecordCount(): Promise<number>;
106
+ /**
107
+ * 获取存储统计信息
108
+ */
109
+ getStats(): Promise<StorageStats>;
110
+ /**
111
+ * 同步数据到磁盘
112
+ */
113
+ sync(): Promise<void>;
114
+ /**
115
+ * 关闭存储引擎
116
+ */
117
+ close(): Promise<void>;
118
+ /**
119
+ * 检查是否已初始化
120
+ */
121
+ isInitialized(): boolean;
122
+ /**
123
+ * 检查是否已关闭
124
+ */
125
+ isClosed(): boolean;
126
+ /**
127
+ * 获取基础路径
128
+ */
129
+ getBasePath(): string;
130
+ /**
131
+ * 获取数据库名称
132
+ */
133
+ getDbName(): string;
134
+ /**
135
+ * 获取页面大小
136
+ */
137
+ getPageSize(): number;
138
+ }
139
+ /**
140
+ * 创建存储引擎实例的工厂函数
141
+ * @param basePath 数据库基础路径
142
+ * @param dbName 数据库名称
143
+ * @param options 配置选项
144
+ */
145
+ export declare function createStorageEngine(basePath: string, dbName: string, options?: StorageEngineOptions): Promise<StorageEngine>;
146
+ //# sourceMappingURL=StorageEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageEngine.d.ts","sourceRoot":"","sources":["../../src/storage/StorageEngine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAS1I;;;GAGG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IAEzD,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,uBAAuB,CAAwC;IAEvE,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,MAAM,CAAU;IAExB;;;;;OAKG;gBACS,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB;IAehF;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC;IAsDlD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;;;OAIG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAgBrE;;;;OAIG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAgBrE;;;;OAIG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAarE;;;OAGG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAgBtD;;;OAGG;IACU,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKrD;;;OAGG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlD;;;OAGG;IACU,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuCnG;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAKpD;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAK5C;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC;IAKhD;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAK9C;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAc9C;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMlC;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BnC;;OAEG;IACI,aAAa,IAAI,OAAO;IAI/B;;OAEG;IACI,QAAQ,IAAI,OAAO;IAI1B;;OAEG;IACI,WAAW,IAAI,MAAM;IAI5B;;OAEG;IACI,SAAS,IAAI,MAAM;IAI1B;;OAEG;IACI,WAAW,IAAI,MAAM;CAG/B;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,aAAa,CAAC,CAItI"}
@@ -0,0 +1,353 @@
1
+ "use strict";
2
+ /**
3
+ * 存储引擎核心模块
4
+ * 整合所有存储组件,提供统一的 API
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.StorageEngine = void 0;
8
+ exports.createStorageEngine = createStorageEngine;
9
+ const constants_1 = require("../constants");
10
+ const utils_1 = require("../utils");
11
+ const LightFile_1 = require("./LightFile");
12
+ const WALFile_1 = require("./WALFile");
13
+ const SHMFile_1 = require("./SHMFile");
14
+ const Checkpoint_1 = require("./Checkpoint");
15
+ const Recovery_1 = require("./Recovery");
16
+ const errors_1 = require("../errors");
17
+ /**
18
+ * 存储引擎
19
+ * LightDB 的核心存储层,提供完整的数据持久化能力
20
+ */
21
+ class StorageEngine {
22
+ /**
23
+ * 创建存储引擎实例
24
+ * @param basePath 数据库基础路径
25
+ * @param dbName 数据库名称
26
+ * @param options 配置选项
27
+ */
28
+ constructor(basePath, dbName, options = {}) {
29
+ this.lightFileManager = null;
30
+ this.walManager = null;
31
+ this.walIndexManager = null;
32
+ this.pageManager = null;
33
+ this.checkpointManager = null;
34
+ this.autoCheckpointScheduler = null;
35
+ this.basePath = basePath;
36
+ this.dbName = dbName;
37
+ this.options = {
38
+ pageSize: options.pageSize ?? constants_1.DEFAULT_PAGE_SIZE,
39
+ walThreshold: options.walThreshold ?? constants_1.DEFAULT_WAL_THRESHOLD,
40
+ autoCheckpoint: options.autoCheckpoint ?? true,
41
+ fsyncStrategy: options.fsyncStrategy ?? { type: "always" },
42
+ };
43
+ this.records = new Map();
44
+ this.initialized = false;
45
+ this.closed = false;
46
+ }
47
+ /**
48
+ * 初始化存储引擎
49
+ * 创建必要的目录和文件,执行恢复流程
50
+ */
51
+ async initialize() {
52
+ if (this.initialized) {
53
+ return {
54
+ success: true,
55
+ recordsReplayed: 0,
56
+ pagesLoaded: 0,
57
+ durationMs: 0,
58
+ };
59
+ }
60
+ await utils_1.FileUtils.ensureDir(this.basePath);
61
+ this.lightFileManager = new LightFile_1.LightFileManager(this.basePath, this.dbName, this.options.pageSize);
62
+ this.walManager = new WALFile_1.WalManager(this.basePath, this.dbName);
63
+ await this.walManager.initialize();
64
+ this.walIndexManager = new SHMFile_1.WalIndexManager(this.basePath, this.dbName);
65
+ await this.walIndexManager.initialize();
66
+ this.pageManager = new LightFile_1.PageManager(this.options.pageSize);
67
+ this.checkpointManager = new Checkpoint_1.CheckpointManager(
68
+ this.lightFileManager,
69
+ this.walManager,
70
+ this.walIndexManager,
71
+ this.pageManager,
72
+ this.options.walThreshold,
73
+ );
74
+ const recoveryManager = new Recovery_1.RecoveryManager(
75
+ this.basePath,
76
+ this.dbName,
77
+ this.lightFileManager,
78
+ this.walManager,
79
+ this.walIndexManager,
80
+ this.pageManager,
81
+ );
82
+ const recoveryResult = await recoveryManager.recover();
83
+ if (recoveryResult.success) {
84
+ const recoveredRecords = await recoveryManager.getRecoveredRecords();
85
+ this.records = recoveredRecords;
86
+ this.initialized = true;
87
+ if (this.options.autoCheckpoint) {
88
+ this.startAutoCheckpoint();
89
+ }
90
+ }
91
+ return recoveryResult;
92
+ }
93
+ /**
94
+ * 启动自动检查点
95
+ */
96
+ startAutoCheckpoint() {
97
+ if (this.autoCheckpointScheduler) {
98
+ return;
99
+ }
100
+ this.autoCheckpointScheduler = new Checkpoint_1.AutoCheckpointScheduler(this.checkpointManager, 5000, () => this.records);
101
+ this.autoCheckpointScheduler.start();
102
+ }
103
+ /**
104
+ * 停止自动检查点
105
+ */
106
+ stopAutoCheckpoint() {
107
+ if (this.autoCheckpointScheduler) {
108
+ this.autoCheckpointScheduler.stop();
109
+ this.autoCheckpointScheduler = null;
110
+ }
111
+ }
112
+ /**
113
+ * 确保引擎已初始化
114
+ */
115
+ ensureInitialized() {
116
+ if (!this.initialized) {
117
+ throw new errors_1.StorageError("Storage engine not initialized", "NOT_INITIALIZED");
118
+ }
119
+ if (this.closed) {
120
+ throw new errors_1.StorageError("Storage engine is closed", "ENGINE_CLOSED");
121
+ }
122
+ }
123
+ /**
124
+ * 插入记录
125
+ * @param key 键
126
+ * @param value 值
127
+ */
128
+ async insert(key, value) {
129
+ this.ensureInitialized();
130
+ if (this.records.has(key)) {
131
+ throw new errors_1.StorageError(`Key already exists: ${key}`, "KEY_EXISTS");
132
+ }
133
+ const result = await this.walManager.writeInsert(key, value);
134
+ if (result.success) {
135
+ this.records.set(key, value);
136
+ }
137
+ return result;
138
+ }
139
+ /**
140
+ * 更新记录
141
+ * @param key 键
142
+ * @param value 新值
143
+ */
144
+ async update(key, value) {
145
+ this.ensureInitialized();
146
+ if (!this.records.has(key)) {
147
+ throw new errors_1.StorageError(`Key not found: ${key}`, "KEY_NOT_FOUND");
148
+ }
149
+ const result = await this.walManager.writeUpdate(key, value);
150
+ if (result.success) {
151
+ this.records.set(key, value);
152
+ }
153
+ return result;
154
+ }
155
+ /**
156
+ * 插入或更新记录
157
+ * @param key 键
158
+ * @param value 值
159
+ */
160
+ async upsert(key, value) {
161
+ this.ensureInitialized();
162
+ const exists = this.records.has(key);
163
+ const result = exists ? await this.walManager.writeUpdate(key, value) : await this.walManager.writeInsert(key, value);
164
+ if (result.success) {
165
+ this.records.set(key, value);
166
+ }
167
+ return result;
168
+ }
169
+ /**
170
+ * 删除记录
171
+ * @param key 键
172
+ */
173
+ async delete(key) {
174
+ this.ensureInitialized();
175
+ if (!this.records.has(key)) {
176
+ throw new errors_1.StorageError(`Key not found: ${key}`, "KEY_NOT_FOUND");
177
+ }
178
+ const result = await this.walManager.writeDelete(key);
179
+ if (result.success) {
180
+ this.records.delete(key);
181
+ }
182
+ return result;
183
+ }
184
+ /**
185
+ * 读取记录
186
+ * @param key 键
187
+ */
188
+ async get(key) {
189
+ this.ensureInitialized();
190
+ return this.records.get(key) ?? null;
191
+ }
192
+ /**
193
+ * 检查记录是否存在
194
+ * @param key 键
195
+ */
196
+ async exists(key) {
197
+ this.ensureInitialized();
198
+ return this.records.has(key);
199
+ }
200
+ /**
201
+ * 批量插入
202
+ * @param entries 键值对数组
203
+ */
204
+ async insertBatch(entries) {
205
+ this.ensureInitialized();
206
+ for (const { key } of entries) {
207
+ if (this.records.has(key)) {
208
+ throw new errors_1.StorageError(`Key already exists: ${key}`, "KEY_EXISTS");
209
+ }
210
+ }
211
+ const results = [];
212
+ let startLsn = 0n;
213
+ let endLsn = 0n;
214
+ let totalBytes = 0;
215
+ for (let i = 0; i < entries.length; i++) {
216
+ const { key, value } = entries[i];
217
+ const result = await this.walManager.writeInsert(key, value);
218
+ results.push(result);
219
+ if (i === 0) {
220
+ startLsn = result.lsn;
221
+ }
222
+ endLsn = result.lsn;
223
+ totalBytes += result.bytesWritten;
224
+ if (result.success) {
225
+ this.records.set(key, value);
226
+ }
227
+ }
228
+ return {
229
+ success: results.every((r) => r.success),
230
+ startLsn,
231
+ endLsn,
232
+ totalBytesWritten: totalBytes,
233
+ recordsWritten: results.length,
234
+ };
235
+ }
236
+ /**
237
+ * 执行检查点
238
+ */
239
+ async checkpoint() {
240
+ this.ensureInitialized();
241
+ return this.checkpointManager.execute(this.records);
242
+ }
243
+ /**
244
+ * 获取所有键
245
+ */
246
+ async getAllKeys() {
247
+ this.ensureInitialized();
248
+ return Array.from(this.records.keys());
249
+ }
250
+ /**
251
+ * 获取所有记录
252
+ */
253
+ async getAllRecords() {
254
+ this.ensureInitialized();
255
+ return new Map(this.records);
256
+ }
257
+ /**
258
+ * 获取记录数量
259
+ */
260
+ async getRecordCount() {
261
+ this.ensureInitialized();
262
+ return this.records.size;
263
+ }
264
+ /**
265
+ * 获取存储统计信息
266
+ */
267
+ async getStats() {
268
+ this.ensureInitialized();
269
+ return {
270
+ currentLsn: this.walManager.getCurrentLsn(),
271
+ currentTransactionId: this.walManager.getCurrentTransactionId(),
272
+ walFileSize: await this.walManager.getFileSize(),
273
+ lightFileSize: await this.lightFileManager.getFileSize(),
274
+ pageCount: this.pageManager.getPageCount(),
275
+ recordCount: this.records.size,
276
+ lastCheckpointTime: this.checkpointManager.getLastCheckpointTime(),
277
+ };
278
+ }
279
+ /**
280
+ * 同步数据到磁盘
281
+ */
282
+ async sync() {
283
+ this.ensureInitialized();
284
+ await this.walManager.sync();
285
+ await this.walIndexManager.sync();
286
+ }
287
+ /**
288
+ * 关闭存储引擎
289
+ */
290
+ async close() {
291
+ if (this.closed) {
292
+ return;
293
+ }
294
+ this.stopAutoCheckpoint();
295
+ if (this.initialized) {
296
+ await this.sync();
297
+ if (this.walManager) {
298
+ await this.walManager.close();
299
+ }
300
+ if (this.walIndexManager) {
301
+ await this.walIndexManager.close();
302
+ }
303
+ if (this.lightFileManager) {
304
+ await this.lightFileManager.close();
305
+ }
306
+ }
307
+ this.closed = true;
308
+ this.initialized = false;
309
+ }
310
+ /**
311
+ * 检查是否已初始化
312
+ */
313
+ isInitialized() {
314
+ return this.initialized;
315
+ }
316
+ /**
317
+ * 检查是否已关闭
318
+ */
319
+ isClosed() {
320
+ return this.closed;
321
+ }
322
+ /**
323
+ * 获取基础路径
324
+ */
325
+ getBasePath() {
326
+ return this.basePath;
327
+ }
328
+ /**
329
+ * 获取数据库名称
330
+ */
331
+ getDbName() {
332
+ return this.dbName;
333
+ }
334
+ /**
335
+ * 获取页面大小
336
+ */
337
+ getPageSize() {
338
+ return this.options.pageSize;
339
+ }
340
+ }
341
+ exports.StorageEngine = StorageEngine;
342
+ /**
343
+ * 创建存储引擎实例的工厂函数
344
+ * @param basePath 数据库基础路径
345
+ * @param dbName 数据库名称
346
+ * @param options 配置选项
347
+ */
348
+ async function createStorageEngine(basePath, dbName, options = {}) {
349
+ const engine = new StorageEngine(basePath, dbName, options);
350
+ await engine.initialize();
351
+ return engine;
352
+ }
353
+ //# sourceMappingURL=StorageEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageEngine.js","sourceRoot":"","sources":["../../src/storage/StorageEngine.ts"],"names":[],"mappings":"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"}