1999-04-19 23:04:11 +08:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2001-12-11 23:32:16 +08:00
| PHP Version 4 |
1999-04-19 23:04:11 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2003-01-01 00:08:15 +08:00
| Copyright ( c ) 1997 - 2003 The PHP Group |
1999-04-19 23:04:11 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2003-06-11 04:04:29 +08:00
| This source file is subject to version 3.0 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 : |
| http : //www.php.net/license/3_0.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
# include "php_config.h"
# 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"
1999-04-19 23:04:11 +08:00
2002-03-04 17:10:32 +08:00
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 ;
2003-01-21 23:27:39 +08:00
# define PHP_GET_BIRDSTEP_RES_IDX(id) convert_to_long_ex(id); if (!(res = birdstep_find_result(list, Z_LVAL_PP(id)))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Not result index (%d)", Z_LVAL_PP(id)); RETURN_FALSE; }
# define PHP_BIRDSTEP_CHK_LNK(id) convert_to_long_ex(id); if (!(conn = birdstep_find_conn(list,Z_LVAL_PP(id)))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Not connection index (%d)", Z_LVAL_PP(id)); RETURN_FALSE; }
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
{
2003-01-21 23:27:39 +08:00
zval * * serv , * * user , * * pass ;
1999-04-19 23:04:11 +08:00
char * Serv = NULL ;
char * User = NULL ;
char * Pass = NULL ;
RETCODE stat ;
HDBC hdbc ;
VConn * new ;
long ind ;
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 ;
}
2003-01-21 23:27:39 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 3 | | zend_get_parameters_ex ( 3 , & serv , & user , & pass ) = = FAILURE ) {
1999-04-19 23:04:11 +08:00
WRONG_PARAM_COUNT ;
}
2003-01-21 23:27:39 +08:00
convert_to_string_ex ( serv ) ;
convert_to_string_ex ( user ) ;
convert_to_string_ex ( pass ) ;
Serv = Z_STRVAL_PP ( serv ) ;
User = Z_STRVAL_PP ( user ) ;
Pass = Z_STRVAL_PP ( pass ) ;
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 ;
}
stat = SQLConnect ( hdbc , Serv , SQL_NTS , User , SQL_NTS , Pass , 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: 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
{
2003-01-21 23:27:39 +08:00
zval * * id ;
1999-04-19 23:04:11 +08:00
VConn * conn ;
2003-01-21 23:27:39 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & id ) = = FAILURE ) {
1999-04-19 23:04:11 +08:00
WRONG_PARAM_COUNT ;
}
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 ) ;
2003-01-21 23:27:39 +08:00
birdstep_del_conn ( list , Z_LVAL_PP ( 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
{
2003-01-21 23:27:39 +08:00
zval * * ind , * * exec_str ;
1999-04-19 23:04:11 +08:00
char * query = NULL ;
int indx ;
VConn * conn ;
Vresult * res ;
RETCODE stat ;
SWORD cols , i , colnamelen ;
SDWORD rows , coldesc ;
2003-01-21 23:27:39 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & ind , & exec_str ) = = FAILURE ) {
1999-04-19 23:04:11 +08:00
WRONG_PARAM_COUNT ;
}
2003-01-21 23:27:39 +08:00
PHP_BIRDSTEP_CHK_LNK ( ind ) ;
convert_to_string_ex ( exec_str ) ;
query = Z_STRVAL_PP ( exec_str ) ;
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 */
res - > values = ( VResVal * ) emalloc ( sizeof ( VResVal ) * cols ) ;
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
{
2003-01-21 23:27:39 +08:00
zval * * ind ;
1999-04-19 23:04:11 +08:00
Vresult * res ;
RETCODE stat ;
UDWORD row ;
UWORD RowStat [ 1 ] ;
2003-01-21 23:27:39 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & ind ) = = FAILURE ) {
1999-04-19 23:04:11 +08:00
WRONG_PARAM_COUNT ;
}
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
2002-03-04 17:10:32 +08:00
/* {{{ proto mixed birdstep_result(int index, int 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
{
2003-01-21 23:27:39 +08:00
zval * * ind , * * col ;
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 ;
2003-01-21 23:27:39 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & ind , & col ) = = FAILURE ) {
1999-04-19 23:04:11 +08:00
WRONG_PARAM_COUNT ;
}
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
{
2003-01-21 23:27:39 +08:00
zval * * ind ;
1999-04-19 23:04:11 +08:00
Vresult * res ;
2003-01-21 23:27:39 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & ind ) = = FAILURE ) {
1999-04-19 23:04:11 +08:00
WRONG_PARAM_COUNT ;
}
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 ) ;
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_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
{
2003-01-21 23:27:39 +08:00
zval * * id ;
1999-04-19 23:04:11 +08:00
RETCODE stat ;
VConn * conn ;
2003-01-21 23:27:39 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & id ) = = FAILURE ) {
1999-04-19 23:04:11 +08:00
WRONG_PARAM_COUNT ;
}
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
{
2003-01-21 23:27:39 +08:00
zval * * id ;
1999-04-19 23:04:11 +08:00
RETCODE stat ;
VConn * conn ;
2003-01-21 23:27:39 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & id ) = = FAILURE ) {
1999-04-19 23:04:11 +08:00
WRONG_PARAM_COUNT ;
}
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
{
2003-01-21 23:27:39 +08:00
zval * * id ;
1999-04-19 23:04:11 +08:00
RETCODE stat ;
VConn * conn ;
2003-01-21 23:27:39 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & id ) = = FAILURE ) {
1999-04-19 23:04:11 +08:00
WRONG_PARAM_COUNT ;
}
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
{
2003-01-21 23:27:39 +08:00
zval * * id ;
1999-04-19 23:04:11 +08:00
RETCODE stat ;
VConn * conn ;
2003-01-21 23:27:39 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & id ) = = FAILURE ) {
1999-04-19 23:04:11 +08:00
WRONG_PARAM_COUNT ;
}
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
{
2003-01-21 23:27:39 +08:00
zval * * ind , * * col ;
1999-04-19 23:04:11 +08:00
Vresult * res ;
SWORD indx ;
2003-01-21 23:27:39 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & ind , & col ) = = FAILURE ) {
1999-04-19 23:04:11 +08:00
WRONG_PARAM_COUNT ;
}
2003-01-21 23:27:39 +08:00
PHP_GET_BIRDSTEP_RES_IDX ( ind ) ;
convert_to_long_ex ( col ) ;
indx = Z_LVAL_PP ( 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
{
2003-01-21 23:27:39 +08:00
zval * * ind ;
1999-04-19 23:04:11 +08:00
Vresult * res ;
2003-01-21 23:27:39 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & ind ) = = FAILURE ) {
1999-04-19 23:04:11 +08:00
WRONG_PARAM_COUNT ;
}
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 :
*/