1999-11-03 20:35:58 +00:00
/*
2001-03-13 16:33:39 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2004-01-08 08:18:22 +00:00
| PHP Version 5 |
1999-11-03 20:35:58 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2006-01-01 12:51:34 +00:00
| Copyright ( c ) 1997 - 2006 The PHP Group |
1999-11-03 20:35:58 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2006-01-01 12:51:34 +00:00
| This source file is subject to version 3.01 of the PHP license , |
1999-11-03 20:35:58 +00:00
| that is bundled with this package in the file LICENSE , and is |
2003-06-10 20:04:29 +00:00
| available through the world - wide - web at the following url : |
2006-01-01 12:51:34 +00:00
| http : //www.php.net/license/3_01.txt |
1999-11-03 20:35:58 +00:00
| 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 . |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2003-06-14 03:35:16 +00:00
| Author : Frank M . Kromann < frank @ kromann . info > |
1999-11-03 20:35:58 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*/
/* $Id$ */
2000-05-23 09:33:51 +00:00
# ifdef COMPILE_DL_MSSQL
1999-11-03 20:35:58 +00:00
# define HAVE_MSSQL 1
# endif
2001-05-24 10:07:29 +00:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
1999-11-03 20:35:58 +00:00
# include "php.h"
# include "php_globals.h"
1999-12-04 19:19:57 +00:00
# include "ext/standard/php_standard.h"
2000-04-06 21:07:44 +00:00
# include "ext/standard/info.h"
1999-11-03 20:35:58 +00:00
# include "php_mssql.h"
# include "php_ini.h"
# if HAVE_MSSQL
# define SAFE_STRING(s) ((s)?(s):"")
2001-06-05 21:09:50 +00:00
# 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 ;
2000-02-13 19:06:51 +00:00
2001-10-23 16:34:52 +00:00
static void php_mssql_get_column_content_with_type ( mssql_link * mssql_ptr , int offset , zval * result , int column_type TSRMLS_DC ) ;
static void php_mssql_get_column_content_without_type ( mssql_link * mssql_ptr , int offset , zval * result , int column_type TSRMLS_DC ) ;
1999-11-03 20:35:58 +00:00
2001-06-05 21:09:50 +00:00
static void _mssql_bind_hash_dtor ( void * data ) ;
2005-12-06 18:47:14 +00:00
zend_function_entry mssql_functions [ ] = {
2000-02-13 19:06:51 +00:00
PHP_FE ( mssql_connect , NULL )
PHP_FE ( mssql_pconnect , NULL )
PHP_FE ( mssql_close , NULL )
PHP_FE ( mssql_select_db , NULL )
PHP_FE ( mssql_query , NULL )
2000-11-21 03:09:16 +00:00
PHP_FE ( mssql_fetch_batch , NULL )
PHP_FE ( mssql_rows_affected , NULL )
2000-02-13 19:06:51 +00:00
PHP_FE ( mssql_free_result , NULL )
PHP_FE ( mssql_get_last_message , NULL )
PHP_FE ( mssql_num_rows , NULL )
PHP_FE ( mssql_num_fields , NULL )
PHP_FE ( mssql_fetch_field , NULL )
PHP_FE ( mssql_fetch_row , NULL )
PHP_FE ( mssql_fetch_array , NULL )
2001-12-02 21:10:15 +00:00
PHP_FE ( mssql_fetch_assoc , NULL )
2000-02-13 19:06:51 +00:00
PHP_FE ( mssql_fetch_object , NULL )
PHP_FE ( mssql_field_length , NULL )
PHP_FE ( mssql_field_name , NULL )
PHP_FE ( mssql_field_type , NULL )
PHP_FE ( mssql_data_seek , NULL )
PHP_FE ( mssql_field_seek , NULL )
PHP_FE ( mssql_result , NULL )
2001-03-09 23:37:56 +00:00
PHP_FE ( mssql_next_result , NULL )
2000-02-13 19:06:51 +00:00
PHP_FE ( mssql_min_error_severity , NULL )
PHP_FE ( mssql_min_message_severity , NULL )
2001-06-05 21:09:50 +00:00
PHP_FE ( mssql_init , NULL )
2003-08-03 17:44:39 +00:00
PHP_FE ( mssql_bind , third_arg_force_ref )
2001-06-05 21:09:50 +00:00
PHP_FE ( mssql_execute , NULL )
2003-01-09 08:00:07 +00:00
PHP_FE ( mssql_free_statement , NULL )
2001-06-28 16:59:17 +00:00
PHP_FE ( mssql_guid_string , NULL )
1999-11-03 20:35:58 +00:00
{ NULL , NULL , NULL }
} ;
2006-06-15 18:33:09 +00:00
ZEND_DECLARE_MODULE_GLOBALS ( mssql )
static PHP_GINIT_FUNCTION ( mssql ) ;
2001-03-09 23:37:56 +00:00
zend_module_entry mssql_module_entry =
{
2001-10-11 23:33:59 +00:00
STANDARD_MODULE_HEADER ,
2000-03-06 18:44:01 +00:00
" mssql " ,
1999-11-03 20:35:58 +00:00
mssql_functions ,
PHP_MINIT ( mssql ) ,
PHP_MSHUTDOWN ( mssql ) ,
PHP_RINIT ( mssql ) ,
PHP_RSHUTDOWN ( mssql ) ,
PHP_MINFO ( mssql ) ,
2006-06-15 18:33:09 +00:00
NO_VERSION_YET ,
PHP_MODULE_GLOBALS ( mssql ) ,
PHP_GINIT ( mssql ) ,
NULL ,
NULL ,
STANDARD_MODULE_PROPERTIES_EX
1999-11-03 20:35:58 +00:00
} ;
2000-05-23 09:33:51 +00:00
# ifdef COMPILE_DL_MSSQL
2000-05-02 00:30:36 +00:00
ZEND_GET_MODULE ( mssql )
2003-08-31 12:41:53 +00:00
# ifdef PHP_WIN32
# include "zend_arg_defs.c"
# endif
1999-11-03 20:35:58 +00:00
# endif
2003-01-18 21:31:11 +00:00
# define CHECK_LINK(link) { if (link==-1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "A link to the server could not be established"); RETURN_FALSE; } }
1999-11-03 20:35:58 +00:00
2000-11-30 22:24:00 +00:00
static PHP_INI_DISP ( display_text_size )
{
char * value ;
2001-08-05 15:55:43 +00:00
TSRMLS_FETCH ( ) ;
2000-11-30 22:24:00 +00:00
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 ) ;
}
}
1999-11-03 20:35:58 +00:00
PHP_INI_BEGIN ( )
2000-11-29 22:06:47 +00:00
STD_PHP_INI_BOOLEAN ( " mssql.allow_persistent " , " 1 " , PHP_INI_SYSTEM , OnUpdateBool , allow_persistent , zend_mssql_globals , mssql_globals )
2003-03-07 05:15:28 +00:00
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 )
2000-11-29 22:06:47 +00:00
STD_PHP_INI_BOOLEAN ( " mssql.compatability_mode " , " 0 " , PHP_INI_ALL , OnUpdateBool , compatability_mode , zend_mssql_globals , mssql_globals )
2003-03-07 05:15:28 +00:00
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 )
2001-10-23 16:34:52 +00:00
STD_PHP_INI_BOOLEAN ( " mssql.datetimeconvert " , " 1 " , PHP_INI_ALL , OnUpdateBool , datetimeconvert , zend_mssql_globals , mssql_globals )
2002-05-09 20:37:45 +00:00
STD_PHP_INI_BOOLEAN ( " mssql.secure_connection " , " 0 " , PHP_INI_SYSTEM , OnUpdateBool , secure_connection , zend_mssql_globals , mssql_globals )
2005-11-14 23:14:25 +00:00
STD_PHP_INI_ENTRY_EX ( " mssql.max_procs " , " -1 " , PHP_INI_ALL , OnUpdateLong , max_procs , zend_mssql_globals , mssql_globals , display_link_numbers )
2005-12-21 22:43:06 +00:00
# ifdef HAVE_FREETDS
STD_PHP_INI_ENTRY ( " mssql.charset " , " " , PHP_INI_ALL , OnUpdateString , charset , zend_mssql_globals , mssql_globals )
# endif
1999-11-03 20:35:58 +00:00
PHP_INI_END ( )
/* error handler */
static int php_mssql_error_handler ( DBPROCESS * dbproc , int severity , int dberr , int oserr , char * dberrstr , char * oserrstr )
{
2001-07-28 11:36:37 +00:00
TSRMLS_FETCH ( ) ;
1999-11-03 20:35:58 +00:00
if ( severity > = MS_SQL_G ( min_error_severity ) ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " %s (severity %d) " , dberrstr , severity ) ;
1999-11-03 20:35:58 +00:00
}
return INT_CANCEL ;
}
/* message handler */
static int php_mssql_message_handler ( DBPROCESS * dbproc , DBINT msgno , int msgstate , int severity , char * msgtext , char * srvname , char * procname , DBUSMALLINT line )
{
2001-07-28 11:36:37 +00:00
TSRMLS_FETCH ( ) ;
1999-11-03 20:35:58 +00:00
if ( severity > = MS_SQL_G ( min_message_severity ) ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " message: %s (severity %d) " , msgtext , severity ) ;
1999-11-03 20:35:58 +00:00
}
2001-10-29 23:41:15 +00:00
if ( MS_SQL_G ( server_message ) ) {
STR_FREE ( MS_SQL_G ( server_message ) ) ;
2003-12-02 18:38:30 +00:00
MS_SQL_G ( server_message ) = NULL ;
2001-10-29 23:41:15 +00:00
}
1999-11-03 20:35:58 +00:00
MS_SQL_G ( server_message ) = estrdup ( msgtext ) ;
return 0 ;
}
2005-12-05 23:38:04 +00:00
static int _clean_invalid_results ( zend_rsrc_list_entry * le TSRMLS_DC )
1999-11-03 20:35:58 +00:00
{
2001-09-25 21:58:48 +00:00
if ( Z_TYPE_P ( le ) = = le_result ) {
1999-11-03 20:35:58 +00:00
mssql_link * mssql_ptr = ( ( mssql_result * ) le - > ptr ) - > mssql_ptr ;
if ( ! mssql_ptr - > valid ) {
return 1 ;
}
}
return 0 ;
}
2001-03-09 23:37:56 +00:00
static void _free_result ( mssql_result * result , int free_fields )
1999-11-03 20:35:58 +00:00
{
int i , j ;
if ( result - > data ) {
for ( i = 0 ; i < result - > num_rows ; i + + ) {
2000-11-21 03:09:16 +00:00
if ( result - > data [ i ] ) {
for ( j = 0 ; j < result - > num_fields ; j + + ) {
zval_dtor ( & result - > data [ i ] [ j ] ) ;
}
efree ( result - > data [ i ] ) ;
1999-11-03 20:35:58 +00:00
}
}
efree ( result - > data ) ;
2001-03-09 23:37:56 +00:00
result - > data = NULL ;
result - > blocks_initialized = 0 ;
1999-11-03 20:35:58 +00:00
}
2001-03-09 23:37:56 +00:00
if ( free_fields & & result - > fields ) {
1999-11-03 20:35:58 +00:00
for ( i = 0 ; i < result - > num_fields ; i + + ) {
STR_FREE ( result - > fields [ i ] . name ) ;
STR_FREE ( result - > fields [ i ] . column_source ) ;
}
efree ( result - > fields ) ;
}
2001-03-09 23:37:56 +00:00
}
2004-02-18 20:22:40 +00:00
static void _free_mssql_statement ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
2001-06-05 21:09:50 +00:00
{
2004-02-18 20:22:40 +00:00
mssql_statement * statement = ( mssql_statement * ) rsrc - > ptr ;
2001-06-05 21:09:50 +00:00
if ( statement - > binds ) {
zend_hash_destroy ( statement - > binds ) ;
efree ( statement - > binds ) ;
}
efree ( statement ) ;
}
2001-07-31 05:44:11 +00:00
static void _free_mssql_result ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
2001-03-09 23:37:56 +00:00
{
mssql_result * result = ( mssql_result * ) rsrc - > ptr ;
2001-07-31 05:44:11 +00:00
2001-03-09 23:37:56 +00:00
_free_result ( result , 1 ) ;
2006-04-04 18:49:12 +00:00
dbcancel ( result - > mssql_ptr - > link ) ;
1999-11-03 20:35:58 +00:00
efree ( result ) ;
}
2001-07-30 08:24:42 +00:00
static void php_mssql_set_default_link ( int id TSRMLS_DC )
2000-02-13 19:06:51 +00:00
{
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 ) ;
}
1999-11-03 20:35:58 +00:00
2001-07-31 05:44:11 +00:00
static void _close_mssql_link ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
1999-11-03 20:35:58 +00:00
{
2000-10-20 18:25:16 +00:00
mssql_link * mssql_ptr = ( mssql_link * ) rsrc - > ptr ;
1999-11-03 20:35:58 +00:00
mssql_ptr - > valid = 0 ;
2001-07-31 04:53:54 +00:00
zend_hash_apply ( & EG ( regular_list ) , ( apply_func_t ) _clean_invalid_results TSRMLS_CC ) ;
1999-11-03 20:35:58 +00:00
dbclose ( mssql_ptr - > link ) ;
dbfreelogin ( mssql_ptr - > login ) ;
efree ( mssql_ptr ) ;
MS_SQL_G ( num_links ) - - ;
}
2001-07-31 05:44:11 +00:00
static void _close_mssql_plink ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
1999-11-03 20:35:58 +00:00
{
2000-10-20 18:25:16 +00:00
mssql_link * mssql_ptr = ( mssql_link * ) rsrc - > ptr ;
1999-11-03 20:35:58 +00:00
dbclose ( mssql_ptr - > link ) ;
dbfreelogin ( mssql_ptr - > login ) ;
2001-06-05 21:09:50 +00:00
free ( mssql_ptr ) ;
1999-11-03 20:35:58 +00:00
MS_SQL_G ( num_persistent ) - - ;
MS_SQL_G ( num_links ) - - ;
}
2001-06-05 21:09:50 +00:00
static void _mssql_bind_hash_dtor ( void * data )
{
mssql_bind * bind = ( mssql_bind * ) data ;
zval_ptr_dtor ( & ( bind - > zval ) ) ;
}
2006-06-15 18:33:09 +00:00
static PHP_GINIT_FUNCTION ( mssql )
1999-11-03 20:35:58 +00:00
{
2001-05-08 18:10:25 +00:00
long compatability_mode ;
2001-07-30 17:27:08 +00:00
mssql_globals - > num_persistent = 0 ;
2004-11-15 22:45:29 +00:00
mssql_globals - > get_column_content = php_mssql_get_column_content_with_type ;
2001-05-08 18:10:25 +00:00
if ( cfg_get_long ( " mssql.compatability_mode " , & compatability_mode ) = = SUCCESS ) {
if ( compatability_mode ) {
2001-07-30 17:27:08 +00:00
mssql_globals - > get_column_content = php_mssql_get_column_content_without_type ;
2001-05-08 18:10:25 +00:00
}
2003-02-09 08:33:40 +00:00
}
1999-11-03 20:35:58 +00:00
}
PHP_MINIT_FUNCTION ( mssql )
{
2000-02-13 19:06:51 +00:00
REGISTER_INI_ENTRIES ( ) ;
2001-05-08 18:10:25 +00:00
2004-02-18 20:22:40 +00:00
le_statement = zend_register_list_destructors_ex ( _free_mssql_statement , NULL , " mssql statement " , module_number ) ;
2000-10-25 17:44:02 +00:00
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 ) ;
2001-09-25 21:58:48 +00:00
Z_TYPE ( mssql_module_entry ) = type ;
1999-11-03 20:35:58 +00:00
if ( dbinit ( ) = = FAIL ) {
return FAILURE ;
}
2001-05-08 18:10:25 +00:00
2001-06-05 21:09:50 +00:00
/* 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 ) ;
2003-02-09 07:18:02 +00:00
REGISTER_LONG_CONSTANT ( " SQLFLT4 " , SQLFLT4 , CONST_CS | CONST_PERSISTENT ) ;
2001-06-05 21:09:50 +00:00
REGISTER_LONG_CONSTANT ( " SQLFLT8 " , SQLFLT8 , CONST_CS | CONST_PERSISTENT ) ;
2002-05-14 23:57:43 +00:00
REGISTER_LONG_CONSTANT ( " SQLFLTN " , SQLFLTN , CONST_CS | CONST_PERSISTENT ) ;
2001-06-05 21:09:50 +00:00
/* END MSSQL data types for mssql_sp_bind */
1999-11-03 20:35:58 +00:00
return SUCCESS ;
}
PHP_MSHUTDOWN_FUNCTION ( mssql )
{
UNREGISTER_INI_ENTRIES ( ) ;
2005-04-12 17:45:30 +00:00
# ifndef HAVE_FREETDS
dbwinexit ( ) ;
# else
1999-11-03 20:35:58 +00:00
dbexit ( ) ;
2005-04-12 17:45:30 +00:00
# endif
1999-11-03 20:35:58 +00:00
return SUCCESS ;
}
PHP_RINIT_FUNCTION ( mssql )
{
MS_SQL_G ( default_link ) = - 1 ;
MS_SQL_G ( num_links ) = MS_SQL_G ( num_persistent ) ;
2004-01-17 13:00:38 +00:00
MS_SQL_G ( appname ) = estrndup ( " PHP 5 " , 5 ) ;
2004-07-19 07:19:50 +00:00
MS_SQL_G ( server_message ) = NULL ;
1999-11-03 20:35:58 +00:00
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 ) ;
2000-11-29 22:06:47 +00:00
if ( MS_SQL_G ( connect_timeout ) < 1 ) MS_SQL_G ( connect_timeout ) = 1 ;
dbsetlogintime ( MS_SQL_G ( connect_timeout ) ) ;
2001-06-05 21:09:50 +00:00
if ( MS_SQL_G ( timeout ) < 0 ) MS_SQL_G ( timeout ) = 60 ;
dbsettime ( MS_SQL_G ( timeout ) ) ;
2005-11-14 23:14:25 +00:00
if ( MS_SQL_G ( max_procs ) ! = - 1 ) {
dbsetmaxprocs ( ( TDS_SHORT ) MS_SQL_G ( max_procs ) ) ;
}
1999-11-03 20:35:58 +00:00
return SUCCESS ;
}
PHP_RSHUTDOWN_FUNCTION ( mssql )
{
2000-02-13 19:06:51 +00:00
STR_FREE ( MS_SQL_G ( appname ) ) ;
2004-07-10 07:46:17 +00:00
MS_SQL_G ( appname ) = NULL ;
2000-02-13 19:06:51 +00:00
if ( MS_SQL_G ( server_message ) ) {
STR_FREE ( MS_SQL_G ( server_message ) ) ;
2003-12-02 18:38:30 +00:00
MS_SQL_G ( server_message ) = NULL ;
2000-02-13 19:06:51 +00:00
}
1999-11-03 20:35:58 +00:00
return SUCCESS ;
}
PHP_MINFO_FUNCTION ( mssql )
{
char buf [ 32 ] ;
2000-04-06 21:07:44 +00:00
php_info_print_table_start ( ) ;
php_info_print_table_header ( 2 , " MSSQL Support " , " enabled " ) ;
1999-11-03 20:35:58 +00:00
sprintf ( buf , " %ld " , MS_SQL_G ( num_persistent ) ) ;
php_info_print_table_row ( 2 , " Active Persistent Links " , buf ) ;
sprintf ( 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 ) ;
2000-04-06 21:07:44 +00:00
php_info_print_table_end ( ) ;
DISPLAY_INI_ENTRIES ( ) ;
1999-11-03 20:35:58 +00:00
}
2001-06-05 21:09:50 +00:00
static void php_mssql_do_connect ( INTERNAL_FUNCTION_PARAMETERS , int persistent )
1999-11-03 20:35:58 +00:00
{
char * user , * passwd , * host ;
char * hashed_details ;
2005-09-05 05:04:31 +00:00
int hashed_details_length , new_link = 0 ;
1999-11-03 20:35:58 +00:00
mssql_link mssql , * mssql_ptr ;
char buffer [ 32 ] ;
2000-06-05 19:47:54 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
1999-11-03 20:35:58 +00:00
case 0 : /* defaults */
host = user = passwd = NULL ;
2000-02-13 19:06:51 +00:00
hashed_details_length = 5 + 3 ;
2002-12-03 05:56:39 +00:00
hashed_details = ( char * ) emalloc ( hashed_details_length + 1 ) ;
2000-02-13 19:06:51 +00:00
strcpy ( hashed_details , " mssql___ " ) ;
1999-11-03 20:35:58 +00:00
break ;
case 1 : {
2000-01-17 22:41:59 +00:00
zval * * yyhost ;
1999-11-03 20:35:58 +00:00
1999-12-18 22:40:35 +00:00
if ( zend_get_parameters_ex ( 1 , & yyhost ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
WRONG_PARAM_COUNT ;
}
convert_to_string_ex ( yyhost ) ;
2001-09-25 21:58:48 +00:00
host = Z_STRVAL_PP ( yyhost ) ;
1999-11-03 20:35:58 +00:00
user = passwd = NULL ;
2001-09-25 21:58:48 +00:00
hashed_details_length = Z_STRLEN_PP ( yyhost ) + 5 + 3 ;
2002-12-03 05:56:39 +00:00
hashed_details = ( char * ) emalloc ( hashed_details_length + 1 ) ;
2001-09-25 21:58:48 +00:00
sprintf ( hashed_details , " mssql_%s__ " , Z_STRVAL_PP ( yyhost ) ) ;
1999-11-03 20:35:58 +00:00
}
break ;
case 2 : {
2000-01-17 22:41:59 +00:00
zval * * yyhost , * * yyuser ;
1999-11-03 20:35:58 +00:00
1999-12-18 22:40:35 +00:00
if ( zend_get_parameters_ex ( 2 , & yyhost , & yyuser ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
WRONG_PARAM_COUNT ;
}
convert_to_string_ex ( yyhost ) ;
convert_to_string_ex ( yyuser ) ;
2001-09-25 21:58:48 +00:00
host = Z_STRVAL_PP ( yyhost ) ;
user = Z_STRVAL_PP ( yyuser ) ;
1999-11-03 20:35:58 +00:00
passwd = NULL ;
2001-09-25 21:58:48 +00:00
hashed_details_length = Z_STRLEN_PP ( yyhost ) + Z_STRLEN_PP ( yyuser ) + 5 + 3 ;
2002-12-03 05:56:39 +00:00
hashed_details = ( char * ) emalloc ( hashed_details_length + 1 ) ;
2001-09-25 21:58:48 +00:00
sprintf ( hashed_details , " mssql_%s_%s_ " , Z_STRVAL_PP ( yyhost ) , Z_STRVAL_PP ( yyuser ) ) ;
1999-11-03 20:35:58 +00:00
}
break ;
case 3 : {
2000-01-17 22:41:59 +00:00
zval * * yyhost , * * yyuser , * * yypasswd ;
1999-11-03 20:35:58 +00:00
1999-12-18 22:40:35 +00:00
if ( zend_get_parameters_ex ( 3 , & yyhost , & yyuser , & yypasswd ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
WRONG_PARAM_COUNT ;
}
convert_to_string_ex ( yyhost ) ;
convert_to_string_ex ( yyuser ) ;
convert_to_string_ex ( yypasswd ) ;
2001-09-25 21:58:48 +00:00
host = Z_STRVAL_PP ( yyhost ) ;
user = Z_STRVAL_PP ( yyuser ) ;
passwd = Z_STRVAL_PP ( yypasswd ) ;
hashed_details_length = Z_STRLEN_PP ( yyhost ) + Z_STRLEN_PP ( yyuser ) + Z_STRLEN_PP ( yypasswd ) + 5 + 3 ;
2002-12-03 05:56:39 +00:00
hashed_details = ( char * ) emalloc ( hashed_details_length + 1 ) ;
2001-09-25 21:58:48 +00:00
sprintf ( hashed_details , " mssql_%s_%s_%s " , Z_STRVAL_PP ( yyhost ) , Z_STRVAL_PP ( yyuser ) , Z_STRVAL_PP ( yypasswd ) ) ; /* SAFE */
1999-11-03 20:35:58 +00:00
}
break ;
2005-09-05 05:04:31 +00:00
case 4 : {
zval * * yyhost , * * yyuser , * * yypasswd , * * yynew_link ;
if ( zend_get_parameters_ex ( 4 , & yyhost , & yyuser , & yypasswd , & yynew_link ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
convert_to_string_ex ( yyhost ) ;
convert_to_string_ex ( yyuser ) ;
convert_to_string_ex ( yypasswd ) ;
convert_to_long_ex ( yynew_link ) ;
host = Z_STRVAL_PP ( yyhost ) ;
user = Z_STRVAL_PP ( yyuser ) ;
passwd = Z_STRVAL_PP ( yypasswd ) ;
new_link = Z_LVAL_PP ( yynew_link ) ;
hashed_details_length = Z_STRLEN_PP ( yyhost ) + Z_STRLEN_PP ( yyuser ) + Z_STRLEN_PP ( yypasswd ) + 5 + 3 ;
hashed_details = ( char * ) emalloc ( hashed_details_length + 1 ) ;
sprintf ( hashed_details , " mssql_%s_%s_%s " , Z_STRVAL_PP ( yyhost ) , Z_STRVAL_PP ( yyuser ) , Z_STRVAL_PP ( yypasswd ) ) ; /* SAFE */
}
break ;
1999-11-03 20:35:58 +00:00
default :
WRONG_PARAM_COUNT ;
break ;
}
if ( hashed_details = = NULL ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Out of memory " ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
/* set a DBLOGIN record */
if ( ( mssql . login = dblogin ( ) ) = = NULL ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Unable to allocate login record " ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2002-12-16 22:26:49 +00:00
DBERRHANDLE ( mssql . login , ( EHANDLEFUNC ) php_mssql_error_handler ) ;
DBMSGHANDLE ( mssql . login , ( MHANDLEFUNC ) php_mssql_message_handler ) ;
2002-01-03 23:08:21 +00:00
2002-12-16 22:26:49 +00:00
# ifndef HAVE_FREETDS
2003-01-08 23:19:54 +00:00
if ( MS_SQL_G ( secure_connection ) ) {
2002-05-09 20:37:45 +00:00
DBSETLSECURE ( mssql . login ) ;
1999-11-03 20:35:58 +00:00
}
2002-05-09 20:37:45 +00:00
else {
2002-12-16 22:26:49 +00:00
# endif
2002-05-09 20:37:45 +00:00
if ( user ) {
DBSETLUSER ( mssql . login , user ) ;
}
if ( passwd ) {
DBSETLPWD ( mssql . login , passwd ) ;
}
2002-12-16 22:26:49 +00:00
# ifndef HAVE_FREETDS
1999-11-03 20:35:58 +00:00
}
2002-12-16 22:26:49 +00:00
# endif
2005-01-18 06:09:48 +00:00
# ifdef HAVE_FREETDS
2005-12-21 22:43:06 +00:00
if ( MS_SQL_G ( charset ) & & strlen ( MS_SQL_G ( charset ) ) ) {
DBSETLCHARSET ( mssql . login , MS_SQL_G ( charset ) ) ;
}
2005-01-18 06:09:48 +00:00
# endif
1999-11-03 20:35:58 +00:00
DBSETLAPP ( mssql . login , MS_SQL_G ( appname ) ) ;
mssql . valid = 1 ;
2002-12-16 22:26:49 +00:00
# ifndef HAVE_FREETDS
1999-11-03 20:35:58 +00:00
DBSETLVERSION ( mssql . login , DBVER60 ) ;
2002-12-16 22:26:49 +00:00
# endif
2000-03-28 01:38:50 +00:00
/* DBSETLTIME(mssql.login, TIMEOUT_INFINITE); */
1999-11-03 20:35:58 +00:00
if ( ! MS_SQL_G ( allow_persistent ) ) {
persistent = 0 ;
}
if ( persistent ) {
2005-12-05 23:38:04 +00:00
zend_rsrc_list_entry * le ;
1999-11-03 20:35:58 +00:00
/* try to find if we already have this link in our persistent list */
2005-09-05 05:04:31 +00:00
if ( new_link | | zend_hash_find ( & EG ( persistent_list ) , hashed_details , hashed_details_length + 1 , ( void * * ) & le ) = = FAILURE ) { /* we don't */
2005-12-05 23:38:04 +00:00
zend_rsrc_list_entry new_le ;
1999-11-03 20:35:58 +00:00
if ( MS_SQL_G ( max_links ) ! = - 1 & & MS_SQL_G ( num_links ) > = MS_SQL_G ( max_links ) ) {
2003-08-31 20:45:51 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Too many open links (%ld) " , MS_SQL_G ( num_links ) ) ;
1999-11-03 20:35:58 +00:00
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 ) ) {
2003-08-31 20:45:51 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Too many open persistent links (%ld) " , MS_SQL_G ( num_persistent ) ) ;
1999-11-03 20:35:58 +00:00
efree ( hashed_details ) ;
dbfreelogin ( mssql . login ) ;
RETURN_FALSE ;
}
/* create the link */
if ( ( mssql . link = dbopen ( mssql . login , host ) ) = = FAIL ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Unable to connect to server: %s " , host ) ;
1999-11-03 20:35:58 +00:00
efree ( hashed_details ) ;
dbfreelogin ( mssql . login ) ;
RETURN_FALSE ;
}
2002-12-16 22:26:49 +00:00
if ( DBSETOPT ( mssql . link , DBBUFFER , " 2 " ) = = FAIL ) {
1999-11-03 20:35:58 +00:00
efree ( hashed_details ) ;
dbfreelogin ( mssql . login ) ;
dbclose ( mssql . link ) ;
RETURN_FALSE ;
}
2005-02-25 23:24:18 +00:00
# ifndef HAVE_FREETDS
1999-11-03 20:35:58 +00:00
if ( MS_SQL_G ( textlimit ) ! = - 1 ) {
sprintf ( buffer , " %li " , MS_SQL_G ( textlimit ) ) ;
2002-12-16 22:26:49 +00:00
if ( DBSETOPT ( mssql . link , DBTEXTLIMIT , buffer ) = = FAIL ) {
1999-11-03 20:35:58 +00:00
efree ( hashed_details ) ;
dbfreelogin ( mssql . login ) ;
2004-11-15 22:45:29 +00:00
dbclose ( mssql . link ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
}
2005-02-25 23:24:18 +00:00
# endif
1999-11-10 19:58:07 +00:00
if ( MS_SQL_G ( textsize ) ! = - 1 ) {
sprintf ( buffer , " SET TEXTSIZE %li " , MS_SQL_G ( textsize ) ) ;
dbcmd ( mssql . link , buffer ) ;
dbsqlexec ( mssql . link ) ;
dbresults ( mssql . link ) ;
}
1999-11-03 20:35:58 +00:00
/* hash it up */
2001-06-05 21:09:50 +00:00
mssql_ptr = ( mssql_link * ) malloc ( sizeof ( mssql_link ) ) ;
1999-11-03 20:35:58 +00:00
memcpy ( mssql_ptr , & mssql , sizeof ( mssql_link ) ) ;
2001-09-25 21:58:48 +00:00
Z_TYPE ( new_le ) = le_plink ;
1999-11-03 20:35:58 +00:00
new_le . ptr = mssql_ptr ;
2005-12-05 23:38:04 +00:00
if ( zend_hash_update ( & EG ( persistent_list ) , hashed_details , hashed_details_length + 1 , & new_le , sizeof ( zend_rsrc_list_entry ) , NULL ) = = FAILURE ) {
2001-06-05 21:09:50 +00:00
free ( mssql_ptr ) ;
1999-11-03 20:35:58 +00:00
efree ( hashed_details ) ;
dbfreelogin ( mssql . login ) ;
2004-11-15 22:45:29 +00:00
dbclose ( mssql . link ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
MS_SQL_G ( num_persistent ) + + ;
MS_SQL_G ( num_links ) + + ;
} else { /* we do */
2001-09-25 21:58:48 +00:00
if ( Z_TYPE_P ( le ) ! = le_plink ) {
1999-11-03 20:35:58 +00:00
# if BROKEN_MSSQL_PCONNECTS
log_error ( " PHP/MS SQL: Hashed persistent link is not a MS SQL link! " , php_rqst - > server ) ;
# endif
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Hashed persistent link is not a MS SQL link! " ) ;
2004-11-15 22:45:29 +00:00
efree ( hashed_details ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
mssql_ptr = ( mssql_link * ) le - > ptr ;
/* test that the link hasn't died */
if ( DBDEAD ( mssql_ptr - > link ) = = TRUE ) {
2004-11-15 22:45:29 +00:00
dbclose ( mssql_ptr - > link ) ;
1999-11-03 20:35:58 +00:00
# if BROKEN_MSSQL_PCONNECTS
log_error ( " PHP/MS SQL: Persistent link died, trying to reconnect... " , php_rqst - > server ) ;
# endif
2004-11-15 22:45:29 +00:00
if ( ( mssql_ptr - > link = dbopen ( mssql_ptr - > login , host ) ) = = NULL ) {
1999-11-03 20:35:58 +00:00
# if BROKEN_MSSQL_PCONNECTS
log_error ( " PHP/MS SQL: Unable to reconnect! " , php_rqst - > server ) ;
# endif
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Link to server lost, unable to reconnect " ) ;
2000-02-13 19:06:51 +00:00
zend_hash_del ( & EG ( persistent_list ) , hashed_details , hashed_details_length + 1 ) ;
1999-11-03 20:35:58 +00:00
efree ( hashed_details ) ;
2004-11-15 22:45:29 +00:00
dbfreelogin ( mssql_ptr - > login ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
# if BROKEN_MSSQL_PCONNECTS
log_error ( " PHP/MS SQL: Reconnect successful! " , php_rqst - > server ) ;
# endif
2002-12-16 22:26:49 +00:00
if ( DBSETOPT ( mssql_ptr - > link , DBBUFFER , " 2 " ) = = FAIL ) {
1999-11-03 20:35:58 +00:00
# if BROKEN_MSSQL_PCONNECTS
log_error ( " PHP/MS SQL: Unable to set required options " , php_rqst - > server ) ;
# endif
2000-02-13 19:06:51 +00:00
zend_hash_del ( & EG ( persistent_list ) , hashed_details , hashed_details_length + 1 ) ;
1999-11-03 20:35:58 +00:00
efree ( hashed_details ) ;
2004-11-15 22:45:29 +00:00
dbfreelogin ( mssql_ptr - > login ) ;
dbclose ( mssql_ptr - > link ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
}
}
2000-02-13 19:06:51 +00:00
ZEND_REGISTER_RESOURCE ( return_value , mssql_ptr , le_plink ) ;
1999-11-03 20:35:58 +00:00
} else { /* non persistent */
2005-12-05 23:38:04 +00:00
zend_rsrc_list_entry * index_ptr , new_index_ptr ;
1999-11-03 20:35:58 +00:00
/* 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 .
*/
2005-09-05 05:04:31 +00:00
if ( ! new_link & & zend_hash_find ( & EG ( regular_list ) , hashed_details , hashed_details_length + 1 , ( void * * ) & index_ptr ) = = SUCCESS ) {
1999-11-03 20:35:58 +00:00
int type , link ;
void * ptr ;
2001-09-25 21:58:48 +00:00
if ( Z_TYPE_P ( index_ptr ) ! = le_index_ptr ) {
2004-11-15 22:45:29 +00:00
efree ( hashed_details ) ;
dbfreelogin ( mssql . login ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
link = ( int ) index_ptr - > ptr ;
ptr = zend_list_find ( link , & type ) ; /* check if the link is still there */
2000-02-13 19:06:51 +00:00
if ( ptr & & ( type = = le_link | | type = = le_plink ) ) {
1999-11-03 20:35:58 +00:00
zend_list_addref ( link ) ;
2001-09-25 21:58:48 +00:00
Z_LVAL_P ( return_value ) = link ;
2001-07-30 08:24:42 +00:00
php_mssql_set_default_link ( link TSRMLS_CC ) ;
2001-09-25 21:58:48 +00:00
Z_TYPE_P ( return_value ) = IS_RESOURCE ;
2004-11-15 22:45:29 +00:00
dbfreelogin ( mssql . login ) ;
1999-11-03 20:35:58 +00:00
efree ( hashed_details ) ;
return ;
} else {
2000-02-13 19:06:51 +00:00
zend_hash_del ( & EG ( regular_list ) , hashed_details , hashed_details_length + 1 ) ;
1999-11-03 20:35:58 +00:00
}
}
if ( MS_SQL_G ( max_links ) ! = - 1 & & MS_SQL_G ( num_links ) > = MS_SQL_G ( max_links ) ) {
2003-08-31 20:45:51 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Too many open links (%ld) " , MS_SQL_G ( num_links ) ) ;
1999-11-03 20:35:58 +00:00
efree ( hashed_details ) ;
2004-11-15 22:45:29 +00:00
dbfreelogin ( mssql . login ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
if ( ( mssql . link = dbopen ( mssql . login , host ) ) = = NULL ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Unable to connect to server: %s " , host ) ;
1999-11-03 20:35:58 +00:00
efree ( hashed_details ) ;
2004-11-15 22:45:29 +00:00
dbfreelogin ( mssql . login ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2002-12-16 22:26:49 +00:00
if ( DBSETOPT ( mssql . link , DBBUFFER , " 2 " ) = = FAIL ) {
1999-11-03 20:35:58 +00:00
efree ( hashed_details ) ;
dbfreelogin ( mssql . login ) ;
dbclose ( mssql . link ) ;
RETURN_FALSE ;
}
2005-01-18 06:09:48 +00:00
# ifndef HAVE_FREETDS
1999-11-03 20:35:58 +00:00
if ( MS_SQL_G ( textlimit ) ! = - 1 ) {
sprintf ( buffer , " %li " , MS_SQL_G ( textlimit ) ) ;
2002-12-16 22:26:49 +00:00
if ( DBSETOPT ( mssql . link , DBTEXTLIMIT , buffer ) = = FAIL ) {
1999-11-03 20:35:58 +00:00
efree ( hashed_details ) ;
dbfreelogin ( mssql . login ) ;
2004-11-15 22:45:29 +00:00
dbclose ( mssql . link ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
}
2005-01-18 06:09:48 +00:00
# endif
1999-11-03 20:35:58 +00:00
if ( MS_SQL_G ( textsize ) ! = - 1 ) {
sprintf ( 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 ) ) ;
2000-02-13 19:06:51 +00:00
ZEND_REGISTER_RESOURCE ( return_value , mssql_ptr , le_link ) ;
1999-11-03 20:35:58 +00:00
/* add it to the hash */
2001-09-25 21:58:48 +00:00
new_index_ptr . ptr = ( void * ) Z_LVAL_P ( return_value ) ;
Z_TYPE ( new_index_ptr ) = le_index_ptr ;
2005-12-05 23:38:04 +00:00
if ( zend_hash_update ( & EG ( regular_list ) , hashed_details , hashed_details_length + 1 , ( void * ) & new_index_ptr , sizeof ( zend_rsrc_list_entry ) , NULL ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
efree ( hashed_details ) ;
RETURN_FALSE ;
}
MS_SQL_G ( num_links ) + + ;
}
efree ( hashed_details ) ;
2001-09-25 21:58:48 +00:00
php_mssql_set_default_link ( Z_LVAL_P ( return_value ) TSRMLS_CC ) ;
1999-11-03 20:35:58 +00:00
}
2001-07-30 17:27:08 +00:00
static int php_mssql_get_default_link ( INTERNAL_FUNCTION_PARAMETERS )
1999-11-03 20:35:58 +00:00
{
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 ) ;
}
2005-09-05 05:04:31 +00:00
/* {{{ proto int mssql_connect([string servername [, string username [, string password [, bool new_link]]])
2000-03-28 17:03:32 +00:00
Establishes a connection to a MS - SQL server */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_connect )
{
php_mssql_do_connect ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 ) ;
}
2000-03-28 01:38:50 +00:00
/* }}} */
2005-09-05 05:04:31 +00:00
/* {{{ proto int mssql_pconnect([string servername [, string username [, string password [, bool new_link]]]])
2000-03-28 17:03:32 +00:00
Establishes a persistent connection to a MS - SQL server */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_pconnect )
{
php_mssql_do_connect ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 ) ;
}
2000-03-28 01:38:50 +00:00
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto bool mssql_close([resource conn_id])
2000-03-28 17:03:32 +00:00
Closes a connection to a MS - SQL server */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_close )
{
2000-02-13 19:06:51 +00:00
zval * * mssql_link_index = NULL ;
1999-11-03 20:35:58 +00:00
int id ;
mssql_link * mssql_ptr ;
2000-06-05 19:47:54 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
1999-11-03 20:35:58 +00:00
case 0 :
2001-07-30 17:27:08 +00:00
id = php_mssql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2000-02-13 19:06:51 +00:00
CHECK_LINK ( id ) ;
1999-11-03 20:35:58 +00:00
break ;
case 1 :
1999-12-18 22:40:35 +00:00
if ( zend_get_parameters_ex ( 1 , & mssql_link_index ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2000-02-13 19:06:51 +00:00
id = - 1 ;
1999-11-03 20:35:58 +00:00
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
2000-02-13 19:06:51 +00:00
ZEND_FETCH_RESOURCE2 ( mssql_ptr , mssql_link * , mssql_link_index , id , " MS SQL-Link " , le_link , le_plink ) ;
2000-10-20 19:55:03 +00:00
if ( mssql_link_index )
2003-01-09 02:44:44 +00:00
zend_list_delete ( Z_RESVAL_PP ( mssql_link_index ) ) ;
2000-10-20 19:55:03 +00:00
else
zend_list_delete ( id ) ;
1999-11-03 20:35:58 +00:00
RETURN_TRUE ;
}
2000-03-28 01:38:50 +00:00
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto bool mssql_select_db(string database_name [, resource conn_id])
2000-03-28 17:03:32 +00:00
Select a MS - SQL database */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_select_db )
{
2000-01-17 22:41:59 +00:00
zval * * db , * * mssql_link_index ;
1999-11-03 20:35:58 +00:00
int id ;
mssql_link * mssql_ptr ;
2000-06-05 19:47:54 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
1999-11-03 20:35:58 +00:00
case 1 :
1999-12-18 22:40:35 +00:00
if ( zend_get_parameters_ex ( 1 , & db ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2001-07-30 17:27:08 +00:00
id = php_mssql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2000-02-13 19:06:51 +00:00
CHECK_LINK ( id ) ;
1999-11-03 20:35:58 +00:00
break ;
case 2 :
1999-12-18 22:40:35 +00:00
if ( zend_get_parameters_ex ( 2 , & db , & mssql_link_index ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2000-02-13 19:06:51 +00:00
id = - 1 ;
1999-11-03 20:35:58 +00:00
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
2000-02-13 19:06:51 +00:00
ZEND_FETCH_RESOURCE2 ( mssql_ptr , mssql_link * , mssql_link_index , id , " MS SQL-Link " , le_link , le_plink ) ;
1999-11-03 20:35:58 +00:00
convert_to_string_ex ( db ) ;
2001-09-25 21:58:48 +00:00
if ( dbuse ( mssql_ptr - > link , Z_STRVAL_PP ( db ) ) = = FAIL ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Unable to select database: %s " , Z_STRVAL_PP ( db ) ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
} else {
RETURN_TRUE ;
}
}
2000-03-28 01:38:50 +00:00
/* }}} */
2001-10-23 16:34:52 +00:00
static void php_mssql_get_column_content_with_type ( mssql_link * mssql_ptr , int offset , zval * result , int column_type TSRMLS_DC )
1999-11-03 20:35:58 +00:00
{
if ( dbdatlen ( mssql_ptr - > link , offset ) = = 0 ) {
2001-06-05 21:09:50 +00:00
ZVAL_NULL ( result ) ;
1999-11-03 20:35:58 +00:00
return ;
}
switch ( column_type )
{
2003-04-30 21:52:37 +00:00
case SQLBIT :
1999-11-03 20:35:58 +00:00
case SQLINT1 :
case SQLINT2 :
case SQLINT4 :
case SQLINTN : {
2003-11-17 20:56:53 +00:00
ZVAL_LONG ( result , ( long ) anyintcol ( offset ) ) ;
1999-11-03 20:35:58 +00:00
break ;
2001-06-28 16:59:17 +00:00
}
1999-11-03 20:35:58 +00:00
case SQLCHAR :
case SQLVARCHAR :
case SQLTEXT : {
int length ;
char * data = charcol ( offset ) ;
length = dbdatlen ( mssql_ptr - > link , offset ) ;
2003-10-15 03:31:29 +00:00
# if ilia_0
2000-10-20 20:49:35 +00:00
while ( length > 0 & & data [ length - 1 ] = = ' ' ) { /* nuke trailing whitespace */
1999-11-03 20:35:58 +00:00
length - - ;
}
2003-10-15 03:31:29 +00:00
# endif
2003-11-17 20:56:53 +00:00
ZVAL_STRINGL ( result , data , length , 1 ) ;
1999-11-03 20:35:58 +00:00
break ;
}
2002-05-14 23:57:43 +00:00
case SQLFLT4 :
2003-11-17 20:56:53 +00:00
ZVAL_DOUBLE ( result , ( double ) floatcol4 ( offset ) ) ;
2002-05-14 23:57:43 +00:00
break ;
2004-03-19 18:45:07 +00:00
case SQLMONEY :
2004-03-29 18:32:27 +00:00
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 ;
2002-05-14 23:57:43 +00:00
case SQLFLT8 :
2003-11-17 20:56:53 +00:00
ZVAL_DOUBLE ( result , ( double ) floatcol8 ( offset ) ) ;
1999-11-03 20:35:58 +00:00
break ;
2003-07-23 16:53:26 +00:00
# ifdef SQLUNIQUE
case SQLUNIQUE : {
2005-11-01 18:15:44 +00:00
# else
case 36 : { /* FreeTDS hack */
# endif
2003-07-23 16:53:26 +00:00
char * data = charcol ( offset ) ;
/* uniqueidentifier is a 16-byte binary number */
ZVAL_STRINGL ( result , data , 16 , 1 ) ;
}
break ;
2001-05-01 18:01:08 +00:00
case SQLVARBINARY :
case SQLBINARY :
case SQLIMAGE : {
DBBINARY * bin ;
unsigned char * res_buf ;
2001-05-01 18:13:59 +00:00
int res_length = dbdatlen ( mssql_ptr - > link , offset ) ;
2001-05-01 18:01:08 +00:00
2002-12-03 05:56:39 +00:00
res_buf = ( unsigned char * ) emalloc ( res_length + 1 ) ;
2001-05-01 18:13:59 +00:00
bin = ( ( DBBINARY * ) dbdata ( mssql_ptr - > link , offset ) ) ;
2001-05-01 18:01:08 +00:00
memcpy ( res_buf , bin , res_length ) ;
2001-05-01 18:13:59 +00:00
res_buf [ res_length ] = ' \0 ' ;
2003-11-17 20:56:53 +00:00
ZVAL_STRINGL ( result , res_buf , res_length , 0 ) ;
2001-05-01 18:01:08 +00:00
}
break ;
1999-11-03 20:35:58 +00:00
case SQLNUMERIC :
default : {
2000-10-20 20:49:35 +00:00
if ( dbwillconvert ( column_type , SQLCHAR ) ) {
1999-11-03 20:35:58 +00:00
char * res_buf ;
2001-10-23 16:34:52 +00:00
DBDATEREC dateinfo ;
2001-05-09 19:18:04 +00:00
int res_length = dbdatlen ( mssql_ptr - > link , offset ) ;
2001-10-23 16:34:52 +00:00
2003-02-11 01:24:07 +00:00
if ( ( column_type ! = SQLDATETIME & & column_type ! = SQLDATETIM4 ) | | MS_SQL_G ( datetimeconvert ) ) {
2001-10-23 16:34:52 +00:00
2004-06-30 19:46:57 +00:00
switch ( column_type ) {
case SQLDATETIME :
2005-11-18 21:23:20 +00:00
case SQLDATETIM4 :
res_length + = 20 ;
2004-06-30 19:46:57 +00:00
break ;
case SQLMONEY :
case SQLMONEY4 :
case SQLMONEYN :
case SQLDECIMAL :
case SQLNUMERIC :
res_length + = 5 ;
2005-11-18 21:23:20 +00:00
case 127 :
res_length + = 20 ;
2004-06-30 19:46:57 +00:00
break ;
}
2002-12-03 05:56:39 +00:00
res_buf = ( unsigned char * ) emalloc ( res_length + 1 ) ;
2001-10-23 16:34:52 +00:00
res_length = dbconvert ( NULL , coltype ( offset ) , dbdata ( mssql_ptr - > link , offset ) , res_length , SQLCHAR , res_buf , - 1 ) ;
2004-09-28 14:07:23 +00:00
res_buf [ res_length ] = ' \0 ' ;
2001-10-23 16:34:52 +00:00
} else {
2003-02-11 01:24:07 +00:00
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 ) ) ;
}
1999-11-03 20:35:58 +00:00
2002-03-19 23:00:17 +00:00
res_length = 19 ;
2002-12-03 05:56:39 +00:00
res_buf = ( unsigned char * ) emalloc ( res_length + 1 ) ;
2001-10-23 16:34:52 +00:00
sprintf ( res_buf , " %d-%02d-%02d %02d:%02d:%02d " , dateinfo . year , dateinfo . month , dateinfo . day , dateinfo . hour , dateinfo . minute , dateinfo . second ) ;
}
2003-11-17 20:56:53 +00:00
ZVAL_STRINGL ( result , res_buf , res_length , 0 ) ;
1999-11-03 20:35:58 +00:00
} else {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " column %d has unknown data type (%d) " , offset , coltype ( offset ) ) ;
2001-07-11 12:42:25 +00:00
ZVAL_FALSE ( result ) ;
1999-11-03 20:35:58 +00:00
}
}
}
}
2002-12-03 18:57:04 +00:00
static void php_mssql_get_column_content_without_type ( mssql_link * mssql_ptr , int offset , zval * result , int column_type TSRMLS_DC )
1999-11-03 20:35:58 +00:00
{
if ( dbdatlen ( mssql_ptr - > link , offset ) = = 0 ) {
2001-06-05 21:09:50 +00:00
ZVAL_NULL ( result ) ;
1999-11-03 20:35:58 +00:00
return ;
}
2000-02-13 19:06:51 +00:00
2001-05-01 18:01:08 +00:00
if ( column_type = = SQLVARBINARY | |
column_type = = SQLBINARY | |
column_type = = SQLIMAGE ) {
DBBINARY * bin ;
unsigned char * res_buf ;
2001-05-01 18:13:59 +00:00
int res_length = dbdatlen ( mssql_ptr - > link , offset ) ;
2001-05-01 18:01:08 +00:00
2002-12-03 05:56:39 +00:00
res_buf = ( unsigned char * ) emalloc ( res_length + 1 ) ;
2001-05-01 18:13:59 +00:00
bin = ( ( DBBINARY * ) dbdata ( mssql_ptr - > link , offset ) ) ;
memcpy ( res_buf , bin , res_length ) ;
res_buf [ res_length ] = ' \0 ' ;
2003-11-17 20:56:53 +00:00
ZVAL_STRINGL ( result , res_buf , res_length , 0 ) ;
2001-05-01 18:01:08 +00:00
}
else if ( dbwillconvert ( coltype ( offset ) , SQLCHAR ) ) {
1999-11-03 20:35:58 +00:00
unsigned char * res_buf ;
2001-10-23 16:34:52 +00:00
DBDATEREC dateinfo ;
2001-05-09 19:18:04 +00:00
int res_length = dbdatlen ( mssql_ptr - > link , offset ) ;
2001-10-23 16:34:52 +00:00
2003-02-11 01:24:07 +00:00
if ( ( column_type ! = SQLDATETIME & & column_type ! = SQLDATETIM4 ) | | MS_SQL_G ( datetimeconvert ) ) {
2001-10-23 16:34:52 +00:00
2004-03-19 18:45:07 +00:00
switch ( column_type ) {
case SQLDATETIME :
2005-11-18 21:23:20 +00:00
case SQLDATETIM4 :
res_length + = 20 ;
2004-03-19 18:45:07 +00:00
break ;
case SQLMONEY :
case SQLMONEY4 :
case SQLMONEYN :
2004-06-30 19:46:57 +00:00
case SQLDECIMAL :
case SQLNUMERIC :
2004-03-19 18:45:07 +00:00
res_length + = 5 ;
2005-11-18 21:23:20 +00:00
case 127 :
res_length + = 20 ;
2004-03-19 18:45:07 +00:00
break ;
}
2001-10-23 16:34:52 +00:00
2002-12-03 05:56:39 +00:00
res_buf = ( unsigned char * ) emalloc ( res_length + 1 ) ;
2002-05-14 23:57:43 +00:00
res_length = dbconvert ( NULL , coltype ( offset ) , dbdata ( mssql_ptr - > link , offset ) , res_length , SQLCHAR , res_buf , - 1 ) ;
2004-09-28 14:07:23 +00:00
res_buf [ res_length ] = ' \0 ' ;
2001-10-23 16:34:52 +00:00
} else {
2003-02-11 01:24:07 +00:00
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 ) ) ;
}
2001-10-23 16:34:52 +00:00
2002-03-19 23:00:17 +00:00
res_length = 19 ;
2002-12-03 05:56:39 +00:00
res_buf = ( unsigned char * ) emalloc ( res_length + 1 ) ;
2001-10-23 16:34:52 +00:00
sprintf ( res_buf , " %d-%02d-%02d %02d:%02d:%02d " , dateinfo . year , dateinfo . month , dateinfo . day , dateinfo . hour , dateinfo . minute , dateinfo . second ) ;
}
2001-05-09 16:20:34 +00:00
2003-11-17 20:56:53 +00:00
ZVAL_STRINGL ( result , res_buf , res_length , 0 ) ;
1999-11-03 20:35:58 +00:00
} else {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " column %d has unknown data type (%d) " , offset , coltype ( offset ) ) ;
2001-07-11 12:42:25 +00:00
ZVAL_FALSE ( result ) ;
1999-11-03 20:35:58 +00:00
}
}
2002-12-03 18:57:04 +00:00
static void _mssql_get_sp_result ( mssql_link * mssql_ptr , mssql_statement * statement TSRMLS_DC )
{
int i , num_rets , type ;
char * parameter ;
mssql_bind * bind ;
/* Now to fetch RETVAL and OUTPUT values*/
num_rets = dbnumrets ( mssql_ptr - > link ) ;
2005-12-21 22:43:06 +00:00
2002-12-03 18:57:04 +00:00
if ( num_rets ! = 0 ) {
for ( i = 1 ; i < = num_rets ; i + + ) {
parameter = ( char * ) dbretname ( mssql_ptr - > link , i ) ;
type = dbrettype ( mssql_ptr - > link , i ) ;
2003-01-09 08:00:07 +00:00
if ( statement - > binds ! = NULL ) { /* Maybe a non-parameter sp */
2002-12-03 18:57:04 +00:00
if ( zend_hash_find ( statement - > binds , parameter , strlen ( parameter ) , ( void * * ) & bind ) = = SUCCESS ) {
2005-08-08 21:32:18 +00:00
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 */
}
2002-12-03 18:57:04 +00:00
}
}
else {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " An output parameter variable was not provided " ) ;
2002-12-03 18:57:04 +00:00
}
}
}
}
2003-01-09 08:00:07 +00:00
if ( statement - > binds ! = NULL ) { /* Maybe a non-parameter sp */
2002-12-03 18:57:04 +00:00
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 {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " stored procedure has no return value. Nothing was returned into RETVAL " ) ;
2002-12-03 18:57:04 +00:00
}
}
}
}
2001-07-30 08:24:42 +00:00
static int _mssql_fetch_batch ( mssql_link * mssql_ptr , mssql_result * result , int retvalue TSRMLS_DC )
2001-03-09 23:37:56 +00:00
{
int i , j = 0 ;
char computed_buf [ 16 ] ;
2000-11-21 03:09:16 +00:00
2005-08-08 22:55:56 +00:00
if ( ! result - > have_fields ) {
2005-08-08 21:32:18 +00:00
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 ) ;
2001-03-09 23:37:56 +00:00
} else {
2005-08-08 21:32:18 +00:00
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 ( ) ;
}
2005-08-08 22:55:56 +00:00
result - > fields [ i ] . type = coltype ( i + 1 ) ;
2005-08-08 21:32:18 +00:00
/* set numeric flag */
2005-08-08 22:55:56 +00:00
switch ( result - > fields [ i ] . type ) {
2005-08-08 21:32:18 +00:00
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 ;
2001-03-09 23:37:56 +00:00
}
}
2005-08-08 21:32:18 +00:00
result - > have_fields = 1 ;
2001-03-09 23:37:56 +00:00
}
2000-11-21 03:09:16 +00:00
i = 0 ;
2001-03-09 23:37:56 +00:00
if ( ! result - > data ) {
2003-08-12 00:58:52 +00:00
result - > data = ( zval * * ) safe_emalloc ( sizeof ( zval * ) , MSSQL_ROWS_BLOCK * ( + + result - > blocks_initialized ) , 0 ) ;
2001-03-09 23:37:56 +00:00
}
2000-11-21 03:09:16 +00:00
while ( retvalue ! = FAIL & & retvalue ! = NO_MORE_ROWS ) {
result - > num_rows + + ;
2001-03-09 23:37:56 +00:00
if ( result - > num_rows > result - > blocks_initialized * MSSQL_ROWS_BLOCK ) {
result - > data = ( zval * * ) erealloc ( result - > data , sizeof ( zval * ) * MSSQL_ROWS_BLOCK * ( + + result - > blocks_initialized ) ) ;
2000-11-21 03:09:16 +00:00
}
2003-08-12 00:58:52 +00:00
result - > data [ i ] = ( zval * ) safe_emalloc ( sizeof ( zval ) , result - > num_fields , 0 ) ;
2001-03-09 23:37:56 +00:00
for ( j = 0 ; j < result - > num_fields ; j + + ) {
INIT_ZVAL ( result - > data [ i ] [ j ] ) ;
2005-08-08 22:55:56 +00:00
MS_SQL_G ( get_column_content ( mssql_ptr , j + 1 , & result - > data [ i ] [ j ] , result - > fields [ j ] . type TSRMLS_CC ) ) ;
2000-11-21 03:09:16 +00:00
}
if ( i < result - > batchsize | | result - > batchsize = = 0 ) {
i + + ;
2001-03-09 23:37:56 +00:00
dbclrbuf ( mssql_ptr - > link , DBLASTROW ( mssql_ptr - > link ) ) ;
2000-11-21 03:09:16 +00:00
retvalue = dbnextrow ( mssql_ptr - > link ) ;
}
else
break ;
result - > lastresult = retvalue ;
}
2004-04-20 23:30:51 +00:00
if ( result - > statement & & ( retvalue = = NO_MORE_RESULTS | | retvalue = = NO_MORE_RPC_RESULTS ) ) {
2003-11-17 20:56:53 +00:00
_mssql_get_sp_result ( mssql_ptr , result - > statement TSRMLS_CC ) ;
}
2000-11-21 03:09:16 +00:00
return i ;
}
2003-01-09 08:00:07 +00:00
/* {{{ proto int mssql_fetch_batch(resource result_index)
2001-01-27 19:48:58 +00:00
Returns the next batch of records */
2001-07-28 11:36:37 +00:00
PHP_FUNCTION ( mssql_fetch_batch )
{
2000-11-21 03:09:16 +00:00
zval * * mssql_result_index ;
mssql_result * result ;
mssql_link * mssql_ptr ;
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & mssql_result_index ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
2001-09-25 21:58:48 +00:00
if ( Z_TYPE_PP ( mssql_result_index ) = = IS_RESOURCE & & Z_LVAL_PP ( mssql_result_index ) = = 0 ) {
2000-11-21 03:09:16 +00:00
RETURN_FALSE ;
}
ZEND_FETCH_RESOURCE ( result , mssql_result * , mssql_result_index , - 1 , " MS SQL-result " , le_result ) ;
mssql_ptr = result - > mssql_ptr ;
2001-03-09 23:37:56 +00:00
_free_result ( result , 0 ) ;
2000-11-21 03:09:16 +00:00
result - > cur_row = result - > num_rows = 0 ;
2001-07-30 08:24:42 +00:00
result - > num_rows = _mssql_fetch_batch ( mssql_ptr , result , result - > lastresult TSRMLS_CC ) ;
2000-11-21 03:09:16 +00:00
RETURN_LONG ( result - > num_rows ) ;
}
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto resource mssql_query(string query [, resource conn_id [, int batch_size]])
2000-03-28 17:03:32 +00:00
Perform an SQL query on a MS - SQL server database */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_query )
{
2000-11-21 03:09:16 +00:00
zval * * query , * * mssql_link_index , * * zbatchsize ;
1999-11-03 20:35:58 +00:00
int retvalue ;
mssql_link * mssql_ptr ;
mssql_result * result ;
2001-03-09 23:37:56 +00:00
int id , num_fields ;
2000-11-21 03:09:16 +00:00
int batchsize ;
1999-11-03 20:35:58 +00:00
2000-11-21 03:09:16 +00:00
batchsize = MS_SQL_G ( batchsize ) ;
2000-06-05 19:47:54 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
1999-11-03 20:35:58 +00:00
case 1 :
1999-12-18 22:40:35 +00:00
if ( zend_get_parameters_ex ( 1 , & query ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2001-07-30 17:27:08 +00:00
id = php_mssql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2000-02-13 19:06:51 +00:00
CHECK_LINK ( id ) ;
1999-11-03 20:35:58 +00:00
break ;
case 2 :
1999-12-18 22:40:35 +00:00
if ( zend_get_parameters_ex ( 2 , & query , & mssql_link_index ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2000-02-13 19:06:51 +00:00
id = - 1 ;
1999-11-03 20:35:58 +00:00
break ;
2000-11-21 03:09:16 +00:00
case 3 :
if ( zend_get_parameters_ex ( 3 , & query , & mssql_link_index , & zbatchsize ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
convert_to_long_ex ( zbatchsize ) ;
2001-09-25 21:58:48 +00:00
batchsize = Z_LVAL_PP ( zbatchsize ) ;
2000-11-21 03:09:16 +00:00
break ;
1999-11-03 20:35:58 +00:00
default :
WRONG_PARAM_COUNT ;
break ;
}
2000-02-13 19:06:51 +00:00
ZEND_FETCH_RESOURCE2 ( mssql_ptr , mssql_link * , mssql_link_index , id , " MS SQL-Link " , le_link , le_plink ) ;
1999-11-03 20:35:58 +00:00
convert_to_string_ex ( query ) ;
2001-09-25 21:58:48 +00:00
if ( dbcmd ( mssql_ptr - > link , Z_STRVAL_PP ( query ) ) = = FAIL ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Unable to set query " ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2003-01-12 06:28:41 +00:00
if ( dbsqlexec ( mssql_ptr - > link ) = = FAIL | | ( retvalue = dbresults ( mssql_ptr - > link ) ) = = FAIL ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Query failed " ) ;
2006-04-04 18:49:12 +00:00
dbcancel ( mssql_ptr - > link ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2003-03-14 17:49:44 +00:00
/* Skip results not returning any columns */
2003-01-12 06:28:41 +00:00
while ( ( num_fields = dbnumcols ( mssql_ptr - > link ) ) < = 0 & & retvalue = = SUCCEED ) {
retvalue = dbresults ( mssql_ptr - > link ) ;
}
2004-12-16 21:47:23 +00:00
if ( num_fields < = 0 ) {
2001-01-04 17:29:50 +00:00
RETURN_TRUE ;
1999-11-03 20:35:58 +00:00
}
2000-11-21 03:09:16 +00:00
2002-12-03 05:56:39 +00:00
retvalue = dbnextrow ( mssql_ptr - > link ) ;
if ( retvalue = = FAIL ) {
2006-04-04 18:49:12 +00:00
dbcancel ( mssql_ptr - > link ) ;
2002-12-03 05:56:39 +00:00
RETURN_FALSE ;
}
2000-11-29 17:08:22 +00:00
result = ( mssql_result * ) emalloc ( sizeof ( mssql_result ) ) ;
2002-12-03 18:57:04 +00:00
result - > statement = NULL ;
2001-03-09 23:37:56 +00:00
result - > num_fields = num_fields ;
result - > blocks_initialized = 1 ;
1999-11-03 20:35:58 +00:00
2000-11-21 03:09:16 +00:00
result - > batchsize = batchsize ;
2001-03-09 23:37:56 +00:00
result - > data = NULL ;
result - > blocks_initialized = 0 ;
1999-11-03 20:35:58 +00:00
result - > mssql_ptr = mssql_ptr ;
result - > cur_field = result - > cur_row = result - > num_rows = 0 ;
2005-08-08 21:32:18 +00:00
result - > have_fields = 0 ;
1999-11-03 20:35:58 +00:00
2004-11-15 22:45:29 +00:00
result - > fields = ( mssql_field * ) safe_emalloc ( sizeof ( mssql_field ) , result - > num_fields , 0 ) ;
result - > num_rows = _mssql_fetch_batch ( mssql_ptr , result , retvalue TSRMLS_CC ) ;
1999-11-03 20:35:58 +00:00
2000-02-13 19:06:51 +00:00
ZEND_REGISTER_RESOURCE ( return_value , result , le_result ) ;
1999-11-03 20:35:58 +00:00
}
2000-11-21 03:09:16 +00:00
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto int mssql_rows_affected(resource conn_id)
2001-01-27 19:48:58 +00:00
Returns the number of records affected by the query */
2001-07-28 11:36:37 +00:00
PHP_FUNCTION ( mssql_rows_affected )
{
2000-11-21 03:09:16 +00:00
zval * * mssql_link_index ;
mssql_link * mssql_ptr ;
1999-11-03 20:35:58 +00:00
2000-11-21 03:09:16 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & mssql_link_index ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
ZEND_FETCH_RESOURCE2 ( mssql_ptr , mssql_link * , mssql_link_index , - 1 , " MS SQL-Link " , le_link , le_plink ) ;
RETURN_LONG ( DBCOUNT ( mssql_ptr - > link ) ) ;
}
2000-03-28 01:38:50 +00:00
/* }}} */
2000-11-21 03:09:16 +00:00
2003-06-12 10:08:26 +00:00
/* {{{ proto bool mssql_free_result(resource result_index)
2000-03-28 17:03:32 +00:00
Free a MS - SQL result index */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_free_result )
{
2000-01-17 22:41:59 +00:00
zval * * mssql_result_index ;
1999-11-03 20:35:58 +00:00
mssql_result * result ;
2003-01-09 08:00:07 +00:00
int retvalue ;
1999-11-03 20:35:58 +00:00
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & mssql_result_index ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
WRONG_PARAM_COUNT ;
}
2001-09-25 21:58:48 +00:00
if ( Z_TYPE_PP ( mssql_result_index ) = = IS_RESOURCE & & Z_LVAL_PP ( mssql_result_index ) = = 0 ) {
2000-04-17 19:54:50 +00:00
RETURN_FALSE ;
}
2000-02-13 19:06:51 +00:00
ZEND_FETCH_RESOURCE ( result , mssql_result * , mssql_result_index , - 1 , " MS SQL-result " , le_result ) ;
2003-01-09 08:00:07 +00:00
/* Release remaining results */
do {
2003-01-12 06:28:41 +00:00
dbcanquery ( result - > mssql_ptr - > link ) ;
2003-01-09 08:00:07 +00:00
retvalue = dbresults ( result - > mssql_ptr - > link ) ;
2003-01-10 19:23:36 +00:00
} while ( retvalue = = SUCCEED ) ;
2003-01-09 08:00:07 +00:00
2003-01-09 02:44:44 +00:00
zend_list_delete ( Z_RESVAL_PP ( mssql_result_index ) ) ;
1999-11-03 20:35:58 +00:00
RETURN_TRUE ;
}
2000-03-28 01:38:50 +00:00
/* }}} */
2000-03-28 17:03:32 +00:00
/* {{{ proto string mssql_get_last_message(void)
Gets the last message from the MS - SQL server */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_get_last_message )
{
2001-10-29 23:41:15 +00:00
if ( MS_SQL_G ( server_message ) ) {
RETURN_STRING ( MS_SQL_G ( server_message ) , 1 ) ;
}
else {
2004-07-19 07:19:50 +00:00
RETURN_STRING ( " " , 1 ) ;
2001-10-29 23:41:15 +00:00
}
1999-11-03 20:35:58 +00:00
}
2000-03-28 01:38:50 +00:00
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto int mssql_num_rows(resource mssql_result_index)
2000-03-28 01:38:50 +00:00
Returns the number of rows fetched in from the result id specified */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_num_rows )
{
2000-01-17 22:41:59 +00:00
zval * * mssql_result_index ;
1999-11-03 20:35:58 +00:00
mssql_result * result ;
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & mssql_result_index ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
WRONG_PARAM_COUNT ;
}
2000-02-13 19:06:51 +00:00
ZEND_FETCH_RESOURCE ( result , mssql_result * , mssql_result_index , - 1 , " MS SQL-result " , le_result ) ;
1999-11-03 20:35:58 +00:00
2001-09-25 21:58:48 +00:00
Z_LVAL_P ( return_value ) = result - > num_rows ;
Z_TYPE_P ( return_value ) = IS_LONG ;
1999-11-03 20:35:58 +00:00
}
2000-03-28 01:38:50 +00:00
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto int mssql_num_fields(resource mssql_result_index)
2000-03-28 01:38:50 +00:00
Returns the number of fields fetched in from the result id specified */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_num_fields )
{
2000-01-17 22:41:59 +00:00
zval * * mssql_result_index ;
1999-11-03 20:35:58 +00:00
mssql_result * result ;
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & mssql_result_index ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
WRONG_PARAM_COUNT ;
}
2000-02-13 19:06:51 +00:00
ZEND_FETCH_RESOURCE ( result , mssql_result * , mssql_result_index , - 1 , " MS SQL-result " , le_result ) ;
1999-11-03 20:35:58 +00:00
2001-09-25 21:58:48 +00:00
Z_LVAL_P ( return_value ) = result - > num_fields ;
Z_TYPE_P ( return_value ) = IS_LONG ;
1999-11-03 20:35:58 +00:00
}
2000-03-28 01:38:50 +00:00
/* }}} */
2003-07-03 16:53:04 +00:00
static void php_mssql_fetch_hash ( INTERNAL_FUNCTION_PARAMETERS , int result_type , int expected_args )
1999-11-03 20:35:58 +00:00
{
2001-06-05 21:09:50 +00:00
zval * * mssql_result_index , * * resulttype = NULL ;
1999-11-03 20:35:58 +00:00
mssql_result * result ;
int i ;
2003-07-03 16:53:04 +00:00
if ( ZEND_NUM_ARGS ( ) > expected_args ) {
WRONG_PARAM_COUNT ;
}
2001-06-05 21:09:50 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & mssql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
if ( ! result_type ) {
result_type = MSSQL_BOTH ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & mssql_result_index , & resulttype ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_long_ex ( resulttype ) ;
2001-09-25 21:58:48 +00:00
result_type = Z_LVAL_PP ( resulttype ) ;
2001-06-05 21:09:50 +00:00
break ;
default :
WRONG_PARAM_COUNT ;
break ;
1999-11-03 20:35:58 +00:00
}
2000-02-13 19:06:51 +00:00
ZEND_FETCH_RESOURCE ( result , mssql_result * , mssql_result_index , - 1 , " MS SQL-result " , le_result ) ;
2001-06-05 21:09:50 +00:00
2001-10-29 23:41:15 +00:00
if ( MS_SQL_G ( server_message ) ) {
STR_FREE ( MS_SQL_G ( server_message ) ) ;
MS_SQL_G ( server_message ) = NULL ;
}
1999-11-03 20:35:58 +00:00
if ( result - > cur_row > = result - > num_rows ) {
RETURN_FALSE ;
}
2003-01-18 19:41:56 +00:00
array_init ( return_value ) ;
1999-11-03 20:35:58 +00:00
for ( i = 0 ; i < result - > num_fields ; i + + ) {
2001-06-05 21:09:50 +00:00
if ( Z_TYPE ( result - > data [ result - > cur_row ] [ i ] ) ! = IS_NULL ) {
char * data ;
int data_len ;
int should_copy ;
2001-06-13 17:00:32 +00:00
if ( Z_TYPE ( result - > data [ result - > cur_row ] [ i ] ) = = IS_STRING ) {
if ( PG ( magic_quotes_runtime ) ) {
2002-10-28 20:16:24 +00:00
data = php_addslashes ( Z_STRVAL ( result - > data [ result - > cur_row ] [ i ] ) , Z_STRLEN ( result - > data [ result - > cur_row ] [ i ] ) , & data_len , 0 TSRMLS_CC ) ;
2001-06-13 17:00:32 +00:00
should_copy = 0 ;
}
else
{
data = Z_STRVAL ( result - > data [ result - > cur_row ] [ i ] ) ;
data_len = Z_STRLEN ( result - > data [ result - > cur_row ] [ i ] ) ;
should_copy = 1 ;
}
2001-06-05 21:09:50 +00:00
2001-06-13 17:00:32 +00:00
if ( result_type & MSSQL_NUM ) {
add_index_stringl ( return_value , i , data , data_len , should_copy ) ;
should_copy = 1 ;
}
if ( result_type & MSSQL_ASSOC ) {
add_assoc_stringl ( return_value , result - > fields [ i ] . name , data , data_len , should_copy ) ;
}
2001-06-05 21:09:50 +00:00
}
2001-06-13 17:00:32 +00:00
else if ( Z_TYPE ( result - > data [ result - > cur_row ] [ i ] ) = = IS_LONG ) {
if ( result_type & MSSQL_NUM )
2001-09-26 03:43:34 +00:00
add_index_long ( return_value , i , Z_LVAL ( result - > data [ result - > cur_row ] [ i ] ) ) ;
2001-06-13 17:00:32 +00:00
if ( result_type & MSSQL_ASSOC )
2001-09-26 03:43:34 +00:00
add_assoc_long ( return_value , result - > fields [ i ] . name , Z_LVAL ( result - > data [ result - > cur_row ] [ i ] ) ) ;
2001-06-13 17:00:32 +00:00
}
else if ( Z_TYPE ( result - > data [ result - > cur_row ] [ i ] ) = = IS_DOUBLE ) {
if ( result_type & MSSQL_NUM )
2001-09-26 03:43:34 +00:00
add_index_double ( return_value , i , Z_DVAL ( result - > data [ result - > cur_row ] [ i ] ) ) ;
2001-06-13 17:00:32 +00:00
if ( result_type & MSSQL_ASSOC )
2001-09-26 03:43:34 +00:00
add_assoc_double ( return_value , result - > fields [ i ] . name , Z_DVAL ( result - > data [ result - > cur_row ] [ i ] ) ) ;
2001-06-05 21:09:50 +00:00
}
}
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 ) ;
1999-11-03 20:35:58 +00:00
}
}
result - > cur_row + + ;
}
2003-07-03 16:53:04 +00:00
/* {{{ proto array mssql_fetch_row(resource result_id)
2001-06-05 21:09:50 +00:00
Returns an array of the current row in the result set specified by result_id */
PHP_FUNCTION ( mssql_fetch_row )
{
2003-07-03 16:53:04 +00:00
php_mssql_fetch_hash ( INTERNAL_FUNCTION_PARAM_PASSTHRU , MSSQL_NUM , 1 ) ;
2001-06-05 21:09:50 +00:00
}
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto object mssql_fetch_object(resource result_id [, int result_type])
2000-03-28 17:03:32 +00:00
Returns a psuedo - object of the current row in the result set specified by result_id */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_fetch_object )
{
2003-07-03 16:53:04 +00:00
php_mssql_fetch_hash ( INTERNAL_FUNCTION_PARAM_PASSTHRU , MSSQL_ASSOC , 2 ) ;
2001-09-25 21:58:48 +00:00
if ( Z_TYPE_P ( return_value ) = = IS_ARRAY ) {
2002-03-12 20:18:01 +00:00
object_and_properties_init ( return_value , ZEND_STANDARD_CLASS_DEF_PTR , Z_ARRVAL_P ( return_value ) ) ;
1999-11-03 20:35:58 +00:00
}
}
2000-03-28 01:38:50 +00:00
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto array mssql_fetch_array(resource result_id [, int result_type])
2000-03-28 17:03:32 +00:00
Returns an associative array of the current row in the result set specified by result_id */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_fetch_array )
{
2003-07-03 16:53:04 +00:00
php_mssql_fetch_hash ( INTERNAL_FUNCTION_PARAM_PASSTHRU , MSSQL_BOTH , 2 ) ;
1999-11-03 20:35:58 +00:00
}
2000-03-28 01:38:50 +00:00
/* }}} */
2003-07-03 16:53:04 +00:00
/* {{{ proto array mssql_fetch_assoc(resource result_id)
2001-12-02 21:10:15 +00:00
Returns an associative array of the current row in the result set specified by result_id */
PHP_FUNCTION ( mssql_fetch_assoc )
{
2003-07-03 16:53:04 +00:00
php_mssql_fetch_hash ( INTERNAL_FUNCTION_PARAM_PASSTHRU , MSSQL_ASSOC , 1 ) ;
2001-12-02 21:10:15 +00:00
}
/* }}} */
2000-03-28 01:38:50 +00:00
2003-06-12 10:08:26 +00:00
/* {{{ proto bool mssql_data_seek(resource result_id, int offset)
2000-03-28 17:03:32 +00:00
Moves the internal row pointer of the MS - SQL result associated with the specified result identifier to pointer to the specified row number */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_data_seek )
{
2000-03-28 01:38:50 +00:00
zval * * mssql_result_index , * * offset ;
1999-11-03 20:35:58 +00:00
mssql_result * result ;
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & mssql_result_index , & offset ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
WRONG_PARAM_COUNT ;
}
2001-03-09 23:37:56 +00:00
ZEND_FETCH_RESOURCE ( result , mssql_result * , mssql_result_index , - 1 , " MS SQL-result " , le_result ) ;
1999-11-03 20:35:58 +00:00
2000-03-28 01:38:50 +00:00
convert_to_long_ex ( offset ) ;
2001-09-25 21:58:48 +00:00
if ( Z_LVAL_PP ( offset ) < 0 | | Z_LVAL_PP ( offset ) > = result - > num_rows ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Bad row offset " ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2001-09-25 21:58:48 +00:00
result - > cur_row = Z_LVAL_PP ( offset ) ;
1999-11-03 20:35:58 +00:00
RETURN_TRUE ;
}
2000-03-28 01:38:50 +00:00
/* }}} */
1999-11-03 20:35:58 +00:00
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 :
2003-02-09 07:18:02 +00:00
case SQLFLT4 :
1999-11-03 20:35:58 +00:00
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 ;
2003-07-23 16:53:26 +00:00
# ifdef SQLUNIQUE
case SQLUNIQUE :
return " uniqueidentifier " ;
break ;
# endif
1999-11-03 20:35:58 +00:00
default :
return " unknown " ;
break ;
}
}
2003-06-12 10:08:26 +00:00
/* {{{ proto object mssql_fetch_field(resource result_id [, int offset])
2000-03-28 01:38:50 +00:00
Gets information about certain fields in a query result */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_fetch_field )
{
2000-03-28 01:38:50 +00:00
zval * * mssql_result_index , * * offset ;
2001-03-09 23:37:56 +00:00
int field_offset ;
1999-11-03 20:35:58 +00:00
mssql_result * result ;
2000-06-05 19:47:54 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
1999-11-03 20:35:58 +00:00
case 1 :
2000-03-28 01:38:50 +00:00
if ( zend_get_parameters_ex ( 1 , & mssql_result_index ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
field_offset = - 1 ;
break ;
case 2 :
2000-03-28 01:38:50 +00:00
if ( zend_get_parameters_ex ( 2 , & mssql_result_index , & offset ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2000-03-28 01:38:50 +00:00
convert_to_long_ex ( offset ) ;
2001-09-25 21:58:48 +00:00
field_offset = Z_LVAL_PP ( offset ) ;
1999-11-03 20:35:58 +00:00
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
2001-03-09 23:37:56 +00:00
ZEND_FETCH_RESOURCE ( result , mssql_result * , mssql_result_index , - 1 , " MS SQL-result " , le_result ) ;
1999-11-03 20:35:58 +00:00
if ( field_offset = = - 1 ) {
field_offset = result - > cur_field ;
result - > cur_field + + ;
}
if ( field_offset < 0 | | field_offset > = result - > num_fields ) {
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) = = 2 ) { /* field specified explicitly */
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Bad column offset " ) ;
1999-11-03 20:35:58 +00:00
}
RETURN_FALSE ;
}
2003-01-30 02:33:16 +00:00
object_init ( return_value ) ;
1999-11-03 20:35:58 +00:00
add_property_string ( return_value , " name " , result - > fields [ field_offset ] . name , 1 ) ;
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 , 1 ) ;
add_property_long ( return_value , " numeric " , result - > fields [ field_offset ] . numeric ) ;
2001-09-26 03:43:34 +00:00
add_property_string ( return_value , " type " , php_mssql_get_field_name ( Z_TYPE ( result - > fields [ field_offset ] ) ) , 1 ) ;
1999-11-03 20:35:58 +00:00
}
2000-03-28 01:38:50 +00:00
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto int mssql_field_length(resource result_id [, int offset])
2000-03-28 17:03:32 +00:00
Get the length of a MS - SQL field */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_field_length )
{
2000-03-28 01:38:50 +00:00
zval * * mssql_result_index , * * offset ;
2001-03-09 23:37:56 +00:00
int field_offset ;
1999-11-03 20:35:58 +00:00
mssql_result * result ;
2000-06-05 19:47:54 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
1999-11-03 20:35:58 +00:00
case 1 :
2000-03-28 01:38:50 +00:00
if ( zend_get_parameters_ex ( 1 , & mssql_result_index ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
field_offset = - 1 ;
break ;
case 2 :
2000-03-28 01:38:50 +00:00
if ( zend_get_parameters_ex ( 2 , & mssql_result_index , & offset ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2000-03-28 01:38:50 +00:00
convert_to_long_ex ( offset ) ;
2001-09-25 21:58:48 +00:00
field_offset = Z_LVAL_PP ( offset ) ;
1999-11-03 20:35:58 +00:00
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
2001-03-09 23:37:56 +00:00
ZEND_FETCH_RESOURCE ( result , mssql_result * , mssql_result_index , - 1 , " MS SQL-result " , le_result ) ;
1999-11-03 20:35:58 +00:00
if ( field_offset = = - 1 ) {
field_offset = result - > cur_field ;
result - > cur_field + + ;
}
if ( field_offset < 0 | | field_offset > = result - > num_fields ) {
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) = = 2 ) { /* field specified explicitly */
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Bad column offset " ) ;
1999-11-03 20:35:58 +00:00
}
RETURN_FALSE ;
}
2001-09-25 21:58:48 +00:00
Z_LVAL_P ( return_value ) = result - > fields [ field_offset ] . max_length ;
Z_TYPE_P ( return_value ) = IS_LONG ;
1999-11-03 20:35:58 +00:00
}
2000-03-28 01:38:50 +00:00
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto string mssql_field_name(resource result_id [, int offset])
2000-03-28 17:03:32 +00:00
Returns the name of the field given by offset in the result set given by result_id */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_field_name )
{
2000-03-28 01:38:50 +00:00
zval * * mssql_result_index , * * offset ;
2001-03-09 23:37:56 +00:00
int field_offset ;
1999-11-03 20:35:58 +00:00
mssql_result * result ;
2000-06-05 19:47:54 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
1999-11-03 20:35:58 +00:00
case 1 :
2000-03-28 01:38:50 +00:00
if ( zend_get_parameters_ex ( 1 , & mssql_result_index ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
field_offset = - 1 ;
break ;
case 2 :
2000-03-28 01:38:50 +00:00
if ( zend_get_parameters_ex ( 2 , & mssql_result_index , & offset ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2000-03-28 01:38:50 +00:00
convert_to_long_ex ( offset ) ;
2001-09-25 21:58:48 +00:00
field_offset = Z_LVAL_PP ( offset ) ;
1999-11-03 20:35:58 +00:00
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
2001-03-09 23:37:56 +00:00
ZEND_FETCH_RESOURCE ( result , mssql_result * , mssql_result_index , - 1 , " MS SQL-result " , le_result ) ;
1999-11-03 20:35:58 +00:00
if ( field_offset = = - 1 ) {
field_offset = result - > cur_field ;
result - > cur_field + + ;
}
if ( field_offset < 0 | | field_offset > = result - > num_fields ) {
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) = = 2 ) { /* field specified explicitly */
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Bad column offset " ) ;
1999-11-03 20:35:58 +00:00
}
RETURN_FALSE ;
}
2003-11-17 20:56:53 +00:00
RETURN_STRINGL ( result - > fields [ field_offset ] . name , strlen ( result - > fields [ field_offset ] . name ) , 1 ) ;
1999-11-03 20:35:58 +00:00
}
2000-03-28 01:38:50 +00:00
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto string mssql_field_type(resource result_id [, int offset])
2000-03-28 17:03:32 +00:00
Returns the type of a field */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_field_type )
{
2000-03-28 01:38:50 +00:00
zval * * mssql_result_index , * * offset ;
2001-03-09 23:37:56 +00:00
int field_offset ;
1999-11-03 20:35:58 +00:00
mssql_result * result ;
2000-06-05 19:47:54 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
1999-11-03 20:35:58 +00:00
case 1 :
2000-03-28 01:38:50 +00:00
if ( zend_get_parameters_ex ( 1 , & mssql_result_index ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
field_offset = - 1 ;
break ;
case 2 :
2000-03-28 01:38:50 +00:00
if ( zend_get_parameters_ex ( 2 , & mssql_result_index , & offset ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2000-03-28 01:38:50 +00:00
convert_to_long_ex ( offset ) ;
2001-09-25 21:58:48 +00:00
field_offset = Z_LVAL_PP ( offset ) ;
1999-11-03 20:35:58 +00:00
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
2001-03-09 23:37:56 +00:00
ZEND_FETCH_RESOURCE ( result , mssql_result * , mssql_result_index , - 1 , " MS SQL-result " , le_result ) ;
1999-11-03 20:35:58 +00:00
if ( field_offset = = - 1 ) {
field_offset = result - > cur_field ;
result - > cur_field + + ;
}
if ( field_offset < 0 | | field_offset > = result - > num_fields ) {
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) = = 2 ) { /* field specified explicitly */
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Bad column offset " ) ;
1999-11-03 20:35:58 +00:00
}
RETURN_FALSE ;
}
2003-11-17 20:56:53 +00:00
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 ) ;
1999-11-03 20:35:58 +00:00
}
2000-03-28 01:38:50 +00:00
/* }}} */
2000-03-28 17:03:32 +00:00
/* {{{ proto bool mssql_field_seek(int result_id, int offset)
2000-03-28 01:38:50 +00:00
Seeks to the specified field offset */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_field_seek )
{
2000-03-28 01:38:50 +00:00
zval * * mssql_result_index , * * offset ;
2001-03-09 23:37:56 +00:00
int field_offset ;
1999-11-03 20:35:58 +00:00
mssql_result * result ;
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & mssql_result_index , & offset ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
WRONG_PARAM_COUNT ;
}
2001-03-09 23:37:56 +00:00
ZEND_FETCH_RESOURCE ( result , mssql_result * , mssql_result_index , - 1 , " MS SQL-result " , le_result ) ;
1999-11-03 20:35:58 +00:00
2000-03-28 01:38:50 +00:00
convert_to_long_ex ( offset ) ;
2001-09-25 21:58:48 +00:00
field_offset = Z_LVAL_PP ( offset ) ;
1999-11-03 20:35:58 +00:00
if ( field_offset < 0 | | field_offset > = result - > num_fields ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Bad column offset " ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
result - > cur_field = field_offset ;
RETURN_TRUE ;
}
2000-03-28 01:38:50 +00:00
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto string mssql_result(resource result_id, int row, mixed field)
2000-03-28 17:03:32 +00:00
Returns the contents of one cell from a MS - SQL result set */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_result )
{
2000-03-28 01:38:50 +00:00
zval * * row , * * field , * * mssql_result_index ;
2001-03-09 23:37:56 +00:00
int field_offset = 0 ;
1999-11-03 20:35:58 +00:00
mssql_result * result ;
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 3 | | zend_get_parameters_ex ( 3 , & mssql_result_index , & row , & field ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
WRONG_PARAM_COUNT ;
}
2001-03-09 23:37:56 +00:00
ZEND_FETCH_RESOURCE ( result , mssql_result * , mssql_result_index , - 1 , " MS SQL-result " , le_result ) ;
1999-11-03 20:35:58 +00:00
2000-03-28 01:38:50 +00:00
convert_to_long_ex ( row ) ;
2001-09-25 21:58:48 +00:00
if ( Z_LVAL_PP ( row ) < 0 | | Z_LVAL_PP ( row ) > = result - > num_rows ) {
2003-08-28 21:00:24 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Bad row offset (%ld) " , Z_LVAL_PP ( row ) ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
2001-09-25 21:58:48 +00:00
switch ( Z_TYPE_PP ( field ) ) {
1999-11-03 20:35:58 +00:00
case IS_STRING : {
int i ;
for ( i = 0 ; i < result - > num_fields ; i + + ) {
2001-09-25 21:58:48 +00:00
if ( ! strcasecmp ( result - > fields [ i ] . name , Z_STRVAL_PP ( field ) ) ) {
1999-11-03 20:35:58 +00:00
field_offset = i ;
break ;
}
}
if ( i > = result - > num_fields ) { /* no match found */
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " %s field not found in result " , Z_STRVAL_PP ( field ) ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
break ;
}
default :
2000-03-28 01:38:50 +00:00
convert_to_long_ex ( field ) ;
2001-09-25 21:58:48 +00:00
field_offset = Z_LVAL_PP ( field ) ;
1999-11-03 20:35:58 +00:00
if ( field_offset < 0 | | field_offset > = result - > num_fields ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Bad column offset specified " ) ;
1999-11-03 20:35:58 +00:00
RETURN_FALSE ;
}
break ;
}
2001-09-25 21:58:48 +00:00
* return_value = result - > data [ Z_LVAL_PP ( row ) ] [ field_offset ] ;
2004-09-28 18:38:29 +00:00
zval_copy_ctor ( return_value ) ;
1999-11-03 20:35:58 +00:00
}
2001-03-09 23:37:56 +00:00
/* }}} */
1999-11-03 20:35:58 +00:00
2003-06-12 10:08:26 +00:00
/* {{{ proto bool mssql_next_result(resource result_id)
2001-03-09 23:37:56 +00:00
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_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & mssql_result_index ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
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 ) ;
2005-11-18 19:14:32 +00:00
while ( dbnumcols ( mssql_ptr - > link ) < = 0 & & retvalue = = SUCCEED ) {
retvalue = dbresults ( mssql_ptr - > link ) ;
}
2002-12-03 18:57:04 +00:00
if ( retvalue = = FAIL ) {
RETURN_FALSE ;
}
else if ( retvalue = = NO_MORE_RESULTS | | retvalue = = NO_MORE_RPC_RESULTS ) {
2004-04-20 23:30:51 +00:00
if ( result - > statement ) {
_mssql_get_sp_result ( mssql_ptr , result - > statement TSRMLS_CC ) ;
}
2001-03-09 23:37:56 +00:00
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 ) ;
2003-08-12 00:58:52 +00:00
result - > fields = ( mssql_field * ) safe_emalloc ( sizeof ( mssql_field ) , result - > num_fields , 0 ) ;
2005-08-08 23:09:06 +00:00
result - > have_fields = 0 ;
2001-07-30 08:24:42 +00:00
result - > num_rows = _mssql_fetch_batch ( mssql_ptr , result , retvalue TSRMLS_CC ) ;
2001-03-09 23:37:56 +00:00
RETURN_TRUE ;
}
}
2000-03-28 01:38:50 +00:00
/* }}} */
2001-03-09 23:37:56 +00:00
2000-03-28 01:38:50 +00:00
/* {{{ proto void mssql_min_error_severity(int severity)
2000-03-28 17:03:32 +00:00
Sets the lower error severity */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_min_error_severity )
{
2000-03-28 01:38:50 +00:00
zval * * severity ;
1999-11-03 20:35:58 +00:00
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & severity ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
WRONG_PARAM_COUNT ;
}
2000-03-28 01:38:50 +00:00
convert_to_long_ex ( severity ) ;
2001-09-25 21:58:48 +00:00
MS_SQL_G ( min_error_severity ) = Z_LVAL_PP ( severity ) ;
1999-11-03 20:35:58 +00:00
}
2000-03-28 01:38:50 +00:00
/* }}} */
/* {{{ proto void mssql_min_message_severity(int severity)
2000-03-28 17:03:32 +00:00
Sets the lower message severity */
1999-11-03 20:35:58 +00:00
PHP_FUNCTION ( mssql_min_message_severity )
{
2000-03-28 01:38:50 +00:00
zval * * severity ;
1999-11-03 20:35:58 +00:00
2000-06-05 19:47:54 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & severity ) = = FAILURE ) {
1999-11-03 20:35:58 +00:00
WRONG_PARAM_COUNT ;
}
2000-03-28 01:38:50 +00:00
convert_to_long_ex ( severity ) ;
2001-09-25 21:58:48 +00:00
MS_SQL_G ( min_message_severity ) = Z_LVAL_PP ( severity ) ;
1999-11-03 20:35:58 +00:00
}
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto int mssql_init(string sp_name [, resource conn_id])
2001-06-05 21:09:50 +00:00
Initializes a stored procedure or a remote stored procedure */
PHP_FUNCTION ( mssql_init )
{
zval * * sp_name , * * mssql_link_index ;
mssql_link * mssql_ptr ;
mssql_statement * statement ;
int id ;
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & sp_name ) = = FAILURE ) {
RETURN_FALSE ;
}
2001-07-30 17:27:08 +00:00
id = php_mssql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-06-05 21:09:50 +00:00
CHECK_LINK ( id ) ;
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & sp_name , & mssql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( mssql_ptr , mssql_link * , mssql_link_index , id , " MS SQL-Link " , le_link , le_plink ) ;
convert_to_string_ex ( sp_name ) ;
2001-09-25 21:58:48 +00:00
if ( dbrpcinit ( mssql_ptr - > link , Z_STRVAL_PP ( sp_name ) , 0 ) = = FAIL ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " unable to init stored procedure " ) ;
2001-06-05 21:09:50 +00:00
RETURN_FALSE ;
}
statement = NULL ;
statement = ecalloc ( 1 , sizeof ( mssql_statement ) ) ;
2003-01-18 19:41:56 +00:00
statement - > link = mssql_ptr ;
statement - > executed = FALSE ;
2001-06-05 21:09:50 +00:00
statement - > id = zend_list_insert ( statement , le_statement ) ;
RETURN_RESOURCE ( statement - > id ) ;
}
/* }}} */
2004-02-18 20:22:40 +00:00
/* {{{ proto bool mssql_bind(resource stmt, string param_name, mixed var, int type [, int is_output [, int is_null [, int maxlen]]])
2001-06-05 21:09:50 +00:00
Adds a parameter to a stored procedure or a remote stored procedure */
PHP_FUNCTION ( mssql_bind )
{
2003-02-09 09:39:53 +00:00
int type , is_output , is_null , datalen , maxlen = - 1 ;
2001-06-05 21:09:50 +00:00
zval * * stmt , * * param_name , * * var , * * yytype ;
mssql_link * mssql_ptr ;
mssql_statement * statement ;
mssql_bind bind , * bindp ;
2003-07-23 16:54:34 +00:00
int status = 0 ;
2003-02-09 09:39:53 +00:00
LPBYTE value = NULL ;
2001-06-05 21:09:50 +00:00
/* BEGIN input validation */
switch ( ZEND_NUM_ARGS ( ) ) {
case 4 :
if ( zend_get_parameters_ex ( 4 , & stmt , & param_name , & var , & yytype ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_long_ex ( yytype ) ;
2001-09-25 21:58:48 +00:00
type = Z_LVAL_PP ( yytype ) ;
2001-06-05 21:09:50 +00:00
is_null = FALSE ;
is_output = FALSE ;
break ;
case 5 : {
zval * * yyis_output ;
if ( zend_get_parameters_ex ( 5 , & stmt , & param_name , & var , & yytype , & yyis_output ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_long_ex ( yytype ) ;
convert_to_long_ex ( yyis_output ) ;
2001-09-25 21:58:48 +00:00
type = Z_LVAL_PP ( yytype ) ;
2001-06-05 21:09:50 +00:00
is_null = FALSE ;
2001-09-25 21:58:48 +00:00
is_output = Z_LVAL_PP ( yyis_output ) ;
2001-06-05 21:09:50 +00:00
}
break ;
case 6 : {
zval * * yyis_output , * * yyis_null ;
if ( zend_get_parameters_ex ( 6 , & stmt , & param_name , & var , & yytype , & yyis_output , & yyis_null ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_long_ex ( yytype ) ;
convert_to_long_ex ( yyis_output ) ;
convert_to_long_ex ( yyis_null ) ;
2001-09-25 21:58:48 +00:00
type = Z_LVAL_PP ( yytype ) ;
is_output = Z_LVAL_PP ( yyis_output ) ;
is_null = Z_LVAL_PP ( yyis_null ) ;
2001-06-05 21:09:50 +00:00
}
break ;
case 7 : {
zval * * yyis_output , * * yyis_null , * * yymaxlen ;
if ( zend_get_parameters_ex ( 7 , & stmt , & param_name , & var , & yytype , & yyis_output , & yyis_null , & yymaxlen ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_long_ex ( yytype ) ;
convert_to_long_ex ( yyis_output ) ;
convert_to_long_ex ( yyis_null ) ;
convert_to_long_ex ( yymaxlen ) ;
2001-09-25 21:58:48 +00:00
type = Z_LVAL_PP ( yytype ) ;
is_output = Z_LVAL_PP ( yyis_output ) ;
is_null = Z_LVAL_PP ( yyis_null ) ;
2005-09-05 05:04:31 +00:00
if ( is_output ) {
maxlen = Z_LVAL_PP ( yymaxlen ) ;
}
2001-06-05 21:09:50 +00:00
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
/* END input validation */
2001-07-30 17:27:08 +00:00
ZEND_FETCH_RESOURCE ( statement , mssql_statement * , stmt , - 1 , " MS SQL-Statement " , le_statement ) ;
2001-06-05 21:09:50 +00:00
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 ) ;
2001-09-25 21:58:48 +00:00
datalen = Z_STRLEN_PP ( var ) ;
value = ( LPBYTE ) Z_STRVAL_PP ( var ) ;
2001-06-05 21:09:50 +00:00
}
}
else { /* fixed-length type */
if ( is_null ) {
datalen = 0 ;
}
else {
datalen = - 1 ;
}
maxlen = - 1 ;
switch ( type ) {
2003-02-09 07:18:02 +00:00
case SQLFLT4 :
2001-06-05 21:09:50 +00:00
case SQLFLT8 :
2002-05-14 23:57:43 +00:00
case SQLFLTN :
2001-06-05 21:09:50 +00:00
convert_to_double_ex ( var ) ;
2001-09-25 21:58:48 +00:00
value = ( LPBYTE ) ( & Z_DVAL_PP ( var ) ) ;
2001-06-05 21:09:50 +00:00
break ;
2003-04-30 21:52:37 +00:00
case SQLBIT :
2001-06-05 21:09:50 +00:00
case SQLINT1 :
case SQLINT2 :
case SQLINT4 :
convert_to_long_ex ( var ) ;
2001-09-25 21:58:48 +00:00
value = ( LPBYTE ) ( & Z_LVAL_PP ( var ) ) ;
2001-06-05 21:09:50 +00:00
break ;
default :
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " unsupported type " ) ;
2001-06-05 21:09:50 +00:00
RETURN_FALSE ;
break ;
}
}
convert_to_string_ex ( param_name ) ;
if ( is_output ) {
status = DBRPCRETURN ;
}
/* hashtable of binds */
if ( ! statement - > binds ) {
2001-06-19 16:03:35 +00:00
ALLOC_HASHTABLE ( statement - > binds ) ;
2001-06-05 21:09:50 +00:00
zend_hash_init ( statement - > binds , 13 , NULL , _mssql_bind_hash_dtor , 0 ) ;
}
2005-11-18 20:40:52 +00:00
if ( zend_hash_exists ( statement - > binds , Z_STRVAL_PP ( param_name ) , Z_STRLEN_PP ( param_name ) ) ) {
RETURN_FALSE ;
}
else {
memset ( ( void * ) & bind , 0 , sizeof ( mssql_bind ) ) ;
zend_hash_add ( statement - > binds , Z_STRVAL_PP ( param_name ) , Z_STRLEN_PP ( param_name ) , & 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 " , Z_STRVAL_PP ( param_name ) ) ! = 0 ) {
if ( dbrpcparam ( mssql_ptr - > link , Z_STRVAL_PP ( param_name ) , ( BYTE ) status , type , maxlen , datalen , ( LPBYTE ) value ) = = FAIL ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Unable to set parameter " ) ;
RETURN_FALSE ;
}
2001-06-05 21:09:50 +00:00
}
}
RETURN_TRUE ;
}
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto mixed mssql_execute(resource stmt [, bool skip_results = false])
2001-06-05 21:09:50 +00:00
Executes a stored procedure on a MS - SQL server database */
PHP_FUNCTION ( mssql_execute )
{
2003-01-10 19:23:36 +00:00
zval * * stmt , * * skip ;
zend_bool skip_results = 0 ;
2003-01-12 06:28:41 +00:00
int retvalue , retval_results ;
2001-06-05 21:09:50 +00:00
mssql_link * mssql_ptr ;
mssql_statement * statement ;
mssql_result * result ;
2002-12-03 18:57:04 +00:00
int num_fields ;
2001-06-05 21:09:50 +00:00
int batchsize ;
int ac = ZEND_NUM_ARGS ( ) ;
batchsize = MS_SQL_G ( batchsize ) ;
2003-01-12 06:28:41 +00:00
if ( ac < 1 | | ac > 2 | | zend_get_parameters_ex ( ac , & stmt , & skip ) = = FAILURE ) {
2001-06-05 21:09:50 +00:00
WRONG_PARAM_COUNT ;
}
2003-01-10 19:23:36 +00:00
if ( ac = = 2 ) {
2003-01-10 19:33:31 +00:00
skip_results = Z_BVAL_PP ( skip ) ;
2003-01-10 19:23:36 +00:00
}
2001-06-05 21:09:50 +00:00
2001-07-30 17:27:08 +00:00
ZEND_FETCH_RESOURCE ( statement , mssql_statement * , stmt , - 1 , " MS SQL-Statement " , le_statement ) ;
2001-06-05 21:09:50 +00:00
mssql_ptr = statement - > link ;
if ( dbrpcexec ( mssql_ptr - > link ) = = FAIL | | dbsqlok ( mssql_ptr - > link ) = = FAIL ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " stored procedure execution failed " ) ;
2006-04-04 18:49:12 +00:00
dbcancel ( mssql_ptr - > link ) ;
2001-06-05 21:09:50 +00:00
RETURN_FALSE ;
}
retval_results = dbresults ( mssql_ptr - > link ) ;
if ( retval_results = = FAIL ) {
2002-12-03 19:19:15 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " could not retrieve results " ) ;
2006-04-04 18:49:12 +00:00
dbcancel ( mssql_ptr - > link ) ;
2001-06-05 21:09:50 +00:00
RETURN_FALSE ;
}
2003-01-09 08:00:07 +00:00
/* The following is just like mssql_query, fetch all rows from the first result
* set into the row buffer .
*/
2001-06-05 21:09:50 +00:00
result = NULL ;
2003-01-10 19:23:36 +00:00
if ( retval_results = = SUCCEED ) {
2003-01-10 19:33:31 +00:00
if ( skip_results ) {
2003-01-10 19:23:36 +00:00
do {
2003-01-12 06:28:41 +00:00
dbcanquery ( mssql_ptr - > link ) ;
2003-01-10 19:33:31 +00:00
retval_results = dbresults ( mssql_ptr - > link ) ;
2003-01-10 19:23:36 +00:00
} while ( retval_results = = SUCCEED ) ;
}
2003-01-12 06:28:41 +00:00
else {
2003-03-14 17:49:44 +00:00
/* Skip results not returning any columns */
2003-01-12 06:28:41 +00:00
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 ;
2003-08-18 11:18:41 +00:00
result - > data = ( zval * * ) safe_emalloc ( sizeof ( zval * ) , MSSQL_ROWS_BLOCK , 0 ) ;
2003-01-12 06:28:41 +00:00
result - > mssql_ptr = mssql_ptr ;
result - > cur_field = result - > cur_row = result - > num_rows = 0 ;
result - > num_fields = num_fields ;
2005-08-08 22:55:56 +00:00
result - > have_fields = 0 ;
2003-01-12 06:28:41 +00:00
2003-08-18 11:18:41 +00:00
result - > fields = ( mssql_field * ) safe_emalloc ( sizeof ( mssql_field ) , num_fields , 0 ) ;
2003-01-12 06:28:41 +00:00
result - > statement = statement ;
2003-11-17 20:56:53 +00:00
result - > num_rows = _mssql_fetch_batch ( mssql_ptr , result , retvalue TSRMLS_CC ) ;
2003-01-12 06:28:41 +00:00
}
}
2003-01-10 19:23:36 +00:00
}
2004-03-30 17:54:10 +00:00
if ( retval_results = = NO_MORE_RESULTS | | retval_results = = NO_MORE_RPC_RESULTS ) {
2003-01-12 06:28:41 +00:00
_mssql_get_sp_result ( mssql_ptr , statement TSRMLS_CC ) ;
2001-06-05 21:09:50 +00:00
}
2002-12-03 18:57:04 +00:00
2001-06-05 21:09:50 +00:00
if ( result = = NULL ) {
RETURN_TRUE ; /* no recordset returned ...*/
}
else {
ZEND_REGISTER_RESOURCE ( return_value , result , le_result ) ;
}
}
/* }}} */
2003-06-12 10:08:26 +00:00
/* {{{ proto bool mssql_free_statement(resource result_index)
2003-01-09 08:00:07 +00:00
Free a MS - SQL statement index */
PHP_FUNCTION ( mssql_free_statement )
{
zval * * mssql_statement_index ;
mssql_statement * statement ;
int retvalue ;
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & mssql_statement_index ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
if ( Z_TYPE_PP ( mssql_statement_index ) = = IS_RESOURCE & & Z_LVAL_PP ( 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 {
2003-01-12 06:28:41 +00:00
dbcanquery ( statement - > link - > link ) ;
2003-01-09 08:19:41 +00:00
retvalue = dbresults ( statement - > link - > link ) ;
2003-01-10 19:23:36 +00:00
} while ( retvalue = = SUCCEED ) ;
2003-01-09 08:00:07 +00:00
zend_list_delete ( Z_RESVAL_PP ( mssql_statement_index ) ) ;
RETURN_TRUE ;
}
/* }}} */
2001-06-28 16:59:17 +00:00
/* {{{ proto string mssql_guid_string(string binary [,int short_format])
Converts a 16 byte binary GUID to a string */
PHP_FUNCTION ( mssql_guid_string )
{
zval * * binary , * * short_format ;
int sf = 0 ;
char buffer [ 32 + 1 ] ;
char buffer2 [ 36 + 1 ] ;
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & binary ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_string_ex ( binary ) ;
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & binary , & short_format ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_string_ex ( binary ) ;
convert_to_long_ex ( short_format ) ;
2001-09-25 21:58:48 +00:00
sf = Z_LVAL_PP ( short_format ) ;
2001-06-28 16:59:17 +00:00
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
2004-11-15 23:37:05 +00:00
dbconvert ( NULL , SQLBINARY , ( BYTE * ) Z_STRVAL_PP ( binary ) , MIN ( 16 , Z_STRLEN_PP ( binary ) ) , SQLCHAR , buffer , - 1 ) ;
2001-06-28 16:59:17 +00:00
if ( sf ) {
php_strtoupper ( buffer , 32 ) ;
RETURN_STRING ( buffer , 1 ) ;
}
else {
int i ;
2004-11-15 22:45:29 +00:00
/* FIXME this works only on little endian machine */
2001-06-28 16:59:17 +00:00
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 ) ;
}
}
/* }}} */
1999-11-03 20:35:58 +00:00
# endif