1 /* 2 +----------------------------------------------------------------------+ 3 | PHP Version 5 | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) 1997-2014 The PHP Group | 6 +----------------------------------------------------------------------+ 7 | This source file is subject to version 3.0 of the PHP license, | 8 | that is bundled with this package in the file LICENSE, and is | 9 | available through the world-wide-web at the following url: | 10 | http://www.php.net/license/3_0.txt. | 11 | If you did not receive a copy of the PHP license and are unable to | 12 | obtain it through the world-wide-web, please send a note to | 13 | license@php.net so we can mail you a copy immediately. | 14 +----------------------------------------------------------------------+ 15 | Author: Wez Furlong <wez@php.net> | 16 +----------------------------------------------------------------------+ 17 */ 18 19 /* $Id$ */ 20 21 #ifdef PHP_WIN32 22 # define PDO_ODBC_TYPE "Win32" 23 #endif 24 25 #ifndef PDO_ODBC_TYPE 26 # warning Please fix configure to give your ODBC libraries a name 27 # define PDO_ODBC_TYPE "Unknown" 28 #endif 29 30 /* {{{ Roll a dice, pick a header at random... */ 31 #if HAVE_SQLCLI1_H 32 # include <sqlcli1.h> 33 # if defined(DB268K) && HAVE_LIBRARYMANAGER_H 34 # include <LibraryManager.h> 35 # endif 36 #endif 37 38 #if HAVE_ODBC_H 39 # include <odbc.h> 40 #endif 41 42 #if HAVE_IODBC_H 43 # include <iodbc.h> 44 #endif 45 46 #if HAVE_SQLUNIX_H && !defined(PHP_WIN32) 47 # include <sqlunix.h> 48 #endif 49 50 #if HAVE_SQLTYPES_H 51 # include <sqltypes.h> 52 #endif 53 54 #if HAVE_SQLUCODE_H 55 # include <sqlucode.h> 56 #endif 57 58 #if HAVE_SQL_H 59 # include <sql.h> 60 #endif 61 62 #if HAVE_ISQL_H 63 # include <isql.h> 64 #endif 65 66 #if HAVE_SQLEXT_H 67 # include <sqlext.h> 68 #endif 69 70 #if HAVE_ISQLEXT_H 71 # include <isqlext.h> 72 #endif 73 74 #if HAVE_UDBCEXT_H 75 # include <udbcext.h> 76 #endif 77 78 #if HAVE_CLI0CORE_H 79 # include <cli0core.h> 80 #endif 81 82 #if HAVE_CLI0EXT1_H 83 # include <cli0ext.h> 84 #endif 85 86 #if HAVE_CLI0CLI_H 87 # include <cli0cli.h> 88 #endif 89 90 #if HAVE_CLI0DEFS_H 91 # include <cli0defs.h> 92 #endif 93 94 #if HAVE_CLI0ENV_H 95 # include <cli0env.h> 96 #endif 97 98 #if HAVE_ODBCSDK_H 99 # include <odbcsdk.h> 100 #endif 101 102 /* }}} */ 103 104 /* {{{ Figure out the type for handles */ 105 #if !defined(HENV) && !defined(SQLHENV) && defined(SQLHANDLE) 106 # define PDO_ODBC_HENV SQLHANDLE 107 # define PDO_ODBC_HDBC SQLHANDLE 108 # define PDO_ODBC_HSTMT SQLHANDLE 109 #elif !defined(HENV) && (defined(SQLHENV) || defined(DB2CLI_VER)) 110 # define PDO_ODBC_HENV SQLHENV 111 # define PDO_ODBC_HDBC SQLHDBC 112 # define PDO_ODBC_HSTMT SQLHSTMT 113 #else 114 # define PDO_ODBC_HENV HENV 115 # define PDO_ODBC_HDBC HDBC 116 # define PDO_ODBC_HSTMT HSTMT 117 #endif 118 /* }}} */ 119 120 typedef struct { 121 char last_state[6]; 122 char last_err_msg[SQL_MAX_MESSAGE_LENGTH]; 123 SDWORD last_error; 124 const char *file, *what; 125 int line; 126 } pdo_odbc_errinfo; 127 128 typedef struct { 129 PDO_ODBC_HENV env; 130 PDO_ODBC_HDBC dbc; 131 pdo_odbc_errinfo einfo; 132 unsigned assume_utf8:1; 133 unsigned _spare:31; 134 } pdo_odbc_db_handle; 135 136 typedef struct { 137 char *data; 138 unsigned long datalen; 139 SQLLEN fetched_len; 140 SWORD coltype; 141 char colname[128]; 142 unsigned is_long; 143 unsigned is_unicode:1; 144 unsigned _spare:31; 145 } pdo_odbc_column; 146 147 typedef struct { 148 PDO_ODBC_HSTMT stmt; 149 pdo_odbc_column *cols; 150 pdo_odbc_db_handle *H; 151 pdo_odbc_errinfo einfo; 152 char *convbuf; 153 unsigned long convbufsize; 154 unsigned going_long:1; 155 unsigned assume_utf8:1; 156 unsigned _spare:30; 157 } pdo_odbc_stmt; 158 159 typedef struct { 160 SQLINTEGER len; 161 SQLSMALLINT paramtype; 162 char *outbuf; 163 unsigned is_unicode:1; 164 unsigned _spare:31; 165 } pdo_odbc_param; 166 167 extern pdo_driver_t pdo_odbc_driver; 168 extern struct pdo_stmt_methods odbc_stmt_methods; 169 170 void pdo_odbc_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, PDO_ODBC_HSTMT statement, char *what, const char *file, int line TSRMLS_DC); 171 #define pdo_odbc_drv_error(what) pdo_odbc_error(dbh, NULL, SQL_NULL_HSTMT, what, __FILE__, __LINE__ TSRMLS_CC) 172 #define pdo_odbc_stmt_error(what) pdo_odbc_error(stmt->dbh, stmt, SQL_NULL_HSTMT, what, __FILE__, __LINE__ TSRMLS_CC) 173 #define pdo_odbc_doer_error(what) pdo_odbc_error(dbh, NULL, stmt, what, __FILE__, __LINE__ TSRMLS_CC) 174 175 void pdo_odbc_init_error_table(void); 176 void pdo_odbc_fini_error_table(void); 177 178 #ifdef SQL_ATTR_CONNECTION_POOLING 179 extern SQLUINTEGER pdo_odbc_pool_on; 180 extern SQLUINTEGER pdo_odbc_pool_mode; 181 #endif 182 183 enum { 184 PDO_ODBC_ATTR_USE_CURSOR_LIBRARY = PDO_ATTR_DRIVER_SPECIFIC, 185 PDO_ODBC_ATTR_ASSUME_UTF8 /* assume that input strings are UTF-8 when feeding data to unicode columns */ 186 }; 187 188 /* 189 * Local variables: 190 * tab-width: 4 191 * c-basic-offset: 4 192 * End: 193 * vim600: noet sw=4 ts=4 fdm=marker 194 * vim<600: noet sw=4 ts=4 195 */ 196