import_ndjson/
import_ndjson.rs1mod common;
16
17use std::fs::File;
18use std::io::BufRead;
19use std::io::BufReader;
20use std::io::Read;
21
22#[tokio::main(flavor = "current_thread")]
23async fn main() -> Result<(), Box<dyn std::error::Error>> {
24 let path = std::env::args()
25 .nth(1)
26 .ok_or("usage: import_ndjson <events.ndjson>")?;
27 let mut input = BufReader::new(File::open(path)?);
28 let client = common::client()?;
29 let stream = common::write_table(&client)?.append_stream().build()?;
30 let admitted: Result<(), Box<dyn std::error::Error>> = async {
31 let mut line_number = 0;
32 loop {
33 let mut line = String::new();
35 let bytes = input
36 .by_ref()
37 .take(8 * 1024 * 1024 + 1)
38 .read_line(&mut line)?;
39 if bytes == 0 {
40 break;
41 }
42 line_number += 1;
43 if bytes > 8 * 1024 * 1024 {
44 return Err(format!("line {line_number} exceeds 8 MiB").into());
45 }
46 if line.trim().is_empty() {
47 continue;
48 }
49 let row: serde_json::Value = serde_json::from_str(&line)
50 .map_err(|error| format!("line {line_number}: {error}"))?;
51 stream.send(&row).await?;
52 }
53 Ok(())
54 }
55 .await;
56 let settled = stream.shutdown().await;
58 println!("delivery: {:?}", stream.stats());
59 settled?;
60 admitted?;
61 Ok(())
62}