@lix-js/sdk 0.6.0-preview.1 → 0.6.0-preview.2

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 (191) hide show
  1. package/SKILL.md +305 -320
  2. package/dist/engine-wasm/wasm/lix_engine.d.ts +5 -0
  3. package/dist/engine-wasm/wasm/lix_engine.js +9 -13
  4. package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
  5. package/dist/engine-wasm/wasm/lix_engine.wasm.d.ts +1 -0
  6. package/dist/open-lix.d.ts +103 -14
  7. package/dist/open-lix.js +3 -0
  8. package/dist/sqlite/index.js +99 -22
  9. package/dist-engine-src/README.md +18 -0
  10. package/dist-engine-src/src/backend/kv.rs +358 -0
  11. package/dist-engine-src/src/backend/mod.rs +12 -0
  12. package/dist-engine-src/src/backend/testing.rs +658 -0
  13. package/dist-engine-src/src/backend/types.rs +96 -0
  14. package/dist-engine-src/src/binary_cas/chunking.rs +31 -0
  15. package/dist-engine-src/src/binary_cas/codec.rs +346 -0
  16. package/dist-engine-src/src/binary_cas/context.rs +139 -0
  17. package/dist-engine-src/src/binary_cas/kv.rs +1063 -0
  18. package/dist-engine-src/src/binary_cas/mod.rs +11 -0
  19. package/dist-engine-src/src/binary_cas/types.rs +127 -0
  20. package/dist-engine-src/src/cel/context.rs +86 -0
  21. package/dist-engine-src/src/cel/error.rs +19 -0
  22. package/dist-engine-src/src/cel/mod.rs +8 -0
  23. package/dist-engine-src/src/cel/provider.rs +9 -0
  24. package/dist-engine-src/src/cel/runtime.rs +167 -0
  25. package/dist-engine-src/src/cel/value.rs +50 -0
  26. package/dist-engine-src/src/changelog/codec.rs +321 -0
  27. package/dist-engine-src/src/changelog/context.rs +92 -0
  28. package/dist-engine-src/src/changelog/materialization.rs +121 -0
  29. package/dist-engine-src/src/changelog/mod.rs +13 -0
  30. package/dist-engine-src/src/changelog/reader.rs +20 -0
  31. package/dist-engine-src/src/changelog/storage.rs +220 -0
  32. package/dist-engine-src/src/changelog/types.rs +38 -0
  33. package/dist-engine-src/src/commit_graph/context.rs +1588 -0
  34. package/dist-engine-src/src/commit_graph/mod.rs +12 -0
  35. package/dist-engine-src/src/commit_graph/types.rs +145 -0
  36. package/dist-engine-src/src/commit_graph/walker.rs +780 -0
  37. package/dist-engine-src/src/common/error.rs +313 -0
  38. package/dist-engine-src/src/common/fingerprint.rs +3 -0
  39. package/dist-engine-src/src/common/fs_path.rs +1336 -0
  40. package/dist-engine-src/src/common/identity.rs +135 -0
  41. package/dist-engine-src/src/common/metadata.rs +35 -0
  42. package/dist-engine-src/src/common/mod.rs +23 -0
  43. package/dist-engine-src/src/common/types.rs +105 -0
  44. package/dist-engine-src/src/common/wire.rs +222 -0
  45. package/dist-engine-src/src/engine.rs +239 -0
  46. package/dist-engine-src/src/entity_identity.rs +285 -0
  47. package/dist-engine-src/src/functions/context.rs +327 -0
  48. package/dist-engine-src/src/functions/deterministic.rs +113 -0
  49. package/dist-engine-src/src/functions/mod.rs +18 -0
  50. package/dist-engine-src/src/functions/provider.rs +130 -0
  51. package/dist-engine-src/src/functions/state.rs +363 -0
  52. package/dist-engine-src/src/functions/types.rs +37 -0
  53. package/dist-engine-src/src/init.rs +505 -0
  54. package/dist-engine-src/src/json_store/compression.rs +77 -0
  55. package/dist-engine-src/src/json_store/context.rs +129 -0
  56. package/dist-engine-src/src/json_store/encoded.rs +15 -0
  57. package/dist-engine-src/src/json_store/mod.rs +9 -0
  58. package/dist-engine-src/src/json_store/store.rs +236 -0
  59. package/dist-engine-src/src/json_store/types.rs +52 -0
  60. package/dist-engine-src/src/lib.rs +61 -0
  61. package/dist-engine-src/src/live_state/context.rs +2241 -0
  62. package/dist-engine-src/src/live_state/mod.rs +15 -0
  63. package/dist-engine-src/src/live_state/overlay.rs +75 -0
  64. package/dist-engine-src/src/live_state/reader.rs +23 -0
  65. package/dist-engine-src/src/live_state/types.rs +239 -0
  66. package/dist-engine-src/src/live_state/visibility.rs +218 -0
  67. package/dist-engine-src/src/plugin/archive.rs +441 -0
  68. package/dist-engine-src/src/plugin/component.rs +183 -0
  69. package/dist-engine-src/src/plugin/install.rs +637 -0
  70. package/dist-engine-src/src/plugin/manifest.rs +516 -0
  71. package/dist-engine-src/src/plugin/materializer.rs +477 -0
  72. package/dist-engine-src/src/plugin/mod.rs +33 -0
  73. package/dist-engine-src/src/plugin/plugin_manifest.json +119 -0
  74. package/dist-engine-src/src/plugin/storage.rs +74 -0
  75. package/dist-engine-src/src/schema/annotations/defaults.rs +280 -0
  76. package/dist-engine-src/src/schema/annotations/mod.rs +1 -0
  77. package/dist-engine-src/src/schema/builtin/lix_account.json +22 -0
  78. package/dist-engine-src/src/schema/builtin/lix_active_account.json +30 -0
  79. package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +30 -0
  80. package/dist-engine-src/src/schema/builtin/lix_change.json +62 -0
  81. package/dist-engine-src/src/schema/builtin/lix_change_author.json +46 -0
  82. package/dist-engine-src/src/schema/builtin/lix_change_set.json +18 -0
  83. package/dist-engine-src/src/schema/builtin/lix_change_set_element.json +75 -0
  84. package/dist-engine-src/src/schema/builtin/lix_commit.json +62 -0
  85. package/dist-engine-src/src/schema/builtin/lix_commit_edge.json +46 -0
  86. package/dist-engine-src/src/schema/builtin/lix_directory_descriptor.json +53 -0
  87. package/dist-engine-src/src/schema/builtin/lix_entity_label.json +63 -0
  88. package/dist-engine-src/src/schema/builtin/lix_file_descriptor.json +53 -0
  89. package/dist-engine-src/src/schema/builtin/lix_key_value.json +41 -0
  90. package/dist-engine-src/src/schema/builtin/lix_label.json +22 -0
  91. package/dist-engine-src/src/schema/builtin/lix_registered_schema.json +31 -0
  92. package/dist-engine-src/src/schema/builtin/lix_version_descriptor.json +35 -0
  93. package/dist-engine-src/src/schema/builtin/lix_version_ref.json +49 -0
  94. package/dist-engine-src/src/schema/builtin/mod.rs +271 -0
  95. package/dist-engine-src/src/schema/definition.json +157 -0
  96. package/dist-engine-src/src/schema/definition.rs +636 -0
  97. package/dist-engine-src/src/schema/key.rs +206 -0
  98. package/dist-engine-src/src/schema/mod.rs +20 -0
  99. package/dist-engine-src/src/schema/seed.rs +14 -0
  100. package/dist-engine-src/src/schema/tests.rs +739 -0
  101. package/dist-engine-src/src/schema_registry.rs +294 -0
  102. package/dist-engine-src/src/session/context.rs +366 -0
  103. package/dist-engine-src/src/session/create_version.rs +80 -0
  104. package/dist-engine-src/src/session/execute.rs +447 -0
  105. package/dist-engine-src/src/session/merge/analysis.rs +102 -0
  106. package/dist-engine-src/src/session/merge/apply.rs +23 -0
  107. package/dist-engine-src/src/session/merge/conflicts.rs +62 -0
  108. package/dist-engine-src/src/session/merge/mod.rs +11 -0
  109. package/dist-engine-src/src/session/merge/stats.rs +65 -0
  110. package/dist-engine-src/src/session/merge/version.rs +437 -0
  111. package/dist-engine-src/src/session/mod.rs +25 -0
  112. package/dist-engine-src/src/session/switch_version.rs +121 -0
  113. package/dist-engine-src/src/sql2/change_provider.rs +337 -0
  114. package/dist-engine-src/src/sql2/classify.rs +147 -0
  115. package/dist-engine-src/src/sql2/commit_derived_provider.rs +591 -0
  116. package/dist-engine-src/src/sql2/context.rs +307 -0
  117. package/dist-engine-src/src/sql2/directory_history_provider.rs +623 -0
  118. package/dist-engine-src/src/sql2/directory_provider.rs +2405 -0
  119. package/dist-engine-src/src/sql2/dml.rs +148 -0
  120. package/dist-engine-src/src/sql2/entity_history_provider.rs +444 -0
  121. package/dist-engine-src/src/sql2/entity_provider.rs +2700 -0
  122. package/dist-engine-src/src/sql2/error.rs +196 -0
  123. package/dist-engine-src/src/sql2/execute.rs +3379 -0
  124. package/dist-engine-src/src/sql2/file_history_provider.rs +902 -0
  125. package/dist-engine-src/src/sql2/file_provider.rs +3254 -0
  126. package/dist-engine-src/src/sql2/filesystem_planner.rs +1526 -0
  127. package/dist-engine-src/src/sql2/filesystem_predicates.rs +159 -0
  128. package/dist-engine-src/src/sql2/filesystem_visibility.rs +369 -0
  129. package/dist-engine-src/src/sql2/history_projection.rs +80 -0
  130. package/dist-engine-src/src/sql2/history_provider.rs +418 -0
  131. package/dist-engine-src/src/sql2/history_route.rs +643 -0
  132. package/dist-engine-src/src/sql2/lix_state_provider.rs +2430 -0
  133. package/dist-engine-src/src/sql2/mod.rs +43 -0
  134. package/dist-engine-src/src/sql2/read_only.rs +65 -0
  135. package/dist-engine-src/src/sql2/record_batch.rs +17 -0
  136. package/dist-engine-src/src/sql2/result_metadata.rs +29 -0
  137. package/dist-engine-src/src/sql2/runtime.rs +60 -0
  138. package/dist-engine-src/src/sql2/session.rs +135 -0
  139. package/dist-engine-src/src/sql2/udfs/common.rs +295 -0
  140. package/dist-engine-src/src/sql2/udfs/lix_active_version_commit_id.rs +53 -0
  141. package/dist-engine-src/src/sql2/udfs/lix_empty_blob.rs +47 -0
  142. package/dist-engine-src/src/sql2/udfs/lix_json.rs +100 -0
  143. package/dist-engine-src/src/sql2/udfs/lix_json_get.rs +99 -0
  144. package/dist-engine-src/src/sql2/udfs/lix_json_get_text.rs +99 -0
  145. package/dist-engine-src/src/sql2/udfs/lix_text_decode.rs +82 -0
  146. package/dist-engine-src/src/sql2/udfs/lix_text_encode.rs +85 -0
  147. package/dist-engine-src/src/sql2/udfs/lix_uuid_v7.rs +76 -0
  148. package/dist-engine-src/src/sql2/udfs/mod.rs +82 -0
  149. package/dist-engine-src/src/sql2/version_provider.rs +1187 -0
  150. package/dist-engine-src/src/sql2/version_scope.rs +394 -0
  151. package/dist-engine-src/src/sql2/write_normalization.rs +345 -0
  152. package/dist-engine-src/src/storage/context.rs +356 -0
  153. package/dist-engine-src/src/storage/mod.rs +14 -0
  154. package/dist-engine-src/src/storage/read_scope.rs +88 -0
  155. package/dist-engine-src/src/storage/types.rs +501 -0
  156. package/dist-engine-src/src/storage_bench.rs +3406 -0
  157. package/dist-engine-src/src/test_support.rs +81 -0
  158. package/dist-engine-src/src/tracked_state/by_file_index.rs +102 -0
  159. package/dist-engine-src/src/tracked_state/codec.rs +747 -0
  160. package/dist-engine-src/src/tracked_state/context.rs +983 -0
  161. package/dist-engine-src/src/tracked_state/diff.rs +494 -0
  162. package/dist-engine-src/src/tracked_state/materialization.rs +141 -0
  163. package/dist-engine-src/src/tracked_state/merge.rs +474 -0
  164. package/dist-engine-src/src/tracked_state/mod.rs +31 -0
  165. package/dist-engine-src/src/tracked_state/rebuild.rs +771 -0
  166. package/dist-engine-src/src/tracked_state/storage.rs +243 -0
  167. package/dist-engine-src/src/tracked_state/tree.rs +2744 -0
  168. package/dist-engine-src/src/tracked_state/tree_types.rs +176 -0
  169. package/dist-engine-src/src/tracked_state/types.rs +61 -0
  170. package/dist-engine-src/src/transaction/commit.rs +1224 -0
  171. package/dist-engine-src/src/transaction/context.rs +1307 -0
  172. package/dist-engine-src/src/transaction/live_state_overlay.rs +34 -0
  173. package/dist-engine-src/src/transaction/mod.rs +11 -0
  174. package/dist-engine-src/src/transaction/normalization.rs +1026 -0
  175. package/dist-engine-src/src/transaction/schema_resolver.rs +127 -0
  176. package/dist-engine-src/src/transaction/staging.rs +1436 -0
  177. package/dist-engine-src/src/transaction/types.rs +351 -0
  178. package/dist-engine-src/src/transaction/validation.rs +4811 -0
  179. package/dist-engine-src/src/untracked_state/codec.rs +363 -0
  180. package/dist-engine-src/src/untracked_state/context.rs +82 -0
  181. package/dist-engine-src/src/untracked_state/materialization.rs +157 -0
  182. package/dist-engine-src/src/untracked_state/mod.rs +17 -0
  183. package/dist-engine-src/src/untracked_state/storage.rs +348 -0
  184. package/dist-engine-src/src/untracked_state/types.rs +96 -0
  185. package/dist-engine-src/src/version/context.rs +52 -0
  186. package/dist-engine-src/src/version/mod.rs +12 -0
  187. package/dist-engine-src/src/version/refs.rs +421 -0
  188. package/dist-engine-src/src/version/stage_rows.rs +71 -0
  189. package/dist-engine-src/src/version/types.rs +21 -0
  190. package/dist-engine-src/src/wasm/mod.rs +60 -0
  191. package/package.json +68 -64
@@ -0,0 +1,358 @@
1
+ #[derive(Debug, Clone, PartialEq, Eq, Default)]
2
+ pub struct BytePage {
3
+ bytes: Vec<u8>,
4
+ offsets: Vec<u32>,
5
+ }
6
+
7
+ impl BytePage {
8
+ pub fn new() -> Self {
9
+ Self {
10
+ bytes: Vec::new(),
11
+ offsets: vec![0],
12
+ }
13
+ }
14
+
15
+ pub fn len(&self) -> usize {
16
+ self.offsets.len().saturating_sub(1)
17
+ }
18
+
19
+ pub fn is_empty(&self) -> bool {
20
+ self.len() == 0
21
+ }
22
+
23
+ pub fn get(&self, index: usize) -> Option<&[u8]> {
24
+ let start = usize::try_from(*self.offsets.get(index)?).ok()?;
25
+ let end = usize::try_from(*self.offsets.get(index + 1)?).ok()?;
26
+ self.bytes.get(start..end)
27
+ }
28
+
29
+ pub fn iter(&self) -> BytePageIter<'_> {
30
+ BytePageIter {
31
+ page: self,
32
+ index: 0,
33
+ }
34
+ }
35
+ }
36
+
37
+ pub struct BytePageIter<'a> {
38
+ page: &'a BytePage,
39
+ index: usize,
40
+ }
41
+
42
+ impl<'a> Iterator for BytePageIter<'a> {
43
+ type Item = &'a [u8];
44
+
45
+ fn next(&mut self) -> Option<Self::Item> {
46
+ let value = self.page.get(self.index)?;
47
+ self.index += 1;
48
+ Some(value)
49
+ }
50
+ }
51
+
52
+ #[derive(Debug, Clone, PartialEq, Eq, Default)]
53
+ pub struct BytePageBuilder {
54
+ bytes: Vec<u8>,
55
+ offsets: Vec<u32>,
56
+ }
57
+
58
+ impl BytePageBuilder {
59
+ pub fn new() -> Self {
60
+ Self {
61
+ bytes: Vec::new(),
62
+ offsets: vec![0],
63
+ }
64
+ }
65
+
66
+ pub fn with_capacity(items: usize, bytes: usize) -> Self {
67
+ let mut offsets = Vec::with_capacity(items.saturating_add(1));
68
+ offsets.push(0);
69
+ Self {
70
+ bytes: Vec::with_capacity(bytes),
71
+ offsets,
72
+ }
73
+ }
74
+
75
+ pub fn from_page(page: BytePage) -> Self {
76
+ Self {
77
+ bytes: page.bytes,
78
+ offsets: page.offsets,
79
+ }
80
+ }
81
+
82
+ pub fn len(&self) -> usize {
83
+ self.offsets.len().saturating_sub(1)
84
+ }
85
+
86
+ pub fn is_empty(&self) -> bool {
87
+ self.len() == 0
88
+ }
89
+
90
+ pub fn get(&self, index: usize) -> Option<&[u8]> {
91
+ let start = usize::try_from(*self.offsets.get(index)?).ok()?;
92
+ let end = usize::try_from(*self.offsets.get(index + 1)?).ok()?;
93
+ self.bytes.get(start..end)
94
+ }
95
+
96
+ pub fn push(&mut self, value: impl AsRef<[u8]>) {
97
+ let value = value.as_ref();
98
+ self.bytes.extend_from_slice(value);
99
+ let end = u32::try_from(self.bytes.len()).expect("byte page exceeds u32 offset capacity");
100
+ self.offsets.push(end);
101
+ }
102
+
103
+ pub fn finish(self) -> BytePage {
104
+ BytePage {
105
+ bytes: self.bytes,
106
+ offsets: self.offsets,
107
+ }
108
+ }
109
+ }
110
+
111
+ /// Ordered byte range for backend KV scans.
112
+ ///
113
+ /// Ranges are half-open: `start <= key < end`. `Prefix` is explicit because it
114
+ /// is a common access pattern and lets each backend choose the safest
115
+ /// implementation for its storage engine.
116
+ #[derive(Debug, Clone, PartialEq, Eq)]
117
+ pub enum BackendKvScanRange {
118
+ Prefix(Vec<u8>),
119
+ Range { start: Vec<u8>, end: Vec<u8> },
120
+ }
121
+
122
+ impl BackendKvScanRange {
123
+ pub fn prefix(prefix: impl Into<Vec<u8>>) -> Self {
124
+ Self::Prefix(prefix.into())
125
+ }
126
+
127
+ pub fn range(start: impl Into<Vec<u8>>, end: impl Into<Vec<u8>>) -> Self {
128
+ Self::Range {
129
+ start: start.into(),
130
+ end: end.into(),
131
+ }
132
+ }
133
+ }
134
+
135
+ #[derive(Debug, Clone, PartialEq, Eq)]
136
+ pub struct BackendKvGetRequest {
137
+ pub groups: Vec<BackendKvGetGroup>,
138
+ }
139
+
140
+ #[derive(Debug, Clone, PartialEq, Eq)]
141
+ pub struct BackendKvGetGroup {
142
+ pub namespace: String,
143
+ pub keys: Vec<Vec<u8>>,
144
+ }
145
+
146
+ impl BackendKvGetGroup {
147
+ pub fn namespace(&self) -> &str {
148
+ &self.namespace
149
+ }
150
+ }
151
+
152
+ #[derive(Debug, Clone, PartialEq, Eq)]
153
+ pub struct BackendKvValueBatch {
154
+ pub groups: Vec<BackendKvValueGroup>,
155
+ }
156
+
157
+ #[derive(Debug, Clone, PartialEq, Eq)]
158
+ pub struct BackendKvValueGroup {
159
+ namespace: String,
160
+ values: BytePage,
161
+ present: Vec<bool>,
162
+ }
163
+
164
+ impl BackendKvValueGroup {
165
+ pub fn new(namespace: impl Into<String>, values: BytePage, present: Vec<bool>) -> Self {
166
+ assert_eq!(
167
+ values.len(),
168
+ present.len(),
169
+ "backend value batch must have one value slot per presence bit"
170
+ );
171
+ Self {
172
+ namespace: namespace.into(),
173
+ values,
174
+ present,
175
+ }
176
+ }
177
+
178
+ pub fn namespace(&self) -> &str {
179
+ &self.namespace
180
+ }
181
+
182
+ pub fn len(&self) -> usize {
183
+ self.present.len()
184
+ }
185
+
186
+ pub fn is_empty(&self) -> bool {
187
+ self.present.is_empty()
188
+ }
189
+
190
+ pub fn value(&self, index: usize) -> Option<Option<&[u8]>> {
191
+ let present = *self.present.get(index)?;
192
+ if present {
193
+ Some(Some(
194
+ self.values
195
+ .get(index)
196
+ .expect("backend value batch invariant violated"),
197
+ ))
198
+ } else {
199
+ Some(None)
200
+ }
201
+ }
202
+
203
+ pub fn values_iter(&self) -> impl Iterator<Item = Option<&[u8]>> {
204
+ (0..self.len()).filter_map(|index| self.value(index))
205
+ }
206
+
207
+ pub fn into_parts(self) -> (String, BytePage, Vec<bool>) {
208
+ (self.namespace, self.values, self.present)
209
+ }
210
+ }
211
+
212
+ #[derive(Debug, Clone, PartialEq, Eq)]
213
+ pub struct BackendKvExistsBatch {
214
+ pub groups: Vec<BackendKvExistsGroup>,
215
+ }
216
+
217
+ #[derive(Debug, Clone, PartialEq, Eq)]
218
+ pub struct BackendKvExistsGroup {
219
+ pub namespace: String,
220
+ pub exists: Vec<bool>,
221
+ }
222
+
223
+ #[derive(Debug, Clone, PartialEq, Eq)]
224
+ pub struct BackendKvScanRequest {
225
+ pub namespace: String,
226
+ pub range: BackendKvScanRange,
227
+ pub after: Option<Vec<u8>>,
228
+ pub limit: usize,
229
+ }
230
+
231
+ #[derive(Debug, Clone, PartialEq, Eq)]
232
+ pub struct BackendKvKeyPage {
233
+ pub keys: BytePage,
234
+ pub resume_after: Option<Vec<u8>>,
235
+ }
236
+
237
+ #[derive(Debug, Clone, PartialEq, Eq)]
238
+ pub struct BackendKvValuePage {
239
+ pub values: BytePage,
240
+ pub resume_after: Option<Vec<u8>>,
241
+ }
242
+
243
+ #[derive(Debug, Clone, PartialEq, Eq)]
244
+ pub struct BackendKvEntryPage {
245
+ pub keys: BytePage,
246
+ pub values: BytePage,
247
+ pub resume_after: Option<Vec<u8>>,
248
+ }
249
+
250
+ impl BackendKvEntryPage {
251
+ pub fn len(&self) -> usize {
252
+ self.keys.len()
253
+ }
254
+
255
+ pub fn is_empty(&self) -> bool {
256
+ self.keys.is_empty()
257
+ }
258
+
259
+ pub fn key(&self, index: usize) -> Option<&[u8]> {
260
+ self.keys.get(index)
261
+ }
262
+
263
+ pub fn value(&self, index: usize) -> Option<&[u8]> {
264
+ self.values.get(index)
265
+ }
266
+ }
267
+
268
+ #[derive(Debug, Clone, PartialEq, Eq, Default)]
269
+ pub struct BackendKvWriteBatch {
270
+ pub groups: Vec<BackendKvWriteGroup>,
271
+ }
272
+
273
+ #[derive(Debug, Clone, PartialEq, Eq)]
274
+ pub struct BackendKvWriteGroup {
275
+ namespace: String,
276
+ put_keys: BytePageBuilder,
277
+ put_values: BytePageBuilder,
278
+ deletes: BytePageBuilder,
279
+ }
280
+
281
+ impl BackendKvWriteGroup {
282
+ pub fn new(namespace: impl Into<String>) -> Self {
283
+ Self {
284
+ namespace: namespace.into(),
285
+ put_keys: BytePageBuilder::new(),
286
+ put_values: BytePageBuilder::new(),
287
+ deletes: BytePageBuilder::new(),
288
+ }
289
+ }
290
+
291
+ pub fn from_pages(
292
+ namespace: impl Into<String>,
293
+ put_keys: BytePage,
294
+ put_values: BytePage,
295
+ deletes: BytePage,
296
+ ) -> Self {
297
+ assert_eq!(
298
+ put_keys.len(),
299
+ put_values.len(),
300
+ "backend write batch must have one value per put key"
301
+ );
302
+ Self {
303
+ namespace: namespace.into(),
304
+ put_keys: BytePageBuilder::from_page(put_keys),
305
+ put_values: BytePageBuilder::from_page(put_values),
306
+ deletes: BytePageBuilder::from_page(deletes),
307
+ }
308
+ }
309
+
310
+ pub fn put(&mut self, key: impl AsRef<[u8]>, value: impl AsRef<[u8]>) {
311
+ self.put_keys.push(key);
312
+ self.put_values.push(value);
313
+ }
314
+
315
+ pub fn delete(&mut self, key: impl AsRef<[u8]>) {
316
+ self.deletes.push(key);
317
+ }
318
+
319
+ pub fn namespace(&self) -> &str {
320
+ &self.namespace
321
+ }
322
+
323
+ pub fn put_count(&self) -> usize {
324
+ self.put_keys.len()
325
+ }
326
+
327
+ pub fn delete_count(&self) -> usize {
328
+ self.deletes.len()
329
+ }
330
+
331
+ pub fn put_key(&self, index: usize) -> Option<&[u8]> {
332
+ self.put_keys.get(index)
333
+ }
334
+
335
+ pub fn put_value(&self, index: usize) -> Option<&[u8]> {
336
+ self.put_values.get(index)
337
+ }
338
+
339
+ pub fn delete_key(&self, index: usize) -> Option<&[u8]> {
340
+ self.deletes.get(index)
341
+ }
342
+
343
+ pub fn into_parts(self) -> (String, BytePage, BytePage, BytePage) {
344
+ (
345
+ self.namespace,
346
+ self.put_keys.finish(),
347
+ self.put_values.finish(),
348
+ self.deletes.finish(),
349
+ )
350
+ }
351
+ }
352
+
353
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
354
+ pub struct BackendKvWriteStats {
355
+ pub puts: usize,
356
+ pub deletes: usize,
357
+ pub bytes_written: usize,
358
+ }
@@ -0,0 +1,12 @@
1
+ mod kv;
2
+ #[cfg(test)]
3
+ pub(crate) mod testing;
4
+ mod types;
5
+
6
+ pub use kv::{
7
+ BackendKvEntryPage, BackendKvExistsBatch, BackendKvExistsGroup, BackendKvGetGroup,
8
+ BackendKvGetRequest, BackendKvKeyPage, BackendKvScanRange, BackendKvScanRequest,
9
+ BackendKvValueBatch, BackendKvValueGroup, BackendKvValuePage, BackendKvWriteBatch,
10
+ BackendKvWriteGroup, BackendKvWriteStats, BytePage, BytePageBuilder,
11
+ };
12
+ pub use types::{Backend, BackendReadTransaction, BackendWriteTransaction};