Line data Source code
1 : /* FreeTDS - Library of routines accessing Sybase and Microsoft databases
2 : * Copyright (C) 2008 Frediano Ziglio
3 : *
4 : * This library is free software; you can redistribute it and/or
5 : * modify it under the terms of the GNU Library General Public
6 : * License as published by the Free Software Foundation; either
7 : * version 2 of the License, or (at your option) any later version.
8 : *
9 : * This library is distributed in the hope that it will be useful,
10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 : * Library General Public License for more details.
13 : *
14 : * You should have received a copy of the GNU Library General Public
15 : * License along with this library; if not, write to the
16 : * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 : * Boston, MA 02111-1307, USA.
18 : */
19 :
20 : #ifndef _odbcss_h_
21 : #define _odbcss_h_
22 :
23 : #ifdef TDSODBC_BCP
24 : #include <sql.h>
25 : #endif
26 :
27 : #ifdef __cplusplus
28 : extern "C" {
29 : #endif
30 :
31 : #define SQL_DIAG_SS_MSGSTATE (-1150)
32 : #define SQL_DIAG_SS_LINE (-1154)
33 :
34 : #define SQL_SOPT_SS_QUERYNOTIFICATION_TIMEOUT 1233
35 : #define SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT 1234
36 : #define SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS 1235
37 : #define SQL_SOPT_SS_PARAM_FOCUS 1236
38 :
39 : #ifndef SQL_SS_LENGTH_UNLIMITED
40 : #define SQL_SS_LENGTH_UNLIMITED 0
41 : #endif
42 :
43 : #ifndef SQL_COPT_SS_BASE
44 : #define SQL_COPT_SS_BASE 1200
45 : #endif
46 :
47 : #ifndef SQL_COPT_SS_ATTACHDBFILENAME
48 : #define SQL_COPT_SS_ATTACHDBFILENAME (SQL_COPT_SS_BASE+21)
49 : #endif
50 :
51 : #ifndef SQL_COPT_SS_MARS_ENABLED
52 : #define SQL_COPT_SS_MARS_ENABLED (SQL_COPT_SS_BASE+24)
53 : #endif
54 :
55 : #ifndef SQL_COPT_SS_OLDPWD
56 : #define SQL_COPT_SS_OLDPWD (SQL_COPT_SS_BASE+26)
57 : #endif
58 :
59 : #define SQL_INFO_FREETDS_TDS_VERSION 1300
60 : #define SQL_INFO_FREETDS_SOCKET 1301
61 :
62 : #ifndef SQL_MARS_ENABLED_NO
63 : #define SQL_MARS_ENABLED_NO 0
64 : #endif
65 :
66 : #ifndef SQL_MARS_ENABLED_YES
67 : #define SQL_MARS_ENABLED_YES 1
68 : #endif
69 :
70 : #ifndef SQL_SS_VARIANT
71 : #define SQL_SS_VARIANT (-150)
72 : #endif
73 :
74 : #ifndef SQL_SS_UDT
75 : #define SQL_SS_UDT (-151)
76 : #endif
77 :
78 : #ifndef SQL_SS_XML
79 : #define SQL_SS_XML (-152)
80 : #endif
81 :
82 : #ifndef SQL_SS_TABLE
83 : #define SQL_SS_TABLE (-153)
84 : #endif
85 :
86 : #ifndef SQL_SS_TIME2
87 : #define SQL_SS_TIME2 (-154)
88 : #endif
89 :
90 : #ifndef SQL_SS_TIMESTAMPOFFSET
91 : #define SQL_SS_TIMESTAMPOFFSET (-155)
92 : #endif
93 :
94 : /*
95 : * these types are used from conversion from client to server
96 : */
97 : #ifndef SQL_C_SS_TIME2
98 : #define SQL_C_SS_TIME2 (0x4000)
99 : #endif
100 :
101 : #ifndef SQL_C_SS_TIMESTAMPOFFSET
102 : #define SQL_C_SS_TIMESTAMPOFFSET (0x4001)
103 : #endif
104 :
105 : #ifndef SQL_CA_SS_BASE
106 : #define SQL_CA_SS_BASE 1200
107 : #endif
108 :
109 : #ifndef SQL_CA_SS_UDT_CATALOG_NAME
110 : #define SQL_CA_SS_UDT_CATALOG_NAME (SQL_CA_SS_BASE+18)
111 : #endif
112 :
113 : #ifndef SQL_CA_SS_UDT_SCHEMA_NAME
114 : #define SQL_CA_SS_UDT_SCHEMA_NAME (SQL_CA_SS_BASE+19)
115 : #endif
116 :
117 : #ifndef SQL_CA_SS_UDT_TYPE_NAME
118 : #define SQL_CA_SS_UDT_TYPE_NAME (SQL_CA_SS_BASE+20)
119 : #endif
120 :
121 : #ifndef SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME
122 : #define SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME (SQL_CA_SS_BASE+21)
123 : #endif
124 :
125 : #ifndef SQL_CA_SS_XML_SCHEMACOLLECTION_CATALOG_NAME
126 : #define SQL_CA_SS_XML_SCHEMACOLLECTION_CATALOG_NAME (SQL_CA_SS_BASE+22)
127 : #endif
128 :
129 : #ifndef SQL_CA_SS_XML_SCHEMACOLLECTION_SCHEMA_NAME
130 : #define SQL_CA_SS_XML_SCHEMACOLLECTION_SCHEMA_NAME (SQL_CA_SS_BASE+23)
131 : #endif
132 :
133 : #ifndef SQL_CA_SS_XML_SCHEMACOLLECTION_NAME
134 : #define SQL_CA_SS_XML_SCHEMACOLLECTION_NAME (SQL_CA_SS_BASE+24)
135 : #endif
136 :
137 : typedef struct tagSS_TIME2_STRUCT {
138 : SQLUSMALLINT hour;
139 : SQLUSMALLINT minute;
140 : SQLUSMALLINT second;
141 : SQLUINTEGER fraction;
142 : } SQL_SS_TIME2_STRUCT;
143 :
144 : typedef struct tagSS_TIMESTAMPOFFSET_STRUCT {
145 : SQLSMALLINT year;
146 : SQLUSMALLINT month;
147 : SQLUSMALLINT day;
148 : SQLUSMALLINT hour;
149 : SQLUSMALLINT minute;
150 : SQLUSMALLINT second;
151 : SQLUINTEGER fraction;
152 : SQLSMALLINT timezone_hour;
153 : SQLSMALLINT timezone_minute;
154 : } SQL_SS_TIMESTAMPOFFSET_STRUCT;
155 :
156 : #define SQL_COPT_TDSODBC_IMPL_BASE 1500
157 : /* note: values +0 to +8 allocated to TDSODBC_BCP options below */
158 : #define SQL_COPT_TDSODBC_DATETIME_FORMAT (SQL_COPT_TDSODBC_IMPL_BASE+9)
159 : #define SQL_COPT_TDSODBC_DATE_FORMAT (SQL_COPT_TDSODBC_IMPL_BASE+10)
160 : #define SQL_COPT_TDSODBC_TIME_FORMAT (SQL_COPT_TDSODBC_IMPL_BASE+11)
161 :
162 : #ifdef TDSODBC_BCP
163 :
164 : #ifndef SUCCEED
165 : #define SUCCEED 1
166 : #endif
167 : #ifndef FAIL
168 : #define FAIL 0
169 : #endif
170 :
171 : #ifndef BCPKEEPIDENTITY
172 : #define BCPKEEPIDENTITY 8
173 : #endif
174 : #ifndef BCPHINTSA
175 : #define BCPHINTSA 10
176 : #endif
177 : #ifndef BCPHINTSW
178 : #define BCPHINTSW 11
179 : #endif
180 :
181 : #define BCP_DIRECTION_IN 1
182 :
183 : #define SQL_COPT_SS_BCP (SQL_COPT_SS_BASE+19)
184 : #define SQL_BCP_OFF 0
185 : #define SQL_BCP_ON 1
186 :
187 : #define SQL_COPT_TDSODBC_IMPL_BCP_INITA (SQL_COPT_TDSODBC_IMPL_BASE)
188 : /* deprecated SQL_COPT_TDSODBC_IMPL_BCP_CONTROL */
189 : #define SQL_COPT_TDSODBC_IMPL_BCP_COLPTR (SQL_COPT_TDSODBC_IMPL_BASE+2)
190 : #define SQL_COPT_TDSODBC_IMPL_BCP_SENDROW (SQL_COPT_TDSODBC_IMPL_BASE+3)
191 : #define SQL_COPT_TDSODBC_IMPL_BCP_BATCH (SQL_COPT_TDSODBC_IMPL_BASE+4)
192 : #define SQL_COPT_TDSODBC_IMPL_BCP_DONE (SQL_COPT_TDSODBC_IMPL_BASE+5)
193 : #define SQL_COPT_TDSODBC_IMPL_BCP_BIND (SQL_COPT_TDSODBC_IMPL_BASE+6)
194 : #define SQL_COPT_TDSODBC_IMPL_BCP_INITW (SQL_COPT_TDSODBC_IMPL_BASE+7)
195 : #define SQL_COPT_TDSODBC_IMPL_BCP_CONTROL (SQL_COPT_TDSODBC_IMPL_BASE+8)
196 :
197 : #define SQL_VARLEN_DATA -10
198 :
199 : /* copied from sybdb.h which was copied from tds.h */
200 : /* TODO find a much better way... */
201 : enum
202 : {
203 : BCP_TYPE_SQLCHAR = 47, /* 0x2F */
204 : #define BCP_TYPE_SQLCHAR BCP_TYPE_SQLCHAR
205 : BCP_TYPE_SQLVARCHAR = 39, /* 0x27 */
206 : #define BCP_TYPE_SQLVARCHAR BCP_TYPE_SQLVARCHAR
207 : BCP_TYPE_SQLINTN = 38, /* 0x26 */
208 : #define BCP_TYPE_SQLINTN BCP_TYPE_SQLINTN
209 : BCP_TYPE_SQLINT1 = 48, /* 0x30 */
210 : #define BCP_TYPE_SQLINT1 BCP_TYPE_SQLINT1
211 : BCP_TYPE_SQLINT2 = 52, /* 0x34 */
212 : #define BCP_TYPE_SQLINT2 BCP_TYPE_SQLINT2
213 : BCP_TYPE_SQLINT4 = 56, /* 0x38 */
214 : #define BCP_TYPE_SQLINT4 BCP_TYPE_SQLINT4
215 : BCP_TYPE_SQLINT8 = 127, /* 0x7F */
216 : #define BCP_TYPE_SQLINT8 BCP_TYPE_SQLINT8
217 : BCP_TYPE_SQLFLT8 = 62, /* 0x3E */
218 : #define BCP_TYPE_SQLFLT8 BCP_TYPE_SQLFLT8
219 : BCP_TYPE_SQLDATETIME = 61, /* 0x3D */
220 : #define BCP_TYPE_SQLDATETIME BCP_TYPE_SQLDATETIME
221 : BCP_TYPE_SQLBIT = 50, /* 0x32 */
222 : #define BCP_TYPE_SQLBIT BCP_TYPE_SQLBIT
223 : BCP_TYPE_SQLBITN = 104, /* 0x68 */
224 : #define BCP_TYPE_SQLBITN BCP_TYPE_SQLBITN
225 : BCP_TYPE_SQLTEXT = 35, /* 0x23 */
226 : #define BCP_TYPE_SQLTEXT BCP_TYPE_SQLTEXT
227 : BCP_TYPE_SQLNTEXT = 99, /* 0x63 */
228 : #define BCP_TYPE_SQLNTEXT BCP_TYPE_SQLNTEXT
229 : BCP_TYPE_SQLIMAGE = 34, /* 0x22 */
230 : #define BCP_TYPE_SQLIMAGE BCP_TYPE_SQLIMAGE
231 : BCP_TYPE_SQLMONEY4 = 122, /* 0x7A */
232 : #define BCP_TYPE_SQLMONEY4 BCP_TYPE_SQLMONEY4
233 : BCP_TYPE_SQLMONEY = 60, /* 0x3C */
234 : #define BCP_TYPE_SQLMONEY BCP_TYPE_SQLMONEY
235 : BCP_TYPE_SQLDATETIME4 = 58, /* 0x3A */
236 : #define BCP_TYPE_SQLDATETIME4 BCP_TYPE_SQLDATETIME4
237 : BCP_TYPE_SQLREAL = 59, /* 0x3B */
238 : BCP_TYPE_SQLFLT4 = 59, /* 0x3B */
239 : #define BCP_TYPE_SQLREAL BCP_TYPE_SQLREAL
240 : #define BCP_TYPE_SQLFLT4 BCP_TYPE_SQLFLT4
241 : BCP_TYPE_SQLBINARY = 45, /* 0x2D */
242 : #define BCP_TYPE_SQLBINARY BCP_TYPE_SQLBINARY
243 : BCP_TYPE_SQLVOID = 31, /* 0x1F */
244 : #define BCP_TYPE_SQLVOID BCP_TYPE_SQLVOID
245 : BCP_TYPE_SQLVARBINARY = 37, /* 0x25 */
246 : #define BCP_TYPE_SQLVARBINARY BCP_TYPE_SQLVARBINARY
247 : BCP_TYPE_SQLNUMERIC = 108, /* 0x6C */
248 : #define BCP_TYPE_SQLNUMERIC BCP_TYPE_SQLNUMERIC
249 : BCP_TYPE_SQLDECIMAL = 106, /* 0x6A */
250 : #define BCP_TYPE_SQLDECIMAL BCP_TYPE_SQLDECIMAL
251 : BCP_TYPE_SQLFLTN = 109, /* 0x6D */
252 : #define BCP_TYPE_SQLFLTN BCP_TYPE_SQLFLTN
253 : BCP_TYPE_SQLMONEYN = 110, /* 0x6E */
254 : #define BCP_TYPE_SQLMONEYN BCP_TYPE_SQLMONEYN
255 : BCP_TYPE_SQLDATETIMN = 111, /* 0x6F */
256 : #define BCP_TYPE_SQLDATETIMN BCP_TYPE_SQLDATETIMN
257 : BCP_TYPE_SQLNVARCHAR = 103, /* 0x67 */
258 : #define BCP_TYPE_SQLNVARCHAR BCP_TYPE_SQLNVARCHAR
259 : BCP_TYPE_SQLUNIQUEID = 36, /* 0x24 */
260 : #define BCP_TYPE_SQLUNIQUEID BCP_TYPE_SQLUNIQUEID
261 : BCP_TYPE_SQLDATETIME2 = 42, /* 0x2a */
262 : #define BCP_TYPE_SQLDATETIME2 BCP_TYPE_SQLDATETIME2
263 : };
264 :
265 : typedef struct
266 : {
267 : int dtdays;
268 : int dttime;
269 : } DBDATETIME;
270 :
271 : #if defined(__cplusplus) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)
272 : #define TDSODBC_INLINE inline
273 : #elif defined(_MSC_VER)
274 : #define TDSODBC_INLINE __inline
275 : #else
276 : #define TDSODBC_INLINE __inline__
277 : #endif
278 :
279 : struct tdsodbc_impl_bcp_init_params
280 : {
281 : const void *tblname;
282 : const void *hfile;
283 : const void *errfile;
284 : int direction;
285 : };
286 :
287 : static TDSODBC_INLINE RETCODE SQL_API
288 : bcp_initA(HDBC hdbc, const char *tblname, const char *hfile, const char *errfile, int direction)
289 : {
290 12 : struct tdsodbc_impl_bcp_init_params params = {tblname, hfile, errfile, direction};
291 12 : return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_INITA, ¶ms, SQL_IS_POINTER)) ? SUCCEED : FAIL;
292 : }
293 :
294 : static TDSODBC_INLINE RETCODE SQL_API
295 : bcp_initW(HDBC hdbc, const SQLWCHAR *tblname, const SQLWCHAR *hfile, const SQLWCHAR *errfile, int direction)
296 : {
297 12 : struct tdsodbc_impl_bcp_init_params params = {tblname, hfile, errfile, direction};
298 12 : return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_INITW, ¶ms, SQL_IS_POINTER)) ? SUCCEED : FAIL;
299 : }
300 :
301 : struct tdsodbc_impl_bcp_control_params
302 : {
303 : int field;
304 : void *value;
305 : };
306 :
307 : static TDSODBC_INLINE RETCODE SQL_API
308 : bcp_control(HDBC hdbc, int field, void *value)
309 : {
310 4 : struct tdsodbc_impl_bcp_control_params params = {field, value};
311 4 : return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_CONTROL, ¶ms, SQL_IS_POINTER)) ? SUCCEED : FAIL;
312 : }
313 :
314 : struct tdsodbc_impl_bcp_colptr_params
315 : {
316 : const unsigned char * colptr;
317 : int table_column;
318 : };
319 :
320 : static TDSODBC_INLINE RETCODE SQL_API
321 : bcp_colptr(HDBC hdbc, const unsigned char * colptr, int table_column)
322 : {
323 : struct tdsodbc_impl_bcp_colptr_params params = {colptr, table_column};
324 : return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_COLPTR, ¶ms, SQL_IS_POINTER)) ? SUCCEED : FAIL;
325 : }
326 :
327 : static TDSODBC_INLINE RETCODE SQL_API
328 : bcp_sendrow(HDBC hdbc)
329 : {
330 204 : return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_SENDROW, NULL, SQL_IS_POINTER)) ? SUCCEED : FAIL;
331 : }
332 :
333 : struct tdsodbc_impl_bcp_batch_params
334 : {
335 : int rows;
336 : };
337 :
338 : static TDSODBC_INLINE int SQL_API
339 24 : bcp_batch(HDBC hdbc)
340 : {
341 24 : struct tdsodbc_impl_bcp_batch_params params = {-1};
342 24 : return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_BATCH, ¶ms, SQL_IS_POINTER)) ? params.rows : -1;
343 : }
344 :
345 : struct tdsodbc_impl_bcp_done_params
346 : {
347 : int rows;
348 : };
349 :
350 : static TDSODBC_INLINE int SQL_API
351 24 : bcp_done(HDBC hdbc)
352 : {
353 24 : struct tdsodbc_impl_bcp_done_params params = {-1};
354 24 : return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_DONE, ¶ms, SQL_IS_POINTER)) ? params.rows : -1;
355 : }
356 :
357 : struct tdsodbc_impl_bcp_bind_params
358 : {
359 : const unsigned char * varaddr;
360 : int prefixlen;
361 : int varlen;
362 : const unsigned char * terminator;
363 : int termlen;
364 : int vartype;
365 : int table_column;
366 : };
367 :
368 : static TDSODBC_INLINE RETCODE SQL_API
369 : bcp_bind(HDBC hdbc, const unsigned char * varaddr, int prefixlen, int varlen,
370 : const unsigned char * terminator, int termlen, int vartype, int table_column)
371 : {
372 612 : struct tdsodbc_impl_bcp_bind_params params = {varaddr, prefixlen, varlen, terminator, termlen, vartype, table_column};
373 612 : return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_BIND, ¶ms, SQL_IS_POINTER)) ? SUCCEED : FAIL;
374 : }
375 :
376 : #ifdef UNICODE
377 : #define bcp_init bcp_initW
378 : #define BCPHINTS BCPHINTSW
379 : #else
380 : #define bcp_init bcp_initA
381 : #define BCPHINTS BCPHINTSA
382 : #endif
383 :
384 : #endif /* TDSODBC_BCP */
385 :
386 : #ifdef __cplusplus
387 : }
388 : #endif
389 :
390 : #endif /* _odbcss_h_ */
|