1use crate::any::{Any, AnyTypeInfo};
2use crate::column::{Column, ColumnIndex};
3
4#[cfg(feature = "postgres")]
5use crate::postgres::{PgColumn, PgRow, PgStatement};
6
7#[cfg(feature = "mysql")]
8use crate::mysql::{MySqlColumn, MySqlRow, MySqlStatement};
9
10#[cfg(feature = "sqlite")]
11use crate::sqlite::{SqliteColumn, SqliteRow, SqliteStatement};
12
13#[cfg(feature = "mssql")]
14use crate::mssql::{MssqlColumn, MssqlRow, MssqlStatement};
15
16#[derive(Debug, Clone)]
17pub struct AnyColumn {
18 pub(crate) kind: AnyColumnKind,
19 pub(crate) type_info: AnyTypeInfo,
20}
21
22impl crate::column::private_column::Sealed for AnyColumn {}
23
24#[derive(Debug, Clone)]
25pub(crate) enum AnyColumnKind {
26 #[cfg(feature = "postgres")]
27 Postgres(PgColumn),
28
29 #[cfg(feature = "mysql")]
30 MySql(MySqlColumn),
31
32 #[cfg(feature = "sqlite")]
33 Sqlite(SqliteColumn),
34
35 #[cfg(feature = "mssql")]
36 Mssql(MssqlColumn),
37}
38
39impl Column for AnyColumn {
40 type Database = Any;
41
42 fn ordinal(&self) -> usize {
43 match &self.kind {
44 #[cfg(feature = "postgres")]
45 AnyColumnKind::Postgres(row) => row.ordinal(),
46
47 #[cfg(feature = "mysql")]
48 AnyColumnKind::MySql(row) => row.ordinal(),
49
50 #[cfg(feature = "sqlite")]
51 AnyColumnKind::Sqlite(row) => row.ordinal(),
52
53 #[cfg(feature = "mssql")]
54 AnyColumnKind::Mssql(row) => row.ordinal(),
55 }
56 }
57
58 fn name(&self) -> &str {
59 match &self.kind {
60 #[cfg(feature = "postgres")]
61 AnyColumnKind::Postgres(row) => row.name(),
62
63 #[cfg(feature = "mysql")]
64 AnyColumnKind::MySql(row) => row.name(),
65
66 #[cfg(feature = "sqlite")]
67 AnyColumnKind::Sqlite(row) => row.name(),
68
69 #[cfg(feature = "mssql")]
70 AnyColumnKind::Mssql(row) => row.name(),
71 }
72 }
73
74 fn type_info(&self) -> &AnyTypeInfo {
75 &self.type_info
76 }
77}
78
79#[cfg(all(
85 feature = "postgres",
86 feature = "mysql",
87 feature = "mssql",
88 feature = "sqlite"
89))]
90pub trait AnyColumnIndex:
91 ColumnIndex<PgRow>
92 + for<'q> ColumnIndex<PgStatement<'q>>
93 + ColumnIndex<MySqlRow>
94 + for<'q> ColumnIndex<MySqlStatement<'q>>
95 + ColumnIndex<MssqlRow>
96 + for<'q> ColumnIndex<MssqlStatement<'q>>
97 + ColumnIndex<SqliteRow>
98 + for<'q> ColumnIndex<SqliteStatement<'q>>
99{
100}
101
102#[cfg(all(
103 feature = "postgres",
104 feature = "mysql",
105 feature = "mssql",
106 feature = "sqlite"
107))]
108impl<I: ?Sized> AnyColumnIndex for I where
109 I: ColumnIndex<PgRow>
110 + for<'q> ColumnIndex<PgStatement<'q>>
111 + ColumnIndex<MySqlRow>
112 + for<'q> ColumnIndex<MySqlStatement<'q>>
113 + ColumnIndex<MssqlRow>
114 + for<'q> ColumnIndex<MssqlStatement<'q>>
115 + ColumnIndex<SqliteRow>
116 + for<'q> ColumnIndex<SqliteStatement<'q>>
117{
118}
119
120#[cfg(all(
123 not(feature = "mssql"),
124 all(feature = "postgres", feature = "mysql", feature = "sqlite")
125))]
126pub trait AnyColumnIndex:
127 ColumnIndex<PgRow>
128 + for<'q> ColumnIndex<PgStatement<'q>>
129 + ColumnIndex<MySqlRow>
130 + for<'q> ColumnIndex<MySqlStatement<'q>>
131 + ColumnIndex<SqliteRow>
132 + for<'q> ColumnIndex<SqliteStatement<'q>>
133{
134}
135
136#[cfg(all(
137 not(feature = "mssql"),
138 all(feature = "postgres", feature = "mysql", feature = "sqlite")
139))]
140impl<I: ?Sized> AnyColumnIndex for I where
141 I: ColumnIndex<PgRow>
142 + for<'q> ColumnIndex<PgStatement<'q>>
143 + ColumnIndex<MySqlRow>
144 + for<'q> ColumnIndex<MySqlStatement<'q>>
145 + ColumnIndex<SqliteRow>
146 + for<'q> ColumnIndex<SqliteStatement<'q>>
147{
148}
149
150#[cfg(all(
151 not(feature = "mysql"),
152 all(feature = "postgres", feature = "mssql", feature = "sqlite")
153))]
154pub trait AnyColumnIndex:
155 ColumnIndex<PgRow>
156 + for<'q> ColumnIndex<PgStatement<'q>>
157 + ColumnIndex<MssqlRow>
158 + for<'q> ColumnIndex<MssqlStatement<'q>>
159 + ColumnIndex<SqliteRow>
160 + for<'q> ColumnIndex<SqliteStatement<'q>>
161{
162}
163
164#[cfg(all(
165 not(feature = "mysql"),
166 all(feature = "postgres", feature = "mssql", feature = "sqlite")
167))]
168impl<I: ?Sized> AnyColumnIndex for I where
169 I: ColumnIndex<PgRow>
170 + for<'q> ColumnIndex<PgStatement<'q>>
171 + ColumnIndex<MssqlRow>
172 + for<'q> ColumnIndex<MssqlStatement<'q>>
173 + ColumnIndex<SqliteRow>
174 + for<'q> ColumnIndex<SqliteStatement<'q>>
175{
176}
177
178#[cfg(all(
179 not(feature = "sqlite"),
180 all(feature = "postgres", feature = "mysql", feature = "mssql")
181))]
182pub trait AnyColumnIndex:
183 ColumnIndex<PgRow>
184 + for<'q> ColumnIndex<PgStatement<'q>>
185 + ColumnIndex<MySqlRow>
186 + for<'q> ColumnIndex<MySqlStatement<'q>>
187 + ColumnIndex<MssqlRow>
188 + for<'q> ColumnIndex<MssqlStatement<'q>>
189{
190}
191
192#[cfg(all(
193 not(feature = "sqlite"),
194 all(feature = "postgres", feature = "mysql", feature = "mssql")
195))]
196impl<I: ?Sized> AnyColumnIndex for I where
197 I: ColumnIndex<PgRow>
198 + for<'q> ColumnIndex<PgStatement<'q>>
199 + ColumnIndex<MySqlRow>
200 + for<'q> ColumnIndex<MySqlStatement<'q>>
201 + ColumnIndex<MssqlRow>
202 + for<'q> ColumnIndex<MssqlStatement<'q>>
203{
204}
205
206#[cfg(all(
207 not(feature = "postgres"),
208 all(feature = "sqlite", feature = "mysql", feature = "mssql")
209))]
210pub trait AnyColumnIndex:
211 ColumnIndex<SqliteRow>
212 + for<'q> ColumnIndex<SqliteStatement<'q>>
213 + ColumnIndex<MySqlRow>
214 + for<'q> ColumnIndex<MySqlStatement<'q>>
215 + ColumnIndex<MssqlRow>
216 + for<'q> ColumnIndex<MssqlStatement<'q>>
217{
218}
219
220#[cfg(all(
221 not(feature = "postgres"),
222 all(feature = "sqlite", feature = "mysql", feature = "mssql")
223))]
224impl<I: ?Sized> AnyColumnIndex for I where
225 I: ColumnIndex<SqliteRow>
226 + for<'q> ColumnIndex<SqliteStatement<'q>>
227 + ColumnIndex<MySqlRow>
228 + for<'q> ColumnIndex<MySqlStatement<'q>>
229 + ColumnIndex<MssqlRow>
230 + for<'q> ColumnIndex<MssqlStatement<'q>>
231{
232}
233
234#[cfg(all(
237 not(any(feature = "mssql", feature = "sqlite")),
238 all(feature = "postgres", feature = "mysql")
239))]
240pub trait AnyColumnIndex:
241 ColumnIndex<PgRow>
242 + for<'q> ColumnIndex<PgStatement<'q>>
243 + ColumnIndex<MySqlRow>
244 + for<'q> ColumnIndex<MySqlStatement<'q>>
245{
246}
247
248#[cfg(all(
249 not(any(feature = "mssql", feature = "sqlite")),
250 all(feature = "postgres", feature = "mysql")
251))]
252impl<I: ?Sized> AnyColumnIndex for I where
253 I: ColumnIndex<PgRow>
254 + for<'q> ColumnIndex<PgStatement<'q>>
255 + ColumnIndex<MySqlRow>
256 + for<'q> ColumnIndex<MySqlStatement<'q>>
257{
258}
259
260#[cfg(all(
261 not(any(feature = "mysql", feature = "sqlite")),
262 all(feature = "postgres", feature = "mssql")
263))]
264pub trait AnyColumnIndex:
265 ColumnIndex<PgRow>
266 + for<'q> ColumnIndex<PgStatement<'q>>
267 + ColumnIndex<MssqlRow>
268 + for<'q> ColumnIndex<MssqlStatement<'q>>
269{
270}
271
272#[cfg(all(
273 not(any(feature = "mysql", feature = "sqlite")),
274 all(feature = "postgres", feature = "mssql")
275))]
276impl<I: ?Sized> AnyColumnIndex for I where
277 I: ColumnIndex<PgRow>
278 + for<'q> ColumnIndex<PgStatement<'q>>
279 + ColumnIndex<MssqlRow>
280 + for<'q> ColumnIndex<MssqlStatement<'q>>
281{
282}
283
284#[cfg(all(
285 not(any(feature = "mysql", feature = "mssql")),
286 all(feature = "postgres", feature = "sqlite")
287))]
288pub trait AnyColumnIndex:
289 ColumnIndex<PgRow>
290 + for<'q> ColumnIndex<PgStatement<'q>>
291 + ColumnIndex<SqliteRow>
292 + for<'q> ColumnIndex<SqliteStatement<'q>>
293{
294}
295
296#[cfg(all(
297 not(any(feature = "mysql", feature = "mssql")),
298 all(feature = "postgres", feature = "sqlite")
299))]
300impl<I: ?Sized> AnyColumnIndex for I where
301 I: ColumnIndex<PgRow>
302 + for<'q> ColumnIndex<PgStatement<'q>>
303 + ColumnIndex<SqliteRow>
304 + for<'q> ColumnIndex<SqliteStatement<'q>>
305{
306}
307
308#[cfg(all(
309 not(any(feature = "postgres", feature = "sqlite")),
310 all(feature = "mssql", feature = "mysql")
311))]
312pub trait AnyColumnIndex:
313 ColumnIndex<MssqlRow>
314 + for<'q> ColumnIndex<MssqlStatement<'q>>
315 + ColumnIndex<MySqlRow>
316 + for<'q> ColumnIndex<MySqlStatement<'q>>
317{
318}
319
320#[cfg(all(
321 not(any(feature = "postgres", feature = "sqlite")),
322 all(feature = "mssql", feature = "mysql")
323))]
324impl<I: ?Sized> AnyColumnIndex for I where
325 I: ColumnIndex<MssqlRow>
326 + for<'q> ColumnIndex<MssqlStatement<'q>>
327 + ColumnIndex<MySqlRow>
328 + for<'q> ColumnIndex<MySqlStatement<'q>>
329{
330}
331
332#[cfg(all(
333 not(any(feature = "postgres", feature = "mysql")),
334 all(feature = "mssql", feature = "sqlite")
335))]
336pub trait AnyColumnIndex:
337 ColumnIndex<MssqlRow>
338 + for<'q> ColumnIndex<MssqlStatement<'q>>
339 + ColumnIndex<SqliteRow>
340 + for<'q> ColumnIndex<SqliteStatement<'q>>
341{
342}
343
344#[cfg(all(
345 not(any(feature = "postgres", feature = "mysql")),
346 all(feature = "mssql", feature = "sqlite")
347))]
348impl<I: ?Sized> AnyColumnIndex for I where
349 I: ColumnIndex<MssqlRow>
350 + for<'q> ColumnIndex<MssqlStatement<'q>>
351 + ColumnIndex<SqliteRow>
352 + for<'q> ColumnIndex<SqliteStatement<'q>>
353{
354}
355
356#[cfg(all(
357 not(any(feature = "postgres", feature = "mssql")),
358 all(feature = "mysql", feature = "sqlite")
359))]
360pub trait AnyColumnIndex:
361 ColumnIndex<MySqlRow>
362 + for<'q> ColumnIndex<MySqlStatement<'q>>
363 + ColumnIndex<SqliteRow>
364 + for<'q> ColumnIndex<SqliteStatement<'q>>
365{
366}
367
368#[cfg(all(
369 not(any(feature = "postgres", feature = "mssql")),
370 all(feature = "mysql", feature = "sqlite")
371))]
372impl<I: ?Sized> AnyColumnIndex for I where
373 I: ColumnIndex<MySqlRow>
374 + for<'q> ColumnIndex<MySqlStatement<'q>>
375 + ColumnIndex<SqliteRow>
376 + for<'q> ColumnIndex<SqliteStatement<'q>>
377{
378}
379
380#[cfg(all(
383 not(any(feature = "mysql", feature = "mssql", feature = "sqlite")),
384 feature = "postgres"
385))]
386pub trait AnyColumnIndex: ColumnIndex<PgRow> + for<'q> ColumnIndex<PgStatement<'q>> {}
387
388#[cfg(all(
389 not(any(feature = "mysql", feature = "mssql", feature = "sqlite")),
390 feature = "postgres"
391))]
392impl<I: ?Sized> AnyColumnIndex for I where
393 I: ColumnIndex<PgRow> + for<'q> ColumnIndex<PgStatement<'q>>
394{
395}
396
397#[cfg(all(
398 not(any(feature = "postgres", feature = "mssql", feature = "sqlite")),
399 feature = "mysql"
400))]
401pub trait AnyColumnIndex: ColumnIndex<MySqlRow> + for<'q> ColumnIndex<MySqlStatement<'q>> {}
402
403#[cfg(all(
404 not(any(feature = "postgres", feature = "mssql", feature = "sqlite")),
405 feature = "mysql"
406))]
407impl<I: ?Sized> AnyColumnIndex for I where
408 I: ColumnIndex<MySqlRow> + for<'q> ColumnIndex<MySqlStatement<'q>>
409{
410}
411
412#[cfg(all(
413 not(any(feature = "mysql", feature = "postgres", feature = "sqlite")),
414 feature = "mssql"
415))]
416pub trait AnyColumnIndex: ColumnIndex<MssqlRow> + for<'q> ColumnIndex<MssqlStatement<'q>> {}
417
418#[cfg(all(
419 not(any(feature = "mysql", feature = "postgres", feature = "sqlite")),
420 feature = "mssql"
421))]
422impl<I: ?Sized> AnyColumnIndex for I where
423 I: ColumnIndex<MssqlRow> + for<'q> ColumnIndex<MssqlStatement<'q>>
424{
425}
426
427#[cfg(all(
428 not(any(feature = "mysql", feature = "mssql", feature = "postgres")),
429 feature = "sqlite"
430))]
431pub trait AnyColumnIndex:
432 ColumnIndex<SqliteRow> + for<'q> ColumnIndex<SqliteStatement<'q>>
433{
434}
435
436#[cfg(all(
437 not(any(feature = "mysql", feature = "mssql", feature = "postgres")),
438 feature = "sqlite"
439))]
440impl<I: ?Sized> AnyColumnIndex for I where
441 I: ColumnIndex<SqliteRow> + for<'q> ColumnIndex<SqliteStatement<'q>>
442{
443}