rs_odbc/
desc.rs

1use crate::api::Descriptor;
2use crate::attr::{Attr, AttrGet, AttrLen, AttrSet};
3use crate::c_types::CScalar;
4use crate::env::{OdbcVersion, SQL_OV_ODBC3, SQL_OV_ODBC3_80, SQL_OV_ODBC4};
5use crate::handle::{RefSQLHDESC, RefUnsafeSQLHDESC, UnsafeSQLHDESC, SQLHDESC};
6use crate::str::{OdbcChar, OdbcStr};
7use crate::{
8    Ident, OdbcBool, OdbcDefined, Scalar, SQLCHAR, SQLINTEGER, SQLSMALLINT, SQLUINTEGER, SQLULEN,
9    SQLWCHAR,
10};
11use core::{cell::UnsafeCell, marker::PhantomData, mem::MaybeUninit};
12use rs_odbc_derive::{odbc_type, Ident};
13
14// TODO: It's unclear if this trait is required because
15// of column lifetime binding or it can be removed
16pub trait DescType<'buf> {}
17
18// TODO: The statement attribute SQL_ATTR_USE_BOOKMARKS should always be set before calling SQLSetDescField to set bookmark fields. While this is not mandatory, it is strongly recommended.
19pub trait DescField<'buf, D: Descriptor<'buf, DT, V>, DT, A: Ident, V: OdbcVersion>:
20    Attr<A> + AttrLen<Self::DefinedBy, SQLINTEGER>
21where
22    D: ?Sized,
23{
24    // TODO: Implement for buffers to bind their lifetimes
25    fn update_handle(&self, _: &D)
26    where
27        Self: AttrSet<A>,
28    {
29        // TODO: If an application calls SQLSetDescField to set any field other than SQL_DESC_COUNT
30        // or the deferred fields SQL_DESC_DATA_PTR, SQL_DESC_OCTET_LENGTH_PTR, or SQL_DESC_INDICATOR_PTR,
31        // the record becomes unbound.
32
33        // When setting descriptor fields by calling SQLSetDescField, the application must follow a specific sequence:
34        //  The application must first set the SQL_DESC_TYPE, SQL_DESC_CONCISE_TYPE, or SQL_DESC_DATETIME_INTERVAL_CODE field.
35        //  After one of these fields has been set, the application can set an attribute of a data type, and the driver sets data type attribute fields to the appropriate default values for the data type. Automatic defaulting of type attribute fields ensures that the descriptor is always ready to use once the application has specified a data type. If the application explicitly sets a data type attribute, it is overriding the default attribute.
36        //  After one of the fields listed in step 1 has been set, and data type attributes have been set, the application can set SQL_DESC_DATA_PTR. This prompts a consistency check of descriptor fields. If the application changes the data type or attributes after setting the SQL_DESC_DATA_PTR field, the driver sets SQL_DESC_DATA_PTR to a null pointer, unbinding the record. This forces the application to complete the proper steps in sequence, before the descriptor record is usable.
37    }
38}
39
40#[derive(Debug)]
41pub struct AppDesc<'buf> {
42    pub(crate) rows_processed: PhantomData<&'buf ()>,
43    pub(crate) data_ptrs: PhantomData<&'buf ()>,
44}
45
46#[derive(Debug)]
47pub enum IRD {}
48#[derive(Debug)]
49pub enum IPD {}
50
51impl<'buf> DescType<'buf> for AppDesc<'buf> {}
52impl DescType<'_> for IPD {}
53impl DescType<'_> for IRD {}
54
55// Implement DescField for all versions of SQLHDESC descriptor fields
56impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
57    DescField<'buf, SQLHDESC<'conn, DT, SQL_OV_ODBC3_80>, DT, A, SQL_OV_ODBC3_80> for T
58where
59    T: DescField<
60        'buf,
61        SQLHDESC<'conn, DT, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>,
62        DT,
63        A,
64        <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion,
65    >,
66{
67}
68impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
69    DescField<'buf, SQLHDESC<'conn, DT, SQL_OV_ODBC4>, DT, A, SQL_OV_ODBC4> for T
70where
71    T: DescField<
72        'buf,
73        SQLHDESC<'conn, DT, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>,
74        DT,
75        A,
76        <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion,
77    >,
78{
79}
80impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
81    DescField<'buf, SQLHDESC<'conn, DT, SQL_OV_ODBC3_80>, DT, A, SQL_OV_ODBC3_80> for [T]
82where
83    [T]: DescField<
84        'buf,
85        SQLHDESC<'conn, DT, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>,
86        DT,
87        A,
88        <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion,
89    >,
90{
91}
92impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
93    DescField<'buf, SQLHDESC<'conn, DT, SQL_OV_ODBC4>, DT, A, SQL_OV_ODBC4> for [T]
94where
95    [T]: DescField<
96        'buf,
97        SQLHDESC<'conn, DT, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>,
98        DT,
99        A,
100        <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion,
101    >,
102{
103}
104impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, CH: OdbcChar>
105    DescField<'buf, SQLHDESC<'conn, DT, SQL_OV_ODBC3_80>, DT, A, SQL_OV_ODBC3_80> for OdbcStr<CH>
106where
107    OdbcStr<CH>: DescField<
108        'buf,
109        SQLHDESC<'conn, DT, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>,
110        DT,
111        A,
112        <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion,
113    >,
114{
115}
116impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, CH: OdbcChar>
117    DescField<'buf, SQLHDESC<'conn, DT, SQL_OV_ODBC4>, DT, A, SQL_OV_ODBC4> for OdbcStr<CH>
118where
119    OdbcStr<CH>: DescField<
120        'buf,
121        SQLHDESC<'conn, DT, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>,
122        DT,
123        A,
124        <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion,
125    >,
126{
127}
128
129// Implement DescField for all versions of UnsafeSQLHDESC descriptor fields
130impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
131    DescField<'buf, UnsafeSQLHDESC<'conn, DT, SQL_OV_ODBC3_80>, DT, A, SQL_OV_ODBC3_80> for T
132where
133    T: DescField<
134        'buf,
135        UnsafeSQLHDESC<'conn, DT, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>,
136        DT,
137        A,
138        <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion,
139    >,
140{
141}
142impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
143    DescField<'buf, UnsafeSQLHDESC<'conn, DT, SQL_OV_ODBC4>, DT, A, SQL_OV_ODBC4> for T
144where
145    T: DescField<
146        'buf,
147        UnsafeSQLHDESC<'conn, DT, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>,
148        DT,
149        A,
150        <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion,
151    >,
152{
153}
154impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
155    DescField<'buf, UnsafeSQLHDESC<'conn, DT, SQL_OV_ODBC3_80>, DT, A, SQL_OV_ODBC3_80> for [T]
156where
157    [T]: DescField<
158        'buf,
159        UnsafeSQLHDESC<'conn, DT, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>,
160        DT,
161        A,
162        <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion,
163    >,
164{
165}
166impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
167    DescField<'buf, UnsafeSQLHDESC<'conn, DT, SQL_OV_ODBC4>, DT, A, SQL_OV_ODBC4> for [T]
168where
169    [T]: DescField<
170        'buf,
171        UnsafeSQLHDESC<'conn, DT, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>,
172        DT,
173        A,
174        <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion,
175    >,
176{
177}
178impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, CH: OdbcChar>
179    DescField<'buf, UnsafeSQLHDESC<'conn, DT, SQL_OV_ODBC3_80>, DT, A, SQL_OV_ODBC3_80>
180    for OdbcStr<CH>
181where
182    OdbcStr<CH>: DescField<
183        'buf,
184        UnsafeSQLHDESC<'conn, DT, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>,
185        DT,
186        A,
187        <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion,
188    >,
189{
190}
191impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, CH: OdbcChar>
192    DescField<'buf, UnsafeSQLHDESC<'conn, DT, SQL_OV_ODBC4>, DT, A, SQL_OV_ODBC4> for OdbcStr<CH>
193where
194    OdbcStr<CH>: DescField<
195        'buf,
196        UnsafeSQLHDESC<'conn, DT, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>,
197        DT,
198        A,
199        <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion,
200    >,
201{
202}
203
204// Implement DescField for all versions of RefSQLHDESC descriptor fields
205impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
206    DescField<'buf, RefSQLHDESC<'conn, DT, SQL_OV_ODBC3_80>, DT, A, SQL_OV_ODBC3_80> for T
207where
208    T: DescField<
209        'buf,
210        RefSQLHDESC<'conn, DT, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>,
211        DT,
212        A,
213        <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion,
214    >,
215{
216}
217impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
218    DescField<'buf, RefSQLHDESC<'conn, DT, SQL_OV_ODBC4>, DT, A, SQL_OV_ODBC4> for T
219where
220    T: DescField<
221        'buf,
222        RefSQLHDESC<'conn, DT, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>,
223        DT,
224        A,
225        <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion,
226    >,
227{
228}
229impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
230    DescField<'buf, RefSQLHDESC<'conn, DT, SQL_OV_ODBC3_80>, DT, A, SQL_OV_ODBC3_80> for [T]
231where
232    [T]: DescField<
233        'buf,
234        RefSQLHDESC<'conn, DT, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>,
235        DT,
236        A,
237        <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion,
238    >,
239{
240}
241impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
242    DescField<'buf, RefSQLHDESC<'conn, DT, SQL_OV_ODBC4>, DT, A, SQL_OV_ODBC4> for [T]
243where
244    [T]: DescField<
245        'buf,
246        RefSQLHDESC<'conn, DT, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>,
247        DT,
248        A,
249        <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion,
250    >,
251{
252}
253impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, CH: OdbcChar>
254    DescField<'buf, RefSQLHDESC<'conn, DT, SQL_OV_ODBC3_80>, DT, A, SQL_OV_ODBC3_80> for OdbcStr<CH>
255where
256    OdbcStr<CH>: DescField<
257        'buf,
258        RefSQLHDESC<'conn, DT, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>,
259        DT,
260        A,
261        <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion,
262    >,
263{
264}
265impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, CH: OdbcChar>
266    DescField<'buf, RefSQLHDESC<'conn, DT, SQL_OV_ODBC4>, DT, A, SQL_OV_ODBC4> for OdbcStr<CH>
267where
268    OdbcStr<CH>: DescField<
269        'buf,
270        RefSQLHDESC<'conn, DT, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>,
271        DT,
272        A,
273        <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion,
274    >,
275{
276}
277
278// Implement DescField for all versions of RefUnsafeSQLHDESC descriptor fields
279impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
280    DescField<'buf, RefUnsafeSQLHDESC<'conn, DT, SQL_OV_ODBC3_80>, DT, A, SQL_OV_ODBC3_80> for T
281where
282    T: DescField<
283        'buf,
284        RefUnsafeSQLHDESC<'conn, DT, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>,
285        DT,
286        A,
287        <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion,
288    >,
289{
290}
291impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
292    DescField<'buf, RefUnsafeSQLHDESC<'conn, DT, SQL_OV_ODBC4>, DT, A, SQL_OV_ODBC4> for T
293where
294    T: DescField<
295        'buf,
296        RefUnsafeSQLHDESC<'conn, DT, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>,
297        DT,
298        A,
299        <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion,
300    >,
301{
302}
303impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
304    DescField<'buf, RefUnsafeSQLHDESC<'conn, DT, SQL_OV_ODBC3_80>, DT, A, SQL_OV_ODBC3_80> for [T]
305where
306    [T]: DescField<
307        'buf,
308        RefUnsafeSQLHDESC<'conn, DT, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>,
309        DT,
310        A,
311        <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion,
312    >,
313{
314}
315impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, T: Scalar>
316    DescField<'buf, RefUnsafeSQLHDESC<'conn, DT, SQL_OV_ODBC4>, DT, A, SQL_OV_ODBC4> for [T]
317where
318    [T]: DescField<
319        'buf,
320        RefUnsafeSQLHDESC<'conn, DT, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>,
321        DT,
322        A,
323        <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion,
324    >,
325{
326}
327impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, CH: OdbcChar>
328    DescField<'buf, RefUnsafeSQLHDESC<'conn, DT, SQL_OV_ODBC3_80>, DT, A, SQL_OV_ODBC3_80>
329    for OdbcStr<CH>
330where
331    OdbcStr<CH>: DescField<
332        'buf,
333        RefUnsafeSQLHDESC<'conn, DT, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>,
334        DT,
335        A,
336        <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion,
337    >,
338{
339}
340impl<'conn, 'buf, DT: DescType<'buf>, A: Ident, CH: OdbcChar>
341    DescField<'buf, RefUnsafeSQLHDESC<'conn, DT, SQL_OV_ODBC4>, DT, A, SQL_OV_ODBC4> for OdbcStr<CH>
342where
343    OdbcStr<CH>: DescField<
344        'buf,
345        RefUnsafeSQLHDESC<'conn, DT, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>,
346        DT,
347        A,
348        <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion,
349    >,
350{
351}
352
353// Implement DescField for uninitialized descriptor fields
354impl<'buf, D: Descriptor<'buf, DT, V>, DT, A: Ident, T: Scalar, V: OdbcVersion>
355    DescField<'buf, D, DT, A, V> for MaybeUninit<T>
356where
357    T: DescField<'buf, D, DT, A, V> + AttrGet<A>,
358    Self: AttrLen<Self::DefinedBy, SQLINTEGER>,
359{
360}
361impl<'buf, D: Descriptor<'buf, DT, V>, DT, A: Ident, T: Scalar, V: OdbcVersion>
362    DescField<'buf, D, DT, A, V> for [MaybeUninit<T>]
363where
364    [T]: DescField<'buf, D, DT, A, V> + AttrGet<A>,
365    Self: AttrLen<Self::DefinedBy, SQLINTEGER>,
366{
367}
368impl<'buf, D: Descriptor<'buf, DT, V>, A: Ident, DT, V: OdbcVersion> DescField<'buf, D, DT, A, V>
369    for OdbcStr<MaybeUninit<SQLCHAR>>
370where
371    OdbcStr<SQLCHAR>: DescField<'buf, D, DT, A, V> + AttrGet<A>,
372{
373}
374impl<'buf, D: Descriptor<'buf, DT, V>, DT, A: Ident, V: OdbcVersion> DescField<'buf, D, DT, A, V>
375    for OdbcStr<MaybeUninit<SQLWCHAR>>
376where
377    OdbcStr<SQLWCHAR>: DescField<'buf, D, DT, A, V> + AttrGet<A>,
378{
379}
380
381// Implement DescField for references to unsized (used by AttrSet)
382impl<'buf, D: Descriptor<'buf, DT, V>, DT, A: Ident, T: Scalar, V: OdbcVersion>
383    DescField<'buf, D, DT, A, V> for &[T]
384where
385    [T]: DescField<'buf, D, DT, A, V>,
386    Self: AttrSet<A>,
387{
388}
389impl<'buf, D: Descriptor<'buf, DT, V>, DT, A: Ident, CH: OdbcChar, V: OdbcVersion>
390    DescField<'buf, D, DT, A, V> for &OdbcStr<CH>
391where
392    OdbcStr<CH>: DescField<'buf, D, DT, A, V>,
393    Self: AttrSet<A>,
394{
395}
396
397//=====================================================================================//
398//-------------------------------------Attributes--------------------------------------//
399
400/////////////////////////////////////////////////////////////////////////////////////////
401////////////////////////////////////// Header fields ////////////////////////////////////
402/////////////////////////////////////////////////////////////////////////////////////////
403
404#[derive(Ident)]
405#[identifier(SQLSMALLINT, 1099)]
406#[allow(non_camel_case_types)]
407pub struct SQL_DESC_ALLOC_TYPE;
408// This is read-only attribute
409unsafe impl Attr<SQL_DESC_ALLOC_TYPE> for AllocType {
410    type DefinedBy = OdbcDefined;
411}
412impl<'buf, D: Descriptor<'buf, DT, SQL_OV_ODBC3>, DT>
413    DescField<'buf, D, DT, SQL_DESC_ALLOC_TYPE, SQL_OV_ODBC3> for AllocType
414{
415}
416unsafe impl AttrGet<SQL_DESC_ALLOC_TYPE> for AllocType {}
417
418#[derive(Ident)]
419#[identifier(SQLSMALLINT, 20)]
420#[allow(non_camel_case_types)]
421pub struct SQL_DESC_ARRAY_SIZE;
422unsafe impl Attr<SQL_DESC_ARRAY_SIZE> for SQLULEN {
423    type DefinedBy = OdbcDefined;
424}
425impl<'buf, D: Descriptor<'buf, AppDesc<'buf>, SQL_OV_ODBC3>>
426    DescField<'buf, D, AppDesc<'buf>, SQL_DESC_ARRAY_SIZE, SQL_OV_ODBC3> for SQLULEN
427{
428}
429unsafe impl AttrGet<SQL_DESC_ARRAY_SIZE> for SQLULEN {}
430unsafe impl AttrSet<SQL_DESC_ARRAY_SIZE> for SQLULEN {}
431
432//#[derive(Ident)]
433//#[identifier(SQLSMALLINT, 21)]
434//#[allow(non_camel_case_types)]
435//pub struct SQL_DESC_ARRAY_STATUS_PTR;
436//unsafe impl Attr<SQL_DESC_ARRAY_STATUS_PTR> for [UnsafeCell<>] {
437//    type DefinedBy = OdbcDefined;
438//}
439//impl<DT> DescField<SQL_DESC_ARRAY_STATUS_PTR, DT> for [UnsafeCell<>] {
440//    fn update_handle<V: OdbcVersion>(&self, _: &UnsafeSQLHDESC<DT, V>) where Self: AttrSet<A> {
441//        // TODO: Do something
442//    }
443//}
444//unsafe impl AttrGet<SQL_DESC_ARRAY_STATUS_PTR> for [UnsafeCell<>] {}
445//unsafe impl AttrSet<SQL_DESC_ARRAY_STATUS_PTR> for &[UnsafeCell<>] {}
446
447//#[derive(Ident)]
448//#[identifier(SQLSMALLINT, 24)]
449//#[allow(non_camel_case_types)]
450//pub struct SQL_DESC_BIND_OFFSET_PTR;
451//unsafe impl Attr<SQL_DESC_BIND_OFFSET_PTR> for UnsafeCell<SQLLEN> {
452//    type DefinedBy = OdbcDefined;
453//}
454//impl<'buf, V: OdbcVersion> UnsafeDescField<'buf, SQL_DESC_BIND_OFFSET_PTR, UnsafeSQLHDESC<'buf, AppDesc<'buf>, V>, AppDesc<'buf>, V> for UnsafeCell<SQLLEN> {
455//    fn update_handle<V: OdbcVersion>(&self, DescriptorHandle: &UnsafeSQLHDESC<'buf, AppDesc<'buf>, V>)
456//    {
457//        DescriptorHandle.bind_offset.set(*self);
458//    }
459//}
460//unsafe impl AttrGet<SQL_DESC_BIND_OFFSET_PTR> for UnsafeCell<SQLLEN> {}
461//unsafe impl AttrSet<SQL_DESC_BIND_OFFSET_PTR> for &UnsafeCell<SQLLEN> {}
462
463#[derive(Ident)]
464#[identifier(SQLSMALLINT, 25)]
465#[allow(non_camel_case_types)]
466pub struct SQL_DESC_BIND_TYPE;
467unsafe impl Attr<SQL_DESC_BIND_TYPE> for BindType {
468    type DefinedBy = OdbcDefined;
469}
470impl<'buf, D: Descriptor<'buf, AppDesc<'buf>, SQL_OV_ODBC3>>
471    DescField<'buf, D, AppDesc<'buf>, SQL_DESC_BIND_TYPE, SQL_OV_ODBC3> for BindType
472{
473}
474unsafe impl AttrGet<SQL_DESC_BIND_TYPE> for BindType {}
475unsafe impl AttrSet<SQL_DESC_BIND_TYPE> for BindType {}
476
477#[derive(Ident)]
478#[identifier(SQLSMALLINT, 1001)]
479#[allow(non_camel_case_types)]
480pub struct SQL_DESC_COUNT;
481unsafe impl Attr<SQL_DESC_COUNT> for SQLSMALLINT {
482    type DefinedBy = OdbcDefined;
483}
484impl<'buf, D: Descriptor<'buf, DT, SQL_OV_ODBC3>, DT>
485    DescField<'buf, D, DT, SQL_DESC_COUNT, SQL_OV_ODBC3> for SQLSMALLINT
486{
487}
488unsafe impl AttrGet<SQL_DESC_COUNT> for SQLSMALLINT {}
489unsafe impl AttrSet<SQL_DESC_COUNT> for SQLSMALLINT {}
490
491#[derive(Ident)]
492#[identifier(SQLSMALLINT, 34)]
493#[allow(non_camel_case_types)]
494pub struct SQL_DESC_ROWS_PROCESSED_PTR;
495unsafe impl Attr<SQL_DESC_ROWS_PROCESSED_PTR> for [UnsafeCell<SQLUINTEGER>] {
496    type DefinedBy = OdbcDefined;
497}
498unsafe impl Attr<SQL_DESC_ROWS_PROCESSED_PTR> for [UnsafeCell<SQLULEN>] {
499    type DefinedBy = OdbcDefined;
500}
501impl<'conn, 'buf, D: Descriptor<'buf, IRD, SQL_OV_ODBC3>>
502    DescField<'buf, D, IRD, SQL_DESC_ROWS_PROCESSED_PTR, SQL_OV_ODBC3> for [UnsafeCell<SQLULEN>]
503{
504    #[cfg(feature = "odbc_debug")]
505    fn update_handle<V: OdbcVersion>(&self, DescriptorHandle: &UnsafeSQLHDESC<'conn, IRD, V>) {
506        unimplemented!()
507    }
508}
509impl<'buf, D: Descriptor<'buf, IPD, SQL_OV_ODBC3>>
510    DescField<'buf, D, IPD, SQL_DESC_ROWS_PROCESSED_PTR, SQL_OV_ODBC3>
511    for [UnsafeCell<SQLUINTEGER>]
512{
513    #[cfg(feature = "odbc_debug")]
514    fn update_handle<V: OdbcVersion>(&self, DescriptorHandle: &UnsafeSQLHDESC<'conn, IPD, V>) {
515        unimplemented!()
516    }
517}
518unsafe impl AttrGet<SQL_DESC_ROWS_PROCESSED_PTR> for [UnsafeCell<SQLUINTEGER>] {}
519unsafe impl AttrGet<SQL_DESC_ROWS_PROCESSED_PTR> for [UnsafeCell<SQLULEN>] {}
520unsafe impl AttrSet<SQL_DESC_ROWS_PROCESSED_PTR> for &[UnsafeCell<SQLUINTEGER>] {}
521unsafe impl AttrSet<SQL_DESC_ROWS_PROCESSED_PTR> for &[UnsafeCell<SQLULEN>] {}
522
523/////////////////////////////////////////////////////////////////////////////////////////
524////////////////////////////////////// Record fields ////////////////////////////////////
525/////////////////////////////////////////////////////////////////////////////////////////
526
527#[derive(Ident)]
528#[identifier(SQLSMALLINT, 11)]
529#[allow(non_camel_case_types)]
530// This is read-only attribute
531pub struct SQL_DESC_AUTO_UNIQUE_VALUE;
532unsafe impl Attr<SQL_DESC_AUTO_UNIQUE_VALUE> for OdbcBool {
533    type DefinedBy = OdbcDefined;
534}
535impl<'buf, D: Descriptor<'buf, IRD, SQL_OV_ODBC3>>
536    DescField<'buf, D, IRD, SQL_DESC_AUTO_UNIQUE_VALUE, SQL_OV_ODBC3> for OdbcBool
537{
538}
539unsafe impl AttrGet<SQL_DESC_AUTO_UNIQUE_VALUE> for OdbcBool {}
540
541#[derive(Ident)]
542#[identifier(SQLSMALLINT, 22)]
543#[allow(non_camel_case_types)]
544// This is read-only attribute
545pub struct SQL_DESC_BASE_COLUMN_NAME;
546unsafe impl<CH: OdbcChar> Attr<SQL_DESC_BASE_COLUMN_NAME> for OdbcStr<CH> {
547    type DefinedBy = OdbcDefined;
548}
549impl<'buf, D: Descriptor<'buf, IRD, SQL_OV_ODBC3>, CH: OdbcChar>
550    DescField<'buf, D, IRD, SQL_DESC_BASE_COLUMN_NAME, SQL_OV_ODBC3> for OdbcStr<CH>
551{
552}
553unsafe impl<CH: OdbcChar> AttrGet<SQL_DESC_BASE_COLUMN_NAME> for OdbcStr<CH> {}
554
555#[derive(Ident)]
556#[identifier(SQLSMALLINT, 23)]
557#[allow(non_camel_case_types)]
558// This is read-only attribute
559pub struct SQL_DESC_BASE_TABLE_NAME;
560unsafe impl<CH: OdbcChar> Attr<SQL_DESC_BASE_TABLE_NAME> for OdbcStr<CH> {
561    type DefinedBy = OdbcDefined;
562}
563impl<'buf, D: Descriptor<'buf, IRD, SQL_OV_ODBC3>, CH: OdbcChar>
564    DescField<'buf, D, IRD, SQL_DESC_BASE_TABLE_NAME, SQL_OV_ODBC3> for OdbcStr<CH>
565{
566}
567unsafe impl<CH: OdbcChar> AttrGet<SQL_DESC_BASE_TABLE_NAME> for OdbcStr<CH> {}
568
569#[derive(Ident)]
570#[identifier(SQLSMALLINT, 12)]
571#[allow(non_camel_case_types)]
572// This is read-only attribute
573pub struct SQL_DESC_CASE_SENSITIVE;
574unsafe impl Attr<SQL_DESC_CASE_SENSITIVE> for OdbcBool {
575    type DefinedBy = OdbcDefined;
576}
577impl<'buf, D: Descriptor<'buf, IRD, SQL_OV_ODBC3>>
578    DescField<'buf, D, IRD, SQL_DESC_CASE_SENSITIVE, SQL_OV_ODBC3> for OdbcBool
579{
580}
581unsafe impl AttrGet<SQL_DESC_CASE_SENSITIVE> for OdbcBool {}
582
583#[derive(Ident)]
584#[identifier(SQLSMALLINT, 17)]
585#[allow(non_camel_case_types)]
586// This is read-only attribute
587pub struct SQL_DESC_CATALOG_NAME;
588unsafe impl<CH: OdbcChar> Attr<SQL_DESC_CATALOG_NAME> for OdbcStr<CH> {
589    type DefinedBy = OdbcDefined;
590}
591impl<'buf, D: Descriptor<'buf, IRD, SQL_OV_ODBC3>, CH: OdbcChar>
592    DescField<'buf, D, IRD, SQL_DESC_CATALOG_NAME, SQL_OV_ODBC3> for OdbcStr<CH>
593{
594}
595unsafe impl<CH: OdbcChar> AttrGet<SQL_DESC_CATALOG_NAME> for OdbcStr<CH> {}
596
597// TODO:
598//#[derive(Ident)]
599//#[identifier(SQLSMALLINT, 2)]
600//#[allow(non_camel_case_types)]
601//pub struct SQL_DESC_CONCISE_TYPE;
602//unsafe impl Attr<SQL_DESC_CONCISE_TYPE> for SqlType {
603//    type DefinedBy = OdbcDefined;
604//}
605//impl<DT, V: OdbcVersion> DescField<SQL_DESC_CONCISE_TYPE, DT> for SqlType {}
606//unsafe impl AttrGet<SQL_DESC_CONCISE_TYPE> for SqlType {}
607//unsafe impl AttrSet<SQL_DESC_CONCISE_TYPE> for SqlType {}
608
609//#[derive(Ident)]
610//#[identifier(SQLSMALLINT, 1007)]
611//#[allow(non_camel_case_types)]
612//pub struct SQL_DESC_DATETIME_INTERVAL_CODE;
613//unsafe impl Attr<SQL_DESC_DATETIME_INTERVAL_CODE> for DatetimeIntervalCode {
614//    type DefinedBy = OdbcDefined;
615//}
616//impl<DT, V: OdbcVersion> DescField<SQL_DESC_DATETIME_INTERVAL_CODE, DT> for DatetimeIntervalCode {}
617//unsafe impl AttrGet<SQL_DESC_DATETIME_INTERVAL_CODE> for DatetimeIntervalCode {}
618//unsafe impl AttrSet<SQL_DESC_DATETIME_INTERVAL_CODE> for DatetimeIntervalCode {}
619
620//#[derive(Ident)]
621//#[identifier(SQLSMALLINT, 26)]
622//#[allow(non_camel_case_types)]
623//pub struct SQL_DESC_DATETIME_INTERVAL_PRECISION;
624
625#[derive(Ident)]
626#[identifier(SQLSMALLINT, 1010)]
627#[allow(non_camel_case_types)]
628pub struct SQL_DESC_DATA_PTR;
629unsafe impl<T> Attr<SQL_DESC_DATA_PTR> for UnsafeCell<T> {
630    type DefinedBy = OdbcDefined;
631}
632impl<'buf, D: Descriptor<'buf, IPD, SQL_OV_ODBC3>, T: CScalar>
633    DescField<'buf, D, IPD, SQL_DESC_DATA_PTR, SQL_OV_ODBC3> for UnsafeCell<T>
634{
635}
636impl<'buf, D: Descriptor<'buf, AppDesc<'buf>, SQL_OV_ODBC3>, T: CScalar>
637    DescField<'buf, D, AppDesc<'buf>, SQL_DESC_DATA_PTR, SQL_OV_ODBC3> for UnsafeCell<T>
638{
639}
640unsafe impl<T: CScalar> AttrGet<SQL_DESC_DATA_PTR> for UnsafeCell<T> {}
641unsafe impl<T: CScalar> AttrSet<SQL_DESC_DATA_PTR> for &UnsafeCell<T> {}
642
643unsafe impl<T> Attr<SQL_DESC_DATA_PTR> for [UnsafeCell<T>] {
644    type DefinedBy = OdbcDefined;
645}
646impl<'buf, D: Descriptor<'buf, DT, SQL_OV_ODBC3>, DT, T>
647    DescField<'buf, D, DT, SQL_DESC_DATA_PTR, SQL_OV_ODBC3> for [UnsafeCell<T>]
648{
649}
650unsafe impl<T> AttrGet<SQL_DESC_DATA_PTR> for [UnsafeCell<T>] {}
651unsafe impl<T> AttrSet<SQL_DESC_DATA_PTR> for &[UnsafeCell<T>] {}
652
653#[derive(Ident)]
654#[identifier(SQLSMALLINT, 6)]
655#[allow(non_camel_case_types)]
656// This is read-only attribute
657pub struct SQL_DESC_DISPLAY_SIZE;
658unsafe impl Attr<SQL_DESC_DISPLAY_SIZE> for SQLINTEGER {
659    type DefinedBy = OdbcDefined;
660}
661impl<'buf, D: Descriptor<'buf, IRD, SQL_OV_ODBC3>>
662    DescField<'buf, D, IRD, SQL_DESC_DISPLAY_SIZE, SQL_OV_ODBC3> for SQLINTEGER
663{
664}
665unsafe impl AttrGet<SQL_DESC_DISPLAY_SIZE> for SQLINTEGER {}
666
667//#[derive(Ident)]
668//#[identifier(SQLSMALLINT, 1009)]
669//#[allow(non_camel_case_types)]
670//pub struct SQL_DESC_INDICATOR_PTR;
671//unsafe impl Attr<SQL_DESC_DISPLAY_SIZE> for {
672//    type DefinedBy = OdbcDefined;
673//}
674//impl DescField<SQL_DESC_DISPLAY_SIZE, AppDesc<'_>> for {}
675//unsafe impl AttrGet<SQL_DESC_DISPLAY_SIZE> for {}
676
677#[derive(Ident)]
678#[identifier(SQLSMALLINT, 9)]
679#[allow(non_camel_case_types)]
680// This is read-only attribute
681pub struct SQL_DESC_FIXED_PREC_SCALE;
682unsafe impl Attr<SQL_DESC_FIXED_PREC_SCALE> for OdbcBool {
683    type DefinedBy = OdbcDefined;
684}
685impl<'buf, D: Descriptor<'buf, IRD, SQL_OV_ODBC3>>
686    DescField<'buf, D, IRD, SQL_DESC_FIXED_PREC_SCALE, SQL_OV_ODBC3> for OdbcBool
687{
688}
689impl<'buf, D: Descriptor<'buf, IPD, SQL_OV_ODBC3>>
690    DescField<'buf, D, IPD, SQL_DESC_FIXED_PREC_SCALE, SQL_OV_ODBC3> for OdbcBool
691{
692}
693
694unsafe impl AttrGet<SQL_DESC_FIXED_PREC_SCALE> for OdbcBool {}
695
696#[derive(Ident)]
697#[identifier(SQLSMALLINT, 1004)]
698#[allow(non_camel_case_types)]
699pub struct SQL_DESC_OCTET_LENGTH_PTR;
700
701#[derive(Ident)]
702#[identifier(SQLSMALLINT, 33)]
703#[allow(non_camel_case_types)]
704pub struct SQL_DESC_PARAMETER_TYPE;
705
706#[cfg(feature = "v3_5")]
707#[derive(Ident)]
708#[identifier(SQLSMALLINT, 35)]
709#[allow(non_camel_case_types)]
710pub struct SQL_DESC_ROWVER;
711
712#[derive(Ident)]
713#[identifier(SQLSMALLINT, 1012)]
714#[allow(non_camel_case_types)]
715pub struct SQL_DESC_UNNAMED;
716
717#[derive(Ident)]
718#[identifier(SQLSMALLINT, 1002)]
719#[allow(non_camel_case_types)]
720pub struct SQL_DESC_TYPE;
721
722#[derive(Ident)]
723#[identifier(SQLSMALLINT, 1003)]
724#[allow(non_camel_case_types)]
725pub struct SQL_DESC_LENGTH;
726
727#[derive(Ident)]
728#[identifier(SQLSMALLINT, 1005)]
729#[allow(non_camel_case_types)]
730pub struct SQL_DESC_PRECISION;
731
732#[derive(Ident)]
733#[identifier(SQLSMALLINT, 1006)]
734#[allow(non_camel_case_types)]
735pub struct SQL_DESC_SCALE;
736
737#[derive(Ident)]
738#[identifier(SQLSMALLINT, 1008)]
739#[allow(non_camel_case_types)]
740pub struct SQL_DESC_NULLABLE;
741
742#[derive(Ident)]
743#[identifier(SQLSMALLINT, 1011)]
744#[allow(non_camel_case_types)]
745pub struct SQL_DESC_NAME;
746
747#[derive(Ident)]
748#[identifier(SQLSMALLINT, 1013)]
749#[allow(non_camel_case_types)]
750pub struct SQL_DESC_OCTET_LENGTH;
751unsafe impl Attr<SQL_DESC_OCTET_LENGTH> for OdbcBool {
752    type DefinedBy = OdbcDefined;
753}
754impl<'buf, D: Descriptor<'buf, DT, SQL_OV_ODBC3>, DT>
755    DescField<'buf, D, DT, SQL_DESC_OCTET_LENGTH, SQL_OV_ODBC3> for OdbcBool
756{
757}
758unsafe impl AttrGet<SQL_DESC_OCTET_LENGTH> for OdbcBool {}
759
760//#if (ODBCVER >= 0x0300)
761//#define SQL_DESC_ARRAY_SIZE                     20
762//#define SQL_DESC_AUTO_UNIQUE_VALUE              SQL_COLUMN_AUTO_INCREMENT
763//#define SQL_DESC_BASE_COLUMN_NAME               22
764//#define SQL_DESC_BASE_TABLE_NAME                23
765//#define SQL_DESC_BIND_OFFSET_PTR                24
766//#define SQL_DESC_BIND_TYPE                      25
767//#define SQL_DESC_CASE_SENSITIVE                 SQL_COLUMN_CASE_SENSITIVE
768//#define SQL_DESC_CATALOG_NAME                   SQL_COLUMN_QUALIFIER_NAME
769//#define SQL_DESC_CONCISE_TYPE                   SQL_COLUMN_TYPE
770//#define SQL_DESC_DATETIME_INTERVAL_PRECISION    26
771//#define SQL_DESC_DISPLAY_SIZE                   SQL_COLUMN_DISPLAY_SIZE
772//#define SQL_DESC_FIXED_PREC_SCALE               SQL_COLUMN_MONEY
773//#define SQL_DESC_LABEL                          SQL_COLUMN_LABEL
774//#define SQL_DESC_LITERAL_PREFIX                 27
775//#define SQL_DESC_LITERAL_SUFFIX                 28
776//#define SQL_DESC_LOCAL_TYPE_NAME                29
777//#define SQL_DESC_MAXIMUM_SCALE                  30
778//#define SQL_DESC_MINIMUM_SCALE                  31
779//#define SQL_DESC_NUM_PREC_RADIX                 32
780//#define SQL_DESC_PARAMETER_TYPE                 33
781//#define SQL_DESC_ROWS_PROCESSED_PTR             34
782//#if (ODBCVER >= 0x0350)
783//#define SQL_DESC_ROWVER                         35
784//#endif /* ODBCVER >= 0x0350 */
785//#define SQL_DESC_SCHEMA_NAME                    SQL_COLUMN_OWNER_NAME
786//#define SQL_DESC_SEARCHABLE                     SQL_COLUMN_SEARCHABLE
787//#define SQL_DESC_TYPE_NAME                      SQL_COLUMN_TYPE_NAME
788//#define SQL_DESC_TABLE_NAME                     SQL_COLUMN_TABLE_NAME
789//#define SQL_DESC_UNSIGNED                       SQL_COLUMN_UNSIGNED
790//#define SQL_DESC_UPDATABLE                      SQL_COLUMN_UPDATABLE
791//#endif /* ODBCVER >= 0x0300 */
792//// TODO: Not mentioned anywhere in the documentation
793//// SQL_DESC_MAXIMUM_SCALE = 30,
794//// SQL_DESC_MINIMUM_SCALE = 31,
795//#[cfg(feature = "v4")]
796//SQL_DESC_CHARACTER_SET_CATALOG = 1018,
797//#[cfg(feature = "v4")]
798//SQL_DESC_CHARACTER_SET_SCHEMA = 1019,
799//#[cfg(feature = "v4")]
800//SQL_DESC_CHARACTER_SET_NAME = 1020,
801//#[cfg(feature = "v4")]
802//SQL_DESC_COLLATION_CATALOG = 1015,
803//#[cfg(feature = "v4")]
804//SQL_DESC_COLLATION_SCHEMA = 1016,
805//#[cfg(feature = "v4")]
806//SQL_DESC_COLLATION_NAME = 1017,
807//#[cfg(feature = "v4")]
808//SQL_DESC_USER_DEFINED_TYPE_CATALOG = 1026,
809//#[cfg(feature = "v4")]
810//SQL_DESC_USER_DEFINED_TYPE_SCHEMA = 1027,
811//#[cfg(feature = "v4")]
812//SQL_DESC_USER_DEFINED_TYPE_NAME = 1028,
813//#[cfg(feature = "v4")]
814//SQL_DESC_MIME_TYPE = 36,
815
816//    pub enum SQL_DESC_ARRAY_STATUS_PTR {
817//        SQL_PARAM_SUCCESS = 0,
818//        SQL_PARAM_SUCCESS_WITH_INFO = 6,
819//        SQL_PARAM_ERROR = 5,
820//        SQL_PARAM_UNUSED = 7,
821//        SQL_PARAM_DIAG_UNAVAILABLE = 1,
822//        // TODO: What are these?
823//        //SQL_PARAM_PROCEED = 0,
824//        //SQL_PARAM_IGNORE = 1,
825//    }
826
827//=====================================================================================//
828
829#[odbc_type(SQLSMALLINT)]
830pub struct AllocType;
831pub const SQL_DESC_ALLOC_AUTO: AllocType = AllocType(1);
832pub const SQL_DESC_ALLOC_USER: AllocType = AllocType(2);
833
834// TODO: May be SQLINTEGER?
835#[odbc_type(SQLUINTEGER)]
836pub struct BindType;
837pub const SQL_BIND_BY_COLUMN: BindType = BindType(1);