1999-04-19 23:04:11 +08:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2004-01-08 16:18:22 +08:00
| PHP Version 5 |
1999-04-19 23:04:11 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2007-12-31 15:17:19 +08:00
| Copyright ( c ) 1997 - 2008 The PHP Group |
1999-04-19 23:04:11 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2006-01-01 20:51:34 +08:00
| This source file is subject to version 3.01 of the PHP license , |
1999-07-16 21:13:16 +08:00
| that is bundled with this package in the file LICENSE , and is |
2003-06-11 04:04:29 +08:00
| available through the world - wide - web at the following url : |
2006-01-01 20:51:34 +08:00
| http : //www.php.net/license/3_01.txt |
1999-07-16 21:13:16 +08: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 . |
1999-04-19 23:04:11 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2002-03-04 17:10:32 +08:00
| Authors : Nikolay P . Romanyuk < mag @ redcom . ru > |
1999-04-19 23:04:11 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*/
/* $Id$ */
/*
* TODO :
2002-03-04 17:10:32 +08:00
* birdstep_fetch_into ( ) ,
1999-04-19 23:04:11 +08:00
* Check all on real life apps .
*/
2001-05-24 18:07:29 +08:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
1999-04-19 23:04:11 +08:00
# include "php.h"
1999-09-05 21:01:42 +08:00
# if WIN32
# include "config.w32.h"
# include "win95nt.h"
# ifdef PHP_EXPORTS
# define PHPAPI __declspec(dllexport)
# else
# define PHPAPI __declspec(dllimport)
# endif
# else
2005-01-10 05:05:06 +08:00
# include <php_config.h>
1999-09-05 21:01:42 +08:00
# define PHPAPI
# define THREAD_LS
# endif
2002-03-04 17:10:32 +08:00
# ifdef HAVE_BIRDSTEP
# include "php_birdstep.h"
2000-04-07 05:07:44 +08:00
# include "ext/standard/info.h"
2007-08-31 15:42:05 +08:00
# include "php_ini.h"
1999-04-19 23:04:11 +08:00
2007-09-28 02:00:48 +08:00
const zend_function_entry birdstep_functions [ ] = {
2002-04-09 06:54:06 +08:00
PHP_FE ( birdstep_connect , NULL )
PHP_FE ( birdstep_close , NULL )
PHP_FE ( birdstep_exec , NULL )
PHP_FE ( birdstep_fetch , NULL )
PHP_FE ( birdstep_result , NULL )
PHP_FE ( birdstep_freeresult , NULL )
PHP_FE ( birdstep_autocommit , NULL )
PHP_FE ( birdstep_off_autocommit , NULL )
PHP_FE ( birdstep_commit , NULL )
PHP_FE ( birdstep_rollback , NULL )
PHP_FE ( birdstep_fieldnum , NULL )
PHP_FE ( birdstep_fieldname , NULL )
2002-03-05 14:15:01 +08:00
/*
* Temporary Function aliases until the next major upgrade to PHP .
* These should allow users to continue to use their current scripts ,
* but should in reality warn the user that this functionality is
* deprecated .
*/
2002-04-09 06:54:06 +08:00
PHP_FALIAS ( velocis_connect , birdstep_connect , NULL )
PHP_FALIAS ( velocis_close , birdstep_close , NULL )
PHP_FALIAS ( velocis_exec , birdstep_exec , NULL )
PHP_FALIAS ( velocis_fetch , birdstep_fetch , NULL )
PHP_FALIAS ( velocis_result , birdstep_result , NULL )
PHP_FALIAS ( velocis_freeresult , birdstep_freeresult , NULL )
PHP_FALIAS ( velocis_autocommit , birdstep_autocommit , NULL )
PHP_FALIAS ( velocis_off_autocommit , birdstep_off_autocommit , NULL )
PHP_FALIAS ( velocis_commit , birdstep_commit , NULL )
PHP_FALIAS ( velocis_rollback , birdstep_rollback , NULL )
PHP_FALIAS ( velocis_fieldnum , birdstep_fieldnum , NULL )
PHP_FALIAS ( velocis_fieldname , birdstep_fieldname , NULL )
2002-03-05 14:15:01 +08:00
/* End temporary aliases */
1999-04-19 23:04:11 +08:00
{ NULL , NULL , NULL }
} ;
2002-03-04 17:10:32 +08:00
zend_module_entry birdstep_module_entry = {
2001-10-12 07:33:59 +08:00
STANDARD_MODULE_HEADER ,
2002-04-09 06:54:06 +08:00
" birdstep " ,
birdstep_functions ,
PHP_MINIT ( birdstep ) ,
PHP_MSHUTDOWN ( birdstep ) ,
PHP_RINIT ( birdstep ) ,
NULL ,
PHP_MINFO ( birdstep ) ,
NO_VERSION_YET ,
STANDARD_MODULE_PROPERTIES
1999-04-19 23:04:11 +08:00
} ;
2000-05-23 17:33:51 +08:00
# ifdef COMPILE_DL_ODBC
2002-03-04 17:10:32 +08:00
ZEND_GET_MODULE ( birdstep )
1999-04-19 23:04:11 +08:00
# endif
2002-03-04 17:10:32 +08:00
THREAD_LS birdstep_module php_birdstep_module ;
1999-04-19 23:04:11 +08:00
THREAD_LS static HENV henv ;
2008-06-26 00:18:55 +08:00
# define PHP_GET_BIRDSTEP_RES_IDX(id) if (!(res = birdstep_find_result(list, id))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Not result index (%ld)", id); RETURN_FALSE; }
# define PHP_BIRDSTEP_CHK_LNK(id) if (!(conn = birdstep_find_conn(list, id))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Not connection index (%ld)", id); RETURN_FALSE; }
2003-01-21 23:27:39 +08:00
2002-03-04 17:10:32 +08:00
static void _close_birdstep_link ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
1999-04-19 23:04:11 +08:00
{
2000-10-21 02:25:16 +08:00
VConn * conn = ( VConn * ) rsrc - > ptr ;
2001-07-31 13:44:11 +08:00
1999-04-19 23:04:11 +08:00
if ( conn ) {
efree ( conn ) ;
}
}
2002-03-04 17:10:32 +08:00
static void _free_birdstep_result ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
1999-04-19 23:04:11 +08:00
{
2000-10-21 02:25:16 +08:00
Vresult * res = ( Vresult * ) rsrc - > ptr ;
2001-07-31 13:44:11 +08:00
1999-04-19 23:04:11 +08:00
if ( res & & res - > values ) {
register int i ;
for ( i = 0 ; i < res - > numcols ; i + + ) {
if ( res - > values [ i ] . value )
2002-04-09 06:54:06 +08:00
efree ( res - > values [ i ] . value ) ;
1999-04-19 23:04:11 +08:00
}
efree ( res - > values ) ;
}
if ( res ) {
efree ( res ) ;
}
}
2002-03-04 17:10:32 +08:00
PHP_MINIT_FUNCTION ( birdstep )
1999-04-19 23:04:11 +08:00
{
SQLAllocEnv ( & henv ) ;
2001-07-30 09:56:43 +08:00
2002-03-04 17:10:32 +08:00
if ( cfg_get_long ( " birdstep.max_links " , & php_birdstep_module . max_links ) = = FAILURE ) {
php_birdstep_module . max_links = - 1 ;
1999-04-19 23:04:11 +08:00
}
2002-03-04 17:10:32 +08:00
php_birdstep_module . num_links = 0 ;
php_birdstep_module . le_link = zend_register_list_destructors_ex ( _close_birdstep_link , NULL , " birdstep link " , module_number ) ;
php_birdstep_module . le_result = zend_register_list_destructors_ex ( _free_birdstep_result , NULL , " birdstep result " , module_number ) ;
1999-04-19 23:04:11 +08:00
return SUCCESS ;
}
2002-03-04 17:10:32 +08:00
PHP_RINIT_FUNCTION ( birdstep )
1999-04-19 23:04:11 +08:00
{
return SUCCESS ;
}
2002-03-04 17:10:32 +08:00
PHP_MINFO_FUNCTION ( birdstep )
1999-04-19 23:04:11 +08:00
{
2000-04-07 05:07:44 +08:00
php_info_print_table_start ( ) ;
2002-03-04 17:10:32 +08:00
php_info_print_table_row ( 2 , " RAIMA Birdstep Support " , " enabled " ) ;
2000-04-07 05:07:44 +08:00
php_info_print_table_end ( ) ;
1999-04-19 23:04:11 +08:00
}
2002-03-04 17:10:32 +08:00
PHP_MSHUTDOWN_FUNCTION ( birdstep )
1999-04-19 23:04:11 +08:00
{
SQLFreeEnv ( henv ) ;
return SUCCESS ;
}
/* Some internal functions. Connections and result manupulate */
2002-04-09 06:54:06 +08:00
static int birdstep_add_conn ( HashTable * list , VConn * conn , HDBC hdbc )
1999-04-19 23:04:11 +08:00
{
int ind ;
2002-03-04 17:10:32 +08:00
ind = zend_list_insert ( conn , php_birdstep_module . le_link ) ;
1999-04-19 23:04:11 +08:00
conn - > hdbc = hdbc ;
conn - > index = ind ;
return ( ind ) ;
}
2002-04-09 06:54:06 +08:00
static VConn * birdstep_find_conn ( HashTable * list , int ind )
1999-04-19 23:04:11 +08:00
{
VConn * conn ;
int type ;
1999-12-18 03:51:39 +08:00
conn = zend_list_find ( ind , & type ) ;
2002-03-04 17:10:32 +08:00
if ( ! conn | | type ! = php_birdstep_module . le_link ) {
1999-04-19 23:04:11 +08:00
return ( NULL ) ;
}
return ( conn ) ;
}
2002-04-09 06:54:06 +08:00
static void birdstep_del_conn ( HashTable * list , int ind )
1999-04-19 23:04:11 +08:00
{
1999-12-18 03:51:39 +08:00
zend_list_delete ( ind ) ;
1999-04-19 23:04:11 +08:00
}
2002-04-09 06:54:06 +08:00
static int birdstep_add_result ( HashTable * list , Vresult * res , VConn * conn )
1999-04-19 23:04:11 +08:00
{
int ind ;
2002-03-04 17:10:32 +08:00
ind = zend_list_insert ( res , php_birdstep_module . le_result ) ;
1999-04-19 23:04:11 +08:00
res - > conn = conn ;
res - > index = ind ;
return ( ind ) ;
}
2002-04-09 06:54:06 +08:00
static Vresult * birdstep_find_result ( HashTable * list , int ind )
1999-04-19 23:04:11 +08:00
{
Vresult * res ;
int type ;
1999-12-18 03:51:39 +08:00
res = zend_list_find ( ind , & type ) ;
2002-03-04 17:10:32 +08:00
if ( ! res | | type ! = php_birdstep_module . le_result ) {
1999-04-19 23:04:11 +08:00
return ( NULL ) ;
}
return ( res ) ;
}
2002-04-09 06:54:06 +08:00
static void birdstep_del_result ( HashTable * list , int ind )
1999-04-19 23:04:11 +08:00
{
1999-12-18 03:51:39 +08:00
zend_list_delete ( ind ) ;
1999-04-19 23:04:11 +08:00
}
/* Users functions */
2003-06-17 00:36:51 +08:00
/* {{{ proto int birdstep_connect(string server, string user, string pass)
2001-12-07 15:21:05 +08:00
*/
2002-03-04 17:10:32 +08:00
PHP_FUNCTION ( birdstep_connect )
1999-04-19 23:04:11 +08:00
{
2008-06-26 00:18:55 +08:00
char * serv , * user , * pass ;
int serv_len , user_len , pass_len ;
1999-04-19 23:04:11 +08:00
RETCODE stat ;
HDBC hdbc ;
VConn * new ;
long ind ;
2008-06-26 00:18:55 +08:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " sss " , & serv , & serv_len , & user , & user_len , & pass , & pass_len ) = = FAILURE ) {
return ;
}
2002-03-04 17:10:32 +08:00
if ( php_birdstep_module . max_links ! = - 1 & & php_birdstep_module . num_links = = php_birdstep_module . max_links ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: Too many open connections (%d) " , php_birdstep_module . num_links ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
2008-06-26 00:18:55 +08:00
1999-04-19 23:04:11 +08:00
stat = SQLAllocConnect ( henv , & hdbc ) ;
if ( stat ! = SQL_SUCCESS ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: Could not allocate connection handle " ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
2008-06-26 00:18:55 +08:00
stat = SQLConnect ( hdbc , serv , SQL_NTS , user , SQL_NTS , pass , SQL_NTS ) ;
1999-04-19 23:04:11 +08:00
if ( stat ! = SQL_SUCCESS & & stat ! = SQL_SUCCESS_WITH_INFO ) {
2008-06-26 00:18:55 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: Could not connect to server \" %s \" for %s " , serv , user ) ;
1999-04-19 23:04:11 +08:00
SQLFreeConnect ( hdbc ) ;
RETURN_FALSE ;
}
new = ( VConn * ) emalloc ( sizeof ( VConn ) ) ;
2002-03-04 17:10:32 +08:00
ind = birdstep_add_conn ( list , new , hdbc ) ;
php_birdstep_module . num_links + + ;
1999-04-19 23:04:11 +08:00
RETURN_LONG ( ind ) ;
}
2001-12-07 15:21:05 +08:00
/* }}} */
1999-04-19 23:04:11 +08:00
2002-03-04 17:10:32 +08:00
/* {{{ proto bool birdstep_close(int id)
2001-12-07 15:21:05 +08:00
*/
2002-03-04 17:10:32 +08:00
PHP_FUNCTION ( birdstep_close )
1999-04-19 23:04:11 +08:00
{
2008-06-26 00:18:55 +08:00
long id ;
1999-04-19 23:04:11 +08:00
VConn * conn ;
2008-06-26 00:18:55 +08:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " l " , & id ) = = FAILURE ) {
return ;
1999-04-19 23:04:11 +08:00
}
2008-06-26 00:18:55 +08:00
2003-01-21 23:27:39 +08:00
PHP_BIRDSTEP_CHK_LNK ( id ) ;
1999-04-19 23:04:11 +08:00
SQLDisconnect ( conn - > hdbc ) ;
SQLFreeConnect ( conn - > hdbc ) ;
2008-06-26 00:18:55 +08:00
birdstep_del_conn ( list , id ) ;
2002-03-04 17:10:32 +08:00
php_birdstep_module . num_links - - ;
1999-04-19 23:04:11 +08:00
RETURN_TRUE ;
}
2001-12-07 15:21:05 +08:00
/* }}} */
1999-04-19 23:04:11 +08:00
2002-03-04 17:10:32 +08:00
/* {{{ proto int birdstep_exec(int index, string exec_str)
2001-12-07 15:21:05 +08:00
*/
2002-03-04 17:10:32 +08:00
PHP_FUNCTION ( birdstep_exec )
1999-04-19 23:04:11 +08:00
{
2008-06-26 00:18:55 +08:00
char * query ;
long ind ;
int query_len , indx ;
1999-04-19 23:04:11 +08:00
VConn * conn ;
Vresult * res ;
RETCODE stat ;
SWORD cols , i , colnamelen ;
SDWORD rows , coldesc ;
2008-06-26 00:18:55 +08:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " ls " , & ind , & query , & query_len ) = = FAILURE ) {
return ;
1999-04-19 23:04:11 +08:00
}
2003-01-21 23:27:39 +08:00
2008-06-26 00:18:55 +08:00
PHP_BIRDSTEP_CHK_LNK ( ind ) ;
1999-04-19 23:04:11 +08:00
res = ( Vresult * ) emalloc ( sizeof ( Vresult ) ) ;
stat = SQLAllocStmt ( conn - > hdbc , & res - > hstmt ) ;
if ( stat ! = SQL_SUCCESS & & stat ! = SQL_SUCCESS_WITH_INFO ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: SQLAllocStmt return %d " , stat ) ;
1999-04-19 23:04:11 +08:00
efree ( res ) ;
RETURN_FALSE ;
}
stat = SQLExecDirect ( res - > hstmt , query , SQL_NTS ) ;
if ( stat ! = SQL_SUCCESS & & stat ! = SQL_SUCCESS_WITH_INFO ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: Can not execute \" %s \" query " , query ) ;
1999-04-19 23:04:11 +08:00
SQLFreeStmt ( res - > hstmt , SQL_DROP ) ;
efree ( res ) ;
RETURN_FALSE ;
}
/* Success query */
stat = SQLNumResultCols ( res - > hstmt , & cols ) ;
if ( stat ! = SQL_SUCCESS ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: SQLNumResultCols return %d " , stat ) ;
1999-04-19 23:04:11 +08:00
SQLFreeStmt ( res - > hstmt , SQL_DROP ) ;
efree ( res ) ;
RETURN_FALSE ;
}
if ( ! cols ) { /* Was INSERT, UPDATE, DELETE, etc. query */
stat = SQLRowCount ( res - > hstmt , & rows ) ;
if ( stat ! = SQL_SUCCESS ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: SQLNumResultCols return %d " , stat ) ;
1999-04-19 23:04:11 +08:00
SQLFreeStmt ( res - > hstmt , SQL_DROP ) ;
efree ( res ) ;
RETURN_FALSE ;
}
SQLFreeStmt ( res - > hstmt , SQL_DROP ) ;
efree ( res ) ;
RETURN_LONG ( rows ) ;
} else { /* Was SELECT query */
2003-08-18 12:41:48 +08:00
res - > values = ( VResVal * ) safe_emalloc ( sizeof ( VResVal ) , cols , 0 ) ;
1999-04-19 23:04:11 +08:00
res - > numcols = cols ;
for ( i = 0 ; i < cols ; i + + ) {
SQLColAttributes ( res - > hstmt , i + 1 , SQL_COLUMN_NAME ,
res - > values [ i ] . name , sizeof ( res - > values [ i ] . name ) ,
& colnamelen , NULL ) ;
SQLColAttributes ( res - > hstmt , i + 1 , SQL_COLUMN_TYPE ,
NULL , 0 , NULL , & res - > values [ i ] . valtype ) ;
switch ( res - > values [ i ] . valtype ) {
case SQL_LONGVARBINARY :
case SQL_LONGVARCHAR :
res - > values [ i ] . value = NULL ;
continue ;
default :
break ;
}
SQLColAttributes ( res - > hstmt , i + 1 , SQL_COLUMN_DISPLAY_SIZE ,
NULL , 0 , NULL , & coldesc ) ;
res - > values [ i ] . value = ( char * ) emalloc ( coldesc + 1 ) ;
2003-01-21 23:27:39 +08:00
SQLBindCol ( res - > hstmt , i + 1 , SQL_C_CHAR , res - > values [ i ] . value , coldesc + 1 , & res - > values [ i ] . vallen ) ;
1999-04-19 23:04:11 +08:00
}
}
res - > fetched = 0 ;
2002-03-04 17:10:32 +08:00
indx = birdstep_add_result ( list , res , conn ) ;
1999-04-19 23:04:11 +08:00
RETURN_LONG ( indx ) ;
}
2001-12-07 15:21:05 +08:00
/* }}} */
1999-04-19 23:04:11 +08:00
2002-03-04 17:10:32 +08:00
/* {{{ proto bool birdstep_fetch(int index)
2001-12-07 15:21:05 +08:00
*/
2002-03-04 17:10:32 +08:00
PHP_FUNCTION ( birdstep_fetch )
1999-04-19 23:04:11 +08:00
{
2008-06-26 00:18:55 +08:00
long ind ;
1999-04-19 23:04:11 +08:00
Vresult * res ;
RETCODE stat ;
UDWORD row ;
UWORD RowStat [ 1 ] ;
2008-06-26 00:18:55 +08:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " l " , & ind ) = = FAILURE ) {
return ;
1999-04-19 23:04:11 +08:00
}
2008-06-26 00:18:55 +08:00
2003-01-21 23:27:39 +08:00
PHP_GET_BIRDSTEP_RES_IDX ( ind ) ;
1999-04-19 23:04:11 +08:00
stat = SQLExtendedFetch ( res - > hstmt , SQL_FETCH_NEXT , 1 , & row , RowStat ) ;
if ( stat = = SQL_NO_DATA_FOUND ) {
SQLFreeStmt ( res - > hstmt , SQL_DROP ) ;
2003-01-21 23:27:39 +08:00
birdstep_del_result ( list , Z_LVAL_PP ( ind ) ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
if ( stat ! = SQL_SUCCESS & & stat ! = SQL_SUCCESS_WITH_INFO ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: SQLFetch return error " ) ;
1999-04-19 23:04:11 +08:00
SQLFreeStmt ( res - > hstmt , SQL_DROP ) ;
2003-01-21 23:27:39 +08:00
birdstep_del_result ( list , Z_LVAL_PP ( ind ) ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
res - > fetched = 1 ;
RETURN_TRUE ;
}
2001-12-07 15:21:05 +08:00
/* }}} */
1999-04-19 23:04:11 +08:00
2008-06-26 00:18:55 +08:00
/* {{{ proto mixed birdstep_result(int index, mixed col)
2001-12-07 15:21:05 +08:00
*/
2002-03-04 17:10:32 +08:00
PHP_FUNCTION ( birdstep_result )
1999-04-19 23:04:11 +08:00
{
2008-06-26 00:18:55 +08:00
zval * * col ;
long ind ;
1999-04-19 23:04:11 +08:00
Vresult * res ;
RETCODE stat ;
int i , sql_c_type ;
UDWORD row ;
UWORD RowStat [ 1 ] ;
SWORD indx = - 1 ;
char * field = NULL ;
2008-06-26 00:18:55 +08:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " lZ " , & ind , & col ) = = FAILURE ) {
return ;
1999-04-19 23:04:11 +08:00
}
2008-06-26 00:18:55 +08:00
2003-01-21 23:27:39 +08:00
PHP_GET_BIRDSTEP_RES_IDX ( ind ) ;
if ( Z_TYPE_PP ( col ) = = IS_STRING ) {
field = Z_STRVAL_PP ( col ) ;
1999-04-19 23:04:11 +08:00
} else {
2003-01-21 23:27:39 +08:00
convert_to_long_ex ( col ) ;
indx = Z_LVAL_PP ( col ) ;
1999-04-19 23:04:11 +08:00
}
if ( field ) {
for ( i = 0 ; i < res - > numcols ; i + + ) {
if ( ! strcasecmp ( res - > values [ i ] . name , field ) ) {
indx = i ;
break ;
}
}
if ( indx < 0 ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Field %s not found " , field ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
} else {
if ( indx < 0 | | indx > = res - > numcols ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: Field index not in range " ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
}
if ( ! res - > fetched ) {
stat = SQLExtendedFetch ( res - > hstmt , SQL_FETCH_NEXT , 1 , & row , RowStat ) ;
if ( stat = = SQL_NO_DATA_FOUND ) {
SQLFreeStmt ( res - > hstmt , SQL_DROP ) ;
2003-01-21 23:27:39 +08:00
birdstep_del_result ( list , Z_LVAL_PP ( ind ) ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
if ( stat ! = SQL_SUCCESS & & stat ! = SQL_SUCCESS_WITH_INFO ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: SQLFetch return error " ) ;
1999-04-19 23:04:11 +08:00
SQLFreeStmt ( res - > hstmt , SQL_DROP ) ;
2003-01-21 23:27:39 +08:00
birdstep_del_result ( list , Z_LVAL_PP ( ind ) ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
res - > fetched = 1 ;
}
switch ( res - > values [ indx ] . valtype ) {
case SQL_LONGVARBINARY :
sql_c_type = SQL_C_BINARY ;
goto l1 ;
case SQL_LONGVARCHAR :
sql_c_type = SQL_C_CHAR ;
l1 :
if ( ! res - > values [ indx ] . value ) {
res - > values [ indx ] . value = emalloc ( 4096 ) ;
}
stat = SQLGetData ( res - > hstmt , indx + 1 , sql_c_type ,
res - > values [ indx ] . value , 4095 , & res - > values [ indx ] . vallen ) ;
if ( stat = = SQL_NO_DATA_FOUND ) {
SQLFreeStmt ( res - > hstmt , SQL_DROP ) ;
2003-01-21 23:27:39 +08:00
birdstep_del_result ( list , Z_LVAL_PP ( ind ) ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
if ( stat ! = SQL_SUCCESS & & stat ! = SQL_SUCCESS_WITH_INFO ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: SQLGetData return error " ) ;
1999-04-19 23:04:11 +08:00
SQLFreeStmt ( res - > hstmt , SQL_DROP ) ;
2003-01-21 23:27:39 +08:00
birdstep_del_result ( list , Z_LVAL_PP ( ind ) ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
if ( res - > values [ indx ] . valtype = = SQL_LONGVARCHAR ) {
RETURN_STRING ( res - > values [ indx ] . value , TRUE ) ;
} else {
RETURN_LONG ( ( long ) res - > values [ indx ] . value ) ;
}
default :
if ( res - > values [ indx ] . value ! = NULL ) {
RETURN_STRING ( res - > values [ indx ] . value , TRUE ) ;
}
}
}
2001-12-07 15:21:05 +08:00
/* }}} */
1999-04-19 23:04:11 +08:00
2002-03-04 17:10:32 +08:00
/* {{{ proto bool birdstep_freeresult(int index)
2001-12-07 15:21:05 +08:00
*/
2002-03-04 17:10:32 +08:00
PHP_FUNCTION ( birdstep_freeresult )
1999-04-19 23:04:11 +08:00
{
2008-06-26 00:18:55 +08:00
long ind ;
1999-04-19 23:04:11 +08:00
Vresult * res ;
2008-06-26 00:18:55 +08:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " l " , & ind ) = = FAILURE ) {
return ;
1999-04-19 23:04:11 +08:00
}
2008-06-26 00:18:55 +08:00
2003-01-21 23:27:39 +08:00
PHP_GET_BIRDSTEP_RES_IDX ( ind ) ;
1999-04-19 23:04:11 +08:00
SQLFreeStmt ( res - > hstmt , SQL_DROP ) ;
2008-06-26 00:18:55 +08:00
birdstep_del_result ( list , ind ) ;
1999-04-19 23:04:11 +08:00
RETURN_TRUE ;
}
2001-12-07 15:21:05 +08:00
/* }}} */
1999-04-19 23:04:11 +08:00
2002-03-04 17:10:32 +08:00
/* {{{ proto bool birdstep_autocommit(int index)
2001-12-07 15:21:05 +08:00
*/
2002-03-04 17:10:32 +08:00
PHP_FUNCTION ( birdstep_autocommit )
1999-04-19 23:04:11 +08:00
{
2008-06-26 00:18:55 +08:00
long id ;
1999-04-19 23:04:11 +08:00
RETCODE stat ;
VConn * conn ;
2008-06-26 00:18:55 +08:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " l " , & id ) = = FAILURE ) {
return ;
1999-04-19 23:04:11 +08:00
}
2008-06-26 00:18:55 +08:00
2003-01-21 23:27:39 +08:00
PHP_BIRDSTEP_CHK_LNK ( id ) ;
1999-04-19 23:04:11 +08:00
stat = SQLSetConnectOption ( conn - > hdbc , SQL_AUTOCOMMIT , SQL_AUTOCOMMIT_ON ) ;
if ( stat ! = SQL_SUCCESS & & stat ! = SQL_SUCCESS_WITH_INFO ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: Set autocommit_on option failure " ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
RETURN_TRUE ;
}
2001-12-07 15:21:05 +08:00
/* }}} */
1999-04-19 23:04:11 +08:00
2002-03-04 17:10:32 +08:00
/* {{{ proto bool birdstep_off_autocommit(int index)
2001-12-07 15:21:05 +08:00
*/
2002-03-04 17:10:32 +08:00
PHP_FUNCTION ( birdstep_off_autocommit )
1999-04-19 23:04:11 +08:00
{
2008-06-26 00:18:55 +08:00
long id ;
1999-04-19 23:04:11 +08:00
RETCODE stat ;
VConn * conn ;
2008-06-26 00:18:55 +08:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " l " , & id ) = = FAILURE ) {
return ;
1999-04-19 23:04:11 +08:00
}
2008-06-26 00:18:55 +08:00
2003-01-21 23:27:39 +08:00
PHP_BIRDSTEP_CHK_LNK ( id ) ;
1999-04-19 23:04:11 +08:00
stat = SQLSetConnectOption ( conn - > hdbc , SQL_AUTOCOMMIT , SQL_AUTOCOMMIT_OFF ) ;
if ( stat ! = SQL_SUCCESS & & stat ! = SQL_SUCCESS_WITH_INFO ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: Set autocommit_off option failure " ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
RETURN_TRUE ;
}
2001-12-07 15:21:05 +08:00
/* }}} */
1999-04-19 23:04:11 +08:00
2002-03-04 17:10:32 +08:00
/* {{{ proto bool birdstep_commit(int index)
2001-12-07 15:21:05 +08:00
*/
2002-03-04 17:10:32 +08:00
PHP_FUNCTION ( birdstep_commit )
1999-04-19 23:04:11 +08:00
{
2008-06-26 00:18:55 +08:00
long id ;
1999-04-19 23:04:11 +08:00
RETCODE stat ;
VConn * conn ;
2008-06-26 00:18:55 +08:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " l " , & id ) = = FAILURE ) {
return ;
1999-04-19 23:04:11 +08:00
}
2008-06-26 00:18:55 +08:00
2003-01-21 23:27:39 +08:00
PHP_BIRDSTEP_CHK_LNK ( id )
1999-04-19 23:04:11 +08:00
stat = SQLTransact ( NULL , conn - > hdbc , SQL_COMMIT ) ;
if ( stat ! = SQL_SUCCESS ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: Commit failure " ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
RETURN_TRUE ;
}
2001-12-07 15:21:05 +08:00
/* }}} */
1999-04-19 23:04:11 +08:00
2002-03-04 17:10:32 +08:00
/* {{{ proto bool birdstep_rollback(int index)
2001-12-07 15:21:05 +08:00
*/
2002-03-04 17:10:32 +08:00
PHP_FUNCTION ( birdstep_rollback )
1999-04-19 23:04:11 +08:00
{
2008-06-26 00:18:55 +08:00
long id ;
1999-04-19 23:04:11 +08:00
RETCODE stat ;
VConn * conn ;
2008-06-26 00:18:55 +08:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " l " , & id ) = = FAILURE ) {
return ;
1999-04-19 23:04:11 +08:00
}
2008-06-26 00:18:55 +08:00
2003-01-21 23:27:39 +08:00
PHP_BIRDSTEP_CHK_LNK ( id ) ;
1999-04-19 23:04:11 +08:00
stat = SQLTransact ( NULL , conn - > hdbc , SQL_ROLLBACK ) ;
if ( stat ! = SQL_SUCCESS ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: Rollback failure " ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
RETURN_TRUE ;
}
2001-12-07 15:21:05 +08:00
/* }}} */
1999-04-19 23:04:11 +08:00
2002-03-04 17:10:32 +08:00
/* {{{ proto string birdstep_fieldname(int index, int col)
2001-12-07 15:21:05 +08:00
*/
2002-03-04 17:10:32 +08:00
PHP_FUNCTION ( birdstep_fieldname )
1999-04-19 23:04:11 +08:00
{
2008-06-26 00:18:55 +08:00
long ind , col ;
1999-04-19 23:04:11 +08:00
Vresult * res ;
SWORD indx ;
2008-06-26 00:18:55 +08:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " ll " , & ind , & col ) = = FAILURE ) {
return ;
1999-04-19 23:04:11 +08:00
}
2008-06-26 00:18:55 +08:00
2003-01-21 23:27:39 +08:00
PHP_GET_BIRDSTEP_RES_IDX ( ind ) ;
2008-06-26 00:18:55 +08:00
indx = col ;
1999-04-19 23:04:11 +08:00
if ( indx < 0 | | indx > = res - > numcols ) {
2003-01-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Birdstep: Field index not in range " ) ;
1999-04-19 23:04:11 +08:00
RETURN_FALSE ;
}
RETURN_STRING ( res - > values [ indx ] . name , TRUE ) ;
}
2001-12-07 15:21:05 +08:00
/* }}} */
1999-04-19 23:04:11 +08:00
2002-03-04 17:10:32 +08:00
/* {{{ proto int birdstep_fieldnum(int index)
2001-12-07 15:21:05 +08:00
*/
2002-03-04 17:10:32 +08:00
PHP_FUNCTION ( birdstep_fieldnum )
1999-04-19 23:04:11 +08:00
{
2008-06-26 00:18:55 +08:00
long ind ;
1999-04-19 23:04:11 +08:00
Vresult * res ;
2008-06-26 00:18:55 +08:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " l " , & ind ) = = FAILURE ) {
return ;
1999-04-19 23:04:11 +08:00
}
2008-06-26 00:18:55 +08:00
2003-01-21 23:27:39 +08:00
PHP_GET_BIRDSTEP_RES_IDX ( ind ) ;
1999-04-19 23:04:11 +08:00
RETURN_LONG ( res - > numcols ) ;
}
2001-12-07 15:21:05 +08:00
/* }}} */
1999-04-19 23:04:11 +08:00
2002-03-04 17:10:32 +08:00
# endif /* HAVE_BIRDSTEP */
1999-04-19 23:04:11 +08:00
/*
* Local variables :
* tab - width : 4
* c - basic - offset : 4
* End :
*/