1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 08:12:21 +01:00

Remove driver specific support from ODBC (#15727)

* 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
This commit is contained in:
Calvin Buckley
2025-09-09 00:07:15 -03:00
committed by GitHub
parent 156c847467
commit cebe50a1af
9 changed files with 22 additions and 597 deletions

3
NEWS
View File

@@ -39,6 +39,9 @@ PHP NEWS
. Fixed bug GH-11952 (Fix locale strings canonicalization for IntlDateFormatter
and NumberFormatter). (alexandre-daubois)
- ODBC:
. Removed driver-specific build flags and support. (Calvin Buckley)
- Opcache:
. Fixed bug GH-19486 (Incorrect opline after deoptimization). (Arnaud)
. Fixed bug GH-19601 (Wrong JIT stack setup on aarch64/clang). (Arnaud)

View File

@@ -91,6 +91,9 @@ PHP 8.5 UPGRADE NOTES
- 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.
. ODBC no longer has build flags to build against specific drivers (except
for DB2) and removes special cases for those drivers. It is strongly
recommended to use a driver manager like iODBC or unixODBC on non-Windows.
- Opcache:
. The Opcache extension is now always built into the PHP binary and is always

View File

@@ -7,172 +7,10 @@ AC_DEFUN([PHP_ODBC_CHECK_HEADER],
[AS_IF([test ! -f "$ODBC_INCDIR/$1"],
[AC_MSG_ERROR([ODBC header file '$ODBC_INCDIR/$1' not found!])])])
dnl
dnl PHP_ODBC_FIND_SOLID_LIBS(libdir)
dnl
dnl Figure out which library file to link with for the Solid support.
dnl
AC_DEFUN([PHP_ODBC_FIND_SOLID_LIBS],[
AC_MSG_CHECKING([Solid library file])
ac_solid_uname_r=$(uname -r 2>/dev/null)
ac_solid_uname_s=$(uname -s 2>/dev/null)
case $ac_solid_uname_s in
AIX) ac_solid_os=a3x;; # a4x for AIX4/ Solid 2.3/3.0 only
HP-UX) ac_solid_os=h9x;; # h1x for hpux11, h0x for hpux10
Linux)
if ldd -v /bin/sh | grep GLIBC > /dev/null; then
ac_solid_os=l2x
else
ac_solid_os=lux
fi
AC_DEFINE([SS_LINUX], [1],
[Define to 1 to be able to use the obsolete <sqlunix.h> header file on
some Linux systems.])
;;
SunOS)
ac_solid_os=ssx;; # should we deal with SunOS 4?
FreeBSD)
if test $(expr $ac_solid_uname_r : '\(.\)') -gt "2"; then
ac_solid_os=fex
else
ac_solid_os=fbx
fi
AC_DEFINE([SS_FBX], [1],
[Define to 1 to be able to use the wchar defs in the obsolete
<sqlunix.h> header file on some FreeBSD systems.])
;;
esac
if test -f $1/soc${ac_solid_os}35.a; then
ac_solid_version=35
ac_solid_prefix=soc
elif test -f $1/scl${ac_solid_os}30.a; then
ac_solid_version=30
ac_solid_prefix=scl
elif test -f $1/scl${ac_solid_os}23.a; then
ac_solid_version=23
ac_solid_prefix=scl
fi
dnl Check for the library files, and setup the ODBC_LIBS path.
if test ! -f $1/lib${ac_solid_prefix}${ac_solid_os}${ac_solid_version}.so && \
test ! -f $1/lib${ac_solid_prefix}${ac_solid_os}${ac_solid_version}.a; then
dnl we have an error and should bail out, as we can't find the libs!
echo ""
echo "*********************************************************************"
echo "* Unable to locate $1/lib${ac_solid_prefix}${ac_solid_os}${ac_solid_version}.so or $1/lib${ac_solid_prefix}${ac_solid_os}${ac_solid_version}.a"
echo "* Please correct this by creating the following links and reconfiguring:"
echo "* $1/lib${ac_solid_prefix}${ac_solid_os}${ac_solid_version}.a -> $1/lib${ac_solid_prefix}${ac_solid_os}${ac_solid_version}.a"
echo "* $1/${ac_solid_prefix}${ac_solid_os}${ac_solid_version}.so -> $1/lib${ac_solid_prefix}${ac_solid_os}${ac_solid_version}.so"
echo "*********************************************************************"
else
ODBC_LFLAGS=-L$1
ODBC_LIBS=-l${ac_solid_prefix}${ac_solid_os}${ac_solid_version}
fi
AC_MSG_RESULT([$(echo $ODBC_LIBS | $SED -e 's!.*/!!')])
])
dnl
dnl PHP_ODBC_FIND_EMPRESS_LIBS(libdir)
dnl
dnl Figure out which library file to link with for the Empress support.
dnl
AC_DEFUN([PHP_ODBC_FIND_EMPRESS_LIBS],[
AC_MSG_CHECKING([Empress library file])
ODBC_LIBS=$(echo $1/libempodbccl.so | cut -d' ' -f1)
if test ! -f $ODBC_LIBS; then
ODBC_LIBS=$(echo $1/libempodbccl.so | cut -d' ' -f1)
fi
AC_MSG_RESULT([$(echo $ODBC_LIBS | $SED -e 's!.*/!!')])
])
dnl
dnl PHP_ODBC_FIND_EMPRESS_BCS_LIBS(libdir)
dnl
dnl Figure out which library file to link with for the Empress local access
dnl support.
dnl
AC_DEFUN([PHP_ODBC_FIND_EMPRESS_BCS_LIBS],[
AC_MSG_CHECKING([Empress local access library file])
ODBCBCS_LIBS=$(echo $1/libempodbcbcs.a | cut -d' ' -f1)
if test ! -f $ODBCBCS_LIBS; then
ODBCBCS_LIBS=$(echo $1/libempodbcbcs.a | cut -d' ' -f1)
fi
AC_MSG_RESULT([$(echo $ODBCBCS_LIBS | $SED -e 's!.*/!!')])
])
dnl
dnl configure options
dnl
AS_VAR_IF([ODBC_TYPE],, [
PHP_ARG_WITH([adabas],
[for Adabas support],
[AS_HELP_STRING([[--with-adabas[=DIR]]],
[Include Adabas D support [/usr/local]])])
AS_VAR_IF([PHP_ADABAS], [no], [], [
AS_VAR_IF([PHP_ADABAS], [yes], [PHP_ADABAS=/usr/local])
PHP_ADD_INCLUDE([$PHP_ADABAS/incl])
PHP_ADD_LIBPATH([$PHP_ADABAS/$PHP_LIBDIR])
ODBC_OBJS="$PHP_ADABAS/$PHP_LIBDIR/odbclib.a"
ODBC_LIB="$abs_builddir/ext/odbc/libodbc_adabas.a"
$srcdir/build/shtool mkdir -f -p ext/odbc
rm -f "$ODBC_LIB"
cp "$ODBC_OBJS" "$ODBC_LIB"
PHP_ADD_LIBRARY([sqlptc])
PHP_ADD_LIBRARY([sqlrte])
PHP_ADD_LIBRARY_WITH_PATH([odbc_adabas], [$abs_builddir/ext/odbc])
ODBC_TYPE=adabas
ODBC_INCDIR=$PHP_ADABAS/incl
PHP_ODBC_CHECK_HEADER([sqlext.h])
AC_DEFINE([HAVE_ADABAS], [1],
[Define to 1 if the odbc extension uses the Adabas D.])
])
])
AS_VAR_IF([ODBC_TYPE],, [
PHP_ARG_WITH([sapdb],
[for SAP DB support],
[AS_HELP_STRING([[--with-sapdb[=DIR]]],
[Include SAP DB support [/usr/local]])])
AS_VAR_IF([PHP_SAPDB], [no], [], [
AS_VAR_IF([PHP_SAPDB], [yes], [PHP_SAPDB=/usr/local])
PHP_ADD_INCLUDE([$PHP_SAPDB/incl])
PHP_ADD_LIBPATH([$PHP_SAPDB/$PHP_LIBDIR])
PHP_ADD_LIBRARY([sqlod])
ODBC_TYPE=sapdb
AC_DEFINE([HAVE_SAPDB], [1],
[Define to 1 if the odbc extension uses the SAP DB.])
])
])
AS_VAR_IF([ODBC_TYPE],, [
PHP_ARG_WITH([solid],
[for Solid support],
[AS_HELP_STRING([[--with-solid[=DIR]]],
[Include Solid support [/usr/local/solid]])])
AS_VAR_IF([PHP_SOLID], [no], [], [
AS_VAR_IF([PHP_SOLID], [yes], [PHP_SOLID=/usr/local/solid])
ODBC_INCDIR=$PHP_SOLID/include
ODBC_LIBDIR=$PHP_SOLID/$PHP_LIBDIR
ODBC_CFLAGS=-I$ODBC_INCDIR
ODBC_TYPE=solid
if test -f $ODBC_LIBDIR/soc*35.a; then
AC_DEFINE([HAVE_SOLID_35], [1], [Define to 1 if Solid DB 3.5 is used.])
elif test -f $ODBC_LIBDIR/scl*30.a; then
AC_DEFINE([HAVE_SOLID_30], [1], [Define to 1 if Solid DB 3.0 is used.])
elif test -f $ODBC_LIBDIR/scl*23.a; then
AC_DEFINE([HAVE_SOLID], [1],
[Define to 1 if the odbc extension uses the Solid DB.])
fi
PHP_ODBC_FIND_SOLID_LIBS([$ODBC_LIBDIR])
])
])
AS_VAR_IF([ODBC_TYPE],, [
PHP_ARG_WITH([ibm-db2],
[for IBM DB2 support],
@@ -210,70 +48,6 @@ PHP configure:
])
])
AS_VAR_IF([ODBC_TYPE],, [
PHP_ARG_WITH([empress],
[for Empress support],
[AS_HELP_STRING([[--with-empress[=DIR]]],
[Include Empress support $EMPRESSPATH (Empress Version >= 8.60
required)])])
AS_VAR_IF([PHP_EMPRESS], [no], [], [
AS_VAR_IF([PHP_EMPRESS], [yes], [
ODBC_INCDIR=$EMPRESSPATH/include/odbc
ODBC_LIBDIR=$EMPRESSPATH/shlib
], [
ODBC_INCDIR=$PHP_EMPRESS/include/odbc
ODBC_LIBDIR=$PHP_EMPRESS/shlib
])
ODBC_CFLAGS=-I$ODBC_INCDIR
ODBC_LFLAGS=-L$ODBC_LIBDIR
ODBC_TYPE=empress
AC_DEFINE([HAVE_EMPRESS], [1],
[Define to 1 if the odbc extension uses the Empress.])
PHP_ODBC_FIND_EMPRESS_LIBS([$ODBC_LIBDIR])
])
])
AS_VAR_IF([ODBC_TYPE],, [
PHP_ARG_WITH([empress-bcs],
[for Empress local access support],
[AS_HELP_STRING([[--with-empress-bcs[=DIR]]],
[Include Empress Local Access support $EMPRESSPATH (Empress Version >=
8.60 required)])])
AS_VAR_IF([PHP_EMPRESS_BCS], [no], [], [
AS_VAR_IF([PHP_EMPRESS_BCS], [yes], [
ODBC_INCDIR=$EMPRESSPATH/include/odbc
ODBC_LIBDIR=$EMPRESSPATH/shlib
], [
ODBC_INCDIR=$PHP_EMPRESS_BCS/include/odbc
ODBC_LIBDIR=$PHP_EMPRESS_BCS/shlib
])
CC="empocc -bcs";export CC;
LD="empocc -bcs";export LD;
ODBC_CFLAGS=-I$ODBC_INCDIR
ODBC_LFLAGS=-L$ODBC_LIBDIR
LIST=$(empocc -listlines -bcs -o a a.c)
NEWLIST=
for I in $LIST
do
case $I in
$EMPRESSPATH/odbccl/lib/* | \
$EMPRESSPATH/rdbms/lib/* | \
$EMPRESSPATH/common/lib/*)
NEWLIST="$NEWLIST $I"
;;
esac
done
ODBC_LIBS="-lempphpbcs -lms -lmscfg -lbasic -lbasic_os -lnlscstab -lnlsmsgtab -lm -ldl -lcrypt"
ODBC_TYPE=empress-bcs
AC_DEFINE([HAVE_EMPRESS], [1],
[Define to 1 if the odbc extension uses the Empress.])
PHP_ODBC_FIND_EMPRESS_BCS_LIBS([$ODBC_LIBDIR])
])
])
AS_VAR_IF([ODBC_TYPE],, [
PHP_ARG_WITH([custom-odbc],
[for a custom ODBC support],
@@ -313,25 +87,6 @@ PHP_ARG_WITH([iodbc],
])
])
AS_VAR_IF([ODBC_TYPE],, [
PHP_ARG_WITH([esoob],
[for Easysoft ODBC-ODBC Bridge support],
[AS_HELP_STRING([[--with-esoob[=DIR]]],
[Include Easysoft OOB support [/usr/local/easysoft/oob/client]])])
AS_VAR_IF([PHP_ESOOB], [no], [], [
AS_VAR_IF([PHP_ESOOB], [yes], [PHP_ESOOB=/usr/local/easysoft/oob/client])
ODBC_INCDIR=$PHP_ESOOB/include
ODBC_LIBDIR=$PHP_ESOOB/$PHP_LIBDIR
ODBC_LFLAGS=-L$ODBC_LIBDIR
ODBC_CFLAGS=-I$ODBC_INCDIR
ODBC_LIBS=-lesoobclient
ODBC_TYPE=esoob
AC_DEFINE([HAVE_ESOOB], [1],
[Define to 1 if the odbc extension uses the Easysoft OOB.])
])
])
AS_VAR_IF([ODBC_TYPE],, [
PHP_ARG_WITH([unixODBC],
[whether to build with unixODBC support],
@@ -360,58 +115,10 @@ PHP_ARG_WITH([unixODBC],
])
])
AS_VAR_IF([ODBC_TYPE],, [
PHP_ARG_WITH([dbmaker],
[for DBMaker support],
[AS_HELP_STRING([[--with-dbmaker[=DIR]]],
[Include DBMaker support])])
AS_VAR_IF([PHP_DBMAKER], [no], [], [
AS_VAR_IF([PHP_DBMAKER], [yes], [
dnl Find dbmaker home directory
DBMAKER_HOME=$(grep "^dbmaker:" /etc/passwd | $AWK -F: '{print $6}')
dnl check DBMaker version (from 5.0 to 2.0)
DBMAKER_VERSION=5.0
while test ! -d $DBMAKER_HOME/$DBMAKER_VERSION && test "$DBMAKER_VERSION" != "2.9"; do
DM_VER=$(echo $DBMAKER_VERSION | $SED -e 's/\.//' | $AWK '{ print $1-1;}')
MAJOR_V=$(echo $DM_VER | $AWK '{ print $1/10; }' | $AWK -F. '{ print $1; }')
MINOR_V=$(echo $DM_VER | $AWK '{ print $1%10; }')
DBMAKER_VERSION=$MAJOR_V.$MINOR_V
done
AS_VAR_IF([DBMAKER_VERSION], [2.9],
[PHP_DBMAKER=$DBMAKER_HOME],
[PHP_DBMAKER=$DBMAKER_HOME/$DBMAKER_VERSION])
])
ODBC_INCDIR=$PHP_DBMAKER/include
ODBC_LIBDIR=$PHP_DBMAKER/$PHP_LIBDIR
ODBC_CFLAGS=-I$ODBC_INCDIR
ODBC_LFLAGS=-L$ODBC_LIBDIR
ODBC_LIBS="-ldmapic -lc"
ODBC_TYPE=dbmaker
AC_DEFINE([HAVE_DBMAKER], [1],
[Define to 1 if the odbc extension uses the DBMaker.])
AS_VAR_IF([ext_shared], [yes], [ODBC_LIBS="-ldmapic -lc -lm"], [
PHP_ADD_LIBRARY_WITH_PATH([dmapic], [$ODBC_LIBDIR])
PHP_ADD_INCLUDE([$ODBC_INCDIR])
])
])
])
dnl Extension setup
if test -n "$ODBC_TYPE"; then
AS_VAR_IF([ODBC_TYPE], [dbmaker],, [
PHP_EVAL_LIBLINE([$ODBC_LFLAGS $ODBC_LIBS], [ODBC_SHARED_LIBADD])
AS_VAR_IF([ODBC_TYPE], [solid],,
[AC_DEFINE([HAVE_SQLDATASOURCES], [1],
[Define to 1 if ODBC library has 'SQLDataSources', as a function or
macro.])])
])
PHP_EVAL_LIBLINE([$ODBC_LFLAGS $ODBC_LIBS], [ODBC_SHARED_LIBADD])
AC_DEFINE([HAVE_UODBC], [1],
[Define to 1 if the PHP extension 'odbc' is available.])

View File

@@ -8,7 +8,6 @@ if (PHP_ODBC == "yes") {
&& CHECK_HEADER_ADD_INCLUDE("sqlext.h", "CFLAGS_ODBC")) {
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_SQLDATASOURCES", 1, "Define to 1 if ODBC library has 'SQLDataSources', as a function or macro.");
} else {
WARNING("odbc support can't be enabled, libraries or header are missing (SDK)")
PHP_ODBC = "no"

View File

@@ -337,20 +337,16 @@ namespace {
function odbc_cursor(Odbc\Result $statement): string|false {}
#ifdef HAVE_SQLDATASOURCES
function odbc_data_source(Odbc\Connection $odbc, int $fetch_type): array|null|false {}
#endif
function odbc_exec(Odbc\Connection $odbc, string $query): Odbc\Result|false {}
/** @alias odbc_exec */
function odbc_do(Odbc\Connection $odbc, string $query): Odbc\Result|false {}
#ifdef PHP_ODBC_HAVE_FETCH_HASH
function odbc_fetch_object(Odbc\Result $statement, ?int $row = null): stdClass|false {}
function odbc_fetch_array(Odbc\Result $statement, ?int $row = null): array|false {}
#endif
/**
* @param array $array
@@ -374,9 +370,7 @@ namespace {
function odbc_num_rows(Odbc\Result $statement): int {}
#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30)
function odbc_next_result(Odbc\Result $statement): bool {}
#endif
function odbc_num_fields(Odbc\Result $statement): int {}
@@ -413,23 +407,19 @@ namespace {
function odbc_primarykeys(Odbc\Connection $odbc, ?string $catalog, string $schema, string $table): Odbc\Result|false {}
#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35)
function odbc_procedurecolumns(Odbc\Connection $odbc, ?string $catalog = null, ?string $schema = null, ?string $procedure = null, ?string $column = null): Odbc\Result|false {}
function odbc_procedures(Odbc\Connection $odbc, ?string $catalog = null, ?string $schema = null, ?string $procedure = null): Odbc\Result|false {}
function odbc_foreignkeys(Odbc\Connection $odbc, ?string $pk_catalog, string $pk_schema, string $pk_table, string $fk_catalog, string $fk_schema, string $fk_table): Odbc\Result|false {}
#endif
function odbc_specialcolumns(Odbc\Connection $odbc, int $type, ?string $catalog, string $schema, string $table, int $scope, int $nullable): Odbc\Result|false {}
function odbc_statistics(Odbc\Connection $odbc, ?string $catalog, string $schema, string $table, int $unique, int $accuracy): Odbc\Result|false {}
#if !defined(HAVE_DBMAKER) && !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) &&!defined(HAVE_SOLID_35)
function odbc_tableprivileges(Odbc\Connection $odbc, ?string $catalog, string $schema, string $table): Odbc\Result|false {}
function odbc_columnprivileges(Odbc\Connection $odbc, ?string $catalog, string $schema, string $table, string $column): Odbc\Result|false {}
#endif
/* odbc_utils.c */

View File

@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: 2a788e343c154d2f29adeab45d5507f73de1b6bf */
* Stub hash: f9ba28767b256dbcea087a65aa4bb5f5b509d6f3 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_odbc_close_all, 0, 0, IS_VOID, 0)
ZEND_END_ARG_INFO()
@@ -28,18 +28,15 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_odbc_cursor, 0, 1, MAY_BE_STRING
ZEND_ARG_OBJ_INFO(0, statement, Odbc\\Result, 0)
ZEND_END_ARG_INFO()
#if defined(HAVE_SQLDATASOURCES)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_odbc_data_source, 0, 2, MAY_BE_ARRAY|MAY_BE_NULL|MAY_BE_FALSE)
ZEND_ARG_OBJ_INFO(0, odbc, Odbc\\Connection, 0)
ZEND_ARG_TYPE_INFO(0, fetch_type, IS_LONG, 0)
ZEND_END_ARG_INFO()
#endif
#define arginfo_odbc_exec arginfo_odbc_prepare
#define arginfo_odbc_do arginfo_odbc_prepare
#if defined(PHP_ODBC_HAVE_FETCH_HASH)
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_odbc_fetch_object, 0, 1, stdClass, MAY_BE_FALSE)
ZEND_ARG_OBJ_INFO(0, statement, Odbc\\Result, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, row, IS_LONG, 1, "null")
@@ -49,7 +46,6 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_odbc_fetch_array, 0, 1, MAY_BE_A
ZEND_ARG_OBJ_INFO(0, statement, Odbc\\Result, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, row, IS_LONG, 1, "null")
ZEND_END_ARG_INFO()
#endif
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_odbc_fetch_into, 0, 2, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_ARG_OBJ_INFO(0, statement, Odbc\\Result, 0)
@@ -93,11 +89,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_odbc_num_rows, 0, 1, IS_LONG, 0)
ZEND_ARG_OBJ_INFO(0, statement, Odbc\\Result, 0)
ZEND_END_ARG_INFO()
#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_odbc_next_result, 0, 1, _IS_BOOL, 0)
ZEND_ARG_OBJ_INFO(0, statement, Odbc\\Result, 0)
ZEND_END_ARG_INFO()
#endif
#define arginfo_odbc_num_fields arginfo_odbc_num_rows
@@ -174,7 +168,6 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_odbc_primarykeys, 0, 4, Odbc
ZEND_ARG_TYPE_INFO(0, table, IS_STRING, 0)
ZEND_END_ARG_INFO()
#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35)
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_odbc_procedurecolumns, 0, 1, Odbc\\Result, MAY_BE_FALSE)
ZEND_ARG_OBJ_INFO(0, odbc, Odbc\\Connection, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, catalog, IS_STRING, 1, "null")
@@ -199,7 +192,6 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_odbc_foreignkeys, 0, 7, Odbc
ZEND_ARG_TYPE_INFO(0, fk_schema, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, fk_table, IS_STRING, 0)
ZEND_END_ARG_INFO()
#endif
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_odbc_specialcolumns, 0, 7, Odbc\\Result, MAY_BE_FALSE)
ZEND_ARG_OBJ_INFO(0, odbc, Odbc\\Connection, 0)
@@ -220,13 +212,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_odbc_statistics, 0, 6, Odbc\
ZEND_ARG_TYPE_INFO(0, accuracy, IS_LONG, 0)
ZEND_END_ARG_INFO()
#if !defined(HAVE_DBMAKER) && !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) &&!defined(HAVE_SOLID_35)
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_odbc_tableprivileges, 0, 4, Odbc\\Result, MAY_BE_FALSE)
ZEND_ARG_OBJ_INFO(0, odbc, Odbc\\Connection, 0)
ZEND_ARG_TYPE_INFO(0, catalog, IS_STRING, 1)
ZEND_ARG_TYPE_INFO(0, schema, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, table, IS_STRING, 0)
ZEND_END_ARG_INFO()
#define arginfo_odbc_tableprivileges arginfo_odbc_primarykeys
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_odbc_columnprivileges, 0, 5, Odbc\\Result, MAY_BE_FALSE)
ZEND_ARG_OBJ_INFO(0, odbc, Odbc\\Connection, 0)
@@ -235,7 +221,6 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_odbc_columnprivileges, 0, 5,
ZEND_ARG_TYPE_INFO(0, table, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, column, IS_STRING, 0)
ZEND_END_ARG_INFO()
#endif
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_odbc_connection_string_is_quoted, 0, 1, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, str, IS_STRING, 0)
@@ -253,14 +238,10 @@ ZEND_FUNCTION(odbc_longreadlen);
ZEND_FUNCTION(odbc_prepare);
ZEND_FUNCTION(odbc_execute);
ZEND_FUNCTION(odbc_cursor);
#if defined(HAVE_SQLDATASOURCES)
ZEND_FUNCTION(odbc_data_source);
#endif
ZEND_FUNCTION(odbc_exec);
#if defined(PHP_ODBC_HAVE_FETCH_HASH)
ZEND_FUNCTION(odbc_fetch_object);
ZEND_FUNCTION(odbc_fetch_array);
#endif
ZEND_FUNCTION(odbc_fetch_into);
ZEND_FUNCTION(odbc_fetch_row);
ZEND_FUNCTION(odbc_result);
@@ -270,9 +251,7 @@ ZEND_FUNCTION(odbc_connect);
ZEND_FUNCTION(odbc_pconnect);
ZEND_FUNCTION(odbc_close);
ZEND_FUNCTION(odbc_num_rows);
#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30)
ZEND_FUNCTION(odbc_next_result);
#endif
ZEND_FUNCTION(odbc_num_fields);
ZEND_FUNCTION(odbc_field_name);
ZEND_FUNCTION(odbc_field_type);
@@ -289,17 +268,13 @@ ZEND_FUNCTION(odbc_tables);
ZEND_FUNCTION(odbc_columns);
ZEND_FUNCTION(odbc_gettypeinfo);
ZEND_FUNCTION(odbc_primarykeys);
#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35)
ZEND_FUNCTION(odbc_procedurecolumns);
ZEND_FUNCTION(odbc_procedures);
ZEND_FUNCTION(odbc_foreignkeys);
#endif
ZEND_FUNCTION(odbc_specialcolumns);
ZEND_FUNCTION(odbc_statistics);
#if !defined(HAVE_DBMAKER) && !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) &&!defined(HAVE_SOLID_35)
ZEND_FUNCTION(odbc_tableprivileges);
ZEND_FUNCTION(odbc_columnprivileges);
#endif
ZEND_FUNCTION(odbc_connection_string_is_quoted);
ZEND_FUNCTION(odbc_connection_string_should_quote);
ZEND_FUNCTION(odbc_connection_string_quote);
@@ -311,15 +286,11 @@ static const zend_function_entry ext_functions[] = {
ZEND_FE(odbc_prepare, arginfo_odbc_prepare)
ZEND_FE(odbc_execute, arginfo_odbc_execute)
ZEND_FE(odbc_cursor, arginfo_odbc_cursor)
#if defined(HAVE_SQLDATASOURCES)
ZEND_FE(odbc_data_source, arginfo_odbc_data_source)
#endif
ZEND_FE(odbc_exec, arginfo_odbc_exec)
ZEND_RAW_FENTRY("odbc_do", zif_odbc_exec, arginfo_odbc_do, 0, NULL, NULL)
#if defined(PHP_ODBC_HAVE_FETCH_HASH)
ZEND_FE(odbc_fetch_object, arginfo_odbc_fetch_object)
ZEND_FE(odbc_fetch_array, arginfo_odbc_fetch_array)
#endif
ZEND_FE(odbc_fetch_into, arginfo_odbc_fetch_into)
ZEND_FE(odbc_fetch_row, arginfo_odbc_fetch_row)
ZEND_FE(odbc_result, arginfo_odbc_result)
@@ -329,9 +300,7 @@ static const zend_function_entry ext_functions[] = {
ZEND_FE(odbc_pconnect, arginfo_odbc_pconnect)
ZEND_FE(odbc_close, arginfo_odbc_close)
ZEND_FE(odbc_num_rows, arginfo_odbc_num_rows)
#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30)
ZEND_FE(odbc_next_result, arginfo_odbc_next_result)
#endif
ZEND_FE(odbc_num_fields, arginfo_odbc_num_fields)
ZEND_FE(odbc_field_name, arginfo_odbc_field_name)
ZEND_FE(odbc_field_type, arginfo_odbc_field_type)
@@ -349,17 +318,13 @@ static const zend_function_entry ext_functions[] = {
ZEND_FE(odbc_columns, arginfo_odbc_columns)
ZEND_FE(odbc_gettypeinfo, arginfo_odbc_gettypeinfo)
ZEND_FE(odbc_primarykeys, arginfo_odbc_primarykeys)
#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35)
ZEND_FE(odbc_procedurecolumns, arginfo_odbc_procedurecolumns)
ZEND_FE(odbc_procedures, arginfo_odbc_procedures)
ZEND_FE(odbc_foreignkeys, arginfo_odbc_foreignkeys)
#endif
ZEND_FE(odbc_specialcolumns, arginfo_odbc_specialcolumns)
ZEND_FE(odbc_statistics, arginfo_odbc_statistics)
#if !defined(HAVE_DBMAKER) && !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) &&!defined(HAVE_SOLID_35)
ZEND_FE(odbc_tableprivileges, arginfo_odbc_tableprivileges)
ZEND_FE(odbc_columnprivileges, arginfo_odbc_columnprivileges)
#endif
ZEND_FE(odbc_connection_string_is_quoted, arginfo_odbc_connection_string_is_quoted)
ZEND_FE(odbc_connection_string_should_quote, arginfo_odbc_connection_string_should_quote)
ZEND_FE(odbc_connection_string_quote, arginfo_odbc_connection_string_quote)

View File

@@ -253,10 +253,6 @@ static void odbc_result_free(odbc_result *res)
/* If aborted via timer expiration, don't try to call any unixODBC function */
if (res->stmt && !(PG(connection_status) & PHP_CONNECTION_TIMEOUT)) {
#if defined(HAVE_SOLID) || defined(HAVE_SOLID_30) || defined(HAVE_SOLID_35)
SQLTransact(res->conn_ptr->henv, res->conn_ptr->hdbc,
(SQLUSMALLINT) SQL_COMMIT);
#endif
SQLFreeStmt(res->stmt,SQL_DROP);
/* We don't want the connection to be closed after the last statement has been closed
* Connections will be closed on shutdown
@@ -694,14 +690,6 @@ void odbc_bindcols(odbc_result *result)
case SQL_WLONGVARCHAR:
result->values[i].value = NULL;
break;
#ifdef HAVE_ADABAS
case SQL_TIMESTAMP:
result->values[i].value = (char *)emalloc(27);
SQLBindCol(result->stmt, (SQLUSMALLINT)(i+1), SQL_C_CHAR, result->values[i].value,
27, &result->values[i].vallen);
break;
#endif /* HAVE_ADABAS */
case SQL_CHAR:
case SQL_VARCHAR:
case SQL_WCHAR:
@@ -796,17 +784,7 @@ void odbc_transact(INTERNAL_FUNCTION_PARAMETERS, int type)
void odbc_column_lengths(INTERNAL_FUNCTION_PARAMETERS, int type)
{
odbc_result *result;
#if defined(HAVE_SOLID) || defined(HAVE_SOLID_30)
/* this seems to be necessary for Solid2.3 ( tested by
* tammy@synchronis.com) and Solid 3.0 (tested by eric@terra.telemediair.nl)
* Solid does not seem to declare a SQLINTEGER, but it does declare a
* SQL_INTEGER which does not work (despite being the same type as a SDWORD.
* Solid 3.5 does not have this issue.
*/
SDWORD len;
#else
SQLLEN len;
#endif
zval *pv_res;
zend_long pv_num;
@@ -886,9 +864,7 @@ PHP_FUNCTION(odbc_prepare)
odbc_result *result = NULL;
RETCODE rc;
int i;
#ifdef HAVE_SQL_EXTENDED_FETCH
SQLUINTEGER scrollopts;
#endif
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &pv_conn, odbc_connection_ce, &query, &query_len) == FAILURE) {
RETURN_THROWS();
@@ -916,9 +892,6 @@ PHP_FUNCTION(odbc_prepare)
RETURN_FALSE;
}
#ifdef HAVE_SQL_EXTENDED_FETCH
/* Solid doesn't have ExtendedFetch, if DriverManager is used, get Info,
whether Driver supports ExtendedFetch */
rc = SQLGetInfo(conn->hdbc, SQL_FETCH_DIRECTION, (void *) &scrollopts, sizeof(scrollopts), NULL);
if (rc == SQL_SUCCESS) {
if ((result->fetch_abs = (scrollopts & SQL_FD_FETCH_ABSOLUTE))) {
@@ -930,7 +903,6 @@ PHP_FUNCTION(odbc_prepare)
} else {
result->fetch_abs = 0;
}
#endif
rc = SQLPrepare(result->stmt, (SQLCHAR *) query, SQL_NTS);
switch (rc) {
@@ -1079,9 +1051,6 @@ PHP_FUNCTION(odbc_execute)
(void *)(intptr_t)params[i-1].fp, 0,
&params[i-1].vallen);
} else {
#ifdef HAVE_DBMAKER
precision = params[i-1].vallen;
#endif
if (otype == IS_NULL) {
params[i-1].vallen = SQL_NULL_DATA;
}
@@ -1209,7 +1178,6 @@ PHP_FUNCTION(odbc_cursor)
}
/* }}} */
#ifdef HAVE_SQLDATASOURCES
/* {{{ Return information about the currently connected data source */
PHP_FUNCTION(odbc_data_source)
{
@@ -1265,7 +1233,6 @@ PHP_FUNCTION(odbc_data_source)
}
/* }}} */
#endif /* HAVE_SQLDATASOURCES */
/* {{{ Prepare and execute an SQL statement */
/* XXX Use flags */
@@ -1276,9 +1243,7 @@ PHP_FUNCTION(odbc_exec)
size_t query_len;
odbc_result *result = NULL;
RETCODE rc;
#ifdef HAVE_SQL_EXTENDED_FETCH
SQLUINTEGER scrollopts;
#endif
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &pv_conn, odbc_connection_ce, &query, &query_len) == FAILURE) {
RETURN_THROWS();
@@ -1303,9 +1268,6 @@ PHP_FUNCTION(odbc_exec)
RETURN_FALSE;
}
#ifdef HAVE_SQL_EXTENDED_FETCH
/* Solid doesn't have ExtendedFetch, if DriverManager is used, get Info,
whether Driver supports ExtendedFetch */
rc = SQLGetInfo(conn->hdbc, SQL_FETCH_DIRECTION, (void *) &scrollopts, sizeof(scrollopts), NULL);
if (rc == SQL_SUCCESS) {
if ((result->fetch_abs = (scrollopts & SQL_FD_FETCH_ABSOLUTE))) {
@@ -1317,7 +1279,6 @@ PHP_FUNCTION(odbc_exec)
} else {
result->fetch_abs = 0;
}
#endif
rc = SQLExecDirect(result->stmt, (SQLCHAR *) query, SQL_NTS);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO && rc != SQL_NO_DATA_FOUND) {
@@ -1345,7 +1306,6 @@ PHP_FUNCTION(odbc_exec)
}
/* }}} */
#ifdef PHP_ODBC_HAVE_FETCH_HASH
#define ODBC_NUM 1
#define ODBC_OBJECT 2
@@ -1360,10 +1320,8 @@ static void php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type)
zend_long pv_row = 0;
bool pv_row_is_null = true;
zval *pv_res, tmp;
#ifdef HAVE_SQL_EXTENDED_FETCH
SQLULEN crow;
SQLUSMALLINT RowStatus[1];
#endif
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|l!", &pv_res, odbc_result_ce, &pv_row, &pv_row_is_null) == FAILURE) {
RETURN_THROWS();
@@ -1374,46 +1332,33 @@ static void php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type)
/* TODO deprecate $row argument values less than 1 after PHP 8.4 */
#ifndef HAVE_SQL_EXTENDED_FETCH
if (!pv_row_is_null && pv_row > 0) {
php_error_docref(NULL, E_WARNING, "Extended fetch functionality is not available, argument #3 ($row) is ignored");
}
#endif
if (result->numcols == 0) {
php_error_docref(NULL, E_WARNING, "No tuples available at this result index");
RETURN_FALSE;
}
#ifdef HAVE_SQL_EXTENDED_FETCH
if (result->fetch_abs) {
if (!pv_row_is_null && pv_row > 0) {
rc = SQLExtendedFetch(result->stmt,SQL_FETCH_ABSOLUTE,(SQLLEN)pv_row,&crow,RowStatus);
} else {
rc = SQLExtendedFetch(result->stmt,SQL_FETCH_NEXT,1,&crow,RowStatus);
}
} else
#endif
rc = SQLFetch(result->stmt);
} else {
rc = SQLFetch(result->stmt);
}
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
if (rc == SQL_ERROR) {
#ifdef HAVE_SQL_EXTENDED_FETCH
odbc_sql_error(result->conn_ptr, result->stmt, "SQLExtendedFetch");
#else
odbc_sql_error(result->conn_ptr, result->stmt, "SQLFetch");
#endif
}
RETURN_FALSE;
}
array_init(return_value);
#ifdef HAVE_SQL_EXTENDED_FETCH
if (!pv_row_is_null && pv_row > 0 && result->fetch_abs)
result->fetched = (SQLLEN)pv_row;
else
#endif
result->fetched++;
for(i = 0; i < result->numcols; i++) {
@@ -1512,7 +1457,6 @@ PHP_FUNCTION(odbc_fetch_array)
php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, ODBC_OBJECT);
}
/* }}} */
#endif
/* {{{ Fetch one result row into an array */
PHP_FUNCTION(odbc_fetch_into)
@@ -1525,10 +1469,8 @@ PHP_FUNCTION(odbc_fetch_into)
zval *pv_res, *pv_res_arr, tmp;
zend_long pv_row = 0;
bool pv_row_is_null = true;
#ifdef HAVE_SQL_EXTENDED_FETCH
SQLULEN crow;
SQLUSMALLINT RowStatus[1];
#endif /* HAVE_SQL_EXTENDED_FETCH */
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oz|l!", &pv_res, odbc_result_ce, &pv_res_arr, &pv_row, &pv_row_is_null) == FAILURE) {
RETURN_THROWS();
@@ -1539,12 +1481,6 @@ PHP_FUNCTION(odbc_fetch_into)
/* TODO deprecate $row argument values less than 1 after PHP 8.4 */
#ifndef HAVE_SQL_EXTENDED_FETCH
if (!pv_row_is_null && pv_row > 0) {
php_error_docref(NULL, E_WARNING, "Extended fetch functionality is not available, argument #3 ($row) is ignored");
}
#endif
if (result->numcols == 0) {
php_error_docref(NULL, E_WARNING, "No tuples available at this result index");
RETURN_FALSE;
@@ -1555,33 +1491,26 @@ PHP_FUNCTION(odbc_fetch_into)
RETURN_THROWS();
}
#ifdef HAVE_SQL_EXTENDED_FETCH
if (result->fetch_abs) {
if (!pv_row_is_null && pv_row > 0) {
rc = SQLExtendedFetch(result->stmt,SQL_FETCH_ABSOLUTE,(SQLLEN)pv_row,&crow,RowStatus);
} else {
rc = SQLExtendedFetch(result->stmt,SQL_FETCH_NEXT,1,&crow,RowStatus);
}
} else
#endif
} else {
rc = SQLFetch(result->stmt);
}
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
if (rc == SQL_ERROR) {
#ifdef HAVE_SQL_EXTENDED_FETCH
odbc_sql_error(result->conn_ptr, result->stmt, "SQLExtendedFetch");
#else
odbc_sql_error(result->conn_ptr, result->stmt, "SQLFetch");
#endif
}
RETURN_FALSE;
}
#ifdef HAVE_SQL_EXTENDED_FETCH
if (!pv_row_is_null && pv_row > 0 && result->fetch_abs)
result->fetched = (SQLLEN)pv_row;
else
#endif
result->fetched++;
for(i = 0; i < result->numcols; i++) {
@@ -1659,10 +1588,8 @@ PHP_FUNCTION(odbc_fetch_row)
zval *pv_res;
zend_long pv_row = 0;
bool pv_row_is_null = true;
#ifdef HAVE_SQL_EXTENDED_FETCH
SQLULEN crow;
SQLUSMALLINT RowStatus[1];
#endif
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|l!", &pv_res, odbc_result_ce, &pv_row, &pv_row_is_null) == FAILURE) {
RETURN_THROWS();
@@ -1671,50 +1598,38 @@ PHP_FUNCTION(odbc_fetch_row)
result = Z_ODBC_RESULT_P(pv_res);
CHECK_ODBC_RESULT(result);
#ifndef HAVE_SQL_EXTENDED_FETCH
if (!pv_row_is_null) {
php_error_docref(NULL, E_WARNING, "Extended fetch functionality is not available, argument #3 ($row) is ignored");
}
#else
if (!pv_row_is_null && pv_row < 1) {
php_error_docref(NULL, E_WARNING, "Argument #3 ($row) must be greater than or equal to 1");
RETURN_FALSE;
}
#endif
if (result->numcols == 0) {
php_error_docref(NULL, E_WARNING, "No tuples available at this result index");
RETURN_FALSE;
}
#ifdef HAVE_SQL_EXTENDED_FETCH
if (result->fetch_abs) {
if (!pv_row_is_null) {
rc = SQLExtendedFetch(result->stmt,SQL_FETCH_ABSOLUTE,(SQLLEN)pv_row,&crow,RowStatus);
} else {
rc = SQLExtendedFetch(result->stmt,SQL_FETCH_NEXT,1,&crow,RowStatus);
}
} else
#endif
} else {
rc = SQLFetch(result->stmt);
}
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
if (rc == SQL_ERROR) {
#ifdef HAVE_SQL_EXTENDED_FETCH
odbc_sql_error(result->conn_ptr, result->stmt, "SQLExtendedFetch");
#else
odbc_sql_error(result->conn_ptr, result->stmt, "SQLFetch");
#endif
}
RETURN_FALSE;
}
#ifdef HAVE_SQL_EXTENDED_FETCH
if (!pv_row_is_null) {
result->fetched = (SQLLEN)pv_row;
} else
#endif
} else {
result->fetched++;
}
RETURN_TRUE;
}
@@ -1733,10 +1648,8 @@ PHP_FUNCTION(odbc_result)
RETCODE rc;
SQLLEN fieldsize;
zval *pv_res;
#ifdef HAVE_SQL_EXTENDED_FETCH
SQLULEN crow;
SQLUSMALLINT RowStatus[1];
#endif
ZEND_PARSE_PARAMETERS_START(2, 2)
Z_PARAM_OBJECT_OF_CLASS(pv_res, odbc_result_ce)
@@ -1787,20 +1700,14 @@ PHP_FUNCTION(odbc_result)
if (result->fetched == 0) {
/* User forgot to call odbc_fetch_row(), or wants to reload the results, do it now */
#ifdef HAVE_SQL_EXTENDED_FETCH
if (result->fetch_abs)
rc = SQLExtendedFetch(result->stmt, SQL_FETCH_NEXT, 1, &crow,RowStatus);
else
#endif
rc = SQLFetch(result->stmt);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
if (rc == SQL_ERROR) {
#ifdef HAVE_SQL_EXTENDED_FETCH
odbc_sql_error(result->conn_ptr, result->stmt, "SQLExtendedFetch");
#else
odbc_sql_error(result->conn_ptr, result->stmt, "SQLFetch");
#endif
odbc_sql_error(result->conn_ptr, result->stmt, "SQLExtendedFetch");
}
RETURN_FALSE;
}
@@ -1943,10 +1850,8 @@ PHP_FUNCTION(odbc_result_all)
char *pv_format = NULL;
size_t i, pv_format_len = 0;
SQLSMALLINT sql_c_type;
#ifdef HAVE_SQL_EXTENDED_FETCH
SQLULEN crow;
SQLUSMALLINT RowStatus[1];
#endif
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|s", &pv_res, odbc_result_ce, &pv_format, &pv_format_len) == FAILURE) {
RETURN_THROWS();
@@ -1959,11 +1864,9 @@ PHP_FUNCTION(odbc_result_all)
php_error_docref(NULL, E_WARNING, "No tuples available at this result index");
RETURN_FALSE;
}
#ifdef HAVE_SQL_EXTENDED_FETCH
if (result->fetch_abs)
rc = SQLExtendedFetch(result->stmt,SQL_FETCH_NEXT,1,&crow,RowStatus);
else
#endif
rc = SQLFetch(result->stmt);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
@@ -2059,11 +1962,9 @@ PHP_FUNCTION(odbc_result_all)
}
php_printf("</tr>\n");
#ifdef HAVE_SQL_EXTENDED_FETCH
if (result->fetch_abs)
rc = SQLExtendedFetch(result->stmt,SQL_FETCH_NEXT,1,&crow,RowStatus);
else
#endif
rc = SQLFetch(result->stmt);
}
php_printf("</table>\n");
@@ -2133,18 +2034,6 @@ bool odbc_sqlconnect(zval *zv, char *db, char *uid, char *pwd, int cur_opt, bool
return false;
}
#if defined(HAVE_SOLID) || defined(HAVE_SOLID_30)
SQLSetConnectOption((link->connection->hdbc, SQL_TRANSLATE_OPTION,
SQL_SOLID_XLATOPT_NOCNV);
#endif
#ifdef HAVE_OPENLINK
{
char dsnbuf[1024];
short dsnbuflen;
rc = SQLDriverConnect(link->connection->hdbc, NULL, db, SQL_NTS, dsnbuf, sizeof(dsnbuf) - 1, &dsnbuflen, SQL_DRIVER_NOPROMPT);
}
#else
if (cur_opt != SQL_CUR_DEFAULT) {
rc = SQLSetConnectAttr(link->connection->hdbc, SQL_ATTR_ODBC_CURSORS, (SQLPOINTER) (intptr_t) cur_opt, 0);
if (rc != SQL_SUCCESS) { /* && rc != SQL_SUCCESS_WITH_INFO ? */
@@ -2154,9 +2043,7 @@ bool odbc_sqlconnect(zval *zv, char *db, char *uid, char *pwd, int cur_opt, bool
}
/* Possible fix for bug #10250
* Needs testing on UnixODBC < 2.0.5 though. */
#if defined(HAVE_EMPRESS) || defined(HAVE_UNIXODBC) || defined(PHP_WIN32) || defined (HAVE_IODBC)
/* * Uncomment the line above, and comment line below to fully test
* #ifdef HAVE_EMPRESS */
#if defined(HAVE_UNIXODBC) || defined(PHP_WIN32) || defined (HAVE_IODBC)
{
int direct = 0;
SQLCHAR dsnbuf[1024];
@@ -2241,7 +2128,6 @@ bool odbc_sqlconnect(zval *zv, char *db, char *uid, char *pwd, int cur_opt, bool
}
#else
rc = SQLConnect(link->connection->hdbc, (SQLCHAR *) db, SQL_NTS, uid, SQL_NTS, pwd, SQL_NTS);
#endif
#endif
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
odbc_sql_error(link->connection, SQL_NULL_HSTMT, "SQLConnect");
@@ -2447,7 +2333,6 @@ PHP_FUNCTION(odbc_num_rows)
}
/* }}} */
#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30)
/* {{{ Checks if multiple results are available */
PHP_FUNCTION(odbc_next_result)
{
@@ -2494,7 +2379,6 @@ PHP_FUNCTION(odbc_next_result)
}
}
/* }}} */
#endif
/* {{{ Get number of columns in a result */
PHP_FUNCTION(odbc_num_fields)
@@ -2924,7 +2808,6 @@ PHP_FUNCTION(odbc_columns)
}
/* }}} */
#if !defined(HAVE_DBMAKER) && !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35)
/* {{{ Returns a result identifier that can be used to fetch a list of columns and associated privileges for the specified table */
PHP_FUNCTION(odbc_columnprivileges)
{
@@ -2984,9 +2867,7 @@ PHP_FUNCTION(odbc_columnprivileges)
odbc_insert_new_result(conn, return_value);
}
/* }}} */
#endif /* HAVE_DBMAKER || HAVE_SOLID*/
#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35)
/* {{{ Returns a result identifier to either a list of foreign keys in the specified table or a list of foreign keys in other tables that refer to the primary key in the specified table */
PHP_FUNCTION(odbc_foreignkeys)
{
@@ -3001,7 +2882,7 @@ PHP_FUNCTION(odbc_foreignkeys)
RETURN_THROWS();
}
#if defined(HAVE_DBMAKER) || defined(HAVE_IBMDB2)
#if defined(HAVE_IBMDB2)
#define EMPTY_TO_NULL(xstr) \
if ((int)strlen((xstr)) == 0) (xstr) = NULL
@@ -3060,7 +2941,6 @@ PHP_FUNCTION(odbc_foreignkeys)
odbc_insert_new_result(conn, return_value);
}
/* }}} */
#endif /* HAVE_SOLID */
/* {{{ Returns a result identifier containing information about data types supported by the data source */
PHP_FUNCTION(odbc_gettypeinfo)
@@ -3177,7 +3057,6 @@ PHP_FUNCTION(odbc_primarykeys)
}
/* }}} */
#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35)
/* {{{ Returns a result identifier containing the list of input and output parameters, as well as the columns that make up the result set for the specified procedures */
PHP_FUNCTION(odbc_procedurecolumns)
{
@@ -3237,9 +3116,7 @@ PHP_FUNCTION(odbc_procedurecolumns)
odbc_insert_new_result(conn, return_value);
}
/* }}} */
#endif /* HAVE_SOLID */
#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35)
/* {{{ Returns a result identifier containing the list of procedure names in a datasource */
PHP_FUNCTION(odbc_procedures)
{
@@ -3297,7 +3174,6 @@ PHP_FUNCTION(odbc_procedures)
odbc_insert_new_result(conn, return_value);
}
/* }}} */
#endif /* HAVE_SOLID */
/* {{{ Returns a result identifier containing either the optimal set of columns that uniquely identifies a row in the table or columns that are automatically updated when any value in the row is updated by a transaction */
PHP_FUNCTION(odbc_specialcolumns)
@@ -3432,7 +3308,6 @@ PHP_FUNCTION(odbc_statistics)
}
/* }}} */
#if !defined(HAVE_DBMAKER) && !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35)
/* {{{ Returns a result identifier containing a list of tables and the privileges associated with each table */
PHP_FUNCTION(odbc_tableprivileges)
{
@@ -3490,6 +3365,5 @@ PHP_FUNCTION(odbc_tableprivileges)
odbc_insert_new_result(conn, return_value);
}
/* }}} */
#endif /* HAVE_DBMAKER */
#endif /* HAVE_UODBC */

View File

@@ -31,10 +31,6 @@ extern zend_module_entry odbc_module_entry;
#include "php_version.h"
#define PHP_ODBC_VERSION PHP_VERSION
#if defined(HAVE_DBMAKER) || defined(PHP_WIN32) || defined(HAVE_IBMDB2) || defined(HAVE_UNIXODBC) || defined(HAVE_IODBC)
# define PHP_ODBC_HAVE_FETCH_HASH 1
#endif
/* user functions */
PHP_MINIT_FUNCTION(odbc);
PHP_MSHUTDOWN_FUNCTION(odbc);

View File

@@ -23,137 +23,31 @@
/* checking in the same order as in configure.ac */
#if defined(HAVE_SOLID) || defined(HAVE_SOLID_30) || defined(HAVE_SOLID_35) /* Solid Server */
#define ODBC_TYPE "Solid"
#if defined(HAVE_SOLID)
# include <cli0core.h>
# include <cli0ext1.h>
# include <cli0env.h>
#elif defined(HAVE_SOLID_30)
# include <cli0cli.h>
# include <cli0defs.h>
# include <cli0env.h>
#elif defined(HAVE_SOLID_35)
# include <sqlunix.h>
# include <sqltypes.h>
# include <sqlucode.h>
# include <sqlext.h>
# include <sql.h>
#endif /* end: #if defined(HAVE_SOLID) */
#undef HAVE_SQL_EXTENDED_FETCH
#define SQLSMALLINT SWORD
#define SQLUSMALLINT UWORD
#ifndef SQL_SUCCEEDED
#define SQL_SUCCEEDED(rc) (((rc)&(~1))==0)
#endif
#elif defined(HAVE_EMPRESS) /* Empress */
#define ODBC_TYPE "Empress"
#include <sql.h>
#include <sqlext.h>
#undef HAVE_SQL_EXTENDED_FETCH
#elif defined(HAVE_ADABAS) /* Adabas D */
#define ODBC_TYPE "Adabas D"
#include <WINDOWS.H>
#include <sql.h>
#include <sqlext.h>
#define HAVE_SQL_EXTENDED_FETCH 1
#define SQL_SUCCEEDED(rc) (((rc)&(~1))==0)
#define SQLINTEGER ULONG
#define SQLUSMALLINT USHORT
#elif defined(HAVE_SAPDB) /* SAP DB */
#define ODBC_TYPE "SAP DB"
#include <WINDOWS.H>
#include <sql.h>
#include <sqlext.h>
#define HAVE_SQL_EXTENDED_FETCH 1
#define SQL_SUCCEEDED(rc) (((rc)&(~1))==0)
#elif defined(HAVE_IODBC) /* iODBC library */
#ifdef CHAR
#undef CHAR
#endif
#ifdef SQLCHAR
#undef SQLCHAR
#endif
#if defined(HAVE_IODBC) /* iODBC library */
#define ODBC_TYPE "iODBC"
#include <sql.h>
#include <sqlext.h>
#include <iodbcext.h>
#define HAVE_SQL_EXTENDED_FETCH 1
#elif defined(HAVE_UNIXODBC) /* unixODBC library */
#ifdef CHAR
#undef CHAR
#endif
#ifdef SQLCHAR
#undef SQLCHAR
#endif
#define ODBC_TYPE "unixODBC"
#include <sql.h>
#include <sqlext.h>
#define HAVE_SQL_EXTENDED_FETCH 1
#elif defined(HAVE_ESOOB) /* Easysoft ODBC-ODBC Bridge library */
#define ODBC_TYPE "ESOOB"
#include <sql.h>
#include <sqlext.h>
#define HAVE_SQL_EXTENDED_FETCH 1
#elif defined(HAVE_OPENLINK) /* OpenLink ODBC drivers */
#define ODBC_TYPE "Openlink"
#include <iodbc.h>
#include <isql.h>
#include <isqlext.h>
#include <udbcext.h>
#define HAVE_SQL_EXTENDED_FETCH 1
#ifndef SQLSMALLINT
#define SQLSMALLINT SWORD
#endif
#ifndef SQLUSMALLINT
#define SQLUSMALLINT UWORD
#endif
#elif defined(HAVE_DBMAKER) /* DBMaker */
#define ODBC_TYPE "DBMaker"
#define HAVE_SQL_EXTENDED_FETCH 1
#include <odbc.h>
#elif defined(HAVE_CODBC) /* Custom ODBC */
#define ODBC_TYPE "Custom ODBC"
#define HAVE_SQL_EXTENDED_FETCH 1
#include <odbc.h>
#elif defined(HAVE_IBMDB2) /* DB2 CLI */
#define ODBC_TYPE "IBM DB2 CLI"
#define HAVE_SQL_EXTENDED_FETCH 1
#include <sqlcli1.h>
#ifdef DB268K
/* Need to include ASLM for 68K applications */
#include <LibraryManager.h>
#endif
#else /* MS ODBC */
#define HAVE_SQL_EXTENDED_FETCH 1
#include <WINDOWS.H>
#include <sql.h>
#include <sqlext.h>
@@ -173,10 +67,6 @@
#define ODBC_SQL_ENV_T SQLHANDLE
#define ODBC_SQL_CONN_T SQLHANDLE
#define ODBC_SQL_STMT_T SQLHANDLE
#elif defined( HAVE_SOLID_35 ) || defined( HAVE_SAPDB ) || defined ( HAVE_EMPRESS )
#define ODBC_SQL_ENV_T SQLHENV
#define ODBC_SQL_CONN_T SQLHDBC
#define ODBC_SQL_STMT_T SQLHSTMT
#else
#define ODBC_SQL_ENV_T HENV
#define ODBC_SQL_CONN_T HDBC
@@ -217,9 +107,7 @@ typedef struct odbc_result {
odbc_result_value *values;
SQLSMALLINT numcols;
SQLSMALLINT numparams;
# ifdef HAVE_SQL_EXTENDED_FETCH
int fetch_abs;
# endif
zend_long longreadlen;
int binmode;
int fetched;