@feltdb/core 0.4.12 → 0.4.14
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/cli/commands.js +42 -25
- package/dist/cli/index.js +1 -1
- package/dist/create/cli.js +39 -4
- package/dist/create/create.js +30 -18
- package/dist/create/docker-compose-generator.js +68 -11
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/Cargo.lock +2238 -0
- package/dist/create/server-source/Cargo.toml +7 -0
- package/dist/create/server-source/crates/feltdb/Cargo.lock +175 -0
- package/dist/create/server-source/crates/feltdb/Cargo.toml +79 -0
- package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +370 -0
- package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +589 -0
- package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +259 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +446 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +272 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +378 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +414 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +486 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +273 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +587 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +513 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +395 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +469 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +409 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +627 -0
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +383 -0
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +298 -0
- package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +1698 -0
- package/dist/create/server-source/crates/feltdb/src/acquisition.rs +286 -0
- package/dist/create/server-source/crates/feltdb/src/admission.rs +192 -0
- package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +477 -0
- package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +566 -0
- package/dist/create/server-source/crates/feltdb/src/analytics.rs +475 -0
- package/dist/create/server-source/crates/feltdb/src/application.rs +2244 -0
- package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +1070 -0
- package/dist/create/server-source/crates/feltdb/src/authorization.rs +1030 -0
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +266 -0
- package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +8 -0
- package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +418 -0
- package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +482 -0
- package/dist/create/server-source/crates/feltdb/src/capability.rs +903 -0
- package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +261 -0
- package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +78 -0
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +2214 -0
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +194 -0
- package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +427 -0
- package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +453 -0
- package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +465 -0
- package/dist/create/server-source/crates/feltdb/src/convergence.rs +618 -0
- package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +418 -0
- package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +380 -0
- package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +362 -0
- package/dist/create/server-source/crates/feltdb/src/cron.rs +294 -0
- package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +474 -0
- package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +1003 -0
- package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +536 -0
- package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +364 -0
- package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +235 -0
- package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +207 -0
- package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +316 -0
- package/dist/create/server-source/crates/feltdb/src/execution.rs +426 -0
- package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +219 -0
- package/dist/create/server-source/crates/feltdb/src/indexing.rs +779 -0
- package/dist/create/server-source/crates/feltdb/src/lib.rs +2838 -0
- package/dist/create/server-source/crates/feltdb/src/materialization.rs +184 -0
- package/dist/create/server-source/crates/feltdb/src/metrics.rs +267 -0
- package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +311 -0
- package/dist/create/server-source/crates/feltdb/src/observability.rs +366 -0
- package/dist/create/server-source/crates/feltdb/src/operation.rs +251 -0
- package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +438 -0
- package/dist/create/server-source/crates/feltdb/src/operation_log.rs +344 -0
- package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +477 -0
- package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +166 -0
- package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +261 -0
- package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +560 -0
- package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +3226 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +201 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +263 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +484 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +216 -0
- package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +281 -0
- package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +323 -0
- package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +573 -0
- package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +404 -0
- package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +418 -0
- package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +381 -0
- package/dist/create/server-source/crates/feltdb/src/phase_1c_three_node.rs +523 -0
- package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +334 -0
- package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +306 -0
- package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +355 -0
- package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +395 -0
- package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +346 -0
- package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +430 -0
- package/dist/create/server-source/crates/feltdb/src/production_api.rs +400 -0
- package/dist/create/server-source/crates/feltdb/src/provenance.rs +207 -0
- package/dist/create/server-source/crates/feltdb/src/query_performance.rs +217 -0
- package/dist/create/server-source/crates/feltdb/src/references.rs +404 -0
- package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +401 -0
- package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +160 -0
- package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +132 -0
- package/dist/create/server-source/crates/feltdb/src/routing.rs +409 -0
- package/dist/create/server-source/crates/feltdb/src/sharding.rs +523 -0
- package/dist/create/server-source/crates/feltdb/src/state_contract.rs +3118 -0
- package/dist/create/server-source/crates/feltdb/src/state_hash.rs +291 -0
- package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +376 -0
- package/dist/create/server-source/crates/feltdb/src/storage.rs +267 -0
- package/dist/create/server-source/crates/feltdb/src/submission.rs +477 -0
- package/dist/create/server-source/crates/feltdb/src/sync.rs +483 -0
- package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +822 -0
- package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +366 -0
- package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +473 -0
- package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +949 -0
- package/dist/create/server-source/crates/feltdb/src/transactions.rs +646 -0
- package/dist/create/server-source/crates/feltdb/src/trigger.rs +390 -0
- package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +928 -0
- package/dist/create/server-source/crates/feltdb/src/workflow.rs +713 -0
- package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +510 -0
- package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +354 -0
- package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +594 -0
- package/dist/create/server-source/crates/feltdb/src/workload.rs +1310 -0
- package/dist/create/server-source/crates/feltdb-server/Cargo.toml +23 -0
- package/dist/create/server-source/crates/feltdb-server/README.md +79 -0
- package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +73 -0
- package/dist/create/server-source/crates/feltdb-server/src/application_contract.rs +425 -0
- package/dist/create/server-source/crates/feltdb-server/src/artifacts.rs +449 -0
- package/dist/create/server-source/crates/feltdb-server/src/audit.rs +59 -0
- package/dist/create/server-source/crates/feltdb-server/src/auth.rs +308 -0
- package/dist/create/server-source/crates/feltdb-server/src/authorization.rs +228 -0
- package/dist/create/server-source/crates/feltdb-server/src/backup.rs +416 -0
- package/dist/create/server-source/crates/feltdb-server/src/causal.rs +218 -0
- package/dist/create/server-source/crates/feltdb-server/src/certification.rs +223 -0
- package/dist/create/server-source/crates/feltdb-server/src/clock.rs +132 -0
- package/dist/create/server-source/crates/feltdb-server/src/cluster.rs +165 -0
- package/dist/create/server-source/crates/feltdb-server/src/connections.rs +1044 -0
- package/dist/create/server-source/crates/feltdb-server/src/content.rs +111 -0
- package/dist/create/server-source/crates/feltdb-server/src/identity.rs +250 -0
- package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +78 -0
- package/dist/create/server-source/crates/feltdb-server/src/key_provider.rs +247 -0
- package/dist/create/server-source/crates/feltdb-server/src/leases.rs +123 -0
- package/dist/create/server-source/crates/feltdb-server/src/lib.rs +25 -0
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +8715 -0
- package/dist/create/server-source/crates/feltdb-server/src/metrics.rs +97 -0
- package/dist/create/server-source/crates/feltdb-server/src/portable_bundle.rs +350 -0
- package/dist/create/server-source/crates/feltdb-server/src/principals.rs +510 -0
- package/dist/create/server-source/crates/feltdb-server/src/providers.rs +269 -0
- package/dist/create/server-source/crates/feltdb-server/src/releases.rs +2563 -0
- package/dist/create/server-source/crates/feltdb-server/src/sessions.rs +156 -0
- package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +1097 -0
- package/dist/create/server-source/crates/feltdb-server/src/versions.rs +264 -0
- package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +31 -0
- package/dist/create/server-source/crates/feltdb-wasm/src/lib.rs +1086 -0
- package/dist/create/server-source/crates/feltdb-wasm/test.db +0 -0
- package/dist/flowspec.d.ts +2 -0
- package/dist/flowspec.d.ts.map +1 -1
- package/dist/flowspec.js +28 -4
- package/dist/state-contract.d.ts +7 -1
- package/dist/state-contract.d.ts.map +1 -1
- package/dist/studio/components/ApplicationDesigner.d.ts.map +1 -1
- package/dist/studio/components/ConflictExplorer.d.ts.map +1 -1
- package/dist/studio/components/index.js +1 -1
- package/dist/studio/{components-Q0Nx6gLE.js → components-9kDSWiGL.js} +163 -47
- package/dist/studio/index.js +31 -28
- package/dist/studio-app/assets/{index-BHOmLZF-.js → index-DVdvmf69.js} +9 -9
- package/dist/studio-app/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
use crate::{FlowError, Result, StoredRow};
|
|
2
|
+
use std::collections::HashMap;
|
|
3
|
+
use std::fs::{self, OpenOptions};
|
|
4
|
+
use std::io::{BufRead, BufReader, Write};
|
|
5
|
+
use std::path::{Path, PathBuf};
|
|
6
|
+
|
|
7
|
+
/// Trait defining the storage abstraction for FeltDB.
|
|
8
|
+
///
|
|
9
|
+
/// This allows FeltDB to work with different storage backends:
|
|
10
|
+
/// - Memory (for testing)
|
|
11
|
+
/// - Native files (for desktop/server)
|
|
12
|
+
/// - Browser storage (OPFS/IndexedDB via WASM)
|
|
13
|
+
pub trait Storage: Send + Sync {
|
|
14
|
+
/// Append a new operation to the log
|
|
15
|
+
fn append(&mut self, row: &StoredRow) -> Result<()>;
|
|
16
|
+
|
|
17
|
+
/// Read all operations from storage
|
|
18
|
+
fn read_all(&self) -> Result<Vec<StoredRow>>;
|
|
19
|
+
|
|
20
|
+
/// Create a checkpoint of the current state
|
|
21
|
+
fn checkpoint(&mut self, state: &CheckpointData) -> Result<()>;
|
|
22
|
+
|
|
23
|
+
/// Read the latest checkpoint if it exists
|
|
24
|
+
fn read_checkpoint(&self) -> Result<Option<CheckpointData>>;
|
|
25
|
+
|
|
26
|
+
/// Compact the storage by merging checkpoint and delta operations
|
|
27
|
+
fn compact(&mut self) -> Result<()>;
|
|
28
|
+
|
|
29
|
+
/// Get the storage backend type name (for debugging/runtime info)
|
|
30
|
+
fn storage_type(&self) -> &'static str;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/// Data structure for checkpoints
|
|
34
|
+
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
|
35
|
+
pub struct CheckpointData {
|
|
36
|
+
/// All rows at checkpoint time
|
|
37
|
+
pub rows: HashMap<String, HashMap<String, StoredRow>>,
|
|
38
|
+
/// Key counters at checkpoint time
|
|
39
|
+
pub key_counters: HashMap<String, u64>,
|
|
40
|
+
/// Operations since last checkpoint
|
|
41
|
+
pub delta_operations: Vec<StoredRow>,
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/// In-memory storage backend for testing
|
|
45
|
+
pub struct MemoryStorage {
|
|
46
|
+
operations: Vec<StoredRow>,
|
|
47
|
+
checkpoint: Option<CheckpointData>,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
impl MemoryStorage {
|
|
51
|
+
pub fn new() -> Self {
|
|
52
|
+
Self {
|
|
53
|
+
operations: Vec::new(),
|
|
54
|
+
checkpoint: None,
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
impl Default for MemoryStorage {
|
|
60
|
+
fn default() -> Self {
|
|
61
|
+
Self::new()
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
impl Storage for MemoryStorage {
|
|
66
|
+
fn append(&mut self, row: &StoredRow) -> Result<()> {
|
|
67
|
+
self.operations.push(row.clone());
|
|
68
|
+
Ok(())
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
fn read_all(&self) -> Result<Vec<StoredRow>> {
|
|
72
|
+
Ok(self.operations.clone())
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
fn checkpoint(&mut self, state: &CheckpointData) -> Result<()> {
|
|
76
|
+
self.checkpoint = Some(state.clone());
|
|
77
|
+
self.operations.clear();
|
|
78
|
+
Ok(())
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
fn read_checkpoint(&self) -> Result<Option<CheckpointData>> {
|
|
82
|
+
Ok(self.checkpoint.clone())
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
fn compact(&mut self) -> Result<()> {
|
|
86
|
+
// For in-memory, compaction is just checkpoint + clear deltas
|
|
87
|
+
if let Some(checkpoint) = &self.checkpoint {
|
|
88
|
+
self.operations = checkpoint.delta_operations.clone();
|
|
89
|
+
}
|
|
90
|
+
Ok(())
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
fn storage_type(&self) -> &'static str {
|
|
94
|
+
"memory"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/// File-based storage backend for native file operations
|
|
99
|
+
pub struct FileStorage {
|
|
100
|
+
path: PathBuf,
|
|
101
|
+
checkpoint_path: PathBuf,
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
impl FileStorage {
|
|
105
|
+
pub fn new<P: AsRef<Path>>(path: P) -> Result<Self> {
|
|
106
|
+
let path = path.as_ref().to_path_buf();
|
|
107
|
+
if let Some(parent) = path.parent() {
|
|
108
|
+
fs::create_dir_all(parent)?;
|
|
109
|
+
}
|
|
110
|
+
if !path.exists() {
|
|
111
|
+
OpenOptions::new().create(true).append(true).open(&path)?;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
let checkpoint_path = path.with_extension("checkpoint");
|
|
115
|
+
Ok(Self {
|
|
116
|
+
path,
|
|
117
|
+
checkpoint_path,
|
|
118
|
+
})
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
impl Storage for FileStorage {
|
|
123
|
+
fn append(&mut self, row: &StoredRow) -> Result<()> {
|
|
124
|
+
let mut file = OpenOptions::new()
|
|
125
|
+
.create(true)
|
|
126
|
+
.append(true)
|
|
127
|
+
.open(&self.path)?;
|
|
128
|
+
let mut line = serde_json::to_string(row)?;
|
|
129
|
+
line.push('\n');
|
|
130
|
+
file.write_all(line.as_bytes())?;
|
|
131
|
+
file.flush()?;
|
|
132
|
+
Ok(())
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
fn read_all(&self) -> Result<Vec<StoredRow>> {
|
|
136
|
+
let mut operations = Vec::new();
|
|
137
|
+
|
|
138
|
+
// First, try to read checkpoint if it exists
|
|
139
|
+
if let Ok(checkpoint_data) = self.read_checkpoint() {
|
|
140
|
+
if checkpoint_data.is_some() {
|
|
141
|
+
// Get all rows from checkpoint
|
|
142
|
+
if let Some(cp) = checkpoint_data {
|
|
143
|
+
for bucket in cp.rows.values() {
|
|
144
|
+
for row in bucket.values() {
|
|
145
|
+
operations.push(row.clone());
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Add delta operations
|
|
149
|
+
operations.extend(cp.delta_operations.clone());
|
|
150
|
+
return Ok(operations);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// If no checkpoint, read from main log file
|
|
156
|
+
if self.path.exists() {
|
|
157
|
+
let file = OpenOptions::new().read(true).open(&self.path)?;
|
|
158
|
+
let reader = BufReader::new(file);
|
|
159
|
+
|
|
160
|
+
for line in reader.lines() {
|
|
161
|
+
let line = line?;
|
|
162
|
+
if line.trim().is_empty() {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
let row: StoredRow = serde_json::from_str(&line)
|
|
166
|
+
.map_err(|_| FlowError::CorruptLogLine(line.clone()))?;
|
|
167
|
+
operations.push(row);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
Ok(operations)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
fn checkpoint(&mut self, state: &CheckpointData) -> Result<()> {
|
|
175
|
+
let checkpoint_json = serde_json::to_string(state)?;
|
|
176
|
+
let mut file = OpenOptions::new()
|
|
177
|
+
.create(true)
|
|
178
|
+
.write(true)
|
|
179
|
+
.truncate(true)
|
|
180
|
+
.open(&self.checkpoint_path)?;
|
|
181
|
+
file.write_all(checkpoint_json.as_bytes())?;
|
|
182
|
+
file.flush()?;
|
|
183
|
+
Ok(())
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
fn read_checkpoint(&self) -> Result<Option<CheckpointData>> {
|
|
187
|
+
if !self.checkpoint_path.exists() {
|
|
188
|
+
return Ok(None);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
let content = fs::read_to_string(&self.checkpoint_path)?;
|
|
192
|
+
match serde_json::from_str(&content) {
|
|
193
|
+
Ok(data) => Ok(Some(data)),
|
|
194
|
+
Err(_) => Ok(None),
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
fn compact(&mut self) -> Result<()> {
|
|
199
|
+
// Compaction for file storage:
|
|
200
|
+
// 1. Create checkpoint
|
|
201
|
+
// 2. Truncate main log to only contain delta operations
|
|
202
|
+
// 3. On next read, we'll load from checkpoint + deltas
|
|
203
|
+
|
|
204
|
+
// This is handled automatically by read_all() which checks for checkpoint first
|
|
205
|
+
Ok(())
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
fn storage_type(&self) -> &'static str {
|
|
209
|
+
"file"
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
#[cfg(test)]
|
|
214
|
+
mod tests {
|
|
215
|
+
use super::*;
|
|
216
|
+
|
|
217
|
+
#[test]
|
|
218
|
+
fn memory_storage_append_and_read() {
|
|
219
|
+
let mut storage = MemoryStorage::new();
|
|
220
|
+
let row = StoredRow {
|
|
221
|
+
capability: "test".to_string(),
|
|
222
|
+
key: "test:1".to_string(),
|
|
223
|
+
rust_type: "String".to_string(),
|
|
224
|
+
value: serde_json::json!("value"),
|
|
225
|
+
unix_ms: 1000,
|
|
226
|
+
content_hash: None,
|
|
227
|
+
flow_ref: None,
|
|
228
|
+
deleted: false,
|
|
229
|
+
operation: None,
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
storage.append(&row).expect("append should succeed");
|
|
233
|
+
let operations = storage.read_all().expect("read_all should succeed");
|
|
234
|
+
assert_eq!(operations.len(), 1);
|
|
235
|
+
assert_eq!(operations[0].key, "test:1");
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
#[test]
|
|
239
|
+
fn memory_storage_checkpoint() {
|
|
240
|
+
let mut storage = MemoryStorage::new();
|
|
241
|
+
let row = StoredRow {
|
|
242
|
+
capability: "test".to_string(),
|
|
243
|
+
key: "test:1".to_string(),
|
|
244
|
+
rust_type: "String".to_string(),
|
|
245
|
+
value: serde_json::json!("value"),
|
|
246
|
+
unix_ms: 1000,
|
|
247
|
+
content_hash: None,
|
|
248
|
+
flow_ref: None,
|
|
249
|
+
deleted: false,
|
|
250
|
+
operation: None,
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
storage.append(&row).expect("append");
|
|
254
|
+
|
|
255
|
+
let checkpoint = CheckpointData {
|
|
256
|
+
rows: Default::default(),
|
|
257
|
+
key_counters: Default::default(),
|
|
258
|
+
delta_operations: vec![row],
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
storage
|
|
262
|
+
.checkpoint(&checkpoint)
|
|
263
|
+
.expect("checkpoint should succeed");
|
|
264
|
+
let operations = storage.read_all().expect("read_all should succeed");
|
|
265
|
+
assert_eq!(operations.len(), 0); // Cleared after checkpoint
|
|
266
|
+
}
|
|
267
|
+
}
|