src/SstFile.bend source
src/SstFile.bend on the hub · documented module
import Baseimport ./MemTable.bend as MemTableimport ./Sstable.bend as Sstableimport ./Wal.bend as Walimport ./Manifest.bend as Manifestimport ./SstFileV2.bend as SstFileV2import ./SstFileV1Fast.bend as SstFileV1Fast# Public SSTable codec boundary. Production writes compact v2 files. Reads are# version-dispatched so legacy v1 databases remain recoverable and migrate# naturally when compaction publishes v2 outputs.# Legacy serialization remains test-only; production callers use serialize_v2.def muts_of_entries(+es: List<&2, MemTable.Entry>) -> List<&2, Wal.Mut>: match es: case Nil{}: Nil{} case Con{MemTable.Entry{key, val}, rest}: match val: case None{}: Con{Wal.Del{key}, muts_of_entries(rest)} case Some{value}: Con{Wal.Put{key, value}, muts_of_entries(rest)}def serialize_v1(+entries: List<&2, MemTable.Entry>, +level: Nat) -> String: +wal = Wal.encode(Wal.Batch{muts_of_entries(entries)}) +body = "T" ++ Wal.dashes(level) ++ ";" ++ Wal.dashes(String.length(wal)) ++ ";" ++ wal body ++ "#" ++ U32.show(Manifest.mhash(body, 7))def parse_v1(+encoded: String) -> Maybe<&2, Sstable.Table>: SstFileV1Fast.parse(encoded)def serialize_v2(+entries: List<&2, MemTable.Entry>, +level: Nat) -> String: SstFileV2.serialize(entries, level)def serialize(+entries: List<&2, MemTable.Entry>, +level: Nat) -> String: serialize_v2(entries, level)def parse_version(v2: Bool, +encoded: String) -> Maybe<&2, Sstable.Table>: match v2: case True{}: SstFileV2.parse(encoded) case False{}: parse_v1(encoded)def parse(+encoded: String) -> Maybe<&2, Sstable.Table>: parse_version(String.starts_with(encoded, "S2;"), encoded)# Total-parser witness used by the hardening law.def is_decided(+result: Maybe<&2, Sstable.Table>) -> Bool: True{}