rs_odbc/
env.rs

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
12// Implement EnvAttr for all versions of environment attributes
13impl<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
38// Implement EnvAttr for uninitialized environment attributes
39impl<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
60// Implement EnvAttr for references to unsized (used by AttrSet)
61impl<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//=====================================================================================//
75//-------------------------------------Attributes--------------------------------------//
76
77// TODO: Consider using const generics for OdbcVersion once it's available on stable,
78// otherwise don't expose this attribute unless there is a valid use-case
79#[derive(Ident)]
80#[identifier(SQLINTEGER, 200)]
81#[allow(non_camel_case_types)]
82// This is read-only attribute because
83// it's handled by the type system
84pub(crate) struct SQL_ATTR_ODBC_VERSION;
85//unsafe impl Attr<SQL_ATTR_ODBC_VERSION> for OdbcVersion {
86//    type DefinedBy = OdbcDefined;
87//}
88//impl EnvAttr<SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3> for OdbcVersion {}
89//unsafe impl AttrGet<SQL_ATTR_ODBC_VERSION> for OdbcVersion {}
90
91#[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
113//=====================================================================================//
114
115pub 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);