reddb-io-file 1.11.0

RedDB file artifact layer: single-file .rdb layout, WAL, snapshots, checkpoints, locks, and recovery.
Documentation
use std::collections::BTreeMap;

pub const DEFAULT_PHYSICAL_FORMAT_VERSION: u32 = 2;
pub const DEFAULT_SUPERBLOCK_COPIES: u8 = 4;
pub const PHYSICAL_METADATA_PROTOCOL_VERSION: &str = "reddb-physical-v1";
pub const PHYSICAL_SYSTEM_COLLECTION: &str = "__system__";

#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct BlockReference {
    pub index: u64,
    pub checksum: u128,
}

#[derive(Debug, Clone, Default)]
pub struct ManifestPointers {
    pub oldest: BlockReference,
    pub newest: BlockReference,
}

#[derive(Debug, Clone)]
pub struct SuperblockHeader {
    pub format_version: u32,
    pub sequence: u64,
    pub copies: u8,
    pub manifest: ManifestPointers,
    pub free_set: BlockReference,
    pub collection_roots: BTreeMap<String, u64>,
}

impl Default for SuperblockHeader {
    fn default() -> Self {
        Self {
            format_version: DEFAULT_PHYSICAL_FORMAT_VERSION,
            sequence: 0,
            copies: DEFAULT_SUPERBLOCK_COPIES,
            manifest: ManifestPointers::default(),
            free_set: BlockReference::default(),
            collection_roots: BTreeMap::new(),
        }
    }
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ManifestEventKind {
    Insert,
    Update,
    Remove,
    Checkpoint,
}

#[derive(Debug, Clone)]
pub struct ManifestEvent {
    pub collection: String,
    pub object_key: String,
    pub kind: ManifestEventKind,
    pub block: BlockReference,
    pub snapshot_min: u64,
    pub snapshot_max: Option<u64>,
}

pub fn physical_manifest_block_reference(root: u64, sequence: u64) -> BlockReference {
    BlockReference {
        index: root,
        checksum: ((root as u128) << 64) | sequence as u128,
    }
}

pub fn physical_superblock_object_key(sequence: u64) -> String {
    format!("superblock:{sequence}")
}

pub fn physical_superblock_checkpoint_event(sequence: u64) -> ManifestEvent {
    ManifestEvent {
        collection: PHYSICAL_SYSTEM_COLLECTION.to_string(),
        object_key: physical_superblock_object_key(sequence),
        kind: ManifestEventKind::Checkpoint,
        block: physical_manifest_block_reference(sequence, sequence),
        snapshot_min: sequence,
        snapshot_max: None,
    }
}

#[derive(Debug, Clone, Default)]
pub struct SnapshotDescriptor {
    pub snapshot_id: u64,
    pub created_at_unix_ms: u128,
    pub superblock_sequence: u64,
    pub collection_count: usize,
    pub total_entities: usize,
}

#[derive(Debug, Clone)]
pub struct ExportDescriptor {
    pub name: String,
    pub created_at_unix_ms: u128,
    pub snapshot_id: Option<u64>,
    pub superblock_sequence: u64,
    pub data_path: String,
    pub metadata_path: String,
    pub collection_count: usize,
    pub total_entities: usize,
}

#[derive(Debug, Clone)]
pub struct PhysicalGraphProjection {
    pub name: String,
    pub created_at_unix_ms: u128,
    pub updated_at_unix_ms: u128,
    pub state: String,
    pub source: String,
    pub node_labels: Vec<String>,
    pub node_types: Vec<String>,
    pub edge_labels: Vec<String>,
    pub last_materialized_sequence: Option<u64>,
}

#[derive(Debug, Clone)]
pub struct PhysicalAnalyticsJob {
    pub id: String,
    pub kind: String,
    pub state: String,
    pub projection: Option<String>,
    pub created_at_unix_ms: u128,
    pub updated_at_unix_ms: u128,
    pub last_run_sequence: Option<u64>,
    pub metadata: BTreeMap<String, String>,
}

#[derive(Debug, Clone)]
pub struct PhysicalTreeDefinition {
    pub collection: String,
    pub name: String,
    pub root_id: u64,
    pub default_max_children: usize,
    pub ordered_children: bool,
    pub ownership: String,
    pub auto_fix_mode: String,
    pub created_at_unix_ms: u128,
    pub updated_at_unix_ms: u128,
}

#[derive(Debug, Clone)]
pub struct PersistedPhysicalIndexState {
    pub name: String,
    pub kind: String,
    pub collection: Option<String>,
    pub enabled: bool,
    pub entries: usize,
    pub estimated_memory_bytes: u64,
    pub last_refresh_ms: Option<u128>,
    pub backend: String,
    pub artifact_kind: Option<String>,
    pub artifact_root_page: Option<u32>,
    pub artifact_checksum: Option<u64>,
    pub build_state: String,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct PhysicalPageLocation {
    pub page_id: u32,
    pub offset: u32,
    pub length: u32,
}

#[derive(Debug, Clone)]
pub struct PersistedPhysicalHypertableChunk {
    pub start_ns: u64,
    pub end_ns_exclusive: u64,
    pub row_count: u64,
    pub min_ts_ns: u64,
    pub max_ts_ns: u64,
    pub sealed: bool,
    pub ttl_override_ns: Option<u64>,
    pub columnar_page: Option<PhysicalPageLocation>,
}

#[derive(Debug, Clone)]
pub struct PersistedPhysicalHypertable {
    pub name: String,
    pub time_column: String,
    pub chunk_interval_ns: u64,
    pub default_ttl_ns: Option<u64>,
    pub chunks: Vec<PersistedPhysicalHypertableChunk>,
}

#[derive(Debug, Clone, Default)]
pub struct PhysicalMetadataDocumentEnvelope {
    pub protocol_version: String,
    pub generated_at_unix_ms: u128,
    pub last_loaded_from: Option<String>,
    pub last_healed_at_unix_ms: Option<u128>,
    pub manifest_json: String,
    pub catalog_json: String,
    pub manifest_events_json: Vec<String>,
    pub indexes_json: Vec<String>,
    pub graph_projections_json: Vec<String>,
    pub analytics_jobs_json: Vec<String>,
    pub tree_definitions_json: Vec<String>,
    pub collection_ttl_defaults_ms: BTreeMap<String, u64>,
    pub collection_contracts_json: Vec<String>,
    pub hypertables_json: Vec<String>,
    pub exports_json: Vec<String>,
    pub superblock_json: String,
    pub snapshots_json: Vec<String>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PhysicalSchemaOptions {
    pub mode: String,
    pub data_path: Option<String>,
    pub read_only: bool,
    pub create_if_missing: bool,
    pub verify_checksums: bool,
    pub durability_mode: Option<String>,
    pub group_commit_window_ms: Option<u64>,
    pub group_commit_max_statements: Option<usize>,
    pub group_commit_max_wal_bytes: Option<u64>,
    pub auto_checkpoint_pages: u32,
    pub cache_pages: usize,
    pub snapshot_retention: Option<usize>,
    pub export_retention: Option<usize>,
    pub force_create: bool,
    pub capabilities: Vec<String>,
    pub metadata: BTreeMap<String, String>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PhysicalSchemaManifest {
    pub format_version: u32,
    pub created_at_unix_ms: u128,
    pub updated_at_unix_ms: u128,
    pub collection_count: usize,
    pub options: PhysicalSchemaOptions,
}

#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct PhysicalCatalogCollectionStats {
    pub entities: usize,
    pub cross_refs: usize,
    pub segments: usize,
}

#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct PhysicalCatalogSnapshot {
    pub name: String,
    pub total_entities: usize,
    pub total_collections: usize,
    pub updated_at_unix_ms: u128,
    pub stats_by_collection: BTreeMap<String, PhysicalCatalogCollectionStats>,
}

#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct PhysicalAnalyticalStorageConfig {
    pub columnar: bool,
    pub time_key: String,
    pub order_by_key: Option<String>,
}

#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct PhysicalSubscriptionDescriptor {
    pub name: String,
    pub source: String,
    pub target_queue: String,
    pub ops_filter: Vec<String>,
    pub where_filter: Option<String>,
    pub redact_fields: Vec<String>,
    pub enabled: bool,
    pub all_tenants: bool,
}

#[derive(Debug, Clone, Default, PartialEq)]
pub struct PhysicalAnalyticsViewDescriptor {
    pub output: String,
    pub algorithm: Option<String>,
    pub resolution: Option<f64>,
    pub max_iterations: Option<i64>,
    pub tolerance: Option<f64>,
}

#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct PhysicalDeclaredColumnContract {
    pub name: String,
    pub data_type: String,
    pub sql_type: Option<PhysicalSqlTypeName>,
    pub not_null: bool,
    pub default: Option<String>,
    pub compress: Option<u8>,
    pub unique: bool,
    pub primary_key: bool,
    pub enum_variants: Vec<String>,
    pub array_element: Option<String>,
    pub decimal_precision: Option<u8>,
}

#[derive(Debug, Clone, Default, PartialEq)]
pub struct PhysicalCollectionContract {
    pub name: String,
    pub declared_model: String,
    pub schema_mode: String,
    pub origin: String,
    pub version: u32,
    pub created_at_unix_ms: u128,
    pub updated_at_unix_ms: u128,
    pub default_ttl_ms: Option<u64>,
    pub vector_dimension: Option<usize>,
    pub vector_metric: Option<String>,
    pub context_index_fields: Vec<String>,
    pub declared_columns: Vec<PhysicalDeclaredColumnContract>,
    pub table_def_hex: Option<String>,
    pub timestamps_enabled: bool,
    pub context_index_enabled: bool,
    pub metrics_raw_retention_ms: Option<u64>,
    pub metrics_rollup_policies: Vec<String>,
    pub metrics_tenant_identity: Option<String>,
    pub metrics_namespace: Option<String>,
    pub append_only: bool,
    pub subscriptions: Vec<PhysicalSubscriptionDescriptor>,
    pub analytics_config: Vec<PhysicalAnalyticsViewDescriptor>,
    pub session_key: Option<String>,
    pub session_gap_ms: Option<u64>,
    pub retention_duration_ms: Option<u64>,
    pub analytical_storage: Option<PhysicalAnalyticalStorageConfig>,
}

#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct PhysicalSqlTypeName {
    pub name: String,
    pub modifiers: Vec<PhysicalTypeModifier>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PhysicalTypeModifier {
    Number(u32),
    Ident(String),
    StringLiteral(String),
    Type(Box<PhysicalSqlTypeName>),
}