sea-schema-sync 0.17.0-rc.16

🌿 SQL schema definition and discovery
Documentation
pub use rusqlite::{Connection as RusqliteConnection, Error as RusqliteError};
use rusqlite::{
    Error, Row as RawRow,
    types::{FromSql, Value},
};
use sea_query_rusqlite::rusqlite;

pub type Row = RusqliteRow;

#[derive(Debug)]
pub struct RusqliteRow {
    pub values: Vec<Value>,
}

impl RusqliteRow {
    pub fn from_row(row: &RawRow) -> Self {
        let mut values = Vec::new();

        let mut i = 0;
        loop {
            let v: Value = match row.get(i) {
                Ok(v) => v,
                Err(Error::InvalidColumnIndex(_)) => break,
                Err(err) => panic!("{err:?}"),
            };
            values.push(v);
            i += 1;
        }

        Self { values }
    }

    pub fn get<T: FromSql>(&self, idx: usize) -> T {
        let value = &self.values[idx];
        FromSql::column_result(value.into()).unwrap_or_else(|e| panic!("{e:?}: actual: {value:?}"))
    }

    pub fn sqlite(self) -> Self {
        self
    }
}

#[cfg(feature = "rusqlite")]
pub fn connect_sqlite(url: &str) -> Result<RusqliteConnection, RusqliteError> {
    RusqliteConnection::open(
        url.trim_start_matches("sqlite://")
            .trim_start_matches("sqlite:"),
    )
}

#[cfg(feature = "rusqlite")]
pub fn execute_sqlite(conn: &RusqliteConnection, sql: &str) -> Result<(), RusqliteError> {
    conn.execute_batch(&sql)?;
    Ok(())
}