use clap::Parser; use metrics_exporter_prometheus::PrometheusBuilder; use r2d2_sqlite::SqliteConnectionManager; mod analysis; mod config; mod ingest; mod lex; mod mbz; mod server; mod utils; pub type SqlitePool = r2d2::Pool; pub type SqliteConnection = r2d2::PooledConnection; #[tokio::main] async fn main() -> eyre::Result<()> { tracing_subscriber::fmt::init(); PrometheusBuilder::new().install()?; let config = config::Config::parse(); let manager = SqliteConnectionManager::file(&config.db).with_init(|conn| { conn.pragma_update(None, "journal_mode", "WAL")?; conn.pragma_update(None, "synchronous", "NORMAL")?; conn.pragma_update(None, "cache_size", -16 * 1024)?; // 64MB conn.execute_batch(include_str!("init.sql")) }); let pool = r2d2::Pool::new(manager)?; let replication_agent = mbz::ReplicationAgent::new(pool.clone(), config.db, config.mb_agent); let mut tasks = tokio::task::JoinSet::new(); tasks.spawn(server::start_server(pool.clone(), config.port)); tasks.spawn(ingest::tapstream(pool, config.tap)); tasks.spawn(replication_agent.start()); tasks.join_all().await; Ok(()) }