Remove references to ODBCVER and assume ODBC 3.x (#19453)

* Remove references to ODBCVER and assume ODBC 3.x

See https://wiki.php.net/rfc/deprecations_php_8_5#remove_support_for_older_odbc_versions

* Avoid calling deprecated ODBC functions

`SQLGetConnectOption`, `SQLSetConnectOption` and `SQLSetStmtOption` are
deprecated, so if ODBC 3 is available, we use `SQLSetConnectAttr`,
`SQLGetConnectAttr`, and `SQLSetStmtAttr` instead.

(This is based on GH-17556, but just assumes ODBC 3.x.)

* Remove wrappers for SQLColAttribute

We don't need to support the old way of doing it.

* Just call SQLAllocHandle directly

Again, no need for the version specific wrapper

* Update NEWS for ODBCVER in beta2

* [skip ci] UPGRADING for ODBCVER changes

---------

Co-authored-by: Christoph M. Becker <cmbecker69@gmx.de>
This commit is contained in:
Calvin Buckley 2025-08-12 18:05:43 -03:00 committed by GitHub
parent 77dace78c3
commit 60047025db
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 35 additions and 92 deletions

3
NEWS
View file

@ -2,6 +2,9 @@ PHP NEWS
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? ????, PHP 8.5.0beta2 ?? ??? ????, PHP 8.5.0beta2
- ODBC:
. Remove ODBCVER and assume ODBC 3.5. (Calvin Buckley)
- OpenSSL: - OpenSSL:
. Implement #81724 (openssl_cms_encrypt only allows specific ciphers). . Implement #81724 (openssl_cms_encrypt only allows specific ciphers).
(Jakub Zelenka) (Jakub Zelenka)

View file

@ -80,6 +80,10 @@ PHP 8.5 UPGRADE NOTES
. Calling the mysqli constructor on an already-constructed object . Calling the mysqli constructor on an already-constructed object
is now no longer possible and throws an Error. is now no longer possible and throws an Error.
- ODBC:
. ODBC now assumes that at least ODBC 3.5 functionality is available. The
ODBCVER definition and build system flags to control it have been removed.
- Opcache: - Opcache:
. The Opcache extension is now always built into the PHP binary and is always . The Opcache extension is now always built into the PHP binary and is always
loaded. The INI directives opcache.enable and opcache.enable_cli are still loaded. The INI directives opcache.enable and opcache.enable_cli are still

View file

@ -106,13 +106,6 @@ dnl
dnl configure options dnl configure options
dnl dnl
PHP_ARG_WITH([odbcver],,
[AS_HELP_STRING([[--with-odbcver[=HEX]]],
[Force support for the passed ODBC version. A hex number is expected,
default 0x0350. Use the special value of 0 to prevent an explicit ODBCVER to
be defined.])],
[0x0350])
AS_VAR_IF([ODBC_TYPE],, [ AS_VAR_IF([ODBC_TYPE],, [
PHP_ARG_WITH([adabas], PHP_ARG_WITH([adabas],
[for Adabas support], [for Adabas support],
@ -410,12 +403,6 @@ PHP_ARG_WITH([dbmaker],
]) ])
]) ])
AH_TEMPLATE([ODBCVER], [The highest supported ODBC version.])
AS_VAR_IF([PHP_ODBCVER], [no],
[AC_DEFINE([ODBCVER], [0x0350])],
[AS_VAR_IF([PHP_ODBCVER], [0],,
[AC_DEFINE_UNQUOTED([ODBCVER], [$PHP_ODBCVER])])])
dnl Extension setup dnl Extension setup
if test -n "$ODBC_TYPE"; then if test -n "$ODBC_TYPE"; then
AS_VAR_IF([ODBC_TYPE], [dbmaker],, [ AS_VAR_IF([ODBC_TYPE], [dbmaker],, [

View file

@ -1,7 +1,6 @@
// vim:ft=javascript // vim:ft=javascript
ARG_ENABLE("odbc", "ODBC support", "no"); ARG_ENABLE("odbc", "ODBC support", "no");
ARG_WITH("odbcver", "Force support for the passed ODBC version. A hex number is expected, default 0x0350. Use the special value of 0 to prevent an explicit ODBCVER to be defined.", "0x0350");
if (PHP_ODBC == "yes") { if (PHP_ODBC == "yes") {
if (CHECK_LIB("odbc32.lib", "odbc") && CHECK_LIB("odbccp32.lib", "odbc") if (CHECK_LIB("odbc32.lib", "odbc") && CHECK_LIB("odbccp32.lib", "odbc")
@ -10,11 +9,6 @@ if (PHP_ODBC == "yes") {
EXTENSION("odbc", "php_odbc.c odbc_utils.c", PHP_ODBC_SHARED, "/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1"); EXTENSION("odbc", "php_odbc.c odbc_utils.c", PHP_ODBC_SHARED, "/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
AC_DEFINE("HAVE_UODBC", 1, "Define to 1 if the PHP extension 'odbc' is available."); AC_DEFINE("HAVE_UODBC", 1, "Define to 1 if the PHP extension 'odbc' is available.");
AC_DEFINE("HAVE_SQLDATASOURCES", 1, "Define to 1 if ODBC library has 'SQLDataSources', as a function or macro."); AC_DEFINE("HAVE_SQLDATASOURCES", 1, "Define to 1 if ODBC library has 'SQLDataSources', as a function or macro.");
if ("no" == PHP_ODBCVER) {
AC_DEFINE("ODBCVER", "0x0350", "The highest supported ODBC version.", false);
} else if ("0" != PHP_ODBCVER) {
AC_DEFINE("ODBCVER", PHP_ODBCVER, "The highest supported ODBC version.", false);
}
} else { } else {
WARNING("odbc support can't be enabled, libraries or header are missing (SDK)") WARNING("odbc support can't be enabled, libraries or header are missing (SDK)")
PHP_ODBC = "no" PHP_ODBC = "no"

View file

@ -233,8 +233,6 @@ namespace {
* @cvalue SQL_TIMESTAMP * @cvalue SQL_TIMESTAMP
*/ */
const SQL_TIMESTAMP = UNKNOWN; const SQL_TIMESTAMP = UNKNOWN;
#if (defined(ODBCVER) && (ODBCVER >= 0x0300))
/** /**
* @var int * @var int
* @cvalue SQL_TYPE_DATE * @cvalue SQL_TYPE_DATE
@ -327,8 +325,6 @@ namespace {
*/ */
const SQL_QUICK = UNKNOWN; const SQL_QUICK = UNKNOWN;
#endif
function odbc_close_all(): void {} function odbc_close_all(): void {}
function odbc_binmode(Odbc\Result $statement, int $mode): true {} function odbc_binmode(Odbc\Result $statement, int $mode): true {}

View file

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead. /* This is a generated file, edit the .stub.php file instead.
* Stub hash: efd913e4fcacb2949dc5392857032ab9c59c818d */ * Stub hash: 2a788e343c154d2f29adeab45d5507f73de1b6bf */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_odbc_close_all, 0, 0, IS_VOID, 0) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_odbc_close_all, 0, 0, IS_VOID, 0)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
@ -408,7 +408,6 @@ static void register_odbc_symbols(int module_number)
REGISTER_LONG_CONSTANT("SQL_DATE", SQL_DATE, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQL_DATE", SQL_DATE, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SQL_TIME", SQL_TIME, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQL_TIME", SQL_TIME, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SQL_TIMESTAMP", SQL_TIMESTAMP, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQL_TIMESTAMP", SQL_TIMESTAMP, CONST_PERSISTENT);
#if (defined(ODBCVER) && (ODBCVER >= 0x0300))
REGISTER_LONG_CONSTANT("SQL_TYPE_DATE", SQL_TYPE_DATE, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQL_TYPE_DATE", SQL_TYPE_DATE, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SQL_TYPE_TIME", SQL_TYPE_TIME, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQL_TYPE_TIME", SQL_TYPE_TIME, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SQL_TYPE_TIMESTAMP", SQL_TYPE_TIMESTAMP, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQL_TYPE_TIMESTAMP", SQL_TYPE_TIMESTAMP, CONST_PERSISTENT);
@ -426,7 +425,6 @@ static void register_odbc_symbols(int module_number)
REGISTER_LONG_CONSTANT("SQL_INDEX_ALL", SQL_INDEX_ALL, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQL_INDEX_ALL", SQL_INDEX_ALL, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SQL_ENSURE", SQL_ENSURE, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQL_ENSURE", SQL_ENSURE, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SQL_QUICK", SQL_QUICK, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQL_QUICK", SQL_QUICK, CONST_PERSISTENT);
#endif
zend_attribute *attribute_Deprecated_func_odbc_result_all_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "odbc_result_all", sizeof("odbc_result_all") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1); zend_attribute *attribute_Deprecated_func_odbc_result_all_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "odbc_result_all", sizeof("odbc_result_all") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);

View file

@ -579,10 +579,6 @@ PHP_MINFO_FUNCTION(odbc)
snprintf(buf, sizeof(buf), ZEND_LONG_FMT, ODBCG(num_links)); snprintf(buf, sizeof(buf), ZEND_LONG_FMT, ODBCG(num_links));
php_info_print_table_row(2, "Active Links", buf); php_info_print_table_row(2, "Active Links", buf);
php_info_print_table_row(2, "ODBC library", PHP_ODBC_TYPE); php_info_print_table_row(2, "ODBC library", PHP_ODBC_TYPE);
#ifdef ODBCVER
snprintf(buf, sizeof(buf), "0x%.4x", ODBCVER);
php_info_print_table_row(2, "ODBCVER", buf);
#endif
#ifndef PHP_WIN32 #ifndef PHP_WIN32
php_info_print_table_row(2, "ODBC_CFLAGS", PHP_ODBC_CFLAGS); php_info_print_table_row(2, "ODBC_CFLAGS", PHP_ODBC_CFLAGS);
php_info_print_table_row(2, "ODBC_LFLAGS", PHP_ODBC_LFLAGS); php_info_print_table_row(2, "ODBC_LFLAGS", PHP_ODBC_LFLAGS);
@ -680,10 +676,10 @@ void odbc_bindcols(odbc_result *result)
bool char_extra_alloc = false; bool char_extra_alloc = false;
colfieldid = SQL_COLUMN_DISPLAY_SIZE; colfieldid = SQL_COLUMN_DISPLAY_SIZE;
rc = PHP_ODBC_SQLCOLATTRIBUTE(result->stmt, (SQLUSMALLINT)(i+1), PHP_ODBC_SQL_DESC_NAME, rc = SQLColAttribute(result->stmt, (SQLUSMALLINT)(i+1), SQL_DESC_NAME,
result->values[i].name, sizeof(result->values[i].name), &colnamelen, 0); result->values[i].name, sizeof(result->values[i].name), &colnamelen, 0);
result->values[i].coltype = 0; result->values[i].coltype = 0;
rc = PHP_ODBC_SQLCOLATTRIBUTE(result->stmt, (SQLUSMALLINT)(i+1), SQL_COLUMN_TYPE, rc = SQLColAttribute(result->stmt, (SQLUSMALLINT)(i+1), SQL_COLUMN_TYPE,
NULL, 0, NULL, &result->values[i].coltype); NULL, 0, NULL, &result->values[i].coltype);
/* Don't bind LONG / BINARY columns, so that fetch behaviour can /* Don't bind LONG / BINARY columns, so that fetch behaviour can
@ -695,9 +691,7 @@ void odbc_bindcols(odbc_result *result)
case SQL_VARBINARY: case SQL_VARBINARY:
case SQL_LONGVARBINARY: case SQL_LONGVARBINARY:
case SQL_LONGVARCHAR: case SQL_LONGVARCHAR:
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
case SQL_WLONGVARCHAR: case SQL_WLONGVARCHAR:
#endif
result->values[i].value = NULL; result->values[i].value = NULL;
break; break;
@ -710,22 +704,17 @@ void odbc_bindcols(odbc_result *result)
#endif /* HAVE_ADABAS */ #endif /* HAVE_ADABAS */
case SQL_CHAR: case SQL_CHAR:
case SQL_VARCHAR: case SQL_VARCHAR:
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
case SQL_WCHAR: case SQL_WCHAR:
case SQL_WVARCHAR: case SQL_WVARCHAR:
colfieldid = SQL_DESC_OCTET_LENGTH; colfieldid = SQL_DESC_OCTET_LENGTH;
#else
char_extra_alloc = true;
#endif
/* TODO: Check this is the intended behaviour */ /* TODO: Check this is the intended behaviour */
ZEND_FALLTHROUGH; ZEND_FALLTHROUGH;
default: default:
rc = PHP_ODBC_SQLCOLATTRIBUTE(result->stmt, (SQLUSMALLINT)(i+1), colfieldid, rc = SQLColAttribute(result->stmt, (SQLUSMALLINT)(i+1), colfieldid,
NULL, 0, NULL, &displaysize); NULL, 0, NULL, &displaysize);
if (rc != SQL_SUCCESS) { if (rc != SQL_SUCCESS) {
displaysize = 0; displaysize = 0;
} }
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO && colfieldid == SQL_DESC_OCTET_LENGTH) { if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO && colfieldid == SQL_DESC_OCTET_LENGTH) {
SQLINTEGER err; SQLINTEGER err;
SQLCHAR errtxt[128]; SQLCHAR errtxt[128];
@ -755,7 +744,6 @@ void odbc_bindcols(odbc_result *result)
result->values[i].value = NULL; result->values[i].value = NULL;
break; break;
} }
#endif
/* Workaround for drivers that report VARCHAR(MAX) columns as SQL_VARCHAR (bug #73725) */ /* Workaround for drivers that report VARCHAR(MAX) columns as SQL_VARCHAR (bug #73725) */
if (SQL_VARCHAR == result->values[i].coltype && displaysize == 0) { if (SQL_VARCHAR == result->values[i].coltype && displaysize == 0) {
result->values[i].coltype = SQL_LONGVARCHAR; result->values[i].coltype = SQL_LONGVARCHAR;
@ -844,7 +832,7 @@ void odbc_column_lengths(INTERNAL_FUNCTION_PARAMETERS, int type)
RETURN_FALSE; RETURN_FALSE;
} }
PHP_ODBC_SQLCOLATTRIBUTE(result->stmt, (SQLUSMALLINT)pv_num, (SQLUSMALLINT) (type?SQL_COLUMN_SCALE:SQL_COLUMN_PRECISION), NULL, 0, NULL, &len); SQLColAttribute(result->stmt, (SQLUSMALLINT)pv_num, (SQLUSMALLINT) (type?SQL_COLUMN_SCALE:SQL_COLUMN_PRECISION), NULL, 0, NULL, &len);
RETURN_LONG(len); RETURN_LONG(len);
} }
@ -915,7 +903,7 @@ PHP_FUNCTION(odbc_prepare)
result->numparams = 0; result->numparams = 0;
result->param_info = NULL; result->param_info = NULL;
rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt)); rc = SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) { if (rc == SQL_INVALID_HANDLE) {
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'"); php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
zval_ptr_dtor(return_value); zval_ptr_dtor(return_value);
@ -937,7 +925,7 @@ PHP_FUNCTION(odbc_prepare)
/* Try to set CURSOR_TYPE to dynamic. Driver will replace this with other /* Try to set CURSOR_TYPE to dynamic. Driver will replace this with other
type if not possible. type if not possible.
*/ */
SQLSetStmtOption(result->stmt, SQL_CURSOR_TYPE, ODBCG(default_cursortype)); SQLSetStmtAttr(result->stmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) ODBCG(default_cursortype), 0);
} }
} else { } else {
result->fetch_abs = 0; result->fetch_abs = 0;
@ -1302,7 +1290,7 @@ PHP_FUNCTION(odbc_exec)
object_init_ex(return_value, odbc_result_ce); object_init_ex(return_value, odbc_result_ce);
result = Z_ODBC_RESULT_P(return_value); result = Z_ODBC_RESULT_P(return_value);
rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt)); rc = SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) { if (rc == SQL_INVALID_HANDLE) {
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'"); php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
zval_ptr_dtor(return_value); zval_ptr_dtor(return_value);
@ -1324,7 +1312,7 @@ PHP_FUNCTION(odbc_exec)
/* Try to set CURSOR_TYPE to dynamic. Driver will replace this with other /* Try to set CURSOR_TYPE to dynamic. Driver will replace this with other
type if not possible. type if not possible.
*/ */
SQLSetStmtOption(result->stmt, SQL_CURSOR_TYPE, ODBCG(default_cursortype)); SQLSetStmtAttr(result->stmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) ODBCG(default_cursortype), 0);
} }
} else { } else {
result->fetch_abs = 0; result->fetch_abs = 0;
@ -1444,9 +1432,7 @@ static void php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type)
} }
ZEND_FALLTHROUGH; ZEND_FALLTHROUGH;
case SQL_LONGVARCHAR: case SQL_LONGVARCHAR:
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
case SQL_WLONGVARCHAR: case SQL_WLONGVARCHAR:
#endif
if (IS_SQL_LONG(result->values[i].coltype) && result->longreadlen <= 0) { if (IS_SQL_LONG(result->values[i].coltype) && result->longreadlen <= 0) {
ZVAL_EMPTY_STRING(&tmp); ZVAL_EMPTY_STRING(&tmp);
break; break;
@ -1614,9 +1600,7 @@ PHP_FUNCTION(odbc_fetch_into)
/* TODO: Check this is the intended behaviour */ /* TODO: Check this is the intended behaviour */
ZEND_FALLTHROUGH; ZEND_FALLTHROUGH;
case SQL_LONGVARCHAR: case SQL_LONGVARCHAR:
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
case SQL_WLONGVARCHAR: case SQL_WLONGVARCHAR:
#endif
if (IS_SQL_LONG(result->values[i].coltype) && result->longreadlen <= 0) { if (IS_SQL_LONG(result->values[i].coltype) && result->longreadlen <= 0) {
ZVAL_EMPTY_STRING(&tmp); ZVAL_EMPTY_STRING(&tmp);
break; break;
@ -1838,9 +1822,7 @@ PHP_FUNCTION(odbc_result)
ZEND_FALLTHROUGH; ZEND_FALLTHROUGH;
case SQL_LONGVARCHAR: case SQL_LONGVARCHAR:
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
case SQL_WLONGVARCHAR: case SQL_WLONGVARCHAR:
#endif
if (IS_SQL_LONG(result->values[field_ind].coltype)) { if (IS_SQL_LONG(result->values[field_ind].coltype)) {
if (result->longreadlen <= 0) { if (result->longreadlen <= 0) {
break; break;
@ -1848,7 +1830,7 @@ PHP_FUNCTION(odbc_result)
fieldsize = result->longreadlen; fieldsize = result->longreadlen;
} }
} else { } else {
PHP_ODBC_SQLCOLATTRIBUTE(result->stmt, (SQLUSMALLINT)(field_ind + 1), SQLColAttribute(result->stmt, (SQLUSMALLINT)(field_ind + 1),
(SQLUSMALLINT)((sql_c_type == SQL_C_BINARY) ? SQL_COLUMN_LENGTH : (SQLUSMALLINT)((sql_c_type == SQL_C_BINARY) ? SQL_COLUMN_LENGTH :
SQL_COLUMN_DISPLAY_SIZE), SQL_COLUMN_DISPLAY_SIZE),
NULL, 0, NULL, &fieldsize); NULL, 0, NULL, &fieldsize);
@ -1884,10 +1866,7 @@ PHP_FUNCTION(odbc_result)
/* Reduce fieldlen by 1 if we have char data. One day we might /* Reduce fieldlen by 1 if we have char data. One day we might
have binary strings... */ have binary strings... */
if ((result->values[field_ind].coltype == SQL_LONGVARCHAR) if ((result->values[field_ind].coltype == SQL_LONGVARCHAR)
#if defined(ODBCVER) && (ODBCVER >= 0x0300) || (result->values[field_ind].coltype == SQL_WLONGVARCHAR)) {
|| (result->values[field_ind].coltype == SQL_WLONGVARCHAR)
#endif
) {
fieldsize -= 1; fieldsize -= 1;
} }
/* Don't duplicate result, saves one emalloc. /* Don't duplicate result, saves one emalloc.
@ -2023,9 +2002,7 @@ PHP_FUNCTION(odbc_result_all)
/* TODO: Check this is the intended behaviour */ /* TODO: Check this is the intended behaviour */
ZEND_FALLTHROUGH; ZEND_FALLTHROUGH;
case SQL_LONGVARCHAR: case SQL_LONGVARCHAR:
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
case SQL_WLONGVARCHAR: case SQL_WLONGVARCHAR:
#endif
if (IS_SQL_LONG(result->values[i].coltype) && if (IS_SQL_LONG(result->values[i].coltype) &&
result->longreadlen <= 0) { result->longreadlen <= 0) {
php_printf("<td>Not printable</td>"); php_printf("<td>Not printable</td>");
@ -2169,7 +2146,7 @@ bool odbc_sqlconnect(zval *zv, char *db, char *uid, char *pwd, int cur_opt, bool
} }
#else #else
if (cur_opt != SQL_CUR_DEFAULT) { if (cur_opt != SQL_CUR_DEFAULT) {
rc = SQLSetConnectOption(link->connection->hdbc, SQL_ODBC_CURSORS, cur_opt); rc = SQLSetConnectAttr(link->connection->hdbc, SQL_ATTR_ODBC_CURSORS, (SQLPOINTER) (intptr_t) cur_opt, 0);
if (rc != SQL_SUCCESS) { /* && rc != SQL_SUCCESS_WITH_INFO ? */ if (rc != SQL_SUCCESS) { /* && rc != SQL_SUCCESS_WITH_INFO ? */
odbc_sql_error(link->connection, SQL_NULL_HSTMT, "SQLSetConnectOption"); odbc_sql_error(link->connection, SQL_NULL_HSTMT, "SQLSetConnectOption");
return false; return false;
@ -2600,7 +2577,7 @@ PHP_FUNCTION(odbc_field_type)
RETURN_FALSE; RETURN_FALSE;
} }
PHP_ODBC_SQLCOLATTRIBUTE(result->stmt, (SQLUSMALLINT)pv_num, SQL_COLUMN_TYPE_NAME, tmp, 31, &tmplen, NULL); SQLColAttribute(result->stmt, (SQLUSMALLINT)pv_num, SQL_COLUMN_TYPE_NAME, tmp, 31, &tmplen, NULL);
RETURN_STRING(tmp); RETURN_STRING(tmp);
} }
/* }}} */ /* }}} */
@ -2670,7 +2647,7 @@ PHP_FUNCTION(odbc_autocommit)
CHECK_ODBC_CONNECTION(conn); CHECK_ODBC_CONNECTION(conn);
if (!pv_onoff_is_null) { if (!pv_onoff_is_null) {
rc = SQLSetConnectOption(conn->hdbc, SQL_AUTOCOMMIT, pv_onoff ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF); rc = SQLSetConnectAttr(conn->hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER) (intptr_t) (pv_onoff ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF), 0);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
odbc_sql_error(conn, SQL_NULL_HSTMT, "Set autocommit"); odbc_sql_error(conn, SQL_NULL_HSTMT, "Set autocommit");
RETURN_FALSE; RETURN_FALSE;
@ -2679,7 +2656,7 @@ PHP_FUNCTION(odbc_autocommit)
} else { } else {
SQLINTEGER status; SQLINTEGER status;
rc = SQLGetConnectOption(conn->hdbc, SQL_AUTOCOMMIT, (PTR)&status); rc = SQLGetConnectAttr(conn->hdbc, SQL_ATTR_AUTOCOMMIT, &status, SQL_IS_INTEGER, NULL);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
odbc_sql_error(conn, SQL_NULL_HSTMT, "Get commit status"); odbc_sql_error(conn, SQL_NULL_HSTMT, "Get commit status");
RETURN_FALSE; RETURN_FALSE;
@ -2781,7 +2758,7 @@ PHP_FUNCTION(odbc_setoption)
php_error_docref(NULL, E_WARNING, "Unable to set option for persistent connection"); php_error_docref(NULL, E_WARNING, "Unable to set option for persistent connection");
RETURN_FALSE; RETURN_FALSE;
} }
rc = SQLSetConnectOption(link->connection->hdbc, (unsigned short) pv_opt, pv_val); rc = SQLSetConnectAttr(link->connection->hdbc, pv_opt, (SQLPOINTER) pv_val, 0);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
odbc_sql_error(link->connection, SQL_NULL_HSTMT, "SetConnectOption"); odbc_sql_error(link->connection, SQL_NULL_HSTMT, "SetConnectOption");
RETURN_FALSE; RETURN_FALSE;
@ -2795,7 +2772,7 @@ PHP_FUNCTION(odbc_setoption)
result = Z_ODBC_RESULT_P(pv_handle); result = Z_ODBC_RESULT_P(pv_handle);
CHECK_ODBC_RESULT(result); CHECK_ODBC_RESULT(result);
rc = SQLSetStmtOption(result->stmt, (unsigned short) pv_opt, pv_val); rc = SQLSetStmtAttr(result->stmt, pv_opt, (SQLPOINTER) pv_val, 0);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
odbc_sql_error(result->conn_ptr, result->stmt, "SetStmtOption"); odbc_sql_error(result->conn_ptr, result->stmt, "SetStmtOption");
@ -2835,7 +2812,7 @@ PHP_FUNCTION(odbc_tables)
object_init_ex(return_value, odbc_result_ce); object_init_ex(return_value, odbc_result_ce);
result = Z_ODBC_RESULT_P(return_value); result = Z_ODBC_RESULT_P(return_value);
rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt)); rc = SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) { if (rc == SQL_INVALID_HANDLE) {
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'"); php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
zval_ptr_dtor(return_value); zval_ptr_dtor(return_value);
@ -2900,7 +2877,7 @@ PHP_FUNCTION(odbc_columns)
object_init_ex(return_value, odbc_result_ce); object_init_ex(return_value, odbc_result_ce);
result = Z_ODBC_RESULT_P(return_value); result = Z_ODBC_RESULT_P(return_value);
rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt)); rc = SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) { if (rc == SQL_INVALID_HANDLE) {
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'"); php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
zval_ptr_dtor(return_value); zval_ptr_dtor(return_value);
@ -2968,7 +2945,7 @@ PHP_FUNCTION(odbc_columnprivileges)
object_init_ex(return_value, odbc_result_ce); object_init_ex(return_value, odbc_result_ce);
result = Z_ODBC_RESULT_P(return_value); result = Z_ODBC_RESULT_P(return_value);
rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt)); rc = SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) { if (rc == SQL_INVALID_HANDLE) {
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'"); php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
zval_ptr_dtor(return_value); zval_ptr_dtor(return_value);
@ -3042,7 +3019,7 @@ PHP_FUNCTION(odbc_foreignkeys)
object_init_ex(return_value, odbc_result_ce); object_init_ex(return_value, odbc_result_ce);
result = Z_ODBC_RESULT_P(return_value); result = Z_ODBC_RESULT_P(return_value);
rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt)); rc = SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) { if (rc == SQL_INVALID_HANDLE) {
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'"); php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
zval_ptr_dtor(return_value); zval_ptr_dtor(return_value);
@ -3106,7 +3083,7 @@ PHP_FUNCTION(odbc_gettypeinfo)
object_init_ex(return_value, odbc_result_ce); object_init_ex(return_value, odbc_result_ce);
result = Z_ODBC_RESULT_P(return_value); result = Z_ODBC_RESULT_P(return_value);
rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt)); rc = SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) { if (rc == SQL_INVALID_HANDLE) {
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'"); php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
zval_ptr_dtor(return_value); zval_ptr_dtor(return_value);
@ -3161,7 +3138,7 @@ PHP_FUNCTION(odbc_primarykeys)
object_init_ex(return_value, odbc_result_ce); object_init_ex(return_value, odbc_result_ce);
result = Z_ODBC_RESULT_P(return_value); result = Z_ODBC_RESULT_P(return_value);
rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt)); rc = SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) { if (rc == SQL_INVALID_HANDLE) {
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'"); php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
zval_ptr_dtor(return_value); zval_ptr_dtor(return_value);
@ -3221,7 +3198,7 @@ PHP_FUNCTION(odbc_procedurecolumns)
object_init_ex(return_value, odbc_result_ce); object_init_ex(return_value, odbc_result_ce);
result = Z_ODBC_RESULT_P(return_value); result = Z_ODBC_RESULT_P(return_value);
rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt)); rc = SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) { if (rc == SQL_INVALID_HANDLE) {
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'"); php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
zval_ptr_dtor(return_value); zval_ptr_dtor(return_value);
@ -3282,7 +3259,7 @@ PHP_FUNCTION(odbc_procedures)
object_init_ex(return_value, odbc_result_ce); object_init_ex(return_value, odbc_result_ce);
result = Z_ODBC_RESULT_P(return_value); result = Z_ODBC_RESULT_P(return_value);
rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt)); rc = SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) { if (rc == SQL_INVALID_HANDLE) {
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'"); php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
zval_ptr_dtor(return_value); zval_ptr_dtor(return_value);
@ -3348,7 +3325,7 @@ PHP_FUNCTION(odbc_specialcolumns)
object_init_ex(return_value, odbc_result_ce); object_init_ex(return_value, odbc_result_ce);
result = Z_ODBC_RESULT_P(return_value); result = Z_ODBC_RESULT_P(return_value);
rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt)); rc = SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) { if (rc == SQL_INVALID_HANDLE) {
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'"); php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
zval_ptr_dtor(return_value); zval_ptr_dtor(return_value);
@ -3414,7 +3391,7 @@ PHP_FUNCTION(odbc_statistics)
object_init_ex(return_value, odbc_result_ce); object_init_ex(return_value, odbc_result_ce);
result = Z_ODBC_RESULT_P(return_value); result = Z_ODBC_RESULT_P(return_value);
rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt)); rc = SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) { if (rc == SQL_INVALID_HANDLE) {
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'"); php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
zval_ptr_dtor(return_value); zval_ptr_dtor(return_value);
@ -3475,7 +3452,7 @@ PHP_FUNCTION(odbc_tableprivileges)
object_init_ex(return_value, odbc_result_ce); object_init_ex(return_value, odbc_result_ce);
result = Z_ODBC_RESULT_P(return_value); result = Z_ODBC_RESULT_P(return_value);
rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(result->stmt)); rc = SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &(result->stmt));
if (rc == SQL_INVALID_HANDLE) { if (rc == SQL_INVALID_HANDLE) {
php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'"); php_error_docref(NULL, E_WARNING, "SQLAllocStmt error 'Invalid Handle'");
zval_ptr_dtor(return_value); zval_ptr_dtor(return_value);

View file

@ -102,7 +102,6 @@
#endif #endif
#define ODBC_TYPE "unixODBC" #define ODBC_TYPE "unixODBC"
#undef ODBCVER
#include <sql.h> #include <sql.h>
#include <sqlext.h> #include <sqlext.h>
#define HAVE_SQL_EXTENDED_FETCH 1 #define HAVE_SQL_EXTENDED_FETCH 1
@ -132,8 +131,6 @@
#elif defined(HAVE_DBMAKER) /* DBMaker */ #elif defined(HAVE_DBMAKER) /* DBMaker */
#define ODBC_TYPE "DBMaker" #define ODBC_TYPE "DBMaker"
#undef ODBCVER
#define ODBCVER 0x0300
#define HAVE_SQL_EXTENDED_FETCH 1 #define HAVE_SQL_EXTENDED_FETCH 1
#include <odbc.h> #include <odbc.h>
@ -265,21 +262,8 @@ void odbc_bindcols(odbc_result *result);
void odbc_sql_error(ODBC_SQL_ERROR_PARAMS); void odbc_sql_error(ODBC_SQL_ERROR_PARAMS);
#if defined(ODBCVER) && (ODBCVER >= 0x0300)
#define IS_SQL_LONG(x) (x == SQL_LONGVARBINARY || x == SQL_LONGVARCHAR || x == SQL_WLONGVARCHAR) #define IS_SQL_LONG(x) (x == SQL_LONGVARBINARY || x == SQL_LONGVARCHAR || x == SQL_WLONGVARCHAR)
#define PHP_ODBC_SQLCOLATTRIBUTE SQLColAttribute
#define PHP_ODBC_SQLALLOCSTMT(hdbc, phstmt) SQLAllocHandle(SQL_HANDLE_STMT, hdbc, phstmt)
#define PHP_ODBC_SQL_DESC_NAME SQL_DESC_NAME
#else
#define IS_SQL_LONG(x) (x == SQL_LONGVARBINARY || x == SQL_LONGVARCHAR)
#define PHP_ODBC_SQLCOLATTRIBUTE SQLColAttributes
#define PHP_ODBC_SQLALLOCSTMT SQLAllocStmt
#define PHP_ODBC_SQL_DESC_NAME SQL_COLUMN_NAME
#endif
#define IS_SQL_BINARY(x) (x == SQL_BINARY || x == SQL_VARBINARY || x == SQL_LONGVARBINARY) #define IS_SQL_BINARY(x) (x == SQL_BINARY || x == SQL_VARBINARY || x == SQL_LONGVARBINARY)
PHP_ODBC_API ZEND_EXTERN_MODULE_GLOBALS(odbc) PHP_ODBC_API ZEND_EXTERN_MODULE_GLOBALS(odbc)