cherry 0.2.1

An asynchronous ORM, which support MySQL, PostgreSQL, SQLite and SQL Server.
pub(crate) type Result<T> = std::result::Result<T, anyhow::Error>;

pub struct QueryResult {
    rows_affected: u64,
    #[cfg(any(feature = "mysql"))]
    last_insert_id: u64,
    #[cfg(feature = "sqlite")]
    last_insert_rowid: i64,
}

impl QueryResult {
    pub fn rows_affected(&self) -> u64 {
        self.rows_affected
    }

    #[cfg(feature = "mysql")]
    pub fn last_insert_id(&self) -> u64 {
        self.last_insert_id
    }

    #[cfg(feature = "sqlite")]
    pub fn last_insert_rowid(&self) -> i64 {
        self.last_insert_rowid
    }
}

macro_rules! gen_types {
    ($db: ty, $arg: ty, $row: ty, $qr: ty) => {
        pub type Database = $db;
        pub(crate) type Pool = sqlx::pool::Pool<$db>;
        pub type Transaction<'a> = sqlx::Transaction<'a, $db>;
        pub type Arguments<'a> = $arg;
        pub type Row = $row;

        impl QueryResult {
            pub(crate) fn from(result: $qr) -> Self {
                Self {
                    rows_affected: result.rows_affected(),
                    #[cfg(feature = "mysql")]
                    last_insert_id: result.last_insert_id(),
                    #[cfg(feature = "sqlite")]
                    last_insert_rowid: result.last_insert_rowid(),
                }
            }
        }
    };
}

#[cfg(feature = "mysql")]
gen_types!(sqlx::MySql, sqlx::mysql::MySqlArguments, sqlx::mysql::MySqlRow, sqlx::mysql::MySqlQueryResult);
#[cfg(feature = "postgres")]
gen_types!(sqlx::Postgres, sqlx::postgres::PgArguments, sqlx::postgres::PgRow, sqlx::postgres::PgQueryResult);
#[cfg(feature = "sqlite")]
gen_types!(sqlx::Sqlite, sqlx::sqlite::SqliteArguments<'a>, sqlx::sqlite::SqliteRow, sqlx::sqlite::SqliteQueryResult);
#[cfg(feature = "mssql")]
gen_types!(sqlx::Mssql, sqlx::mssql::MssqlArguments, sqlx::mssql::MssqlRow, sqlx::mssql::MssqlQueryResult);