1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
use std::fmt::Display; use crate::arguments::Arguments; use crate::connection::Connect; use crate::cursor::Cursor; use crate::row::Row; use crate::types::TypeInfo; /// A database driver. /// /// This trait encapsulates a complete driver implementation to a specific /// database (e.g., **MySQL**, **Postgres**). pub trait Database where Self: Sized + Send + 'static, Self: for<'c> HasRow<'c, Database = Self>, Self: for<'c> HasRawValue<'c>, Self: for<'c, 'q> HasCursor<'c, 'q, Database = Self>, { /// The concrete `Connection` implementation for this database. type Connection: Connect<Database = Self>; /// The concrete `Arguments` implementation for this database. type Arguments: Arguments<Database = Self>; /// The concrete `TypeInfo` implementation for this database. type TypeInfo: TypeInfo; /// The Rust type of table identifiers for this database. type TableId: Display + Clone; /// The Rust type used as the buffer when encoding arguments. /// /// For example, **Postgres** and **MySQL** use `Vec<u8>`; however, **SQLite** uses `Vec<SqliteArgumentValue>`. type RawBuffer: Default; } /// Associate [`Database`] with a `RawValue` of a generic lifetime. /// /// --- /// /// The upcoming Rust feature, [Generic Associated Types], should obviate /// the need for this trait. /// /// [Generic Associated Types]: https://www.google.com/search?q=generic+associated+types+rust&oq=generic+associated+types+rust&aqs=chrome..69i57j0l5.3327j0j7&sourceid=chrome&ie=UTF-8 pub trait HasRawValue<'c> { /// The Rust type used to hold a not-yet-decoded value that has just been /// received from the database. /// /// For example, **Postgres** and **MySQL** use `&'c [u8]`; however, **SQLite** uses `SqliteValue<'c>`. type RawValue; } /// Associate [`Database`] with a [`Cursor`] of a generic lifetime. /// /// --- /// /// The upcoming Rust feature, [Generic Associated Types], should obviate /// the need for this trait. /// /// [Generic Associated Types]: https://www.google.com/search?q=generic+associated+types+rust&oq=generic+associated+types+rust&aqs=chrome..69i57j0l5.3327j0j7&sourceid=chrome&ie=UTF-8 pub trait HasCursor<'c, 'q> { type Database: Database; /// The concrete `Cursor` implementation for this database. type Cursor: Cursor<'c, 'q, Database = Self::Database>; } /// Associate [`Database`] with a [`Row`] of a generic lifetime. /// /// --- /// /// The upcoming Rust feature, [Generic Associated Types], should obviate /// the need for this trait. /// /// [Generic Associated Types]: https://www.google.com/search?q=generic+associated+types+rust&oq=generic+associated+types+rust&aqs=chrome..69i57j0l5.3327j0j7&sourceid=chrome&ie=UTF-8 pub trait HasRow<'c> { type Database: Database; /// The concrete `Row` implementation for this database. type Row: Row<'c, Database = Self::Database>; }