use std::collections::BTreeMap;
use std::io::Write as _;
use std::path::Path;
use std::time::Duration;
use dendro::archive::{SourceMeta, WalRow};
use dendro::segment::{EncodeResult, Segment, SegmentEncoder};
use dendro::writer::Writer;
struct Tags;
impl SegmentEncoder for Tags {
fn encode(&self, _stream: &str, rows: &[WalRow]) -> EncodeResult {
if rows.is_empty() {
return Ok(None);
}
let ts: Vec<String> = rows.iter().map(|r| r.ts.to_string()).collect();
Ok(Some(Segment {
bytes: ts.join(",").into_bytes(),
rows: rows.len() as u64,
first_ts: rows[0].ts,
last_ts: rows[rows.len() - 1].ts,
index: None,
}))
}
}
fn main() {
let args: Vec<String> = std::env::args().skip(1).collect();
let [path, rows, seal_after] = args.as_slice() else {
eprintln!("usage: append-until-killed <path> <rows> <seal_after>");
std::process::exit(2);
};
let rows: i64 = rows.parse().expect("rows");
let seal_after: i64 = seal_after.parse().expect("seal_after");
let seed = SourceMeta {
labels: BTreeMap::from([("source".to_string(), "killed".to_string())]),
metadata: BTreeMap::new(),
clock_anchor_wall_ns: 1_000,
};
let (archive, mut w) = Writer::single(Path::new(path), Box::new(Tags), seed).expect("create");
for ts in 1..=rows {
w.wal(vec![WalRow {
stream: "s".to_string(),
ts,
wall_offset: 0,
row: vec![1],
}])
.expect("append");
if ts == seal_after {
w.seal(vec!["s".to_string()]).expect("seal");
}
}
w.sync().expect("sync");
println!("ready");
std::io::stdout().flush().expect("flush");
std::mem::forget(w);
std::mem::forget(archive);
loop {
std::thread::sleep(Duration::from_secs(3600));
}
}