1 /* FreeTDS - Library of routines accessing Sybase and Microsoft databases
2  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005  Brian Bruns
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 _dblib_h_
21 #define _dblib_h_
22 
23 #include <freetds/pushvis.h>
24 
25 #ifdef __cplusplus
26 extern "C"
27 {
28 #if 0
29 }
30 #endif
31 #endif
32 
33 typedef enum
34 {
35 	  _DB_RES_INIT
36 	, _DB_RES_RESULTSET_EMPTY
37 	, _DB_RES_RESULTSET_ROWS
38 	, _DB_RES_NEXT_RESULT
39 	, _DB_RES_NO_MORE_RESULTS
40 	, _DB_RES_SUCCEED
41 } DB_RESULT_STATE;
42 
43 struct tds_dblib_loginrec
44 {
45 	TDSLOGIN *tds_login;
46 	bool network_auth;
47 };
48 
49 struct dblib_buffer_row;
50 
51 typedef struct
52 {
53 	int received;	  	/* how many rows have been received for this result set */
54 	int head;	  	/* queue insertion point */
55 	int tail;	  	/* oldest item in queue	*/
56 	int current;		/* dbnextrow() reads this row */
57 	int capacity;		/* how many elements the queue can hold  */
58 	struct dblib_buffer_row *rows;		/* pointer to the row storage */
59 } DBPROC_ROWBUF;
60 
61 typedef struct
62 {
63 	int host_column;
64 	TDS_SERVER_TYPE datatype;
65 	int prefix_len;
66 	DBINT column_len;
67 	BYTE *terminator;
68 	int term_len;
69 	int tab_colnum;
70 	int column_error;
71 } BCP_HOSTCOLINFO;
72 
73 typedef struct
74 {
75 	TDS_CHAR *hostfile;
76 	TDS_CHAR *errorfile;
77 	FILE *bcp_errfileptr;
78 	TDS_INT host_colcount;
79 	BCP_HOSTCOLINFO **host_columns;
80 	TDS_INT firstrow;
81 	TDS_INT lastrow;
82 	TDS_INT maxerrs;
83 	TDS_INT batch;
84 } BCP_HOSTFILEINFO;
85 
86 /* linked list of rpc parameters */
87 
88 typedef struct DBREMOTE_PROC_PARAM
89 {
90 	struct DBREMOTE_PROC_PARAM *next;
91 
92 	char *name;
93 	BYTE status;
94 	TDS_SERVER_TYPE type;
95 	DBINT maxlen;
96 	DBINT datalen;
97 	BYTE *value;
98 } DBREMOTE_PROC_PARAM;
99 
100 typedef struct DBREMOTE_PROC
101 {
102 	struct DBREMOTE_PROC *next;
103 
104 	char *name;
105 	DBSMALLINT options;
106 	DBREMOTE_PROC_PARAM *param_list;
107 } DBREMOTE_PROC;
108 
109 typedef struct dboption
110 {
111 	const char *text;
112 	DBSTRING *param;
113 	DBBOOL factive;
114 } DBOPTION;
115 
116 typedef struct
117 {
118 	const BYTE *bindval;
119 	size_t len;
120 } NULLREP;
121 
122 struct tds_dblib_dbprocess
123 {
124 	TDSSOCKET *tds_socket;
125 
126 	STATUS row_type;
127 	DBPROC_ROWBUF row_buf;
128 
129 	int noautofree;
130 	int more_results;	/* boolean.  Are we expecting results? */
131 	DB_RESULT_STATE dbresults_state;
132 	int dbresults_retcode;
133 	BYTE *user_data;	/* see dbsetuserdata() and dbgetuserdata() */
134 	unsigned char *dbbuf;	/* is dynamic!                   */
135 	int dbbufsz;
136 	int command_state;
137 	TDS_INT text_size;
138 	TDS_INT text_sent;
139 	DBTYPEINFO typeinfo;
140 	unsigned char avail_flag;
141 	DBOPTION *dbopts;
142 	DBSTRING *dboptcmd;
143 	BCP_HOSTFILEINFO *hostfileinfo;
144 	TDSBCPINFO *bcpinfo;
145 	DBREMOTE_PROC *rpc;
146 	DBUSMALLINT envchange_rcv;
147 	char dbcurdb[DBMAXNAME + 1];
148 	char servcharset[DBMAXNAME + 1];
149 	FILE *ftos;
150 	DB_DBCHKINTR_FUNC chkintr;
151 	DB_DBHNDLINTR_FUNC hndlintr;
152 
153 	/** boolean use ms behaviour */
154 	int msdblib;
155 
156 	int ntimeouts;
157 
158 	/** default null values **/
159 	NULLREP		nullreps[MAXBINDTYPES];
160 };
161 
162 enum {
163 #if MSDBLIB
164 	dblib_msdblib = 1
165 #else
166 	dblib_msdblib = 0
167 #endif
168 };
169 
170 /*
171  * internal prototypes
172  */
173 RETCODE dbgetnull(DBPROCESS *dbproc, int bindtype, int varlen, BYTE* varaddr);
174 void copy_data_to_host_var(DBPROCESS * dbproc, TDS_SERVER_TYPE srctype, const BYTE * src, DBINT srclen,
175 			   BYTE * dest, DBINT destlen,
176 			   int bindtype, DBINT *indicator);
177 
178 int dbperror (DBPROCESS *dbproc, DBINT msgno, long errnum, ...);
179 int _dblib_handle_info_message(const TDSCONTEXT * ctxptr, TDSSOCKET * tdsptr, TDSMESSAGE* msgptr);
180 int _dblib_handle_err_message(const TDSCONTEXT * ctxptr, TDSSOCKET * tdsptr, TDSMESSAGE* msgptr);
181 int _dblib_check_and_handle_interrupt(void * vdbproc);
182 
183 void _dblib_setTDS_version(TDSLOGIN * tds_login, DBINT version);
184 void _dblib_convert_err(DBPROCESS * dbproc, TDS_INT len);
185 
186 DBINT _convert_char(int srctype, BYTE * src, int destype, BYTE * dest, DBINT destlen);
187 DBINT _convert_intn(int srctype, BYTE * src, int destype, BYTE * dest, DBINT destlen);
188 
189 RETCODE _bcp_clear_storage(DBPROCESS * dbproc);
190 RETCODE _bcp_get_prog_data(DBPROCESS * dbproc);
191 
192 extern MHANDLEFUNC _dblib_msg_handler;
193 extern EHANDLEFUNC _dblib_err_handler;
194 
195 #define CHECK_PARAMETER(x, msg, ret)	if (!(x)) { dbperror(dbproc, (msg), 0); return ret; }
196 #define CHECK_NULP(x, func, param_num, ret)	if (!(x)) { dbperror(dbproc, SYBENULP, 0, func, (int) param_num); return ret; }
197 #define CHECK_PARAMETER_NOPROC(x, msg)	if (!(x)) { dbperror(NULL, (msg), 0); return FAIL; }
198 #define DBPERROR_RETURN(x, msg)	if (x) { dbperror(dbproc, (msg), 0); return FAIL; }
199 #define DBPERROR_RETURN3(x, msg, a, b, c)	if (x) { dbperror(dbproc, (msg), 0, a, b, c); return FAIL; }
200 #define CHECK_CONN(ret) do { CHECK_PARAMETER(dbproc, SYBENULL, (ret)); \
201 	if (IS_TDSDEAD(dbproc->tds_socket)) { dbperror(dbproc, SYBEDDNE, 0); return (ret); } } while(0)
202 
203 
204 #ifdef __cplusplus
205 #if 0
206 {
207 #endif
208 }
209 #endif
210 
211 #include <freetds/popvis.h>
212 
213 #endif
214