Skip to main content

chunkshop/backends/
mod.rs

1//! Backend module — connection management + dialect helpers per DB engine.
2
3use anyhow::Result;
4
5use crate::config::TargetConfig;
6
7pub mod base;
8pub mod clickhouse;
9pub mod mariadb;
10pub mod postgres;
11pub mod sqlite;
12
13pub use base::{Backend, BackendConn, BackendDialect, ColSpec};
14pub use clickhouse::ClickhouseBackend;
15pub use mariadb::MariadbBackend;
16pub use postgres::PostgresBackend;
17pub use sqlite::SQLiteBackend;
18
19/// Transport sum type — used by the loader to hand a backend to load_sink,
20/// where it's pattern-matched back to a concrete type. Sinks store concrete
21/// backends (PgSink holds PostgresBackend), not AnyBackend. So this enum does
22/// NOT impl Backend / BackendDialect / BackendConn — no match-delegate
23/// boilerplate. R2/R3/R4 add new variants.
24pub enum AnyBackend {
25    Postgres(PostgresBackend),
26    Mariadb(MariadbBackend),
27    Sqlite(SQLiteBackend),
28    Clickhouse(ClickhouseBackend),
29}
30
31pub fn load_backend(cfg: &TargetConfig) -> Result<AnyBackend> {
32    match cfg {
33        TargetConfig::Postgres(t) => Ok(AnyBackend::Postgres(PostgresBackend::new(
34            t.dsn_env.clone(),
35        ))),
36        TargetConfig::Mariadb(t) => Ok(AnyBackend::Mariadb(MariadbBackend::new(t.dsn_env.clone()))),
37        TargetConfig::Sqlite(t) => Ok(AnyBackend::Sqlite(SQLiteBackend::new(t.dsn_env.clone()))),
38        TargetConfig::Clickhouse(t) => Ok(AnyBackend::Clickhouse(ClickhouseBackend::new(
39            t.dsn_env.clone(),
40        ))),
41    }
42}