use sqlx_core::database::{Database, HasStatementCache};

use crate::{
    arguments::{ExaArguments, ExaBuffer},
    column::ExaColumn,
    connection::ExaConnection,
    query_result::ExaQueryResult,
    row::ExaRow,
    statement::ExaStatement,
    transaction::ExaTransactionManager,
    type_info::ExaTypeInfo,
    value::{ExaValue, ExaValueRef},
};

#[derive(Debug, Clone, Copy)]
pub struct Exasol;

impl Database for Exasol {
    type Connection = ExaConnection;

    type TransactionManager = ExaTransactionManager;

    type Row = ExaRow;

    type QueryResult = ExaQueryResult;

    type Column = ExaColumn;

    type TypeInfo = ExaTypeInfo;

    type Value = ExaValue;

    const NAME: &'static str = "Exasol";

    const URL_SCHEMES: &'static [&'static str] = &["exa"];

    type ValueRef<'r> = ExaValueRef<'r>;

    type Arguments<'q> = ExaArguments;

    type ArgumentBuffer<'q> = ExaBuffer;

    type Statement<'q> = ExaStatement<'q>;
}

impl HasStatementCache for Exasol {}