diff options
Diffstat (limited to 'ext')
38 files changed, 0 insertions, 6624 deletions
diff --git a/ext/mssql/CREDITS b/ext/mssql/CREDITS deleted file mode 100644 index 548684afca..0000000000 --- a/ext/mssql/CREDITS +++ /dev/null @@ -1,2 +0,0 @@ -MS SQL -Frank M. Kromann diff --git a/ext/mssql/config.m4 b/ext/mssql/config.m4 deleted file mode 100644 index 2a298af734..0000000000 --- a/ext/mssql/config.m4 +++ /dev/null @@ -1,56 +0,0 @@ -dnl -dnl $Id$ -dnl - -PHP_ARG_WITH(mssql,for MSSQL support via FreeTDS, -[ --with-mssql[=DIR] Include MSSQL-DB support. DIR is the FreeTDS home - directory [/usr/local/freetds]]) - -if test "$PHP_MSSQL" != "no"; then - - if test "$PHP_MSSQL" = "yes"; then - for i in /usr/local /usr; do - if test -f $i/include/sybdb.h; then - FREETDS_INSTALLATION_DIR=$i - FREETDS_INCLUDE_DIR=$i/include - break - elif test -f $i/include/freetds/sybdb.h; then - FREETDS_INSTALLATION_DIR=$i - FREETDS_INCLUDE_DIR=$i/include/freetds - break - fi - done - - if test -z "$FREETDS_INSTALLATION_DIR"; then - AC_MSG_ERROR(Cannot find FreeTDS in known installation directories) - fi - - elif test "$PHP_MSSQL" != "no"; then - - if test -f $PHP_MSSQL/include/sybdb.h; then - FREETDS_INSTALLATION_DIR=$PHP_MSSQL - FREETDS_INCLUDE_DIR=$PHP_MSSQL/include - elif test -f $PHP_MSSQL/include/freetds/sybdb.h; then - FREETDS_INSTALLATION_DIR=$PHP_MSSQL - FREETDS_INCLUDE_DIR=$PHP_MSSQL/include/freetds - else - AC_MSG_ERROR(Directory $PHP_MSSQL is not a FreeTDS installation directory) - fi - fi - - if test ! -r "$FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.a" && test ! -r "$FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.so"; then - AC_MSG_ERROR(Could not find $FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.[a|so]) - fi - - PHP_ADD_INCLUDE($FREETDS_INCLUDE_DIR) - PHP_ADD_LIBRARY_WITH_PATH(sybdb, $FREETDS_INSTALLATION_DIR/$PHP_LIBDIR, MSSQL_SHARED_LIBADD) - - PHP_NEW_EXTENSION(mssql, php_mssql.c, $ext_shared) - AC_CHECK_LIB(dnet_stub, dnet_addr, - [ PHP_ADD_LIBRARY_WITH_PATH(dnet_stub,,MSSQL_SHARED_LIBADD) - AC_DEFINE(HAVE_LIBDNET_STUB,1,[ ]) - ]) - AC_DEFINE(HAVE_MSSQL,1,[ ]) - AC_DEFINE(HAVE_FREETDS,1,[ ]) - PHP_SUBST(MSSQL_SHARED_LIBADD) -fi diff --git a/ext/mssql/config.w32 b/ext/mssql/config.w32 deleted file mode 100644 index bd1f68669b..0000000000 --- a/ext/mssql/config.w32 +++ /dev/null @@ -1,28 +0,0 @@ -// $Id$ -// vim:ft=javascript - -ARG_WITH("mssql", "mssql support", "no"); - -if (PHP_MSSQL != "no") { - if (CHECK_LIB("ntwdblib.lib", "mssql", "\\MSSQL7\\DevTools\\Lib;\\MSSQL7\\DevTools\\Lib;" + PHP_MSSQL) && - CHECK_HEADER_ADD_INCLUDE("sqlfront.h", "CFLAGS_MSSQL", "\\MSSQL7\\DevTools\\Include;\\MSSQL7\\DevTools\\Include" + PHP_MSSQL)) { - EXTENSION("mssql", "php_mssql.c"); - AC_DEFINE('HAVE_MSSQL', 1, 'Have MSSQL support'); - ADD_FLAG("CFLAGS_MSSQL", "/D DBNTWIN32=1 /D MSSQL70=1"); - } else { - WARNING("mssql not enabled; libraries and headers not found"); - } -} - -ARG_WITH("dblib", "mssql support with freetds", "no"); - -if (PHP_DBLIB != "no") { - if (CHECK_LIB("dblib.lib", "dblib", PHP_PHP_BUILD + "\\freetds") && - CHECK_HEADER_ADD_INCLUDE("sybfront.h", "CFLAGS_DBLIB", PHP_PHP_BUILD + "\\freetds;" + PHP_DBLIB)) { - EXTENSION("dblib", "php_mssql.c", null, null, null, "ext\\dblib"); - AC_DEFINE('HAVE_MSSQL', 1, 'Have MSSQL support'); - ADD_FLAG("CFLAGS_DBLIB", "/D HAVE_FREETDS=1 /D DBNTWIN32=1 /D MSSQL70=1 /D MSSQL_EXPORTS /D COMPILE_DL_MSSQL"); - } else { - WARNING("dblib not enabled; libraries and headers not found"); - } -} diff --git a/ext/mssql/mssql_win32_howto.txt b/ext/mssql/mssql_win32_howto.txt deleted file mode 100644 index 735226f88a..0000000000 --- a/ext/mssql/mssql_win32_howto.txt +++ /dev/null @@ -1,35 +0,0 @@ -Rules for building MSSQL ------------------------- - -The MSSQL project contains 2 configurations. - -The files needed for each configurations are: - -Win32 Release_TS -Win32 Debug_TS - - php_build\mssql-70\include\sqldb.h - php_build\mssql-70\include\sqlfront.h - php_build\mssql-70\lib\ntwdblib.lib - -php_build is a directory at the same level as php7. - -Start Visual Studio, load php_modules.dsw, select the MSSQL projects, -configuration and build it. - -This module requires ntwdblib.dll and one or more of the following dll's - -dbmsadsn.dll -dbmsrpcn.dll -dbmsshrn.dll -dbmssocn.dll for tcp/ip connections -dbmsspxn.dll for ipx/spx connections -dbmsvinn.dll -dbnmpntw.dll for netbios connections - -All these files are installed while installing MS SQL Server. If the SQL Server -is installed on another maschine you need to install the client tools on -the web server as well. - - -
\ No newline at end of file diff --git a/ext/mssql/php_mssql.c b/ext/mssql/php_mssql.c deleted file mode 100644 index 08e118d281..0000000000 --- a/ext/mssql/php_mssql.c +++ /dev/null @@ -1,2283 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2015 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: | - | http://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. | - +----------------------------------------------------------------------+ - | Author: Frank M. Kromann <frank@kromann.info> | - +----------------------------------------------------------------------+ - */ - -/* $Id$ */ - -#ifdef COMPILE_DL_MSSQL -#define HAVE_MSSQL 1 -#endif - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" -#include "php_globals.h" -#include "ext/standard/php_standard.h" -#include "ext/standard/info.h" -#include "php_mssql.h" -#include "php_ini.h" - -#if HAVE_MSSQL -#define SAFE_STRING(s) ((s)?(s):"") - -#define MSSQL_ASSOC 1<<0 -#define MSSQL_NUM 1<<1 -#define MSSQL_BOTH (MSSQL_ASSOC|MSSQL_NUM) - -static int le_result, le_link, le_plink, le_statement; - -static void php_mssql_get_column_content_with_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type); -static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type); - -static void _mssql_bind_hash_dtor(void *data); - -/* {{{ arginfo */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_connect, 0, 0, 0) - ZEND_ARG_INFO(0, servername) - ZEND_ARG_INFO(0, username) - ZEND_ARG_INFO(0, password) - ZEND_ARG_INFO(0, newlink) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_close, 0, 0, 0) - ZEND_ARG_INFO(0, link_identifier) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_select_db, 0, 0, 1) - ZEND_ARG_INFO(0, database_name) - ZEND_ARG_INFO(0, link_identifier) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_query, 0, 0, 1) - ZEND_ARG_INFO(0, query) - ZEND_ARG_INFO(0, link_identifier) - ZEND_ARG_INFO(0, batch_size) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_fetch_batch, 0, 0, 1) - ZEND_ARG_INFO(0, result) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_rows_affected, 0, 0, 1) - ZEND_ARG_INFO(0, link_identifier) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_mssql_get_last_message, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_fetch_field, 0, 0, 1) - ZEND_ARG_INFO(0, result) - ZEND_ARG_INFO(0, field_offset) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_fetch_array, 0, 0, 1) - ZEND_ARG_INFO(0, result) - ZEND_ARG_INFO(0, result_type) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_fetch_assoc, 0, 0, 1) - ZEND_ARG_INFO(0, result_id) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_field_length, 0, 0, 1) - ZEND_ARG_INFO(0, result) - ZEND_ARG_INFO(0, offset) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_data_seek, 0, 0, 2) - ZEND_ARG_INFO(0, result_identifier) - ZEND_ARG_INFO(0, row_number) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_result, 0, 0, 3) - ZEND_ARG_INFO(0, result) - ZEND_ARG_INFO(0, row) - ZEND_ARG_INFO(0, field) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_min_error_severity, 0, 0, 1) - ZEND_ARG_INFO(0, severity) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_init, 0, 0, 1) - ZEND_ARG_INFO(0, sp_name) - ZEND_ARG_INFO(0, link_identifier) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_bind, 0, 0, 4) - ZEND_ARG_INFO(0, stmt) - ZEND_ARG_INFO(0, param_name) - ZEND_ARG_INFO(1, var) - ZEND_ARG_INFO(0, type) - ZEND_ARG_INFO(0, is_output) - ZEND_ARG_INFO(0, is_null) - ZEND_ARG_INFO(0, maxlen) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_execute, 0, 0, 1) - ZEND_ARG_INFO(0, stmt) - ZEND_ARG_INFO(0, skip_results) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_free_statement, 0, 0, 1) - ZEND_ARG_INFO(0, stmt) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_mssql_guid_string, 0, 0, 1) - ZEND_ARG_INFO(0, binary) - ZEND_ARG_INFO(0, short_format) -ZEND_END_ARG_INFO() -/* }}} */ - -/* {{{ mssql_functions -*/ -const zend_function_entry mssql_functions[] = { - PHP_FE(mssql_connect, arginfo_mssql_connect) - PHP_FE(mssql_pconnect, arginfo_mssql_connect) - PHP_FE(mssql_close, arginfo_mssql_close) - PHP_FE(mssql_select_db, arginfo_mssql_select_db) - PHP_FE(mssql_query, arginfo_mssql_query) - PHP_FE(mssql_fetch_batch, arginfo_mssql_fetch_batch) - PHP_FE(mssql_rows_affected, arginfo_mssql_rows_affected) - PHP_FE(mssql_free_result, arginfo_mssql_fetch_batch) - PHP_FE(mssql_get_last_message, arginfo_mssql_get_last_message) - PHP_FE(mssql_num_rows, arginfo_mssql_fetch_batch) - PHP_FE(mssql_num_fields, arginfo_mssql_fetch_batch) - PHP_FE(mssql_fetch_field, arginfo_mssql_fetch_field) - PHP_FE(mssql_fetch_row, arginfo_mssql_fetch_batch) - PHP_FE(mssql_fetch_array, arginfo_mssql_fetch_array) - PHP_FE(mssql_fetch_assoc, arginfo_mssql_fetch_assoc) - PHP_FE(mssql_fetch_object, arginfo_mssql_fetch_batch) - PHP_FE(mssql_field_length, arginfo_mssql_field_length) - PHP_FE(mssql_field_name, arginfo_mssql_field_length) - PHP_FE(mssql_field_type, arginfo_mssql_field_length) - PHP_FE(mssql_data_seek, arginfo_mssql_data_seek) - PHP_FE(mssql_field_seek, arginfo_mssql_fetch_field) - PHP_FE(mssql_result, arginfo_mssql_result) - PHP_FE(mssql_next_result, arginfo_mssql_fetch_assoc) - PHP_FE(mssql_min_error_severity, arginfo_mssql_min_error_severity) - PHP_FE(mssql_min_message_severity, arginfo_mssql_min_error_severity) - PHP_FE(mssql_init, arginfo_mssql_init) - PHP_FE(mssql_bind, arginfo_mssql_bind) - PHP_FE(mssql_execute, arginfo_mssql_execute) - PHP_FE(mssql_free_statement, arginfo_mssql_free_statement) - PHP_FE(mssql_guid_string, arginfo_mssql_guid_string) - PHP_FE_END -}; -/* }}} */ - -ZEND_DECLARE_MODULE_GLOBALS(mssql) -static PHP_GINIT_FUNCTION(mssql); - -/* {{{ mssql_module_entry -*/ -zend_module_entry mssql_module_entry = -{ - STANDARD_MODULE_HEADER, - "mssql", - mssql_functions, - PHP_MINIT(mssql), - PHP_MSHUTDOWN(mssql), - PHP_RINIT(mssql), - PHP_RSHUTDOWN(mssql), - PHP_MINFO(mssql), - NO_VERSION_YET, - PHP_MODULE_GLOBALS(mssql), - PHP_GINIT(mssql), - NULL, - NULL, - STANDARD_MODULE_PROPERTIES_EX -}; -/* }}} */ - -#ifdef COMPILE_DL_MSSQL -ZEND_GET_MODULE(mssql) -#endif - -#define CHECK_LINK(link) { if (link==-1) { php_error_docref(NULL, E_WARNING, "A link to the server could not be established"); RETURN_FALSE; } } - -/* {{{ PHP_INI_DISP -*/ -static PHP_INI_DISP(display_text_size) -{ - char *value; - - if (type == PHP_INI_DISPLAY_ORIG && ini_entry->modified) { - value = ini_entry->orig_value; - } else if (ini_entry->value) { - value = ini_entry->value; - } else { - value = NULL; - } - - if (atoi(value) == -1) { - PUTS("Server default"); - } else { - php_printf("%s", value); - } -} -/* }}} */ - -/* {{{ PHP_INI -*/ -PHP_INI_BEGIN() - STD_PHP_INI_BOOLEAN("mssql.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateBool, allow_persistent, zend_mssql_globals, mssql_globals) - STD_PHP_INI_ENTRY_EX("mssql.max_persistent", "-1", PHP_INI_SYSTEM, OnUpdateLong, max_persistent, zend_mssql_globals, mssql_globals, display_link_numbers) - STD_PHP_INI_ENTRY_EX("mssql.max_links", "-1", PHP_INI_SYSTEM, OnUpdateLong, max_links, zend_mssql_globals, mssql_globals, display_link_numbers) - STD_PHP_INI_ENTRY_EX("mssql.min_error_severity", "10", PHP_INI_ALL, OnUpdateLong, cfg_min_error_severity, zend_mssql_globals, mssql_globals, display_link_numbers) - STD_PHP_INI_ENTRY_EX("mssql.min_message_severity", "10", PHP_INI_ALL, OnUpdateLong, cfg_min_message_severity, zend_mssql_globals, mssql_globals, display_link_numbers) - /* - mssql.compatAbility_mode (with typo) was used for relatively long time. - Unless it is fixed the old version is also kept for compatibility reasons. - */ - STD_PHP_INI_BOOLEAN("mssql.compatability_mode", "0", PHP_INI_ALL, OnUpdateBool, compatibility_mode, zend_mssql_globals, mssql_globals) - STD_PHP_INI_BOOLEAN("mssql.compatibility_mode", "0", PHP_INI_ALL, OnUpdateBool, compatibility_mode, zend_mssql_globals, mssql_globals) - STD_PHP_INI_ENTRY_EX("mssql.connect_timeout", "5", PHP_INI_ALL, OnUpdateLong, connect_timeout, zend_mssql_globals, mssql_globals, display_link_numbers) - STD_PHP_INI_ENTRY_EX("mssql.timeout", "60", PHP_INI_ALL, OnUpdateLong, timeout, zend_mssql_globals, mssql_globals, display_link_numbers) - STD_PHP_INI_ENTRY_EX("mssql.textsize", "-1", PHP_INI_ALL, OnUpdateLong, textsize, zend_mssql_globals, mssql_globals, display_text_size) - STD_PHP_INI_ENTRY_EX("mssql.textlimit", "-1", PHP_INI_ALL, OnUpdateLong, textlimit, zend_mssql_globals, mssql_globals, display_text_size) - STD_PHP_INI_ENTRY_EX("mssql.batchsize", "0", PHP_INI_ALL, OnUpdateLong, batchsize, zend_mssql_globals, mssql_globals, display_link_numbers) - STD_PHP_INI_BOOLEAN("mssql.datetimeconvert", "1", PHP_INI_ALL, OnUpdateBool, datetimeconvert, zend_mssql_globals, mssql_globals) - STD_PHP_INI_BOOLEAN("mssql.secure_connection", "0", PHP_INI_SYSTEM, OnUpdateBool, secure_connection, zend_mssql_globals, mssql_globals) - STD_PHP_INI_ENTRY_EX("mssql.max_procs", "-1", PHP_INI_ALL, OnUpdateLong, max_procs, zend_mssql_globals, mssql_globals, display_link_numbers) -#ifdef HAVE_FREETDS - STD_PHP_INI_ENTRY("mssql.charset", "", PHP_INI_ALL, OnUpdateString, charset, zend_mssql_globals, mssql_globals) -#endif -PHP_INI_END() -/* }}} */ - -/* error handler */ -static int php_mssql_error_handler(DBPROCESS *dbproc, int severity, int dberr, int oserr, char *dberrstr, char *oserrstr) -{ - - if (severity >= MS_SQL_G(min_error_severity)) { - php_error_docref(NULL, E_WARNING, "%s (severity %d)", dberrstr, severity); - } - return INT_CANCEL; -} - -/* {{{ php_mssql_message_handler -*/ -/* message handler */ -static int php_mssql_message_handler(DBPROCESS *dbproc, DBINT msgno,int msgstate, int severity,char *msgtext,char *srvname, char *procname,DBUSMALLINT line) -{ - - if (severity >= MS_SQL_G(min_message_severity)) { - php_error_docref(NULL, E_WARNING, "message: %s (severity %d)", msgtext, severity); - } - if (MS_SQL_G(server_message)) { - zend_string_free(MS_SQL_G(server_message)); - MS_SQL_G(server_message) = NULL; - } - MS_SQL_G(server_message) = estrdup(msgtext); - return 0; -} -/* }}} */ - -/* {{{ _clean_invalid_results -*/ -static int _clean_invalid_results(zend_rsrc_list_entry *le) -{ - if (Z_TYPE_P(le) == le_result) { - mssql_link *mssql_ptr = ((mssql_result *) le->ptr)->mssql_ptr; - - if (!mssql_ptr->valid) { - return 1; - } - } - return 0; -} -/* }}} */ - -/* {{{ _free_result -*/ -static void _free_result(mssql_result *result, int free_fields) -{ - int i,j; - - if (result->data) { - for (i=0; i<result->num_rows; i++) { - if (result->data[i]) { - for (j=0; j<result->num_fields; j++) { - zval_dtor(&result->data[i][j]); - } - efree(result->data[i]); - } - } - efree(result->data); - result->data = NULL; - result->blocks_initialized = 0; - } - - if (free_fields && result->fields) { - for (i=0; i<result->num_fields; i++) { - zend_string_free(result->fields[i].name); - zend_string_free(result->fields[i].column_source); - } - efree(result->fields); - } -} -/* }}} */ - -/* {{{ _free_mssql_statement -*/ -static void _free_mssql_statement(zend_rsrc_list_entry *rsrc) -{ - mssql_statement *statement = (mssql_statement *)rsrc->ptr; - - if (statement->binds) { - zend_hash_destroy(statement->binds); - efree(statement->binds); - } - - efree(statement); -} -/* }}} */ - -/* {{{ _free_mssql_result -*/ -static void _free_mssql_result(zend_rsrc_list_entry *rsrc) -{ - mssql_result *result = (mssql_result *)rsrc->ptr; - - _free_result(result, 1); - dbcancel(result->mssql_ptr->link); - efree(result); -} -/* }}} */ - -/* {{{ php_mssql_set_defaullt_link -*/ -static void php_mssql_set_default_link(int id) -{ - if (MS_SQL_G(default_link)!=-1) { - zend_list_delete(MS_SQL_G(default_link)); - } - MS_SQL_G(default_link) = id; - zend_list_addref(id); -} -/* }}} */ - -/* {{{ _close_mssql_link -*/ -static void _close_mssql_link(zend_rsrc_list_entry *rsrc) -{ - mssql_link *mssql_ptr = (mssql_link *)rsrc->ptr; - - mssql_ptr->valid = 0; - zend_hash_apply(&EG(regular_list),(apply_func_t) _clean_invalid_results); - dbclose(mssql_ptr->link); - dbfreelogin(mssql_ptr->login); - efree(mssql_ptr); - MS_SQL_G(num_links)--; -} -/* }}} */ - -/* {{{ _close_mssql_plink -*/ -static void _close_mssql_plink(zend_rsrc_list_entry *rsrc) -{ - mssql_link *mssql_ptr = (mssql_link *)rsrc->ptr; - - dbclose(mssql_ptr->link); - dbfreelogin(mssql_ptr->login); - free(mssql_ptr); - MS_SQL_G(num_persistent)--; - MS_SQL_G(num_links)--; -} -/* }}} */ - -/* {{{ _mssql_bind_hash_dtor -*/ -static void _mssql_bind_hash_dtor(void *data) -{ - mssql_bind *bind= (mssql_bind *) data; - - zval_ptr_dtor(&(bind->zval)); -} -/* }}} */ - -/* {{{ PHP_GINIT_FUNCTION -*/ -static PHP_GINIT_FUNCTION(mssql) -{ - long compatibility_mode; - - mssql_globals->num_persistent = 0; - mssql_globals->get_column_content = php_mssql_get_column_content_with_type; - if (cfg_get_long("mssql.compatibility_mode", &compatibility_mode) == SUCCESS) { - if (compatibility_mode) { - mssql_globals->get_column_content = php_mssql_get_column_content_without_type; - } - } -} -/* }}} */ - -/* {{{ PHP_MINIT_FUNCTION -*/ -PHP_MINIT_FUNCTION(mssql) -{ - REGISTER_INI_ENTRIES(); - - le_statement = zend_register_list_destructors_ex(_free_mssql_statement, NULL, "mssql statement", module_number); - le_result = zend_register_list_destructors_ex(_free_mssql_result, NULL, "mssql result", module_number); - le_link = zend_register_list_destructors_ex(_close_mssql_link, NULL, "mssql link", module_number); - le_plink = zend_register_list_destructors_ex(NULL, _close_mssql_plink, "mssql link persistent", module_number); - Z_TYPE(mssql_module_entry) = type; - - if (dbinit()==FAIL) { - return FAILURE; - } - - /* BEGIN MSSQL data types for mssql_bind */ - REGISTER_LONG_CONSTANT("MSSQL_ASSOC", MSSQL_ASSOC, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("MSSQL_NUM", MSSQL_NUM, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("MSSQL_BOTH", MSSQL_BOTH, CONST_CS | CONST_PERSISTENT); - - REGISTER_LONG_CONSTANT("SQLTEXT",SQLTEXT, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SQLVARCHAR",SQLVARCHAR, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SQLCHAR",SQLCHAR, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SQLINT1",SQLINT1, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SQLINT2",SQLINT2, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SQLINT4",SQLINT4, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SQLBIT",SQLBIT, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SQLFLT4",SQLFLT4, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SQLFLT8",SQLFLT8, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SQLFLTN",SQLFLTN, CONST_CS | CONST_PERSISTENT); - /* END MSSQL data types for mssql_bind */ - - return SUCCESS; -} -/* }}} */ - -/* {{{ PHP_MSHUTDOWN_FUNCTION -*/ -PHP_MSHUTDOWN_FUNCTION(mssql) -{ - UNREGISTER_INI_ENTRIES(); -#ifndef HAVE_FREETDS - dbwinexit(); -#else - dbexit(); -#endif - return SUCCESS; -} -/* }}} */ - -/* {{{ PHP_RINIT_FUNCTION -*/ -PHP_RINIT_FUNCTION(mssql) -{ - MS_SQL_G(default_link) = -1; - MS_SQL_G(num_links) = MS_SQL_G(num_persistent); - MS_SQL_G(appname) = estrndup("PHP 7", 5); - MS_SQL_G(server_message) = NULL; - MS_SQL_G(min_error_severity) = MS_SQL_G(cfg_min_error_severity); - MS_SQL_G(min_message_severity) = MS_SQL_G(cfg_min_message_severity); - if (MS_SQL_G(connect_timeout) < 1) MS_SQL_G(connect_timeout) = 1; - if (MS_SQL_G(timeout) < 0) MS_SQL_G(timeout) = 60; - if (MS_SQL_G(max_procs) != -1) { - dbsetmaxprocs((TDS_SHORT)MS_SQL_G(max_procs)); - } - - return SUCCESS; -} -/* }}} */ - -/* {{{ PHP_RSHUTDOWN_FUNCTION -*/ -PHP_RSHUTDOWN_FUNCTION(mssql) -{ - zend_string_free(MS_SQL_G(appname)); - MS_SQL_G(appname) = NULL; - if (MS_SQL_G(server_message)) { - zend_string_free(MS_SQL_G(server_message)); - MS_SQL_G(server_message) = NULL; - } - return SUCCESS; -} -/* }}} */ - -/* {{{ PHP_MINFO_FUNCTION -*/ -PHP_MINFO_FUNCTION(mssql) -{ - char buf[32]; - - php_info_print_table_start(); - php_info_print_table_header(2, "MSSQL Support", "enabled"); - - snprintf(buf, sizeof(buf), "%ld", MS_SQL_G(num_persistent)); - php_info_print_table_row(2, "Active Persistent Links", buf); - snprintf(buf, sizeof(buf), "%ld", MS_SQL_G(num_links)); - php_info_print_table_row(2, "Active Links", buf); - - php_info_print_table_row(2, "Library version", MSSQL_VERSION); - php_info_print_table_end(); - - DISPLAY_INI_ENTRIES(); - -} -/* }}} */ - -/* {{{ php_mssql_do_connect -*/ -static void php_mssql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) -{ - char *host = NULL, *user = NULL, *passwd = NULL; - size_t host_len = 0, user_len = 0, passwd_len = 0; - zend_bool new_link = 0; - char *hashed_details; - int hashed_details_length; - mssql_link mssql, *mssql_ptr; - char buffer[40]; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sssb", &host, &host_len, &user, &user_len, &passwd, &passwd_len, &new_link) == FAILURE) { - return; - } - - /* Limit strings to 255 chars to prevent overflow issues in underlying libraries */ - if(host_len>255) { - host[255] = '\0'; - } - if(user_len>255) { - user[255] = '\0'; - } - if(passwd_len>255) { - passwd[255] = '\0'; - } - - switch(ZEND_NUM_ARGS()) - { - case 0: - /* defaults */ - hashed_details_length=5+3; - hashed_details = (char *) emalloc(hashed_details_length+1); - strcpy(hashed_details, "mssql___"); - break; - case 1: - hashed_details_length = spprintf(&hashed_details, 0, "mssql_%s__", host); - break; - case 2: - hashed_details_length = spprintf(&hashed_details, 0, "mssql_%s_%s_", host, user); - break; - case 3: - case 4: - hashed_details_length = spprintf(&hashed_details, 0, "mssql_%s_%s_%s", host, user, passwd); - break; - } - - if (hashed_details == NULL) { - php_error_docref(NULL, E_WARNING, "Out of memory"); - RETURN_FALSE; - } - - dbsetlogintime(MS_SQL_G(connect_timeout)); - dbsettime(MS_SQL_G(timeout)); - - /* set a DBLOGIN record */ - if ((mssql.login = dblogin()) == NULL) { - php_error_docref(NULL, E_WARNING, "Unable to allocate login record"); - RETURN_FALSE; - } - - DBERRHANDLE(mssql.login, (EHANDLEFUNC) php_mssql_error_handler); - DBMSGHANDLE(mssql.login, (MHANDLEFUNC) php_mssql_message_handler); - -#ifndef HAVE_FREETDS - if (MS_SQL_G(secure_connection)){ - DBSETLSECURE(mssql.login); - } - else { -#endif - if (user) { - DBSETLUSER(mssql.login,user); - } - if (passwd) { - DBSETLPWD(mssql.login,passwd); - } -#ifndef HAVE_FREETDS - } -#endif - -#ifdef HAVE_FREETDS - if (MS_SQL_G(charset) && strlen(MS_SQL_G(charset))) { - DBSETLCHARSET(mssql.login, MS_SQL_G(charset)); - } -#endif - - DBSETLAPP(mssql.login,MS_SQL_G(appname)); - mssql.valid = 1; - -#ifndef HAVE_FREETDS - DBSETLVERSION(mssql.login, DBVER60); -#endif -/* DBSETLTIME(mssql.login, TIMEOUT_INFINITE); */ - - if (!MS_SQL_G(allow_persistent)) { - persistent=0; - } - if (persistent) { - zend_rsrc_list_entry *le; - - /* try to find if we already have this link in our persistent list */ - if (new_link || zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_length + 1, (void **) &le)==FAILURE) { /* we don't */ - zend_rsrc_list_entry new_le; - - if (MS_SQL_G(max_links) != -1 && MS_SQL_G(num_links) >= MS_SQL_G(max_links)) { - php_error_docref(NULL, E_WARNING, "Too many open links (%ld)", MS_SQL_G(num_links)); - efree(hashed_details); - dbfreelogin(mssql.login); - RETURN_FALSE; - } - if (MS_SQL_G(max_persistent) != -1 && MS_SQL_G(num_persistent) >= MS_SQL_G(max_persistent)) { - php_error_docref(NULL, E_WARNING, "Too many open persistent links (%ld)", MS_SQL_G(num_persistent)); - efree(hashed_details); - dbfreelogin(mssql.login); - RETURN_FALSE; - } - /* create the link */ - if ((mssql.link = dbopen(mssql.login, host)) == FAIL) { - php_error_docref(NULL, E_WARNING, "Unable to connect to server: %s", (host == NULL ? "" : host)); - efree(hashed_details); - dbfreelogin(mssql.login); - RETURN_FALSE; - } - - if (DBSETOPT(mssql.link, DBBUFFER, "2")==FAIL) { - efree(hashed_details); - dbfreelogin(mssql.login); - dbclose(mssql.link); - RETURN_FALSE; - } - -#ifndef HAVE_FREETDS - if (MS_SQL_G(textlimit) != -1) { - snprintf(buffer, sizeof(buffer), "%li", MS_SQL_G(textlimit)); - if (DBSETOPT(mssql.link, DBTEXTLIMIT, buffer)==FAIL) { - efree(hashed_details); - dbfreelogin(mssql.login); - dbclose(mssql.link); - RETURN_FALSE; - } - } -#endif - if (MS_SQL_G(textsize) != -1) { - snprintf(buffer, sizeof(buffer), "SET TEXTSIZE %li", MS_SQL_G(textsize)); - dbcmd(mssql.link, buffer); - dbsqlexec(mssql.link); - dbresults(mssql.link); - } - - /* hash it up */ - mssql_ptr = (mssql_link *) malloc(sizeof(mssql_link)); - if (!mssql_ptr) { - efree(hashed_details); - dbfreelogin(mssql.login); - dbclose(mssql.link); - RETURN_FALSE; - } - - memcpy(mssql_ptr, &mssql, sizeof(mssql_link)); - Z_TYPE(new_le) = le_plink; - new_le.ptr = mssql_ptr; - if (zend_hash_update(&EG(persistent_list), hashed_details, hashed_details_length + 1, &new_le, sizeof(zend_rsrc_list_entry), NULL)==FAILURE) { - free(mssql_ptr); - efree(hashed_details); - dbfreelogin(mssql.login); - dbclose(mssql.link); - RETURN_FALSE; - } - MS_SQL_G(num_persistent)++; - MS_SQL_G(num_links)++; - } else { /* we do */ - if (Z_TYPE_P(le) != le_plink) { -#if BROKEN_MSSQL_PCONNECTS - log_error("PHP/MS SQL: Hashed persistent link is not a MS SQL link!",php_rqst->server); -#endif - php_error_docref(NULL, E_WARNING, "Hashed persistent link is not a MS SQL link!"); - efree(hashed_details); - RETURN_FALSE; - } - - mssql_ptr = (mssql_link *) le->ptr; - /* test that the link hasn't died */ - if (DBDEAD(mssql_ptr->link) == TRUE) { - dbclose(mssql_ptr->link); -#if BROKEN_MSSQL_PCONNECTS - log_error("PHP/MS SQL: Persistent link died, trying to reconnect...",php_rqst->server); -#endif - if ((mssql_ptr->link=dbopen(mssql_ptr->login,host))==NULL) { -#if BROKEN_MSSQL_PCONNECTS - log_error("PHP/MS SQL: Unable to reconnect!",php_rqst->server); -#endif - php_error_docref(NULL, E_WARNING, "Link to server lost, unable to reconnect"); - zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_length+1); - efree(hashed_details); - dbfreelogin(mssql_ptr->login); - RETURN_FALSE; - } -#if BROKEN_MSSQL_PCONNECTS - log_error("PHP/MS SQL: Reconnect successful!",php_rqst->server); -#endif - if (DBSETOPT(mssql_ptr->link, DBBUFFER, "2")==FAIL) { -#if BROKEN_MSSQL_PCONNECTS - log_error("PHP/MS SQL: Unable to set required options",php_rqst->server); -#endif - zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_length + 1); - efree(hashed_details); - dbfreelogin(mssql_ptr->login); - dbclose(mssql_ptr->link); - RETURN_FALSE; - } - } - } - ZEND_REGISTER_RESOURCE(return_value, mssql_ptr, le_plink); - } else { /* non persistent */ - zend_rsrc_list_entry *index_ptr, new_index_ptr; - - /* first we check the hash for the hashed_details key. if it exists, - * it should point us to the right offset where the actual mssql link sits. - * if it doesn't, open a new mssql link, add it to the resource list, - * and add a pointer to it with hashed_details as the key. - */ - if (!new_link && zend_hash_find(&EG(regular_list), hashed_details, hashed_details_length + 1,(void **) &index_ptr)==SUCCESS) { - int type,link; - void *ptr; - - if (Z_TYPE_P(index_ptr) != le_index_ptr) { - efree(hashed_details); - dbfreelogin(mssql.login); - RETURN_FALSE; - } - link = (int) index_ptr->ptr; - ptr = zend_list_find(link,&type); /* check if the link is still there */ - if (ptr && (type==le_link || type==le_plink)) { - zend_list_addref(link); - Z_LVAL_P(return_value) = link; - php_mssql_set_default_link(link); - Z_TYPE_P(return_value) = IS_RESOURCE; - dbfreelogin(mssql.login); - efree(hashed_details); - return; - } else { - zend_hash_del(&EG(regular_list), hashed_details, hashed_details_length + 1); - } - } - if (MS_SQL_G(max_links) != -1 && MS_SQL_G(num_links) >= MS_SQL_G(max_links)) { - php_error_docref(NULL, E_WARNING, "Too many open links (%ld)", MS_SQL_G(num_links)); - efree(hashed_details); - dbfreelogin(mssql.login); - RETURN_FALSE; - } - - if ((mssql.link=dbopen(mssql.login, host))==NULL) { - php_error_docref(NULL, E_WARNING, "Unable to connect to server: %s", (host == NULL ? "" : host)); - efree(hashed_details); - dbfreelogin(mssql.login); - RETURN_FALSE; - } - - if (DBSETOPT(mssql.link, DBBUFFER,"2")==FAIL) { - efree(hashed_details); - dbfreelogin(mssql.login); - dbclose(mssql.link); - RETURN_FALSE; - } - -#ifndef HAVE_FREETDS - if (MS_SQL_G(textlimit) != -1) { - snprintf(buffer, sizeof(buffer), "%li", MS_SQL_G(textlimit)); - if (DBSETOPT(mssql.link, DBTEXTLIMIT, buffer)==FAIL) { - efree(hashed_details); - dbfreelogin(mssql.login); - dbclose(mssql.link); - RETURN_FALSE; - } - } -#endif - if (MS_SQL_G(textsize) != -1) { - snprintf(buffer, sizeof(buffer), "SET TEXTSIZE %li", MS_SQL_G(textsize)); - dbcmd(mssql.link, buffer); - dbsqlexec(mssql.link); - dbresults(mssql.link); - } - - /* add it to the list */ - mssql_ptr = (mssql_link *) emalloc(sizeof(mssql_link)); - memcpy(mssql_ptr, &mssql, sizeof(mssql_link)); - ZEND_REGISTER_RESOURCE(return_value, mssql_ptr, le_link); - - /* add it to the hash */ - new_index_ptr.ptr = (void *) Z_LVAL_P(return_value); - Z_TYPE(new_index_ptr) = le_index_ptr; - if (zend_hash_update(&EG(regular_list), hashed_details, hashed_details_length + 1,(void *) &new_index_ptr, sizeof(zend_rsrc_list_entry),NULL)==FAILURE) { - efree(hashed_details); - RETURN_FALSE; - } - MS_SQL_G(num_links)++; - } - efree(hashed_details); - php_mssql_set_default_link(Z_LVAL_P(return_value)); -} -/* }}} */ - -/* {{{ php_mssql_get_default_link -*/ -static int php_mssql_get_default_link(INTERNAL_FUNCTION_PARAMETERS) -{ - if (MS_SQL_G(default_link)==-1) { /* no link opened yet, implicitly open one */ - ht = 0; - php_mssql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,0); - } - return MS_SQL_G(default_link); -} -/* }}} */ - -/* {{{ proto int mssql_connect([string servername [, string username [, string password [, bool new_link]]]]) - Establishes a connection to a MS-SQL server */ -PHP_FUNCTION(mssql_connect) -{ - php_mssql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,0); -} -/* }}} */ - -/* {{{ proto int mssql_pconnect([string servername [, string username [, string password [, bool new_link]]]]) - Establishes a persistent connection to a MS-SQL server */ -PHP_FUNCTION(mssql_pconnect) -{ - php_mssql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,1); -} -/* }}} */ - -/* {{{ proto bool mssql_close([resource conn_id]) - Closes a connection to a MS-SQL server */ -PHP_FUNCTION(mssql_close) -{ - zval *mssql_link_index = NULL; - int id = -1; - mssql_link *mssql_ptr; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|r", &mssql_link_index) == FAILURE) { - return; - } - - if (mssql_link_index == NULL) { - id = php_mssql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); - } - - ZEND_FETCH_RESOURCE2(mssql_ptr, mssql_link *, &mssql_link_index, id, "MS SQL-Link", le_link, le_plink); - - if (mssql_link_index) { - zend_list_delete(Z_RESVAL_P(mssql_link_index)); - } else { - zend_list_delete(id); - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool mssql_select_db(string database_name [, resource conn_id]) - Select a MS-SQL database */ -PHP_FUNCTION(mssql_select_db) -{ - char *db; - zval *mssql_link_index = NULL; - size_t db_len; - int id = -1; - mssql_link *mssql_ptr; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|r", &db, &db_len, &mssql_link_index) == FAILURE) { - return; - } - - if (mssql_link_index == NULL) { - id = php_mssql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); - } - - ZEND_FETCH_RESOURCE2(mssql_ptr, mssql_link *, &mssql_link_index, id, "MS SQL-Link", le_link, le_plink); - - if (dbuse(mssql_ptr->link, db)==FAIL) { - php_error_docref(NULL, E_WARNING, "Unable to select database: %s", db); - RETURN_FALSE; - } else { - RETURN_TRUE; - } -} -/* }}} */ - -/* {{{ php_mssql_get_column_content_with_type -*/ -static void php_mssql_get_column_content_with_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type ) -{ - if (dbdata(mssql_ptr->link,offset) == NULL && dbdatlen(mssql_ptr->link,offset) == 0) { - ZVAL_NULL(result); - return; - } - - switch (column_type) - { - case SQLBIT: - case SQLINT1: - case SQLINT2: - case SQLINT4: - case SQLINTN: { - ZVAL_LONG(result, (long) anyintcol(offset)); - break; - } - case SQLCHAR: - case SQLVARCHAR: - case SQLTEXT: { - int length; - char *data = charcol(offset); - - length=dbdatlen(mssql_ptr->link,offset); -#if ilia_0 - while (length>0 && data[length-1] == ' ') { /* nuke trailing whitespace */ - length--; - } -#endif - ZVAL_STRINGL(result, data, length, 1); - break; - } - case SQLFLT4: - ZVAL_DOUBLE(result, (double) floatcol4(offset)); - break; - case SQLMONEY: - case SQLMONEY4: - case SQLMONEYN: { - DBFLT8 res_buf; - dbconvert(NULL, column_type, dbdata(mssql_ptr->link,offset), 8, SQLFLT8, (LPBYTE)&res_buf, -1); - ZVAL_DOUBLE(result, res_buf); - } - break; - case SQLFLT8: - ZVAL_DOUBLE(result, (double) floatcol8(offset)); - break; -#ifdef SQLUNIQUE - case SQLUNIQUE: { -#else - case 36: { /* FreeTDS hack */ -#endif - char *data = charcol(offset); - - /* uniqueidentifier is a 16-byte binary number */ - ZVAL_STRINGL(result, data, 16, 1); - } - break; - case SQLVARBINARY: - case SQLBINARY: - case SQLIMAGE: { - int res_length = dbdatlen(mssql_ptr->link, offset); - - if (!res_length) { - ZVAL_NULL(result); - } else { - ZVAL_STRINGL(result, (char *)dbdata(mssql_ptr->link, offset), res_length, 1); - } - } - break; - case SQLNUMERIC: - default: { - if (dbwillconvert(column_type,SQLCHAR)) { - char *res_buf; - DBDATEREC dateinfo; - int res_length = dbdatlen(mssql_ptr->link,offset); - - if (res_length == -1) { - res_length = 255; - } - - if ((column_type != SQLDATETIME && column_type != SQLDATETIM4) || MS_SQL_G(datetimeconvert)) { - - switch (column_type) { - case SQLDATETIME : - case SQLDATETIM4 : - res_length += 20; - break; - case SQLMONEY : - case SQLMONEY4 : - case SQLMONEYN : - case SQLDECIMAL : - case SQLNUMERIC : - res_length += 5; - case 127 : - res_length += 20; - break; - } - - res_buf = (unsigned char *) emalloc(res_length+1); - res_length = dbconvert(NULL,coltype(offset),dbdata(mssql_ptr->link,offset), res_length, SQLCHAR,res_buf,-1); - res_buf[res_length] = '\0'; - } else { - if (column_type == SQLDATETIM4) { - DBDATETIME temp; - - dbconvert(NULL, SQLDATETIM4, dbdata(mssql_ptr->link,offset), -1, SQLDATETIME, (LPBYTE) &temp, -1); - dbdatecrack(mssql_ptr->link, &dateinfo, &temp); - } else { - dbdatecrack(mssql_ptr->link, &dateinfo, (DBDATETIME *) dbdata(mssql_ptr->link,offset)); - } - - res_length = 19; - spprintf(&res_buf, 0, "%d-%02d-%02d %02d:%02d:%02d" , dateinfo.year, dateinfo.month, dateinfo.day, dateinfo.hour, dateinfo.minute, dateinfo.second); - } - - ZVAL_STRINGL(result, res_buf, res_length, 0); - } else { - php_error_docref(NULL, E_WARNING, "column %d has unknown data type (%d)", offset, coltype(offset)); - ZVAL_FALSE(result); - } - } - } -} -/* }}} */ - -/* {{{ php_mssql_get_column_content_without_type -*/ -static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type) -{ - if (dbdatlen(mssql_ptr->link,offset) == 0) { - ZVAL_NULL(result); - return; - } - - if (column_type == SQLVARBINARY || - column_type == SQLBINARY || - column_type == SQLIMAGE) { - DBBINARY *bin; - unsigned char *res_buf; - int res_length = dbdatlen(mssql_ptr->link, offset); - - if (res_length == 0) { - ZVAL_NULL(result); - return; - } else if (res_length < 0) { - ZVAL_FALSE(result); - return; - } - - res_buf = (unsigned char *) emalloc(res_length+1); - bin = ((DBBINARY *)dbdata(mssql_ptr->link, offset)); - res_buf[res_length] = '\0'; - memcpy(res_buf, bin, res_length); - ZVAL_STRINGL(result, res_buf, res_length, 0); - } - else if (dbwillconvert(coltype(offset),SQLCHAR)) { - unsigned char *res_buf; - DBDATEREC dateinfo; - int res_length = dbdatlen(mssql_ptr->link,offset); - - if ((column_type != SQLDATETIME && column_type != SQLDATETIM4) || MS_SQL_G(datetimeconvert)) { - - switch (column_type) { - case SQLDATETIME : - case SQLDATETIM4 : - res_length += 20; - break; - case SQLMONEY : - case SQLMONEY4 : - case SQLMONEYN : - case SQLDECIMAL : - case SQLNUMERIC : - res_length += 5; - case 127 : - res_length += 20; - break; - } - - res_buf = (unsigned char *) emalloc(res_length+1); - res_length = dbconvert(NULL,coltype(offset),dbdata(mssql_ptr->link,offset), res_length, SQLCHAR, res_buf, -1); - res_buf[res_length] = '\0'; - } else { - if (column_type == SQLDATETIM4) { - DBDATETIME temp; - - dbconvert(NULL, SQLDATETIM4, dbdata(mssql_ptr->link,offset), -1, SQLDATETIME, (LPBYTE) &temp, -1); - dbdatecrack(mssql_ptr->link, &dateinfo, &temp); - } else { - dbdatecrack(mssql_ptr->link, &dateinfo, (DBDATETIME *) dbdata(mssql_ptr->link,offset)); - } - - res_length = 19; - spprintf(&res_buf, 0, "%d-%02d-%02d %02d:%02d:%02d" , dateinfo.year, dateinfo.month, dateinfo.day, dateinfo.hour, dateinfo.minute, dateinfo.second); - } - - ZVAL_STRINGL(result, res_buf, res_length, 0); - } else { - php_error_docref(NULL, E_WARNING, "column %d has unknown data type (%d)", offset, coltype(offset)); - ZVAL_FALSE(result); - } -} -/* }}} */ - -/* {{{ _mssql_get_sp_result -*/ -static void _mssql_get_sp_result(mssql_link *mssql_ptr, mssql_statement *statement) -{ - int i, num_rets, type; - char *parameter; - mssql_bind *bind; - - /* Now to fetch RETVAL and OUTPUT values*/ - num_rets = dbnumrets(mssql_ptr->link); - - if (num_rets!=0) { - for (i = 1; i <= num_rets; i++) { - parameter = (char*)dbretname(mssql_ptr->link, i); - type = dbrettype(mssql_ptr->link, i); - - if (statement->binds != NULL) { /* Maybe a non-parameter sp */ - if (zend_hash_find(statement->binds, parameter, strlen(parameter), (void**)&bind)==SUCCESS) { - if (!dbretlen(mssql_ptr->link,i)) { - ZVAL_NULL(bind->zval); - } - else { - switch (type) { - case SQLBIT: - case SQLINT1: - case SQLINT2: - case SQLINT4: - convert_to_long_ex(&bind->zval); - /* FIXME this works only on little endian machine !!! */ - Z_LVAL_P(bind->zval) = *((int *)(dbretdata(mssql_ptr->link,i))); - break; - - case SQLFLT4: - case SQLFLT8: - case SQLFLTN: - case SQLMONEY4: - case SQLMONEY: - case SQLMONEYN: - convert_to_double_ex(&bind->zval); - Z_DVAL_P(bind->zval) = *((double *)(dbretdata(mssql_ptr->link,i))); - break; - - case SQLCHAR: - case SQLVARCHAR: - case SQLTEXT: - convert_to_string_ex(&bind->zval); - Z_STRLEN_P(bind->zval) = dbretlen(mssql_ptr->link,i); - Z_STRVAL_P(bind->zval) = estrndup(dbretdata(mssql_ptr->link,i),Z_STRLEN_P(bind->zval)); - break; - /* TODO binary */ - } - } - } - else { - php_error_docref(NULL, E_WARNING, "An output parameter variable was not provided"); - } - } - } - } - if (statement->binds != NULL) { /* Maybe a non-parameter sp */ - if (zend_hash_find(statement->binds, "RETVAL", 6, (void**)&bind)==SUCCESS) { - if (dbhasretstat(mssql_ptr->link)) { - convert_to_long_ex(&bind->zval); - Z_LVAL_P(bind->zval)=dbretstatus(mssql_ptr->link); - } - else { - php_error_docref(NULL, E_WARNING, "stored procedure has no return value. Nothing was returned into RETVAL"); - } - } - } -} -/* }}} */ - -/* {{{ _mssql_fetch_batch -*/ -static int _mssql_fetch_batch(mssql_link *mssql_ptr, mssql_result *result, int retvalue) -{ - int i, j = 0; - char computed_buf[16]; - - if (!result->have_fields) { - for (i=0; i<result->num_fields; i++) { - char *source = NULL; - char *fname = (char *)dbcolname(mssql_ptr->link,i+1); - - if (*fname) { - result->fields[i].name = estrdup(fname); - } else { - if (j>0) { - snprintf(computed_buf,16,"computed%d",j); - } else { - strcpy(computed_buf,"computed"); - } - result->fields[i].name = estrdup(computed_buf); - j++; - } - result->fields[i].max_length = dbcollen(mssql_ptr->link,i+1); - source = (char *)dbcolsource(mssql_ptr->link,i+1); - if (source) { - result->fields[i].column_source = estrdup(source); - } - else { - result->fields[i].column_source = STR_EMPTY_ALLOC(); - } - - result->fields[i].type = coltype(i+1); - /* set numeric flag */ - switch (result->fields[i].type) { - case SQLINT1: - case SQLINT2: - case SQLINT4: - case SQLINTN: - case SQLFLT4: - case SQLFLT8: - case SQLNUMERIC: - case SQLDECIMAL: - result->fields[i].numeric = 1; - break; - case SQLCHAR: - case SQLVARCHAR: - case SQLTEXT: - default: - result->fields[i].numeric = 0; - break; - } - } - result->have_fields = 1; - } - - i=0; - if (!result->data) { - result->data = (zval **) safe_emalloc(sizeof(zval *), MSSQL_ROWS_BLOCK*(++result->blocks_initialized), 0); - } - while (retvalue!=FAIL && retvalue!=NO_MORE_ROWS) { - result->num_rows++; - if (result->num_rows > result->blocks_initialized*MSSQL_ROWS_BLOCK) { - result->data = (zval **) erealloc(result->data,sizeof(zval *)*MSSQL_ROWS_BLOCK*(++result->blocks_initialized)); - } - result->data[i] = (zval *) safe_emalloc(sizeof(zval), result->num_fields, 0); - for (j=0; j<result->num_fields; j++) { - INIT_ZVAL(result->data[i][j]); - MS_SQL_G(get_column_content(mssql_ptr, j+1, &result->data[i][j], result->fields[j].type)); - } - if (i<result->batchsize || result->batchsize==0) { - i++; - dbclrbuf(mssql_ptr->link,DBLASTROW(mssql_ptr->link)); - retvalue=dbnextrow(mssql_ptr->link); - } - else - break; - result->lastresult = retvalue; - } - if (result->statement && (retvalue == NO_MORE_RESULTS || retvalue == NO_MORE_RPC_RESULTS)) { - _mssql_get_sp_result(mssql_ptr, result->statement); - } - return i; -} -/* }}} */ - -/* {{{ proto int mssql_fetch_batch(resource result_index) - Returns the next batch of records */ -PHP_FUNCTION(mssql_fetch_batch) -{ - zval *mssql_result_index; - mssql_result *result; - mssql_link *mssql_ptr; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &mssql_result_index) == FAILURE) { - return; - } - - if (Z_RESVAL_P(mssql_result_index) == 0) { - RETURN_FALSE; - } - - ZEND_FETCH_RESOURCE(result, mssql_result *, &mssql_result_index, -1, "MS SQL-result", le_result); - - mssql_ptr = result->mssql_ptr; - _free_result(result, 0); - result->cur_row=result->num_rows=0; - result->num_rows = _mssql_fetch_batch(mssql_ptr, result, result->lastresult); - - RETURN_LONG(result->num_rows); -} -/* }}} */ - -/* {{{ proto resource mssql_query(string query [, resource conn_id [, int batch_size]]) - Perform an SQL query on a MS-SQL server database */ -PHP_FUNCTION(mssql_query) -{ - char *query; - zval *mssql_link_index = NULL; - size_t query_len; - int retvalue, batchsize, num_fields; - zend_long zbatchsize = 0; - mssql_link *mssql_ptr; - mssql_result *result; - int id = -1; - - dbsettime(MS_SQL_G(timeout)); - batchsize = MS_SQL_G(batchsize); - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|rl", &query, &query_len, &mssql_link_index, &zbatchsize) == FAILURE) { - return; - } - - switch(ZEND_NUM_ARGS()) { - case 1: - id = php_mssql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); - break; - case 3: - batchsize = (int) zbatchsize; - break; - } - - ZEND_FETCH_RESOURCE2(mssql_ptr, mssql_link *, &mssql_link_index, id, "MS SQL-Link", le_link, le_plink); - - if (dbcmd(mssql_ptr->link, query)==FAIL) { - php_error_docref(NULL, E_WARNING, "Unable to set query"); - RETURN_FALSE; - } - if (dbsqlexec(mssql_ptr->link)==FAIL || (retvalue = dbresults(mssql_ptr->link))==FAIL) { - php_error_docref(NULL, E_WARNING, "Query failed"); - dbcancel(mssql_ptr->link); - RETURN_FALSE; - } - - /* Skip results not returning any columns */ - while ((num_fields = dbnumcols(mssql_ptr->link)) <= 0 && retvalue == SUCCEED) { - retvalue = dbresults(mssql_ptr->link); - } - - if (num_fields <= 0) { - RETURN_TRUE; - } - - retvalue=dbnextrow(mssql_ptr->link); - if (retvalue==FAIL) { - dbcancel(mssql_ptr->link); - RETURN_FALSE; - } - - result = (mssql_result *) emalloc(sizeof(mssql_result)); - result->statement = NULL; - result->num_fields = num_fields; - result->blocks_initialized = 1; - - result->batchsize = batchsize; - result->data = NULL; - result->blocks_initialized = 0; - result->mssql_ptr = mssql_ptr; - result->cur_field=result->cur_row=result->num_rows=0; - result->have_fields = 0; - - result->fields = (mssql_field *) safe_emalloc(sizeof(mssql_field), result->num_fields, 0); - result->num_rows = _mssql_fetch_batch(mssql_ptr, result, retvalue); - - ZEND_REGISTER_RESOURCE(return_value, result, le_result); -} -/* }}} */ - -/* {{{ proto int mssql_rows_affected(resource conn_id) - Returns the number of records affected by the query */ -PHP_FUNCTION(mssql_rows_affected) -{ - zval *mssql_link_index; - mssql_link *mssql_ptr; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &mssql_link_index) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE2(mssql_ptr, mssql_link *, &mssql_link_index, -1, "MS SQL-Link", le_link, le_plink); - - RETURN_LONG(DBCOUNT(mssql_ptr->link)); -} -/* }}} */ - -/* {{{ proto bool mssql_free_result(resource result_index) - Free a MS-SQL result index */ -PHP_FUNCTION(mssql_free_result) -{ - zval *mssql_result_index; - mssql_result *result; - int retvalue; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &mssql_result_index) == FAILURE) { - return; - } - - if (Z_RESVAL_P(mssql_result_index) == 0) { - RETURN_FALSE; - } - - ZEND_FETCH_RESOURCE(result, mssql_result *, &mssql_result_index, -1, "MS SQL-result", le_result); - /* Release remaining results */ - do { - dbcanquery(result->mssql_ptr->link); - retvalue = dbresults(result->mssql_ptr->link); - } while (retvalue == SUCCEED); - - zend_list_delete(Z_RESVAL_P(mssql_result_index)); - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto string mssql_get_last_message(void) - Gets the last message from the MS-SQL server */ -PHP_FUNCTION(mssql_get_last_message) -{ - if (zend_parse_parameters_none() == FAILURE) { - return; - } - - if (MS_SQL_G(server_message)) { - RETURN_STRING(MS_SQL_G(server_message),1); - } else { - RETURN_STRING("",1); - } -} -/* }}} */ - -/* {{{ proto int mssql_num_rows(resource mssql_result_index) - Returns the number of rows fetched in from the result id specified */ -PHP_FUNCTION(mssql_num_rows) -{ - zval *mssql_result_index; - mssql_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &mssql_result_index) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(result, mssql_result *, &mssql_result_index, -1, "MS SQL-result", le_result); - - RETURN_LONG(result->num_rows); -} -/* }}} */ - -/* {{{ proto int mssql_num_fields(resource mssql_result_index) - Returns the number of fields fetched in from the result id specified */ -PHP_FUNCTION(mssql_num_fields) -{ - zval *mssql_result_index; - mssql_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &mssql_result_index) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(result, mssql_result *, &mssql_result_index, -1, "MS SQL-result", le_result); - - RETURN_LONG(result->num_fields); -} -/* }}} */ - -/* {{{ php_mssql_fetch_hash -*/ -static void php_mssql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type) -{ - zval *mssql_result_index; - mssql_result *result; - int i; - zend_long resulttype = 0; - - switch (result_type) { - case MSSQL_NUM: - case MSSQL_ASSOC: - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &mssql_result_index) == FAILURE) { - return; - } - break; - case MSSQL_BOTH: - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|l", &mssql_result_index, &resulttype) == FAILURE) { - return; - } - result_type = (resulttype > 0 && (resulttype & MSSQL_BOTH)) ? resulttype : result_type; - break; - default: - return; - } - - ZEND_FETCH_RESOURCE(result, mssql_result *, &mssql_result_index, -1, "MS SQL-result", le_result); - - if (MS_SQL_G(server_message)) { - zend_string_free(MS_SQL_G(server_message)); - MS_SQL_G(server_message) = NULL; - } - - if (result->cur_row >= result->num_rows) { - RETURN_FALSE; - } - - array_init(return_value); - - for (i=0; i<result->num_fields; i++) { - if (Z_TYPE(result->data[result->cur_row][i]) != IS_NULL) { - char *data; - int data_len; - - if (Z_TYPE(result->data[result->cur_row][i]) == IS_STRING) { - data = Z_STRVAL(result->data[result->cur_row][i]); - data_len = Z_STRLEN(result->data[result->cur_row][i]); - - if (result_type & MSSQL_NUM) { - add_index_stringl(return_value, i, data, data_len); - } - - if (result_type & MSSQL_ASSOC) { - add_assoc_stringl(return_value, result->fields[i].name, data, data_len); - } - } - else if (Z_TYPE(result->data[result->cur_row][i]) == IS_LONG) { - if (result_type & MSSQL_NUM) - add_index_long(return_value, i, Z_LVAL(result->data[result->cur_row][i])); - - if (result_type & MSSQL_ASSOC) - add_assoc_long(return_value, result->fields[i].name, Z_LVAL(result->data[result->cur_row][i])); - } - else if (Z_TYPE(result->data[result->cur_row][i]) == IS_DOUBLE) { - if (result_type & MSSQL_NUM) - add_index_double(return_value, i, Z_DVAL(result->data[result->cur_row][i])); - - if (result_type & MSSQL_ASSOC) - add_assoc_double(return_value, result->fields[i].name, Z_DVAL(result->data[result->cur_row][i])); - } - } - else - { - if (result_type & MSSQL_NUM) - add_index_null(return_value, i); - if (result_type & MSSQL_ASSOC) - add_assoc_null(return_value, result->fields[i].name); - } - } - result->cur_row++; -} -/* }}} */ - -/* {{{ proto array mssql_fetch_row(resource result_id) - Returns an array of the current row in the result set specified by result_id */ -PHP_FUNCTION(mssql_fetch_row) -{ - php_mssql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MSSQL_NUM); -} -/* }}} */ - -/* {{{ proto object mssql_fetch_object(resource result_id) - Returns a pseudo-object of the current row in the result set specified by result_id */ -PHP_FUNCTION(mssql_fetch_object) -{ - php_mssql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MSSQL_ASSOC); - if (Z_TYPE_P(return_value)==IS_ARRAY) { - object_and_properties_init(return_value, ZEND_STANDARD_CLASS_DEF_PTR, Z_ARRVAL_P(return_value)); - } -} -/* }}} */ - -/* {{{ proto array mssql_fetch_array(resource result_id [, int result_type]) - Returns an associative array of the current row in the result set specified by result_id */ -PHP_FUNCTION(mssql_fetch_array) -{ - php_mssql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MSSQL_BOTH); -} -/* }}} */ - -/* {{{ proto array mssql_fetch_assoc(resource result_id) - Returns an associative array of the current row in the result set specified by result_id */ -PHP_FUNCTION(mssql_fetch_assoc) -{ - php_mssql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MSSQL_ASSOC); -} -/* }}} */ - -/* {{{ proto bool mssql_data_seek(resource result_id, int offset) - Moves the internal row pointer of the MS-SQL result associated with the specified result identifier to pointer to the specified row number */ -PHP_FUNCTION(mssql_data_seek) -{ - zval *mssql_result_index; - zend_long offset; - mssql_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &mssql_result_index, &offset) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(result, mssql_result *, &mssql_result_index, -1, "MS SQL-result", le_result); - - if (offset < 0 || offset >= result->num_rows) { - php_error_docref(NULL, E_WARNING, "Bad row offset"); - RETURN_FALSE; - } - - result->cur_row = offset; - RETURN_TRUE; -} -/* }}} */ - -/* {{{ php_mssql_get_field_name -*/ -static char *php_mssql_get_field_name(int type) -{ - switch (type) { - case SQLBINARY: - case SQLVARBINARY: - return "blob"; - break; - case SQLCHAR: - case SQLVARCHAR: - return "char"; - break; - case SQLTEXT: - return "text"; - break; - case SQLDATETIME: - case SQLDATETIM4: - case SQLDATETIMN: - return "datetime"; - break; - case SQLDECIMAL: - case SQLFLT4: - case SQLFLT8: - case SQLFLTN: - return "real"; - break; - case SQLINT1: - case SQLINT2: - case SQLINT4: - case SQLINTN: - return "int"; - break; - case SQLNUMERIC: - return "numeric"; - break; - case SQLMONEY: - case SQLMONEY4: - case SQLMONEYN: - return "money"; - break; - case SQLBIT: - return "bit"; - break; - case SQLIMAGE: - return "image"; - break; -#ifdef SQLUNIQUE - case SQLUNIQUE: - return "uniqueidentifier"; - break; -#endif - default: - return "unknown"; - break; - } -} -/* }}} */ - -/* {{{ proto object mssql_fetch_field(resource result_id [, int offset]) - Gets information about certain fields in a query result */ -PHP_FUNCTION(mssql_fetch_field) -{ - zval *mssql_result_index; - zend_long field_offset = -1; - mssql_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|l", &mssql_result_index, &field_offset) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(result, mssql_result *, &mssql_result_index, -1, "MS SQL-result", le_result); - - if (field_offset==-1) { - field_offset = result->cur_field; - result->cur_field++; - } - - if (field_offset<0 || field_offset >= result->num_fields) { - if (ZEND_NUM_ARGS()==2) { /* field specified explicitly */ - php_error_docref(NULL, E_WARNING, "Bad column offset"); - } - RETURN_FALSE; - } - - object_init(return_value); - - add_property_string(return_value, "name",result->fields[field_offset].name); - add_property_long(return_value, "max_length",result->fields[field_offset].max_length); - add_property_string(return_value, "column_source",result->fields[field_offset].column_source); - add_property_long(return_value, "numeric", result->fields[field_offset].numeric); - add_property_string(return_value, "type", php_mssql_get_field_name(Z_TYPE(result->fields[field_offset]))); -} -/* }}} */ - -/* {{{ proto int mssql_field_length(resource result_id [, int offset]) - Get the length of a MS-SQL field */ -PHP_FUNCTION(mssql_field_length) -{ - zval *mssql_result_index; - zend_long field_offset = -1; - mssql_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|l", &mssql_result_index, &field_offset) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(result, mssql_result *, &mssql_result_index, -1, "MS SQL-result", le_result); - - if (field_offset==-1) { - field_offset = result->cur_field; - result->cur_field++; - } - - if (field_offset<0 || field_offset >= result->num_fields) { - if (ZEND_NUM_ARGS()==2) { /* field specified explicitly */ - php_error_docref(NULL, E_WARNING, "Bad column offset"); - } - RETURN_FALSE; - } - - RETURN_LONG(result->fields[field_offset].max_length); -} -/* }}} */ - -/* {{{ proto string mssql_field_name(resource result_id [, int offset]) - Returns the name of the field given by offset in the result set given by result_id */ -PHP_FUNCTION(mssql_field_name) -{ - zval *mssql_result_index; - zend_long field_offset = -1; - mssql_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|l", &mssql_result_index, &field_offset) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(result, mssql_result *, &mssql_result_index, -1, "MS SQL-result", le_result); - - if (field_offset==-1) { - field_offset = result->cur_field; - result->cur_field++; - } - - if (field_offset<0 || field_offset >= result->num_fields) { - if (ZEND_NUM_ARGS()==2) { /* field specified explicitly */ - php_error_docref(NULL, E_WARNING, "Bad column offset"); - } - RETURN_FALSE; - } - - RETURN_STRINGL(result->fields[field_offset].name, strlen(result->fields[field_offset].name), 1); -} -/* }}} */ - -/* {{{ proto string mssql_field_type(resource result_id [, int offset]) - Returns the type of a field */ -PHP_FUNCTION(mssql_field_type) -{ - zval *mssql_result_index; - zend_long field_offset = -1; - mssql_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|l", &mssql_result_index, &field_offset) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(result, mssql_result *, &mssql_result_index, -1, "MS SQL-result", le_result); - - if (field_offset==-1) { - field_offset = result->cur_field; - result->cur_field++; - } - - if (field_offset<0 || field_offset >= result->num_fields) { - if (ZEND_NUM_ARGS()==2) { /* field specified explicitly */ - php_error_docref(NULL, E_WARNING, "Bad column offset"); - } - RETURN_FALSE; - } - - RETURN_STRINGL(php_mssql_get_field_name(Z_TYPE(result->fields[field_offset])), strlen(php_mssql_get_field_name(Z_TYPE(result->fields[field_offset]))), 1); -} -/* }}} */ - -/* {{{ proto bool mssql_field_seek(resource result_id, int offset) - Seeks to the specified field offset */ -PHP_FUNCTION(mssql_field_seek) -{ - zval *mssql_result_index; - zend_long field_offset; - mssql_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &mssql_result_index, &field_offset) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(result, mssql_result *, &mssql_result_index, -1, "MS SQL-result", le_result); - - if (field_offset<0 || field_offset >= result->num_fields) { - php_error_docref(NULL, E_WARNING, "Bad column offset"); - RETURN_FALSE; - } - - result->cur_field = field_offset; - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto string mssql_result(resource result_id, int row, mixed field) - Returns the contents of one cell from a MS-SQL result set */ -PHP_FUNCTION(mssql_result) -{ - zval **field, *mssql_result_index; - zend_long row; - int field_offset=0; - mssql_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlZ", &mssql_result_index, &row, &field) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(result, mssql_result *, &mssql_result_index, -1, "MS SQL-result", le_result); - - if (row < 0 || row >= result->num_rows) { - php_error_docref(NULL, E_WARNING, "Bad row offset (%ld)", row); - RETURN_FALSE; - } - - switch(Z_TYPE_PP(field)) { - case IS_STRING: { - int i; - - for (i=0; i<result->num_fields; i++) { - if (!strcasecmp(result->fields[i].name, Z_STRVAL_PP(field))) { - field_offset = i; - break; - } - } - if (i>=result->num_fields) { /* no match found */ - php_error_docref(NULL, E_WARNING, "%s field not found in result", Z_STRVAL_PP(field)); - RETURN_FALSE; - } - break; - } - default: - convert_to_long_ex(field); - field_offset = Z_LVAL_PP(field); - if (field_offset<0 || field_offset>=result->num_fields) { - php_error_docref(NULL, E_WARNING, "Bad column offset specified"); - RETURN_FALSE; - } - break; - } - - *return_value = result->data[row][field_offset]; - zval_copy_ctor(return_value); -} -/* }}} */ - -/* {{{ proto bool mssql_next_result(resource result_id) - Move the internal result pointer to the next result */ -PHP_FUNCTION(mssql_next_result) -{ - zval *mssql_result_index; - int retvalue; - mssql_result *result; - mssql_link *mssql_ptr; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &mssql_result_index) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(result, mssql_result *, &mssql_result_index, -1, "MS SQL-result", le_result); - - mssql_ptr = result->mssql_ptr; - retvalue = dbresults(mssql_ptr->link); - - while (dbnumcols(mssql_ptr->link) <= 0 && retvalue == SUCCEED) { - retvalue = dbresults(mssql_ptr->link); - } - - if (retvalue == FAIL) { - RETURN_FALSE; - } - else if (retvalue == NO_MORE_RESULTS || retvalue == NO_MORE_RPC_RESULTS) { - if (result->statement) { - _mssql_get_sp_result(mssql_ptr, result->statement); - } - RETURN_FALSE; - } - else { - _free_result(result, 1); - result->cur_row=result->num_fields=result->num_rows=0; - dbclrbuf(mssql_ptr->link,DBLASTROW(mssql_ptr->link)); - retvalue = dbnextrow(mssql_ptr->link); - - result->num_fields = dbnumcols(mssql_ptr->link); - result->fields = (mssql_field *) safe_emalloc(sizeof(mssql_field), result->num_fields, 0); - result->have_fields = 0; - result->num_rows = _mssql_fetch_batch(mssql_ptr, result, retvalue); - RETURN_TRUE; - } - -} -/* }}} */ - - -/* {{{ proto void mssql_min_error_severity(int severity) - Sets the lower error severity */ -PHP_FUNCTION(mssql_min_error_severity) -{ - zend_long severity; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &severity) == FAILURE) { - return; - } - - MS_SQL_G(min_error_severity) = severity; -} - -/* }}} */ - -/* {{{ proto void mssql_min_message_severity(int severity) - Sets the lower message severity */ -PHP_FUNCTION(mssql_min_message_severity) -{ - zend_long severity; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &severity) == FAILURE) { - return; - } - - MS_SQL_G(min_message_severity) = severity; -} -/* }}} */ - -/* {{{ proto int mssql_init(string sp_name [, resource conn_id]) - Initializes a stored procedure or a remote stored procedure */ -PHP_FUNCTION(mssql_init) -{ - char *sp_name; - size_t sp_name_len; - zval *mssql_link_index = NULL; - mssql_link *mssql_ptr; - mssql_statement *statement; - int id = -1; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|r", &sp_name, &sp_name_len, &mssql_link_index) == FAILURE) { - return; - } - - if (mssql_link_index == NULL) { - id = php_mssql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); - } - - ZEND_FETCH_RESOURCE2(mssql_ptr, mssql_link *, &mssql_link_index, id, "MS SQL-Link", le_link, le_plink); - - if (dbrpcinit(mssql_ptr->link, sp_name,0)==FAIL) { - php_error_docref(NULL, E_WARNING, "unable to init stored procedure"); - RETURN_FALSE; - } - - statement=NULL; - statement = ecalloc(1,sizeof(mssql_statement)); - statement->link = mssql_ptr; - statement->executed=FALSE; - - statement->id = zend_list_insert(statement,le_statement); - - RETURN_RESOURCE(statement->id); -} -/* }}} */ - -/* {{{ proto bool mssql_bind(resource stmt, string param_name, mixed var, int type [, bool is_output [, bool is_null [, int maxlen]]]) - Adds a parameter to a stored procedure or a remote stored procedure */ -PHP_FUNCTION(mssql_bind) -{ - char *param_name; - size_t param_name_len; - int datalen; - int status = 0; - zend_long type = 0, maxlen = -1; - zval *stmt, **var; - zend_bool is_output = 0, is_null = 0; - mssql_link *mssql_ptr; - mssql_statement *statement; - mssql_bind bind,*bindp; - LPBYTE value = NULL; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsZl|bbl", &stmt, ¶m_name, ¶m_name_len, &var, &type, &is_output, &is_null, &maxlen) == FAILURE) { - return; - } - - if (ZEND_NUM_ARGS() == 7 && !is_output) { - maxlen = -1; - } - - ZEND_FETCH_RESOURCE(statement, mssql_statement *, &stmt, -1, "MS SQL-Statement", le_statement); - - if (statement==NULL) { - RETURN_FALSE; - } - mssql_ptr=statement->link; - - /* modify datalen and maxlen according to dbrpcparam documentation */ - if ( (type==SQLVARCHAR) || (type==SQLCHAR) || (type==SQLTEXT) ) { /* variable-length type */ - if (is_null) { - maxlen=0; - datalen=0; - } else { - convert_to_string_ex(var); - datalen=Z_STRLEN_PP(var); - value=(LPBYTE)Z_STRVAL_PP(var); - } - } else { - /* fixed-length type */ - if (is_null) { - datalen=0; - } else { - datalen=-1; - } - maxlen=-1; - - switch (type) { - case SQLFLT4: - case SQLFLT8: - case SQLFLTN: - convert_to_double_ex(var); - value=(LPBYTE)(&Z_DVAL_PP(var)); - break; - - case SQLBIT: - case SQLINT1: - case SQLINT2: - case SQLINT4: - convert_to_long_ex(var); - value=(LPBYTE)(&Z_LVAL_PP(var)); - break; - - default: - php_error_docref(NULL, E_WARNING, "unsupported type"); - RETURN_FALSE; - break; - } - } - - if (is_output) { - status=DBRPCRETURN; - } - - /* hashtable of binds */ - if (! statement->binds) { - ALLOC_HASHTABLE(statement->binds); - zend_hash_init(statement->binds, 13, NULL, _mssql_bind_hash_dtor, 0); - } - - if (zend_hash_exists(statement->binds, param_name, param_name_len)) { - RETURN_FALSE; - } - else { - memset((void*)&bind,0,sizeof(mssql_bind)); - zend_hash_add(statement->binds, param_name, param_name_len, &bind, sizeof(mssql_bind), (void **)&bindp); - if( NULL == bindp ) RETURN_FALSE; - bindp->zval=*var; - zval_add_ref(var); - - /* no call to dbrpcparam if RETVAL */ - if ( strcmp("RETVAL", param_name)!=0 ) { - if (dbrpcparam(mssql_ptr->link, param_name, (BYTE)status, type, maxlen, datalen, (LPBYTE)value)==FAIL) { - php_error_docref(NULL, E_WARNING, "Unable to set parameter"); - RETURN_FALSE; - } - } - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto mixed mssql_execute(resource stmt [, bool skip_results = false]) - Executes a stored procedure on a MS-SQL server database */ -PHP_FUNCTION(mssql_execute) -{ - zval *stmt; - zend_bool skip_results = 0; - int retvalue, retval_results; - mssql_link *mssql_ptr; - mssql_statement *statement; - mssql_result *result; - int num_fields; - int batchsize; - int exec_retval; - - batchsize = MS_SQL_G(batchsize); - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|b", &stmt, &skip_results) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(statement, mssql_statement *, &stmt, -1, "MS SQL-Statement", le_statement); - - mssql_ptr=statement->link; - exec_retval = dbrpcexec(mssql_ptr->link); - - if (exec_retval == FAIL || dbsqlok(mssql_ptr->link) == FAIL) { - php_error_docref(NULL, E_WARNING, "stored procedure execution failed"); - - if (exec_retval == FAIL) { - dbcancel(mssql_ptr->link); - } - - RETURN_FALSE; - } - - retval_results=dbresults(mssql_ptr->link); - - if (retval_results==FAIL) { - php_error_docref(NULL, E_WARNING, "could not retrieve results"); - dbcancel(mssql_ptr->link); - RETURN_FALSE; - } - - /* The following is just like mssql_query, fetch all rows from the first result - * set into the row buffer. - */ - result=NULL; - if (retval_results == SUCCEED) { - if (skip_results) { - do { - dbcanquery(mssql_ptr->link); - retval_results = dbresults(mssql_ptr->link); - } while (retval_results == SUCCEED); - } - else { - /* Skip results not returning any columns */ - while ((num_fields = dbnumcols(mssql_ptr->link)) <= 0 && retval_results == SUCCEED) { - retval_results = dbresults(mssql_ptr->link); - } - if ((num_fields = dbnumcols(mssql_ptr->link)) > 0) { - retvalue = dbnextrow(mssql_ptr->link); - result = (mssql_result *) emalloc(sizeof(mssql_result)); - result->batchsize = batchsize; - result->blocks_initialized = 1; - result->data = (zval **) safe_emalloc(sizeof(zval *), MSSQL_ROWS_BLOCK, 0); - result->mssql_ptr = mssql_ptr; - result->cur_field=result->cur_row=result->num_rows=0; - result->num_fields = num_fields; - result->have_fields = 0; - - result->fields = (mssql_field *) safe_emalloc(sizeof(mssql_field), num_fields, 0); - result->statement = statement; - result->num_rows = _mssql_fetch_batch(mssql_ptr, result, retvalue); - } - } - } - if (retval_results == NO_MORE_RESULTS || retval_results == NO_MORE_RPC_RESULTS) { - _mssql_get_sp_result(mssql_ptr, statement); - } - - if (result==NULL) { - RETURN_TRUE; /* no recordset returned ...*/ - } - else { - ZEND_REGISTER_RESOURCE(return_value, result, le_result); - } -} -/* }}} */ - -/* {{{ proto bool mssql_free_statement(resource result_index) - Free a MS-SQL statement index */ -PHP_FUNCTION(mssql_free_statement) -{ - zval *mssql_statement_index; - mssql_statement *statement; - int retvalue; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &mssql_statement_index) == FAILURE) { - return; - } - - if (Z_RESVAL_P(mssql_statement_index) == 0) { - RETURN_FALSE; - } - - ZEND_FETCH_RESOURCE(statement, mssql_statement *, &mssql_statement_index, -1, "MS SQL-statement", le_statement); - /* Release remaining results */ - do { - dbcanquery(statement->link->link); - retvalue = dbresults(statement->link->link); - } while (retvalue == SUCCEED); - - zend_list_delete(Z_RESVAL_P(mssql_statement_index)); - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto string mssql_guid_string(string binary [,bool short_format]) - Converts a 16 byte binary GUID to a string */ -PHP_FUNCTION(mssql_guid_string) -{ - char *binary; - size_t binary_len; - zend_bool sf = 0; - char buffer[32+1]; - char buffer2[36+1]; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|b", &binary, &binary_len, &sf) == FAILURE) { - return; - } - - dbconvert(NULL, SQLBINARY, (BYTE*) binary, MIN(16, binary_len), SQLCHAR, buffer, -1); - - if (sf) { - php_strtoupper(buffer, 32); - RETURN_STRING(buffer, 1); - } - else { - int i; - /* FIXME this works only on little endian machine */ - for (i=0; i<4; i++) { - buffer2[2*i] = buffer[6-2*i]; - buffer2[2*i+1] = buffer[7-2*i]; - } - buffer2[8] = '-'; - for (i=0; i<2; i++) { - buffer2[9+2*i] = buffer[10-2*i]; - buffer2[10+2*i] = buffer[11-2*i]; - } - buffer2[13] = '-'; - for (i=0; i<2; i++) { - buffer2[14+2*i] = buffer[14-2*i]; - buffer2[15+2*i] = buffer[15-2*i]; - } - buffer2[18] = '-'; - for (i=0; i<4; i++) { - buffer2[19+i] = buffer[16+i]; - } - buffer2[23] = '-'; - for (i=0; i<12; i++) { - buffer2[24+i] = buffer[20+i]; - } - buffer2[36] = 0; - - php_strtoupper(buffer2, 36); - RETURN_STRING(buffer2, 1); - } -} -/* }}} */ - -#endif diff --git a/ext/mssql/php_mssql.h b/ext/mssql/php_mssql.h deleted file mode 100644 index 18a82ef652..0000000000 --- a/ext/mssql/php_mssql.h +++ /dev/null @@ -1,214 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2015 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: | - | http://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. | - +----------------------------------------------------------------------+ - | Author: Frank M. Kromann <frank@kromann.info> | - +----------------------------------------------------------------------+ - */ - - -/* $Id$ */ - -#ifndef PHP_MSSQL_H -#define PHP_MSSQL_H - - -#if HAVE_MSSQL -#define MSDBLIB - -/* FreeTDS checks for PHP_MSSQL_API for avoid type redefinition */ -#ifdef HAVE_FREETDS -#define PHP_MSSQL_API -#endif - -#include <sqlfront.h> -#include <sqldb.h> - -typedef short TDS_SHORT; -#ifdef HAVE_FREETDS -#define MSSQL_VERSION "FreeTDS" -#define SQLTEXT SYBTEXT -#define SQLCHAR SYBCHAR -#define SQLVARCHAR SYBVARCHAR -#define SQLINT1 SYBINT1 -#define SQLINT2 SYBINT2 -#define SQLINT4 SYBINT4 -#define SQLINTN SYBINTN -#define SQLBIT SYBBIT -#define SQLFLT4 SYBREAL -#define SQLFLT8 SYBFLT8 -#define SQLFLTN SYBFLTN -#define SQLDECIMAL SYBDECIMAL -#define SQLNUMERIC SYBNUMERIC -#define SQLDATETIME SYBDATETIME -#define SQLDATETIM4 SYBDATETIME4 -#define SQLDATETIMN SYBDATETIMN -#define SQLMONEY SYBMONEY -#define SQLMONEY4 SYBMONEY4 -#define SQLMONEYN SYBMONEYN -#define SQLIMAGE SYBIMAGE -#define SQLBINARY SYBBINARY -#define SQLVARBINARY SYBVARBINARY -#ifdef SQLUNIQUE /* FreeTSD 0.61+ */ -#define SQLUNIQUE SYBUNIQUE -#endif -#define DBERRHANDLE(a, b) dberrhandle(b) -#define DBMSGHANDLE(a, b) dbmsghandle(b) -#define DBSETOPT(a, b, c) dbsetopt(a, b, c, -1) -#define NO_MORE_RPC_RESULTS 3 -#ifndef dbfreelogin -#define dbfreelogin dbloginfree -#endif -#define dbrpcexec dbrpcsend -typedef unsigned char *LPBYTE; -typedef float DBFLT4; -#else -#define MSSQL_VERSION "7.0" -#define DBERRHANDLE(a, b) dbprocerrhandle(a, b) -#define DBMSGHANDLE(a, b) dbprocmsghandle(a, b) -#define EHANDLEFUNC DBERRHANDLE_PROC -#define MHANDLEFUNC DBMSGHANDLE_PROC -#define DBSETOPT(a, b, c) dbsetopt(a, b, c) -#endif - -#define coltype(j) dbcoltype(mssql_ptr->link,j) -#define intcol(i) ((int) *(DBINT *) dbdata(mssql_ptr->link,i)) -#define smallintcol(i) ((int) *(DBSMALLINT *) dbdata(mssql_ptr->link,i)) -#define tinyintcol(i) ((int) *(DBTINYINT *) dbdata(mssql_ptr->link,i)) -#define anyintcol(j) (coltype(j)==SQLINT4?intcol(j):(coltype(j)==SQLINT2?smallintcol(j):tinyintcol(j))) -#define charcol(i) ((DBCHAR *) dbdata(mssql_ptr->link,i)) -#define floatcol4(i) (*(DBFLT4 *) dbdata(mssql_ptr->link,i)) -#define floatcol8(i) (*(DBFLT8 *) dbdata(mssql_ptr->link,i)) - -#ifdef ZTS -#include "TSRM.h" -#endif - -extern zend_module_entry mssql_module_entry; -#define mssql_module_ptr &mssql_module_entry - -PHP_MINIT_FUNCTION(mssql); -PHP_MSHUTDOWN_FUNCTION(mssql); -PHP_RINIT_FUNCTION(mssql); -PHP_RSHUTDOWN_FUNCTION(mssql); -PHP_MINFO_FUNCTION(mssql); - -PHP_FUNCTION(mssql_connect); -PHP_FUNCTION(mssql_pconnect); -PHP_FUNCTION(mssql_close); -PHP_FUNCTION(mssql_select_db); -PHP_FUNCTION(mssql_query); -PHP_FUNCTION(mssql_fetch_batch); -PHP_FUNCTION(mssql_rows_affected); -PHP_FUNCTION(mssql_free_result); -PHP_FUNCTION(mssql_get_last_message); -PHP_FUNCTION(mssql_num_rows); -PHP_FUNCTION(mssql_num_fields); -PHP_FUNCTION(mssql_fetch_field); -PHP_FUNCTION(mssql_fetch_row); -PHP_FUNCTION(mssql_fetch_array); -PHP_FUNCTION(mssql_fetch_assoc); -PHP_FUNCTION(mssql_fetch_object); -PHP_FUNCTION(mssql_field_length); -PHP_FUNCTION(mssql_field_name); -PHP_FUNCTION(mssql_field_type); -PHP_FUNCTION(mssql_data_seek); -PHP_FUNCTION(mssql_field_seek); -PHP_FUNCTION(mssql_result); -PHP_FUNCTION(mssql_next_result); -PHP_FUNCTION(mssql_min_error_severity); -PHP_FUNCTION(mssql_min_message_severity); -PHP_FUNCTION(mssql_init); -PHP_FUNCTION(mssql_bind); -PHP_FUNCTION(mssql_execute); -PHP_FUNCTION(mssql_free_statement); -PHP_FUNCTION(mssql_guid_string); - -typedef struct mssql_link { - LOGINREC *login; - DBPROCESS *link; - int valid; -} mssql_link; - -typedef struct mssql_statement { - int id; - mssql_link *link; - HashTable *binds; - int executed; -} mssql_statement; - -typedef struct { - - zval *zval; - /* TODO: more data for special types (BLOBS, NUMERIC...) */ -} mssql_bind; - -ZEND_BEGIN_MODULE_GLOBALS(mssql) - long default_link; - long num_links,num_persistent; - long max_links,max_persistent; - zend_bool allow_persistent; - char *appname; - char *server_message; -#ifdef HAVE_FREETDS - char *charset; -#endif - long min_error_severity, min_message_severity; - long cfg_min_error_severity, cfg_min_message_severity; - long connect_timeout, timeout; - zend_bool compatibility_mode; - void (*get_column_content)(mssql_link *mssql_ptr,int offset,zval *result,int column_type ); - long textsize, textlimit, batchsize; - zend_bool datetimeconvert; - HashTable *resource_list, *resource_plist; - zend_bool secure_connection; - long max_procs; -ZEND_END_MODULE_GLOBALS(mssql) - -#define MSSQL_ROWS_BLOCK 128 - -typedef struct mssql_field { - char *name,*column_source; - long max_length; - int numeric; - int type; -} mssql_field; - -typedef struct mssql_result { - zval **data; - mssql_field *fields; - mssql_link *mssql_ptr; - mssql_statement * statement; - int batchsize; - int lastresult; - int blocks_initialized; - int cur_row,cur_field; - int num_rows,num_fields,have_fields; -} mssql_result; - - -#ifdef ZTS -# define MS_SQL_G(v) TSRMG(mssql_globals_id, zend_mssql_globals *, v) -#else -# define MS_SQL_G(v) (mssql_globals.v) -#endif - -#else - -#define mssql_module_ptr NULL - -#endif /* HAVE_MSSQL */ - -#define phpext_mssql_ptr mssql_module_ptr - -#endif /* PHP_MSSQL_H */ diff --git a/ext/sybase_ct/CREDITS b/ext/sybase_ct/CREDITS deleted file mode 100644 index f739a533c4..0000000000 --- a/ext/sybase_ct/CREDITS +++ /dev/null @@ -1,2 +0,0 @@ -Sybase-CT -Zeev Suraski, Tom May, Timm Friebe diff --git a/ext/sybase_ct/config.m4 b/ext/sybase_ct/config.m4 deleted file mode 100644 index 276fe12675..0000000000 --- a/ext/sybase_ct/config.m4 +++ /dev/null @@ -1,120 +0,0 @@ -dnl -dnl $Id$ -dnl - -PHP_ARG_WITH(sybase-ct, for Sybase-CT support, -[ --with-sybase-ct[=DIR] Include Sybase-CT support. DIR is the Sybase home - directory [/home/sybase]]) - -if test "$PHP_SYBASE_CT" != "no"; then - - if test "$PHP_SYBASE" && test "$PHP_SYBASE" != "no" && test "$ext_shared" = "no"; then - AC_MSG_ERROR([You can not use both --with-sybase and --with-sybase-ct in same build!]) - fi - - AC_DEFINE(HAVE_SYBASE_CT,1,[ ]) - PHP_NEW_EXTENSION(sybase_ct, php_sybase_ct.c, $ext_shared) - PHP_SUBST(SYBASE_CT_SHARED_LIBADD) - - if test "$PHP_SYBASE_CT" = "yes"; then - SYBASE_CT_INCDIR=/home/sybase/include - SYBASE_CT_LIBDIR=/home/sybase/lib - else - SYBASE_CT_INCDIR=$PHP_SYBASE_CT/include - SYBASE_CT_LIBDIR=$PHP_SYBASE_CT/lib - fi - - dnl Determine whether we're building 64 or 32 bit... - AC_CHECK_SIZEOF(long int, 4) - AC_MSG_CHECKING([checking if we're on a 64-bit platform]) - if test "$ac_cv_sizeof_long_int" = "4"; then - AC_MSG_RESULT([no]) - PHP_SYBASE_64=no - else - AC_MSG_RESULT([yes]) - PHP_SYBASE_64=yes - fi - - - AC_MSG_CHECKING([Checking for ctpublic.h]) - if test -f $SYBASE_CT_INCDIR/ctpublic.h; then - AC_MSG_RESULT([found in $SYBASE_CT_INCDIR]) - PHP_ADD_INCLUDE($SYBASE_CT_INCDIR) - else - AC_MSG_ERROR([ctpublic.h missing!]) - fi - - AC_MSG_CHECKING([Checking Sybase libdir]) - AC_MSG_RESULT([Have $SYBASE_CT_LIBDIR]) - - AC_MSG_CHECKING([Checking for Sybase platform libraries]) - - PHP_ADD_LIBPATH($SYBASE_CT_LIBDIR, SYBASE_CT_SHARED_LIBADD) - if test -f $SYBASE_CT_INCDIR/tds.h || test -f $SYBASE_CT_INCDIR/tds_sysdep_public.h; then - PHP_ADD_LIBRARY(ct,, SYBASE_CT_SHARED_LIBADD) - SYBASE_CT_LIBS="-L$SYBASE_CT_LIBDIR -lct" - AC_MSG_RESULT([FreeTDS: $SYBASE_CT_LIBS]) - elif test -f $SYBASE_CT_LIBDIR/libsybct64.so && test $PHP_SYBASE_64 = "yes"; then - PHP_ADD_LIBRARY(sybcs64,, SYBASE_CT_SHARED_LIBADD) - PHP_ADD_LIBRARY(sybct64,, SYBASE_CT_SHARED_LIBADD) - PHP_ADD_LIBRARY(sybcomn64,, SYBASE_CT_SHARED_LIBADD) - PHP_ADD_LIBRARY(sybintl64,, SYBASE_CT_SHARED_LIBADD) - - ac_solid_uname_s=`uname -s 2>/dev/null` - case $ac_solid_uname_s in - *OSF*) ;; # Tru64/DEC OSF does NOT use the SYB_LP64 define - *) CFLAGS="${CFLAGS} -DSYB_LP64" ;; # - esac - SYBASE_CT_LIBS="-L$SYBASE_CT_LIBDIR -lsybcs64 -lsybct64 -lsybcomn64 -lsybintl64" - AC_MSG_RESULT([Sybase64: $SYBASE_CT_LIBS]) - - PHP_CHECK_LIBRARY(sybtcl64, netg_errstr, [ - PHP_ADD_LIBRARY(sybtcl64,,SYBASE_CT_SHARED_LIBADD) - ],[ - PHP_ADD_LIBRARY(sybtcl64,,SYBASE_CT_SHARED_LIBADD) - ],[ - $SYBASE_CT_LIBS - ]) - - PHP_CHECK_LIBRARY(insck64, insck__getVdate, [PHP_ADD_LIBRARY(insck64,, SYBASE_CT_SHARED_LIBADD)],[],[-L$SYBASE_CT_LIBDIR]) - PHP_CHECK_LIBRARY(insck64, bsd_tcp, [PHP_ADD_LIBRARY(insck64,, SYBASE_CT_SHARED_LIBADD)],[],[-L$SYBASE_CT_LIBDIR]) - elif test -f $SYBASE_CT_LIBDIR/libsybct.so; then - PHP_ADD_LIBRARY(sybcs,, SYBASE_CT_SHARED_LIBADD) - PHP_ADD_LIBRARY(sybct,, SYBASE_CT_SHARED_LIBADD) - PHP_ADD_LIBRARY(sybcomn,, SYBASE_CT_SHARED_LIBADD) - PHP_ADD_LIBRARY(sybintl,, SYBASE_CT_SHARED_LIBADD) - - SYBASE_CT_LIBS="-L$SYBASE_CT_LIBDIR -lsybcs -lsybct -lsybcomn -lsybintl" - AC_MSG_RESULT([Sybase32 syb-prefix: $SYBASE_CT_LIBS]) - - PHP_CHECK_LIBRARY(sybtcl, netg_errstr, [ - PHP_ADD_LIBRARY(sybtcl,,SYBASE_CT_SHARED_LIBADD) - ],[ - PHP_ADD_LIBRARY(sybtcl,,SYBASE_CT_SHARED_LIBADD) - ],[ - $SYBASE_CT_LIBS - ]) - - PHP_CHECK_LIBRARY(insck, insck__getVdate, [PHP_ADD_LIBRARY(insck,, SYBASE_CT_SHARED_LIBADD)],[],[-L$SYBASE_CT_LIBDIR]) - PHP_CHECK_LIBRARY(insck, bsd_tcp, [PHP_ADD_LIBRARY(insck,, SYBASE_CT_SHARED_LIBADD)],[],[-L$SYBASE_CT_LIBDIR]) - else - PHP_ADD_LIBRARY(cs,, SYBASE_CT_SHARED_LIBADD) - PHP_ADD_LIBRARY(ct,, SYBASE_CT_SHARED_LIBADD) - PHP_ADD_LIBRARY(comn,, SYBASE_CT_SHARED_LIBADD) - PHP_ADD_LIBRARY(intl,, SYBASE_CT_SHARED_LIBADD) - - SYBASE_CT_LIBS="-L$SYBASE_CT_LIBDIR -lcs -lct -lcomn -lintl" - AC_MSG_RESULT([Sybase32 default: $SYBASE_CT_LIBS]) - - PHP_CHECK_LIBRARY(tcl, netg_errstr, [ - PHP_ADD_LIBRARY(tcl,,SYBASE_CT_SHARED_LIBADD) - ],[ - PHP_ADD_LIBRARY(sybtcl,,SYBASE_CT_SHARED_LIBADD) - ],[ - $SYBASE_CT_LIBS - ]) - - PHP_CHECK_LIBRARY(insck, insck__getVdate, [PHP_ADD_LIBRARY(insck,, SYBASE_CT_SHARED_LIBADD)],[],[-L$SYBASE_CT_LIBDIR]) - PHP_CHECK_LIBRARY(insck, bsd_tcp, [PHP_ADD_LIBRARY(insck,, SYBASE_CT_SHARED_LIBADD)],[],[-L$SYBASE_CT_LIBDIR]) - fi -fi diff --git a/ext/sybase_ct/config.w32 b/ext/sybase_ct/config.w32 deleted file mode 100644 index c773b623af..0000000000 --- a/ext/sybase_ct/config.w32 +++ /dev/null @@ -1,21 +0,0 @@ - -// $Id$ -// vim:ft=javascript - -ARG_WITH("sybase-ct", "SYBASE_CT support", "no"); - -if (PHP_SYBASE_CT != "no") { - - if (CHECK_HEADER_ADD_INCLUDE("ctpublic.h", "CFLAGS_SYBASE_CT", PHP_PHP_BUILD + "\\sybase\\include;" + PHP_SYBASE_CT) && - (!X64 && CHECK_LIB("libsybcs.lib", "sybase_ct", PHP_PHP_BUILD + "\\sybase\\lib;" + PHP_SYBASE_CT) && - CHECK_LIB("libsybct.lib", "sybase_ct", PHP_PHP_BUILD + "\\sybase\\lib;" + PHP_SYBASE_CT) || - X64 && CHECK_LIB("libsybcs64.lib", "sybase_ct", PHP_PHP_BUILD + "\\sybase\\lib;" + PHP_SYBASE_CT) && - CHECK_LIB("libsybct64.lib", "sybase_ct", PHP_PHP_BUILD + "\\sybase\\lib;" + PHP_SYBASE_CT)) - ) { - EXTENSION('sybase_ct', 'php_sybase_ct.c'); - AC_DEFINE('HAVE_SYBASE_CT', 1); - } else { - WARNING("sybase_ct not enabled; libraries and headers not found"); - } -} - diff --git a/ext/sybase_ct/php_sybase_ct.c b/ext/sybase_ct/php_sybase_ct.c deleted file mode 100644 index 5ed1fb4dd7..0000000000 --- a/ext/sybase_ct/php_sybase_ct.c +++ /dev/null @@ -1,2242 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2015 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: | - | http://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: Zeev Suraski <zeev@zend.com> | - | Tom May <tom@go2net.com> | - | Timm Friebe <php_sybase_ct@thekid.de> | - +----------------------------------------------------------------------+ - */ - -/* $Id$ */ - - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" -#include "php_sybase_ct.h" -#include "ext/standard/php_standard.h" -#include "ext/standard/info.h" -#include "php_globals.h" -#include "php_ini.h" - -/* True globals, no need for thread safety */ -static int le_link, le_plink, le_result; - -#if HAVE_SYBASE_CT - -ZEND_DECLARE_MODULE_GLOBALS(sybase) -static PHP_GINIT_FUNCTION(sybase); -static PHP_GSHUTDOWN_FUNCTION(sybase); - -/* {{{ arginfo */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_connect, 0, 0, 0) - ZEND_ARG_INFO(0, host) - ZEND_ARG_INFO(0, user) - ZEND_ARG_INFO(0, password) - ZEND_ARG_INFO(0, charset) - ZEND_ARG_INFO(0, appname) - ZEND_ARG_INFO(0, new) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_pconnect, 0, 0, 0) - ZEND_ARG_INFO(0, host) - ZEND_ARG_INFO(0, user) - ZEND_ARG_INFO(0, password) - ZEND_ARG_INFO(0, charset) - ZEND_ARG_INFO(0, appname) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_close, 0, 0, 0) - ZEND_ARG_INFO(0, link_id) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_select_db, 0, 0, 1) - ZEND_ARG_INFO(0, database) - ZEND_ARG_INFO(0, link_id) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_query, 0, 0, 1) - ZEND_ARG_INFO(0, query) - ZEND_ARG_INFO(0, link_id) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_unbuffered_query, 0, 0, 1) - ZEND_ARG_INFO(0, query) - ZEND_ARG_INFO(0, link_id) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_free_result, 0, 0, 1) - ZEND_ARG_INFO(0, result) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_get_last_message, 0, 0, 1) - ZEND_ARG_INFO(0, d) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_num_rows, 0, 0, 1) - ZEND_ARG_INFO(0, result) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_num_fields, 0, 0, 1) - ZEND_ARG_INFO(0, result) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_fetch_row, 0, 0, 1) - ZEND_ARG_INFO(0, result) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_fetch_object, 0, 0, 1) - ZEND_ARG_INFO(0, result) - ZEND_ARG_INFO(0, object) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_fetch_array, 0, 0, 1) - ZEND_ARG_INFO(0, result) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_fetch_assoc, 0, 0, 1) - ZEND_ARG_INFO(0, result) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_data_seek, 0, 0, 2) - ZEND_ARG_INFO(0, result) - ZEND_ARG_INFO(0, offset) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_fetch_field, 0, 0, 1) - ZEND_ARG_INFO(0, result) - ZEND_ARG_INFO(0, offset) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_field_seek, 0, 0, 2) - ZEND_ARG_INFO(0, result) - ZEND_ARG_INFO(0, offset) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_result, 0, 0, 3) - ZEND_ARG_INFO(0, result) - ZEND_ARG_INFO(0, row) - ZEND_ARG_INFO(0, field) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_affected_rows, 0, 0, 0) - ZEND_ARG_INFO(0, link_id) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_min_client_severity, 0, 0, 1) - ZEND_ARG_INFO(0, severity) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_min_server_severity, 0, 0, 1) - ZEND_ARG_INFO(0, severity) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_deadlock_retry_count, 0, 0, 1) - ZEND_ARG_INFO(0, retry_count) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_sybase_set_message_handler, 0, 0, 1) - ZEND_ARG_INFO(0, error_func) - ZEND_ARG_INFO(0, connection) -ZEND_END_ARG_INFO() -/* }}} */ - -const zend_function_entry sybase_functions[] = { - PHP_FE(sybase_connect, arginfo_sybase_connect) - PHP_FE(sybase_pconnect, arginfo_sybase_pconnect) - PHP_FE(sybase_close, arginfo_sybase_close) - PHP_FE(sybase_select_db, arginfo_sybase_select_db) - PHP_FE(sybase_query, arginfo_sybase_query) - PHP_FE(sybase_unbuffered_query, arginfo_sybase_unbuffered_query) - PHP_FE(sybase_free_result, arginfo_sybase_free_result) - PHP_FE(sybase_get_last_message, arginfo_sybase_get_last_message) - PHP_FE(sybase_num_rows, arginfo_sybase_num_rows) - PHP_FE(sybase_num_fields, arginfo_sybase_num_fields) - PHP_FE(sybase_fetch_row, arginfo_sybase_fetch_row) - PHP_FE(sybase_fetch_array, arginfo_sybase_fetch_array) - PHP_FE(sybase_fetch_assoc, arginfo_sybase_fetch_assoc) - PHP_FE(sybase_fetch_object, arginfo_sybase_fetch_object) - PHP_FE(sybase_data_seek, arginfo_sybase_data_seek) - PHP_FE(sybase_fetch_field, arginfo_sybase_fetch_field) - PHP_FE(sybase_field_seek, arginfo_sybase_field_seek) - PHP_FE(sybase_result, arginfo_sybase_result) - PHP_FE(sybase_affected_rows, arginfo_sybase_affected_rows) - PHP_FE(sybase_min_client_severity, arginfo_sybase_min_client_severity) - PHP_FE(sybase_min_server_severity, arginfo_sybase_min_server_severity) - PHP_FE(sybase_set_message_handler, arginfo_sybase_set_message_handler) - PHP_FE(sybase_deadlock_retry_count, arginfo_sybase_deadlock_retry_count) - -#if !defined(PHP_WIN32) && !defined(HAVE_MSSQL) - PHP_FALIAS(mssql_connect, sybase_connect, arginfo_sybase_connect) - PHP_FALIAS(mssql_pconnect, sybase_pconnect, arginfo_sybase_pconnect) - PHP_FALIAS(mssql_close, sybase_close, arginfo_sybase_close) - PHP_FALIAS(mssql_select_db, sybase_select_db, arginfo_sybase_select_db) - PHP_FALIAS(mssql_query, sybase_query, arginfo_sybase_query) - PHP_FALIAS(mssql_unbuffered_query, sybase_unbuffered_query, arginfo_sybase_unbuffered_query) - PHP_FALIAS(mssql_free_result, sybase_free_result, arginfo_sybase_free_result) - PHP_FALIAS(mssql_get_last_message, sybase_get_last_message, arginfo_sybase_get_last_message) - PHP_FALIAS(mssql_num_rows, sybase_num_rows, arginfo_sybase_num_rows) - PHP_FALIAS(mssql_num_fields, sybase_num_fields, arginfo_sybase_num_fields) - PHP_FALIAS(mssql_fetch_row, sybase_fetch_row, arginfo_sybase_fetch_row) - PHP_FALIAS(mssql_fetch_array, sybase_fetch_array, arginfo_sybase_fetch_array) - PHP_FALIAS(mssql_fetch_assoc, sybase_fetch_assoc, arginfo_sybase_fetch_assoc) - PHP_FALIAS(mssql_fetch_object, sybase_fetch_object, arginfo_sybase_fetch_object) - PHP_FALIAS(mssql_data_seek, sybase_data_seek, arginfo_sybase_data_seek) - PHP_FALIAS(mssql_fetch_field, sybase_fetch_field, arginfo_sybase_fetch_field) - PHP_FALIAS(mssql_field_seek, sybase_field_seek, arginfo_sybase_field_seek) - PHP_FALIAS(mssql_result, sybase_result, arginfo_sybase_result) - PHP_FALIAS(mssql_affected_rows, sybase_affected_rows, arginfo_sybase_affected_rows) - PHP_FALIAS(mssql_min_client_severity, sybase_min_client_severity, arginfo_sybase_min_client_severity) - PHP_FALIAS(mssql_min_server_severity, sybase_min_server_severity, arginfo_sybase_min_server_severity) - PHP_FALIAS(mssql_set_message_handler, sybase_set_message_handler, arginfo_sybase_set_message_handler) - PHP_FALIAS(mssql_deadlock_retry_count, sybase_deadlock_retry_count, arginfo_sybase_deadlock_retry_count) -#endif - PHP_FE_END -}; - -zend_module_entry sybase_module_entry = { - STANDARD_MODULE_HEADER, - "sybase_ct", - sybase_functions, - PHP_MINIT(sybase), - PHP_MSHUTDOWN(sybase), - PHP_RINIT(sybase), - PHP_RSHUTDOWN(sybase), - PHP_MINFO(sybase), - NO_VERSION_YET, - PHP_MODULE_GLOBALS(sybase), - PHP_GINIT(sybase), - PHP_GSHUTDOWN(sybase), - NULL, - STANDARD_MODULE_PROPERTIES_EX -}; - -/* static CS_CONTEXT *context; */ - -#ifdef COMPILE_DL_SYBASE_CT -ZEND_GET_MODULE(sybase) -#endif - -ZEND_DECLARE_MODULE_GLOBALS(sybase) - -#define CHECK_LINK(link) { if (link==-1) { php_error_docref(NULL, E_WARNING, "Sybase: A link to the server could not be established"); RETURN_FALSE; } } - - -static int _clean_invalid_results(zend_rsrc_list_entry *le) -{ - if (Z_TYPE_P(le) == le_result) { - sybase_link *sybase_ptr = ((sybase_result *) le->ptr)->sybase_ptr; - - if (!sybase_ptr->valid) { - return 1; - } - } - return 0; -} - -#define efree_n(x) { efree(x); x = NULL; } -#define efree_if(x) if (x) efree_n(x) - -#ifdef PHP_SYBASE_DEBUG -#define FREE_SYBASE_RESULT(result) \ - if (result) { \ - fprintf(stderr, "_free_sybase_result(%p) called from line #%d\n", result, __LINE__); \ - fflush(stderr); \ - _free_sybase_result(result); \ - result = NULL; \ - } -#else -#define FREE_SYBASE_RESULT(result) \ - if (result) { \ - _free_sybase_result(result); \ - result = NULL; \ - } -#endif -static void _free_sybase_result(sybase_result *result) -{ - int i, j; - - if (result->data) { - for (i = 0; i < (result->store ? result->num_rows : MIN(1, result->num_rows)); i++) { - for (j=0; j<result->num_fields; j++) { - zval_dtor(&result->data[i][j]); - } - efree(result->data[i]); - } - efree(result->data); - } - - if (result->fields) { - for (i=0; i<result->num_fields; i++) { - zend_string_free(result->fields[i].name); - zend_string_free(result->fields[i].column_source); - } - efree(result->fields); - } - - if (result->tmp_buffer) { - for (i=0; i<result->num_fields; i++) { - efree(result->tmp_buffer[i]); - } - efree(result->tmp_buffer); - } - - efree_if(result->lengths); - efree_if(result->indicators); - efree_if(result->datafmt); - efree_if(result->numerics); - efree_if(result->types); - - efree(result); -} - -/* Forward declaration */ -static int php_sybase_finish_results (sybase_result *result); - -static void php_free_sybase_result(zend_rsrc_list_entry *rsrc) -{ - sybase_result *result = (sybase_result *)rsrc->ptr; - - /* Check to see if we've read all rows */ - if (result->sybase_ptr && result->sybase_ptr->active_result_index) { - if (result->sybase_ptr->cmd) { - ct_cancel(NULL, result->sybase_ptr->cmd, CS_CANCEL_ALL); - } - php_sybase_finish_results(result); - } - - FREE_SYBASE_RESULT(result); -} - -static void _close_sybase_link(zend_rsrc_list_entry *rsrc) -{ - sybase_link *sybase_ptr = (sybase_link *)rsrc->ptr; - CS_INT con_status; - - sybase_ptr->valid = 0; - if (sybase_ptr->callback_name != NULL) { - zval_ptr_dtor(&sybase_ptr->callback_name); - sybase_ptr->callback_name= NULL; - } - zend_hash_apply(&EG(regular_list), (apply_func_t) _clean_invalid_results); - - /* Non-persistent connections will always be connected or we wouldn't - * get here, but since we want to check the death status anyway - * we might as well double-check the connect status. - */ - if (ct_con_props(sybase_ptr->connection, CS_GET, CS_CON_STATUS, - &con_status, CS_UNUSED, NULL)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to get connection status on close"); - /* Assume the worst. */ - con_status = CS_CONSTAT_CONNECTED | CS_CONSTAT_DEAD; - } - if (con_status & CS_CONSTAT_CONNECTED) { - if ((con_status & CS_CONSTAT_DEAD) || ct_close(sybase_ptr->connection, CS_UNUSED)!=CS_SUCCEED) { - ct_close(sybase_ptr->connection, CS_FORCE_CLOSE); - } - } - - ct_cmd_drop(sybase_ptr->cmd); - ct_con_drop(sybase_ptr->connection); - efree(sybase_ptr); - SybCtG(num_links)--; -} - - -static void _close_sybase_plink(zend_rsrc_list_entry *rsrc) -{ - sybase_link *sybase_ptr = (sybase_link *)rsrc->ptr; - CS_INT con_status; - - /* Persistent connections may have been closed before a failed - * reopen attempt. - */ - if (ct_con_props(sybase_ptr->connection, CS_GET, CS_CON_STATUS, - &con_status, CS_UNUSED, NULL)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to get connection status on close"); - /* Assume the worst. */ - con_status = CS_CONSTAT_CONNECTED | CS_CONSTAT_DEAD; - } - if (con_status & CS_CONSTAT_CONNECTED) { - if ((con_status & CS_CONSTAT_DEAD) || ct_close(sybase_ptr->connection, CS_UNUSED)!=CS_SUCCEED) { - ct_close(sybase_ptr->connection, CS_FORCE_CLOSE); - } - } - - ct_con_drop(sybase_ptr->connection); - free(sybase_ptr); - SybCtG(num_persistent)--; - SybCtG(num_links)--; -} - - -static CS_RETCODE CS_PUBLIC _client_message_handler(CS_CONTEXT *context, CS_CONNECTION *connection, CS_CLIENTMSG *errmsg) -{ - - if (CS_SEVERITY(errmsg->msgnumber) >= SybCtG(min_client_severity)) { - php_error_docref(NULL, E_WARNING, "Sybase: Client message: %s (severity %ld)", errmsg->msgstring, (long)CS_SEVERITY(errmsg->msgnumber)); - } - zend_string_free(SybCtG(server_message)); - SybCtG(server_message) = estrdup(errmsg->msgstring); - - - /* If this is a timeout message, return CS_FAIL to cancel the - * operation and mark the connection as dead. - */ - if (CS_SEVERITY(errmsg->msgnumber) == CS_SV_RETRY_FAIL && - CS_NUMBER(errmsg->msgnumber) == 63 && - CS_ORIGIN(errmsg->msgnumber) == 2 && - CS_LAYER(errmsg->msgnumber) == 1) - { - return CS_FAIL; - } - - return CS_SUCCEED; -} - -static int _call_message_handler(zval *callback_name, CS_SERVERMSG *srvmsg) -{ - int handled = 0; - zval *msgnumber, *severity, *state, *line, *text, *retval = NULL; - zval **args[5]; - - /* Border case - empty fcall */ - if (NULL == callback_name) return 0; - - /* Build arguments */ - MAKE_STD_ZVAL(msgnumber); - ZVAL_LONG(msgnumber, srvmsg->msgnumber); - args[0] = &msgnumber; - - MAKE_STD_ZVAL(severity); - ZVAL_LONG(severity, srvmsg->severity); - args[1] = &severity; - - MAKE_STD_ZVAL(state); - ZVAL_LONG(state, srvmsg->state); - args[2] = &state; - - MAKE_STD_ZVAL(line); - ZVAL_LONG(line, srvmsg->line); - args[3] = &line; - - MAKE_STD_ZVAL(text); - ZVAL_STRING(text, srvmsg->text, 1); - args[4] = &text; - - if (call_user_function_ex(EG(function_table), NULL, callback_name, &retval, 5, args, 0, NULL) == FAILURE) { - zval expr_copy; - int use_copy; - - use_copy = zend_make_printable_zval(callback_name, &expr_copy); - php_error_docref(NULL, E_WARNING, "Sybase: Cannot call the messagehandler %s", Z_STRVAL(expr_copy)); - zval_dtor(&expr_copy); - } - - if (retval) { - handled = ((Z_TYPE_P(retval) != IS_BOOL) || (Z_BVAL_P(retval) != 0)); - zval_ptr_dtor(&retval); - } else { - handled = 0; - } - - zval_ptr_dtor(&msgnumber); - zval_ptr_dtor(&severity); - zval_ptr_dtor(&state); - zval_ptr_dtor(&line); - zval_ptr_dtor(&text); - - return handled; -} - -static CS_RETCODE CS_PUBLIC _server_message_handler(CS_CONTEXT *context, CS_CONNECTION *connection, CS_SERVERMSG *srvmsg) -{ - sybase_link *sybase; - int handled = 0; - - /* Remember the last server message in any case */ - zend_string_free(SybCtG(server_message)); - SybCtG(server_message) = estrdup(srvmsg->text); - - /* Retrieve sybase link */ - if (ct_con_props(connection, CS_GET, CS_USERDATA, &sybase, CS_SIZEOF(sybase), NULL) != CS_SUCCEED) { - sybase = NULL; - } - - /* If this is a deadlock message, set the connection's deadlock flag - * so we will retry the request. Sorry about the bare constant here, - * but it's not defined anywhere and it's a "well-known" number. - */ - if (sybase && (srvmsg->msgnumber == 1205)) { - sybase->deadlock = 1; - } - - /* Check mininum server severity level */ - if (srvmsg->severity < SybCtG(min_server_severity)) { - return CS_SUCCEED; - } - - /* Call global message handler */ - handled = handled | _call_message_handler(SybCtG(callback_name), srvmsg); - - /* Call link specific message handler */ - if (sybase) { - handled = handled | _call_message_handler(sybase->callback_name, srvmsg); - } - - /* Spit out a warning if neither of them has handled this message */ - if (!handled) { - php_error_docref(NULL, E_WARNING, "Sybase: Server message: %s (severity %ld, procedure %s)", - srvmsg->text, (long)srvmsg->severity, ((srvmsg->proclen>0) ? srvmsg->proc : "N/A")); - } - - return CS_SUCCEED; -} - - -PHP_INI_BEGIN() - STD_PHP_INI_BOOLEAN("sybct.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateLong, allow_persistent, zend_sybase_globals, sybase_globals) - STD_PHP_INI_ENTRY_EX("sybct.max_persistent", "-1", PHP_INI_SYSTEM, OnUpdateLong, max_persistent, zend_sybase_globals, sybase_globals, display_link_numbers) - STD_PHP_INI_ENTRY_EX("sybct.max_links", "-1", PHP_INI_SYSTEM, OnUpdateLong, max_links, zend_sybase_globals, sybase_globals, display_link_numbers) - STD_PHP_INI_ENTRY("sybct.min_server_severity", "10", PHP_INI_ALL, OnUpdateLong, min_server_severity, zend_sybase_globals, sybase_globals) - STD_PHP_INI_ENTRY("sybct.min_client_severity", "10", PHP_INI_ALL, OnUpdateLong, min_client_severity, zend_sybase_globals, sybase_globals) - STD_PHP_INI_ENTRY("sybct.login_timeout", "-1", PHP_INI_ALL, OnUpdateLong, login_timeout, zend_sybase_globals, sybase_globals) - STD_PHP_INI_ENTRY("sybct.hostname", NULL, PHP_INI_ALL, OnUpdateString, hostname, zend_sybase_globals, sybase_globals) - STD_PHP_INI_ENTRY_EX("sybct.deadlock_retry_count", "0", PHP_INI_ALL, OnUpdateLong, deadlock_retry_count, zend_sybase_globals, sybase_globals, display_link_numbers) -PHP_INI_END() - - -static PHP_GINIT_FUNCTION(sybase) -{ - long opt; - - if (cs_ctx_alloc(CTLIB_VERSION, &sybase_globals->context)!=CS_SUCCEED || ct_init(sybase_globals->context, CTLIB_VERSION)!=CS_SUCCEED) { - return; - } - - /* Initialize message handlers */ - if (ct_callback(sybase_globals->context, NULL, CS_SET, CS_SERVERMSG_CB, (CS_VOID *)_server_message_handler)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to set server message handler"); - } - - if (ct_callback(sybase_globals->context, NULL, CS_SET, CS_CLIENTMSG_CB, (CS_VOID *)_client_message_handler)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to set client message handler"); - } - - /* Set datetime conversion format to "Nov 3 1998 8:06PM". - * This is the default format for the ct-lib that comes with - * Sybase ASE 11.5.1 for Solaris, but the Linux libraries that - * come with 11.0.3.3 default to "03/11/98" which is singularly - * useless. This levels the playing field for all platforms. - */ - { - CS_INT dt_convfmt = CS_DATES_SHORT; - if (cs_dt_info(sybase_globals->context, CS_SET, NULL, CS_DT_CONVFMT, CS_UNUSED, &dt_convfmt, sizeof(dt_convfmt), NULL)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to set datetime conversion format"); - } - } - - /* Set the timeout, which is per context and can't be set with - * ct_con_props(), so set it globally from the config value if - * requested. The default is CS_NO_LIMIT. - * - * Note that despite some noise in the documentation about using - * signals to implement timeouts, they are actually implemented - * by using poll() or select() on Solaris and Linux. - */ - if (cfg_get_long("sybct.timeout", &opt)==SUCCESS) { - CS_INT cs_timeout = opt; - if (ct_config(sybase_globals->context, CS_SET, CS_TIMEOUT, &cs_timeout, CS_UNUSED, NULL)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to update the timeout"); - } - } - - sybase_globals->num_persistent=0; - sybase_globals->callback_name = NULL; -} - - -static PHP_GSHUTDOWN_FUNCTION(sybase) -{ - ct_exit(sybase_globals->context, CS_UNUSED); - cs_ctx_drop(sybase_globals->context); -} - -PHP_MINIT_FUNCTION(sybase) -{ - REGISTER_INI_ENTRIES(); - - le_link = zend_register_list_destructors_ex(_close_sybase_link, NULL, "sybase-ct link", module_number); - le_plink = zend_register_list_destructors_ex(NULL, _close_sybase_plink, "sybase-ct link persistent", module_number); - le_result = zend_register_list_destructors_ex(php_free_sybase_result, NULL, "sybase-ct result", module_number); - - return SUCCESS; -} - - - -PHP_RINIT_FUNCTION(sybase) -{ - SybCtG(default_link)=-1; - SybCtG(num_links) = SybCtG(num_persistent); - SybCtG(appname) = estrndup("PHP " PHP_VERSION, sizeof("PHP " PHP_VERSION)); - SybCtG(server_message) = STR_EMPTY_ALLOC(); - return SUCCESS; -} - - - -PHP_MSHUTDOWN_FUNCTION(sybase) -{ - UNREGISTER_INI_ENTRIES(); -#if 0 - ct_exit(context, CS_UNUSED); - cs_ctx_drop(context); -#endif - return SUCCESS; -} - - -PHP_RSHUTDOWN_FUNCTION(sybase) -{ - efree(SybCtG(appname)); - SybCtG(appname) = NULL; - if (SybCtG(callback_name)) { - zval_ptr_dtor(&SybCtG(callback_name)); - SybCtG(callback_name)= NULL; - } - zend_string_free(SybCtG(server_message)); - SybCtG(server_message) = NULL; - return SUCCESS; -} - - -static int php_sybase_do_connect_internal(sybase_link *sybase, char *host, char *user, char *passwd, char *charset, char *appname) -{ - CS_LOCALE *tmp_locale; - long packetsize; - - /* set a CS_CONNECTION record */ - if (ct_con_alloc(SybCtG(context), &sybase->connection)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to allocate connection record"); - return 0; - } - - /* Note - this saves a copy of sybase, not a pointer to it. */ - if (ct_con_props(sybase->connection, CS_SET, CS_USERDATA, &sybase, CS_SIZEOF(sybase), NULL)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to set userdata"); - ct_con_drop(sybase->connection); - return 0; - } - - if (user) { - ct_con_props(sybase->connection, CS_SET, CS_USERNAME, user, CS_NULLTERM, NULL); - } - if (passwd) { - ct_con_props(sybase->connection, CS_SET, CS_PASSWORD, passwd, CS_NULLTERM, NULL); - } - if (appname) { - ct_con_props(sybase->connection, CS_SET, CS_APPNAME, appname, CS_NULLTERM, NULL); - } else { - ct_con_props(sybase->connection, CS_SET, CS_APPNAME, SybCtG(appname), CS_NULLTERM, NULL); - } - - if (SybCtG(hostname)) { - ct_con_props(sybase->connection, CS_SET, CS_HOSTNAME, SybCtG(hostname), CS_NULLTERM, NULL); - } - - if (charset) { - if (cs_loc_alloc(SybCtG(context), &tmp_locale)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to allocate locale information"); - } else { - if (cs_locale(SybCtG(context), CS_SET, tmp_locale, CS_LC_ALL, NULL, CS_NULLTERM, NULL)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to load default locale data"); - } else { - if (cs_locale(SybCtG(context), CS_SET, tmp_locale, CS_SYB_CHARSET, charset, CS_NULLTERM, NULL)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to update character set"); - } else { - if (ct_con_props(sybase->connection, CS_SET, CS_LOC_PROP, tmp_locale, CS_UNUSED, NULL)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to update connection properties"); - } - } - } - } - } - - if (cfg_get_long("sybct.packet_size", &packetsize) == SUCCESS) { - if (ct_con_props(sybase->connection, CS_SET, CS_PACKETSIZE, (CS_VOID *)&packetsize, CS_UNUSED, NULL) != CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to update connection packetsize"); - } - } - - /* Set the login timeout. Actually, the login timeout is per context - * and not per connection, but we will update the context here to - * allow for code such as the following: - * - * ini_set('sybct.login_timeout', $timeout); - * sybase_connect(...) - * - * Note that preceding calls to sybase_connect() will now use the - * updated value and not the default one! - * - * The default value for CS_LOGIN_TIMEOUT is 60 (1 minute). - */ - if (SybCtG(login_timeout) != -1) { - CS_INT cs_login_timeout = SybCtG(login_timeout); - if (ct_config(SybCtG(context), CS_SET, CS_LOGIN_TIMEOUT, &cs_login_timeout, CS_UNUSED, NULL)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to update the login timeout"); - } - } - - sybase->valid = 1; - sybase->dead = 0; - sybase->active_result_index = 0; - sybase->callback_name = NULL; - - /* create the link */ - if (ct_connect(sybase->connection, host, CS_NULLTERM)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to connect"); - ct_con_drop(sybase->connection); - return 0; - } - - if (ct_cmd_alloc(sybase->connection, &sybase->cmd)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to allocate command record"); - ct_close(sybase->connection, CS_UNUSED); - ct_con_drop(sybase->connection); - return 0; - } - - return 1; -} - - -static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) -{ - char *user = NULL, *passwd = NULL, *host = NULL, *charset = NULL, *appname = NULL; - char *hashed_details; - int hashed_details_length, len; - zend_bool new = 0; - sybase_link *sybase_ptr; - - host= user= passwd= charset= appname= NULL; - if (persistent) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s!s!s!s!s!", &host, &len, &user, &len, &passwd, &len, &charset, &len, &appname, &len) == FAILURE) { - return; - } - } else { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s!s!s!s!s!b", &host, &len, &user, &len, &passwd, &len, &charset, &len, &appname, &len, &new) == FAILURE) { - return; - } - } - hashed_details_length = spprintf( - &hashed_details, - 0, - "sybase_%s_%s_%s_%s_%s", - host ? host : "", - user ? user : "", - passwd ? passwd : "", - charset ? charset : "", - appname ? appname : "" - ); - - if (!SybCtG(allow_persistent)) { - persistent=0; - } - if (persistent) { - zend_rsrc_list_entry *le; - - /* try to find if we already have this link in our persistent list */ - if (zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_length+1, (void **) &le)==FAILURE) { /* we don't */ - zend_rsrc_list_entry new_le; - - if (SybCtG(max_links)!=-1 && SybCtG(num_links)>=SybCtG(max_links)) { - php_error_docref(NULL, E_WARNING, "Sybase: Too many open links (%ld)", SybCtG(num_links)); - efree(hashed_details); - RETURN_FALSE; - } - if (SybCtG(max_persistent)!=-1 && SybCtG(num_persistent)>=SybCtG(max_persistent)) { - php_error_docref(NULL, E_WARNING, "Sybase: Too many open persistent links (%ld)", SybCtG(num_persistent)); - efree(hashed_details); - RETURN_FALSE; - } - - sybase_ptr = (sybase_link *) malloc(sizeof(sybase_link)); - if (!sybase_ptr) { - efree(hashed_details); - RETURN_FALSE; - } - if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd, charset, appname)) { - free(sybase_ptr); - efree(hashed_details); - RETURN_FALSE; - } - - /* hash it up */ - Z_TYPE(new_le) = le_plink; - new_le.ptr = sybase_ptr; - if (zend_hash_update(&EG(persistent_list), hashed_details, hashed_details_length+1, (void *) &new_le, sizeof(zend_rsrc_list_entry), NULL)==FAILURE) { - ct_close(sybase_ptr->connection, CS_UNUSED); - ct_con_drop(sybase_ptr->connection); - free(sybase_ptr); - efree(hashed_details); - RETURN_FALSE; - } - SybCtG(num_persistent)++; - SybCtG(num_links)++; - } else { /* we do */ - CS_INT con_status; - - if (Z_TYPE_P(le) != le_plink) { - efree(hashed_details); - RETURN_FALSE; - } - - sybase_ptr = (sybase_link *) le->ptr; - - /* If the link has died, close it and overwrite it with a new one. */ - - if (ct_con_props(sybase_ptr->connection, CS_GET, CS_CON_STATUS, - &con_status, CS_UNUSED, NULL)!=CS_SUCCEED) { - php_error_docref(NULL, E_WARNING, "Sybase: Unable to get connection status"); - efree(hashed_details); - RETURN_FALSE; - } - if (!(con_status & CS_CONSTAT_CONNECTED) || (con_status & CS_CONSTAT_DEAD) || sybase_ptr->dead) { - sybase_link sybase; - - if (con_status & CS_CONSTAT_CONNECTED) { - ct_close(sybase_ptr->connection, CS_FORCE_CLOSE); - } - /* Create a new connection, then replace the old - * connection. If we fail to create a new connection, - * put the old one back so there will be a connection, - * even if it is a non-functional one. This is because - * code may still be holding an id for this connection - * so we can't free the CS_CONNECTION. - * (This is actually totally hokey, it would be better - * to just ct_con_drop() the connection and set - * sybase_ptr->connection to NULL, then test it for - * NULL before trying to use it elsewhere . . .) - */ - memcpy(&sybase, sybase_ptr, sizeof(sybase_link)); - if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd, charset, appname)) { - memcpy(sybase_ptr, &sybase, sizeof(sybase_link)); - efree(hashed_details); - RETURN_FALSE; - } - ct_con_drop(sybase.connection); /* drop old connection */ - } - } - ZEND_REGISTER_RESOURCE(return_value, sybase_ptr, le_plink); - } else { /* non persistent */ - zend_rsrc_list_entry *index_ptr, new_index_ptr; - - /* first we check the hash for the hashed_details key. if it exists, - * it should point us to the right offset where the actual sybase link sits. - * if it doesn't, open a new sybase link, add it to the resource list, - * and add a pointer to it with hashed_details as the key. - */ - if (!new && zend_hash_find(&EG(regular_list), hashed_details, hashed_details_length+1, (void **) &index_ptr)==SUCCESS) { - int type, link; - void *ptr; - - if (Z_TYPE_P(index_ptr) != le_index_ptr) { - efree(hashed_details); - RETURN_FALSE; - } - link = (int) index_ptr->ptr; - ptr = zend_list_find(link, &type); /* check if the link is still there */ - if (ptr && (type==le_link || type==le_plink)) { - zend_list_addref(link); - Z_LVAL_P(return_value) = SybCtG(default_link) = link; - Z_TYPE_P(return_value) = IS_RESOURCE; - efree(hashed_details); - return; - } else { - zend_hash_del(&EG(regular_list), hashed_details, hashed_details_length+1); - } - } - if (SybCtG(max_links)!=-1 && SybCtG(num_links)>=SybCtG(max_links)) { - php_error_docref(NULL, E_WARNING, "Sybase: Too many open links (%ld)", SybCtG(num_links)); - efree(hashed_details); - RETURN_FALSE; - } - - sybase_ptr = (sybase_link *) emalloc(sizeof(sybase_link)); - if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd, charset, appname)) { - efree(sybase_ptr); - efree(hashed_details); - RETURN_FALSE; - } - - /* add it to the list */ - ZEND_REGISTER_RESOURCE(return_value, sybase_ptr, le_link); - - /* add it to the hash */ - new_index_ptr.ptr = (void *) Z_LVAL_P(return_value); - Z_TYPE(new_index_ptr) = le_index_ptr; - if (zend_hash_update(&EG(regular_list), hashed_details, hashed_details_length+1, (void *) &new_index_ptr, sizeof(zend_rsrc_list_entry), NULL)==FAILURE) { - ct_close(sybase_ptr->connection, CS_UNUSED); - ct_con_drop(sybase_ptr->connection); - efree(sybase_ptr); - efree(hashed_details); - RETURN_FALSE; - } - SybCtG(num_links)++; - } - efree(hashed_details); - SybCtG(default_link)=Z_LVAL_P(return_value); - zend_list_addref(SybCtG(default_link)); -} - - -static int php_sybase_get_default_link(INTERNAL_FUNCTION_PARAMETERS) -{ - if (SybCtG(default_link)==-1) { /* no link opened yet, implicitly open one */ - ht = 0; - php_sybase_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); - } - return SybCtG(default_link); -} - - -/* {{{ proto int sybase_connect([string host [, string user [, string password [, string charset [, string appname [, bool new]]]]]]) - Open Sybase server connection */ -PHP_FUNCTION(sybase_connect) -{ - php_sybase_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); -} - -/* }}} */ - -/* {{{ proto int sybase_pconnect([string host [, string user [, string password [, string charset [, string appname]]]]]) - Open persistent Sybase connection */ -PHP_FUNCTION(sybase_pconnect) -{ - php_sybase_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); -} - -/* }}} */ - -inline static int php_sybase_connection_id(zval *sybase_link_index, int *id) -{ - if (NULL == sybase_link_index) { - if (-1 == SybCtG(default_link)) { - return FAILURE; - } - *id = SybCtG(default_link); - } else { - *id = -1; /* explicit resource number */ - } - return SUCCESS; -} - -/* {{{ proto bool sybase_close([resource link_id]) - Close Sybase connection */ -PHP_FUNCTION(sybase_close) -{ - zval *sybase_link_index = NULL; - sybase_link *sybase_ptr; - int id; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|r", &sybase_link_index) == FAILURE) { - return; - } - - if (php_sybase_connection_id(sybase_link_index, &id) == FAILURE) { - php_error_docref(NULL, E_WARNING, "Sybase: No connection to close"); - RETURN_FALSE; - } - - ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, &sybase_link_index, id, "Sybase-Link", le_link, le_plink); - - if (id == -1) { - zend_list_delete(Z_RESVAL_P(sybase_link_index)); - } - if (id != -1 || (sybase_link_index && Z_RESVAL_P(sybase_link_index) == SybCtG(default_link))) { - zend_list_delete(SybCtG(default_link)); - SybCtG(default_link) = -1; - } - - RETURN_TRUE; -} - -/* }}} */ - - -static int exec_cmd(sybase_link *sybase_ptr, char *cmdbuf) -{ - CS_RETCODE retcode; - CS_INT restype; - int failure=0; - - /* Fail if we already marked this connection dead. */ - - if (sybase_ptr->dead) { - return FAILURE; - } - - /* - ** Get a command handle, store the command string in it, and - ** send it to the server. - */ - - if (ct_command(sybase_ptr->cmd, CS_LANG_CMD, cmdbuf, CS_NULLTERM, CS_UNUSED)!=CS_SUCCEED) { - sybase_ptr->dead = 1; - return FAILURE; - } - if (ct_send(sybase_ptr->cmd)!=CS_SUCCEED) { - sybase_ptr->dead = 1; - return FAILURE; - } - - while ((retcode = ct_results(sybase_ptr->cmd, &restype))==CS_SUCCEED) { - switch ((int) restype) { - case CS_CMD_SUCCEED: - case CS_CMD_DONE: - break; - - case CS_CMD_FAIL: - failure=1; - break; - - case CS_STATUS_RESULT: - ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_CURRENT); - break; - - default: - failure=1; - break; - } - if (failure) { - ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL); - return FAILURE; - } - } - - switch (retcode) { - case CS_END_RESULTS: - return SUCCESS; - break; - - case CS_FAIL: - /* Hopefully this either cleans up the connection, or the - * connection ends up marked dead so it will be reopened - * if it is persistent. We may want to do - * ct_close(CS_FORCE_CLOSE) if ct_cancel() fails; see the - * doc for ct_results()==CS_FAIL. - */ - ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL); - /* Don't take chances with the vagaries of ct-lib. Mark it - * dead ourselves. - */ - sybase_ptr->dead = 1; - return FAILURE; - - default: - return FAILURE; - } -} - - -/* {{{ proto bool sybase_select_db(string database [, resource link_id]) - Select Sybase database */ -PHP_FUNCTION(sybase_select_db) -{ - zval *sybase_link_index = NULL; - char *db, *cmdbuf; - int id, len; - sybase_link *sybase_ptr; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|r", &db, &len, &sybase_link_index) == FAILURE) { - return; - } - - if (php_sybase_connection_id(sybase_link_index, &id) == FAILURE) { - php_error_docref(NULL, E_WARNING, "Sybase: No connection"); - RETURN_FALSE; - } - - ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, &sybase_link_index, id, "Sybase-Link", le_link, le_plink); - - spprintf(&cmdbuf, 4 + len + 1, "use %s", db); - if (exec_cmd(sybase_ptr, cmdbuf) == FAILURE) { - efree(cmdbuf); - RETURN_FALSE; - } else { - efree(cmdbuf); - RETURN_TRUE; - } -} - -/* }}} */ - -static int php_sybase_finish_results(sybase_result *result) -{ - int i, fail; - CS_RETCODE retcode; - CS_INT restype; - - efree_n(result->datafmt); - efree_n(result->lengths); - efree_n(result->indicators); - efree_n(result->numerics); - efree_n(result->types); - for (i=0; i<result->num_fields; i++) { - efree(result->tmp_buffer[i]); - } - efree_n(result->tmp_buffer); - - /* Indicate we have read all rows */ - result->sybase_ptr->active_result_index= 0; - - /* The only restype we should get now is CS_CMD_DONE, possibly - * followed by a CS_STATUS_RESULT/CS_CMD_SUCCEED/CS_CMD_DONE - * sequence if the command was a stored procedure call. But we - * still need to read and discard unexpected results. We might - * want to return a failure in this case because the application - * won't be getting all the results it asked for. - */ - fail = 0; - while ((retcode = ct_results(result->sybase_ptr->cmd, &restype))==CS_SUCCEED) { - switch ((int) restype) { - case CS_CMD_SUCCEED: - case CS_CMD_DONE: - break; - - case CS_CMD_FAIL: - php_error_docref(NULL, E_WARNING, "Sybase: Command failed, canceling rest"); - ct_cancel(NULL, result->sybase_ptr->cmd, CS_CANCEL_ALL); - fail = 1; - break; - - case CS_COMPUTE_RESULT: - case CS_CURSOR_RESULT: - case CS_PARAM_RESULT: - case CS_ROW_RESULT: - /* Unexpected results, cancel them. */ - php_error_docref(NULL, E_NOTICE, "Sybase: Unexpected results, canceling current"); - ct_cancel(NULL, result->sybase_ptr->cmd, CS_CANCEL_CURRENT); - break; - - case CS_STATUS_RESULT: - /* Status result from a stored procedure, cancel it but do not tell user */ - ct_cancel(NULL, result->sybase_ptr->cmd, CS_CANCEL_CURRENT); - break; - - default: - php_error_docref(NULL, E_NOTICE, "Sybase: Unexpected results, canceling all"); - ct_cancel(NULL, result->sybase_ptr->cmd, CS_CANCEL_ALL); - break; - } - - if (fail) { - break; - } - } - - switch (retcode) { - case CS_END_RESULTS: - /* Normal. */ - break; - - case CS_FAIL: - /* Hopefully this either cleans up the connection, or the - * connection ends up marked dead so it will be reopened - * if it is persistent. We may want to do - * ct_close(CS_FORCE_CLOSE) if ct_cancel() fails; see the - * doc for ct_results()==CS_FAIL. - */ - ct_cancel(NULL, result->sybase_ptr->cmd, CS_CANCEL_ALL); - /* Don't take chances with the vagaries of ct-lib. Mark it - * dead ourselves. - */ - result->sybase_ptr->dead = 1; - - case CS_CANCELED: - default: - retcode = CS_FAIL; - break; - } - - return retcode; -} - -#define RETURN_DOUBLE_VAL(result, buf, length) \ - if ((length - 1) <= EG(precision)) { \ - errno = 0; \ - Z_DVAL(result) = zend_strtod(buf, NULL); \ - if (errno != ERANGE) { \ - Z_TYPE(result) = IS_DOUBLE; \ - } else { \ - ZVAL_STRINGL(&result, buf, length- 1, 1); \ - } \ - } else { \ - ZVAL_STRINGL(&result, buf, length- 1, 1); \ - } - -static int php_sybase_fetch_result_row(sybase_result *result, int numrows) -{ - int i, j; - CS_INT retcode; - - /* We've already fetched everything */ - if (result->last_retcode == CS_END_DATA || result->last_retcode == CS_END_RESULTS) { - return result->last_retcode; - } - - if (numrows!=-1) numrows+= result->num_rows; - while ((retcode=ct_fetch(result->sybase_ptr->cmd, CS_UNUSED, CS_UNUSED, CS_UNUSED, NULL))==CS_SUCCEED || retcode == CS_ROW_FAIL) { - result->num_rows++; - i= result->store ? result->num_rows- 1 : 0; - if (i >= result->blocks_initialized*SYBASE_ROWS_BLOCK) { - result->data = (zval **) safe_erealloc(result->data, SYBASE_ROWS_BLOCK*(++result->blocks_initialized), sizeof(zval *), 0); - } - if (result->store || 1 == result->num_rows) { - result->data[i] = (zval *) safe_emalloc(sizeof(zval), result->num_fields, 0); - } - - for (j = 0; j < result->num_fields; j++) { - - /* If we are in non-storing mode, free the previous result */ - if (!result->store && result->num_rows > 1 && Z_TYPE(result->data[i][j]) == IS_STRING) { - efree(Z_STRVAL(result->data[i][j])); - } - - if (result->indicators[j] == -1) { /* null value */ - ZVAL_NULL(&result->data[i][j]); - } else { - switch (result->numerics[j]) { - case 1: { - /* This indicates a long */ - ZVAL_LONG(&result->data[i][j], strtol(result->tmp_buffer[j], NULL, 10)); - break; - } - - case 2: { - /* This indicates a float */ - RETURN_DOUBLE_VAL(result->data[i][j], result->tmp_buffer[j], result->lengths[j]); - break; - } - - case 3: { - /* This indicates either a long or a float, which ever fits */ - errno = 0; - Z_LVAL(result->data[i][j]) = strtol(result->tmp_buffer[j], NULL, 10); - if (errno == ERANGE) { - - /* An overflow occurred, so try to fit it into a double */ - RETURN_DOUBLE_VAL(result->data[i][j], result->tmp_buffer[j], result->lengths[j]); - break; - } - Z_TYPE(result->data[i][j]) = IS_LONG; - break; - } - - default: { - /* This indicates anything else, return it as string - * FreeTDS doesn't correctly set result->indicators[j] correctly - * for NULL fields in some version in conjunction with ASE 12.5 - * but instead sets result->lengths[j] to 0, which would lead to - * a negative memory allocation (and thus a segfault). - */ - if (result->lengths[j] < 1) { - ZVAL_NULL(&result->data[i][j]); - } else { - ZVAL_STRINGL(&result->data[i][j], result->tmp_buffer[j], result->lengths[j]- 1, 1); - } - break; - } - } - } - } - if (numrows!=-1 && result->num_rows>=numrows) break; - } - - if (retcode==CS_ROW_FAIL) { - php_error_docref(NULL, E_WARNING, "Sybase: Error reading row %d", result->num_rows); - return retcode; - } - result->last_retcode= retcode; - switch (retcode) { - case CS_END_DATA: - retcode = php_sybase_finish_results(result); - break; - - case CS_ROW_FAIL: - case CS_SUCCEED: - break; - - default: - FREE_SYBASE_RESULT(result); - result = NULL; - retcode = CS_FAIL; /* Just to be sure */ - break; - } - - return retcode; -} - -static sybase_result * php_sybase_fetch_result_set(sybase_link *sybase_ptr, int buffered, int store) -{ - int num_fields; - sybase_result *result; - int i, j; - CS_INT retcode; - - /* The following (if unbuffered) is more or less the equivalent of mysql_store_result(). - * fetch all rows from the server into the row buffer, thus: - * 1) Being able to fire up another query without explicitly reading all rows - * 2) Having numrows accessible - */ - if (ct_res_info(sybase_ptr->cmd, CS_NUMDATA, &num_fields, CS_UNUSED, NULL)!=CS_SUCCEED) { - return NULL; - } - - result = (sybase_result *) emalloc(sizeof(sybase_result)); - result->data = (zval **) safe_emalloc(sizeof(zval *), SYBASE_ROWS_BLOCK, 0); - result->fields = NULL; - result->sybase_ptr = sybase_ptr; - result->cur_field=result->cur_row=result->num_rows=0; - result->num_fields = num_fields; - result->last_retcode = 0; - result->store= store; - result->blocks_initialized= 1; - result->tmp_buffer = (char **) safe_emalloc(sizeof(char *), num_fields, 0); - result->lengths = (CS_INT *) safe_emalloc(sizeof(CS_INT), num_fields, 0); - result->indicators = (CS_SMALLINT *) safe_emalloc(sizeof(CS_INT), num_fields, 0); - result->datafmt = (CS_DATAFMT *) safe_emalloc(sizeof(CS_DATAFMT), num_fields, 0); - result->numerics = (unsigned char *) safe_emalloc(sizeof(unsigned char), num_fields, 0); - result->types = (CS_INT *) safe_emalloc(sizeof(CS_INT), num_fields, 0); - - for (i=0; i<num_fields; i++) { - ct_describe(sybase_ptr->cmd, i+1, &result->datafmt[i]); - result->types[i] = result->datafmt[i].datatype; - switch (result->datafmt[i].datatype) { - case CS_CHAR_TYPE: - case CS_VARCHAR_TYPE: - case CS_TEXT_TYPE: - case CS_IMAGE_TYPE: - result->datafmt[i].maxlength++; - result->numerics[i] = 0; - break; - case CS_BINARY_TYPE: - case CS_VARBINARY_TYPE: - result->datafmt[i].maxlength *= 2; - result->datafmt[i].maxlength++; - result->numerics[i] = 0; - break; - case CS_BIT_TYPE: - case CS_TINYINT_TYPE: - result->datafmt[i].maxlength = 4; - result->numerics[i] = 1; - break; - case CS_SMALLINT_TYPE: - result->datafmt[i].maxlength = 7; - result->numerics[i] = 1; - break; - case CS_INT_TYPE: - result->datafmt[i].maxlength = 12; - result->numerics[i] = 1; - break; - case CS_REAL_TYPE: - case CS_FLOAT_TYPE: - result->datafmt[i].maxlength = 24; - result->numerics[i] = 2; - break; - case CS_MONEY_TYPE: - case CS_MONEY4_TYPE: - result->datafmt[i].maxlength = 24; - result->numerics[i] = 2; - break; - case CS_DATETIME_TYPE: - case CS_DATETIME4_TYPE: - result->datafmt[i].maxlength = 30; - result->numerics[i] = 0; - break; - case CS_NUMERIC_TYPE: - case CS_DECIMAL_TYPE: - result->datafmt[i].maxlength = result->datafmt[i].precision + 3; - /* numeric(10) vs numeric(10, 1) */ - result->numerics[i] = (result->datafmt[i].scale == 0) ? 3 : 2; - break; - default: - result->datafmt[i].maxlength++; - result->numerics[i] = 0; - break; - } - result->tmp_buffer[i] = (char *)emalloc(result->datafmt[i].maxlength); - result->datafmt[i].datatype = CS_CHAR_TYPE; - result->datafmt[i].format = CS_FMT_NULLTERM; - ct_bind(sybase_ptr->cmd, i+1, &result->datafmt[i], result->tmp_buffer[i], &result->lengths[i], &result->indicators[i]); - } - - result->fields = (sybase_field *) safe_emalloc(sizeof(sybase_field), num_fields, 0); - j=0; - for (i=0; i<num_fields; i++) { - char computed_buf[16]; - - if (result->datafmt[i].namelen>0) { - result->fields[i].name = estrndup(result->datafmt[i].name, result->datafmt[i].namelen); - } else { - if (j>0) { - snprintf(computed_buf, 16, "computed%d", j); - } else { - strcpy(computed_buf, "computed"); - } - result->fields[i].name = estrdup(computed_buf); - j++; - } - result->fields[i].column_source = STR_EMPTY_ALLOC(); - result->fields[i].max_length = result->datafmt[i].maxlength-1; - result->fields[i].numeric = result->numerics[i]; - Z_TYPE(result->fields[i]) = result->types[i]; - } - - if (buffered) { - retcode = CS_SUCCEED; - } else { - if ((retcode = php_sybase_fetch_result_row(result, -1)) == CS_FAIL) { - return NULL; - } - } - - result->last_retcode = retcode; - return result; -} - -static void php_sybase_query (INTERNAL_FUNCTION_PARAMETERS, int buffered) -{ - zval *sybase_link_index = NULL; - zend_bool store = 1; - char *query; - size_t len, id, deadlock_count; - sybase_link *sybase_ptr; - sybase_result *result; - CS_INT restype; - CS_RETCODE retcode; - enum { - Q_RESULT, /* Success with results. */ - Q_SUCCESS, /* Success but no results. */ - Q_FAILURE, /* Failure, no results. */ - } status; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|rb", &query, &len, &sybase_link_index, &store) == FAILURE) { - return; - } - - if (!store && !buffered) { - php_error_docref(NULL, E_NOTICE, "Sybase: Cannot use non-storing mode with buffered queries"); - store = 1; - } - - if (php_sybase_connection_id(sybase_link_index, &id) == FAILURE) { - php_error_docref(NULL, E_WARNING, "Sybase: No connection"); - RETURN_FALSE; - } - - ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, &sybase_link_index, id, "Sybase-Link", le_link, le_plink); - - /* Fail if we already marked this connection dead. */ - if (sybase_ptr->dead) { - RETURN_FALSE; - } - - /* Check to see if a previous sybase_unbuffered_query has read all rows */ - if (sybase_ptr->active_result_index) { - zval *tmp = NULL; - - php_error_docref(NULL, E_NOTICE, "Sybase: Called without first fetching all rows from a previous unbuffered query"); - if (sybase_ptr->cmd) { - ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL); - } - - /* Get the resultset and free it */ - ALLOC_ZVAL(tmp); - Z_LVAL_P(tmp)= sybase_ptr->active_result_index; - Z_TYPE_P(tmp)= IS_RESOURCE; - INIT_PZVAL(tmp); - ZEND_FETCH_RESOURCE(result, sybase_result *, &tmp, -1, "Sybase result", le_result); - - if (result) { - php_sybase_finish_results(result); - } - - zval_ptr_dtor(&tmp); - zend_list_delete(sybase_ptr->active_result_index); - sybase_ptr->active_result_index= 0; - } - - /* Repeat until we don't deadlock. */ - deadlock_count= 0; - for (;;) { - result = NULL; - sybase_ptr->deadlock = 0; - sybase_ptr->affected_rows = 0; - - /* On Solaris 11.5, ct_command() can be moved outside the - * loop, but not on Linux 11.0. - */ - if (ct_command(sybase_ptr->cmd, CS_LANG_CMD, query, CS_NULLTERM, CS_UNUSED)!=CS_SUCCEED) { - /* If this didn't work, the connection is screwed but - * ct-lib might not set CS_CONSTAT_DEAD. So set our own - * flag. This happens sometimes when the database is restarted - * and/or its machine is rebooted, and ct_command() returns - * CS_BUSY for some reason. - */ - sybase_ptr->dead = 1; - php_error_docref(NULL, E_WARNING, "Sybase: Connection is dead"); - RETURN_FALSE; - } - - if (ct_send(sybase_ptr->cmd)!=CS_SUCCEED) { - ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL); - sybase_ptr->dead = 1; - php_error_docref(NULL, E_WARNING, "Sybase: Cannot send command"); - RETURN_FALSE; - } - - /* Use the first result set or succeed/fail status and discard the - * others. Applications really shouldn't be making calls that - * return multiple result sets, but if they do then we need to - * properly read or cancel them or the connection will become - * unusable. - */ - if (ct_results(sybase_ptr->cmd, &restype)!=CS_SUCCEED) { - ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL); - sybase_ptr->dead = 1; - php_error_docref(NULL, E_WARNING, "Sybase: Cannot read results"); - RETURN_FALSE; - } - switch ((int) restype) { - case CS_CMD_FAIL: - default: - status = Q_FAILURE; - break; - case CS_CMD_SUCCEED: - case CS_CMD_DONE: { - CS_INT row_count; - if (ct_res_info(sybase_ptr->cmd, CS_ROW_COUNT, &row_count, CS_UNUSED, NULL)==CS_SUCCEED) { - sybase_ptr->affected_rows = (long)row_count; - } - } - /* Fall through */ - case CS_COMPUTEFMT_RESULT: - case CS_ROWFMT_RESULT: - case CS_DESCRIBE_RESULT: - case CS_MSG_RESULT: - buffered= 0; /* These queries have no need for buffering */ - status = Q_SUCCESS; - break; - case CS_COMPUTE_RESULT: - case CS_CURSOR_RESULT: - case CS_PARAM_RESULT: - case CS_ROW_RESULT: - case CS_STATUS_RESULT: - result = php_sybase_fetch_result_set(sybase_ptr, buffered, store); - if (result == NULL) { - ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL); - RETURN_FALSE; - } - status = Q_RESULT; - break; - } - - /* Check for left-over results */ - if (!buffered && status != Q_RESULT) { - while ((retcode = ct_results(sybase_ptr->cmd, &restype))==CS_SUCCEED) { - switch ((int) restype) { - case CS_CMD_SUCCEED: - case CS_CMD_DONE: - break; - - case CS_CMD_FAIL: - status = Q_FAILURE; - break; - - case CS_COMPUTE_RESULT: - case CS_CURSOR_RESULT: - case CS_PARAM_RESULT: - case CS_ROW_RESULT: - if (status != Q_RESULT) { - result = php_sybase_fetch_result_set(sybase_ptr, buffered, store); - if (result == NULL) { - ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL); - sybase_ptr->dead = 1; - RETURN_FALSE; - } - status = Q_RESULT; - retcode = result->last_retcode; - } else { - /* Unexpected results, cancel them. */ - ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_CURRENT); - } - break; - case CS_STATUS_RESULT: - /* Unexpected results, cancel them. */ - ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_CURRENT); - break; - - default: - status = Q_FAILURE; - break; - } - if (status == Q_FAILURE) { - ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL); - } - if (retcode == CS_END_RESULTS) { - break; - } - } - switch (retcode) { - case CS_END_RESULTS: - /* Normal. */ - break; - - case CS_FAIL: - /* Hopefully this either cleans up the connection, or the - * connection ends up marked dead so it will be reopened - * if it is persistent. We may want to do - * ct_close(CS_FORCE_CLOSE) if ct_cancel() fails; see the - * doc for ct_results()==CS_FAIL. - */ - ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL); - /* Don't take chances with the vagaries of ct-lib. Mark it - * dead ourselves. - */ - sybase_ptr->dead = 1; - case CS_CANCELED: - default: - status = Q_FAILURE; - break; - } - } - - /* Retry deadlocks up until deadlock_retry_count times */ - if (sybase_ptr->deadlock && SybCtG(deadlock_retry_count) != -1 && ++deadlock_count > SybCtG(deadlock_retry_count)) { - php_error_docref(NULL, E_WARNING, "Sybase: Retried deadlock %d times [max: %ld], giving up", deadlock_count- 1, SybCtG(deadlock_retry_count)); - FREE_SYBASE_RESULT(result); - break; - } - - /* If query completed without deadlock, break out of the loop. - * Sometimes deadlock results in failures and sometimes not, - * it seems to depend on the server flavor. But we want to - * retry all deadlocks. - */ - if (sybase_ptr->dead || sybase_ptr->deadlock == 0) { - break; - } - - /* Get rid of any results we may have fetched. This happens: - * e.g., our result set may be a stored procedure status which - * is returned even if the stored procedure deadlocks. As an - * optimization, we could try not to fetch results in known - * deadlock conditions, but deadlock is (should be) rare. - */ - FREE_SYBASE_RESULT(result); - } - - if (status == Q_SUCCESS) { - RETURN_TRUE; - } - - if (status == Q_FAILURE) { - FREE_SYBASE_RESULT(result); - RETURN_FALSE; - } - - /* Indicate we have data in case of buffered queries */ - id= ZEND_REGISTER_RESOURCE(return_value, result, le_result); - sybase_ptr->active_result_index= buffered ? id : 0; -} - -/* {{{ proto int sybase_query(string query [, resource link_id]) - Send Sybase query */ -PHP_FUNCTION(sybase_query) -{ - php_sybase_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); -} -/* }}} */ - -/* {{{ proto int sybase_unbuffered_query(string query [, resource link_id]) - Send Sybase query */ -PHP_FUNCTION(sybase_unbuffered_query) -{ - php_sybase_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); -} - -/* {{{ proto bool sybase_free_result(resource result) - Free result memory */ -PHP_FUNCTION(sybase_free_result) -{ - zval *sybase_result_index = NULL; - sybase_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &sybase_result_index) == FAILURE) { - return; - } - ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result); - - /* Did we fetch up until the end? */ - if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS) { - /* php_error_docref(NULL, E_WARNING, "Sybase: canceling the rest of the results"); */ - ct_cancel(NULL, result->sybase_ptr->cmd, CS_CANCEL_ALL); - php_sybase_finish_results(result); - } - - zend_list_delete(Z_LVAL_P(sybase_result_index)); - RETURN_TRUE; -} - -/* }}} */ - -/* {{{ proto string sybase_get_last_message(void) - Returns the last message from server (over min_message_severity) */ -PHP_FUNCTION(sybase_get_last_message) -{ - RETURN_STRING(SybCtG(server_message), 1); -} -/* }}} */ - -/* {{{ proto int sybase_num_rows(resource result) - Get number of rows in result */ -PHP_FUNCTION(sybase_num_rows) -{ - zval *sybase_result_index = NULL; - sybase_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &sybase_result_index) == FAILURE) { - return; - } - ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result); - - Z_LVAL_P(return_value) = result->num_rows; - Z_TYPE_P(return_value) = IS_LONG; -} - -/* }}} */ - -/* {{{ proto int sybase_num_fields(resource result) - Get number of fields in result */ -PHP_FUNCTION(sybase_num_fields) -{ - zval *sybase_result_index = NULL; - sybase_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &sybase_result_index) == FAILURE) { - return; - } - ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result); - - Z_LVAL_P(return_value) = result->num_fields; - Z_TYPE_P(return_value) = IS_LONG; -} - -/* }}} */ - -/* {{{ proto array sybase_fetch_row(resource result) - Get row as enumerated array */ -PHP_FUNCTION(sybase_fetch_row) -{ - zval *sybase_result_index = NULL; - int i; - sybase_result *result; - zval *field_content; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &sybase_result_index) == FAILURE) { - return; - } - ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result); - - /* Unbuffered? */ - if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS) { - php_sybase_fetch_result_row(result, 1); - } - - /* At the end? */ - if (result->cur_row >= result->num_rows) { - RETURN_FALSE; - } - - array_init(return_value); - for (i=0; i<result->num_fields; i++) { - ALLOC_ZVAL(field_content); - *field_content = result->data[result->store ? result->cur_row : 0][i]; - INIT_PZVAL(field_content); - zval_copy_ctor(field_content); - zend_hash_index_update(Z_ARRVAL_P(return_value), i, (void *) &field_content, sizeof(zval* ), NULL); - } - result->cur_row++; -} - -/* }}} */ - -static void php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int numerics) -{ - zval *sybase_result_index = NULL; - sybase_result *result; - int i, j; - zval *tmp; - char name[32]; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &sybase_result_index) == FAILURE) { - return; - } - ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result); - - /* Unbuffered ? Fetch next row */ - if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS) { - php_sybase_fetch_result_row(result, 1); - } - - /* At the end? */ - if (result->cur_row >= result->num_rows) { - RETURN_FALSE; - } - - array_init(return_value); - - j= 1; - for (i=0; i<result->num_fields; i++) { - ALLOC_ZVAL(tmp); - *tmp = result->data[result->store ? result->cur_row : 0][i]; - INIT_PZVAL(tmp); - zval_copy_ctor(tmp); - if (numerics) { - zend_hash_index_update(Z_ARRVAL_P(return_value), i, (void *) &tmp, sizeof(zval *), NULL); - Z_ADDREF_P(tmp); - } - - if (zend_hash_exists(Z_ARRVAL_P(return_value), result->fields[i].name, strlen(result->fields[i].name)+1)) { - snprintf(name, 32, "%s%d", result->fields[i].name, j); - result->fields[i].name= estrdup(name); - j++; - } - zend_hash_update(Z_ARRVAL_P(return_value), result->fields[i].name, strlen(result->fields[i].name)+1, (void *) &tmp, sizeof(zval *), NULL); - } - result->cur_row++; -} - - -/* {{{ proto object sybase_fetch_object(resource result [, mixed object]) - Fetch row as object */ -PHP_FUNCTION(sybase_fetch_object) -{ - zval *object = NULL; - zval *sybase_result_index = NULL; - zend_class_entry *ce = NULL; - sybase_result *result; - - /* Was a second parameter given? */ - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|z", &sybase_result_index, &object) == FAILURE) { - return; - } - ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result); - - ce = ZEND_STANDARD_CLASS_DEF_PTR; - if (NULL != object) { - switch (Z_TYPE_P(object)) { - case IS_OBJECT: { - ce = Z_OBJCE_P(object); - break; - } - - case IS_NULL: { - /* Use default (ZEND_STANDARD_CLASS_DEF_PTR) */ - break; - } - - default: { - zend_class_entry **pce = NULL; - convert_to_string(object); - - if (zend_lookup_class(Z_STRVAL_P(object), Z_STRLEN_P(object), &pce) == FAILURE) { - php_error_docref(NULL, E_NOTICE, "Sybase: Class %s has not been declared", Z_STRVAL_P(object)); - /* Use default (ZEND_STANDARD_CLASS_DEF_PTR) */ - } else { - ce = *pce; - } - } - } - } - - /* Reset no. of arguments to 1 so that we can use INTERNAL_FUNCTION_PARAM_PASSTHRU */ - ht= 1; - php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); - if (Z_TYPE_P(return_value) == IS_ARRAY) { - object_and_properties_init(return_value, ce, Z_ARRVAL_P(return_value)); - } -} -/* }}} */ - -/* {{{ proto array sybase_fetch_array(resource result) - Fetch row as array */ -PHP_FUNCTION(sybase_fetch_array) -{ - php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); -} -/* }}} */ - -/* {{{ proto array sybase_fetch_assoc(resource result) - Fetch row as array without numberic indices */ -PHP_FUNCTION(sybase_fetch_assoc) -{ - php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); -} -/* }}} */ - -/* {{{ proto bool sybase_data_seek(resource result, int offset) - Move internal row pointer */ -PHP_FUNCTION(sybase_data_seek) -{ - zval *sybase_result_index = NULL; - long offset; - sybase_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &sybase_result_index, &offset) == FAILURE) { - return; - } - ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result); - - /* Unbuffered ? */ - if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS && offset >= result->num_rows) { - php_sybase_fetch_result_row(result, offset+ 1); - } - - if (offset < 0 || offset >= result->num_rows) { - php_error_docref(NULL, E_WARNING, "Sybase: Bad row offset %ld, must be betweem 0 and %d", offset, result->num_rows - 1); - RETURN_FALSE; - } - - result->cur_row = offset; - RETURN_TRUE; -} -/* }}} */ - -static char *php_sybase_get_field_name(CS_INT type) -{ - switch (type) { - case CS_CHAR_TYPE: - case CS_VARCHAR_TYPE: - case CS_TEXT_TYPE: - return "string"; - break; - case CS_IMAGE_TYPE: - return "image"; - break; - case CS_BINARY_TYPE: - case CS_VARBINARY_TYPE: - return "blob"; - break; - case CS_BIT_TYPE: - return "bit"; - break; - case CS_TINYINT_TYPE: - case CS_SMALLINT_TYPE: - case CS_INT_TYPE: - return "int"; - break; - case CS_REAL_TYPE: - case CS_FLOAT_TYPE: - case CS_NUMERIC_TYPE: - case CS_DECIMAL_TYPE: - return "real"; - break; - case CS_MONEY_TYPE: - case CS_MONEY4_TYPE: - return "money"; - break; - case CS_DATETIME_TYPE: - case CS_DATETIME4_TYPE: - return "datetime"; - break; - default: - return "unknown"; - break; - } -} - - -/* {{{ proto object sybase_fetch_field(resource result [, int offset]) - Get field information */ -PHP_FUNCTION(sybase_fetch_field) -{ - zval *sybase_result_index = NULL; - long field_offset = -1; - sybase_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|l", &sybase_result_index, &field_offset) == FAILURE) { - return; - } - ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result); - - if (field_offset == -1) { - field_offset = result->cur_field; - result->cur_field++; - } - - if (field_offset < 0 || field_offset >= result->num_fields) { - if (ZEND_NUM_ARGS() == 2) { /* field specified explicitly */ - php_error_docref(NULL, E_WARNING, "Sybase: Bad column offset"); - } - RETURN_FALSE; - } - - object_init(return_value); - - add_property_string(return_value, "name", result->fields[field_offset].name); - add_property_long(return_value, "max_length", result->fields[field_offset].max_length); - add_property_string(return_value, "column_source", result->fields[field_offset].column_source); - add_property_long(return_value, "numeric", result->fields[field_offset].numeric); - add_property_string(return_value, "type", php_sybase_get_field_name(Z_TYPE(result->fields[field_offset]))); -} -/* }}} */ - - -/* {{{ proto bool sybase_field_seek(resource result, int offset) - Set field offset */ -PHP_FUNCTION(sybase_field_seek) -{ - zval *sybase_result_index = NULL; - long field_offset; - sybase_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &sybase_result_index, &field_offset) == FAILURE) { - return; - } - ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result); - - if (field_offset < 0 || field_offset >= result->num_fields) { - php_error_docref(NULL, E_WARNING, "Sybase: Bad column offset"); - RETURN_FALSE; - } - - result->cur_field = field_offset; - RETURN_TRUE; -} -/* }}} */ - - -/* {{{ proto string sybase_result(resource result, int row, mixed field) - Get result data */ -PHP_FUNCTION(sybase_result) -{ - zval *field; - zval *sybase_result_index = NULL; - long row; - int field_offset = 0; - sybase_result *result; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz", &sybase_result_index, &row, &field) == FAILURE) { - return; - } - ZEND_FETCH_RESOURCE(result, sybase_result *, &sybase_result_index, -1, "Sybase result", le_result); - - /* Unbuffered ? */ - if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS && row >= result->num_rows) { - php_sybase_fetch_result_row(result, row); - } - - if (row < 0 || row >= result->num_rows) { - php_error_docref(NULL, E_WARNING, "Sybase: Bad row offset (%ld)", row); - RETURN_FALSE; - } - - switch(Z_TYPE_P(field)) { - case IS_STRING: { - int i; - - for (i = 0; i < result->num_fields; i++) { - if (strcasecmp(result->fields[i].name, Z_STRVAL_P(field)) == 0) { - field_offset = i; - break; - } - } - if (i >= result->num_fields) { /* no match found */ - php_error_docref(NULL, E_WARNING, "Sybase: %s field not found in result", Z_STRVAL_P(field)); - RETURN_FALSE; - } - break; - } - default: - convert_to_long(field); - field_offset = Z_LVAL_P(field); - if (field_offset < 0 || field_offset >= result->num_fields) { - php_error_docref(NULL, E_WARNING, "Sybase: Bad column offset specified"); - RETURN_FALSE; - } - break; - } - - *return_value = result->data[row][field_offset]; - zval_copy_ctor(return_value); -} -/* }}} */ - - -/* {{{ proto int sybase_affected_rows([resource link_id]) - Get number of affected rows in last query */ -PHP_FUNCTION(sybase_affected_rows) -{ - zval *sybase_link_index = NULL; - sybase_link *sybase_ptr; - int id; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|r", &sybase_link_index) == FAILURE) { - return; - } - - if (php_sybase_connection_id(sybase_link_index, &id) == FAILURE) { - php_error_docref(NULL, E_WARNING, "Sybase: No connection"); - RETURN_FALSE; - } - - ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, &sybase_link_index, id, "Sybase-Link", le_link, le_plink); - - Z_LVAL_P(return_value) = sybase_ptr->affected_rows; - Z_TYPE_P(return_value) = IS_LONG; -} -/* }}} */ - - -PHP_MINFO_FUNCTION(sybase) -{ - char buf[32]; - - php_info_print_table_start(); - php_info_print_table_header(2, "Sybase_CT Support", "enabled" ); - snprintf(buf, sizeof(buf), "%ld", SybCtG(num_persistent)); - php_info_print_table_row(2, "Active Persistent Links", buf); - snprintf(buf, sizeof(buf), "%ld", SybCtG(num_links)); - php_info_print_table_row(2, "Active Links", buf); - snprintf(buf, sizeof(buf), "%ld", SybCtG(min_server_severity)); - php_info_print_table_row(2, "Min server severity", buf); - snprintf(buf, sizeof(buf), "%ld", SybCtG(min_client_severity)); - php_info_print_table_row(2, "Min client severity", buf); - php_info_print_table_row(2, "Application Name", SybCtG(appname)); - snprintf(buf, sizeof(buf), "%ld", SybCtG(deadlock_retry_count)); - php_info_print_table_row(2, "Deadlock retry count", buf); - php_info_print_table_end(); - - DISPLAY_INI_ENTRIES(); -} - - -/* {{{ proto void sybase_min_client_severity(int severity) - Sets minimum client severity */ -PHP_FUNCTION(sybase_min_client_severity) -{ - long severity; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &severity) == FAILURE) { - return; - } - - SybCtG(min_client_severity) = severity; -} -/* }}} */ - - -/* {{{ proto void sybase_min_server_severity(int severity) - Sets minimum server severity */ -PHP_FUNCTION(sybase_min_server_severity) -{ - long severity; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &severity) == FAILURE) { - return; - } - - SybCtG(min_server_severity) = severity; -} -/* }}} */ - -/* {{{ proto void sybase_deadlock_retry_count(int retry_count) - Sets deadlock retry count */ -PHP_FUNCTION(sybase_deadlock_retry_count) -{ - long retry_count; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &retry_count) == FAILURE) { - return; - } - - SybCtG(deadlock_retry_count) = retry_count; -} -/* }}} */ - - -/* {{{ proto bool sybase_set_message_handler(mixed error_func [, resource connection]) - Set the error handler, to be called when a server message is raised. - If error_func is NULL the handler will be deleted */ -PHP_FUNCTION(sybase_set_message_handler) -{ - zend_fcall_info fci = empty_fcall_info; - zend_fcall_info_cache cache = empty_fcall_info_cache; - zval *sybase_link_index= NULL; - sybase_link *sybase_ptr; - zval **callback; - int id; - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "f!|r", &fci, &cache, &sybase_link_index) == FAILURE) { - return; - } - - if (php_sybase_connection_id(sybase_link_index, &id) == FAILURE) { - - /* Doesn't matter if we're not connected yet, use default */ - callback= &SybCtG(callback_name); - } else if (-1 == id) { - - /* Connection-based message handler */ - ZEND_FETCH_RESOURCE2(sybase_ptr, sybase_link *, &sybase_link_index, id, "Sybase-Link", le_link, le_plink); - callback= &sybase_ptr->callback_name; - } else { - - /* Default message handler */ - callback= &SybCtG(callback_name); - } - - /* Clean old callback */ - if (*callback) { - zval_ptr_dtor(callback); - *callback = NULL; - } - - if (ZEND_FCI_INITIALIZED(fci)) { - ALLOC_ZVAL(*callback); - **callback = *fci.function_name; - INIT_PZVAL(*callback); - zval_copy_ctor(*callback); - } else { - callback= NULL; - } - - RETURN_TRUE; -} -/* }}} */ - - -#endif - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/ext/sybase_ct/php_sybase_ct.h b/ext/sybase_ct/php_sybase_ct.h deleted file mode 100644 index a517f3e637..0000000000 --- a/ext/sybase_ct/php_sybase_ct.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2015 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: | - | http://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: Zeev Suraski <zeev@zend.com> | - | Timm Friebe <php_sybase_ct@thekid.de> | - +----------------------------------------------------------------------+ -*/ - -/* $Id$ */ - -#ifndef PHP_SYBASE_CT_H -#define PHP_SYBASE_CT_H - -#if HAVE_SYBASE_CT - -#define CTLIB_VERSION CS_VERSION_100 - -extern zend_module_entry sybase_module_entry; -#define sybase_module_ptr &sybase_module_entry - -PHP_MINIT_FUNCTION(sybase); -PHP_MSHUTDOWN_FUNCTION(sybase); -PHP_RINIT_FUNCTION(sybase); -PHP_RSHUTDOWN_FUNCTION(sybase); -PHP_MINFO_FUNCTION(sybase); - -PHP_FUNCTION(sybase_connect); -PHP_FUNCTION(sybase_pconnect); -PHP_FUNCTION(sybase_close); -PHP_FUNCTION(sybase_select_db); -PHP_FUNCTION(sybase_query); -PHP_FUNCTION(sybase_unbuffered_query); -PHP_FUNCTION(sybase_free_result); -PHP_FUNCTION(sybase_get_last_message); -PHP_FUNCTION(sybase_num_rows); -PHP_FUNCTION(sybase_num_fields); -PHP_FUNCTION(sybase_fetch_row); -PHP_FUNCTION(sybase_fetch_array); -PHP_FUNCTION(sybase_fetch_assoc); -PHP_FUNCTION(sybase_fetch_object); -PHP_FUNCTION(sybase_data_seek); -PHP_FUNCTION(sybase_result); -PHP_FUNCTION(sybase_affected_rows); -PHP_FUNCTION(sybase_field_seek); -PHP_FUNCTION(sybase_min_client_severity); -PHP_FUNCTION(sybase_min_server_severity); -PHP_FUNCTION(sybase_fetch_field); -PHP_FUNCTION(sybase_set_message_handler); -PHP_FUNCTION(sybase_deadlock_retry_count); - -#include <ctpublic.h> - -ZEND_BEGIN_MODULE_GLOBALS(sybase) - long default_link; - long num_links,num_persistent; - long max_links,max_persistent; - long login_timeout; - long allow_persistent; - char *appname; - char *hostname; - char *server_message; - long min_server_severity, min_client_severity; - long deadlock_retry_count; - zval *callback_name; - CS_CONTEXT *context; -ZEND_END_MODULE_GLOBALS(sybase) - -typedef struct { - CS_CONNECTION *connection; - CS_COMMAND *cmd; - int valid; - int deadlock; - int dead; - int active_result_index; - long affected_rows; - zval *callback_name; -} sybase_link; - -#define SYBASE_ROWS_BLOCK 128 - -typedef struct { - char *name,*column_source; - int max_length, numeric; - CS_INT type; -} sybase_field; - -typedef struct { - zval **data; - sybase_field *fields; - sybase_link *sybase_ptr; - int cur_row,cur_field; - int num_rows,num_fields; - - /* For unbuffered reads */ - CS_INT *lengths; - CS_SMALLINT *indicators; - char **tmp_buffer; - unsigned char *numerics; - CS_INT *types; - CS_DATAFMT *datafmt; - int blocks_initialized; - CS_RETCODE last_retcode; - int store; -} sybase_result; - -#ifdef ZTS -# define SybCtG(v) TSRMG(sybase_globals_id, zend_sybase_globals *, v) -#else -# define SybCtG(v) (sybase_globals.v) -#endif - -#else - -#define sybase_module_ptr NULL - -#endif - -#define phpext_sybase_ct_ptr sybase_module_ptr - -#endif /* PHP_SYBASE_CT_H */ diff --git a/ext/sybase_ct/tests/bug22403.phpt b/ext/sybase_ct/tests/bug22403.phpt deleted file mode 100644 index 20d5248ff4..0000000000 --- a/ext/sybase_ct/tests/bug22403.phpt +++ /dev/null @@ -1,88 +0,0 @@ ---TEST-- -Sybase-CT bug #22403 (crash when executing a stored procedure without parameters) ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db= sybase_connect_ex(); - sybase_set_message_handler('sybase_msg_handler'); - error_reporting(error_reporting() & !E_NOTICE); // Suppress notices - - // Check if stored procedure already exists - $sp_name= 'phpt_bug22403'; - var_dump(sybase_select_db(TEMPDB, $db)); - if (!sybase_select_single($db, 'select object_id("'.$sp_name.'")')) { - echo "Stored procedure {$sp_name} not found, creating\n"; - var_dump(sybase_query(' - create proc '.$sp_name.' (@param int) - as - begin - select @param - select @param + 1 - return @param - end - ')); - } else { - echo "Stored procedure {$sp_name} found, using\n"; - var_dump(TRUE); - } - - // These don't work - var_dump(sybase_select_ex($db, 'exec '.$sp_name)); - var_dump(sybase_select_ex($db, 'exec '.$sp_name.' "foo"')); - var_dump(sybase_select_ex($db, 'exec does_not_exist')); - - // These do - var_dump(sybase_select_ex($db, 'exec '.$sp_name.' NULL')); - var_dump(sybase_select_ex($db, 'exec '.$sp_name.' 1')); - - // Clean up after ourselves - var_dump(sybase_query('drop proc '.$sp_name)); - - sybase_close($db); -?> ---EXPECTF-- -bool(true) -Stored procedure %s -bool(true) ->>> Query: exec %s -*** Caught Sybase Server Message #201 [Severity 16, state 2] at line 0 - %s -<<< Return: boolean -bool(false) ->>> Query: exec %s "foo" -*** Caught Sybase Server Message #257 [Severity 16, state 1] at line 0 - %s -<<< Return: boolean -bool(false) ->>> Query: exec does_not_exist -*** Caught Sybase Server Message #2812 [Severity 16, state %d] at line 1 - %s -<<< Return: boolean -bool(false) ->>> Query: exec %s NULL -<<< Return: resource -array(1) { - [0]=> - array(1) { - ["computed"]=> - NULL - } -} ->>> Query: exec %s 1 -<<< Return: resource -array(1) { - [0]=> - array(1) { - ["computed"]=> - int(1) - } -} -bool(true) diff --git a/ext/sybase_ct/tests/bug26407.phpt b/ext/sybase_ct/tests/bug26407.phpt deleted file mode 100644 index 27f5f99b9d..0000000000 --- a/ext/sybase_ct/tests/bug26407.phpt +++ /dev/null @@ -1,91 +0,0 @@ ---TEST-- -Sybase-CT bug #26407 (Result set fetching broken around transactions) ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db= sybase_connect_ex(); - - // Create temporary table - $table= 'phpt_bug26407'; - var_dump(sybase_query('create table #'.$table.' ( the_big_answer int )', $db)); - - // I - var_dump(sybase_select_ex($db, ' - begin transaction - -- anything producing a result set here will fail; - -- however, print or update statements will work - select "foo" - commit - -- anything afterwards will fail, too - ')); - - // II - var_dump(sybase_select_ex($db, ' - begin transaction - -- no result returned... - update #'.$table.' set the_big_answer=42 - commit - ')); - - // III - var_dump(sybase_select_ex($db, ' - select "foo" - begin transaction - -- do anything, even return a result set - commit - select "bar" - ')); - - sybase_close($db); -?> ---EXPECTF-- -bool(true) ->>> Query: - begin transaction - -- anything producing a result set here will fail; - -- however, print or update statements will work - select "foo" - commit - -- anything afterwards will fail, too - -<<< Return: resource -array(1) { - [0]=> - array(1) { - ["computed"]=> - string(3) "foo" - } -} ->>> Query: - begin transaction - -- no result returned... - update #phpt_bug26407 set the_big_answer=42 - commit - -<<< Return: boolean -bool(true) ->>> Query: - select "foo" - begin transaction - -- do anything, even return a result set - commit - select "bar" - - -Notice: sybase_query(): Sybase: Unexpected results, canceling current in %stest.inc on line %d -<<< Return: resource -array(1) { - [0]=> - array(1) { - ["computed"]=> - string(3) "foo" - } -} diff --git a/ext/sybase_ct/tests/bug27843.phpt b/ext/sybase_ct/tests/bug27843.phpt deleted file mode 100644 index 861d1f95e7..0000000000 --- a/ext/sybase_ct/tests/bug27843.phpt +++ /dev/null @@ -1,54 +0,0 @@ ---TEST-- -Sybase-CT bug #27843 (notices when query is a stored procedure) ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db= sybase_connect_ex(); - - // Check if stored procedure already exists - $sp_name= 'phpt_bug27843'; - var_dump(sybase_select_db(TEMPDB, $db)); - if (!sybase_select_single($db, 'select object_id("'.$sp_name.'")')) { - echo "Stored procedure {$sp_name} not found, creating\n"; - var_dump(sybase_query(' - create proc '.$sp_name.' - as - begin - select 1 - end - ')); - } else { - echo "Stored procedure {$sp_name} found, using\n"; - var_dump(TRUE); - } - - // Execute stored procedure - var_dump(sybase_select_ex($db, 'exec '.$sp_name)); - - // Clean up after ourselves - var_dump(sybase_query('drop proc '.$sp_name, $db)); - - sybase_close($db); -?> ---EXPECTF-- -bool(true) -Stored procedure %s -bool(true) ->>> Query: exec phpt_bug27843 -<<< Return: resource -array(1) { - [0]=> - array(1) { - ["computed"]=> - int(1) - } -} -bool(true) diff --git a/ext/sybase_ct/tests/bug28354.phpt b/ext/sybase_ct/tests/bug28354.phpt deleted file mode 100644 index 018f7bddec..0000000000 --- a/ext/sybase_ct/tests/bug28354.phpt +++ /dev/null @@ -1,46 +0,0 @@ ---TEST-- -Sybase-CT bug #28354 (sybase_free_result crash) ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db= sybase_connect_ex(); - sybase_set_message_handler('sybase_msg_handler'); - error_reporting(error_reporting() & !E_NOTICE); // Suppress notices - - // Check if stored procedure already exists - $sp_name= 'phpt_bug28354'; - var_dump(sybase_select_db(TEMPDB, $db)); - if (!sybase_select_single($db, 'select object_id("'.$sp_name.'")')) { - echo "Stored procedure {$sp_name} not found, creating\n"; - var_dump(sybase_query(' - create proc '.$sp_name.' as begin - select @@version - end - ')); - } else { - echo "Stored procedure {$sp_name} found, using\n"; - var_dump(TRUE); - } - - $r= sybase_query('exec '.$sp_name, $db); - $i= 0; - while ($row= sybase_fetch_row($r)) { - var_dump($i++, $row[0]); - } - sybase_free_result($r); - sybase_close($db); -?> ---EXPECTF-- -bool(true) -Stored procedure %s -bool(true) -int(0) -string(%d) "%s" diff --git a/ext/sybase_ct/tests/bug29064.phpt b/ext/sybase_ct/tests/bug29064.phpt deleted file mode 100644 index df13d28a1d..0000000000 --- a/ext/sybase_ct/tests/bug29064.phpt +++ /dev/null @@ -1,143 +0,0 @@ ---TEST-- -Sybase-CT bug #29064 (Exact numeric/decimal/money datatypes lose precision) ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db= sybase_connect_ex(); - - // Create a temporary table and fill it with test values - var_dump(sybase_query(' - create table #test ( - test_decimal decimal(38, 6) null, - test_numeric numeric(38, 12) null, - test_money money null, - test_bigint decimal(38, 0) null, - test_int int null, - test_smallmoney smallmoney null, - test_smallint smallint null, - test_tinyint tinyint null, - test_real float null, - test_double float null - ) - ', $db)); - var_dump(sybase_query(' - insert into #test ( - test_decimal, - test_numeric, - test_money, - test_bigint, - test_int, - test_smallmoney, - test_smallint, - test_tinyint, - test_real, - test_double - ) values ( - 12345678901234567890123456789012.123456, - 12345678901234567890123456.123456789012, - 123456789012345.1234, - 12345678901234567890123456789012345678, - 1234567890, - 123456.1234, - 12345, - 123, - 123456789.12345679, - 123456789.12345679 - ) - ', $db)); - var_dump(sybase_query(' - insert into #test ( - test_decimal, - test_numeric, - test_money, - test_bigint, - test_int, - test_smallmoney, - test_smallint, - test_tinyint, - test_real, - test_double - ) values ( - -12345678901234567890123456789012.123456, - -12345678901234567890123456.123456789012, - -123456789012345.1234, - -12345678901234567890123456789012345678, - -1234567890, - -123456.1234, - -12345, - 255, - -123456789.12345679, - -123456789.12345679 - ) - ', $db)); - - // Select the data - var_dump(sybase_select_ex($db, 'select * from #test')); - - // Clean up and close connection - var_dump(sybase_query('drop table #test', $db)); - sybase_close($db); -?> ---EXPECTF-- -bool(true) -bool(true) -bool(true) ->>> Query: select * from #test -<<< Return: resource -array(2) { - [0]=> - array(10) { - ["test_decimal"]=> - string(39) "12345678901234567890123456789012.123456" - ["test_numeric"]=> - string(39) "12345678901234567890123456.123456789012" - ["test_money"]=> - string(18) "123456789012345.12" - ["test_bigint"]=> - string(38) "12345678901234567890123456789012345678" - ["test_int"]=> - int(1234567890) - ["test_smallmoney"]=> - float(123456.12) - ["test_smallint"]=> - int(12345) - ["test_tinyint"]=> - int(123) - ["test_real"]=> - string(18) "123456789.12345679" - ["test_double"]=> - string(18) "123456789.12345679" - } - [1]=> - array(10) { - ["test_decimal"]=> - string(40) "-12345678901234567890123456789012.123456" - ["test_numeric"]=> - string(40) "-12345678901234567890123456.123456789012" - ["test_money"]=> - string(19) "-123456789012345.12" - ["test_bigint"]=> - string(39) "-12345678901234567890123456789012345678" - ["test_int"]=> - int(-1234567890) - ["test_smallmoney"]=> - float(-123456.12) - ["test_smallint"]=> - int(-12345) - ["test_tinyint"]=> - int(255) - ["test_real"]=> - string(19) "-123456789.12345679" - ["test_double"]=> - string(19) "-123456789.12345679" - } -} -bool(true) diff --git a/ext/sybase_ct/tests/bug30312-withfree.phpt b/ext/sybase_ct/tests/bug30312-withfree.phpt deleted file mode 100644 index 0017865da4..0000000000 --- a/ext/sybase_ct/tests/bug30312-withfree.phpt +++ /dev/null @@ -1,34 +0,0 @@ ---TEST-- -Sybase-CT bug #30312 (sybase_unbuffered_query calls, with free) ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - error_reporting(error_reporting() & !E_NOTICE); // Suppress notices - - $db= sybase_connect_ex(); - - $query= sybase_unbuffered_query('select datepart(yy, getdate())'); - $array= sybase_fetch_row($query); - var_dump($array[0]); - sybase_free_result($query); - - $query= sybase_unbuffered_query('select datepart(mm, getdate()), datepart(dd, getdate())'); - $array= sybase_fetch_row($query); - var_dump($array); - sybase_free_result($query); -?> ---EXPECTF-- -int(%d) -array(2) { - [0]=> - int(%d) - [1]=> - int(%d) -} diff --git a/ext/sybase_ct/tests/bug30312.phpt b/ext/sybase_ct/tests/bug30312.phpt deleted file mode 100644 index 273b579d61..0000000000 --- a/ext/sybase_ct/tests/bug30312.phpt +++ /dev/null @@ -1,27 +0,0 @@ ---TEST-- -Sybase-CT bug #30312 (sybase_unbuffered_query calls) ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - error_reporting(error_reporting() & !E_NOTICE); // Suppress notices - - $db= sybase_connect_ex(); - - $query= sybase_unbuffered_query('select datepart(yy, getdate())'); - $array= sybase_fetch_array($query); - var_dump($array[0]); - - $query= sybase_unbuffered_query('select datepart(yy, getdate())'); - $array= sybase_fetch_array($query); - var_dump($array[0]); -?> ---EXPECTF-- -int(%d) -int(%d) diff --git a/ext/sybase_ct/tests/bug43578.phpt b/ext/sybase_ct/tests/bug43578.phpt deleted file mode 100644 index 9f75b9c0ea..0000000000 --- a/ext/sybase_ct/tests/bug43578.phpt +++ /dev/null @@ -1,65 +0,0 @@ ---TEST-- -Sybase-CT bug #43578 (Incurred fault #6 - if returned textfield ist empty) ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db= sybase_connect_ex(); - - // Create a temporary table and fill it with test values - var_dump(sybase_query(' - create table #Resource ( - Resource_ID int, - DC_Rights text null - ) - ', $db)); - var_dump(sybase_query('insert into #Resource values (123, NULL)', $db)); - var_dump(sybase_query('insert into #Resource values (124, "")', $db)); - - // Select non-existent - var_dump(sybase_select_ex($db, 'select DC_Rights from #Resource where Resource_ID = 122')); - - // Select null - var_dump(sybase_select_ex($db, 'select DC_Rights from #Resource where Resource_ID = 123')); - - // Select empty - var_dump(sybase_select_ex($db, 'select DC_Rights from #Resource where Resource_ID = 124')); - - // Clean up and close connection - var_dump(sybase_query('drop table #Resource', $db)); - sybase_close($db); -?> ---EXPECTF-- -bool(true) -bool(true) -bool(true) ->>> Query: select DC_Rights from #Resource where Resource_ID = 122 -<<< Return: resource -array(0) { -} ->>> Query: select DC_Rights from #Resource where Resource_ID = 123 -<<< Return: resource -array(1) { - [0]=> - array(1) { - ["DC_Rights"]=> - NULL - } -} ->>> Query: select DC_Rights from #Resource where Resource_ID = 124 -<<< Return: resource -array(1) { - [0]=> - array(1) { - ["DC_Rights"]=> - string(1) " " - } -} -bool(true) diff --git a/ext/sybase_ct/tests/bug6339.phpt b/ext/sybase_ct/tests/bug6339.phpt deleted file mode 100644 index 3b0a072b4a..0000000000 --- a/ext/sybase_ct/tests/bug6339.phpt +++ /dev/null @@ -1,24 +0,0 @@ ---TEST-- -Sybase-CT bug #6339 (invalid Sybase-link resource) ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - // Suppress "Changed database context" warnings - sybase_min_server_severity(11); - sybase_connect(HOST, USER, PASSWORD); - var_dump(sybase_fetch_row(sybase_query('select 1'))); - sybase_close(); -?> ---EXPECTF-- -array(1) { - [0]=> - int(1) -} diff --git a/ext/sybase_ct/tests/skipif.inc b/ext/sybase_ct/tests/skipif.inc deleted file mode 100644 index 55bf53aa77..0000000000 --- a/ext/sybase_ct/tests/skipif.inc +++ /dev/null @@ -1,13 +0,0 @@ -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require 'test.inc'; - - if (!extension_loaded('sybase_ct')) die('skip Sybase-CT extension not loaded'); - - sybase_min_server_severity(11); - if (!@sybase_connect(HOST, USER, PASSWORD)) die('skip Unable to connect'); -?> diff --git a/ext/sybase_ct/tests/test.inc b/ext/sybase_ct/tests/test.inc deleted file mode 100644 index 8dd2f7fadf..0000000000 --- a/ext/sybase_ct/tests/test.inc +++ /dev/null @@ -1,86 +0,0 @@ -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - // Change if needed - define('HOST', getenv('PHP_SYBASE_HOST')); - define('USER', getenv('PHP_SYBASE_USER')); - define('PASSWORD', getenv('PHP_SYBASE_PASS')); - define('TEMPDB', 'tempdb'); - - // {{{ bool sybase_msg_handler(int msgnumber, int severity, int state, int line, string text) - // Handles server messages - function sybase_msg_handler($msgnumber, $severity, $state, $line, $text) { - printf( - "*** Caught Sybase Server Message #%d [Severity %d, state %d] at line %d\n '%s'\n", - $msgnumber, - $severity, - $state, - $line, - chop($text) - ); - } - // }}} - - // {{{ public class sybase - class sybase { - - // {{{ public static bool static_handler(int msgnumber, int severity, int state, int line, string text) - // Handles server messages - static function static_handler($msgnumber, $severity, $state, $line, $text) { - return sybase_msg_handler($msgnumber, $severity, $state, $line, $text); - } - // }}} - - // {{{ public bool static_handler(int msgnumber, int severity, int state, int line, string text) - // Handles server messages - function handler($msgnumber, $severity, $state, $line, $text) { - return sybase_msg_handler($msgnumber, $severity, $state, $line, $text); - } - // }}} - } - // }}} - - // {{{ void sybase_set_messagehandler_ex(string handler) - // Sets the sybase message handler and dumps the result - function sybase_set_messagehandler_ex($handler) { - var_dump(sybase_set_message_handler($handler)); - } - - // {{{ resource sybase_connect_ex(string charset= NULL, string appname= NULL, bool new= FALSE) - // Connect to the sybase server using the defines HOST, USER and PASSWORD - function sybase_connect_ex($charset= NULL, $appname= NULL, $new= FALSE) { - sybase_min_server_severity(11); // Suppress "changed database context" - if (!($db= sybase_connect(HOST, USER, PASSWORD, $charset ? $charset : 'iso_1', $appname, $new))) { - die('Connect to '.USER.'@'.HOST.' failed (using password: '.(PASSWORD ? 'yes' : 'no').')'); - } - return $db; - } - // }}} - - // {{{ void sybase_select_ex(resource dbh, string query) - // Returns all fetched rows from an SQL query - function sybase_select_ex($dbh, $query) { - printf(">>> Query: %s\n", $query); - $h= sybase_query($query, $dbh); - printf("<<< Return: %s\n", gettype($h)); - flush(); - if (!is_resource($h)) return $h; - - $return= array(); - while ($row= sybase_fetch_assoc($h)) { - $return[]= $row; - } - return $return; - } - - // {{{ mixed sybase_select_single(resource dbh, string query) - // Fires an SQL query and returns the first value from the first row - function sybase_select_single($dbh, $query) { - $a = sybase_fetch_row(sybase_query($query, $dbh)); - return array_shift($a); - } - // }}} -?> diff --git a/ext/sybase_ct/tests/test_appname.phpt b/ext/sybase_ct/tests/test_appname.phpt deleted file mode 100644 index 71f5c32f4d..0000000000 --- a/ext/sybase_ct/tests/test_appname.phpt +++ /dev/null @@ -1,55 +0,0 @@ ---TEST-- -Sybase-CT application name ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - // {{{ bool compare_string(string expect, string actual) - // Compares expect to a trimmed version of actual - function compare_string($expect, $actual) { - $trimmed= rtrim($actual, ' '); - return (0 == strncmp($expect, $trimmed, strlen($trimmed))); - } - // }}} - - $program_name= 'phpt_test'; - $hostname= 'php.net'; - ini_set('sybct.hostname', $hostname); - - $db= sybase_connect_ex(NULL, $program_name); - $r= sybase_select_ex($db, ' - select - hostname, - program_name - from - master..sysprocesses - where - program_name = "'.$program_name.'"' - ); - - var_dump( - compare_string($program_name, $r[0]['program_name']), - compare_string($hostname, $r[0]['hostname']) - ); - - sybase_close($db); -?> ---EXPECTF-- ->>> Query: - select - hostname, - program_name - from - master..sysprocesses - where - program_name = "phpt_test" -<<< Return: resource -bool(true) -bool(true) diff --git a/ext/sybase_ct/tests/test_close.phpt b/ext/sybase_ct/tests/test_close.phpt deleted file mode 100644 index e2c3ebcb60..0000000000 --- a/ext/sybase_ct/tests/test_close.phpt +++ /dev/null @@ -1,25 +0,0 @@ ---TEST-- -Sybase-CT close ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db= sybase_connect_ex(); - var_dump($db); - sybase_close($db); - var_dump($db); - var_dump(sybase_query('select getdate()', $db)); -?> ---EXPECTF-- -resource(%d) of type (sybase-ct link) -resource(%d) of type (Unknown) - -Warning: sybase_query(): %d is not a valid Sybase-Link resource in %s on line %d -bool(false) diff --git a/ext/sybase_ct/tests/test_close_default.phpt b/ext/sybase_ct/tests/test_close_default.phpt deleted file mode 100644 index a726a4747b..0000000000 --- a/ext/sybase_ct/tests/test_close_default.phpt +++ /dev/null @@ -1,21 +0,0 @@ ---TEST-- -Sybase-CT close default connection ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - sybase_connect_ex(); - sybase_close(); - var_dump(sybase_query('select getdate()')); -?> ---EXPECTF-- - -Warning: sybase_query(): Sybase: No connection in %s on line %d -bool(false) diff --git a/ext/sybase_ct/tests/test_close_notopen.phpt b/ext/sybase_ct/tests/test_close_notopen.phpt deleted file mode 100644 index 13b4571bc9..0000000000 --- a/ext/sybase_ct/tests/test_close_notopen.phpt +++ /dev/null @@ -1,18 +0,0 @@ ---TEST-- -Sybase-CT close not open ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - sybase_close(); -?> ---EXPECTF-- - -Warning: sybase_close(): Sybase: No connection to close in %s on line %d diff --git a/ext/sybase_ct/tests/test_connect.phpt b/ext/sybase_ct/tests/test_connect.phpt deleted file mode 100644 index e1e3eead38..0000000000 --- a/ext/sybase_ct/tests/test_connect.phpt +++ /dev/null @@ -1,19 +0,0 @@ ---TEST-- -Sybase-CT connectivity ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db= sybase_connect_ex(); - var_dump($db); - sybase_close($db); -?> ---EXPECTF-- -resource(%d) of type (sybase-ct link) diff --git a/ext/sybase_ct/tests/test_connection_caching.phpt b/ext/sybase_ct/tests/test_connection_caching.phpt deleted file mode 100644 index d59aedebf6..0000000000 --- a/ext/sybase_ct/tests/test_connection_caching.phpt +++ /dev/null @@ -1,26 +0,0 @@ ---TEST-- -Sybase-CT connection caching ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db1= sybase_connect_ex(); - $db2= sybase_connect_ex(); - $db3= sybase_connect_ex(NULL, NULL, $new= TRUE); - var_dump($db1, $db2, $db3, (string)$db1 == (string)$db2, (string)$db2 == (string)$db3); - sybase_close($db1); - -?> ---EXPECTF-- -resource(%d) of type (sybase-ct link) -resource(%d) of type (sybase-ct link) -resource(%d) of type (sybase-ct link) -bool(true) -bool(false) diff --git a/ext/sybase_ct/tests/test_connectionbased_msghandler.phpt b/ext/sybase_ct/tests/test_connectionbased_msghandler.phpt deleted file mode 100644 index 72e6b3a8dc..0000000000 --- a/ext/sybase_ct/tests/test_connectionbased_msghandler.phpt +++ /dev/null @@ -1,27 +0,0 @@ ---TEST-- -Sybase-CT connection-based server message handler ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db= sybase_connect_ex(); - var_dump($db); - var_dump(sybase_set_message_handler('sybase_msg_handler', $db)); - var_dump(sybase_select_ex($db, 'select getdate(NULL)')); - sybase_close($db); -?> ---EXPECTF-- -resource(%d) of type (sybase-ct link) -bool(true) ->>> Query: select getdate(NULL) -*** Caught Sybase Server Message #%d [Severity %d, state %d] at line %d - %s -<<< Return: boolean -bool(false) diff --git a/ext/sybase_ct/tests/test_fetch_object.phpt b/ext/sybase_ct/tests/test_fetch_object.phpt deleted file mode 100644 index 2d225cd9cf..0000000000 --- a/ext/sybase_ct/tests/test_fetch_object.phpt +++ /dev/null @@ -1,74 +0,0 @@ ---TEST-- -Sybase-CT sybase_fetch_object ---SKIPIF-- -<?php - require('skipif.inc'); -?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - // {{{ class article - class article { } - // }}} - - // {{{ resource fetch_object(resource db, [mixed arg= NULL]) - // Fetches a resultset and returns it as an object - function fetch_object($db, $arg= NULL) { - return sybase_fetch_object(sybase_query('select - 1 as "id", - "Hello" as "caption", - "timm" as "author", - getdate() as "lastchange" - ', $db), $arg); - } - // }}} - - $db= sybase_connect_ex(); - - // Test with stdClass - var_export(fetch_object($db)); echo "\n"; - - // Test with userland class - var_export(fetch_object($db, 'article')); echo "\n"; - - // Test with object - var_export(fetch_object($db, new article())); echo "\n"; - - // Test with non-existent class - var_export(fetch_object($db, '***')); echo "\n"; - - sybase_close($db); -?> ---EXPECTF-- -stdClass::__set_state(array( - 'id' => 1, - 'caption' => 'Hello', - 'author' => 'timm', - 'lastchange' => '%s', -)) -article::__set_state(array( - 'id' => 1, - 'caption' => 'Hello', - 'author' => 'timm', - 'lastchange' => '%s', -)) -article::__set_state(array( - 'id' => 1, - 'caption' => 'Hello', - 'author' => 'timm', - 'lastchange' => '%s', -)) - -Notice: sybase_fetch_object(): Sybase: Class *** has not been declared in %stest_fetch_object.php on line %d -stdClass::__set_state(array( - 'id' => 1, - 'caption' => 'Hello', - 'author' => 'timm', - 'lastchange' => '%s', -)) diff --git a/ext/sybase_ct/tests/test_fields.phpt b/ext/sybase_ct/tests/test_fields.phpt deleted file mode 100644 index 46e932b85d..0000000000 --- a/ext/sybase_ct/tests/test_fields.phpt +++ /dev/null @@ -1,76 +0,0 @@ ---TEST-- -Sybase-CT sybase_field_* functions ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db= sybase_connect_ex(); - - // Issue a query - $q= sybase_unbuffered_query('select - 1 as "id", - "Hello" as "caption", - "timm" as "author", - getdate() as "lastchange" - ', $db, FALSE); - var_dump($q); - - var_dump(sybase_num_fields($q)); - - // Go through each field, dumping it - while ($field= sybase_fetch_field($q)) { - var_export($field); echo "\n"; - } - - // Seek to the second field and fetch it - var_dump(sybase_field_seek($q, 1)); - var_export(sybase_fetch_field($q)); echo "\n"; - - sybase_close($db); -?> ---EXPECTF-- -resource(%d) of type (sybase-ct result) -int(4) -stdClass::__set_state(array( - 'name' => 'id', - 'max_length' => 11, - 'column_source' => '', - 'numeric' => 1, - 'type' => 'int', -)) -stdClass::__set_state(array( - 'name' => 'caption', - 'max_length' => 5, - 'column_source' => '', - 'numeric' => 0, - 'type' => 'string', -)) -stdClass::__set_state(array( - 'name' => 'author', - 'max_length' => 4, - 'column_source' => '', - 'numeric' => 0, - 'type' => 'string', -)) -stdClass::__set_state(array( - 'name' => 'lastchange', - 'max_length' => 29, - 'column_source' => '', - 'numeric' => 0, - 'type' => 'datetime', -)) -bool(true) -stdClass::__set_state(array( - 'name' => 'caption', - 'max_length' => 5, - 'column_source' => '', - 'numeric' => 0, - 'type' => 'string', -)) diff --git a/ext/sybase_ct/tests/test_long.phpt b/ext/sybase_ct/tests/test_long.phpt deleted file mode 100644 index de59bb93cb..0000000000 --- a/ext/sybase_ct/tests/test_long.phpt +++ /dev/null @@ -1,80 +0,0 @@ ---TEST-- -Sybase-CT select LONG_MAX / LONG_MIN ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - define('LONG_MAX', is_int(2147483648) ? 9223372036854775807 : 2147483647); - define('LONG_MIN', -LONG_MAX - 1); - - $db= sybase_connect_ex(); - var_dump(sybase_select_db(TEMPDB, $db)); - - // Create table and insert some values - var_dump(sybase_query('create table test_long (value numeric(20, 0))')); - var_dump(sybase_query('insert test_long values ('.(LONG_MAX - 1).')')); - var_dump(sybase_query('insert test_long values ('.(LONG_MAX).')')); - var_dump(sybase_query('insert test_long values ('.(LONG_MAX + 1).')')); - var_dump(sybase_query('insert test_long values ('.(LONG_MIN + 1).')')); - var_dump(sybase_query('insert test_long values ('.(LONG_MIN).')')); - var_dump(sybase_query('insert test_long values ('.(LONG_MIN - 1).')')); - - // Select values - var_dump(sybase_select_ex($db, 'select value from test_long')); - - // Drop table - var_dump(sybase_query('drop table test_long')); - - sybase_close($db); -?> ---EXPECTF-- -bool(true) -bool(true) -bool(true) -bool(true) -bool(true) -bool(true) -bool(true) -bool(true) ->>> Query: select value from test_long -<<< Return: resource -array(6) { - [0]=> - array(1) { - ["value"]=> - int(%s) - } - [1]=> - array(1) { - ["value"]=> - int(%s) - } - [2]=> - array(1) { - ["value"]=> - float(%s) - } - [3]=> - array(1) { - ["value"]=> - int(-%s) - } - [4]=> - array(1) { - ["value"]=> - int(-%s) - } - [5]=> - array(1) { - ["value"]=> - float(-%s) - } -} -bool(true) diff --git a/ext/sybase_ct/tests/test_msghandler.phpt b/ext/sybase_ct/tests/test_msghandler.phpt deleted file mode 100644 index 3189aaac21..0000000000 --- a/ext/sybase_ct/tests/test_msghandler.phpt +++ /dev/null @@ -1,43 +0,0 @@ ---TEST-- -Sybase-CT server message handler ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db= sybase_connect_ex(); - - echo 'Nonexistent: '; sybase_set_messagehandler_ex('function_does_not_exist'); - echo 'Static method: '; sybase_set_messagehandler_ex(array('sybase', 'static_handler')); - echo 'Instance method: '; sybase_set_messagehandler_ex(array(new sybase(), 'handler')); - echo 'Lambda function: '; sybase_set_messagehandler_ex(create_function('', 'return FALSE;')); - echo 'Unset: '; sybase_set_messagehandler_ex(NULL); - echo 'Incorrect type: '; sybase_set_messagehandler_ex(1); - echo 'Function: '; sybase_set_messagehandler_ex('sybase_msg_handler'); - - var_dump(sybase_select_ex($db, 'select getdate(NULL)')); - sybase_close($db); -?> ---EXPECTF-- -Nonexistent: -Warning: sybase_set_message_handler() expects parameter 1 to be a valid callback, function 'function_does_not_exist' not found or invalid function name in %stest.inc on line %d -NULL -Static method: bool(true) -Instance method: bool(true) -Lambda function: bool(true) -Unset: bool(true) -Incorrect type: -Warning: sybase_set_message_handler() expects parameter 1 to be a valid callback, no array or string given in %stest.inc on line %d -NULL -Function: bool(true) ->>> Query: select getdate(NULL) -*** Caught Sybase Server Message #%d [Severity %d, state %d] at line %d - %s -<<< Return: boolean -bool(false) diff --git a/ext/sybase_ct/tests/test_msghandler_handled.phpt b/ext/sybase_ct/tests/test_msghandler_handled.phpt deleted file mode 100644 index 5952c3b00b..0000000000 --- a/ext/sybase_ct/tests/test_msghandler_handled.phpt +++ /dev/null @@ -1,69 +0,0 @@ ---TEST-- -Sybase-CT server message handler ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - // {{{ bool sybase_msg_handler(int msgnumber, int severity, int state, int line, string text) - // Handles server messages - function user_message_handler($msgnumber, $severity, $state, $line, $text) { - switch ($msgnumber) { - case 0: // print message - printf("!!! %s\n", trim($text)); - return; - - case 174: // The function 'GETDATE' requires 0 arguments. - case 11021: // Function GETDATE invoked with wrong number or type of argument(s) - printf("*** Caught '%s'\n", trim($text)); - return; - } - printf("Cannot handle message #%d\n", $msgnumber); - return FALSE; // Indicate we can't handle this - } - // }}} - - sybase_set_messagehandler_ex('user_message_handler'); - $db= sybase_connect_ex(); - sybase_min_server_severity(0); - - // These are handled - var_dump(sybase_select_ex($db, 'select getdate(NULL)')); - var_dump(sybase_select_ex($db, 'print "Hi"')); - - // These aren't - var_dump(sybase_select_ex($db, 'use NULL')); - var_dump(sybase_select_ex($db, 'select convert(datetime, "notadate")')); - - sybase_close($db); -?> ---EXPECTF-- -bool(true) ->>> Query: select getdate(NULL) -*** Caught '%s' -<<< Return: boolean -bool(false) ->>> Query: print "Hi" -!!! Hi -<<< Return: boolean -bool(true) ->>> Query: use NULL -Cannot handle message #156 - -Warning: sybase_query(): Sybase: Server message: Incorrect syntax near the keyword 'NULL'. - (severity 15, procedure N/A) in %s on line %d -<<< Return: boolean -bool(false) ->>> Query: select convert(datetime, "notadate") -Cannot handle message #249 - -Warning: sybase_query(): Sybase: Server message: Syntax error during explicit conversion of VARCHAR value 'notadate' to a DATETIME field. - (severity 16, procedure N/A) in %s on line %d -<<< Return: boolean -bool(false) diff --git a/ext/sybase_ct/tests/test_query_nostore.phpt b/ext/sybase_ct/tests/test_query_nostore.phpt deleted file mode 100644 index 9d717ec2fd..0000000000 --- a/ext/sybase_ct/tests/test_query_nostore.phpt +++ /dev/null @@ -1,98 +0,0 @@ ---TEST-- -Sybase-CT query without storing ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db= sybase_connect_ex(); - - // Create test table and insert some data - var_dump(sybase_query(' - create table #test ( - id numeric(10, 0) primary key not null, - caption varchar(255) not null, - author varchar(50) not null, - link varchar(255) null, - lastchange datetime default getdate() null - ) - ', $db)); - var_dump(sybase_query('insert into #test ( - id, caption, author - ) values ( - 1, "Hello", "timm" - ) - ', $db)); - var_dump(sybase_query('insert into #test ( - id, caption, author, link - ) values ( - 2, "World", "thekid", "http://thekid.de/" - ) - ', $db)); - var_dump(sybase_query('insert into #test ( - id, caption, author - ) values ( - 3, "PHP", "friebe" - ) - ', $db)); - - // Fetch data - $q= sybase_unbuffered_query('select * from #test order by id', $db, FALSE); - var_dump($q); - while ($row= sybase_fetch_assoc($q)) { - var_dump($row); - } - - // Clean up and close connection - var_dump(sybase_query('drop table #test')); - sybase_close($db); -?> ---EXPECTF-- -bool(true) -bool(true) -bool(true) -bool(true) -resource(%d) of type (sybase-ct result) -array(5) { - ["id"]=> - int(1) - ["caption"]=> - string(5) "Hello" - ["author"]=> - string(4) "timm" - ["link"]=> - NULL - ["lastchange"]=> - string(%d) "%s" -} -array(5) { - ["id"]=> - int(2) - ["caption"]=> - string(5) "World" - ["author"]=> - string(6) "thekid" - ["link"]=> - string(17) "http://thekid.de/" - ["lastchange"]=> - string(%d) "%s" -} -array(5) { - ["id"]=> - int(3) - ["caption"]=> - string(3) "PHP" - ["author"]=> - string(6) "friebe" - ["link"]=> - NULL - ["lastchange"]=> - string(%d) "%s" -} -bool(true) diff --git a/ext/sybase_ct/tests/test_types.phpt b/ext/sybase_ct/tests/test_types.phpt deleted file mode 100644 index 735c02d843..0000000000 --- a/ext/sybase_ct/tests/test_types.phpt +++ /dev/null @@ -1,87 +0,0 @@ ---TEST-- -Sybase-CT select and types ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - define('LONG_MAX', is_int(2147483648) ? 9223372036854775807 : 2147483647); - define('LONG_MIN', -LONG_MAX - 1); - - $db= sybase_connect_ex(); - var_dump(sybase_select_ex($db, 'select - 1 as "integer", - '.(LONG_MIN).' as "integer_min", - '.(LONG_MIN - 1).' as "integer_min_exceed", - '.(LONG_MAX).' as "integer_max", - '.(LONG_MAX + 1).' as "integer_max_exceed", - 1.0 as "float", - 12345678901234567890123456789012.123456 as "large_float", - $22.36 as "money", - "Binford" as "string", - convert(datetime, "2004-01-23") as "date", - NULL as "null", - convert(bit, 1) as "bit", - convert(smalldatetime, "2004-01-23") as "smalldate", - convert(char(10), "char") as "char10" - ')); - - sybase_close($db); -?> ---EXPECTF-- ->>> Query: select - 1 as "integer", - -%s as "integer_min", - -%s as "integer_min_exceed", - %s as "integer_max", - %s as "integer_max_exceed", - 1.0 as "float", - 12345678901234567890123456789012.123456 as "large_float", - $22.36 as "money", - "Binford" as "string", - convert(datetime, "2004-01-23") as "date", - NULL as "null", - convert(bit, 1) as "bit", - convert(smalldatetime, "2004-01-23") as "smalldate", - convert(char(10), "char") as "char10" - -<<< Return: resource -array(1) { - [0]=> - array(%d) { - ["integer"]=> - int(1) - ["integer_min"]=> - int(-%s) - ["integer_min_exceed"]=> - float(-%s) - ["integer_max"]=> - int(%s) - ["integer_max_exceed"]=> - float(%s) - ["float"]=> - float(1) - ["large_float"]=> - string(39) "12345678901234567890123456789012.123456" - ["money"]=> - float(22.36) - ["string"]=> - string(7) "Binford" - ["date"]=> - string(19) "Jan 23 2004 12:00AM" - ["null"]=> - NULL - ["bit"]=> - int(1) - ["smalldate"]=> - string(19) "Jan 23 2004 12:00AM" - ["char10"]=> - string(10) "char " - } -} diff --git a/ext/sybase_ct/tests/test_unbuffered_no_full_fetch.phpt b/ext/sybase_ct/tests/test_unbuffered_no_full_fetch.phpt deleted file mode 100644 index 5faf8fe4de..0000000000 --- a/ext/sybase_ct/tests/test_unbuffered_no_full_fetch.phpt +++ /dev/null @@ -1,44 +0,0 @@ ---TEST-- -Sybase-CT unbuffered query without full fetching ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db= sybase_connect_ex(); - var_dump($db); - - // Fetch #1 - $q= sybase_unbuffered_query('select name from master..systypes', $db); - var_dump($q, key(sybase_fetch_assoc($q))); - - // Fetch #2 - without having fetched all rows from previous query - $q= sybase_unbuffered_query('select name from master..systypes', $db); - var_dump($q, key(sybase_fetch_assoc($q))); - - // Fetch #3 - free first, without having fetched all rows from previous query - sybase_free_result($q); - $q= sybase_unbuffered_query('select name from master..systypes', $db); - var_dump($q, key(sybase_fetch_assoc($q))); - - // Close - without having fetched all rows from previous query - sybase_close($db); - echo 'CLOSED'; -?> ---EXPECTF-- -resource(%d) of type (sybase-ct link) -resource(%d) of type (sybase-ct result) -string(4) "name" - -Notice: sybase_unbuffered_query(): Sybase: Called without first fetching all rows from a previous unbuffered query in %s on line %d -resource(%d) of type (sybase-ct result) -string(4) "name" -resource(%d) of type (sybase-ct result) -string(4) "name" -CLOSED diff --git a/ext/sybase_ct/tests/test_unbuffered_query.phpt b/ext/sybase_ct/tests/test_unbuffered_query.phpt deleted file mode 100644 index b2be2f2304..0000000000 --- a/ext/sybase_ct/tests/test_unbuffered_query.phpt +++ /dev/null @@ -1,57 +0,0 @@ ---TEST-- -Sybase-CT unbuffered query ---SKIPIF-- -<?php require('skipif.inc'); ?> ---FILE-- -<?php -/* This file is part of PHP test framework for ext/sybase_ct - * - * $Id$ - */ - - require('test.inc'); - - $db= sybase_connect_ex(); - var_dump($db); - - // Test #1: num_rows - $q= sybase_unbuffered_query('select name from master..systypes', $db); - var_dump($q); - $i= 0; - while ($r= sybase_fetch_assoc($q)) { - $i++; - } - var_dump($i, sybase_num_rows($q), $i == sybase_num_rows($q), $q); - sybase_free_result($q); - var_dump($q); - - // Test #2: after sybase_free_result, this should be an invalid resource - var_dump(FALSE == sybase_num_rows($q)); - - // Test #3: Seeking - $q= sybase_unbuffered_query('select name from master..systypes', $db); - var_dump($q); - $j= 0; - sybase_data_seek($q, 4); - while ($r= sybase_fetch_assoc($q)) { - $j++; - } - var_dump($i, $j, $i - $j); - - sybase_close($db); -?> ---EXPECTF-- -resource(%d) of type (sybase-ct link) -resource(%d) of type (sybase-ct result) -int(%d) -int(%d) -bool(true) -resource(%d) of type (sybase-ct result) -resource(%d) of type (Unknown) - -Warning: sybase_num_rows(): %d is not a valid Sybase result resource in %stest_unbuffered_query.php on line %d -bool(true) -resource(%d) of type (sybase-ct result) -int(%d) -int(%d) -int(4) |