1 //! Types which represent various database backends
2 
3 use byteorder::ByteOrder;
4 
5 use query_builder::bind_collector::BindCollector;
6 use query_builder::QueryBuilder;
7 use sql_types::{self, HasSqlType};
8 
9 /// A database backend
10 ///
11 /// This trait represents the concept of a backend (e.g. "MySQL" vs "SQLite").
12 /// It is separate from a [`Connection`](../connection/trait.Connection.html)
13 /// to that backend.
14 /// One backend may have multiple concrete connection implementations.
15 ///
16 /// Implementations of this trait should not assume details about how the
17 /// connection is implemented.
18 /// For example, the `Pg` backend does not assume that `libpq` is being used.
19 /// Implementations of this trait can and should care about details of the wire
20 /// protocol used to communicated with the database.
21 pub trait Backend
22 where
23     Self: Sized,
24     Self: HasSqlType<sql_types::SmallInt>,
25     Self: HasSqlType<sql_types::Integer>,
26     Self: HasSqlType<sql_types::BigInt>,
27     Self: HasSqlType<sql_types::Float>,
28     Self: HasSqlType<sql_types::Double>,
29     Self: HasSqlType<sql_types::VarChar>,
30     Self: HasSqlType<sql_types::Text>,
31     Self: HasSqlType<sql_types::Binary>,
32     Self: HasSqlType<sql_types::Date>,
33     Self: HasSqlType<sql_types::Time>,
34     Self: HasSqlType<sql_types::Timestamp>,
35 {
36     /// The concrete `QueryBuilder` implementation for this backend.
37     type QueryBuilder: QueryBuilder<Self>;
38     /// The concrete `BindCollector` implementation for this backend.
39     ///
40     /// Most backends should use [`RawBytesBindCollector`].
41     ///
42     /// [`RawBytesBindCollector`]: ../query_builder/bind_collector/struct.RawBytesBindCollector.html
43     type BindCollector: BindCollector<Self>;
44     /// The raw representation of a database value given to `FromSql`.
45     ///
46     /// Since most backends transmit data as opaque blobs of bytes, this type
47     /// is usually `[u8]`.
48     type RawValue: ?Sized;
49     /// What byte order is used to transmit integers?
50     ///
51     /// This type is only used if `RawValue` is `[u8]`.
52     type ByteOrder: ByteOrder;
53 }
54 
55 /// Does this backend support `RETURNING` clauses?
56 pub trait SupportsReturningClause {}
57 /// Does this backend support the bare `DEFAULT` keyword?
58 pub trait SupportsDefaultKeyword {}
59 /// Does this backend use the standard `SAVEPOINT` syntax?
60 pub trait UsesAnsiSavepointSyntax {}
61 
62 #[cfg(feature = "with-deprecated")]
63 #[deprecated(since = "1.1.0", note = "use `sql_types::TypeMetadata` instead")]
64 pub use sql_types::TypeMetadata;
65