Skip to main content

diesel/mariadb/
backend.rs

1use crate::backend::sql_dialect::returning_clause::SupportsReturningClause;
2use crate::backend::{
3    Backend, DieselReserveSpecialization, SqlDialect, TrustedBackend, sql_dialect,
4};
5use crate::mariadb::{MariadbQueryBuilder, MariadbValue};
6use crate::mysql_like::query_fragments::MySqlLikeBatchUpdateSupport;
7use crate::mysql_like::{MapErrorNumber, MysqlLikeBackend};
8use crate::query_builder::bind_collector::RawBytesBindCollector;
9use crate::result::DatabaseErrorKind;
10use crate::sql_types::TypeMetadata;
11
12/// The MariaDB backend
13#[derive(#[automatically_derived]
impl ::core::fmt::Debug for Mariadb {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f, "Mariadb")
    }
}Debug, #[automatically_derived]
impl ::core::marker::Copy for Mariadb { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Mariadb { }
#[automatically_derived]
impl ::core::clone::Clone for Mariadb {
    #[inline]
    fn clone(&self) -> Mariadb { *self }
}Clone, #[automatically_derived]
impl ::core::hash::Hash for Mariadb {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {}
}Hash, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Mariadb { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Mariadb {
    #[inline]
    fn eq(&self, other: &Mariadb) -> bool { true }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Mariadb {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::default::Default for Mariadb {
    #[inline]
    fn default() -> Mariadb { Mariadb {} }
}Default)]
14pub struct Mariadb;
15
16/// Represents possible types, that can be transmitted as via the
17/// Mysql wire protocol
18pub type MariadbType = crate::mysql_like::MysqlType;
19
20impl Backend for Mariadb {
21    type QueryBuilder = MariadbQueryBuilder;
22    type RawValue<'a> = MariadbValue<'a>;
23    type BindCollector<'a> = RawBytesBindCollector<Self>;
24}
25
26impl TypeMetadata for Mariadb {
27    type TypeMetadata = MariadbType;
28
29    type MetadataLookup = ();
30}
31
32impl SqlDialect for Mariadb {
33    type ReturningClause = MariadbReturningClause;
34
35    type OnConflictClause = MariadbOnConflictClause;
36
37    type InsertWithDefaultKeyword = sql_dialect::default_keyword_for_insert::IsoSqlDefaultKeyword;
38    type BatchInsertSupport = sql_dialect::batch_insert_support::PostgresLikeBatchInsertSupport;
39    type DefaultValueClauseForInsert = MariadbStyleDefaultValueClause;
40
41    type BatchUpdateSupport = MySqlLikeBatchUpdateSupport;
42
43    type EmptyFromClauseSyntax = sql_dialect::from_clause_syntax::AnsiSqlFromClauseSyntax;
44    type SelectStatementSyntax = sql_dialect::select_statement_syntax::AnsiSqlSelectStatement;
45
46    type ExistsSyntax = sql_dialect::exists_syntax::AnsiSqlExistsSyntax;
47    type ArrayComparison = sql_dialect::array_comparison::AnsiSqlArrayComparison;
48
49    type ConcatClause = MariadbConcatClause;
50    type AliasSyntax = sql_dialect::alias_syntax::AsAliasSyntax;
51
52    type WindowFrameClauseGroupSupport =
53        sql_dialect::window_frame_clause_group_support::NoGroupWindowFrameUnit;
54
55    type WindowFrameExclusionSupport =
56        sql_dialect::window_frame_exclusion_support::NoFrameFrameExclusionSupport;
57
58    type AggregateFunctionExpressions =
59        sql_dialect::aggregate_function_expressions::NoAggregateFunctionExpressions;
60
61    type BuiltInWindowFunctionRequireOrder = MariadbRequiresOrderForWindowFunctions;
62}
63
64impl DieselReserveSpecialization for Mariadb {}
65impl TrustedBackend for Mariadb {}
66
67pub(crate) type MariadbOnConflictClause = crate::mysql_like::query_fragments::MysqlOnConflictClause;
68pub(crate) type MariadbStyleDefaultValueClause =
69    crate::mysql_like::query_fragments::MysqlStyleDefaultValueClause;
70pub(crate) type MariadbConcatClause = crate::mysql_like::query_fragments::MysqlConcatClause;
71pub(crate) type MariadbRequiresOrderForWindowFunctions =
72    crate::mysql_like::query_fragments::MysqlRequiresOrderForWindowFunctions;
73
74#[derive(#[automatically_derived]
impl ::core::fmt::Debug for MariadbReturningClause {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f, "MariadbReturningClause")
    }
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MariadbReturningClause { }
#[automatically_derived]
impl ::core::clone::Clone for MariadbReturningClause {
    #[inline]
    fn clone(&self) -> MariadbReturningClause { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MariadbReturningClause { }Copy)]
75pub struct MariadbReturningClause;
76
77impl SupportsReturningClause for MariadbReturningClause {}
78
79impl MysqlLikeBackend for Mariadb {
80    const SCHEME: &'static str = "mariadb";
81}
82
83impl MapErrorNumber for Mariadb {
84    fn map_error_number(error_number: u32) -> crate::result::DatabaseErrorKind {
85        // These values are not exposed by the C API, but are documented
86        // at https://mariadb.com/docs/server/reference/error-codes/mariadb-error-code-reference
87        match error_number {
88            1022 | 1062 | 1586 | 1859 => DatabaseErrorKind::UniqueViolation,
89            1216 | 1217 | 1451 | 1557 | 1452 | 1830 | 1834 => {
90                DatabaseErrorKind::ForeignKeyViolation
91            }
92            1792 => DatabaseErrorKind::ReadOnlyTransaction,
93            1048 | 1364 => DatabaseErrorKind::NotNullViolation,
94            4025 => DatabaseErrorKind::CheckViolation,
95            1213 => DatabaseErrorKind::SerializationFailure,
96            _ => DatabaseErrorKind::Unknown,
97        }
98    }
99}