rs_odbc/
col.rs

1use crate::attr::{Attr, AttrGet, AttrLen, AttrSet};
2use crate::env::{OdbcVersion, SQL_OV_ODBC3, SQL_OV_ODBC3_80, SQL_OV_ODBC4};
3use crate::str::{OdbcChar, OdbcStr};
4use crate::{Ident, OdbcDefined, Scalar, SQLCHAR, SQLLEN, SQLSMALLINT, SQLWCHAR};
5use core::mem::MaybeUninit;
6use rs_odbc_derive::Ident;
7
8pub trait ColAttr<A: Ident, V: OdbcVersion>:
9    Attr<A> + AttrLen<Self::DefinedBy, SQLSMALLINT>
10{
11}
12
13// Implement ColAttr for all versions of column attributes
14impl<A: Ident, T: Scalar> ColAttr<A, SQL_OV_ODBC3_80> for T where
15    T: ColAttr<A, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>
16{
17}
18impl<A: Ident, T: Scalar> ColAttr<A, SQL_OV_ODBC4> for T where
19    T: ColAttr<A, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>
20{
21}
22impl<A: Ident, T: Scalar> ColAttr<A, SQL_OV_ODBC3_80> for [T] where
23    [T]: ColAttr<A, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>
24{
25}
26impl<A: Ident, T: Scalar> ColAttr<A, SQL_OV_ODBC4> for [T] where
27    [T]: ColAttr<A, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>
28{
29}
30impl<A: Ident, CH: OdbcChar> ColAttr<A, SQL_OV_ODBC3_80> for OdbcStr<CH> where
31    OdbcStr<CH>: ColAttr<A, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>
32{
33}
34impl<A: Ident, CH: OdbcChar> ColAttr<A, SQL_OV_ODBC4> for OdbcStr<CH> where
35    OdbcStr<CH>: ColAttr<A, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>
36{
37}
38
39// Implement ColAttr for uninitialized column attributes
40impl<A: Ident, T: Scalar, V: OdbcVersion> ColAttr<A, V> for MaybeUninit<T>
41where
42    T: ColAttr<A, V> + AttrGet<A>,
43    Self: AttrLen<Self::DefinedBy, SQLSMALLINT>,
44{
45}
46impl<A: Ident, T: Scalar, V: OdbcVersion> ColAttr<A, V> for [MaybeUninit<T>]
47where
48    [T]: ColAttr<A, V> + AttrGet<A>,
49    Self: AttrLen<Self::DefinedBy, SQLSMALLINT>,
50{
51}
52impl<A: Ident, V: OdbcVersion> ColAttr<A, V> for OdbcStr<MaybeUninit<SQLCHAR>> where
53    OdbcStr<SQLCHAR>: ColAttr<A, V> + AttrGet<A>
54{
55}
56impl<A: Ident, V: OdbcVersion> ColAttr<A, V> for OdbcStr<MaybeUninit<SQLWCHAR>> where
57    OdbcStr<SQLWCHAR>: ColAttr<A, V> + AttrGet<A>
58{
59}
60
61// Implement ColAttr for references to unsized (used by AttrSet)
62impl<A: Ident, T: Scalar, V: OdbcVersion> ColAttr<A, V> for &[T]
63where
64    [T]: ColAttr<A, V>,
65    Self: AttrSet<A>,
66{
67}
68impl<A: Ident, CH: OdbcChar, V: OdbcVersion> ColAttr<A, V> for &OdbcStr<CH>
69where
70    OdbcStr<CH>: ColAttr<A, V>,
71    Self: AttrSet<A>,
72{
73}
74
75//=====================================================================================//
76//-------------------------------------Attributes--------------------------------------//
77
78// TODO: These seem to be from v2.0
79//#[deprecated]
80//#[allow(non_camel_case_types)]
81//enum SQLColAttrIdents {
82//    SQL_COLUMN_COUNT = 0,
83//    SQL_COLUMN_NAME = 1,
84//    SQL_COLUMN_LENGTH = 3,
85//    SQL_COLUMN_PRECISION = 4,
86//    SQL_COLUMN_SCALE = 5,
87//    SQL_COLUMN_NULLABLE = 7,
88//}
89
90// TODO: These constants are not found in the documentation
91//use SQLColAttrIdents::SQL_COLUMN_COUNT as SQL_COLATT_OPT_MIN;
92//use SQLColAttrIdents::SQL_COLUMN_LABEL as SQL_COLATT_OPT_MAX;
93
94// This is the only header field, others are record fields
95#[derive(Ident)]
96#[identifier(SQLUSMALLINT, 1001)]
97#[allow(non_camel_case_types)]
98pub struct SQL_DESC_COUNT;
99unsafe impl Attr<SQL_DESC_COUNT> for SQLLEN {
100    type DefinedBy = OdbcDefined;
101}
102
103#[derive(Ident)]
104#[identifier(SQLUSMALLINT, 2)]
105#[allow(non_camel_case_types)]
106pub struct SQL_DESC_CONCISE_TYPE;
107
108#[derive(Ident)]
109#[identifier(SQLUSMALLINT, 6)]
110#[allow(non_camel_case_types)]
111pub struct SQL_DESC_DISPLAY_SIZE;
112
113#[derive(Ident)]
114#[identifier(SQLUSMALLINT, 8)]
115#[allow(non_camel_case_types)]
116pub struct SQL_DESC_UNSIGNED;
117
118#[derive(Ident)]
119#[identifier(SQLUSMALLINT, 9)]
120#[allow(non_camel_case_types)]
121pub struct SQL_DESC_FIXED_PREC_SCALE;
122
123#[derive(Ident)]
124#[identifier(SQLUSMALLINT, 10)]
125#[allow(non_camel_case_types)]
126pub struct SQL_DESC_UPDATABLE;
127
128///// Describes the updatability of the column in the result set, not the column in the base table.
129//#[repr(SQLSMALLINT)]
130//pub enum DescUpdatable {
131//    SQL_ATTR_READONLY = 0,
132//    SQL_ATTR_WRITE = 1,
133//    /// It is unclear whether a column is updatable
134//    SQL_ATTR_READWRITE_UNKNOWN = 2,
135//}
136
137#[derive(Ident)]
138#[identifier(SQLUSMALLINT, 11)]
139#[allow(non_camel_case_types)]
140pub struct SQL_DESC_AUTO_UNIQUE_VALUE;
141
142#[derive(Ident)]
143#[identifier(SQLUSMALLINT, 12)]
144#[allow(non_camel_case_types)]
145pub struct SQL_DESC_CASE_SENSITIVE;
146
147#[derive(Ident)]
148#[identifier(SQLUSMALLINT, 13)]
149#[allow(non_camel_case_types)]
150pub struct SQL_DESC_SEARCHABLE;
151// TODO:
152// SQLIdents subdefines for SQL_COLUMN_SEARCHABLE These are also used by SQLGetInfo
153//pub enum SQL_COLUMN_SEARCHABLE {
154//    SQL_UNSEARCHABLE = 0,
155//    SQL_LIKE_ONLY = 1,
156//    SQL_ALL_EXCEPT_LIKE = 2,
157//    SQL_SEARCHABLE = 3,
158//}
159
160#[derive(Ident)]
161#[identifier(SQLUSMALLINT, 14)]
162#[allow(non_camel_case_types)]
163pub struct SQL_DESC_TYPE_NAME;
164
165#[derive(Ident)]
166#[identifier(SQLUSMALLINT, 15)]
167#[allow(non_camel_case_types)]
168pub struct SQL_DESC_TABLE_NAME;
169
170#[derive(Ident)]
171#[identifier(SQLUSMALLINT, 16)]
172#[allow(non_camel_case_types)]
173pub struct SQL_DESC_SCHEMA_NAME;
174
175#[derive(Ident)]
176#[identifier(SQLUSMALLINT, 17)]
177#[allow(non_camel_case_types)]
178pub struct SQL_DESC_CATALOG_NAME;
179
180#[derive(Ident)]
181#[identifier(SQLUSMALLINT, 18)]
182#[allow(non_camel_case_types)]
183pub struct SQL_DESC_LABEL;
184
185#[derive(Ident)]
186#[identifier(SQLUSMALLINT, 22)]
187#[allow(non_camel_case_types)]
188pub struct SQL_DESC_BASE_COLUMN_NAME;
189
190#[derive(Ident)]
191#[identifier(SQLUSMALLINT, 23)]
192#[allow(non_camel_case_types)]
193pub struct SQL_DESC_BASE_TABLE_NAME;
194
195#[derive(Ident)]
196#[identifier(SQLUSMALLINT, 27)]
197#[allow(non_camel_case_types)]
198pub struct SQL_DESC_LITERAL_PREFIX;
199
200#[derive(Ident)]
201#[identifier(SQLUSMALLINT, 28)]
202#[allow(non_camel_case_types)]
203pub struct SQL_DESC_LITERAL_SUFFIX;
204
205#[derive(Ident)]
206#[identifier(SQLUSMALLINT, 29)]
207#[allow(non_camel_case_types)]
208pub struct SQL_DESC_LOCAL_TYPE_NAME;
209
210#[derive(Ident)]
211#[identifier(SQLUSMALLINT, 32)]
212#[allow(non_camel_case_types)]
213pub struct SQL_DESC_NUM_PREC_RADIX;
214
215#[derive(Ident)]
216#[identifier(SQLUSMALLINT, 1002)]
217#[allow(non_camel_case_types)]
218pub struct SQL_DESC_TYPE;
219
220#[derive(Ident)]
221#[identifier(SQLUSMALLINT, 1003)]
222#[allow(non_camel_case_types)]
223pub struct SQL_DESC_LENGTH;
224
225#[derive(Ident)]
226#[identifier(SQLUSMALLINT, 1005)]
227#[allow(non_camel_case_types)]
228pub struct SQL_DESC_PRECISION;
229
230#[derive(Ident)]
231#[identifier(SQLUSMALLINT, 1006)]
232#[allow(non_camel_case_types)]
233pub struct SQL_DESC_SCALE;
234
235#[derive(Ident)]
236#[identifier(SQLUSMALLINT, 1008)]
237#[allow(non_camel_case_types)]
238pub struct SQL_DESC_NULLABLE;
239
240#[derive(Ident)]
241#[identifier(SQLUSMALLINT, 1011)]
242#[allow(non_camel_case_types)]
243pub struct SQL_DESC_NAME;
244
245#[derive(Ident)]
246#[identifier(SQLUSMALLINT, 1012)]
247#[allow(non_camel_case_types)]
248pub struct SQL_DESC_UNNAMED;
249
250//#[repr(SQLSMALLINT)]
251//pub enum DescUnnamed {
252//    /// SQL_DESC_NAME field of the IRD contains a column alias or a column name
253//    SQL_NAMED = 0,
254//    /// There is no column name or column alias
255//    SQL_UNNAMED = 1,
256//}
257
258#[derive(Ident)]
259#[identifier(SQLUSMALLINT, 1013)]
260#[allow(non_camel_case_types)]
261pub struct SQL_DESC_OCTET_LENGTH;
262
263// TODO: These are unknown, find their values
264// SQL_DESC_NUM_PREC_RADIX, SQL_DESC_CONCISE_TYPE, SQL_DESC_TYPE