1#![cfg_attr(not(feature = "std"), no_std)]
2
3pub mod api;
4pub mod attr;
5pub mod c_types;
6pub mod col;
7pub mod conn;
8pub mod convert;
9pub mod desc;
10pub mod diag;
11pub mod env;
12pub mod handle;
13pub mod info;
14pub mod sql_types;
15pub mod sqlreturn;
16pub mod stmt;
17pub mod str;
18
19use core::{ffi::c_void, fmt::Debug};
22use rs_odbc_derive::odbc_type;
23pub use {api::*, c_types::*, sql_types::*};
24pub use {
25    BulkOperation::*, CompletionType::*, DriverCompletion::*, FreeStmtOption::*, FunctionId::*,
26    IdentifierType::*, LockType::*, Operation::*, Reserved::*, Scope::*, Unique::*,
27};
28
29pub type SQLSMALLINT = i16;
32pub type SQLUSMALLINT = u16;
33
34pub type SQLINTEGER = i32;
35pub type SQLUINTEGER = u32;
36
37pub type SQLREAL = f32;
38pub type SQLDOUBLE = f64;
39pub use SQLDOUBLE as SQLFLOAT;
40
41pub type SQLCHAR = u8;
43pub type SQLSCHAR = i8;
44
45pub type SQLWCHAR = u16;
47
48pub type SQLBIGINT = i64;
49pub type SQLUBIGINT = u64;
50
51pub type SQLLEN = isize;
52pub type SQLULEN = usize;
53
54pub type RETCODE = i16;
55
56#[cfg(target_pointer_width = "32")]
57pub type SQLSETPOSIROW = SQLUSMALLINT;
58#[cfg(target_pointer_width = "64")]
59pub type SQLSETPOSIROW = u64;
60
61pub type SQLPOINTER = *mut c_void;
64
65pub trait Ref<'a> {}
70
71pub trait Def {}
72pub enum OdbcDefined {}
73pub enum DriverDefined {}
74impl Def for OdbcDefined {}
75impl Def for DriverDefined {}
76
77const SQL_IS_POINTER: SQLSMALLINT = -4;
78const SQL_IS_UINTEGER: SQLSMALLINT = -5;
79const SQL_IS_INTEGER: SQLSMALLINT = -6;
80const SQL_IS_USMALLINT: SQLSMALLINT = -7;
81const SQL_IS_SMALLINT: SQLSMALLINT = -8;
82
83const SQL_IS_LEN: SQLSMALLINT = SQL_IS_INTEGER;
87const SQL_IS_ULEN: SQLSMALLINT = SQL_IS_UINTEGER;
88
89pub trait Ident {
91    type Type: Copy;
92    const IDENTIFIER: Self::Type;
93}
94impl Ident for SQLSMALLINT {
95    type Type = SQLSMALLINT;
96
97    const IDENTIFIER: Self::Type = SQL_IS_SMALLINT;
98}
99impl Ident for SQLUSMALLINT {
100    type Type = SQLSMALLINT;
101
102    const IDENTIFIER: Self::Type = SQL_IS_USMALLINT;
103}
104impl Ident for SQLINTEGER {
105    type Type = SQLSMALLINT;
106
107    const IDENTIFIER: Self::Type = SQL_IS_INTEGER;
108}
109impl Ident for SQLUINTEGER {
110    type Type = SQLSMALLINT;
111
112    const IDENTIFIER: Self::Type = SQL_IS_UINTEGER;
113}
114impl Ident for SQLLEN {
115    type Type = SQLSMALLINT;
116
117    const IDENTIFIER: Self::Type = SQL_IS_LEN;
118}
119impl Ident for SQLULEN {
120    type Type = SQLSMALLINT;
121
122    const IDENTIFIER: Self::Type = SQL_IS_ULEN;
123}
124impl<T> Ident for [T] {
125    type Type = SQLSMALLINT;
126
127    const IDENTIFIER: Self::Type = SQL_IS_POINTER;
128}
129impl<T> Ident for &T {
130    type Type = SQLSMALLINT;
131
132    const IDENTIFIER: Self::Type = SQL_IS_POINTER;
133}
134impl<T> Ident for &mut T {
135    type Type = SQLSMALLINT;
136
137    const IDENTIFIER: Self::Type = SQL_IS_POINTER;
138}
139
140pub trait Scalar: Copy {}
145impl Scalar for SQLSCHAR {}
146impl Scalar for SQLCHAR {}
147impl Scalar for SQLSMALLINT {}
148impl Scalar for SQLUSMALLINT {}
149impl Scalar for SQLINTEGER {}
150impl Scalar for SQLUINTEGER {}
151impl Scalar for SQLLEN {}
152impl Scalar for SQLULEN {}
153
154#[odbc_type(SQLUINTEGER)]
158#[allow(non_camel_case_types)]
159pub struct OdbcBool;
160pub const SQL_FALSE: OdbcBool = OdbcBool(0);
161pub const SQL_TRUE: OdbcBool = OdbcBool(1);
162
163#[odbc_type(SQLSMALLINT)]
169pub struct NullAllowed;
171pub const SQL_NO_NULLS: NullAllowed = NullAllowed(0);
172pub const SQL_NULLABLE: NullAllowed = NullAllowed(1);
173pub const SQL_NULLABLE_UNKNOWN: NullAllowed = NullAllowed(2);
175
176#[odbc_type(SQLUSMALLINT)]
177#[allow(non_camel_case_types)]
178pub enum DriverCompletion {
179    SQL_DRIVER_NOPROMPT = 0,
180    SQL_DRIVER_COMPLETE = 1,
181    SQL_DRIVER_PROMPT = 2,
182    SQL_DRIVER_COMPLETE_REQUIRED = 3,
183}
184
185#[odbc_type(SQLSMALLINT)]
186#[allow(non_camel_case_types)]
187pub enum IdentifierType {
188    SQL_BEST_ROWID = 1,
189    SQL_ROWVER = 2,
190}
191
192#[odbc_type(SQLUSMALLINT)]
193#[allow(non_camel_case_types)]
194pub enum BulkOperation {
195    SQL_ADD = 4,
196    SQL_UPDATE_BY_BOOKMARK = 5,
197    SQL_DELETE_BY_BOOKMARK = 6,
198    SQL_FETCH_BY_BOOKMARK = 7,
199}
200
201#[odbc_type(SQLUSMALLINT)]
202#[allow(non_camel_case_types)]
203pub enum Operation {
204    SQL_POSITION = 0,
205    SQL_REFRESH = 1,
206    SQL_UPDATE = 2,
207    SQL_DELETE = 3,
208}
209
210#[odbc_type(SQLUSMALLINT)]
211#[allow(non_camel_case_types)]
212pub enum LockType {
213    SQL_LOCK_NO_CHANGE = 0,
214    SQL_LOCK_EXCLUSIVE = 1,
215    SQL_LOCK_UNLOCK = 2,
216}
217
218#[odbc_type(SQLSMALLINT)]
219#[allow(non_camel_case_types)]
220pub enum CompletionType {
221    SQL_COMMIT = 0,
222    SQL_ROLLBACK = 1,
223}
224
225#[odbc_type(SQLUSMALLINT)]
226#[allow(non_camel_case_types)]
227pub enum FreeStmtOption {
228    SQL_CLOSE = 0,
229    SQL_UNBIND = 2,
230    SQL_RESET_PARAMS = 3,
231}
232
233#[odbc_type(SQLUSMALLINT)]
234#[allow(non_camel_case_types)]
235pub enum Reserved {
236    SQL_QUICK = 0,
237    SQL_ENSURE = 1,
238}
239
240#[odbc_type(SQLUSMALLINT)]
241#[allow(non_camel_case_types)]
242pub enum Unique {
243    SQL_INDEX_UNIQUE = 0,
244    SQL_INDEX_ALL = 1,
245}
246
247#[odbc_type(SQLSMALLINT)]
248#[allow(non_camel_case_types)]
249pub enum Scope {
250    SQL_SCOPE_CURROW = 0,
251    SQL_SCOPE_TRANSACTION = 1,
252    SQL_SCOPE_SESSION = 2,
253}
254
255#[odbc_type(SQLSMALLINT)]
256#[allow(non_camel_case_types)]
257pub struct IOType;
259pub const SQL_PARAM_INPUT: IOType = IOType(1);
260pub const SQL_PARAM_INPUT_OUTPUT: IOType = IOType(2);
261pub const SQL_PARAM_OUTPUT: IOType = IOType(4);
262
263pub const SQL_PARAM_INPUT_OUTPUT_STREAM: IOType = IOType(8);
264pub const SQL_PARAM_OUTPUT_STREAM: IOType = IOType(16);
265
266pub const SQL_PARAM_TYPE_UNKNOWN: IOType = IOType(0);
267pub const SQL_RESULT_COL: IOType = IOType(3);
268pub const SQL_RETURN_VALUE: IOType = IOType(5);
269
270pub const SQL_ALL_CATALOGS: &str = "%";
279pub const SQL_ALL_SCHEMAS: &str = "%";
280pub const SQL_ALL_TABLE_TYPES: &str = "%";
281
282#[odbc_type(SQLUSMALLINT)]
283#[allow(non_camel_case_types)]
284pub enum FunctionId {
285    SQL_API_ODBC3_ALL_FUNCTIONS = 999,
286    SQL_API_SQLALLOCCONNECT = 1,
287    SQL_API_SQLALLOCENV = 2,
288    SQL_API_SQLALLOCHANDLE = 1001,
289    SQL_API_SQLALLOCSTMT = 3,
290    SQL_API_SQLBINDCOL = 4,
291    SQL_API_SQLBINDPARAM = 1002,
292    SQL_API_SQLCANCEL = 5,
293    SQL_API_SQLCLOSECURSOR = 1003,
294    SQL_API_SQLCOLATTRIBUTE = 6,
295    SQL_API_SQLCOLUMNS = 40,
296    SQL_API_SQLCONNECT = 7,
297    SQL_API_SQLCOPYDESC = 1004,
298    SQL_API_SQLDATASOURCES = 57,
299    SQL_API_SQLDESCRIBECOL = 8,
300    SQL_API_SQLDISCONNECT = 9,
301    SQL_API_SQLENDTRAN = 1005,
302    SQL_API_SQLERROR = 10,
303    SQL_API_SQLEXECDIRECT = 11,
304    SQL_API_SQLEXECUTE = 12,
305    SQL_API_SQLFETCH = 13,
306    SQL_API_SQLFETCHSCROLL = 1021,
307    SQL_API_SQLFREECONNECT = 14,
308    SQL_API_SQLFREEENV = 15,
309    SQL_API_SQLFREEHANDLE = 1006,
310    SQL_API_SQLFREESTMT = 16,
311    SQL_API_SQLGETCONNECTATTR = 1007,
312    SQL_API_SQLGETCONNECTOPTION = 42,
313    SQL_API_SQLGETCURSORNAME = 17,
314    SQL_API_SQLGETDATA = 43,
315    SQL_API_SQLGETDESCFIELD = 1008,
316    SQL_API_SQLGETDESCREC = 1009,
317    SQL_API_SQLGETDIAGFIELD = 1010,
318    SQL_API_SQLGETDIAGREC = 1011,
319    SQL_API_SQLGETENVATTR = 1012,
320    SQL_API_SQLGETFUNCTIONS = 44,
321    SQL_API_SQLGETINFO = 45,
322    SQL_API_SQLGETSTMTATTR = 1014,
323    SQL_API_SQLGETSTMTOPTION = 46,
324    SQL_API_SQLGETTYPEINFO = 47,
325    SQL_API_SQLNUMRESULTCOLS = 18,
326    SQL_API_SQLPARAMDATA = 48,
327    SQL_API_SQLPREPARE = 19,
328    SQL_API_SQLPUTDATA = 49,
329    SQL_API_SQLROWCOUNT = 20,
330    SQL_API_SQLSETCONNECTATTR = 1016,
331    SQL_API_SQLSETCONNECTOPTION = 50,
332    SQL_API_SQLSETCURSORNAME = 21,
333    SQL_API_SQLSETDESCFIELD = 1017,
334    SQL_API_SQLSETDESCREC = 1018,
335    SQL_API_SQLSETENVATTR = 1019,
336    SQL_API_SQLSETPARAM = 22,
337    SQL_API_SQLSETSTMTATTR = 1020,
338    SQL_API_SQLSETSTMTOPTION = 51,
339    SQL_API_SQLSPECIALCOLUMNS = 52,
340    SQL_API_SQLSTATISTICS = 53,
341    SQL_API_SQLTABLES = 54,
342    SQL_API_SQLTRANSACT = 23,
343    SQL_API_SQLCANCELHANDLE = 1550,
344    SQL_API_SQLCOMPLETEASYNC = 1551,
345}
346
347pub(crate) fn slice_len<T, LEN: TryFrom<usize>>(slice: &[T]) -> LEN
362where
363    LEN::Error: Debug,
364{
365    const SLICE_LEN_TOO_LARGE_MSG: &str = "Slice len too large";
366    LEN::try_from(slice.len()).expect(SLICE_LEN_TOO_LARGE_MSG)
367}
368
369