rs_odbc/
sql_types.rs

1use crate::env::{OdbcVersion, SQL_OV_ODBC3_80, SQL_OV_ODBC4};
2use crate::SQLSMALLINT;
3use rs_odbc_derive::odbc_type;
4
5pub trait SqlType<V: OdbcVersion> {
6    fn identifier(self) -> SQLSMALLINT;
7}
8
9#[odbc_type(SQLSMALLINT)]
10#[allow(non_camel_case_types)]
11pub struct SqlTypeV3;
12
13#[odbc_type(SQLSMALLINT)]
14#[allow(non_camel_case_types)]
15pub struct SqlTypeV3_8;
16
17#[odbc_type(SQLSMALLINT)]
18#[allow(non_camel_case_types)]
19pub struct SqlTypeV4;
20
21impl<V: OdbcVersion> SqlType<V> for SqlTypeV3 {
22    fn identifier(self) -> SQLSMALLINT { self.0 }
23}
24impl SqlType<SQL_OV_ODBC3_80> for SqlTypeV3_8 {
25    fn identifier(self) -> SQLSMALLINT { self.0 }
26}
27impl SqlType<SQL_OV_ODBC4> for SqlTypeV3_8 {
28    fn identifier(self) -> SQLSMALLINT { self.0 }
29}
30impl SqlType<SQL_OV_ODBC4> for SqlTypeV4 {
31    fn identifier(self) -> SQLSMALLINT { self.0 }
32}
33
34/// Data type cannot be determined
35pub const SQL_UNKNOWN_TYPE: SqlTypeV3 = SqlTypeV3(0);
36
37/// Column whose type may vary across rows
38pub const SQL_VARIANT_TYPE: SqlTypeV4 = SqlTypeV4(SQL_UNKNOWN_TYPE.0);
39
40/// Character string of fixed string length n.
41///
42/// SQL data type: CHAR(n)
43pub const SQL_CHAR: SqlTypeV3 = SqlTypeV3(1);
44
45/// Variable-length character string with a maximum string length n.
46///
47/// SQL data type: VARCHAR(n)
48pub const SQL_VARCHAR: SqlTypeV3 = SqlTypeV3(12);
49
50/// Variable length character data. Maximum length is data source-dependent.
51///
52/// SQL data type: LONG VARCHAR
53pub const SQL_LONGVARCHAR: SqlTypeV3 = SqlTypeV3(-1);
54
55/// Unicode character string of fixed string length n
56///
57/// SQL data type: WCHAR(n)
58pub const SQL_WCHAR: SqlTypeV3 = SqlTypeV3(-8);
59
60/// Unicode variable-length character string with a maximum string length n
61///
62/// SQL data type: VARWCHAR(n)
63pub const SQL_WVARCHAR: SqlTypeV3 = SqlTypeV3(-9);
64
65/// Unicode variable-length character data. Maximum length is data source-dependent
66///
67/// SQL data type: LONGWVARCHAR
68pub const SQL_WLONGVARCHAR: SqlTypeV3 = SqlTypeV3(-10);
69
70/// Signed, exact, numeric value with a precision of at least p and scale s. (The maximum precision is driver-defined.) (1 <= p <= 15; s <= p).
71///
72/// SQL data type: DECIMAL(p,s)
73pub const SQL_DECIMAL: SqlTypeV3 = SqlTypeV3(3);
74
75/// Signed, exact, numeric value with a precision p and scale s (1 <= p <= 15; s <= p).
76///
77/// SQL data type: NUMERIC(p,s)
78pub const SQL_NUMERIC: SqlTypeV3 = SqlTypeV3(2);
79
80/// Exact numeric value with precision 5 and scale 0  (signed:  -32,768 <= n <= 32,767, unsigned:  0 <= n <= 65,535).
81///
82/// SQL data type: SMALLINT
83pub const SQL_SMALLINT: SqlTypeV3 = SqlTypeV3(5);
84
85/// Exact numeric value with precision 10 and scale 0  (signed:  -2[31] <= n <= 2[31] - 1, unsigned:  0 <= n <= 2[32] - 1).
86///
87/// SQL data type: INTEGER
88pub const SQL_INTEGER: SqlTypeV3 = SqlTypeV3(4);
89
90/// Signed, approximate, numeric value with a binary precision 24 (zero or absolute value 10[-38] to 10[38]).
91///
92/// SQL data type: REAL
93pub const SQL_REAL: SqlTypeV3 = SqlTypeV3(7);
94
95/// Signed, approximate, numeric value with a binary precision of at least p. (The maximum precision is driver-defined.)
96///
97/// SQL data type: FLOAT(p)
98pub const SQL_FLOAT: SqlTypeV3 = SqlTypeV3(6);
99
100/// Signed, approximate, numeric value with a binary precision 53 (zero or absolute value 10[-308] to 10[308]).
101///
102/// SQL data type: DOUBLE PRECISION
103pub const SQL_DOUBLE: SqlTypeV3 = SqlTypeV3(8);
104
105/// Single bit binary data.
106///
107/// SQL data type: BIT
108pub const SQL_BIT: SqlTypeV3 = SqlTypeV3(-7);
109
110/// Exact numeric value with precision 3 and scale 0  (signed:  -128 <= n <= 127,  unsigned:  0 <= n <= 255).
111///
112/// SQL data type: TINYINT
113pub const SQL_TINYINT: SqlTypeV3 = SqlTypeV3(-6);
114
115/// Exact numeric value with precision 19 (if signed) or 20 (if unsigned) and scale 0  (signed:  -2[63] <= n <= 2[63] - 1,  unsigned: 0 <= n <= 2[64] - 1),.
116///
117/// SQL data type: BIGINT
118pub const SQL_BIGINT: SqlTypeV3 = SqlTypeV3(-5);
119
120/// Binary data of fixed length n.
121///
122/// SQL data type: BINARY(n)
123pub const SQL_BINARY: SqlTypeV3 = SqlTypeV3(-2);
124
125/// Variable length binary data of maximum length n. The maximum is set by the user.
126///
127/// SQL data type: VARBINARY(n)
128pub const SQL_VARBINARY: SqlTypeV3 = SqlTypeV3(-3);
129
130/// Variable length binary data. Maximum length is data source-dependent.
131///
132/// SQL data type: LONG VARBINARY
133pub const SQL_LONGVARBINARY: SqlTypeV3 = SqlTypeV3(-4);
134
135/// Fixed length GUID.
136///
137/// SQL data type: GUID
138// TODO: This is V3_5
139pub const SQL_GUID: SqlTypeV3_8 = SqlTypeV3_8(-11);
140
141/// Year, month, and day fields, conforming to the rules of the Gregorian calendar. (See Constraints of the Gregorian Calendar, later in this appendix.)
142///
143/// SQL data type: DATE
144pub const SQL_TYPE_DATE: SqlTypeV3 = SqlTypeV3(91);
145
146/// Hour, minute, and second fields, with valid values for hours of 00 to 23, valid values for minutes of 00 to 59, and valid values for seconds of 00 to 61. Precision p indicates the seconds precision.
147///
148/// SQL data type: TIME(p)
149pub const SQL_TYPE_TIME: SqlTypeV3 = SqlTypeV3(92);
150
151/// Year, month, day, hour, minute, and second fields, with valid values as defined for the DATE and TIME data types.
152///
153/// SQL data type: TIMESTAMP(p)
154pub const SQL_TYPE_TIMESTAMP: SqlTypeV3 = SqlTypeV3(93);
155
156pub const SQL_TYPE_TIME_WITH_TIMEZONE: SqlTypeV4 = SqlTypeV4(94);
157pub const SQL_TYPE_TIMESTAMP_WITH_TIMEZONE: SqlTypeV4 = SqlTypeV4(95);
158
159// TODO: These are not found in the reference implementation but exist in documentation
160//    /// Year, month, day, hour, minute, second, utchour, and utcminute fields. The utchour and utcminute fields have 1/10 microsecond precision.
161//    ///
162//    /// SQL data type: UTCDATETIME
163//    pub const SQL_TYPE_UTCDATETIME: SqlTypeV3 = SqlTypeV3(x);
164//
165//    /// Hour, minute, second, utchour, and utcminute fields. The utchour and utcminute fields have 1/10 microsecond precision..
166//    ///
167//    /// SQL data type: UTCTIME
168//    pub const SQL_TYPE_UTCTIME: SqlTypeV3 = SqlTypeV3(x);
169
170/// Number of months between two dates; p is the interval leading precision.
171///
172/// SQL data type: INTERVAL MONTH(p)
173pub const SQL_INTERVAL_MONTH: SqlTypeV3 = SqlTypeV3(100 + SQL_CODE_MONTH.0);
174
175/// Number of years between two dates; p is the interval leading precision.
176///
177/// SQL data type: INTERVAL YEAR(p)
178pub const SQL_INTERVAL_YEAR: SqlTypeV3 = SqlTypeV3(100 + SQL_CODE_YEAR.0);
179
180/// Number of years and months between two dates; p is the interval leading precision.
181///
182/// SQL data type: INTERVAL YEAR(p) TO MONTH
183pub const SQL_INTERVAL_YEAR_TO_MONTH: SqlTypeV3 = SqlTypeV3(100 + SQL_CODE_YEAR_TO_MONTH.0);
184
185/// Number of days between two dates; p is the interval leading precision.
186///
187/// SQL data type: INTERVAL DAY(p)
188pub const SQL_INTERVAL_DAY: SqlTypeV3 = SqlTypeV3(100 + SQL_CODE_DAY.0);
189
190/// Number of hours between two date/times; p is the interval leading precision.
191///
192/// SQL data type: INTERVAL HOUR(p)
193pub const SQL_INTERVAL_HOUR: SqlTypeV3 = SqlTypeV3(100 + SQL_CODE_HOUR.0);
194
195/// Number of minutes between two date/times; p is the interval leading precision.
196///
197/// SQL data type: INTERVAL MINUTE(p)
198pub const SQL_INTERVAL_MINUTE: SqlTypeV3 = SqlTypeV3(100 + SQL_CODE_MINUTE.0);
199
200/// Number of seconds between two date/times; p is the interval leading precision and q is the interval seconds precision.
201///
202/// SQL data type: INTERVAL SECOND(p,q)
203pub const SQL_INTERVAL_SECOND: SqlTypeV3 = SqlTypeV3(100 + SQL_CODE_SECOND.0);
204
205/// Number of days/hours between two date/times; p is the interval leading precision.
206///
207/// SQL data type: INTERVAL DAY(p) TO HOUR
208pub const SQL_INTERVAL_DAY_TO_HOUR: SqlTypeV3 = SqlTypeV3(100 + SQL_CODE_DAY_TO_HOUR.0);
209
210/// Number of days/hours/minutes between two date/times; p is the interval leading precision.
211///
212/// SQL data type: INTERVAL DAY(p) TO MINUTE
213pub const SQL_INTERVAL_DAY_TO_MINUTE: SqlTypeV3 = SqlTypeV3(100 + SQL_CODE_DAY_TO_MINUTE.0);
214
215/// Number of days/hours/minutes/seconds between two date/times; p is the interval leading precision and q is the interval seconds precision.
216///
217/// SQL data type: INTERVAL DAY(p) TO SECOND(q)
218pub const SQL_INTERVAL_DAY_TO_SECOND: SqlTypeV3 = SqlTypeV3(100 + SQL_CODE_DAY_TO_SECOND.0);
219
220/// Number of hours/minutes between two date/times; p is the interval leading precision.
221///
222/// SQL data type: INTERVAL HOUR(p) TO MINUTE
223pub const SQL_INTERVAL_HOUR_TO_MINUTE: SqlTypeV3 = SqlTypeV3(100 + SQL_CODE_HOUR_TO_MINUTE.0);
224
225/// Number of hours/minutes/seconds between two date/times; p is the interval leading precision and q is the interval seconds precision.
226///
227/// SQL data type: INTERVAL HOUR(p) TO SECOND(q)
228pub const SQL_INTERVAL_HOUR_TO_SECOND: SqlTypeV3 = SqlTypeV3(100 + SQL_CODE_HOUR_TO_SECOND.0);
229
230/// Number of minutes/seconds between two date/times; p is the interval leading precision and q is the interval seconds precision.
231///
232/// SQL data type: INTERVAL MINUTE(p) TO SECOND(q)
233pub const SQL_INTERVAL_MINUTE_TO_SECOND: SqlTypeV3 = SqlTypeV3(100 + SQL_CODE_MINUTE_TO_SECOND.0);
234
235pub const SQL_UDT: SqlTypeV4 = SqlTypeV4(17);
236pub const SQL_ROW: SqlTypeV4 = SqlTypeV4(19);
237pub const SQL_ARRAY: SqlTypeV4 = SqlTypeV4(50);
238pub const SQL_MULTISET: SqlTypeV4 = SqlTypeV4(55);
239
240// =================================================================================== //
241
242/// Datetime verbose type identifier.
243pub const SQL_DATETIME: SqlTypeV3 = SqlTypeV3(9);
244
245/// Interval verbose type identifier.
246pub const SQL_INTERVAL: SqlTypeV3 = SqlTypeV3(10);
247
248#[odbc_type(SQLSMALLINT)]
249#[allow(non_camel_case_types)]
250pub struct DatetimeIntervalCode;
251
252// Subcodes for the specific verbose datetime data type
253pub const SQL_CODE_DATE: DatetimeIntervalCode = DatetimeIntervalCode(1);
254pub const SQL_CODE_TIME: DatetimeIntervalCode = DatetimeIntervalCode(2);
255pub const SQL_CODE_TIMESTAMP: DatetimeIntervalCode = DatetimeIntervalCode(3);
256
257// Subcode for the specific verbose interval data type
258pub const SQL_CODE_YEAR: DatetimeIntervalCode = DatetimeIntervalCode(1);
259pub const SQL_CODE_MONTH: DatetimeIntervalCode = DatetimeIntervalCode(2);
260pub const SQL_CODE_DAY: DatetimeIntervalCode = DatetimeIntervalCode(3);
261pub const SQL_CODE_HOUR: DatetimeIntervalCode = DatetimeIntervalCode(4);
262pub const SQL_CODE_MINUTE: DatetimeIntervalCode = DatetimeIntervalCode(5);
263pub const SQL_CODE_SECOND: DatetimeIntervalCode = DatetimeIntervalCode(6);
264pub const SQL_CODE_YEAR_TO_MONTH: DatetimeIntervalCode = DatetimeIntervalCode(7);
265pub const SQL_CODE_DAY_TO_HOUR: DatetimeIntervalCode = DatetimeIntervalCode(8);
266pub const SQL_CODE_DAY_TO_MINUTE: DatetimeIntervalCode = DatetimeIntervalCode(9);
267pub const SQL_CODE_DAY_TO_SECOND: DatetimeIntervalCode = DatetimeIntervalCode(10);
268pub const SQL_CODE_HOUR_TO_MINUTE: DatetimeIntervalCode = DatetimeIntervalCode(11);
269pub const SQL_CODE_HOUR_TO_SECOND: DatetimeIntervalCode = DatetimeIntervalCode(12);
270pub const SQL_CODE_MINUTE_TO_SECOND: DatetimeIntervalCode = DatetimeIntervalCode(13);