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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#[allow(unused_imports)]
use proc_macro::{self, TokenStream};

#[cfg(feature = "rusqlite")]
mod rusqlite;
#[cfg(feature = "sqlx-mysql")]
mod sqlx_mysql;
#[cfg(feature = "sqlx-postgres")]
mod sqlx_postgres;
#[cfg(feature = "sqlx-sqlite")]
mod sqlx_sqlite;
#[cfg(any(
    feature = "rusqlite",
    feature = "sqlx-mysql",
    feature = "sqlx-postgres",
    feature = "sqlx-sqlite"
))]
mod utils;

/// Macro for generate `rusqlite` driver.
///
/// Examples:
/// ```
/// sea_query::sea_query_driver_rusqlite!()
/// ```
///
/// Specify a path to the `rusqlite` crate instance
/// ```
/// sea_query::sea_query_driver_rusqlite!(rusqlite = "...")
/// ```
///
/// Specify a path to the `sea-query` crate instance
/// ```
/// sea_query::sea_query_driver_rusqlite!(sea_query = "...")
/// ```
///
/// Specify paths to the `sea-query` and to the `rusqlite` crates instances
/// ```
/// sea_query::sea_query_driver_rusqlite!(rusqlite="...", sea_query="...")
/// // or
/// sea_query::sea_query_driver_rusqlite!(sea_query="...", rusqlite="...")
/// ```
#[cfg(feature = "rusqlite")]
#[proc_macro]
pub fn sea_query_driver_rusqlite(input: TokenStream) -> TokenStream {
    rusqlite::sea_query_driver_rusqlite_impl(input)
}

/// Macro for generate new mod for sqlx-mysql.
///
/// Examples:
/// ```
/// sea_query::sea_query_driver_mysql!()
/// ```
///
/// Specify a path to the `sqlx` crate instance
/// ```
/// sea_query::sea_query_driver_mysql!(sqlx = "...")
/// ```
///
/// Specify a path to the `sea-query` crate instance
/// ```
/// sea_query::sea_query_driver_mysql!(sea_query = "...")
/// ```
///
/// Specify pathes to the `sea-query` and to the `sqlx` crates instances
/// ```
/// sea_query::sea_query_driver_mysql!(sqlx="...", sea_query="...")
/// // or
/// sea_query::sea_query_driver_mysql!(sea_query="...", sqlx="...")
/// ```
#[cfg(feature = "sqlx-mysql")]
#[proc_macro]
pub fn sea_query_driver_mysql(input: TokenStream) -> TokenStream {
    sqlx_mysql::sea_query_driver_mysql_impl(input)
}

/// Macro to easily bind [`Values`] to [`sqlx::query::Query`] or to [`sqlx::query::QueryAs`] for sqlx-mysql.
#[cfg(feature = "sqlx-mysql")]
#[proc_macro]
pub fn bind_params_sqlx_mysql(input: TokenStream) -> TokenStream {
    sqlx_mysql::bind_params_sqlx_mysql_impl(input)
}

/// Macro to generate sqlx-postgres driver.
///
/// Examples:
/// ```
/// sea_query::sea_query_driver_postgres!()
/// ```
///
/// Specify a path to the `sqlx` crate instance
/// ```
/// sea_query::sea_query_driver_postgres!(sqlx = "...")
/// ```
///
/// Specify a path to the `sea-query` crate instance
/// ```
/// sea_query::sea_query_driver_postgres!(sea_query = "...")
/// ```
///
/// Specify pathes to the `sea-query` and to the `sqlx` crates instances
/// ```
/// sea_query::sea_query_driver_postgres!(sqlx="...", sea_query="...")
/// // or
/// sea_query::sea_query_driver_postgres!(sea_query="...", sqlx="...")
/// ```
#[cfg(feature = "sqlx-postgres")]
#[proc_macro]
pub fn sea_query_driver_postgres(input: TokenStream) -> TokenStream {
    sqlx_postgres::sea_query_driver_postgres_impl(input)
}

/// Macro to easily bind [`Values`] to [`sqlx::query::Query`] or to [`sqlx::query::QueryAs`] for sqlx-postgres.
#[cfg(feature = "sqlx-postgres")]
#[proc_macro]
pub fn bind_params_sqlx_postgres(input: TokenStream) -> TokenStream {
    sqlx_postgres::bind_params_sqlx_postgres_impl(input)
}

/// Macro to generate sqlx-sqlite driver.
///
/// Examples:
/// ```
/// sea_query::sea_query_driver_sqlite!()
/// ```
///
/// Specify a path to the `sqlx` crate instance
/// ```
/// sea_query::sea_query_driver_sqlite!(sqlx = "...")
/// ```
///
/// Specify a path to the `sea-query` crate instance
/// ```
/// sea_query::sea_query_driver_sqlite!(sea_query = "...")
/// ```
///
/// Specify pathes to the `sea-query` and to the `sqlx` crates instances
/// ```
/// sea_query::sea_query_driver_sqlite!(sqlx="...", sea_query="...")
/// // or
/// sea_query::sea_query_driver_sqlite!(sea_query="...", sqlx="...")
/// ```
#[cfg(feature = "sqlx-sqlite")]
#[proc_macro]
pub fn sea_query_driver_sqlite(input: TokenStream) -> TokenStream {
    sqlx_sqlite::sea_query_driver_sqlite_impl(input)
}

/// Macro to easily bind [`Values`] to [`sqlx::query::Query`] or to [`sqlx::query::QueryAs`] for sqlx-sqlite.
#[cfg(feature = "sqlx-sqlite")]
#[proc_macro]
pub fn bind_params_sqlx_sqlite(input: TokenStream) -> TokenStream {
    sqlx_sqlite::bind_params_sqlx_sqlite(input)
}