1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
use crate::Pointer;

/// Governs behaviour of EnvironmentAttribute
#[repr(i32)]
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum EnvironmentAttribute {
    OdbcVersion = 200,
    ConnectionPooling = 201,
    CpMatch = 202,
    // This attribute was commented out because there is no mention of it in the ODBC specification
    // nor does this attribute exist in unixODBC or iODBC implementations. This attribute exists in
    // Microsoft implementation only and it's usage is unclear.
    // For private driver manager
    // SQL_ATTR_APPLICATION_KEY = 203,
    OutputNts = 10001,
}

/// ODBC verions
///
/// Possible values for `OdbcVersion` attribute set with `SQLSetEnvAttr` to declare ODBC version
#[repr(i32)]
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum AttrOdbcVersion {
    // Not supported by this crate
    // SQL_OV_ODBC2 = 2,
    Odbc3 = 3,
    #[cfg(feature = "odbc_version_3_80")]
    Odbc3_80 = 380,
    #[cfg(feature = "odbc_version_4")]
    Odbc4 = 400,
}

impl From<AttrOdbcVersion> for Pointer {
    fn from(source: AttrOdbcVersion) -> Pointer {
        source as i32 as Pointer
    }
}
/// Connection pool configuration
///
/// Possible values for `ConnectionPooling` attribute set with `SQLSetEnvAttr` to define which
/// pooling scheme will be used.
///
/// See: <https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqlsetenvattr-function>
#[repr(u32)]
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum AttrConnectionPooling {
    /// Connection pooling is turned off. This is the default.
    Off = 0,
    /// A single connection pool is supported for each driver. Every connection in a pool is
    /// associated with one driver.
    OnePerDriver = 1,
    /// A single connection pool is supported for each environment. Every connection in a pool is
    /// associated with one environment.
    OnePerHenv = 2,
    /// Use the connection-pool awareness feature of the driver, if it is available. If the driver
    /// does not support connection-pool awareness, `DriverAware` is ignored and `OnePerHenv` is
    /// used.
    DriverAware = 3,
}

/// Connection pool default configuration
impl Default for AttrConnectionPooling {
    fn default() -> Self {
        AttrConnectionPooling::Off
    }
}

impl From<AttrConnectionPooling> for Pointer {
    fn from(source: AttrConnectionPooling) -> Pointer {
        source as u32 as Pointer
    }
}

/// Determines how a connection is chosen from a connection pool.
///
/// Possible values for `CpMatch` attribute set with [`crate::SQLSetEnvAttr`] to define which connection
/// attributes must match for a connection returned from the pool
#[repr(u32)]
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum AttrCpMatch {
    /// Only connections that exactly match the connection options in the call and the connection
    /// attributes set by the application are reused. This is the default.
    Strict = 0,
    /// Connections with matching connection string keywords can be used. Keywords must match, but
    /// not all connection attributes must match.
    Relaxed = 1,
}

/// Default matching for connections returned from the pool
impl Default for AttrCpMatch {
    fn default() -> Self {
        AttrCpMatch::Strict
    }
}

impl From<AttrCpMatch> for Pointer {
    fn from(source: AttrCpMatch) -> Pointer {
        source as u32 as Pointer
    }
}

/// Statement attributes are characteristics of the statement. For example, whether to use bookmarks
/// and what kind of cursor to use with the statement's result set are statement attributes.
///
/// Statement attributes are set with `SQLSetStmtAttr` and their current settings retrieved with
/// `SQLGetStmtAttr`. There is no requirement that an application set any statement attributes; all
/// statement attributes have defaults, some of which are driver-specific.
/// When a statement attribute can be set depends on the attribute itself. The
/// `Concurrency`, `CursorType, `SimulateCursor`, and `UseBookmars` statement attributes must be set
/// before the statement is executed. The `AsyncEnable` and `NoScan` statement attributes can be set
/// at any time but are not applied until the statement is used again. `MaxLength`, `MaxRows`, and
/// `QueryTimeout` statement attributes can be set at any time, but it is driver-specific whether
/// they are applied before the statement is used again. The remaining statement attributes can be
/// set at any time.
#[repr(i32)]
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum StatementAttribute {
    /// SQL_ATTR_APP_ROW_DESC
    AppRowDesc = 10010,
    /// SQL_ATTR_APP_PARAM_DESC
    AppParamDesc = 10011,
    /// SQL_ATTR_IMP_ROW_DESC
    ImpRowDesc = 10012,
    /// SQL_ATTR_IMP_PARAM_DESC
    ImpParamDesc = 10013,
    /// SQL_ATTR_CURSOR_SCROLLABLE
    CursorScrollable = -1,
    /// SQL_ATTR_CURSOR_SENSITIVITY
    CursorSensitivity = -2,

    // Extensions
    /// SQL_ATTR_ASYNC_ENABLE
    AsyncEnable = 4,
    /// SQL_ATTR_CONCURRENCY
    Concurrency = 7,
    /// SQL_ATTR_CURSOR_TYPE
    CursorType = 6,
    /// SQL_ATTR_ENABLE_AUTO_IPD
    EnableAutoIpd = 15,
    /// SQL_ATTR_FETCH_BOOKMARK_PTR
    FetchBookmarkPtr = 16,
    /// SQL_ATTR_KEYSET_SIZE
    KeysetSize = 8,
    /// SQL_ATTR_MAX_LENGTH
    MaxLength = 3,
    /// SQL_ATTR_MAX_ROWS
    MaxRows = 1,
    /// SQL_ATTR_NOSCAN
    NoScan = 2,
    /// SQL_ATTR_PARAM_BIND_OFFSET_PTR
    ParamBindOffsetPtr = 17,
    /// SQL_ATTR_PARAM_BIND_TYPE
    ParamBindType = 18,
    /// SQL_ATTR_PARAM_OPERATION_PTR
    ParamOpterationPtr = 19,
    /// SQL_ATTR_PARAM_STATUS_PTR
    ParamStatusPtr = 20,
    /// SQL_ATTR_PARAMS_PROCESSED_PTR
    ParamsProcessedPtr = 21,
    // SQL_ATTR_PARAMSET_SIZE
    ParamsetSize = 22,
    /// SQL_ATTR_QUERY_TIMEOUT
    QueryTimeout = 0,
    /// SQL_ATTR_RETRIEVE_DATA
    RetrieveData = 11,
    /// SQL_ATTR_ROW_BIND_OFFSET_PTR
    RowBindOffsetPtr = 23,
    /// SQL_ATTR_ROW_BIND_TYPE
    RowBindType = 5,
    /// SQL_ATTR_ROW_NUMBER `GetStmtAttr`
    RowNumber = 14,
    /// SQL_ATTR_ROW_OPERATION_PTR
    RowOperationPtr = 24,
    /// SQL_ATTR_ROW_STATUS_PTR
    RowStatusPtr = 25,
    /// SQL_ATTR_ROWS_FETCHED_PTR
    RowsFetchedPtr = 26,
    /// SQL_ATTR_ROW_ARRAY_SIZE
    RowArraySize = 27,
    /// SQL_ATTR_SIMULATE_CURSOR
    SimulateCursor = 10,
    /// SQL_ATTR_USE_BOOKMARKS
    UseBookmarks = 12,
    #[cfg(feature = "odbc_version_3_80")]
    /// SQL_ATTR_ASYNC_STMT_EVENT
    AsyncStmtEvent = 29,
    #[cfg(feature = "odbc_version_4")]
    /// SQL_ATTR_SAMPLE_SIZE
    SampleSize = 30,
    #[cfg(feature = "odbc_version_4")]
    /// SQL_ATTR_DYNAMIC_COLUMNS
    DynamicColumns = 31,
    #[cfg(feature = "odbc_version_4")]
    /// SQL_ATTR_TYPE_EXCEPTION_BEHAVIOR
    TypeExceptionBehaviour = 32,
    #[cfg(feature = "odbc_version_4")]
    /// SQL_ATTR_LENGTH_EXCEPTION_BEHAVIOR
    LengthExceptionBehaviour = 33,
    /// SQL_ATTR_METADATA_ID
    MetadataId = 10014,
}