mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
* Purge most special cases for building ODBC with specific drivers PDO_ODBC doesn't do this, and most of these drivers are not in use with PHP, at least like this. Chances are these expose an ODBC driver you can use with a normal driver manager like unixODBC or iODBC. If not, it can be specified as a custom driver, though it does not include any workarounds. There might be some redundant definitions now as a result. IBM Db2 is kept as a special case due to it also being in PDO_ODBC, though I wonder how good of an idea this is. See GH-15630 * Remove never used include This would only be used on 68k classic Mac OS. Did PHP ever run there? * Fold HAVE_SQL_EXTENDED_FETCH All supported driver managers can do extended fetches. * Ope, accidentally deleted this in a refactor * All driver managers support SQLDataSources now too So we don't need the define? * Remove undef CHAR There's no justification behind as to why this should be. * Don't special case SQL_TIMESTAMP The default handling for turning into SQL_C_CHAR is fine, and the special case for Adabas is no longer needed. * Assume fetch_hash is always possible The driver managers and even Db2 support this. This would also allow simplifying the fetch code to merge fetch_into and fetch_array into a single implementation perhaps. * Update UPGRADING for driver specific removal * Update NEWS for driver specific removal
166 lines
4.7 KiB
C
166 lines
4.7 KiB
C
/*
|
|
+----------------------------------------------------------------------+
|
|
| Copyright (c) The PHP Group |
|
|
+----------------------------------------------------------------------+
|
|
| This source file is subject to version 3.01 of the PHP license, |
|
|
| that is bundled with this package in the file LICENSE, and is |
|
|
| available through the world-wide-web at the following url: |
|
|
| https://www.php.net/license/3_01.txt |
|
|
| If you did not receive a copy of the PHP license and are unable to |
|
|
| obtain it through the world-wide-web, please send a note to |
|
|
| license@php.net so we can mail you a copy immediately. |
|
|
+----------------------------------------------------------------------+
|
|
| Authors: Stig Sæther Bakken <ssb@php.net> |
|
|
| Andreas Karajannis <Andreas.Karajannis@gmd.de> |
|
|
| Kevin N. Shallow <kshallow@tampabay.rr.com> |
|
|
+----------------------------------------------------------------------+
|
|
*/
|
|
|
|
#ifndef PHP_ODBC_INCLUDES_H
|
|
#define PHP_ODBC_INCLUDES_H
|
|
|
|
#ifdef HAVE_UODBC
|
|
|
|
/* checking in the same order as in configure.ac */
|
|
|
|
#if defined(HAVE_IODBC) /* iODBC library */
|
|
|
|
#define ODBC_TYPE "iODBC"
|
|
#include <sql.h>
|
|
#include <sqlext.h>
|
|
#include <iodbcext.h>
|
|
|
|
#elif defined(HAVE_UNIXODBC) /* unixODBC library */
|
|
|
|
#define ODBC_TYPE "unixODBC"
|
|
#include <sql.h>
|
|
#include <sqlext.h>
|
|
|
|
#elif defined(HAVE_CODBC) /* Custom ODBC */
|
|
|
|
#define ODBC_TYPE "Custom ODBC"
|
|
#include <odbc.h>
|
|
|
|
#elif defined(HAVE_IBMDB2) /* DB2 CLI */
|
|
|
|
#define ODBC_TYPE "IBM DB2 CLI"
|
|
#include <sqlcli1.h>
|
|
|
|
#else /* MS ODBC */
|
|
|
|
#include <WINDOWS.H>
|
|
#include <sql.h>
|
|
#include <sqlext.h>
|
|
#endif
|
|
|
|
#ifdef PHP_WIN32
|
|
#include <winsock2.h>
|
|
|
|
#define ODBC_TYPE "Win32"
|
|
#define PHP_ODBC_TYPE ODBC_TYPE
|
|
|
|
#endif
|
|
|
|
/* Common defines */
|
|
|
|
#if defined( HAVE_IBMDB2 ) || defined( HAVE_UNIXODBC ) || defined (HAVE_IODBC)
|
|
#define ODBC_SQL_ENV_T SQLHANDLE
|
|
#define ODBC_SQL_CONN_T SQLHANDLE
|
|
#define ODBC_SQL_STMT_T SQLHANDLE
|
|
#else
|
|
#define ODBC_SQL_ENV_T HENV
|
|
#define ODBC_SQL_CONN_T HDBC
|
|
#define ODBC_SQL_STMT_T HSTMT
|
|
#endif
|
|
|
|
typedef struct odbc_connection {
|
|
ODBC_SQL_ENV_T henv;
|
|
ODBC_SQL_CONN_T hdbc;
|
|
char laststate[6];
|
|
char lasterrormsg[SQL_MAX_MESSAGE_LENGTH];
|
|
HashTable results;
|
|
} odbc_connection;
|
|
|
|
typedef struct odbc_link {
|
|
odbc_connection *connection;
|
|
zend_string *hash;
|
|
bool persistent;
|
|
zend_object std;
|
|
} odbc_link;
|
|
|
|
typedef struct odbc_result_value {
|
|
char name[256];
|
|
char *value;
|
|
SQLLEN vallen;
|
|
SQLLEN coltype;
|
|
} odbc_result_value;
|
|
|
|
typedef struct odbc_param_info {
|
|
SQLSMALLINT sqltype;
|
|
SQLSMALLINT scale;
|
|
SQLSMALLINT nullable;
|
|
SQLULEN precision;
|
|
} odbc_param_info;
|
|
|
|
typedef struct odbc_result {
|
|
ODBC_SQL_STMT_T stmt;
|
|
odbc_result_value *values;
|
|
SQLSMALLINT numcols;
|
|
SQLSMALLINT numparams;
|
|
int fetch_abs;
|
|
zend_long longreadlen;
|
|
int binmode;
|
|
int fetched;
|
|
odbc_param_info *param_info;
|
|
odbc_connection *conn_ptr;
|
|
uint32_t index;
|
|
zend_object std;
|
|
} odbc_result;
|
|
|
|
ZEND_BEGIN_MODULE_GLOBALS(odbc)
|
|
bool allow_persistent;
|
|
bool check_persistent;
|
|
zend_long max_persistent;
|
|
zend_long max_links;
|
|
zend_long num_persistent;
|
|
zend_long num_links;
|
|
zend_long defaultlrl;
|
|
zend_long defaultbinmode;
|
|
zend_long default_cursortype;
|
|
char laststate[6];
|
|
char lasterrormsg[SQL_MAX_MESSAGE_LENGTH];
|
|
/* Stores ODBC links throughout the duration of a request. The connection member may be either persistent or
|
|
* non-persistent. In the former case, it is a pointer to an item in EG(persistent_list). This solution makes it
|
|
* possible to properly free links during RSHUTDOWN (or when they are explicitly closed), while persistent
|
|
* connections themselves are going to be freed later during the shutdown process (or when they are explicitly
|
|
* closed).
|
|
*/
|
|
HashTable connections;
|
|
ZEND_END_MODULE_GLOBALS(odbc)
|
|
|
|
int odbc_add_result(HashTable *list, odbc_result *result);
|
|
odbc_result *odbc_get_result(HashTable *list, int count);
|
|
void odbc_del_result(HashTable *list, int count);
|
|
int odbc_add_conn(HashTable *list, HDBC conn);
|
|
odbc_connection *odbc_get_conn(HashTable *list, int count);
|
|
void odbc_del_conn(HashTable *list, int ind);
|
|
void odbc_bindcols(odbc_result *result);
|
|
|
|
#define ODBC_SQL_ERROR_PARAMS odbc_connection *conn_resource, ODBC_SQL_STMT_T stmt, char *func
|
|
|
|
void odbc_sql_error(ODBC_SQL_ERROR_PARAMS);
|
|
|
|
#define IS_SQL_LONG(x) (x == SQL_LONGVARBINARY || x == SQL_LONGVARCHAR || x == SQL_WLONGVARCHAR)
|
|
|
|
#define IS_SQL_BINARY(x) (x == SQL_BINARY || x == SQL_VARBINARY || x == SQL_LONGVARBINARY)
|
|
|
|
PHP_ODBC_API ZEND_EXTERN_MODULE_GLOBALS(odbc)
|
|
#define ODBCG(v) ZEND_MODULE_GLOBALS_ACCESSOR(odbc, v)
|
|
|
|
#if defined(ZTS) && defined(COMPILE_DL_ODBC)
|
|
ZEND_TSRMLS_CACHE_EXTERN()
|
|
#endif
|
|
|
|
#endif /* HAVE_UODBC */
|
|
#endif /* PHP_ODBC_INCLUDES_H */
|