@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,248 @@
1
+ /**
2
+ * WAL(预写日志)文件实现
3
+ * 记录每一次写操作的增量日志,用于崩溃恢复与异步持久化
4
+ */
5
+ import { WalRecord, WriteResult, BatchWriteResult, WalRecordIterator } from "../types";
6
+ /**
7
+ * WAL 记录序列化器
8
+ * 负责将 WAL 记录序列化为二进制格式
9
+ */
10
+ export declare class WalRecordSerializer {
11
+ /**
12
+ * 序列化 WAL 记录
13
+ * @param record WAL 记录
14
+ */
15
+ serialize(record: WalRecord): Buffer;
16
+ /**
17
+ * 反序列化 WAL 记录
18
+ * @param buffer 包含记录数据的 Buffer
19
+ * @param startOffset 起始偏移量
20
+ */
21
+ deserialize(
22
+ buffer: Buffer,
23
+ startOffset?: number,
24
+ ): {
25
+ record: WalRecord;
26
+ bytesRead: number;
27
+ } | null;
28
+ /**
29
+ * 计算记录大小
30
+ * @param key 键
31
+ * @param value 值(可选)
32
+ */
33
+ calculateRecordSize(key: string, value: Buffer | null): number;
34
+ }
35
+ /**
36
+ * WAL 文件写入器
37
+ * 负责将 WAL 记录追加写入文件
38
+ */
39
+ export declare class WalWriter {
40
+ private readonly filePath;
41
+ private handle;
42
+ private readonly serializer;
43
+ private currentOffset;
44
+ private pendingSync;
45
+ private readonly syncStrategy;
46
+ private readonly batchSize;
47
+ private writeCount;
48
+ /**
49
+ * 创建 WAL 写入器
50
+ * @param basePath 数据库基础路径
51
+ * @param dbName 数据库名称
52
+ * @param syncStrategy 同步策略
53
+ * @param batchSize 批量写入大小
54
+ */
55
+ constructor(basePath: string, dbName: string, syncStrategy?: "always" | "batch" | "interval", batchSize?: number);
56
+ /**
57
+ * 打开 WAL 文件
58
+ */
59
+ open(): Promise<void>;
60
+ /**
61
+ * 关闭 WAL 文件
62
+ */
63
+ close(): Promise<void>;
64
+ /**
65
+ * 写入单条 WAL 记录
66
+ * @param record WAL 记录
67
+ */
68
+ write(record: WalRecord): Promise<WriteResult>;
69
+ /**
70
+ * 批量写入 WAL 记录
71
+ * @param records WAL 记录数组
72
+ */
73
+ writeBatch(records: WalRecord[]): Promise<BatchWriteResult>;
74
+ /**
75
+ * 同步到磁盘
76
+ */
77
+ sync(): Promise<void>;
78
+ /**
79
+ * 获取当前文件大小
80
+ */
81
+ getFileSize(): Promise<number>;
82
+ /**
83
+ * 获取当前偏移量
84
+ */
85
+ getCurrentOffset(): number;
86
+ /**
87
+ * 清空 WAL 文件
88
+ */
89
+ clear(): Promise<void>;
90
+ /**
91
+ * 获取文件路径
92
+ */
93
+ getFilePath(): string;
94
+ }
95
+ /**
96
+ * WAL 文件读取器
97
+ * 负责顺序读取 WAL 记录
98
+ */
99
+ export declare class WalReader {
100
+ private readonly filePath;
101
+ private handle;
102
+ private readonly serializer;
103
+ private fileSize;
104
+ private currentOffset;
105
+ private readBufferSize;
106
+ private readBuffer;
107
+ private bufferValidBytes;
108
+ /**
109
+ * 创建 WAL 读取器
110
+ * @param basePath 数据库基础路径
111
+ * @param dbName 数据库名称
112
+ * @param readBufferSize 读取缓冲区大小,默认 64KB
113
+ */
114
+ constructor(basePath: string, dbName: string, readBufferSize?: number);
115
+ /**
116
+ * 打开 WAL 文件
117
+ */
118
+ open(): Promise<void>;
119
+ /**
120
+ * 关闭 WAL 文件
121
+ */
122
+ close(): Promise<void>;
123
+ /**
124
+ * 填充读取缓冲区
125
+ */
126
+ private fillBuffer;
127
+ /**
128
+ * 读取下一条 WAL 记录
129
+ */
130
+ readNext(): Promise<WalRecord | null>;
131
+ /**
132
+ * 创建 WAL 记录迭代器
133
+ */
134
+ iterate(): WalRecordIterator;
135
+ /**
136
+ * 从指定偏移量开始读取
137
+ * @param offset 起始偏移量
138
+ */
139
+ seek(offset: number): Promise<void>;
140
+ /**
141
+ * 获取当前偏移量
142
+ */
143
+ getCurrentOffset(): number;
144
+ /**
145
+ * 获取文件大小
146
+ */
147
+ getFileSize(): number;
148
+ /**
149
+ * 读取所有 WAL 记录
150
+ */
151
+ readAll(): Promise<WalRecord[]>;
152
+ /**
153
+ * 获取文件路径
154
+ */
155
+ getFilePath(): string;
156
+ }
157
+ /**
158
+ * WAL 管理器
159
+ * 提供统一的 WAL 读写接口
160
+ */
161
+ export declare class WalManager {
162
+ private readonly basePath;
163
+ private readonly dbName;
164
+ private writer;
165
+ private reader;
166
+ private currentLsn;
167
+ private currentTransactionId;
168
+ /**
169
+ * 创建 WAL 管理器
170
+ * @param basePath 数据库基础路径
171
+ * @param dbName 数据库名称
172
+ */
173
+ constructor(basePath: string, dbName: string);
174
+ /**
175
+ * 初始化 WAL 管理器
176
+ */
177
+ initialize(): Promise<void>;
178
+ /**
179
+ * 获取最后一条记录的 LSN
180
+ */
181
+ getLastLsn(): Promise<bigint>;
182
+ /**
183
+ * 分配新的 LSN
184
+ */
185
+ allocateLsn(): bigint;
186
+ /**
187
+ * 分配新的事务 ID
188
+ */
189
+ allocateTransactionId(): bigint;
190
+ /**
191
+ * 写入插入记录
192
+ * @param key 键
193
+ * @param value 值
194
+ */
195
+ writeInsert(key: string, value: Buffer): Promise<WriteResult>;
196
+ /**
197
+ * 写入更新记录
198
+ * @param key 键
199
+ * @param value 新值
200
+ */
201
+ writeUpdate(key: string, value: Buffer): Promise<WriteResult>;
202
+ /**
203
+ * 写入删除记录
204
+ * @param key 键
205
+ */
206
+ writeDelete(key: string): Promise<WriteResult>;
207
+ /**
208
+ * 写入检查点标记
209
+ */
210
+ writeCheckpoint(): Promise<WriteResult>;
211
+ /**
212
+ * 同步 WAL 到磁盘
213
+ */
214
+ sync(): Promise<void>;
215
+ /**
216
+ * 清空 WAL 文件
217
+ */
218
+ clear(): Promise<void>;
219
+ /**
220
+ * 获取 WAL 文件大小
221
+ */
222
+ getFileSize(): Promise<number>;
223
+ /**
224
+ * 创建记录迭代器
225
+ */
226
+ iterateRecords(): WalRecordIterator;
227
+ /**
228
+ * 读取所有记录
229
+ */
230
+ readAllRecords(): Promise<WalRecord[]>;
231
+ /**
232
+ * 关闭 WAL 管理器
233
+ */
234
+ close(): Promise<void>;
235
+ /**
236
+ * 获取当前 LSN
237
+ */
238
+ getCurrentLsn(): bigint;
239
+ /**
240
+ * 获取当前事务 ID
241
+ */
242
+ getCurrentTransactionId(): bigint;
243
+ /**
244
+ * 设置当前 LSN(用于恢复)
245
+ */
246
+ setCurrentLsn(lsn: bigint): void;
247
+ }
248
+ //# sourceMappingURL=WALFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WALFile.d.ts","sourceRoot":"","sources":["../../src/storage/WALFile.ts"],"names":[],"mappings":"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"}