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