narrowdb 0.3.0

A lightweight columnar database engine for log and time-series data
Documentation
use anyhow::{Context, Result, bail};

use narrowdb::bench::run_benchmark;
use narrowdb::{DbOptions, NarrowDb};

fn main() -> Result<()> {
    let args = std::env::args().collect::<Vec<_>>();
    if args.len() < 2 {
        print_usage();
        return Ok(());
    }

    match args[1].as_str() {
        "exec" => exec_command(&args),
        "bench" => bench_command(&args),
        _ => {
            print_usage();
            Ok(())
        }
    }
}

fn exec_command(args: &[String]) -> Result<()> {
    if args.len() < 4 {
        bail!("usage: narrowdb exec <db-file> <sql>");
    }
    let db = NarrowDb::open(&args[2], DbOptions::default())?;
    let results = db.execute_sql(&args[3])?;
    for result in results {
        if result.columns.is_empty() {
            continue;
        }
        println!("{}", result.columns.join(" | "));
        for row in result.rows {
            println!(
                "{}",
                row.iter()
                    .map(ToString::to_string)
                    .collect::<Vec<_>>()
                    .join(" | ")
            );
        }
    }
    Ok(())
}

fn bench_command(args: &[String]) -> Result<()> {
    if args.len() < 3 {
        bail!("usage: narrowdb bench <db-file> [rows]");
    }
    let rows = args
        .get(3)
        .map(|value| value.parse::<usize>().context("rows must be an integer"))
        .transpose()?
        .unwrap_or(1_000_000);
    run_benchmark(&args[2], rows)
}

fn print_usage() {
    println!("narrowdb");
    println!("  exec  <db-file> <sql>");
    println!("  bench <db-file> [rows]");
}