2000-07-17 21:29:30 +00:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2004-01-08 08:18:22 +00:00
| PHP Version 5 |
2000-07-17 21:29:30 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2004-01-08 08:18:22 +00:00
| Copyright ( c ) 1997 - 2004 The PHP Group |
2000-07-17 21:29:30 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2003-06-10 20:04:29 +00:00
| This source file is subject to version 3.0 of the PHP license , |
2000-07-17 21:29:30 +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 : |
| http : //www.php.net/license/3_0.txt. |
2000-07-17 21:29:30 +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 . |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2000-08-25 15:56:41 +00:00
| Contributed by ECL IP ' S Software & Services |
| http : //www.eclips-software.com |
| mailto : //idev@eclips-software.com |
2000-07-17 21:29:30 +00:00
| Author : David H <EFBFBD> not < henot @ php . net > |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*/
/* $Id$ */
2001-05-24 10:07:29 +00:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
2000-07-17 21:29:30 +00:00
# include "php.h"
# include "php_globals.h"
# include "php_ini.h"
2000-11-13 22:23:16 +00:00
# include "ext/standard/info.h"
2000-07-17 21:29:30 +00:00
# include "php_ii.h"
# include "ii.h"
# include "ext/standard/php_string.h"
# if HAVE_II
ZEND_DECLARE_MODULE_GLOBALS ( ii )
/* True globals, no need for thread safety */
2001-08-11 16:39:07 +00:00
static int le_ii_link , le_ii_plink ;
2000-07-17 21:29:30 +00:00
# define SAFE_STRING(s) ((s)?(s):"")
/* Every user visible function must have an entry in ii_functions[].
*/
function_entry ii_functions [ ] = {
2001-08-19 01:47:19 +00:00
PHP_FE ( ingres_connect , NULL )
PHP_FE ( ingres_pconnect , NULL )
PHP_FE ( ingres_close , NULL )
PHP_FE ( ingres_query , NULL )
PHP_FE ( ingres_num_rows , NULL )
PHP_FE ( ingres_num_fields , NULL )
PHP_FE ( ingres_field_name , NULL )
PHP_FE ( ingres_field_type , NULL )
PHP_FE ( ingres_field_nullable , NULL )
PHP_FE ( ingres_field_length , NULL )
PHP_FE ( ingres_field_precision , NULL )
PHP_FE ( ingres_field_scale , NULL )
PHP_FE ( ingres_fetch_array , NULL )
PHP_FE ( ingres_fetch_row , NULL )
PHP_FE ( ingres_fetch_object , NULL )
PHP_FE ( ingres_rollback , NULL )
PHP_FE ( ingres_commit , NULL )
PHP_FE ( ingres_autocommit , NULL )
{ NULL , NULL , NULL } /* Must be the last line in ii_functions[] */
2000-07-17 21:29:30 +00:00
} ;
2000-07-17 23:21:42 +00:00
zend_module_entry ingres_ii_module_entry = {
2001-10-11 23:33:59 +00:00
STANDARD_MODULE_HEADER ,
2001-07-30 06:18:13 +00:00
" ingres_ii " ,
ii_functions ,
PHP_MINIT ( ii ) ,
PHP_MSHUTDOWN ( ii ) ,
PHP_RINIT ( ii ) ,
PHP_RSHUTDOWN ( ii ) ,
PHP_MINFO ( ii ) ,
2003-02-11 02:42:59 +00:00
NO_VERSION_YET ,
2001-07-30 06:18:13 +00:00
STANDARD_MODULE_PROPERTIES
2000-07-17 21:29:30 +00:00
} ;
2000-07-18 22:34:42 +00:00
# ifdef COMPILE_DL_INGRES_II
ZEND_GET_MODULE ( ingres_ii )
2000-07-17 21:29:30 +00:00
# endif
/* php.ini entries
*/
PHP_INI_BEGIN ( )
2003-03-07 05:15:28 +00:00
STD_PHP_INI_BOOLEAN ( " ingres.allow_persistent " , " 1 " , PHP_INI_SYSTEM , OnUpdateLong , allow_persistent , zend_ii_globals , ii_globals )
STD_PHP_INI_ENTRY_EX ( " ingres.max_persistent " , " -1 " , PHP_INI_SYSTEM , OnUpdateLong , max_persistent , zend_ii_globals , ii_globals , display_link_numbers )
STD_PHP_INI_ENTRY_EX ( " ingres.max_links " , " -1 " , PHP_INI_SYSTEM , OnUpdateLong , max_links , zend_ii_globals , ii_globals , display_link_numbers )
2001-08-19 01:47:19 +00:00
STD_PHP_INI_ENTRY ( " ingres.default_database " , NULL , PHP_INI_ALL , OnUpdateString , default_database , zend_ii_globals , ii_globals )
STD_PHP_INI_ENTRY ( " ingres.default_user " , NULL , PHP_INI_ALL , OnUpdateString , default_user , zend_ii_globals , ii_globals )
STD_PHP_INI_ENTRY ( " ingres.default_password " , NULL , PHP_INI_ALL , OnUpdateString , default_password , zend_ii_globals , ii_globals )
2000-07-17 21:29:30 +00:00
PHP_INI_END ( )
/* closes statement in given link
*/
static int _close_statement ( II_LINK * link )
{
2001-08-19 01:47:19 +00:00
IIAPI_CLOSEPARM closeParm ;
closeParm . cl_genParm . gp_callback = NULL ;
closeParm . cl_genParm . gp_closure = NULL ;
closeParm . cl_stmtHandle = link - > stmtHandle ;
IIapi_close ( & closeParm ) ;
ii_sync ( & ( closeParm . cl_genParm ) ) ;
if ( ii_success ( & ( closeParm . cl_genParm ) ) = = II_FAIL ) {
return 1 ;
}
link - > stmtHandle = NULL ;
link - > fieldCount = 0 ;
link - > descriptor = NULL ;
return 0 ;
2000-07-17 21:29:30 +00:00
}
/* rolls back transaction in given link
after closing the active transaction ( if any )
*/
2003-01-19 00:45:53 +00:00
static int _rollback_transaction ( II_LINK * link TSRMLS_DC )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
IIAPI_ROLLBACKPARM rollbackParm ;
if ( link - > stmtHandle & & _close_statement ( link ) ) {
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Unable to close statement !! " ) ;
2001-08-19 01:47:19 +00:00
return 1 ;
}
rollbackParm . rb_genParm . gp_callback = NULL ;
rollbackParm . rb_genParm . gp_closure = NULL ;
rollbackParm . rb_tranHandle = link - > tranHandle ;
rollbackParm . rb_savePointHandle = NULL ;
IIapi_rollback ( & rollbackParm ) ;
ii_sync ( & ( rollbackParm . rb_genParm ) ) ;
if ( ii_success ( & ( rollbackParm . rb_genParm ) ) = = II_FAIL ) {
return 1 ;
}
link - > tranHandle = NULL ;
return 0 ;
2000-07-17 21:29:30 +00:00
}
2001-08-07 20:13:54 +00:00
static void _close_ii_link ( II_LINK * link TSRMLS_DC )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
IIAPI_DISCONNPARM disconnParm ;
2000-07-17 21:29:30 +00:00
2003-01-19 00:45:53 +00:00
if ( link - > tranHandle & & _rollback_transaction ( link TSRMLS_CC ) ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Unable to rollback transaction !! " ) ;
2001-08-19 01:47:19 +00:00
}
2000-07-17 21:29:30 +00:00
2001-08-19 01:47:19 +00:00
disconnParm . dc_genParm . gp_callback = NULL ;
disconnParm . dc_genParm . gp_closure = NULL ;
disconnParm . dc_connHandle = link - > connHandle ;
2000-07-17 21:29:30 +00:00
2001-08-19 01:47:19 +00:00
IIapi_disconnect ( & disconnParm ) ;
2000-07-17 21:29:30 +00:00
2001-08-19 01:47:19 +00:00
free ( link ) ;
2000-07-17 21:29:30 +00:00
2001-08-19 01:47:19 +00:00
IIG ( num_links ) - - ;
2000-07-17 21:29:30 +00:00
}
2000-10-20 18:25:16 +00:00
/* closes the given link, actually disconnecting from server
and releasing associated resources after rolling back the
active transaction ( if any )
*/
2001-07-31 05:44:11 +00:00
static void php_close_ii_link ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
2000-10-20 18:25:16 +00:00
{
2001-08-19 01:47:19 +00:00
II_LINK * link = ( II_LINK * ) rsrc - > ptr ;
2001-07-31 05:44:11 +00:00
2001-08-07 20:13:54 +00:00
_close_ii_link ( link TSRMLS_CC ) ;
2000-10-20 18:25:16 +00:00
}
2000-07-17 21:29:30 +00:00
/* closes the given persistent link, see _close_ii_link
*/
2001-07-31 05:44:11 +00:00
static void _close_ii_plink ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
II_LINK * link = ( II_LINK * ) rsrc - > ptr ;
2001-08-07 20:13:54 +00:00
_close_ii_link ( link TSRMLS_CC ) ;
2000-11-13 22:23:16 +00:00
IIG ( num_persistent ) - - ;
2000-07-17 21:29:30 +00:00
}
2000-09-29 09:29:06 +00:00
/* cleans up the given persistent link.
used when the request ends to ' refresh ' the link for use
by the next request
*/
2003-02-11 02:42:59 +00:00
static void _ai_clean_ii_plink ( II_LINK * link TSRMLS_DC )
2000-09-29 09:29:06 +00:00
{
2003-02-11 02:42:59 +00:00
int ai_error = 0 ;
IIAPI_DISCONNPARM disconnParm ;
2001-08-19 01:47:19 +00:00
IIAPI_AUTOPARM autoParm ;
2003-02-11 02:42:59 +00:00
/* if link as always been marked as broken do nothing */
/* This because we call this function directly from close function */
/* And it's called in the end of request */
if ( link - > connHandle = = NULL ) {
return ;
}
if ( link - > stmtHandle & & _close_statement ( link ) ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Unable to close statement !! " ) ;
ai_error = 1 ;
}
2001-08-19 01:47:19 +00:00
if ( link - > autocommit ) {
autoParm . ac_genParm . gp_callback = NULL ;
autoParm . ac_genParm . gp_closure = NULL ;
autoParm . ac_connHandle = link - > connHandle ;
autoParm . ac_tranHandle = link - > tranHandle ;
IIapi_autocommit ( & autoParm ) ;
ii_sync ( & ( autoParm . ac_genParm ) ) ;
if ( ii_success ( & ( autoParm . ac_genParm ) ) = = II_FAIL ) {
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Unable to disable autocommit " ) ;
2001-08-19 01:47:19 +00:00
}
link - > autocommit = 0 ;
link - > tranHandle = NULL ;
}
2003-01-19 00:45:53 +00:00
if ( link - > tranHandle & & _rollback_transaction ( link TSRMLS_CC ) ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Unable to rollback transaction !! " ) ;
2001-08-19 01:47:19 +00:00
}
2003-02-11 02:42:59 +00:00
/* Assume link is broken, close it, and mark it as broken with conn Handle NULL */
if ( ai_error ) {
disconnParm . dc_genParm . gp_callback = NULL ;
disconnParm . dc_genParm . gp_closure = NULL ;
disconnParm . dc_connHandle = link - > connHandle ;
IIapi_disconnect ( & disconnParm ) ;
link - > connHandle = NULL ;
}
}
static void _clean_ii_plink ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
{
II_LINK * link = ( II_LINK * ) rsrc - > ptr ;
_ai_clean_ii_plink ( link TSRMLS_CC ) ;
2001-08-19 01:47:19 +00:00
}
2000-09-29 09:29:06 +00:00
2000-07-17 21:29:30 +00:00
/* sets the default link
*/
2001-08-07 20:13:54 +00:00
static void php_ii_set_default_link ( int id TSRMLS_DC )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
if ( IIG ( default_link ) ! = - 1 ) {
2000-07-17 21:29:30 +00:00
zend_list_delete ( IIG ( default_link ) ) ;
}
IIG ( default_link ) = id ;
zend_list_addref ( id ) ;
}
/* gets the default link
if none has been set , tries to open a new one with default
parameters
*/
2001-07-30 21:02:27 +00:00
static int php_ii_get_default_link ( INTERNAL_FUNCTION_PARAMETERS )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
if ( IIG ( default_link ) = = - 1 ) { /* no link opened yet, implicitly open one */
2000-07-17 21:29:30 +00:00
ht = 0 ;
php_ii_do_connect ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 ) ;
}
return IIG ( default_link ) ;
}
2001-06-09 09:23:49 +00:00
static void php_ii_globals_init ( zend_ii_globals * ii_globals )
{
ii_globals - > num_persistent = 0 ;
}
2000-07-17 21:29:30 +00:00
/* Module initialization
*/
PHP_MINIT_FUNCTION ( ii )
{
2001-08-19 01:47:19 +00:00
IIAPI_INITPARM initParm ;
ZEND_INIT_MODULE_GLOBALS ( ii , php_ii_globals_init , NULL ) ;
REGISTER_INI_ENTRIES ( ) ;
le_ii_link = zend_register_list_destructors_ex ( php_close_ii_link , NULL , " ingres " , module_number ) ;
le_ii_plink = zend_register_list_destructors_ex ( _clean_ii_plink , _close_ii_plink , " ingres persistent " , module_number ) ;
/* Constants registration */
REGISTER_LONG_CONSTANT ( " INGRES_ASSOC " , II_ASSOC , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " INGRES_NUM " , II_NUM , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " INGRES_BOTH " , II_BOTH , CONST_CS | CONST_PERSISTENT ) ;
/* Ingres api initialization */
initParm . in_timeout = - 1 ; /* timeout in ms, -1 = no timeout */
initParm . in_version = IIAPI_VERSION_1 ; /* api version used */
IIapi_initialize ( & initParm ) ;
if ( initParm . in_status = = IIAPI_ST_SUCCESS ) {
return SUCCESS ;
} else {
return FAILURE ;
}
2000-07-17 21:29:30 +00:00
}
/* Module shutdown
2001-08-19 01:47:19 +00:00
*/
2000-07-17 21:29:30 +00:00
PHP_MSHUTDOWN_FUNCTION ( ii )
{
2001-08-19 01:47:19 +00:00
IIAPI_TERMPARM termParm ;
UNREGISTER_INI_ENTRIES ( ) ;
/* Ingres api termination */
IIapi_terminate ( & termParm ) ;
if ( termParm . tm_status = = IIAPI_ST_SUCCESS ) {
return SUCCESS ;
} else {
return FAILURE ;
}
2000-07-17 21:29:30 +00:00
}
/* New request initialization
*/
PHP_RINIT_FUNCTION ( ii )
{
2001-08-19 01:47:19 +00:00
IIG ( default_link ) = - 1 ;
IIG ( num_links ) = IIG ( num_persistent ) ;
return SUCCESS ;
2000-07-17 21:29:30 +00:00
}
/* End of request
*/
PHP_RSHUTDOWN_FUNCTION ( ii )
{
2001-08-19 01:47:19 +00:00
if ( IIG ( default_link ) ! = - 1 ) {
zend_list_delete ( IIG ( default_link ) ) ;
IIG ( default_link ) = - 1 ;
}
return SUCCESS ;
2000-07-17 21:29:30 +00:00
}
/* Informations reported to phpinfo()
*/
PHP_MINFO_FUNCTION ( ii )
{
2001-08-19 01:47:19 +00:00
char buf [ 32 ] ;
php_info_print_table_start ( ) ;
php_info_print_table_header ( 2 , " Ingres II Support " , " enabled " ) ;
sprintf ( buf , " %ld " , IIG ( num_persistent ) ) ;
php_info_print_table_row ( 2 , " Active Persistent Links " , buf ) ;
sprintf ( buf , " %ld " , IIG ( num_links ) ) ;
php_info_print_table_row ( 2 , " Active Links " , buf ) ;
php_info_print_table_end ( ) ;
DISPLAY_INI_ENTRIES ( ) ;
2000-07-17 21:29:30 +00:00
}
/* Waits for completion of the last Ingres api call
used because of the asynchronous design of this api
*/
static int ii_sync ( IIAPI_GENPARM * genParm )
{
2001-08-19 01:47:19 +00:00
static IIAPI_WAITPARM waitParm = {
- 1 , /* no timeout, we don't want asynchronous queries */
0 /* wt_status (output) */
} ;
while ( genParm - > gp_completed = = FALSE ) {
IIapi_wait ( & waitParm ) ;
}
if ( waitParm . wt_status ! = IIAPI_ST_SUCCESS ) {
2003-01-19 00:45:53 +00:00
TSRMLS_FETCH ( ) ;
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Unexpected failure of IIapi_wait() " ) ;
2001-08-19 01:47:19 +00:00
return 0 ;
}
return 1 ;
2000-07-17 21:29:30 +00:00
}
/* Handles errors from Ingres api
*/
static int ii_success ( IIAPI_GENPARM * genParm )
{
2001-08-19 01:47:19 +00:00
switch ( genParm - > gp_status ) {
case IIAPI_ST_SUCCESS :
return II_OK ;
case IIAPI_ST_NO_DATA :
return II_NO_DATA ;
default :
if ( genParm - > gp_errorHandle = = NULL ) { /* no error message available */
2003-01-19 00:45:53 +00:00
TSRMLS_FETCH ( ) ;
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Server or API error - no error message available " ) ;
2001-08-19 01:47:19 +00:00
} else {
IIAPI_GETEINFOPARM getEInfoParm ;
2003-02-11 02:42:59 +00:00
TSRMLS_FETCH ( ) ;
2001-08-19 01:47:19 +00:00
getEInfoParm . ge_errorHandle = genParm - > gp_errorHandle ;
IIapi_getErrorInfo ( & getEInfoParm ) ;
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Server or API error : %s " , getEInfoParm . ge_message ) ;
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: SQLSTATE : %s " , getEInfoParm . ge_SQLSTATE ) ;
2001-08-19 01:47:19 +00:00
}
return II_FAIL ;
}
2000-07-17 21:29:30 +00:00
}
/* Actually handles connection creation, either persistent or not
*/
2001-08-11 16:39:07 +00:00
static void php_ii_do_connect ( INTERNAL_FUNCTION_PARAMETERS , int persistent )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
zval * * database , * * username , * * password ;
char * db , * user , * pass ;
int argc ;
char * hashed_details ;
int hashed_details_length ;
IIAPI_CONNPARM connParm ;
II_LINK * link ;
/* Setting db, user and pass according to sql_safe_mode, parameters and/or default values */
argc = ZEND_NUM_ARGS ( ) ;
if ( PG ( sql_safe_mode ) ) { /* sql_safe_mode */
if ( argc > 0 ) {
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_NOTICE , " SQL safe mode in effect - ignoring host/user/password information " ) ;
2001-08-19 01:47:19 +00:00
}
db = pass = NULL ;
user = php_get_current_user ( ) ;
hashed_details_length = strlen ( user ) + sizeof ( " ingres___ " ) - 1 ;
hashed_details = ( char * ) emalloc ( hashed_details_length + 1 ) ;
sprintf ( hashed_details , " Ingres__%s_ " , user ) ;
} else { /* non-sql_safe_mode */
db = IIG ( default_database ) ;
user = IIG ( default_user ) ;
pass = IIG ( default_password ) ;
if ( argc > 3 | | zend_get_parameters_ex ( argc , & database , & username , & password ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
switch ( argc ) {
case 3 :
convert_to_string_ex ( password ) ;
2001-09-25 21:58:48 +00:00
pass = Z_STRVAL_PP ( password ) ;
2001-08-19 01:47:19 +00:00
/* Fall-through. */
case 2 :
convert_to_string_ex ( username ) ;
2001-09-25 21:58:48 +00:00
user = Z_STRVAL_PP ( username ) ;
2001-08-19 01:47:19 +00:00
/* Fall-through. */
case 1 :
convert_to_string_ex ( database ) ;
2001-09-25 21:58:48 +00:00
db = Z_STRVAL_PP ( database ) ;
2001-08-19 01:47:19 +00:00
/* Fall-through. */
case 0 :
break ;
}
hashed_details_length = sizeof ( " ingres___ " ) - 1 +
strlen ( SAFE_STRING ( db ) ) +
strlen ( SAFE_STRING ( user ) ) +
strlen ( SAFE_STRING ( pass ) ) ;
hashed_details = ( char * ) emalloc ( hashed_details_length + 1 ) ;
sprintf ( hashed_details , " Ingres_%s_%s_%s " , SAFE_STRING ( db ) , SAFE_STRING ( user ) , SAFE_STRING ( pass ) ) ;
}
/* if asked for unauthorized persistency, issue a warning
and go for a non - persistent link */
if ( persistent & & ! IIG ( allow_persistent ) ) {
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Persistent links disabled ! " ) ;
2001-08-19 01:47:19 +00:00
persistent = 0 ;
}
2000-07-17 21:29:30 +00:00
2001-08-19 01:47:19 +00:00
if ( persistent ) {
list_entry * le ;
/* is this link already in the persistent list ? */
if ( zend_hash_find ( & EG ( persistent_list ) , hashed_details , hashed_details_length + 1 , ( void * * ) & le ) = = FAILURE ) { /* no, new persistent connection */
list_entry new_le ;
if ( IIG ( max_links ) ! = - 1 & & IIG ( num_links ) > = IIG ( max_links ) ) {
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Too many open links (%d) " , IIG ( num_links ) ) ;
2001-08-19 01:47:19 +00:00
efree ( hashed_details ) ;
RETURN_FALSE ;
}
if ( IIG ( max_persistent ) ! = - 1 & & IIG ( num_persistent ) > = IIG ( max_persistent ) ) {
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Too many open persistent links (%d) " , IIG ( num_persistent ) ) ;
2001-08-19 01:47:19 +00:00
efree ( hashed_details ) ;
RETURN_FALSE ;
}
/* create the link */
connParm . co_genParm . gp_callback = NULL ;
connParm . co_genParm . gp_closure = NULL ;
connParm . co_target = db ;
connParm . co_username = user ;
connParm . co_password = pass ;
connParm . co_timeout = - 1 ; /* -1 is no timeout */
connParm . co_connHandle = NULL ;
connParm . co_tranHandle = NULL ;
IIapi_connect ( & connParm ) ;
if ( ! ii_sync ( & ( connParm . co_genParm ) ) | | ii_success ( & ( connParm . co_genParm ) ) = = II_FAIL ) {
efree ( hashed_details ) ;
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Unable to connect to database (%s) " , db ) ;
2001-08-19 01:47:19 +00:00
RETURN_FALSE ;
}
link = ( II_LINK * ) malloc ( sizeof ( II_LINK ) ) ;
link - > connHandle = connParm . co_connHandle ;
link - > tranHandle = NULL ;
link - > stmtHandle = NULL ;
link - > fieldCount = 0 ;
link - > descriptor = NULL ;
link - > autocommit = 0 ;
/* hash it up */
2001-09-25 21:58:48 +00:00
Z_TYPE ( new_le ) = le_ii_plink ;
2001-08-19 01:47:19 +00:00
new_le . ptr = link ;
if ( zend_hash_update ( & EG ( persistent_list ) , hashed_details , hashed_details_length + 1 , ( void * ) & new_le , sizeof ( list_entry ) , NULL ) = = FAILURE ) {
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Unable to hash (%s) " , hashed_details ) ;
2001-08-19 01:47:19 +00:00
free ( link ) ;
efree ( hashed_details ) ;
RETURN_FALSE ;
}
IIG ( num_persistent ) + + ;
IIG ( num_links ) + + ;
} else { /* already open persistent connection */
2001-09-25 21:58:48 +00:00
if ( Z_TYPE_P ( le ) ! = le_ii_plink ) {
2004-05-18 23:26:53 +00:00
efree ( hashed_details ) ;
2001-08-19 01:47:19 +00:00
RETURN_FALSE ;
}
/* here we should ensure that the link did not die */
/* unable to figure out the right way to do this */
/* maybe does the api handle the reconnection transparently ? */
link = ( II_LINK * ) le - > ptr ;
2003-02-11 02:42:59 +00:00
/* Unfortunetaly NO !!!*/
/* Ingres api doesn't reconnect */
/* Have to reconnect if cleaning function has flagged link as broken */
if ( link - > connHandle = = NULL ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Broken link (%s),reconnect " , db ) ;
/* Recreate the link */
connParm . co_genParm . gp_callback = NULL ;
connParm . co_genParm . gp_closure = NULL ;
connParm . co_target = db ;
connParm . co_username = user ;
connParm . co_password = pass ;
connParm . co_timeout = - 1 ; /* no timeout */
connParm . co_connHandle = NULL ;
connParm . co_tranHandle = NULL ;
IIapi_connect ( & connParm ) ;
if ( ! ii_sync ( & ( connParm . co_genParm ) ) | | ii_success ( & ( connParm . co_genParm ) ) = = II_FAIL ) {
efree ( hashed_details ) ;
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Unable to connect to database (%s) " , db ) ;
RETURN_FALSE ;
}
link - > connHandle = connParm . co_connHandle ;
link - > tranHandle = NULL ;
link - > stmtHandle = NULL ;
link - > fieldCount = 0 ;
link - > descriptor = NULL ;
link - > autocommit = 0 ;
}
2001-08-19 01:47:19 +00:00
}
2003-02-11 02:42:59 +00:00
2001-08-19 01:47:19 +00:00
ZEND_REGISTER_RESOURCE ( return_value , link , le_ii_plink ) ;
} else { /* non persistent */
list_entry * index_ptr , new_index_ptr ;
/* first we check the hash for the hashed_details key. if it exists,
* it should point us to the right offset where the actual link sits .
* if it doesn ' t , open a new link , add it to the resource list ,
* and add a pointer to it with hashed_details as the key .
*/
if ( zend_hash_find ( & EG ( regular_list ) , hashed_details , hashed_details_length + 1 , ( void * * ) & index_ptr ) = = SUCCESS ) {
int type ;
void * ptr ;
2001-09-25 21:58:48 +00:00
if ( Z_TYPE_P ( index_ptr ) ! = le_index_ptr ) {
2001-08-19 01:47:19 +00:00
RETURN_FALSE ;
}
link = ( II_LINK * ) index_ptr - > ptr ;
ptr = zend_list_find ( ( int ) link , & type ) ; /* check if the link is still there */
if ( ptr & & ( type = = le_ii_link | | type = = le_ii_plink ) ) {
zend_list_addref ( ( int ) link ) ;
2001-09-25 21:58:48 +00:00
Z_LVAL_P ( return_value ) = ( int ) link ;
2001-08-19 01:47:19 +00:00
php_ii_set_default_link ( ( int ) link TSRMLS_CC ) ;
2001-09-25 21:58:48 +00:00
Z_TYPE_P ( return_value ) = IS_RESOURCE ;
2001-08-19 01:47:19 +00:00
efree ( hashed_details ) ;
return ;
} else {
zend_hash_del ( & EG ( regular_list ) , hashed_details , hashed_details_length + 1 ) ;
}
}
if ( IIG ( max_links ) ! = - 1 & & IIG ( num_links ) > = IIG ( max_links ) ) {
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Too many open links (%d) " , IIG ( num_links ) ) ;
2001-08-19 01:47:19 +00:00
efree ( hashed_details ) ;
RETURN_FALSE ;
}
/* create the link */
connParm . co_genParm . gp_callback = NULL ;
connParm . co_genParm . gp_closure = NULL ;
connParm . co_target = db ;
connParm . co_username = user ;
connParm . co_password = pass ;
connParm . co_timeout = - 1 ; /* -1 is no timeout */
connParm . co_connHandle = NULL ;
connParm . co_tranHandle = NULL ;
IIapi_connect ( & connParm ) ;
if ( ! ii_sync ( & ( connParm . co_genParm ) ) | | ii_success ( & ( connParm . co_genParm ) ) = = II_FAIL ) {
efree ( hashed_details ) ;
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Unable to connect to database (%s) " , db ) ;
2001-08-19 01:47:19 +00:00
RETURN_FALSE ;
}
link = ( II_LINK * ) malloc ( sizeof ( II_LINK ) ) ;
link - > connHandle = connParm . co_connHandle ;
link - > tranHandle = NULL ;
link - > stmtHandle = NULL ;
link - > fieldCount = 0 ;
link - > descriptor = NULL ;
link - > autocommit = 0 ;
/* add it to the list */
ZEND_REGISTER_RESOURCE ( return_value , link , le_ii_link ) ;
/* 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 ;
2001-08-19 01:47:19 +00:00
if ( zend_hash_update ( & EG ( regular_list ) , hashed_details , hashed_details_length + 1 , ( void * ) & new_index_ptr , sizeof ( list_entry ) , NULL ) = = FAILURE ) {
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Unable to hash (%s) " , hashed_details ) ;
2001-08-19 01:47:19 +00:00
free ( link ) ;
efree ( hashed_details ) ;
RETURN_FALSE ;
}
IIG ( num_links ) + + ;
}
efree ( hashed_details ) ;
2001-09-25 21:58:48 +00:00
php_ii_set_default_link ( Z_LVAL_P ( return_value ) TSRMLS_CC ) ;
2000-07-17 21:29:30 +00:00
}
2000-08-26 14:21:26 +00:00
/* {{{ proto resource ingres_connect([string database [, string username [, string password]]])
2000-07-17 21:50:35 +00:00
Open a connection to an Ingres II database the syntax of database is [ node_id : : ] dbname [ / svr_class ] */
2000-08-26 14:21:26 +00:00
PHP_FUNCTION ( ingres_connect )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
php_ii_do_connect ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 ) ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto resource ingres_pconnect([string database [, string username [, string password]]])
2000-07-17 21:50:35 +00:00
Open a persistent connection to an Ingres II database the syntax of database is [ node_id : : ] dbname [ / svr_class ] */
2000-08-26 14:21:26 +00:00
PHP_FUNCTION ( ingres_pconnect )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
php_ii_do_connect ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 ) ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto bool ingres_close([resource link])
2000-07-17 21:29:30 +00:00
Close an Ingres II database connection */
2000-08-26 14:21:26 +00:00
PHP_FUNCTION ( ingres_close )
2000-07-17 21:29:30 +00:00
{
2003-02-11 02:42:59 +00:00
zval * * link = NULL ;
2001-08-19 01:47:19 +00:00
int link_id = - 1 ;
II_LINK * ii_link ;
2003-02-11 02:42:59 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 0 :
link_id = IIG ( default_link ) ;
break ;
2001-08-19 01:47:19 +00:00
2003-02-11 02:42:59 +00:00
case 1 :
if ( zend_get_parameters_ex ( 1 , & link ) = = FAILURE ) {
RETURN_FALSE ;
}
link_id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-08-19 01:47:19 +00:00
}
ZEND_FETCH_RESOURCE2 ( ii_link , II_LINK * , link , link_id , " Ingres II Link " , le_ii_link , le_ii_plink ) ;
2003-02-11 02:42:59 +00:00
/* Call the clean function synchronously here */
/* Otherwise we have to wait for request shutdown */
/* This way we can reuse the link in the same script */
_ai_clean_ii_plink ( ii_link TSRMLS_CC ) ;
if ( link_id = = - 1 ) { /* explicit resource number */
zend_list_delete ( Z_RESVAL_PP ( link ) ) ;
}
if ( link_id ! = - 1 | | ( link & & Z_RESVAL_PP ( link ) = = IIG ( default_link ) ) ) {
zend_list_delete ( IIG ( default_link ) ) ;
IIG ( default_link ) = - 1 ;
}
2001-08-19 01:47:19 +00:00
RETURN_TRUE ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto bool ingres_query(string query [, resource link])
2000-07-17 21:50:35 +00:00
Send a SQL query to Ingres II */
/* This should go into the documentation */
/* Unsupported query types:
2000-07-17 21:29:30 +00:00
- close
- commit
- connect
- disconnect
- get dbevent
- prepare to commit
- rollback
- savepoint
- set autocommit
- < all cursor related queries >
( look for dedicated functions instead ) */
2000-08-26 14:21:26 +00:00
PHP_FUNCTION ( ingres_query )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
zval * * query , * * link ;
int argc ;
int link_id = - 1 ;
II_LINK * ii_link ;
IIAPI_QUERYPARM queryParm ;
IIAPI_GETDESCRPARM getDescrParm ;
argc = ZEND_NUM_ARGS ( ) ;
if ( argc < 1 | | argc > 2 | | zend_get_parameters_ex ( argc , & query , & link ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
if ( argc < 2 ) {
link_id = php_ii_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
}
ZEND_FETCH_RESOURCE2 ( ii_link , II_LINK * , link , link_id , " Ingres II Link " , le_ii_link , le_ii_plink ) ;
convert_to_string_ex ( query ) ;
/* if there's already an active statement, close it */
if ( ii_link - > stmtHandle & & _close_statement ( ii_link ) ) {
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Unable to close statement !! " ) ;
2001-08-19 01:47:19 +00:00
RETURN_FALSE ;
}
/* send the query */
queryParm . qy_genParm . gp_callback = NULL ;
queryParm . qy_genParm . gp_closure = NULL ;
queryParm . qy_connHandle = ii_link - > connHandle ;
queryParm . qy_tranHandle = ii_link - > tranHandle ;
queryParm . qy_stmtHandle = NULL ;
queryParm . qy_queryType = IIAPI_QT_QUERY ;
queryParm . qy_parameters = FALSE ;
queryParm . qy_queryText = Z_STRVAL_PP ( query ) ;
IIapi_query ( & queryParm ) ;
ii_sync ( & ( queryParm . qy_genParm ) ) ;
if ( ii_success ( & ( queryParm . qy_genParm ) ) = = II_FAIL ) {
RETURN_FALSE ;
}
/* store transaction and statement handles */
ii_link - > tranHandle = queryParm . qy_tranHandle ;
ii_link - > stmtHandle = queryParm . qy_stmtHandle ;
/* get description of results */
getDescrParm . gd_genParm . gp_callback = NULL ;
getDescrParm . gd_genParm . gp_closure = NULL ;
getDescrParm . gd_stmtHandle = ii_link - > stmtHandle ;
IIapi_getDescriptor ( & getDescrParm ) ;
ii_sync ( & ( getDescrParm . gd_genParm ) ) ;
if ( ii_success ( & ( getDescrParm . gd_genParm ) ) = = II_FAIL ) {
RETURN_FALSE ;
}
/* store the results */
ii_link - > fieldCount = getDescrParm . gd_descriptorCount ;
ii_link - > descriptor = getDescrParm . gd_descriptor ;
RETURN_TRUE ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto int ingres_num_rows([resource link])
2000-07-17 21:50:35 +00:00
Return the number of rows affected / returned by the last query */
2000-08-26 14:21:26 +00:00
/* Warning : don't call ingres_num_rows() before ingres_fetch_xx(),
or ingres_fetch_xx ( ) wouldn ' t find any data */
PHP_FUNCTION ( ingres_num_rows )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
zval * * link ;
int argc ;
int link_id = - 1 ;
II_LINK * ii_link ;
IIAPI_GETQINFOPARM getQInfoParm ;
argc = ZEND_NUM_ARGS ( ) ;
if ( argc > 1 | | zend_get_parameters_ex ( argc , & link ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
if ( argc < 1 ) {
link_id = php_ii_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
}
ZEND_FETCH_RESOURCE2 ( ii_link , II_LINK * , link , link_id , " Ingres II Link " , le_ii_link , le_ii_plink ) ;
/* get number of affected rows */
getQInfoParm . gq_genParm . gp_callback = NULL ;
getQInfoParm . gq_genParm . gp_closure = NULL ;
getQInfoParm . gq_stmtHandle = ii_link - > stmtHandle ;
IIapi_getQueryInfo ( & getQInfoParm ) ;
ii_sync ( & ( getQInfoParm . gq_genParm ) ) ;
if ( ii_success ( & ( getQInfoParm . gq_genParm ) ) = = II_FAIL ) {
RETURN_FALSE ;
}
/* return the result */
if ( getQInfoParm . gq_mask & IIAPI_GQ_ROW_COUNT ) {
RETURN_LONG ( getQInfoParm . gq_rowCount ) ;
} else {
RETURN_LONG ( 0 ) ;
}
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto int ingres_num_fields([resource link])
2000-07-17 21:29:30 +00:00
Return the number of fields returned by the last query */
2000-08-26 14:21:26 +00:00
PHP_FUNCTION ( ingres_num_fields )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
zval * * link ;
int argc ;
int link_id = - 1 ;
II_LINK * ii_link ;
argc = ZEND_NUM_ARGS ( ) ;
if ( argc > 1 | | zend_get_parameters_ex ( argc , & link ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
if ( argc < 1 ) {
link_id = php_ii_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
}
ZEND_FETCH_RESOURCE2 ( ii_link , II_LINK * , link , link_id , " Ingres II Link " , le_ii_link , le_ii_plink ) ;
RETURN_LONG ( ii_link - > fieldCount ) ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
# define II_FIELD_INFO_NAME 1
# define II_FIELD_INFO_TYPE 2
# define II_FIELD_INFO_NULLABLE 3
# define II_FIELD_INFO_LENGTH 4
# define II_FIELD_INFO_PRECISION 5
# define II_FIELD_INFO_SCALE 6
/* Return information about a field in a query result
*/
static void php_ii_field_info ( INTERNAL_FUNCTION_PARAMETERS , int info_type )
{
2001-08-19 01:47:19 +00:00
zval * * idx , * * link ;
int argc ;
int link_id = - 1 ;
char * name , * fun_name ;
int index ;
II_LINK * ii_link ;
argc = ZEND_NUM_ARGS ( ) ;
if ( argc < 1 | | argc > 2 | | zend_get_parameters_ex ( argc , & idx , & link ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
if ( argc < 2 ) {
link_id = php_ii_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
}
ZEND_FETCH_RESOURCE2 ( ii_link , II_LINK * , link , link_id , " Ingres II Link " , le_ii_link , le_ii_plink ) ;
convert_to_long_ex ( idx ) ;
index = Z_LVAL_PP ( idx ) ;
if ( index < 1 | | index > ii_link - > fieldCount ) {
switch ( info_type ) {
case II_FIELD_INFO_NAME :
fun_name = " ii_field_name " ;
break ;
case II_FIELD_INFO_TYPE :
fun_name = " ii_field_type " ;
break ;
case II_FIELD_INFO_NULLABLE :
fun_name = " ii_field_nullable " ;
break ;
case II_FIELD_INFO_LENGTH :
fun_name = " ii_field_length " ;
break ;
case II_FIELD_INFO_PRECISION :
fun_name = " ii_field_precision " ;
break ;
case II_FIELD_INFO_SCALE :
fun_name = " ii_field_scale " ;
break ;
default :
fun_name = " foobar " ;
break ;
}
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: %s() called with wrong index (%d) " , fun_name , index ) ;
2001-08-19 01:47:19 +00:00
RETURN_FALSE ;
}
switch ( info_type ) {
case II_FIELD_INFO_NAME :
2003-02-21 06:46:12 +00:00
name = php_ii_field_name ( ii_link , index TSRMLS_CC ) ;
2001-08-19 01:47:19 +00:00
if ( name = = NULL ) {
RETURN_FALSE ;
}
RETURN_STRING ( name , 1 ) ;
break ;
case II_FIELD_INFO_TYPE :
switch ( ( ii_link - > descriptor [ index - 1 ] ) . ds_dataType ) {
case IIAPI_BYTE_TYPE :
RETURN_STRING ( " IIAPI_BYTE_TYPE " , 1 ) ;
case IIAPI_CHA_TYPE :
RETURN_STRING ( " IIAPI_CHA_TYPE " , 1 ) ;
case IIAPI_CHR_TYPE :
RETURN_STRING ( " IIAPI_CHR_TYPE " , 1 ) ;
case IIAPI_DEC_TYPE :
RETURN_STRING ( " IIAPI_DEC_TYPE " , 1 ) ;
case IIAPI_DTE_TYPE :
RETURN_STRING ( " IIAPI_DTE_TYPE " , 1 ) ;
case IIAPI_FLT_TYPE :
RETURN_STRING ( " IIAPI_FLT_TYPE " , 1 ) ;
case IIAPI_INT_TYPE :
RETURN_STRING ( " IIAPI_INT_TYPE " , 1 ) ;
case IIAPI_LOGKEY_TYPE :
RETURN_STRING ( " IIAPI_LOGKEY_TYPE " , 1 ) ;
case IIAPI_LBYTE_TYPE :
RETURN_STRING ( " IIAPI_LBYTE_TYPE " , 1 ) ;
case IIAPI_LVCH_TYPE :
RETURN_STRING ( " IIAPI_LVCH_TYPE " , 1 ) ;
case IIAPI_MNY_TYPE :
RETURN_STRING ( " IIAPI_MNY_TYPE " , 1 ) ;
case IIAPI_TABKEY_TYPE :
RETURN_STRING ( " IIAPI_TABKEY_TYPE " , 1 ) ;
case IIAPI_TXT_TYPE :
RETURN_STRING ( " IIAPI_TXT_TYPE " , 1 ) ;
case IIAPI_VBYTE_TYPE :
RETURN_STRING ( " IIAPI_VBYTE_TYPE " , 1 ) ;
case IIAPI_VCH_TYPE :
RETURN_STRING ( " IIAPI_VCH_TYPE " , 1 ) ;
default :
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Unknown Ingres data type " ) ;
2001-08-19 01:47:19 +00:00
RETURN_FALSE ;
break ;
}
break ;
case II_FIELD_INFO_NULLABLE :
if ( ( ii_link - > descriptor [ index - 1 ] ) . ds_nullable ) {
RETURN_TRUE ;
} else {
RETURN_FALSE ;
}
break ;
case II_FIELD_INFO_LENGTH :
RETURN_LONG ( ( ii_link - > descriptor [ index - 1 ] ) . ds_length ) ;
break ;
case II_FIELD_INFO_PRECISION :
RETURN_LONG ( ( ii_link - > descriptor [ index - 1 ] ) . ds_precision ) ;
break ;
case II_FIELD_INFO_SCALE :
RETURN_LONG ( ( ii_link - > descriptor [ index - 1 ] ) . ds_scale ) ;
break ;
default :
RETURN_FALSE ;
}
2000-07-17 21:29:30 +00:00
}
/* Return the name of a field in a query result
*/
2003-02-21 06:46:12 +00:00
static char * php_ii_field_name ( II_LINK * ii_link , int index TSRMLS_DC )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
if ( index < 1 | | index > ii_link - > fieldCount ) {
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: php_ii_field_name() called with wrong index (%d) " , index ) ;
2001-08-19 01:47:19 +00:00
return NULL ;
}
return ( ii_link - > descriptor [ index - 1 ] ) . ds_columnName ;
2000-07-17 21:29:30 +00:00
}
2000-08-26 14:21:26 +00:00
/* {{{ proto string ingres_field_name(int index [, resource link])
Return the name of a field in a query result index must be > 0 and < = ingres_num_fields ( ) */
PHP_FUNCTION ( ingres_field_name )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
php_ii_field_info ( INTERNAL_FUNCTION_PARAM_PASSTHRU , II_FIELD_INFO_NAME ) ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto string ingres_field_type(int index [, resource link])
Return the type of a field in a query result index must be > 0 and < = ingres_num_fields ( ) */
PHP_FUNCTION ( ingres_field_type )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
php_ii_field_info ( INTERNAL_FUNCTION_PARAM_PASSTHRU , II_FIELD_INFO_TYPE ) ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto string ingres_field_nullable(int index [, resource link])
Return true if the field is nullable and false otherwise index must be > 0 and < = ingres_num_fields ( ) */
PHP_FUNCTION ( ingres_field_nullable )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
php_ii_field_info ( INTERNAL_FUNCTION_PARAM_PASSTHRU , II_FIELD_INFO_NULLABLE ) ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto string ingres_field_length(int index [, resource link])
Return the length of a field in a query result index must be > 0 and < = ingres_num_fields ( ) */
PHP_FUNCTION ( ingres_field_length )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
php_ii_field_info ( INTERNAL_FUNCTION_PARAM_PASSTHRU , II_FIELD_INFO_LENGTH ) ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto string ingres_field_precision(int index [, resource link])
Return the precision of a field in a query result index must be > 0 and < = ingres_num_fields ( ) */
PHP_FUNCTION ( ingres_field_precision )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
php_ii_field_info ( INTERNAL_FUNCTION_PARAM_PASSTHRU , II_FIELD_INFO_PRECISION ) ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto string ingres_field_scale(int index [, resource link])
Return the scale of a field in a query result index must be > 0 and < = ingres_num_fields ( ) */
PHP_FUNCTION ( ingres_field_scale )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
php_ii_field_info ( INTERNAL_FUNCTION_PARAM_PASSTHRU , II_FIELD_INFO_SCALE ) ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
2001-08-19 01:47:19 +00:00
2000-07-17 21:29:30 +00:00
/* Convert complex Ingres data types to php-usable ones
*/
2001-08-11 16:39:07 +00:00
# define IIAPI_CONVERT(destType, destSize, precision) {\
2001-08-19 01:47:19 +00:00
convertParm . cv_srcDesc . ds_dataType = ( ii_link - > descriptor [ i + k - 2 ] ) . ds_dataType ; \
convertParm . cv_srcDesc . ds_nullable = ( ii_link - > descriptor [ i + k - 2 ] ) . ds_nullable ; \
convertParm . cv_srcDesc . ds_length = ( ii_link - > descriptor [ i + k - 2 ] ) . ds_length ; \
convertParm . cv_srcDesc . ds_precision = ( ii_link - > descriptor [ i + k - 2 ] ) . ds_precision ; \
convertParm . cv_srcDesc . ds_scale = ( ii_link - > descriptor [ i + k - 2 ] ) . ds_scale ; \
convertParm . cv_srcDesc . ds_columnType = ( ii_link - > descriptor [ i + k - 2 ] ) . ds_columnType ; \
convertParm . cv_srcDesc . ds_columnName = ( ii_link - > descriptor [ i + k - 2 ] ) . ds_columnName ; \
convertParm . cv_srcValue . dv_null = columnData [ k - 1 ] . dv_null ; \
convertParm . cv_srcValue . dv_length = columnData [ k - 1 ] . dv_length ; \
convertParm . cv_srcValue . dv_value = columnData [ k - 1 ] . dv_value ; \
convertParm . cv_dstDesc . ds_dataType = destType ; \
convertParm . cv_dstDesc . ds_nullable = FALSE ; \
convertParm . cv_dstDesc . ds_length = destSize ; \
convertParm . cv_dstDesc . ds_precision = precision ; \
convertParm . cv_dstDesc . ds_scale = 0 ; \
convertParm . cv_dstDesc . ds_columnType = IIAPI_COL_TUPLE ; \
convertParm . cv_dstDesc . ds_columnName = NULL ; \
convertParm . cv_dstValue . dv_null = FALSE ; \
convertParm . cv_dstValue . dv_length = convertParm . cv_dstDesc . ds_length ; \
convertParm . cv_dstValue . dv_value = emalloc ( convertParm . cv_dstDesc . ds_length + 1 ) ; \
2000-07-17 21:29:30 +00:00
\
2001-08-19 01:47:19 +00:00
IIapi_convertData ( & convertParm ) ; \
2000-07-17 21:29:30 +00:00
\
2001-08-19 01:47:19 +00:00
if ( ii_success ( & ( getColParm . gc_genParm ) ) ! = II_OK ) { \
RETURN_FALSE ; \
} \
2000-07-17 21:29:30 +00:00
\
2001-08-19 01:47:19 +00:00
columnData [ k - 1 ] . dv_length = convertParm . cv_dstValue . dv_length ; \
columnData [ k - 1 ] . dv_value = convertParm . cv_dstValue . dv_value ; \
efree ( convertParm . cv_srcValue . dv_value ) ; \
}
2000-07-17 21:29:30 +00:00
/* Fetch a row of result
*/
2001-08-07 20:13:54 +00:00
static void php_ii_fetch ( INTERNAL_FUNCTION_PARAMETERS , II_LINK * ii_link , int result_type )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
IIAPI_GETCOLPARM getColParm ;
IIAPI_DATAVALUE * columnData ;
IIAPI_CONVERTPARM convertParm ;
int i , j , k ;
int more ;
double value_double = 0 ;
long value_long = 0 ;
char * value_char_p ;
int len , should_copy , correct_length ;
/* array initialization */
2003-01-18 19:41:56 +00:00
array_init ( return_value ) ;
2000-07-17 21:29:30 +00:00
2001-08-19 01:47:19 +00:00
/* going through all fields */
for ( i = 1 ; i < = ii_link - > fieldCount ; ) {
j = 1 ;
/* as long as there are no long byte or long varchar fields,
Ingres is able to fetch many fields at a time , so try to find
these types and stop if they ' re found .
variable j will get number of fields to fetch */
if ( ( ii_link - > descriptor [ i ] ) . ds_dataType ! = IIAPI_LBYTE_TYPE & &
( ii_link - > descriptor [ i ] ) . ds_dataType ! = IIAPI_LVCH_TYPE ) {
while ( ( ii_link - > descriptor [ i + j - 1 ] ) . ds_dataType ! = IIAPI_LBYTE_TYPE & &
( ii_link - > descriptor [ i + j - 1 ] ) . ds_dataType ! = IIAPI_LVCH_TYPE & &
i + j < = ii_link - > fieldCount ) {
j + + ;
}
}
/* allocate memory for j fields */
2003-08-12 00:58:52 +00:00
columnData = ( IIAPI_DATAVALUE * ) safe_emalloc ( j , sizeof ( IIAPI_DATAVALUE ) , 0 ) ;
2001-08-19 01:47:19 +00:00
for ( k = 1 ; k < = j ; k + + ) {
columnData [ k - 1 ] . dv_value = ( II_PTR ) emalloc ( ( ii_link - > descriptor [ i + k - 2 ] ) . ds_length ) ;
}
more = 1 ; /* this is for multi segment LBYTE and LVCH elements */
while ( more ) {
getColParm . gc_genParm . gp_callback = NULL ;
getColParm . gc_genParm . gp_closure = NULL ;
getColParm . gc_rowCount = 1 ;
getColParm . gc_columnCount = j ;
getColParm . gc_columnData = columnData ;
getColParm . gc_stmtHandle = ii_link - > stmtHandle ;
getColParm . gc_moreSegments = 0 ;
IIapi_getColumns ( & getColParm ) ;
ii_sync ( & ( getColParm . gc_genParm ) ) ;
if ( ii_success ( & ( getColParm . gc_genParm ) ) ! = II_OK ) {
RETURN_FALSE ;
}
more = getColParm . gc_moreSegments ;
if ( more ) { /* more segments of LBYTE or LVCH element to come */
/* Multi segment LBYTE and LVCH elements not supported yet */
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_ERROR , " Ingres II: Multi segment LBYTE and LVCH elements not supported yet " ) ;
2001-08-19 01:47:19 +00:00
} else {
for ( k = 1 ; k < = j ; k + + ) {
if ( columnData [ k - 1 ] . dv_null ) { /* NULL value ? */
if ( result_type & II_NUM ) {
add_index_null ( return_value , i + k - 1 ) ;
}
if ( result_type & II_ASSOC ) {
2003-02-21 06:46:12 +00:00
add_assoc_null ( return_value , php_ii_field_name ( ii_link , i + k - 1 TSRMLS_CC ) ) ;
2001-08-19 01:47:19 +00:00
}
} else { /* non NULL value */
correct_length = 0 ;
switch ( ( ii_link - > descriptor [ i + k - 2 ] ) . ds_dataType ) {
case IIAPI_DEC_TYPE : /* decimal (fixed point number) */
case IIAPI_MNY_TYPE : /* money */
/* convert to floating point number */
IIAPI_CONVERT ( IIAPI_FLT_TYPE , sizeof ( II_FLOAT8 ) , 53 ) ;
/* NO break */
case IIAPI_FLT_TYPE : /* floating point number */
switch ( columnData [ k - 1 ] . dv_length ) {
case 4 :
value_double = ( double ) * ( ( II_FLOAT4 * ) columnData [ k - 1 ] . dv_value ) ;
break ;
case 8 :
value_double = ( double ) * ( ( II_FLOAT8 * ) columnData [ k - 1 ] . dv_value ) ;
break ;
default :
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Invalid size for IIAPI_FLT_TYPE data (%d) " , columnData [ k - 1 ] . dv_length ) ;
2001-08-19 01:47:19 +00:00
break ;
}
if ( result_type & II_NUM ) {
add_index_double ( return_value , i + k - 1 , value_double ) ;
}
if ( result_type & II_ASSOC ) {
2003-02-21 06:46:12 +00:00
add_assoc_double ( return_value , php_ii_field_name ( ii_link , i + k - 1 TSRMLS_CC ) , value_double ) ;
2001-08-19 01:47:19 +00:00
}
break ;
case IIAPI_INT_TYPE : /* integer */
switch ( columnData [ k - 1 ] . dv_length ) {
case 1 :
value_long = ( long ) * ( ( II_INT1 * ) columnData [ k - 1 ] . dv_value ) ;
break ;
case 2 :
value_long = ( long ) * ( ( II_INT2 * ) columnData [ k - 1 ] . dv_value ) ;
break ;
case 4 :
value_long = ( long ) * ( ( II_INT4 * ) columnData [ k - 1 ] . dv_value ) ;
break ;
default :
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Invalid size for IIAPI_INT_TYPE data (%d) " , columnData [ k - 1 ] . dv_length ) ;
2001-08-19 01:47:19 +00:00
break ;
}
if ( result_type & II_NUM ) {
add_index_long ( return_value , i + k - 1 , value_long ) ;
}
if ( result_type & II_ASSOC ) {
2003-02-21 06:46:12 +00:00
add_assoc_long ( return_value , php_ii_field_name ( ii_link , i + k - 1 TSRMLS_CC ) , value_long ) ;
2001-08-19 01:47:19 +00:00
}
break ;
case IIAPI_TXT_TYPE : /* variable length character string */
case IIAPI_VBYTE_TYPE : /* variable length binary string */
case IIAPI_VCH_TYPE : /* variable length character string */
/* real length is stored in first 2 bytes of data, so adjust
length variable and data pointer */
columnData [ k - 1 ] . dv_length = * ( ( II_INT2 * ) columnData [ k - 1 ] . dv_value ) ;
( ( II_INT2 * ) columnData [ k - 1 ] . dv_value ) + + ;
correct_length = 1 ;
/* NO break */
case IIAPI_BYTE_TYPE : /* fixed length binary string */
case IIAPI_CHA_TYPE : /* fixed length character string */
case IIAPI_CHR_TYPE : /* fixed length character string */
case IIAPI_LOGKEY_TYPE : /* value unique to database */
case IIAPI_TABKEY_TYPE : /* value unique to table */
case IIAPI_DTE_TYPE : /* date */
/* eventualy convert date to string */
if ( ( ii_link - > descriptor [ i + k - 2 ] ) .
ds_dataType = = IIAPI_DTE_TYPE ) {
IIAPI_CONVERT ( IIAPI_CHA_TYPE , 32 , 0 ) ;
}
/* use php_addslashes if asked to */
if ( PG ( magic_quotes_runtime ) ) {
value_char_p = php_addslashes ( ( char * ) columnData [ k - 1 ] . dv_value , columnData [ k - 1 ] . dv_length , & len , 0 TSRMLS_CC ) ;
should_copy = 0 ;
} else {
value_char_p = ( char * ) columnData [ k - 1 ] . dv_value ;
len = columnData [ k - 1 ] . dv_length ;
should_copy = 1 ;
}
if ( result_type & II_NUM ) {
add_index_stringl ( return_value , i + k - 1 , value_char_p , len , should_copy ) ;
}
if ( result_type & II_ASSOC ) {
2003-02-21 06:46:12 +00:00
add_assoc_stringl ( return_value , php_ii_field_name ( ii_link , i + k - 1 TSRMLS_CC ) , value_char_p , len , should_copy ) ;
2001-08-19 01:47:19 +00:00
}
/* eventualy restore data pointer state for
variable length data types */
if ( correct_length ) {
( ( II_INT2 * ) columnData [ k - 1 ] . dv_value ) - - ;
}
break ;
default :
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Invalid SQL data type in fetched field (%d -- length : %d) " , ( ii_link - > descriptor [ i + k - 2 ] ) . ds_dataType , columnData [ k - 1 ] . dv_length ) ;
2001-08-19 01:47:19 +00:00
break ;
}
}
}
}
}
/* free the memory buffers */
for ( k = 1 ; k < = j ; k + + ) {
efree ( columnData [ k - 1 ] . dv_value ) ;
}
efree ( columnData ) ;
/* increase field pointer by number of fetched fields */
i + = j ;
}
2000-07-17 21:29:30 +00:00
}
2000-08-26 14:21:26 +00:00
/* {{{ proto array ingres_fetch_array([int result_type [, resource link]])
2000-07-17 21:50:35 +00:00
Fetch a row of result into an array result_type can be II_NUM for enumerated array , II_ASSOC for associative array , or II_BOTH ( default ) */
2000-08-26 14:21:26 +00:00
PHP_FUNCTION ( ingres_fetch_array )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
zval * * result_type , * * link ;
int argc ;
int link_id = - 1 ;
II_LINK * ii_link ;
argc = ZEND_NUM_ARGS ( ) ;
if ( argc > 2 | | zend_get_parameters_ex ( argc , & result_type , & link ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
if ( argc ! = 2 ) {
link_id = php_ii_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
}
if ( argc ! = 0 ) {
convert_to_long_ex ( result_type ) ;
}
ZEND_FETCH_RESOURCE2 ( ii_link , II_LINK * , link , link_id , " Ingres II Link " , le_ii_link , le_ii_plink ) ;
php_ii_fetch ( INTERNAL_FUNCTION_PARAM_PASSTHRU , ii_link , ( argc = = 0 ? II_BOTH : Z_LVAL_PP ( result_type ) ) ) ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto array ingres_fetch_row([resource link])
2000-07-17 21:29:30 +00:00
Fetch a row of result into an enumerated array */
2000-08-26 14:21:26 +00:00
PHP_FUNCTION ( ingres_fetch_row )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
zval * * link ;
int argc ;
int link_id = - 1 ;
II_LINK * ii_link ;
argc = ZEND_NUM_ARGS ( ) ;
if ( argc > 1 | | zend_get_parameters_ex ( argc , & link ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
if ( argc ! = 1 ) {
link_id = php_ii_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
}
ZEND_FETCH_RESOURCE2 ( ii_link , II_LINK * , link , link_id , " Ingres II Link " , le_ii_link , le_ii_plink ) ;
php_ii_fetch ( INTERNAL_FUNCTION_PARAM_PASSTHRU , ii_link , II_NUM ) ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto array ingres_fetch_object([int result_type [, resource link]])
2000-07-17 21:50:35 +00:00
Fetch a row of result into an object result_type can be II_NUM for enumerated object , II_ASSOC for associative object , or II_BOTH ( default ) */
2000-08-26 14:21:26 +00:00
PHP_FUNCTION ( ingres_fetch_object )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
zval * * result_type , * * link ;
int argc ;
int link_id = - 1 ;
II_LINK * ii_link ;
argc = ZEND_NUM_ARGS ( ) ;
if ( argc > 2 | | zend_get_parameters_ex ( argc , & result_type , & link ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
if ( argc ! = 2 ) {
link_id = php_ii_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
}
if ( argc ! = 0 ) {
convert_to_long_ex ( result_type ) ;
}
ZEND_FETCH_RESOURCE2 ( ii_link , II_LINK * , link , link_id , " Ingres II Link " , le_ii_link , le_ii_plink ) ;
php_ii_fetch ( INTERNAL_FUNCTION_PARAM_PASSTHRU , ii_link , ( argc = = 0 ? II_BOTH : Z_LVAL_PP ( result_type ) ) ) ;
if ( Z_TYPE_P ( return_value ) = = IS_ARRAY ) {
convert_to_object ( return_value ) ;
}
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto bool ingres_rollback([resource link])
2000-07-17 21:29:30 +00:00
Roll back a transaction */
2000-08-26 14:21:26 +00:00
PHP_FUNCTION ( ingres_rollback )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
zval * * link ;
int argc ;
int link_id = - 1 ;
II_LINK * ii_link ;
argc = ZEND_NUM_ARGS ( ) ;
if ( argc > 1 | | ( argc & & zend_get_parameters_ex ( argc , & link ) = = FAILURE ) ) {
WRONG_PARAM_COUNT ;
}
if ( argc = = 0 ) {
link_id = IIG ( default_link ) ;
}
ZEND_FETCH_RESOURCE2 ( ii_link , II_LINK * , link , link_id , " Ingres II Link " , le_ii_link , le_ii_plink ) ;
2003-01-19 00:45:53 +00:00
if ( _rollback_transaction ( ii_link TSRMLS_CC ) ) {
2001-08-19 01:47:19 +00:00
RETURN_FALSE ;
}
RETURN_TRUE ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto bool ingres_commit([resource link])
2000-07-17 21:29:30 +00:00
Commit a transaction */
2000-08-26 14:21:26 +00:00
PHP_FUNCTION ( ingres_commit )
2000-07-17 21:29:30 +00:00
{
2001-08-19 01:47:19 +00:00
zval * * link ;
int argc ;
int link_id = - 1 ;
II_LINK * ii_link ;
IIAPI_COMMITPARM commitParm ;
argc = ZEND_NUM_ARGS ( ) ;
if ( argc > 1 | | ( argc & & zend_get_parameters_ex ( argc , & link ) = = FAILURE ) ) {
WRONG_PARAM_COUNT ;
}
if ( argc = = 0 ) {
link_id = IIG ( default_link ) ;
}
ZEND_FETCH_RESOURCE2 ( ii_link , II_LINK * , link , link_id , " Ingres II Link " , le_ii_link , le_ii_plink ) ;
if ( ii_link - > stmtHandle & & _close_statement ( ii_link ) ) {
2003-01-19 00:45:53 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Ingres II: Unable to close statement !! " ) ;
2001-08-19 01:47:19 +00:00
RETURN_FALSE ;
}
commitParm . cm_genParm . gp_callback = NULL ;
commitParm . cm_genParm . gp_closure = NULL ;
commitParm . cm_tranHandle = ii_link - > tranHandle ;
IIapi_commit ( & commitParm ) ;
ii_sync ( & ( commitParm . cm_genParm ) ) ;
if ( ii_success ( & ( commitParm . cm_genParm ) ) = = II_FAIL ) {
RETURN_FALSE ;
}
ii_link - > tranHandle = NULL ;
RETURN_TRUE ;
2000-07-17 21:29:30 +00:00
}
/* }}} */
2000-08-26 14:21:26 +00:00
/* {{{ proto bool ingres_autocommit([resource link])
2000-07-17 23:57:36 +00:00
Switch autocommit on or off */
2000-08-26 14:21:26 +00:00
PHP_FUNCTION ( ingres_autocommit )
2000-07-17 23:57:36 +00:00
{
2001-08-19 01:47:19 +00:00
zval * * link ;
int argc ;
int link_id = - 1 ;
II_LINK * ii_link ;
IIAPI_AUTOPARM autoParm ;
argc = ZEND_NUM_ARGS ( ) ;
if ( argc > 1 | | ( argc & & zend_get_parameters_ex ( argc , & link ) = = FAILURE ) ) {
WRONG_PARAM_COUNT ;
}
if ( argc = = 0 ) {
link_id = IIG ( default_link ) ;
}
ZEND_FETCH_RESOURCE2 ( ii_link , II_LINK * , link , link_id , " Ingres II Link " , le_ii_link , le_ii_plink ) ;
autoParm . ac_genParm . gp_callback = NULL ;
autoParm . ac_genParm . gp_closure = NULL ;
autoParm . ac_connHandle = ii_link - > connHandle ;
autoParm . ac_tranHandle = ii_link - > tranHandle ;
IIapi_autocommit ( & autoParm ) ;
ii_sync ( & ( autoParm . ac_genParm ) ) ;
if ( ii_success ( & ( autoParm . ac_genParm ) ) = = II_FAIL ) {
RETURN_FALSE ;
}
ii_link - > autocommit = ( ii_link - > autocommit ? 0 : 1 ) ;
ii_link - > tranHandle = autoParm . ac_tranHandle ;
RETURN_TRUE ;
2000-07-17 23:57:36 +00:00
}
/* }}} */
2000-07-17 21:29:30 +00:00
# endif /* HAVE_II */
2001-08-19 01:47:19 +00:00
/*
* Local variables :
* tab - width : 4
* c - basic - offset : 4
* End :
2001-09-09 13:29:31 +00:00
* vim600 : sw = 4 ts = 4 fdm = marker
* vim < 600 : sw = 4 ts = 4
2001-08-19 01:47:19 +00:00
*/