1use crate::attr::{Attr, AttrGet, AttrLen, AttrSet};
2use crate::str::{OdbcChar, OdbcStr};
3use crate::{Ident, OdbcDefined, Scalar, SQLCHAR, SQLINTEGER, SQLUINTEGER, SQLWCHAR};
4use core::mem::MaybeUninit;
5use rs_odbc_derive::{odbc_type, Ident};
6
7pub trait EnvAttr<A: Ident, V: OdbcVersion>:
8 Attr<A, DefinedBy = OdbcDefined> + AttrLen<OdbcDefined, SQLINTEGER>
9{
10}
11
12impl<A: Ident, T: Scalar> EnvAttr<A, SQL_OV_ODBC3_80> for T where
14 T: EnvAttr<A, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>
15{
16}
17impl<A: Ident, T: Scalar> EnvAttr<A, SQL_OV_ODBC4> for T where
18 T: EnvAttr<A, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>
19{
20}
21impl<A: Ident, T: Scalar> EnvAttr<A, SQL_OV_ODBC3_80> for [T] where
22 [T]: EnvAttr<A, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>
23{
24}
25impl<A: Ident, T: Scalar> EnvAttr<A, SQL_OV_ODBC4> for [T] where
26 [T]: EnvAttr<A, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>
27{
28}
29impl<A: Ident, CH: OdbcChar> EnvAttr<A, SQL_OV_ODBC3_80> for OdbcStr<CH> where
30 OdbcStr<CH>: EnvAttr<A, <SQL_OV_ODBC3_80 as OdbcVersion>::PrevVersion>
31{
32}
33impl<A: Ident, CH: OdbcChar> EnvAttr<A, SQL_OV_ODBC4> for OdbcStr<CH> where
34 OdbcStr<CH>: EnvAttr<A, <SQL_OV_ODBC4 as OdbcVersion>::PrevVersion>
35{
36}
37
38impl<A: Ident, T: Scalar, V: OdbcVersion> EnvAttr<A, V> for MaybeUninit<T>
40where
41 T: EnvAttr<A, V> + AttrGet<A>,
42 Self: AttrLen<OdbcDefined, SQLINTEGER>,
43{
44}
45impl<A: Ident, T: Scalar, V: OdbcVersion> EnvAttr<A, V> for [MaybeUninit<T>]
46where
47 [T]: EnvAttr<A, V> + AttrGet<A>,
48 Self: AttrLen<OdbcDefined, SQLINTEGER>,
49{
50}
51impl<A: Ident, V: OdbcVersion> EnvAttr<A, V> for OdbcStr<MaybeUninit<SQLCHAR>> where
52 OdbcStr<SQLCHAR>: EnvAttr<A, V> + AttrGet<A>
53{
54}
55impl<A: Ident, V: OdbcVersion> EnvAttr<A, V> for OdbcStr<MaybeUninit<SQLWCHAR>> where
56 OdbcStr<SQLWCHAR>: EnvAttr<A, V> + AttrGet<A>
57{
58}
59
60impl<A: Ident, T: Scalar, V: OdbcVersion> EnvAttr<A, V> for &[T]
62where
63 [T]: EnvAttr<A, V>,
64 Self: AttrSet<A>,
65{
66}
67impl<A: Ident, CH: OdbcChar, V: OdbcVersion> EnvAttr<A, V> for &OdbcStr<CH>
68where
69 OdbcStr<CH>: EnvAttr<A, V>,
70 Self: AttrSet<A>,
71{
72}
73
74#[derive(Ident)]
80#[identifier(SQLINTEGER, 200)]
81#[allow(non_camel_case_types)]
82pub(crate) struct SQL_ATTR_ODBC_VERSION;
85#[derive(Ident)]
92#[identifier(SQLINTEGER, 202)]
93#[allow(non_camel_case_types)]
94pub struct SQL_ATTR_CP_MATCH;
95unsafe impl Attr<SQL_ATTR_CP_MATCH> for CpMatch {
96 type DefinedBy = OdbcDefined;
97}
98impl EnvAttr<SQL_ATTR_CP_MATCH, SQL_OV_ODBC3> for CpMatch {}
99unsafe impl AttrGet<SQL_ATTR_CP_MATCH> for CpMatch {}
100unsafe impl AttrSet<SQL_ATTR_CP_MATCH> for CpMatch {}
101
102#[derive(Ident)]
103#[identifier(SQLINTEGER, 201)]
104#[allow(non_camel_case_types)]
105pub struct SQL_ATTR_CONNECTION_POOLING;
106unsafe impl Attr<SQL_ATTR_CONNECTION_POOLING> for ConnectionPooling {
107 type DefinedBy = OdbcDefined;
108}
109impl EnvAttr<SQL_ATTR_CONNECTION_POOLING, SQL_OV_ODBC3_80> for ConnectionPooling {}
110unsafe impl AttrGet<SQL_ATTR_CONNECTION_POOLING> for ConnectionPooling {}
111unsafe impl AttrSet<SQL_ATTR_CONNECTION_POOLING> for ConnectionPooling {}
112
113pub trait OdbcVersion {
116 type PrevVersion: OdbcVersion;
117 const IDENTIFIER: SQLUINTEGER;
118}
119#[derive(Debug)]
120#[allow(non_camel_case_types)]
121pub enum SQL_OV_ODBC3 {}
122impl OdbcVersion for SQL_OV_ODBC3 {
123 type PrevVersion = SQL_OV_ODBC3;
124 const IDENTIFIER: SQLUINTEGER = 3;
125}
126#[derive(Debug)]
127#[allow(non_camel_case_types)]
128pub enum SQL_OV_ODBC3_80 {}
129impl OdbcVersion for SQL_OV_ODBC3_80 {
130 type PrevVersion = SQL_OV_ODBC3;
131 const IDENTIFIER: SQLUINTEGER = 380;
132}
133#[derive(Debug)]
134#[allow(non_camel_case_types)]
135pub enum SQL_OV_ODBC4 {}
136impl OdbcVersion for SQL_OV_ODBC4 {
137 type PrevVersion = SQL_OV_ODBC3_80;
138 const IDENTIFIER: SQLUINTEGER = 400;
139}
140
141#[odbc_type(SQLUINTEGER)]
142pub struct CpMatch;
143pub const SQL_CP_STRICT_MATCH: CpMatch = CpMatch(0);
144pub const SQL_CP_RELAXED_MATCH: CpMatch = CpMatch(1);
145
146#[odbc_type(SQLUINTEGER)]
147pub struct ConnectionPooling;
148pub const SQL_CP_OFF: ConnectionPooling = ConnectionPooling(0);
149pub const SQL_CP_ONE_PER_DRIVER: ConnectionPooling = ConnectionPooling(1);
150pub const SQL_CP_ONE_PER_HENV: ConnectionPooling = ConnectionPooling(2);
151pub const SQL_CP_DRIVER_AWARE: ConnectionPooling = ConnectionPooling(3);