FreeTDS API
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
odbcss.h
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 
38 #ifndef SQL_SS_LENGTH_UNLIMITED
39 #define SQL_SS_LENGTH_UNLIMITED 0
40 #endif
41 
42 #ifndef SQL_COPT_SS_OLDPWD
43 #define SQL_COPT_SS_OLDPWD 1226
44 #endif
45 
46 #define SQL_COPT_SS_BASE 1200
47 
48 #ifdef TDSODBC_BCP
49 
50 #ifndef SUCCEED
51 #define SUCCEED 1
52 #endif
53 #ifndef FAIL
54 #define FAIL 0
55 #endif
56 
57 #ifndef BCPKEEPIDENTITY
58 #define BCPKEEPIDENTITY 8
59 #endif
60 #ifndef BCPHINTS
61 #define BCPHINTS 6
62 #endif
63 
64 #define BCP_DIRECTION_IN 1
65 
66 #define SQL_COPT_SS_BCP (SQL_COPT_SS_BASE+19)
67 #define SQL_BCP_OFF 0
68 #define SQL_BCP_ON 1
69 
70 #define SQL_COPT_TDSODBC_IMPL_BASE 1500
71 #define SQL_COPT_TDSODBC_IMPL_BCP_INITA (SQL_COPT_TDSODBC_IMPL_BASE)
72 #define SQL_COPT_TDSODBC_IMPL_BCP_CONTROL (SQL_COPT_TDSODBC_IMPL_BASE+1)
73 #define SQL_COPT_TDSODBC_IMPL_BCP_COLPTR (SQL_COPT_TDSODBC_IMPL_BASE+2)
74 #define SQL_COPT_TDSODBC_IMPL_BCP_SENDROW (SQL_COPT_TDSODBC_IMPL_BASE+3)
75 #define SQL_COPT_TDSODBC_IMPL_BCP_BATCH (SQL_COPT_TDSODBC_IMPL_BASE+4)
76 #define SQL_COPT_TDSODBC_IMPL_BCP_DONE (SQL_COPT_TDSODBC_IMPL_BASE+5)
77 #define SQL_COPT_TDSODBC_IMPL_BCP_BIND (SQL_COPT_TDSODBC_IMPL_BASE+6)
78 #define SQL_COPT_TDSODBC_IMPL_BCP_INITW (SQL_COPT_TDSODBC_IMPL_BASE+7)
79 
80 #define SQL_VARLEN_DATA -10
81 
82 /* copied from sybdb.h which was copied from tds.h */
83 /* TODO find a much better way... */
84 enum
85 {
86  BCP_TYPE_SQLCHAR = 47, /* 0x2F */
87 #define BCP_TYPE_SQLCHAR BCP_TYPE_SQLCHAR
88  BCP_TYPE_SQLVARCHAR = 39, /* 0x27 */
89 #define BCP_TYPE_SQLVARCHAR BCP_TYPE_SQLVARCHAR
90  BCP_TYPE_SQLINTN = 38, /* 0x26 */
91 #define BCP_TYPE_SQLINTN BCP_TYPE_SQLINTN
92  BCP_TYPE_SQLINT1 = 48, /* 0x30 */
93 #define BCP_TYPE_SQLINT1 BCP_TYPE_SQLINT1
94  BCP_TYPE_SQLINT2 = 52, /* 0x34 */
95 #define BCP_TYPE_SQLINT2 BCP_TYPE_SQLINT2
96  BCP_TYPE_SQLINT4 = 56, /* 0x38 */
97 #define BCP_TYPE_SQLINT4 BCP_TYPE_SQLINT4
98  BCP_TYPE_SQLINT8 = 127, /* 0x7F */
99 #define BCP_TYPE_SQLINT8 BCP_TYPE_SQLINT8
100  BCP_TYPE_SQLFLT8 = 62, /* 0x3E */
101 #define BCP_TYPE_SQLFLT8 BCP_TYPE_SQLFLT8
102  BCP_TYPE_SQLDATETIME = 61, /* 0x3D */
103 #define BCP_TYPE_SQLDATETIME BCP_TYPE_SQLDATETIME
104  BCP_TYPE_SQLBIT = 50, /* 0x32 */
105 #define BCP_TYPE_SQLBIT BCP_TYPE_SQLBIT
106  BCP_TYPE_SQLBITN = 104, /* 0x68 */
107 #define BCP_TYPE_SQLBITN BCP_TYPE_SQLBITN
108  BCP_TYPE_SQLTEXT = 35, /* 0x23 */
109 #define BCP_TYPE_SQLTEXT BCP_TYPE_SQLTEXT
110  BCP_TYPE_SQLNTEXT = 99, /* 0x63 */
111 #define BCP_TYPE_SQLNTEXT BCP_TYPE_SQLNTEXT
112  BCP_TYPE_SQLIMAGE = 34, /* 0x22 */
113 #define BCP_TYPE_SQLIMAGE BCP_TYPE_SQLIMAGE
114  BCP_TYPE_SQLMONEY4 = 122, /* 0x7A */
115 #define BCP_TYPE_SQLMONEY4 BCP_TYPE_SQLMONEY4
116  BCP_TYPE_SQLMONEY = 60, /* 0x3C */
117 #define BCP_TYPE_SQLMONEY BCP_TYPE_SQLMONEY
118  BCP_TYPE_SQLDATETIME4 = 58, /* 0x3A */
119 #define BCP_TYPE_SQLDATETIME4 BCP_TYPE_SQLDATETIME4
120  BCP_TYPE_SQLREAL = 59, /* 0x3B */
121  BCP_TYPE_SQLFLT4 = 59, /* 0x3B */
122 #define BCP_TYPE_SQLREAL BCP_TYPE_SQLREAL
123 #define BCP_TYPE_SQLFLT4 BCP_TYPE_SQLFLT4
124  BCP_TYPE_SQLBINARY = 45, /* 0x2D */
125 #define BCP_TYPE_SQLBINARY BCP_TYPE_SQLBINARY
126  BCP_TYPE_SQLVOID = 31, /* 0x1F */
127 #define BCP_TYPE_SQLVOID BCP_TYPE_SQLVOID
128  BCP_TYPE_SQLVARBINARY = 37, /* 0x25 */
129 #define BCP_TYPE_SQLVARBINARY BCP_TYPE_SQLVARBINARY
130  BCP_TYPE_SQLNUMERIC = 108, /* 0x6C */
131 #define BCP_TYPE_SQLNUMERIC BCP_TYPE_SQLNUMERIC
132  BCP_TYPE_SQLDECIMAL = 106, /* 0x6A */
133 #define BCP_TYPE_SQLDECIMAL BCP_TYPE_SQLDECIMAL
134  BCP_TYPE_SQLFLTN = 109, /* 0x6D */
135 #define BCP_TYPE_SQLFLTN BCP_TYPE_SQLFLTN
136  BCP_TYPE_SQLMONEYN = 110, /* 0x6E */
137 #define BCP_TYPE_SQLMONEYN BCP_TYPE_SQLMONEYN
138  BCP_TYPE_SQLDATETIMN = 111, /* 0x6F */
139 #define BCP_TYPE_SQLDATETIMN BCP_TYPE_SQLDATETIMN
140  BCP_TYPE_SQLNVARCHAR = 103, /* 0x67 */
141 #define BCP_TYPE_SQLNVARCHAR BCP_TYPE_SQLNVARCHAR
142  BCP_TYPE_SQLUNIQUEID = 36, /* 0x24 */
143 #define BCP_TYPE_SQLUNIQUEID BCP_TYPE_SQLUNIQUEID
144  BCP_TYPE_SQLDATETIME2 = 42, /* 0x2a */
145 #define BCP_TYPE_SQLDATETIME2 BCP_TYPE_SQLDATETIME2
146 };
147 
148 typedef struct
149 {
150  int dtdays;
151  int dttime;
152 } DBDATETIME;
153 
154 #ifdef _MSC_VER
155 #define TDSODBC_INLINE __inline
156 #else
157 #define TDSODBC_INLINE __inline__
158 #endif
159 
160 struct tdsodbc_impl_bcp_init_params
161 {
162  const void *tblname;
163  const void *hfile;
164  const void *errfile;
165  int direction;
166 };
167 
168 static TDSODBC_INLINE RETCODE SQL_API
169 bcp_initA(HDBC hdbc, const char *tblname, const char *hfile, const char *errfile, int direction)
170 {
171  struct tdsodbc_impl_bcp_init_params params = {tblname, hfile, errfile, direction};
172  return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_INITA, &params, SQL_IS_POINTER)) ? SUCCEED : FAIL;
173 }
174 
175 static TDSODBC_INLINE RETCODE SQL_API
176 bcp_initW(HDBC hdbc, const SQLWCHAR *tblname, const SQLWCHAR *hfile, const SQLWCHAR *errfile, int direction)
177 {
178  struct tdsodbc_impl_bcp_init_params params = {tblname, hfile, errfile, direction};
179  return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_INITW, &params, SQL_IS_POINTER)) ? SUCCEED : FAIL;
180 }
181 
182 struct tdsodbc_impl_bcp_control_params
183 {
184  int field;
185  void *value;
186 };
187 
188 static TDSODBC_INLINE RETCODE SQL_API
189 bcp_control(HDBC hdbc, int field, void *value)
190 {
191  struct tdsodbc_impl_bcp_control_params params = {field, value};
192  return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_CONTROL, &params, SQL_IS_POINTER)) ? SUCCEED : FAIL;
193 }
194 
195 struct tdsodbc_impl_bcp_colptr_params
196 {
197  const BYTE * colptr;
198  int table_column;
199 };
200 
201 static TDSODBC_INLINE RETCODE SQL_API
202 bcp_colptr(HDBC hdbc, const BYTE * colptr, int table_column)
203 {
204  struct tdsodbc_impl_bcp_colptr_params params = {colptr, table_column};
205  return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_COLPTR, &params, SQL_IS_POINTER)) ? SUCCEED : FAIL;
206 }
207 
208 static TDSODBC_INLINE RETCODE SQL_API
209 bcp_sendrow(HDBC hdbc)
210 {
211  return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_SENDROW, NULL, SQL_IS_POINTER)) ? SUCCEED : FAIL;
212 }
213 
214 struct tdsodbc_impl_bcp_batch_params
215 {
216  int rows;
217 };
218 
219 static TDSODBC_INLINE int SQL_API
220 bcp_batch(HDBC hdbc)
221 {
222  struct tdsodbc_impl_bcp_batch_params params = {-1};
223  return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_BATCH, &params, SQL_IS_POINTER)) ? params.rows : -1;
224 }
225 
226 struct tdsodbc_impl_bcp_done_params
227 {
228  int rows;
229 };
230 
231 static TDSODBC_INLINE int SQL_API
232 bcp_done(HDBC hdbc)
233 {
234  struct tdsodbc_impl_bcp_done_params params = {-1};
235  return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_DONE, &params, SQL_IS_POINTER)) ? params.rows : -1;
236 }
237 
238 struct tdsodbc_impl_bcp_bind_params
239 {
240  const BYTE * varaddr;
241  int prefixlen;
242  int varlen;
243  const BYTE * terminator;
244  int termlen;
245  int vartype;
246  int table_column;
247 };
248 
249 static TDSODBC_INLINE RETCODE SQL_API
250 bcp_bind(HDBC hdbc, const BYTE * varaddr, int prefixlen, int varlen,
251  const BYTE * terminator, int termlen, int vartype, int table_column)
252 {
253  struct tdsodbc_impl_bcp_bind_params params = {varaddr, prefixlen, varlen, terminator, termlen, vartype, table_column};
254  return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_BIND, &params, SQL_IS_POINTER)) ? SUCCEED : FAIL;
255 }
256 
257 #ifdef UNICODE
258 #define bcp_init bcp_initW
259 #else
260 #define bcp_init bcp_initA
261 #endif
262 
263 #endif /* TDSODBC_BCP */
264 
265 #ifdef __cplusplus
266 }
267 #endif
268 
269 #endif /* _odbcss_h_ */
RETCODE bcp_sendrow(DBPROCESS *dbproc)
Write data in host variables to the table.
Definition: bcp.c:1327
RETCODE bcp_control(DBPROCESS *dbproc, int field, DBINT value)
Set BCP options for uploading a datafile.
Definition: bcp.c:536
DBINT bcp_done(DBPROCESS *dbproc)
Conclude the transfer of data from program variables.
Definition: bcp.c:1967
RETCODE bcp_colptr(DBPROCESS *dbproc, BYTE *colptr, int table_column)
Override bcp_bind() by pointing to a different host variable.
Definition: bcp.c:658
Definition: sybdb.h:279
RETCODE bcp_bind(DBPROCESS *dbproc, BYTE *varaddr, int prefixlen, DBINT varlen, BYTE *terminator, int termlen, int vartype, int table_column)
Bind a program host variable to a database column.
Definition: bcp.c:2009
DBINT bcp_batch(DBPROCESS *dbproc)
Commit a set of rows to the table.
Definition: bcp.c:1940