File: driverextras.h

package info (click to toggle)
unixodbc 2.3.1-3
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 11,524 kB
  • ctags: 7,656
  • sloc: ansic: 89,405; sh: 15,975; makefile: 1,574; yacc: 969; sql: 1
file content (187 lines) | stat: -rw-r--r-- 7,787 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/**********************************************
 * driverextras.h
 *
 * Purpose:
 *
 * To define driver specifc extras such as structs to be included
 * along side the common ODBC includes.
 *
 * Description:
 *
 * The short-term storage a driver requires as infrastructure varies somewhat from
 * DBMS to DBMS. The ODBC DriverManager requires predictable storage and it is defined
 * in drivermanager.h. The Driver also requires predictable storage and
 * it is defined in driver.h. Storage *specific to a type of driver* is defined here.
 *
 * The three main storage items are the ENV, DBC, and STMT structs. These are defined
 * as type void * in isql.h.
 *
 * So if your driver requires extra storage (and it probably does) then define
 * the storage within these structs, allocate/initialize as required. Cast them
 * to and from the standard names as required.
 *
 * For example;
 *
 * App			DM				|DRV				
 *				(as per hdbc.h)	|(as per driver.h)	
 *====================================================================
 *	hDbc=void*	hDbc=SQLHDBC	hDbc=HDBCEXTRAS
 *--------------------------------------------------------------------
 *
 * DO NOT FORGET TO FREE ANY ALLOCATED MEMORY (at some point)
 *
 **********************************************************************
 *
 * This code was created by Peter Harvey (mostly during Christmas 98/99).
 * This code is LGPL. Please ensure that this message remains in future
 * distributions and uses of this code (thats about all I get out of it).
 * - Peter Harvey pharvey@codebydesign.com
 *
 **********************************************************************/

#ifndef DRIVEREXTRAS_H
#define DRIVEREXTRAS_H

/**********************************************
 * KEEP IT SIMPLE; PUT ALL DRIVER INCLUDES HERE THEN EACH DRIVER MODULE JUST INCLUDES THIS ONE FILE
 **********************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <time.h>

/****************************
 * include DBMS specific includes here and make any required defines here as well */




/***************************/


/**********************************************
 * ENVIRONMENT: DRIVER SPECIFIC STUFF THAT NEEDS TO BE STORED IN THE DRIVERS ENVIRONMENT
 **********************************************/
typedef struct tENVEXTRAS
{
	/****************************
	 * this is usually left empty
	 ***************************/
    int     nDummy;

} ENVEXTRAS, *HENVEXTRAS;

/**********************************************
 * CONNECTION: DRIVER SPECIFIC STUFF THAT NEEDS TO BE STORED IN THE DRIVERS CONNECTIONS
 **********************************************/

typedef struct tDBCEXTRAS
{
	/****************************
	 * replace dummy with your DBMS specific stuff. This often means such things as a socket handle.
	 ***************************/
    int     nDummy;

} DBCEXTRAS, *HDBCEXTRAS;

/**********************************************
 * STATEMENT: DRIVER SPECIFIC STUFF THAT NEEDS TO BE STORED IN THE DRIVERS STATEMENTS
 **********************************************/
typedef struct tCOLUMNHDR							/* each element of the 1st row of results is one of these (except col 0) */
{
	/* EVERYTHING YOU WOULD EVER WANT TO KNOW ABOUT THE COLUMN. INIT THIS BY CALLING 			*/
	/* _NativeToSQLColumnHeader AS SOON AS YOU HAVE COLUMN INFO. THIS MAKES THE COL HDR LARGER	*/
	/* BUT GENERALIZES MORE CODE. see SQLColAttribute()											*/
	int		bSQL_DESC_AUTO_UNIQUE_VALUE;			/* IS AUTO INCREMENT COL?					*/
	char	*pszSQL_DESC_BASE_COLUMN_NAME;			/* empty string if N/A						*/
	char	*pszSQL_DESC_BASE_TABLE_NAME;			/* empty string if N/A						*/
	int		bSQL_DESC_CASE_SENSITIVE;				/* IS CASE SENSITIVE COLUMN?				*/
	char	*pszSQL_DESC_CATALOG_NAME;				/* empty string if N/A						*/
	int		nSQL_DESC_CONCISE_TYPE;					/* ie SQL_CHAR, SQL_TYPE_TIME...			*/
	int		nSQL_DESC_DISPLAY_SIZE;					/* max digits required to display			*/
	int		bSQL_DESC_FIXED_PREC_SCALE;				/* has data source specific precision?		*/
	char	*pszSQL_DESC_LABEL;						/* display label, col name or empty string	*/
	int		nSQL_DESC_LENGTH;						/* strlen or bin size						*/
	char	*pszSQL_DESC_LITERAL_PREFIX;			/* empty string if N/A						*/
	char	*pszSQL_DESC_LITERAL_SUFFIX;			/* empty string if N/A						*/
	char	*pszSQL_DESC_LOCAL_TYPE_NAME;			/* empty string if N/A						*/
	char	*pszSQL_DESC_NAME;						/* col alias, col name or empty string		*/
	int		nSQL_DESC_NULLABLE;						/* SQL_NULLABLE, _NO_NULLS or _UNKNOWN		*/
	int		nSQL_DESC_NUM_PREC_RADIX;				/* 2, 10, or if N/A... 0 					*/
	int		nSQL_DESC_OCTET_LENGTH;					/* max size									*/
	int		nSQL_DESC_PRECISION;					/*											*/
	int		nSQL_DESC_SCALE;						/*											*/
	char	*pszSQL_DESC_SCHEMA_NAME;				/* empty string if N/A						*/
	int		nSQL_DESC_SEARCHABLE;					/* can be in a filter ie SQL_PRED_NONE...	*/
	char	*pszSQL_DESC_TABLE_NAME;                /* empty string if N/A						*/
	int		nSQL_DESC_TYPE;							/* SQL data type ie SQL_CHAR, SQL_INTEGER..	*/
	char	*pszSQL_DESC_TYPE_NAME;					/* DBMS data type ie VARCHAR, MONEY...		*/
	int		nSQL_DESC_UNNAMED;						/* qualifier for SQL_DESC_NAME ie SQL_NAMED	*/
	int		bSQL_DESC_UNSIGNED;						/* if signed FALSE else TRUE				*/
	int		nSQL_DESC_UPDATABLE;					/* ie SQL_ATTR_READONLY, SQL_ATTR_WRITE...	*/

	/* BINDING INFO		*/
	short			nTargetType;					/* BIND: C DATA TYPE ie SQL_C_CHAR			*/
	char 			*pTargetValue;					/* BIND: POINTER FROM APPLICATION TO COPY TO*/
	long			nTargetValueMax;				/* BIND: MAX SPACE IN pTargetValue			*/
	long			*pnLengthOrIndicator;			/* BIND: TO RETURN LENGTH OR NULL INDICATOR	*/

} COLUMNHDR;

typedef struct tSTMTEXTRAS
{
	char			**aResults;						/* nRows x nCols OF CHAR POINTERS. Row 0= ptrs to COLUMNHDR. Col 0=Bookmarks				*/
	int				nCols;							/* # OF VALID COLUMNS IN aColumns				*/
	int				nRows;							/* # OF ROWS IN aResults						*/
	int				nRow;							/* CURRENT ROW									*/

} STMTEXTRAS, *HSTMTEXTRAS;


/*
 * Shadow functions
 *
 * There are times when a function needs to call another function to use common functionality. When the
 * called function is part of the ODBC API (an entry point to the driver) bad things can happen. The 
 * linker will get confused and call the same-named function elsewhere in the namespace (ie the Driver 
 * Manager). To get around this you create a shadow function - a function with a slightly different name
 * that will not be confused with others - and then put most if not all of the functionality in there for
 * common use.
 *
 */
SQLRETURN  SQLGetDiagRec_(   SQLSMALLINT    nHandleType,
                             SQLHANDLE      hHandle,
                             SQLSMALLINT    nRecordNumber,
                             SQLCHAR *      pszState,
                             SQLINTEGER *   pnNativeError,
                             SQLCHAR *      pszMessageText,
                             SQLSMALLINT    nBufferLength,
                             SQLSMALLINT *  pnStringLength
                        );

SQLRETURN	_GetData(					SQLHSTMT      	hDrvStmt,
										SQLUSMALLINT  	nCol,
										SQLSMALLINT   	nTargetType,
										SQLPOINTER    	pTarget,
										SQLLEN       	nTargetLength,
										SQLLEN       	*pnLengthOrIndicator );

/*
 * Internal Support Functions
 */
SQLRETURN	_NativeToSQLColumnHeader(	COLUMNHDR 		*pColumnHeader,
										void 			*pNativeColumnHeader );
int 		_NativeToSQLType( 			void 			*pNativeColumnHeader );
char 		*_NativeTypeDesc(          	char 			*pszTypeName,
										int 			nType );
int			_NativeTypeLength( 			void 			*pNativeColumnHeader );
int			_NativeTypePrecision( 		void 			*pNativeColumnHeader );

SQLRETURN template_SQLPrepare(	SQLHSTMT    hDrvStmt,
						SQLCHAR     *szSqlStr,
						SQLINTEGER  nSqlStrLength );

#endif