rjango 0.1.1

A full-stack Rust backend framework inspired by Django
Documentation
/// Base database backend trait.
pub trait DatabaseBackend: Send + Sync {
    fn name(&self) -> &str;

    fn display_name(&self) -> &str {
        self.name()
    }

    fn supports_transactions(&self) -> bool {
        true
    }

    fn supports_json_field(&self) -> bool {
        true
    }

    fn supports_partial_indexes(&self) -> bool {
        true
    }

    fn supports_expression_indexes(&self) -> bool {
        true
    }

    fn supports_covering_indexes(&self) -> bool {
        false
    }

    fn supports_column_check_constraints(&self) -> bool {
        true
    }

    fn supports_table_check_constraints(&self) -> bool {
        true
    }

    fn supports_sequence_reset(&self) -> bool {
        true
    }

    fn supports_foreign_keys(&self) -> bool {
        true
    }

    /// Quote an identifier for this backend.
    fn quote_name(&self, name: &str) -> String;

    /// Map a field type label to a DB-specific SQL type.
    fn db_type(&self, field_type: &str) -> String;

    /// Return the SQL for getting the last insert ID.
    fn last_insert_id_sql(&self, table: &str, pk_name: &str) -> String;

    /// Format a duration value for this backend.
    fn format_for_duration_arithmetic(&self, sql: &str) -> String {
        sql.to_string()
    }

    /// SQL to start a savepoint.
    fn savepoint_create_sql(&self, sid: &str) -> String {
        format!("SAVEPOINT {}", self.quote_name(sid))
    }

    /// SQL to release a savepoint.
    fn savepoint_release_sql(&self, sid: &str) -> String {
        format!("RELEASE SAVEPOINT {}", self.quote_name(sid))
    }

    /// SQL to rollback to a savepoint.
    fn savepoint_rollback_sql(&self, sid: &str) -> String {
        format!("ROLLBACK TO SAVEPOINT {}", self.quote_name(sid))
    }
}

#[cfg(test)]
mod tests {
    use super::DatabaseBackend;

    struct TestBackend;

    impl DatabaseBackend for TestBackend {
        fn name(&self) -> &str {
            "test"
        }

        fn quote_name(&self, name: &str) -> String {
            format!("[{name}]")
        }

        fn db_type(&self, field_type: &str) -> String {
            field_type.to_string()
        }

        fn last_insert_id_sql(&self, table: &str, pk_name: &str) -> String {
            format!("SELECT {table}.{pk_name}")
        }
    }

    #[test]
    fn test_savepoint_sql_default() {
        let backend = TestBackend;

        assert_eq!(backend.savepoint_create_sql("sp1"), "SAVEPOINT [sp1]");
        assert_eq!(
            backend.savepoint_release_sql("sp1"),
            "RELEASE SAVEPOINT [sp1]"
        );
        assert_eq!(
            backend.savepoint_rollback_sql("sp1"),
            "ROLLBACK TO SAVEPOINT [sp1]"
        );
    }
}