zerodds-recorder-decode 1.0.0-rc.6

Decode DDS samples to typed JSON + SQLite for zerodds-spy/-record: IDL→DynamicType type source, DynamicData→JSON, per-topic relational SQLite sink.
Documentation

zerodds-recorder-decode

Decode DDS samples to typed JSON + SQLite for zerodds-spy / zerodds-record, and read them back for zerodds-replay. Tooling support crate (safety class COMFORT — no runtime hot path).

Sits on top of the reflective XTypes codec (zerodds_types::dynamic::codec::{decode_dynamic, encode_dynamic}).

Modules

  • type_source — load an out-of-band IDL file (--type-file) and resolve a named type to a DynamicType; parse_topic_type_map for topic=Type entries.
  • json_sinkDynamicData → JSON; an NDJSON sample sink. Each line is self-describing (topic, type, recv_ts_ns, writer, decoded value, and the raw CDR bytes as hex for byte-exact replay).
  • sqlite_sink — per-topic relational SQLite. One row per sample keyed by sample_id (the record marker) with typed scalar columns (1:1 nested structs flattened to field__sub); child tables t_<topic>__<member> for scalar sequences/arrays joined by sample_id; _types holds the full IDL per topic. helper_queries emits ready-to-run SQL ("record by property", "nth record", "full record by join").
  • replay_source — read the decoded formats back into a format-neutral RecordedSample (topic, type_name, recv_ts_ns, raw_cdr): from_ndjson (NDJSON) and from_sqlite (read-only, globally ts-ordered).

Replay fidelity

Every sink retains the raw CDR bytes per sample, so zerodds-replay re-publishes byte-exact from .zddsrec, NDJSON, and SQLite. The decode_roundtrip e2e test asserts both byte-exact raw_cdr and value-exact re-decode across XCDR1/XCDR2 × little/big-endian.

Residual

Composite-element collections (sequence<Struct> etc.), alias-to-composite, mutable-union, wstring encode and bitmask/bitset are reported as NotSupported (honest error, never silent corruption) — gated on the collection element_type model refactor. Scalar-element collections are fully supported.

License

Apache-2.0.