2001-03-13 20:58:47 +00:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2004-01-08 08:18:22 +00:00
| PHP Version 5 |
2001-03-13 20:58:47 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2004-01-08 08:18:22 +00:00
| Copyright ( c ) 1997 - 2004 The PHP Group |
2001-03-13 20:58:47 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2003-06-10 20:04:29 +00:00
| This source file is subject to version 3.0 of the PHP license , |
2001-03-13 20:58:47 +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. |
2001-03-13 20:58:47 +00:00
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world - wide - web , please send a note to |
| license @ php . net so we can mail you a copy immediately . |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2003-06-14 03:35:16 +00:00
| Author : Frank M . Kromann < frank @ kromann . info > |
2001-03-13 20:58:47 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*/
/* $Id$ */
/* TODO:
*
* ? Safe mode implementation
*/
2001-03-20 19:21:45 +00:00
/* SB's list:
- API for a more natural FB connect semantic
- Connect & set session
- Autoreconnect when disconnected
- Comments and cleanup
BUGS
- Select db with no arguments
- Query with everything defaulted
*/
2001-05-24 10:07:29 +00:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
2001-03-13 20:58:47 +00:00
# include "php.h"
# include "php_globals.h"
# include "ext/standard/info.h"
# include "ext/standard/php_string.h"
2002-10-24 13:15:49 +00:00
# ifdef PHP_WIN32
2003-02-16 03:48:49 +00:00
# include <winsock2.h>
2001-03-13 20:58:47 +00:00
# else
# include <php_config.h>
# if HAVE_SYS_TYPES_H
# include <sys/types.h>
# endif
# include <netdb.h>
# include <netinet/in.h>
# endif
# include "php_ini.h"
# define HAVE_FBSQL 1
# if HAVE_FBSQL
# include "php_fbsql.h"
# include <signal.h>
2001-10-10 22:24:57 +00:00
static int le_result , le_link , le_plink ;
2001-03-13 20:58:47 +00:00
struct PHPFBResult ;
typedef struct PHPFBResult PHPFBResult ;
struct PHPFBLink ;
typedef struct PHPFBLink PHPFBLink ;
2001-03-20 19:21:45 +00:00
/* The PHPFBLink structure represents a fbsql link. The lion is used for
2001-10-29 21:27:31 +00:00
a connection to a machine , it may be persistent and is reference counted .
2001-03-20 19:21:45 +00:00
The reason for refcounting is mostly to avoid to think , it work independent of
any wierd and unforseen allocation deallocation order .
The PHPFBDatabse structure implements to actual connection to a FrontBase server
2001-10-29 21:27:31 +00:00
ot may be persistent is the link it is connected to is persistent , and refcounted
2001-03-20 19:21:45 +00:00
for the same reasons as above .
The PHPFBResult structure implements a result from the FrontBase server , and does all
required buffereing from of results .
In the PHP code the 3 above a data structures are referenced by means of integers in the
2004-02-09 17:58:04 +00:00
range from 1 to som configurable maximum . You can put a limit to the number of links , databases
and results . The integer identifications is implemented by insertion in the list , which is passed
2001-03-20 19:21:45 +00:00
as an argument to all the functions , please note the list is polymorph .
Database objects and link objects are all reused , base on the host name user name , host name database name
2004-02-09 17:58:04 +00:00
user name . So connecting twice to the same database as the same user will return the same database id .
2001-03-20 19:21:45 +00:00
We use the same coding for that as fbsql does , explioiting the underlying implementation of the lists .
2001-10-29 21:27:31 +00:00
Persistent objects are put in the persistent list as well , but only by name , if you connect to a persistent object
2004-02-09 17:58:04 +00:00
and it is not in the list it is simply added and get a new index , and refcounted . Tricky , tricky . . .
2001-03-20 19:21:45 +00:00
*/
/* Some functions which should be exported from FBCAccess */
2001-03-13 20:58:47 +00:00
2004-02-09 17:58:04 +00:00
void * fbaObjectAtIndex ( ) ;
void fbaRelease ( ) ;
unsigned int fbaCount ( ) ;
2001-03-13 20:58:47 +00:00
2001-07-10 22:34:24 +00:00
struct FBCAutoStartInfo {
2004-02-09 17:58:04 +00:00
FBArray * infoLines ;
2001-07-10 22:34:24 +00:00
} ;
2001-03-13 20:58:47 +00:00
struct PHPFBResult
{
2001-03-20 19:21:45 +00:00
PHPFBLink * link ; /* The link for the result, may be NULL if no link */
char * fetchHandle ; /* The fetch handle, the id used by the server. */
FBCMetaData * metaData ; /* The metadata describing the result */
FBCMetaData * ResultmetaData ; /* The metadata describing the result */
FBCRowHandler * rowHandler ; /* The row handler, the Frontbase structure used for accessing rows in the result */
unsigned int batchSize ; /* The number of row to fetch when expanding the number of rows in the row handler */
2004-02-09 17:58:04 +00:00
unsigned int rowCount ; /* The number of rows in the results set. The number of row is not in */
2001-03-20 19:21:45 +00:00
/* general known when the select is done, one typically needs to fetch all the row
to figure out how many row you got . When the rowCount is unknown the value is
0x7ffffffff */
int columnCount ; /* Number of columns in the row set. */
2002-01-23 17:48:31 +00:00
unsigned int rowIndex ; /* The current row index. */
2001-03-20 19:21:45 +00:00
int columnIndex ; /* The current column index */
void * * row ; /* The last row accessed */
FBArray * array ; /* The link may return a result set, the database list, we implement that by the */
/* FBArray, just a list of strings. */
FBCPList * list ; /* The same special kind result just for property list from extract, schema info. */
unsigned int selectResults ; /* number of results in select */
unsigned int currentResult ; /* current result number */
2001-10-16 23:08:38 +00:00
int lobMode ; /* 0=Fetch data (default); 1=Fetch handle */
2001-03-13 20:58:47 +00:00
} ;
struct PHPFBLink
{
2001-10-29 21:27:31 +00:00
int persistent ; /* persistent ? */
2001-03-20 19:21:45 +00:00
char * hostName ; /* Host name */
char * userName ; /* User name */
char * userPassword ; /* User password */
2001-05-08 22:58:32 +00:00
char * databasePassword ; /* Database password */
2001-05-31 18:43:29 +00:00
char * databaseName ; /* The name of the database */
2001-03-20 19:21:45 +00:00
FBCExecHandler * execHandler ; /* The exechandler, can be used for database operations */
2001-05-31 18:43:29 +00:00
FBCDatabaseConnection * connection ; /* The connection to the database */
unsigned int affectedRows ; /* Number of rows affected by the last SQL statement */
2001-03-20 19:21:45 +00:00
long autoCommit ; /* Enable or disable autoCommit */
2001-05-31 18:43:29 +00:00
unsigned int errorNo ; /* The latest error on the connection, 0 is ok. */
char * errorText ; /* The error text */
unsigned int insert_id ; /* The row index of the latest row inserted into the database */
2001-03-13 20:58:47 +00:00
} ;
# define FBSQL_ASSOC 1<<0
# define FBSQL_NUM 1<<1
# define FBSQL_BOTH (FBSQL_ASSOC|FBSQL_NUM)
2001-09-04 21:51:11 +00:00
# define FBSQL_LOCK_DEFERRED 0
# define FBSQL_LOCK_OPTIMISTIC 1
2002-09-04 03:57:59 +00:00
# define FBSQL_LOCK_PESSIMISTIC 2 /* default */
2001-09-04 21:51:11 +00:00
2001-10-16 23:08:38 +00:00
# define FBSQL_ISO_READ_UNCOMMITTED 0
# define FBSQL_ISO_READ_COMMITTED 1
2001-09-04 21:51:11 +00:00
# define FBSQL_ISO_REPEATABLE_READ 2
2002-09-04 03:57:59 +00:00
# define FBSQL_ISO_SERIALIZABLE 3 /* default */
2001-09-04 21:51:11 +00:00
# define FBSQL_ISO_VERSIONED 4
2002-09-04 03:57:59 +00:00
# define FBSQL_LOB_DIRECT 0 /* default */
2002-10-06 02:10:19 +00:00
# define FBSQL_LOB_HANDLE 1 /* default */
2001-10-16 23:08:38 +00:00
2004-02-27 23:03:07 +00:00
# define DIGEST_BUFFER_SIZE 17 /* fbcDigestPassword() expects a preallocated buffer for 16 bytes plus termination */
2004-02-26 20:31:14 +00:00
int mdOk ( PHPFBLink * link , FBCMetaData * md , char * sql ) ;
char * DigestPassword ( char * user , char * password )
{
char * digest = NULL ;
if ( user & & strlen ( user ) & & password & & strlen ( password ) ) {
char * user_upper = estrdup ( user ) ;
2004-02-27 23:03:07 +00:00
digest = emalloc ( DIGEST_BUFFER_SIZE ) ;
2004-02-26 20:31:14 +00:00
digest [ 0 ] = ' \0 ' ;
( void ) fbcDigestPassword ( php_strtoupper ( user_upper , strlen ( user_upper ) ) , password , digest ) ;
efree ( user_upper ) ;
}
return digest ;
}
2001-09-04 21:51:11 +00:00
2001-06-06 13:06:12 +00:00
/* {{{ fbsql_functions[]
*/
2001-03-13 20:58:47 +00:00
function_entry fbsql_functions [ ] = {
2004-11-22 22:40:21 +00:00
PHP_FE ( fbsql_connect , NULL )
PHP_FE ( fbsql_pconnect , NULL )
PHP_FE ( fbsql_close , NULL )
PHP_FE ( fbsql_select_db , NULL )
PHP_FE ( fbsql_set_characterset , NULL )
PHP_FE ( fbsql_create_db , NULL )
PHP_FE ( fbsql_drop_db , NULL )
PHP_FE ( fbsql_start_db , NULL )
PHP_FE ( fbsql_stop_db , NULL )
PHP_FE ( fbsql_db_status , NULL )
PHP_FE ( fbsql_query , NULL )
PHP_FE ( fbsql_db_query , NULL )
PHP_FE ( fbsql_list_dbs , NULL )
PHP_FE ( fbsql_list_tables , NULL )
PHP_FE ( fbsql_list_fields , NULL )
PHP_FE ( fbsql_error , NULL )
PHP_FE ( fbsql_errno , NULL )
PHP_FE ( fbsql_affected_rows , NULL )
PHP_FE ( fbsql_rows_fetched , NULL )
PHP_FE ( fbsql_insert_id , NULL )
PHP_FE ( fbsql_result , NULL )
PHP_FE ( fbsql_next_result , NULL )
PHP_FE ( fbsql_num_rows , NULL )
PHP_FE ( fbsql_num_fields , NULL )
PHP_FE ( fbsql_fetch_row , NULL )
PHP_FE ( fbsql_fetch_array , NULL )
PHP_FE ( fbsql_fetch_assoc , NULL )
PHP_FE ( fbsql_fetch_object , NULL )
PHP_FE ( fbsql_data_seek , NULL )
PHP_FE ( fbsql_fetch_lengths , NULL )
PHP_FE ( fbsql_fetch_field , NULL )
PHP_FE ( fbsql_field_seek , NULL )
PHP_FE ( fbsql_free_result , NULL )
PHP_FE ( fbsql_field_name , NULL )
PHP_FE ( fbsql_field_table , NULL )
PHP_FE ( fbsql_field_len , NULL )
PHP_FE ( fbsql_field_type , NULL )
PHP_FE ( fbsql_field_flags , NULL )
PHP_FE ( fbsql_table_name , NULL )
2001-03-13 20:58:47 +00:00
2001-03-20 19:21:45 +00:00
/* Fontbase additions: */
2001-09-04 21:51:11 +00:00
PHP_FE ( fbsql_set_transaction , NULL )
2004-11-22 22:40:21 +00:00
PHP_FE ( fbsql_autocommit , NULL )
PHP_FE ( fbsql_commit , NULL )
PHP_FE ( fbsql_rollback , NULL )
PHP_FE ( fbsql_create_blob , NULL )
PHP_FE ( fbsql_create_clob , NULL )
PHP_FE ( fbsql_set_lob_mode , NULL )
PHP_FE ( fbsql_read_blob , NULL )
PHP_FE ( fbsql_read_clob , NULL )
PHP_FE ( fbsql_blob_size , NULL )
PHP_FE ( fbsql_clob_size , NULL )
PHP_FE ( fbsql_hostname , NULL )
PHP_FE ( fbsql_database , NULL )
2001-03-13 20:58:47 +00:00
PHP_FE ( fbsql_database_password , NULL )
2004-11-22 22:40:21 +00:00
PHP_FE ( fbsql_username , NULL )
PHP_FE ( fbsql_password , NULL )
PHP_FE ( fbsql_warnings , NULL )
2004-02-26 20:31:14 +00:00
PHP_FE ( fbsql_set_password , NULL )
2001-03-13 20:58:47 +00:00
2001-07-10 22:34:24 +00:00
PHP_FE ( fbsql_get_autostart_info , NULL )
2002-09-04 03:57:59 +00:00
/* PHP_FE(fbsql_set_autostart_info, NULL) */
2001-07-10 22:34:24 +00:00
2001-03-20 19:21:45 +00:00
/* Aliases: */
2004-11-22 22:40:21 +00:00
PHP_FALIAS ( fbsql , fbsql_db_query , NULL )
PHP_FALIAS ( fbsql_tablename , fbsql_table_name , NULL )
2001-03-13 20:58:47 +00:00
{ NULL , NULL , NULL }
} ;
2001-06-06 13:06:12 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
zend_module_entry fbsql_module_entry = {
2001-10-11 23:33:59 +00:00
STANDARD_MODULE_HEADER ,
" fbsql " ,
fbsql_functions ,
PHP_MINIT ( fbsql ) ,
PHP_MSHUTDOWN ( fbsql ) ,
PHP_RINIT ( fbsql ) ,
PHP_RSHUTDOWN ( fbsql ) ,
PHP_MINFO ( fbsql ) ,
NO_VERSION_YET ,
STANDARD_MODULE_PROPERTIES
2001-03-13 20:58:47 +00:00
} ;
ZEND_DECLARE_MODULE_GLOBALS ( fbsql )
# ifdef COMPILE_DL_FBSQL
ZEND_GET_MODULE ( fbsql )
# endif
2001-10-29 01:51:08 +00:00
# define CHECK_LINK(link) { \
if ( link = = - 1 ) { \
if ( FB_SQL_G ( generateWarnings ) ) \
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " A link to the server could not be established " ) ; \
2001-10-29 01:51:08 +00:00
RETURN_FALSE ; \
} \
}
2001-03-13 20:58:47 +00:00
2004-02-09 17:58:04 +00:00
static void phpfbReleaseResult ( zend_rsrc_list_entry * rsrc TSRMLS_DC ) ;
static void phpfbReleaseLink ( zend_rsrc_list_entry * rsrc TSRMLS_DC ) ;
static void phpfbReleasePLink ( zend_rsrc_list_entry * rsrc TSRMLS_DC ) ;
2001-03-13 20:58:47 +00:00
2001-07-31 05:44:11 +00:00
static void phpfbReleaseResult ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
2001-03-13 20:58:47 +00:00
{
2001-05-09 21:44:44 +00:00
PHPFBResult * result = ( PHPFBResult * ) rsrc - > ptr ;
2001-07-28 11:36:37 +00:00
2001-03-13 20:58:47 +00:00
if ( result )
2001-03-21 19:56:33 +00:00
{
2001-05-31 18:43:29 +00:00
if ( result - > fetchHandle ) {
2001-08-11 16:39:07 +00:00
FBCMetaData * md = fbcdcCancelFetch ( result - > link - > connection , result - > fetchHandle ) ;
2001-05-31 18:43:29 +00:00
fbcmdRelease ( md ) ;
2001-03-21 19:56:33 +00:00
}
2004-02-09 17:58:04 +00:00
if ( result - > rowHandler ) fbcrhRelease ( result - > rowHandler ) ;
if ( result - > list ) fbcplRelease ( result - > list ) ;
if ( result - > array ) fbaRelease ( result - > array ) ;
2004-08-24 17:59:01 +00:00
if ( result - > ResultmetaData ) fbcmdRelease ( result - > ResultmetaData ) ;
2001-05-31 18:43:29 +00:00
efree ( result ) ;
2001-03-21 19:56:33 +00:00
}
2001-03-13 20:58:47 +00:00
}
2001-07-31 05:44:11 +00:00
static void phpfbReleaseLink ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
2001-03-13 20:58:47 +00:00
{
2001-05-09 21:44:44 +00:00
PHPFBLink * link = ( PHPFBLink * ) rsrc - > ptr ;
2001-07-28 11:36:37 +00:00
2001-03-21 19:56:33 +00:00
if ( link )
{
2001-06-01 23:51:48 +00:00
if ( link - > hostName ) free ( link - > hostName ) ;
if ( link - > userName ) free ( link - > userName ) ;
if ( link - > userPassword ) free ( link - > userPassword ) ;
if ( link - > databasePassword ) free ( link - > databasePassword ) ;
if ( link - > databaseName ) free ( link - > databaseName ) ;
if ( link - > errorText ) free ( link - > errorText ) ;
2001-05-31 18:43:29 +00:00
if ( link - > connection ) {
fbcdcClose ( link - > connection ) ;
fbcdcRelease ( link - > connection ) ;
2001-05-08 22:58:32 +00:00
}
2001-06-20 22:54:51 +00:00
if ( link - > execHandler ) fbcehRelease ( link - > execHandler ) ;
2001-05-31 18:43:29 +00:00
efree ( link ) ;
FB_SQL_G ( linkCount ) - - ;
2001-05-08 22:58:32 +00:00
}
}
2001-07-31 05:44:11 +00:00
static void phpfbReleasePLink ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
2001-05-08 22:58:32 +00:00
{
2001-05-09 21:44:44 +00:00
PHPFBLink * link = ( PHPFBLink * ) rsrc - > ptr ;
2001-07-28 11:36:37 +00:00
2001-05-08 22:58:32 +00:00
if ( link )
{
2001-06-01 23:51:48 +00:00
if ( link - > hostName ) free ( link - > hostName ) ;
if ( link - > userName ) free ( link - > userName ) ;
if ( link - > userPassword ) free ( link - > userPassword ) ;
if ( link - > databasePassword ) free ( link - > databasePassword ) ;
if ( link - > databaseName ) free ( link - > databaseName ) ;
if ( link - > errorText ) free ( link - > errorText ) ;
2001-06-01 22:27:00 +00:00
if ( link - > connection ) {
fbcdcClose ( link - > connection ) ;
fbcdcRelease ( link - > connection ) ;
2001-03-21 19:56:33 +00:00
}
2001-06-20 22:54:51 +00:00
if ( link - > execHandler ) fbcehRelease ( link - > execHandler ) ;
2001-06-01 23:51:48 +00:00
free ( link ) ;
2001-05-31 18:43:29 +00:00
FB_SQL_G ( linkCount ) - - ;
2001-10-29 21:27:31 +00:00
FB_SQL_G ( persistentCount ) - - ;
2001-05-31 18:43:29 +00:00
}
}
2001-07-30 08:24:42 +00:00
static void php_fbsql_set_default_link ( int id TSRMLS_DC )
2001-05-31 18:43:29 +00:00
{
if ( FB_SQL_G ( linkIndex ) ! = - 1 ) {
zend_list_delete ( FB_SQL_G ( linkIndex ) ) ;
}
FB_SQL_G ( linkIndex ) = id ;
zend_list_addref ( id ) ;
}
2001-07-30 17:27:08 +00:00
static int php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAMETERS )
2001-05-31 18:43:29 +00:00
{
if ( FB_SQL_G ( linkIndex ) = = - 1 ) { /* no link opened yet, implicitly open one */
ht = 0 ;
2001-08-11 16:39:07 +00:00
php_fbsql_do_connect ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 ) ;
2001-03-21 19:56:33 +00:00
}
2001-05-31 18:43:29 +00:00
return FB_SQL_G ( linkIndex ) ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
2004-08-24 17:59:01 +00:00
static void phpfbQuery ( INTERNAL_FUNCTION_PARAMETERS , char * sql , PHPFBLink * link , long batch_size ) ;
2001-03-13 20:58:47 +00:00
2001-06-06 13:06:12 +00:00
/* {{{ PHP_INI
*/
2001-03-13 20:58:47 +00:00
PHP_INI_BEGIN ( )
2003-07-03 16:53:04 +00:00
STD_PHP_INI_BOOLEAN ( " fbsql.allow_persistent " , " 1 " , PHP_INI_SYSTEM , OnUpdateBool , allowPersistent , zend_fbsql_globals , fbsql_globals )
STD_PHP_INI_BOOLEAN ( " fbsql.generate_warnings " , " 0 " , PHP_INI_SYSTEM , OnUpdateBool , generateWarnings , zend_fbsql_globals , fbsql_globals )
STD_PHP_INI_BOOLEAN ( " fbsql.autocommit " , " 1 " , PHP_INI_SYSTEM , OnUpdateBool , autoCommit , zend_fbsql_globals , fbsql_globals )
STD_PHP_INI_ENTRY_EX ( " fbsql.max_persistent " , " -1 " , PHP_INI_SYSTEM , OnUpdateLong , maxPersistent , zend_fbsql_globals , fbsql_globals , display_link_numbers )
STD_PHP_INI_ENTRY_EX ( " fbsql.max_links " , " 128 " , PHP_INI_SYSTEM , OnUpdateLong , maxLinks , zend_fbsql_globals , fbsql_globals , display_link_numbers )
STD_PHP_INI_ENTRY_EX ( " fbsql.max_connections " , " 128 " , PHP_INI_SYSTEM , OnUpdateLong , maxConnections , zend_fbsql_globals , fbsql_globals , display_link_numbers )
STD_PHP_INI_ENTRY_EX ( " fbsql.max_results " , " 128 " , PHP_INI_SYSTEM , OnUpdateLong , maxResults , zend_fbsql_globals , fbsql_globals , display_link_numbers )
2004-11-22 22:40:21 +00:00
STD_PHP_INI_ENTRY_EX ( " fbsql.batchsize " , " 1000 " , PHP_INI_ALL , OnUpdateLong , batchSize , zend_fbsql_globals , fbsql_globals , display_link_numbers )
2001-03-21 19:56:33 +00:00
STD_PHP_INI_ENTRY ( " fbsql.default_host " , NULL , PHP_INI_SYSTEM , OnUpdateString , hostName , zend_fbsql_globals , fbsql_globals )
STD_PHP_INI_ENTRY ( " fbsql.default_user " , " _SYSTEM " , PHP_INI_SYSTEM , OnUpdateString , userName , zend_fbsql_globals , fbsql_globals )
STD_PHP_INI_ENTRY ( " fbsql.default_password " , " " , PHP_INI_SYSTEM , OnUpdateString , userPassword , zend_fbsql_globals , fbsql_globals )
STD_PHP_INI_ENTRY ( " fbsql.default_database " , " " , PHP_INI_SYSTEM , OnUpdateString , databaseName , zend_fbsql_globals , fbsql_globals )
STD_PHP_INI_ENTRY ( " fbsql.default_database_password " , " " , PHP_INI_SYSTEM , OnUpdateString , databasePassword , zend_fbsql_globals , fbsql_globals )
2001-03-13 20:58:47 +00:00
PHP_INI_END ( )
2001-06-06 13:06:12 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
static void php_fbsql_init_globals ( zend_fbsql_globals * fbsql_globals )
{
2001-10-29 21:27:31 +00:00
fbsql_globals - > persistentCount = 0 ;
2001-03-13 20:58:47 +00:00
if ( fbsql_globals - > hostName = = NULL )
{
char name [ 256 ] ;
2001-08-11 16:39:07 +00:00
gethostname ( name , sizeof ( name ) ) ;
2001-03-13 20:58:47 +00:00
name [ sizeof ( name ) - 1 ] = 0 ;
2001-10-08 22:24:59 +00:00
fbsql_globals - > hostName = strdup ( name ) ;
2001-03-13 20:58:47 +00:00
}
2001-10-29 21:27:31 +00:00
fbsql_globals - > persistentCount = 0 ;
2001-03-13 20:58:47 +00:00
fbsql_globals - > linkCount = 0 ;
}
2004-02-09 17:58:04 +00:00
2001-03-13 20:58:47 +00:00
PHP_MINIT_FUNCTION ( fbsql )
{
ZEND_INIT_MODULE_GLOBALS ( fbsql , php_fbsql_init_globals , NULL ) ;
REGISTER_INI_ENTRIES ( ) ;
fbcInitialize ( ) ;
2004-02-09 17:58:04 +00:00
fbcehSetMultiThreaded ( True ) ;
2001-10-10 00:42:00 +00:00
le_result = zend_register_list_destructors_ex ( phpfbReleaseResult , NULL , " fbsql result " , module_number ) ;
le_link = zend_register_list_destructors_ex ( phpfbReleaseLink , NULL , " fbsql link " , module_number ) ;
le_plink = zend_register_list_destructors_ex ( NULL , phpfbReleasePLink , " fbsql plink " , module_number ) ;
2001-09-25 21:58:48 +00:00
Z_TYPE ( fbsql_module_entry ) = type ;
2001-03-13 20:58:47 +00:00
REGISTER_LONG_CONSTANT ( " FBSQL_ASSOC " , FBSQL_ASSOC , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " FBSQL_NUM " , FBSQL_NUM , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " FBSQL_BOTH " , FBSQL_BOTH , CONST_CS | CONST_PERSISTENT ) ;
2001-09-04 21:51:11 +00:00
/* Register Transaction constants */
REGISTER_LONG_CONSTANT ( " FBSQL_LOCK_DEFERRED " , FBSQL_LOCK_DEFERRED , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " FBSQL_LOCK_OPTIMISTIC " , FBSQL_LOCK_OPTIMISTIC , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " FBSQL_LOCK_PESSIMISTIC " , FBSQL_LOCK_PESSIMISTIC , CONST_CS | CONST_PERSISTENT ) ;
2001-10-16 23:08:38 +00:00
REGISTER_LONG_CONSTANT ( " FBSQL_ISO_READ_UNCOMMITTED " , FBSQL_ISO_READ_UNCOMMITTED , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " FBSQL_ISO_READ_COMMITTED " , FBSQL_ISO_READ_COMMITTED , CONST_CS | CONST_PERSISTENT ) ;
2001-09-04 21:51:11 +00:00
REGISTER_LONG_CONSTANT ( " FBSQL_ISO_REPEATABLE_READ " , FBSQL_ISO_REPEATABLE_READ , CONST_CS | CONST_PERSISTENT ) ;
2001-10-26 18:42:46 +00:00
REGISTER_LONG_CONSTANT ( " FBSQL_ISO_SERIALIZABLE " , FBSQL_ISO_SERIALIZABLE , CONST_CS | CONST_PERSISTENT ) ;
2001-09-04 21:51:11 +00:00
REGISTER_LONG_CONSTANT ( " FBSQL_ISO_VERSIONED " , FBSQL_ISO_VERSIONED , CONST_CS | CONST_PERSISTENT ) ;
2004-11-22 22:40:21 +00:00
REGISTER_LONG_CONSTANT ( " FBSQL_UTF8 " , 0 , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " FBSQL_ISO8859_1 " , FBC_ISO8859_1 , CONST_CS | CONST_PERSISTENT ) ;
2001-10-08 16:42:19 +00:00
/* Register Status constants */
REGISTER_LONG_CONSTANT ( " FBSQL_UNKNOWN " , FBUnknownStatus , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " FBSQL_STOPPED " , FBStopped , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " FBSQL_STARTING " , FBStarting , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " FBSQL_RUNNING " , FBRunning , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " FBSQL_STOPPING " , FBStopping , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " FBSQL_NOEXEC " , FBNoExec , CONST_CS | CONST_PERSISTENT ) ;
2001-10-16 23:08:38 +00:00
REGISTER_LONG_CONSTANT ( " FBSQL_LOB_DIRECT " , FBSQL_LOB_DIRECT , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " FBSQL_LOB_HANDLE " , FBSQL_LOB_HANDLE , CONST_CS | CONST_PERSISTENT ) ;
2001-03-13 20:58:47 +00:00
return SUCCESS ;
}
PHP_MSHUTDOWN_FUNCTION ( fbsql )
{
2001-03-21 19:56:33 +00:00
UNREGISTER_INI_ENTRIES ( ) ;
return SUCCESS ;
2001-03-13 20:58:47 +00:00
}
PHP_RINIT_FUNCTION ( fbsql )
{
2001-05-31 18:43:29 +00:00
FB_SQL_G ( linkIndex ) = - 1 ;
2001-10-29 21:27:31 +00:00
FB_SQL_G ( linkCount ) = FB_SQL_G ( persistentCount ) ;
2001-05-31 18:43:29 +00:00
return SUCCESS ;
2001-03-13 20:58:47 +00:00
}
2001-04-04 20:10:14 +00:00
PHP_RSHUTDOWN_FUNCTION ( fbsql )
{
2001-05-31 18:43:29 +00:00
return SUCCESS ;
2001-04-04 20:10:14 +00:00
}
2001-03-13 20:58:47 +00:00
PHP_MINFO_FUNCTION ( fbsql )
{
char buf [ 32 ] ;
2001-07-28 11:36:37 +00:00
2001-03-13 20:58:47 +00:00
php_info_print_table_start ( ) ;
php_info_print_table_header ( 2 , " FrontBase support " , " enabled " ) ;
2001-06-01 22:27:00 +00:00
php_info_print_table_row ( 2 , " Client API version " , " 2.24 " ) ;
2001-03-13 20:58:47 +00:00
if ( FB_SQL_G ( allowPersistent ) )
{
2004-12-23 19:29:12 +00:00
snprintf ( buf , sizeof ( buf ) , " %ld " , FB_SQL_G ( persistentCount ) ) ;
2001-10-29 21:27:31 +00:00
php_info_print_table_row ( 2 , " Active Persistent Links " , buf ) ;
2001-03-13 20:58:47 +00:00
}
2004-12-23 19:29:12 +00:00
snprintf ( buf , sizeof ( buf ) , " %ld " , FB_SQL_G ( linkCount ) ) ;
2001-03-13 20:58:47 +00:00
php_info_print_table_row ( 2 , " Active Links " , buf ) ;
2001-06-01 22:27:00 +00:00
/*
sprintf ( buf , " %ld " , FB_SQL_G ( resultCount ) ) ;
2001-10-29 21:40:48 +00:00
php_info_print_table_row ( 2 , " Active Results " , buf ) ;
2001-06-01 22:27:00 +00:00
*/
2001-03-13 20:58:47 +00:00
php_info_print_table_end ( ) ;
DISPLAY_INI_ENTRIES ( ) ;
}
2001-10-29 21:27:31 +00:00
static void php_fbsql_do_connect ( INTERNAL_FUNCTION_PARAMETERS , int persistent )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink ;
2001-03-13 20:58:47 +00:00
list_entry * lep ;
2001-05-31 18:43:29 +00:00
char name [ 1024 ] ;
char * hostName = NULL , * userName = NULL , * userPassword = NULL ;
int argc = ZEND_NUM_ARGS ( ) , create_new = 0 ;
zval * * argv [ 3 ] ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
if ( ( argc < 0 ) | | ( argc > 3 ) ) WRONG_PARAM_COUNT ;
2001-08-11 16:39:07 +00:00
if ( zend_get_parameters_ex ( argc , & argv [ 0 ] , & argv [ 1 ] , & argv [ 2 ] ) = = FAILURE ) RETURN_FALSE ;
2001-05-31 18:43:29 +00:00
if ( argc > = 1 )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( argv [ 0 ] ) ;
2001-09-25 22:49:04 +00:00
hostName = Z_STRVAL_PP ( argv [ 0 ] ) ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
if ( argc > = 2 )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( argv [ 1 ] ) ;
2004-02-09 17:58:04 +00:00
userName = Z_STRVAL_PP ( argv [ 1 ] ) ;
}
2001-05-31 18:43:29 +00:00
if ( argc = = 3 )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( argv [ 2 ] ) ;
2004-02-09 17:58:04 +00:00
userPassword = Z_STRVAL_PP ( argv [ 2 ] ) ;
2001-05-31 18:43:29 +00:00
}
if ( hostName = = NULL ) hostName = FB_SQL_G ( hostName ) ;
if ( userName = = NULL ) userName = FB_SQL_G ( userName ) ;
if ( userPassword = = NULL ) userPassword = FB_SQL_G ( userPassword ) ;
2004-12-23 19:29:12 +00:00
if ( snprintf ( name , sizeof ( name ) , " fbsql_%s_%s_%s " , hostName , userName , userPassword ) < 0 ) {
RETURN_FALSE ;
}
2001-05-31 18:43:29 +00:00
2001-06-01 22:27:00 +00:00
if ( ! FB_SQL_G ( allowPersistent ) ) {
2001-10-29 21:27:31 +00:00
persistent = 0 ;
2001-06-01 22:27:00 +00:00
}
2001-10-29 21:27:31 +00:00
if ( persistent ) {
2001-05-31 18:43:29 +00:00
if ( zend_hash_find ( & EG ( persistent_list ) , name , strlen ( name ) + 1 , ( void * * ) & lep ) = = SUCCESS )
{
phpLink = ( PHPFBLink * ) lep - > ptr ;
}
else {
list_entry le ;
if ( ( FB_SQL_G ( maxLinks ) ! = - 1 & & FB_SQL_G ( linkCount ) = = FB_SQL_G ( maxLinks ) ) )
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " FrontBase link limit %d exceeded " , FB_SQL_G ( maxLinks ) ) ;
2001-05-31 18:43:29 +00:00
RETURN_FALSE ;
}
2001-10-29 21:27:31 +00:00
if ( ( FB_SQL_G ( maxPersistent ) ! = - 1 & & FB_SQL_G ( persistentCount ) = = FB_SQL_G ( maxPersistent ) ) )
2001-06-01 22:27:00 +00:00
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " FrontBase persistent link limit %d exceeded " , FB_SQL_G ( maxPersistent ) ) ;
2001-06-01 22:27:00 +00:00
RETURN_FALSE ;
}
2001-06-01 23:51:48 +00:00
phpLink = malloc ( sizeof ( PHPFBLink ) ) ;
2001-10-29 21:27:31 +00:00
phpLink - > persistent = persistent ;
2001-06-01 23:51:48 +00:00
phpLink - > hostName = strdup ( hostName ) ;
phpLink - > userName = strdup ( userName ) ;
phpLink - > userPassword = strdup ( userPassword ) ;
phpLink - > databasePassword = strdup ( FB_SQL_G ( databasePassword ) ) ;
2001-05-31 18:43:29 +00:00
phpLink - > databaseName = NULL ;
2004-02-09 17:58:04 +00:00
phpLink - > execHandler = NULL ;
2001-05-31 18:43:29 +00:00
phpLink - > affectedRows = 0 ;
phpLink - > autoCommit = FB_SQL_G ( autoCommit ) ;
phpLink - > errorNo = 0 ;
phpLink - > errorText = NULL ;
phpLink - > connection = NULL ;
2004-02-09 17:58:04 +00:00
le . ptr = phpLink ;
2001-09-25 21:58:48 +00:00
Z_TYPE ( le ) = le_plink ;
2001-05-31 18:43:29 +00:00
if ( zend_hash_update ( & EG ( persistent_list ) , name , strlen ( name ) + 1 , & le , sizeof ( le ) , NULL ) = = FAILURE )
{
2001-06-01 23:51:48 +00:00
free ( phpLink - > hostName ) ;
free ( phpLink - > userName ) ;
free ( phpLink - > userPassword ) ;
free ( phpLink - > databasePassword ) ;
free ( phpLink ) ;
2001-05-31 18:43:29 +00:00
RETURN_FALSE ;
}
FB_SQL_G ( linkCount ) + + ;
2001-10-29 21:27:31 +00:00
FB_SQL_G ( persistentCount ) + + ;
2001-05-31 18:43:29 +00:00
}
ZEND_REGISTER_RESOURCE ( return_value , phpLink , le_plink ) ;
2001-03-13 20:58:47 +00:00
}
else
{
list_entry le ;
2001-06-01 22:27:00 +00:00
if ( ( FB_SQL_G ( maxLinks ) ! = - 1 & & FB_SQL_G ( linkCount ) = = FB_SQL_G ( maxLinks ) ) )
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " FrontBase link limit %d exceeded " , FB_SQL_G ( maxLinks ) ) ;
2001-06-01 22:27:00 +00:00
RETURN_FALSE ;
}
2001-06-01 23:51:48 +00:00
if ( zend_hash_find ( & EG ( regular_list ) , name , strlen ( name ) + 1 , ( void * * ) & lep ) = = SUCCESS )
2001-05-31 18:43:29 +00:00
{
int type , link ;
void * ptr ;
link = ( int ) lep - > ptr ;
2001-08-11 16:39:07 +00:00
ptr = zend_list_find ( link , & type ) ; /* check if the link is still there */
2001-05-31 18:43:29 +00:00
if ( ptr & & ( type = = le_link | | type = = le_plink ) ) {
zend_list_addref ( link ) ;
2001-09-25 21:58:48 +00:00
Z_LVAL_P ( return_value ) = link ;
2001-07-30 08:24:42 +00:00
php_fbsql_set_default_link ( link TSRMLS_CC ) ;
2001-09-25 21:58:48 +00:00
Z_TYPE_P ( return_value ) = IS_RESOURCE ;
2001-05-31 18:43:29 +00:00
return ;
} else {
zend_hash_del ( & EG ( regular_list ) , name , strlen ( name ) + 1 ) ;
}
phpLink = ( PHPFBLink * ) lep - > ptr ;
}
phpLink = emalloc ( sizeof ( PHPFBLink ) ) ;
2001-10-29 21:27:31 +00:00
phpLink - > persistent = persistent ;
2001-06-12 00:39:05 +00:00
phpLink - > hostName = strdup ( hostName ) ;
phpLink - > userName = strdup ( userName ) ;
phpLink - > userPassword = strdup ( userPassword ) ;
phpLink - > databasePassword = strdup ( FB_SQL_G ( databasePassword ) ) ;
2001-05-31 18:43:29 +00:00
phpLink - > databaseName = NULL ;
2004-02-09 17:58:04 +00:00
phpLink - > execHandler = NULL ;
2001-05-31 18:43:29 +00:00
phpLink - > affectedRows = 0 ;
phpLink - > autoCommit = FB_SQL_G ( autoCommit ) ;
phpLink - > errorNo = 0 ;
phpLink - > errorText = NULL ;
phpLink - > connection = NULL ;
ZEND_REGISTER_RESOURCE ( return_value , phpLink , le_link ) ;
2004-02-09 17:58:04 +00:00
le . ptr = ( void * ) Z_LVAL_P ( return_value ) ;
2001-09-25 21:58:48 +00:00
Z_TYPE ( le ) = le_index_ptr ;
2001-06-01 22:27:00 +00:00
if ( zend_hash_update ( & EG ( regular_list ) , name , strlen ( name ) + 1 , & le , sizeof ( le ) , NULL ) = = FAILURE )
2001-03-13 20:58:47 +00:00
{
2001-06-01 23:51:48 +00:00
free ( phpLink - > hostName ) ;
free ( phpLink - > userName ) ;
free ( phpLink - > userPassword ) ;
free ( phpLink - > databasePassword ) ;
2001-05-31 18:43:29 +00:00
efree ( phpLink ) ;
RETURN_FALSE ;
}
2001-03-13 20:58:47 +00:00
FB_SQL_G ( linkCount ) + + ;
}
2001-09-25 21:58:48 +00:00
php_fbsql_set_default_link ( Z_LVAL_P ( return_value ) TSRMLS_CC ) ;
2001-03-13 20:58:47 +00:00
}
2002-01-23 17:48:31 +00:00
int phpfbFetchRow ( PHPFBResult * result , unsigned int row )
2001-03-13 20:58:47 +00:00
{
if ( result - > rowHandler = = NULL )
{
2001-05-31 18:43:29 +00:00
void * rawData = fbcdcFetch ( result - > link - > connection , result - > batchSize , result - > fetchHandle ) ;
2004-08-24 17:59:01 +00:00
if ( rawData = = NULL ) {
2001-03-13 20:58:47 +00:00
result - > rowCount = 0 ;
2004-08-24 17:59:01 +00:00
}
2001-03-13 20:58:47 +00:00
else
result - > rowHandler = fbcrhInitWith ( rawData , result - > metaData ) ;
}
for ( ; ; )
{
void * rawData ;
2001-11-14 20:42:38 +00:00
if ( row > = result - > rowCount & & result - > rowCount ! = 0x7fffffff ) return 0 ;
2001-03-13 20:58:47 +00:00
if ( fbcrhRowCount ( result - > rowHandler ) > ( unsigned int ) row ) return 1 ;
2001-05-31 18:43:29 +00:00
rawData = fbcdcFetch ( result - > link - > connection , result - > batchSize , result - > fetchHandle ) ;
2001-08-11 16:39:07 +00:00
if ( ! fbcrhAddBatch ( result - > rowHandler , rawData ) ) result - > rowCount = fbcrhRowCount ( result - > rowHandler ) ;
2001-03-13 20:58:47 +00:00
}
}
2001-12-30 08:12:29 +00:00
/* {{{ proto resource fbsql_connect([string hostname [, string username [, string password]]])
2002-01-10 21:56:18 +00:00
Create a connection to a database server */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_connect )
{
2001-08-11 16:39:07 +00:00
php_fbsql_do_connect ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-12-30 08:12:29 +00:00
/* {{{ proto resource fbsql_pconnect([string hostname [, string username [, string password]]])
2002-01-10 21:56:18 +00:00
Create a persistant connection to a database server */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_pconnect )
{
2001-08-11 16:39:07 +00:00
php_fbsql_do_connect ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2003-06-15 15:29:46 +00:00
/* {{{ proto bool fbsql_close([resource link_identifier])
2002-01-10 21:56:18 +00:00
Close a connection to a database server */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_close )
{
PHPFBLink * phpLink = NULL ;
2001-05-31 18:43:29 +00:00
zval * * fbsql_link_index = NULL ;
2002-09-04 04:24:54 +00:00
int id , i , nument , type ;
void * ptr ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 0 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
break ;
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2002-09-04 04:24:54 +00:00
nument = zend_hash_next_free_element ( & EG ( regular_list ) ) ;
for ( i = 1 ; i < nument ; i + + ) {
ptr = zend_list_find ( i , & type ) ;
if ( ptr & & ( type = = le_result ) ) {
PHPFBResult * result ;
result = ( PHPFBResult * ) ptr ;
if ( result - > link = = phpLink ) {
zend_list_delete ( i ) ;
}
}
}
2001-05-31 18:43:29 +00:00
if ( id = = - 1 ) { /* explicit resource number */
zend_list_delete ( Z_RESVAL_PP ( fbsql_link_index ) ) ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
if ( id ! = - 1
| | ( fbsql_link_index & & Z_RESVAL_PP ( fbsql_link_index ) = = FB_SQL_G ( linkIndex ) ) ) {
zend_list_delete ( FB_SQL_G ( linkIndex ) ) ;
FB_SQL_G ( linkIndex ) = - 1 ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
2001-03-13 20:58:47 +00:00
RETURN_TRUE ;
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-07-30 08:24:42 +00:00
static int php_fbsql_select_db ( char * databaseName , PHPFBLink * link TSRMLS_DC )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
unsigned port ;
FBCDatabaseConnection * c ;
2004-02-09 17:58:04 +00:00
FBCMetaData * md ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
if ( ! link - > databaseName | | strcmp ( link - > databaseName , databaseName ) )
2001-03-13 20:58:47 +00:00
{
2001-04-16 16:27:11 +00:00
port = atoi ( databaseName ) ;
if ( port > 0 & & port < 65535 )
2001-05-08 22:58:32 +00:00
c = fbcdcConnectToDatabaseUsingPort ( link - > hostName , port , link - > databasePassword ) ;
2001-04-16 16:27:11 +00:00
else
2001-05-08 22:58:32 +00:00
c = fbcdcConnectToDatabase ( databaseName , link - > hostName , link - > databasePassword ) ;
2001-03-13 20:58:47 +00:00
if ( c = = NULL )
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2003-03-06 20:31:20 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " %s " , fbcdcClassErrorMessage ( ) ) ;
2001-05-31 18:43:29 +00:00
return 0 ;
2001-03-13 20:58:47 +00:00
}
2001-08-11 16:39:07 +00:00
md = fbcdcCreateSession ( c , " PHP " , link - > userName , link - > userPassword , link - > userName ) ;
2001-03-13 20:58:47 +00:00
if ( fbcmdErrorsFound ( md ) )
{
2001-08-11 16:39:07 +00:00
FBCErrorMetaData * emd = fbcdcErrorMetaData ( c , md ) ;
2001-03-13 20:58:47 +00:00
char * emg = fbcemdAllErrorMessages ( emd ) ;
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
{
if ( emg )
2003-03-06 20:31:20 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " %s " , emg ) ;
2001-10-29 01:51:08 +00:00
else
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " No message " ) ;
2001-10-29 01:51:08 +00:00
}
link - > errorText = strdup ( emg ) ;
2004-08-24 17:59:01 +00:00
link - > errorNo = fbcemdErrorCodeAtIndex ( emd , 0 ) ;
2001-06-01 23:51:48 +00:00
free ( emg ) ;
2001-03-13 20:58:47 +00:00
fbcemdRelease ( emd ) ;
fbcmdRelease ( md ) ;
fbcdcClose ( c ) ;
fbcdcRelease ( c ) ;
2001-05-31 18:43:29 +00:00
return 0 ;
2001-03-13 20:58:47 +00:00
}
fbcmdRelease ( md ) ;
if ( c )
{
if ( link - > autoCommit )
2001-08-11 16:39:07 +00:00
md = fbcdcExecuteDirectSQL ( c , " SET COMMIT TRUE; " ) ;
2001-03-13 20:58:47 +00:00
else
2001-08-11 16:39:07 +00:00
md = fbcdcExecuteDirectSQL ( c , " SET COMMIT FALSE; " ) ;
2001-03-13 20:58:47 +00:00
fbcmdRelease ( md ) ;
}
2001-08-11 16:39:07 +00:00
fbcdcSetOutputCharacterSet ( c , FBC_ISO8859_1 ) ;
fbcdcSetInputCharacterSet ( c , FBC_ISO8859_1 ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
if ( link - > connection )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
fbcdcClose ( link - > connection ) ;
fbcdcRelease ( link - > connection ) ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
link - > connection = c ;
2001-06-01 23:51:48 +00:00
if ( link - > databaseName ) free ( link - > databaseName ) ;
link - > databaseName = strdup ( databaseName ) ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
return 1 ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
void phpfbestrdup ( const char * s , int * length , char * * value )
2001-03-13 20:58:47 +00:00
{
2004-02-09 17:58:04 +00:00
int l = s ? strlen ( s ) : 0 ;
2001-03-13 20:58:47 +00:00
if ( value )
{
char * r = emalloc ( l + 1 ) ;
if ( s )
2001-08-11 16:39:07 +00:00
strcpy ( r , s ) ;
2001-03-13 20:58:47 +00:00
else
r [ 0 ] = 0 ;
2004-02-09 17:58:04 +00:00
* value = r ;
2001-03-13 20:58:47 +00:00
}
* length = l ;
}
2001-09-04 21:51:11 +00:00
2001-12-30 08:12:29 +00:00
/* {{{ proto void fbsql_set_transaction(resource link_identifier, int locking, int isolation)
Sets the transaction locking and isolation */
2001-09-04 21:51:11 +00:00
PHP_FUNCTION ( fbsql_set_transaction )
{
PHPFBLink * phpLink = NULL ;
FBCMetaData * md ;
zval * * fbsql_link_index = NULL , * * Locking = NULL , * * Isolation = NULL ;
char strSQL [ 1024 ] ;
char * strLocking [ ] = { " DEFERRED " , " OPTIMISTIC " , " PESSIMISTIC " } ;
2001-10-16 23:08:38 +00:00
char * strIsolation [ ] = { " READ UNCOMMITTED " , " READ NCOMMITTED " , " REPEATABLE READ " , " SERIALIZABLE " , " VERSIONED " } ;
2001-09-04 21:51:11 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 3 :
if ( zend_get_parameters_ex ( 3 , & fbsql_link_index , & Locking , & Isolation ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
2004-12-23 19:29:12 +00:00
if ( Z_LVAL_PP ( Locking ) < 0 | | Z_LVAL_PP ( Locking ) > 2 ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Invalid locking type. " ) ;
RETURN_FALSE ;
}
2004-12-29 20:18:34 +00:00
if ( Z_LVAL_PP ( Isolation ) < 0 | | Z_LVAL_PP ( Isolation ) > 4 ) {
2004-12-23 19:29:12 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Invalid isolation type. " ) ;
RETURN_FALSE ;
}
2001-09-04 21:51:11 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , - 1 , " FrontBase-Link " , le_link , le_plink ) ;
2004-12-23 19:29:12 +00:00
if ( snprintf ( strSQL , sizeof ( strSQL ) , " SET TRANSACTION LOCKING %s, ISOLATION %s; " , strLocking [ Z_LVAL_PP ( Locking ) ] , strIsolation [ Z_LVAL_PP ( Isolation ) ] ) < 0 ) {
RETURN_FALSE ;
}
2001-09-04 21:51:11 +00:00
md = fbcdcExecuteDirectSQL ( phpLink - > connection , strSQL ) ;
fbcmdRelease ( md ) ;
}
2001-06-06 13:06:12 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-06-12 00:39:05 +00:00
/* {{{ proto bool fbsql_autocommit(resource link_identifier [, bool OnOff])
2001-12-30 08:12:29 +00:00
Turns on auto - commit */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_autocommit )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
2001-03-13 20:58:47 +00:00
FBCMetaData * md ;
2001-05-31 18:43:29 +00:00
zval * * fbsql_link_index = NULL , * * onoff = NULL ;
2001-03-13 20:58:47 +00:00
zend_bool OnOff ;
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_link_index , & onoff ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , - 1 , " FrontBase-Link " , le_link , le_plink ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
if ( onoff )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_boolean_ex ( onoff ) ;
OnOff = Z_BVAL_PP ( onoff ) ;
2001-05-01 22:04:11 +00:00
phpLink - > autoCommit = OnOff ;
2001-03-13 20:58:47 +00:00
if ( OnOff )
2001-05-31 18:43:29 +00:00
md = fbcdcExecuteDirectSQL ( phpLink - > connection , " SET COMMIT TRUE; " ) ;
2001-03-13 20:58:47 +00:00
else
2001-05-31 18:43:29 +00:00
md = fbcdcExecuteDirectSQL ( phpLink - > connection , " SET COMMIT FALSE; " ) ;
2001-03-13 20:58:47 +00:00
fbcmdRelease ( md ) ;
}
2001-05-01 22:04:11 +00:00
RETURN_BOOL ( phpLink - > autoCommit ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-10-08 16:42:19 +00:00
/* {{{ proto bool fbsql_commit([resource link_identifier])
2002-01-10 21:56:18 +00:00
Commit the transaction */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_commit )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
2001-03-13 20:58:47 +00:00
FBCMetaData * md ;
2001-05-31 18:43:29 +00:00
zval * * fbsql_link_index = NULL ;
int id ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 0 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
break ;
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
md = fbcdcCommit ( phpLink - > connection ) ;
2001-03-13 20:58:47 +00:00
if ( md ) {
fbcmdRelease ( md ) ;
RETURN_TRUE ;
}
else
RETURN_FALSE ;
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2003-06-15 15:29:46 +00:00
/* {{{ proto bool fbsql_rollback([resource link_identifier])
2002-01-10 21:56:18 +00:00
Rollback all statments since last commit */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_rollback )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
2001-03-13 20:58:47 +00:00
FBCMetaData * md ;
2001-05-31 18:43:29 +00:00
zval * * fbsql_link_index = NULL ;
int id ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 0 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
break ;
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
md = fbcdcRollback ( phpLink - > connection ) ;
2001-03-13 20:58:47 +00:00
if ( md ) {
fbcmdRelease ( md ) ;
RETURN_TRUE ;
}
else
RETURN_FALSE ;
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-10-10 00:42:00 +00:00
static void php_fbsql_create_lob ( INTERNAL_FUNCTION_PARAMETERS , int lob_type )
{
PHPFBLink * phpLink = NULL ;
FBCBlobHandle * lobHandle ;
zval * * lob_data , * * fbsql_link_index = NULL ;
int id ;
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & lob_data ) = = FAILURE ) {
RETURN_FALSE ;
}
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
CHECK_LINK ( id ) ;
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & lob_data , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2001-10-15 17:33:14 +00:00
convert_to_string_ex ( lob_data ) ;
2001-10-10 00:42:00 +00:00
switch ( lob_type ) {
2002-09-04 03:57:59 +00:00
case 0 : /* BLOB */
2001-10-15 17:33:14 +00:00
lobHandle = fbcdcWriteBLOB ( phpLink - > connection , Z_STRVAL_PP ( lob_data ) , Z_STRLEN_PP ( lob_data ) ) ;
2001-10-10 00:42:00 +00:00
break ;
2002-09-04 03:57:59 +00:00
case 1 : /* CLOB */
2001-10-15 17:33:14 +00:00
lobHandle = fbcdcWriteCLOB ( phpLink - > connection , Z_STRVAL_PP ( lob_data ) ) ;
2001-10-10 00:42:00 +00:00
break ;
}
2001-10-10 22:24:57 +00:00
if ( lobHandle ) {
RETURN_STRING ( fbcbhDescription ( lobHandle ) , 1 ) ;
fbcbhRelease ( lobHandle ) ;
}
else
RETURN_FALSE ;
2001-10-10 00:42:00 +00:00
}
2001-10-10 22:24:57 +00:00
/* {{{ proto string fbsql_create_blob(string blob_data [, resource link_identifier])
2002-01-10 21:56:18 +00:00
Create a BLOB in the database for use with an insert or update statement */
2001-10-10 00:42:00 +00:00
PHP_FUNCTION ( fbsql_create_blob )
{
php_fbsql_create_lob ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 ) ;
}
/* }}} */
2001-10-10 22:24:57 +00:00
/* {{{ proto string fbsql_create_clob(string clob_data [, resource link_identifier])
2002-01-10 21:56:18 +00:00
Create a CLOB in the database for use with an insert or update statement */
2001-10-10 00:42:00 +00:00
PHP_FUNCTION ( fbsql_create_clob )
{
php_fbsql_create_lob ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 ) ;
}
/* }}} */
2001-10-16 23:08:38 +00:00
/* {{{ proto bool fbsql_set_lob_mode(resource result, int lob_mode)
2002-01-10 21:56:18 +00:00
Sets the mode for how LOB data re retreived ( actual data or a handle ) */
2001-10-16 23:08:38 +00:00
PHP_FUNCTION ( fbsql_set_lob_mode )
{
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL , * * lob_mode = NULL ;
switch ( ZEND_NUM_ARGS ( ) ) {
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_result_index , & lob_mode ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_long_ex ( lob_mode ) ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
result - > lobMode = Z_LVAL_PP ( lob_mode ) ;
RETURN_TRUE ;
}
/* }}} */
static void php_fbsql_read_lob ( INTERNAL_FUNCTION_PARAMETERS , int lob_type )
{
PHPFBLink * phpLink = NULL ;
zval * * lob_handle , * * fbsql_link_index = NULL ;
int id ;
2002-01-10 21:56:18 +00:00
long length = 0 ;
2001-10-16 23:08:38 +00:00
char * value = NULL ;
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & lob_handle ) = = FAILURE ) {
RETURN_FALSE ;
}
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
CHECK_LINK ( id ) ;
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & lob_handle , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
convert_to_string_ex ( lob_handle ) ;
2001-10-17 18:36:32 +00:00
if ( Z_STRLEN_PP ( lob_handle ) ! = 27 | | Z_STRVAL_PP ( lob_handle ) [ 0 ] ! = ' @ ' ) {
2002-12-03 19:39:25 +00:00
if ( FB_SQL_G ( generateWarnings ) )
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " The handle is invalid " ) ;
2001-10-17 18:36:32 +00:00
RETURN_FALSE ;
}
length = fbcbhBlobSize ( ( FBCBlobHandle * ) Z_STRVAL_PP ( lob_handle ) ) ;
2001-10-16 23:08:38 +00:00
if ( lob_type = = 0 )
value = estrndup ( ( char * ) fbcdcReadBLOB ( phpLink - > connection , ( FBCBlobHandle * ) Z_STRVAL_PP ( lob_handle ) ) , length ) ;
else
value = estrndup ( ( char * ) fbcdcReadCLOB ( phpLink - > connection , ( FBCBlobHandle * ) Z_STRVAL_PP ( lob_handle ) ) , length ) ;
if ( value ) {
RETURN_STRINGL ( value , length , 0 ) ;
}
else {
RETURN_FALSE ;
}
}
2002-01-10 21:56:18 +00:00
2001-10-16 23:08:38 +00:00
/* {{{ proto string fbsql_read_blob(string blob_handle [, resource link_identifier])
2002-01-10 21:56:18 +00:00
Read the BLOB data identified by blob_handle */
2001-10-16 23:08:38 +00:00
PHP_FUNCTION ( fbsql_read_blob )
{
php_fbsql_read_lob ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 ) ;
}
/* }}} */
/* {{{ proto string fbsql_read_clob(string clob_handle [, resource link_identifier])
2002-01-10 21:56:18 +00:00
Read the CLOB data identified by clob_handle */
2001-10-16 23:08:38 +00:00
PHP_FUNCTION ( fbsql_read_clob )
{
php_fbsql_read_lob ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 ) ;
}
/* }}} */
2002-01-10 21:56:18 +00:00
static void php_fbsql_lob_size ( INTERNAL_FUNCTION_PARAMETERS , int lob_type )
{
PHPFBLink * phpLink = NULL ;
zval * * lob_handle , * * fbsql_link_index = NULL ;
int id ;
char * value = NULL ;
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & lob_handle ) = = FAILURE ) {
RETURN_FALSE ;
}
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
CHECK_LINK ( id ) ;
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & lob_handle , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
convert_to_string_ex ( lob_handle ) ;
if ( Z_STRLEN_PP ( lob_handle ) ! = 27 | | Z_STRVAL_PP ( lob_handle ) [ 0 ] ! = ' @ ' ) {
2002-12-03 19:39:25 +00:00
if ( FB_SQL_G ( generateWarnings ) )
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " The handle is invalid " ) ;
2002-01-10 21:56:18 +00:00
RETURN_FALSE ;
}
RETURN_LONG ( fbcbhBlobSize ( ( FBCBlobHandle * ) Z_STRVAL_PP ( lob_handle ) ) ) ;
}
2003-06-15 15:29:46 +00:00
/* {{{ proto int fbsql_blob_size(string blob_handle [, resource link_identifier])
2002-01-10 21:56:18 +00:00
Get the size of a BLOB identified by blob_handle */
PHP_FUNCTION ( fbsql_blob_size )
{
php_fbsql_lob_size ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 ) ;
}
/* }}} */
2003-06-15 15:29:46 +00:00
/* {{{ proto int fbsql_clob_size(string clob_handle [, resource link_identifier])
2002-01-10 21:56:18 +00:00
Get the size of a CLOB identified by clob_handle */
PHP_FUNCTION ( fbsql_clob_size )
{
php_fbsql_lob_size ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 ) ;
}
/* }}} */
2001-06-12 00:39:05 +00:00
/* {{{ proto string fbsql_hostname(resource link_identifier [, string host_name])
2002-01-10 21:56:18 +00:00
Get or set the host name used with a connection */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_hostname )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL , * * host_name = NULL ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_link_index , & host_name ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , - 1 , " FrontBase-Link " , le_link , le_plink ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
if ( host_name )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( host_name ) ;
2001-06-01 23:51:48 +00:00
if ( phpLink - > hostName ) free ( phpLink - > hostName ) ;
phpLink - > hostName = strdup ( Z_STRVAL_PP ( host_name ) ) ;
2001-03-13 20:58:47 +00:00
}
2001-05-08 22:58:32 +00:00
RETURN_STRING ( phpLink - > hostName , 1 ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-12-30 08:12:29 +00:00
/* {{{ proto string fbsql_database(resource link_identifier [, string database])
2002-01-10 21:56:18 +00:00
Get or set the database name used with a connection */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_database )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL , * * dbname = NULL ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_link_index , & dbname ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , - 1 , " FrontBase-Link " , le_link , le_plink ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
if ( dbname )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( dbname ) ;
2001-06-01 23:51:48 +00:00
if ( phpLink - > databaseName ) free ( phpLink - > databaseName ) ;
phpLink - > databaseName = strdup ( Z_STRVAL_PP ( dbname ) ) ;
2001-03-13 20:58:47 +00:00
}
2004-08-24 17:59:01 +00:00
if ( phpLink - > databaseName ) {
RETURN_STRING ( phpLink - > databaseName , 1 ) ;
}
else {
RETURN_FALSE ;
}
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-06-12 00:39:05 +00:00
/* {{{ proto string fbsql_database_password(resource link_identifier [, string database_password])
2002-01-10 21:56:18 +00:00
Get or set the databsae password used with a connection */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_database_password )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL , * * db_password = NULL ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_link_index , & db_password ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , - 1 , " FrontBase-Link " , le_link , le_plink ) ;
2001-05-08 22:58:32 +00:00
2001-05-31 18:43:29 +00:00
if ( db_password )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( db_password ) ;
2001-06-01 23:51:48 +00:00
if ( phpLink - > databasePassword ) free ( phpLink - > databasePassword ) ;
phpLink - > databasePassword = strdup ( Z_STRVAL_PP ( db_password ) ) ;
2001-03-13 20:58:47 +00:00
}
2001-05-08 22:58:32 +00:00
RETURN_STRING ( phpLink - > databasePassword , 1 ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-06-12 00:39:05 +00:00
/* {{{ proto string fbsql_username(resource link_identifier [, string username])
2002-01-10 21:56:18 +00:00
Get or set the host user used with a connection */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_username )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL , * * username = NULL ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_link_index , & username ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , - 1 , " FrontBase-Link " , le_link , le_plink ) ;
if ( username )
{
convert_to_string_ex ( username ) ;
2001-06-01 23:51:48 +00:00
if ( phpLink - > userName ) free ( phpLink - > userName ) ;
phpLink - > userName = strdup ( Z_STRVAL_PP ( username ) ) ;
2001-03-13 20:58:47 +00:00
}
2001-05-08 22:58:32 +00:00
RETURN_STRING ( phpLink - > userName , 1 ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-06-12 00:39:05 +00:00
/* {{{ proto string fbsql_password(resource link_identifier [, string password])
2002-01-10 21:56:18 +00:00
Get or set the user password used with a connection */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_password )
2004-02-09 17:58:04 +00:00
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL , * * password = NULL ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_link_index , & password ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , - 1 , " FrontBase-Link " , le_link , le_plink ) ;
2001-05-08 22:58:32 +00:00
2001-05-31 18:43:29 +00:00
if ( password )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( password ) ;
2001-06-01 23:51:48 +00:00
if ( phpLink - > userPassword ) free ( phpLink - > userPassword ) ;
phpLink - > userPassword = strdup ( Z_STRVAL_PP ( password ) ) ;
2001-03-13 20:58:47 +00:00
}
2001-05-08 22:58:32 +00:00
RETURN_STRING ( phpLink - > userPassword , 1 ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2004-02-26 20:31:14 +00:00
/* {{{ proto bool fbsql_set_password(resource link_identifier, string user, string password, string old_password)
Change the password for a given user */
PHP_FUNCTION ( fbsql_set_password )
{
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL , * * user , * * password , * * old_password ;
char * digest_password , * digest_old_password ;
FBCMetaData * md ;
switch ( ZEND_NUM_ARGS ( ) ) {
case 4 :
if ( zend_get_parameters_ex ( 4 , & fbsql_link_index , & user , & password , & old_password ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , - 1 , " FrontBase-Link " , le_link , le_plink ) ;
convert_to_string_ex ( user ) ;
convert_to_string_ex ( password ) ;
convert_to_string_ex ( old_password ) ;
digest_password = DigestPassword ( Z_STRVAL_PP ( user ) , Z_STRVAL_PP ( password ) ) ;
digest_old_password = DigestPassword ( Z_STRVAL_PP ( user ) , Z_STRVAL_PP ( old_password ) ) ;
md = fbcdcSetPasswordForUser ( phpLink - > connection , Z_STRVAL_PP ( user ) , digest_password , digest_old_password ) ;
if ( mdOk ( phpLink , md , " Change password " ) ) {
ZVAL_BOOL ( return_value , 1 ) ;
}
else {
ZVAL_BOOL ( return_value , 0 ) ;
}
fbcmdRelease ( md ) ;
if ( digest_old_password ) efree ( digest_old_password ) ;
if ( digest_password ) efree ( digest_password ) ;
}
/* }}} */
2001-12-30 08:12:29 +00:00
/* {{{ proto bool fbsql_select_db([string database_name [, resource link_identifier]])
2002-01-10 21:56:18 +00:00
Select the database to open */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_select_db )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
2004-02-09 17:58:04 +00:00
zval * * fbsql_link_index = NULL , * * dbname ;
2001-05-31 18:43:29 +00:00
int id ;
2004-02-09 17:58:04 +00:00
char * name = NULL ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 0 :
name = FB_SQL_G ( databaseName ) ;
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
break ;
case 1 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
if ( zend_get_parameters_ex ( 1 , & dbname ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_string_ex ( dbname ) ;
2001-09-25 21:58:48 +00:00
name = Z_STRVAL_PP ( dbname ) ;
2001-05-31 18:43:29 +00:00
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & dbname , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_string_ex ( dbname ) ;
2001-09-25 21:58:48 +00:00
name = Z_STRVAL_PP ( dbname ) ;
2001-05-31 18:43:29 +00:00
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2001-03-13 20:58:47 +00:00
2001-07-30 08:24:42 +00:00
if ( ! php_fbsql_select_db ( name , phpLink TSRMLS_CC ) ) {
RETURN_FALSE ;
}
2001-05-31 18:43:29 +00:00
RETURN_TRUE ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2004-11-22 22:40:21 +00:00
/* {{{ proto void fbsql_set_characterset(resource link_identifier, long charcterset [, long in_out_both]])
Change input / output character set */
PHP_FUNCTION ( fbsql_set_characterset )
{
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index , * * zcharset , * * zin_out ;
int id ;
int charset = - 1 , in_out_both = 3 ;
switch ( ZEND_NUM_ARGS ( ) ) {
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_link_index , & zcharset ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 3 :
if ( zend_get_parameters_ex ( 3 , & fbsql_link_index , & zcharset , & zin_out ) = = FAILURE ) {
RETURN_FALSE ;
}
in_out_both = Z_LVAL_PP ( zin_out ) ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
charset = Z_LVAL_PP ( zcharset ) ;
if ( in_out_both & 1 ) {
fbcdcSetInputCharacterSet ( phpLink - > connection , charset ) ;
}
if ( in_out_both & 2 ) {
fbcdcSetOutputCharacterSet ( phpLink - > connection , charset ) ;
}
}
2001-12-30 08:12:29 +00:00
/* {{{ proto int fbsql_change_user(string user, string password [, string database [, resource link_identifier]])
2002-01-10 21:56:18 +00:00
Change the user for a session */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_change_user )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL , * * user , * * password , * * database ;
int id ;
char * name = NULL , * userName , * userPassword ;
char buffer [ 1024 ] ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 2 :
name = FB_SQL_G ( databaseName ) ;
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
if ( zend_get_parameters_ex ( 2 , & user , & password ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 3 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
if ( zend_get_parameters_ex ( 3 , & user , & password , & database ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_string_ex ( database ) ;
2001-09-25 21:58:48 +00:00
name = Z_STRVAL_PP ( database ) ;
2001-05-31 18:43:29 +00:00
break ;
case 4 :
if ( zend_get_parameters_ex ( 4 , & user , & password , & database , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_string_ex ( database ) ;
2001-09-25 21:58:48 +00:00
name = Z_STRVAL_PP ( database ) ;
2001-05-31 18:43:29 +00:00
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( user ) ;
2001-09-25 21:58:48 +00:00
userName = Z_STRVAL_PP ( user ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( password ) ;
2001-09-25 21:58:48 +00:00
userPassword = Z_STRVAL_PP ( password ) ;
2001-03-13 20:58:47 +00:00
2004-12-23 19:29:12 +00:00
if ( snprintf ( buffer , sizeof ( buffer ) , " SET AUTHORIZATION %s; " , userName ) < 0 ) {
RETURN_FALSE ;
}
2001-03-13 20:58:47 +00:00
2004-08-24 17:59:01 +00:00
phpfbQuery ( INTERNAL_FUNCTION_PARAM_PASSTHRU , buffer , phpLink , 0 ) ;
2001-09-25 21:58:48 +00:00
if ( Z_LVAL_P ( return_value ) )
2001-03-13 20:58:47 +00:00
{
2001-06-01 23:51:48 +00:00
free ( phpLink - > userName ) ;
phpLink - > userName = strdup ( userName ) ;
2001-03-13 20:58:47 +00:00
}
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-06-12 00:39:05 +00:00
/* {{{ proto bool fbsql_create_db(string database_name [, resource link_identifier])
2002-01-10 21:56:18 +00:00
Create a new database on the server */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_create_db )
{
PHPFBLink * phpLink = NULL ;
2004-08-24 17:59:01 +00:00
zval * * fbsql_link_index = NULL , * * database_name , * * database_options = NULL ;
2001-05-31 18:43:29 +00:00
int id ;
int i , status ;
2004-08-24 17:59:01 +00:00
char * databaseName , * databaseOptions ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
if ( zend_get_parameters_ex ( 1 , & database_name ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & database_name , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
2004-08-24 17:59:01 +00:00
case 3 :
if ( zend_get_parameters_ex ( 3 , & database_name , & fbsql_link_index , & database_options ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
convert_to_string_ex ( database_options ) ;
databaseOptions = Z_STRVAL_PP ( database_options ) ;
break ;
2001-05-31 18:43:29 +00:00
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( database_name ) ;
2001-09-25 21:58:48 +00:00
databaseName = Z_STRVAL_PP ( database_name ) ;
2001-05-31 18:43:29 +00:00
2004-02-09 17:58:04 +00:00
if ( phpLink - > execHandler = = NULL ) phpLink - > execHandler = fbcehHandlerForHost ( phpLink - > hostName , 128 ) ;
2001-05-31 18:43:29 +00:00
status = fbcehStatusForDatabaseNamed ( phpLink - > execHandler , databaseName ) ;
2001-03-13 20:58:47 +00:00
if ( status ! = FBUnknownStatus )
{
char * txt = " Unknown status " ;
2001-03-21 19:56:33 +00:00
if ( status = = FBStopped ) txt = " stopped " ;
else if ( status = = FBStarting ) txt = " starting " ;
else if ( status = = FBRunning ) txt = " running " ;
else if ( status = = FBStopping ) txt = " stopping " ;
else if ( status = = FBNoExec ) txt = " no exec " ;
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not create %s@%s, database is %s " , databaseName , phpLink - > hostName , txt ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
2004-08-24 17:59:01 +00:00
if ( ! fbcehCreateDatabaseNamedWithOptions ( phpLink - > execHandler , databaseName , databaseOptions ) )
2001-03-13 20:58:47 +00:00
{
char * error = fbechErrorMessage ( phpLink - > execHandler ) ;
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not create %s@%s. %s " , databaseName , phpLink - > hostName , error ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
for ( i = 0 ; i < 20 ; i + + )
{
# ifdef PHP_WIN32
Sleep ( 1000 ) ;
# else
sleep ( 1 ) ;
# endif
2001-08-11 16:39:07 +00:00
status = fbcehStatusForDatabaseNamed ( phpLink - > execHandler , databaseName ) ;
2001-03-13 20:58:47 +00:00
if ( status = = FBRunning ) break ;
}
if ( status ! = FBRunning )
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Database %s@%s created -- status unknown " , databaseName , phpLink - > hostName ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
RETURN_TRUE ;
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-06-12 00:39:05 +00:00
/* {{{ proto int fbsql_drop_db(string database_name [, resource link_identifier])
2002-01-10 21:56:18 +00:00
Drop a database on the server */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_drop_db )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL , * * database_name ;
int id ;
int i , status ;
char * databaseName ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
if ( zend_get_parameters_ex ( 1 , & database_name ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & database_name , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
convert_to_string_ex ( database_name ) ;
2001-09-25 21:58:48 +00:00
databaseName = Z_STRVAL_PP ( database_name ) ;
2001-03-13 20:58:47 +00:00
2004-02-09 17:58:04 +00:00
if ( phpLink - > execHandler = = NULL ) phpLink - > execHandler = fbcehHandlerForHost ( phpLink - > hostName , 128 ) ;
2001-08-11 16:39:07 +00:00
status = fbcehStatusForDatabaseNamed ( phpLink - > execHandler , databaseName ) ;
2001-03-13 20:58:47 +00:00
if ( status ! = FBStopped )
{
char * txt = " Unknown status " ;
2001-03-21 19:56:33 +00:00
if ( status = = FBStopped ) txt = " stopped " ;
else if ( status = = FBUnknownStatus ) txt = " nonexisting " ;
else if ( status = = FBStarting ) txt = " starting " ;
else if ( status = = FBRunning ) txt = " running " ;
else if ( status = = FBStopping ) txt = " stopping " ;
else if ( status = = FBNoExec ) txt = " no exec " ;
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not drop %s@%s, database is %s " , databaseName , phpLink - > hostName , txt ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
2004-02-09 17:58:04 +00:00
if ( ! fbcehDeleteDatabaseNamed ( phpLink - > execHandler , databaseName ) )
2001-03-13 20:58:47 +00:00
{
char * error = fbechErrorMessage ( phpLink - > execHandler ) ;
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not drop %s@%s. %s " , databaseName , phpLink - > hostName , error ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
for ( i = 0 ; i < 20 ; i + + )
{
# ifdef PHP_WIN32
Sleep ( 1000 ) ;
# else
sleep ( 1 ) ;
# endif
2001-08-11 16:39:07 +00:00
status = fbcehStatusForDatabaseNamed ( phpLink - > execHandler , databaseName ) ;
2001-03-13 20:58:47 +00:00
if ( status = = FBUnknownStatus ) break ;
}
if ( status ! = FBUnknownStatus )
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Database %s@%s dropped -- status unknown " , databaseName , phpLink - > hostName ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
}
2001-03-20 19:21:45 +00:00
/* }}} */
2004-08-24 17:59:01 +00:00
/* {{{ proto bool fbsql_start_db(string database_name [, resource link_identifier [, string database_options]])
2002-01-10 21:56:18 +00:00
Start a database on the server */
2001-05-29 16:01:54 +00:00
PHP_FUNCTION ( fbsql_start_db )
{
PHPFBLink * phpLink = NULL ;
2004-08-24 17:59:01 +00:00
zval * * fbsql_link_index = NULL , * * database_name , * * database_options ;
2001-05-31 18:43:29 +00:00
int id ;
int i , status ;
2004-08-24 17:59:01 +00:00
char * databaseName , * databaseOptions = NULL ;
2001-05-29 16:01:54 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
if ( zend_get_parameters_ex ( 1 , & database_name ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & database_name , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
2004-08-24 17:59:01 +00:00
case 3 :
if ( zend_get_parameters_ex ( 3 , & database_name , & fbsql_link_index , & database_options ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
convert_to_string_ex ( database_options ) ;
databaseOptions = Z_STRVAL_PP ( database_options ) ;
break ;
2001-05-31 18:43:29 +00:00
default :
WRONG_PARAM_COUNT ;
break ;
2001-05-29 16:01:54 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
convert_to_string_ex ( database_name ) ;
2001-09-25 21:58:48 +00:00
databaseName = Z_STRVAL_PP ( database_name ) ;
2001-05-29 16:01:54 +00:00
2004-02-09 17:58:04 +00:00
if ( phpLink - > execHandler = = NULL ) phpLink - > execHandler = fbcehHandlerForHost ( phpLink - > hostName , 128 ) ;
2001-08-11 16:39:07 +00:00
status = fbcehStatusForDatabaseNamed ( phpLink - > execHandler , databaseName ) ;
2001-05-29 16:01:54 +00:00
if ( ( status ! = FBStopped ) & & ( status ! = FBRunning ) & & ( status ! = FBStarting ) )
{
char * txt = " Unknown status " ;
if ( status = = FBStopped ) txt = " stopped " ;
else if ( status = = FBStarting ) txt = " starting " ;
else if ( status = = FBRunning ) txt = " running " ;
else if ( status = = FBStopping ) txt = " stopping " ;
else if ( status = = FBNoExec ) txt = " no exec " ;
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not start %s@%s, as database is %s " , databaseName , phpLink - > hostName , txt ) ;
2001-05-29 16:01:54 +00:00
RETURN_FALSE ;
}
if ( status = = FBStopped )
{
2004-08-24 17:59:01 +00:00
if ( ! fbcehStartDatabaseNamedWithOptions ( phpLink - > execHandler , databaseName , databaseOptions ) )
2001-05-29 16:01:54 +00:00
{
char * error = fbechErrorMessage ( phpLink - > execHandler ) ;
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not start %s@%s. %s " , databaseName , phpLink - > hostName , error ) ;
2001-05-29 16:01:54 +00:00
RETURN_FALSE ;
}
}
for ( i = 0 ; i < 20 ; i + + )
{
# ifdef PHP_WIN32
Sleep ( 1000 ) ;
# else
sleep ( 1 ) ;
# endif
2001-08-11 16:39:07 +00:00
status = fbcehStatusForDatabaseNamed ( phpLink - > execHandler , databaseName ) ;
2001-05-29 16:01:54 +00:00
if ( status = = FBRunning ) break ;
}
if ( status ! = FBRunning )
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Database %s@%s started -- status unknown " , databaseName , phpLink - > hostName ) ;
2001-05-29 16:01:54 +00:00
RETURN_FALSE ;
}
RETURN_TRUE ;
}
/* }}} */
2001-10-08 16:42:19 +00:00
/* {{{ proto bool fbsql_stop_db(string database_name [, resource link_identifier])
2002-01-10 21:56:18 +00:00
Stop a database on the server */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_stop_db )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL , * * database_name ;
int id ;
int i , status ;
2001-06-01 22:27:00 +00:00
char * databaseName ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
if ( zend_get_parameters_ex ( 1 , & database_name ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & database_name , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( database_name ) ;
2001-09-25 21:58:48 +00:00
databaseName = Z_STRVAL_PP ( database_name ) ;
2001-05-31 18:43:29 +00:00
2001-07-30 08:24:42 +00:00
if ( ! php_fbsql_select_db ( databaseName , phpLink TSRMLS_CC ) ) {
RETURN_FALSE ;
}
2001-03-13 20:58:47 +00:00
2001-08-11 16:39:07 +00:00
/* printf("Stop db %x\n", phpDatabase->connection); */
2001-05-31 18:43:29 +00:00
if ( ! fbcdcStopDatabase ( phpLink - > connection ) )
2001-03-13 20:58:47 +00:00
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Cannot stop database %s@%s " , databaseName , phpLink - > hostName ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
for ( i = 0 ; i < 20 ; i + + )
{
2001-08-11 16:39:07 +00:00
status = fbcehStatusForDatabaseNamed ( phpLink - > execHandler , databaseName ) ;
2001-03-13 20:58:47 +00:00
if ( status = = FBStopped ) break ;
# ifdef PHP_WIN32
Sleep ( 1000 ) ;
# else
sleep ( 1 ) ;
# endif
}
RETURN_TRUE ;
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-06-12 00:39:05 +00:00
/* {{{ proto int fbsql_db_status(string database_name [, resource link_identifier])
2001-12-30 08:12:29 +00:00
Gets the status ( Stopped , Starting , Running , Stopping ) for a given database */
2001-05-29 16:01:54 +00:00
PHP_FUNCTION ( fbsql_db_status )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL , * * database_name ;
int id ;
char * databaseName ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
if ( zend_get_parameters_ex ( 1 , & database_name ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & database_name , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( database_name ) ;
2001-09-25 21:58:48 +00:00
databaseName = Z_STRVAL_PP ( database_name ) ;
2001-03-13 20:58:47 +00:00
2004-02-09 17:58:04 +00:00
if ( phpLink - > execHandler = = NULL ) phpLink - > execHandler = fbcehHandlerForHost ( phpLink - > hostName , 128 ) ;
2001-05-29 16:01:54 +00:00
if ( phpLink - > execHandler ) {
RETURN_LONG ( fbcehStatusForDatabaseNamed ( phpLink - > execHandler , databaseName ) ) ;
2001-03-13 20:58:47 +00:00
}
2001-05-29 16:01:54 +00:00
else {
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-06-06 13:06:12 +00:00
/* {{{ mdOk
*/
2001-08-10 20:34:05 +00:00
int mdOk ( PHPFBLink * link , FBCMetaData * md , char * sql )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
FBCDatabaseConnection * c = link - > connection ;
2001-03-13 20:58:47 +00:00
int result = 1 ;
2001-07-28 11:36:37 +00:00
TSRMLS_FETCH ( ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
link - > errorNo = 0 ;
if ( link - > errorText )
2001-03-13 20:58:47 +00:00
{
2001-06-01 23:51:48 +00:00
free ( link - > errorText ) ;
2001-05-31 18:43:29 +00:00
link - > errorText = NULL ;
2001-03-13 20:58:47 +00:00
}
if ( md = = NULL )
{
2001-06-01 23:51:48 +00:00
link - > errorNo = 1 ;
link - > errorText = strdup ( " Connection to database server was lost " ) ;
2002-12-03 19:39:25 +00:00
if ( FB_SQL_G ( generateWarnings ) )
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " %s " , link - > errorText ) ;
2001-03-13 20:58:47 +00:00
result = 0 ;
}
else if ( fbcmdErrorsFound ( md ) )
{
2001-08-11 16:39:07 +00:00
FBCErrorMetaData * emd = fbcdcErrorMetaData ( c , md ) ;
2001-03-13 20:58:47 +00:00
char * emg = fbcemdAllErrorMessages ( emd ) ;
if ( FB_SQL_G ( generateWarnings ) )
{
if ( emg )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Error in statement: '%s' %s " , sql , emg ) ;
2001-03-13 20:58:47 +00:00
else
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " No message " ) ;
2001-03-13 20:58:47 +00:00
}
2001-10-08 22:24:59 +00:00
link - > errorText = strdup ( emg ) ;
2004-02-09 17:58:04 +00:00
link - > errorNo = fbcemdErrorCodeAtIndex ( emd , 0 ) ; ;
2001-05-31 19:40:24 +00:00
free ( emg ) ;
2001-03-13 20:58:47 +00:00
fbcemdRelease ( emd ) ;
result = 0 ;
}
return result ;
}
2001-06-06 13:06:12 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2004-08-24 17:59:01 +00:00
static void phpfbQuery ( INTERNAL_FUNCTION_PARAMETERS , char * sql , PHPFBLink * link , long batch_size )
2001-03-13 20:58:47 +00:00
{
2004-02-09 17:58:04 +00:00
PHPFBResult * result = NULL ;
2001-03-13 20:58:47 +00:00
FBCMetaData * md , * meta ;
char * tp ;
2004-08-24 17:59:01 +00:00
char * fh = NULL ;
2001-03-13 20:58:47 +00:00
unsigned int sR = 1 , cR = 0 ;
2004-02-09 17:58:04 +00:00
meta = fbcdcExecuteDirectSQL ( link - > connection , sql ) ;
2001-03-13 20:58:47 +00:00
2001-08-10 20:34:05 +00:00
if ( ! mdOk ( link , meta , sql ) )
2001-05-31 19:40:24 +00:00
{
fbcmdRelease ( meta ) ;
2001-07-12 22:43:25 +00:00
ZVAL_BOOL ( return_value , 0 )
2001-03-13 20:58:47 +00:00
}
2001-06-12 00:39:05 +00:00
else {
if ( fbcmdHasMetaDataArray ( meta ) ) {
sR = fbcmdMetaDataArrayCount ( meta ) ;
md = ( FBCMetaData * ) fbcmdMetaDataAtIndex ( meta , cR ) ;
}
else
md = meta ;
2001-03-13 20:58:47 +00:00
2004-02-09 17:58:04 +00:00
tp = fbcmdStatementType ( md ) ;
2001-03-13 20:58:47 +00:00
2001-06-12 00:39:05 +00:00
if ( ( tp [ 0 ] = = ' C ' ) | | ( tp [ 0 ] = = ' R ' ) )
2001-03-13 20:58:47 +00:00
{
2001-06-12 00:39:05 +00:00
if ( sR = = 1 & & md ) fbcmdRelease ( md ) ;
2001-07-12 22:43:25 +00:00
ZVAL_BOOL ( return_value , 1 )
2001-03-13 20:58:47 +00:00
}
2001-07-12 22:43:25 +00:00
else if ( ( fh = fbcmdFetchHandle ( md ) ) | | tp [ 0 ] = = ' E ' | | ( tp [ 0 ] = = ' U ' & & fh ) )
2001-03-13 20:58:47 +00:00
{
2004-08-24 17:59:01 +00:00
result = ( PHPFBResult * ) emalloc ( sizeof ( PHPFBResult ) ) ;
2001-06-12 00:39:05 +00:00
result - > link = link ;
2004-08-24 17:59:01 +00:00
result - > rowHandler = NULL ;
result - > fetchHandle = NULL ;
2001-06-12 00:39:05 +00:00
result - > ResultmetaData = meta ;
result - > metaData = md ;
2004-08-24 17:59:01 +00:00
result - > batchSize = batch_size > 0 ? batch_size : FB_SQL_G ( batchSize ) ;
2001-06-12 00:39:05 +00:00
result - > rowCount = 0x7fffffff ;
result - > columnCount = 0 ;
result - > rowIndex = 0 ;
result - > columnIndex = 0 ;
result - > row = NULL ;
result - > array = NULL ;
result - > list = NULL ;
result - > selectResults = sR ;
result - > currentResult = cR ;
2001-10-16 23:08:38 +00:00
result - > lobMode = FBSQL_LOB_DIRECT ;
2001-06-12 00:39:05 +00:00
if ( tp [ 0 ] ! = ' E ' )
2001-03-13 20:58:47 +00:00
{
2001-06-12 00:39:05 +00:00
result - > columnCount = fbcmdColumnCount ( md ) ;
result - > fetchHandle = fh ;
2001-03-13 20:58:47 +00:00
}
2001-06-12 00:39:05 +00:00
else
{
char * r = fbcmdMessage ( result - > metaData ) ;
2002-02-06 22:31:23 +00:00
fbcrhConvertToOutputCharSet ( fbcdcOutputCharacterSet ( link - > connection ) , ( unsigned char * ) r ) ;
2001-06-12 00:39:05 +00:00
if ( ( result - > list = fbcplParse ( r ) ) )
{
2004-02-09 17:58:04 +00:00
result - > rowCount = fbcplCount ( result - > list ) ;
2001-06-12 00:39:05 +00:00
result - > columnCount = 7 ;
}
}
ZEND_REGISTER_RESOURCE ( return_value , result , le_result ) ;
2001-03-13 20:58:47 +00:00
}
2002-02-22 19:03:11 +00:00
else if ( tp [ 0 ] = = ' I ' | | tp [ 0 ] = = ' U ' )
2001-07-12 22:43:25 +00:00
{
if ( tp [ 0 ] = = ' I ' ) link - > insert_id = fbcmdRowIndex ( md ) ;
if ( sR = = 1 & & md ) fbcmdRelease ( md ) ;
ZVAL_BOOL ( return_value , 1 )
}
2001-07-24 18:24:10 +00:00
else if ( tp [ 0 ] = = ' A ' | | tp [ 0 ] = = ' D ' )
2001-07-12 22:43:25 +00:00
{
if ( sR = = 1 & & md ) fbcmdRelease ( md ) ;
ZVAL_BOOL ( return_value , 1 )
}
2001-06-12 00:39:05 +00:00
if ( link ) link - > affectedRows = fbcmdRowCount ( md ) ;
2001-03-13 20:58:47 +00:00
}
}
2004-08-24 17:59:01 +00:00
/* {{{ proto resource fbsql_query(string query [, resource link_identifier [, long batch_size]])
2002-01-10 21:56:18 +00:00
Send one or more SQL statements to the server and execute them */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_query )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
2004-08-24 17:59:01 +00:00
zval * * fbsql_link_index = NULL , * * query , * * batch_size ;
int id , bs = 0 ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
if ( zend_get_parameters_ex ( 1 , & query ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & query , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
2004-08-24 17:59:01 +00:00
case 3 :
if ( zend_get_parameters_ex ( 3 , & query , & fbsql_link_index , & batch_size ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
convert_to_long_ex ( batch_size ) ;
bs = Z_LVAL_PP ( batch_size ) ;
break ;
2001-05-31 18:43:29 +00:00
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( query ) ;
2001-03-13 20:58:47 +00:00
2004-08-24 17:59:01 +00:00
phpfbQuery ( INTERNAL_FUNCTION_PARAM_PASSTHRU , Z_STRVAL_PP ( query ) , phpLink , bs ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-06-12 00:39:05 +00:00
/* {{{ proto resource fbsql_db_query(string database_name, string query [, resource link_identifier])
2002-01-10 21:56:18 +00:00
Send one or more SQL statements to a specified database on the server */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_db_query )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL , * * dbname , * * query ;
int id ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 2 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
if ( zend_get_parameters_ex ( 2 , & dbname , & query ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 3 :
if ( zend_get_parameters_ex ( 3 , & dbname , & query , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( query ) ;
convert_to_string_ex ( dbname ) ;
2001-03-13 20:58:47 +00:00
2001-09-25 21:58:48 +00:00
if ( php_fbsql_select_db ( Z_STRVAL_PP ( dbname ) , phpLink TSRMLS_CC ) ) {
2004-08-24 17:59:01 +00:00
phpfbQuery ( INTERNAL_FUNCTION_PARAM_PASSTHRU , Z_STRVAL_PP ( query ) , phpLink , 0 ) ;
2001-07-30 08:24:42 +00:00
} else {
2001-06-01 22:27:00 +00:00
RETURN_FALSE ;
}
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-07-30 17:27:08 +00:00
/* {{{ proto resource fbsql_list_dbs([resource link_identifier])
2002-01-10 21:56:18 +00:00
Retreive a list of all databases on the server */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_list_dbs )
{
2004-02-09 17:58:04 +00:00
PHPFBResult * phpResult ;
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL ;
int id ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 0 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
break ;
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2004-02-09 17:58:04 +00:00
if ( phpLink - > execHandler = = NULL ) phpLink - > execHandler = fbcehHandlerForHost ( phpLink - > hostName , 128 ) ;
2001-05-08 22:58:32 +00:00
phpResult = emalloc ( sizeof ( PHPFBResult ) ) ;
2001-05-31 18:43:29 +00:00
phpResult - > link = phpLink ;
2001-03-13 20:58:47 +00:00
phpResult - > fetchHandle = NULL ;
phpResult - > rowHandler = NULL ;
2001-04-03 18:09:02 +00:00
phpResult - > ResultmetaData = NULL ;
2001-03-13 20:58:47 +00:00
phpResult - > metaData = NULL ;
phpResult - > batchSize = FB_SQL_G ( batchSize ) ;
phpResult - > columnCount = 1 ;
phpResult - > rowIndex = 0 ;
phpResult - > columnIndex = 0 ;
phpResult - > row = NULL ;
phpResult - > array = fbcehAvailableDatabases ( phpLink - > execHandler ) ;
phpResult - > rowCount = fbaCount ( phpResult - > array ) ;
phpResult - > list = NULL ;
2001-05-31 18:57:58 +00:00
ZEND_REGISTER_RESOURCE ( return_value , phpResult , le_result ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-12-30 08:12:29 +00:00
/* {{{ proto resource fbsql_list_tables(string database [, int link_identifier])
2002-01-10 21:56:18 +00:00
Retreive a list of all tables from the specifoied database */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_list_tables )
{
2002-02-06 19:41:00 +00:00
char * sql = " select t0. \" table_name \" from information_schema.tables t0, information_schema.SCHEMATA t1 where t0.schema_pk = t1.schema_pk and t1. \" schema_name \" = current_schema order by \" table_name \" ; " ;
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL , * * database_name ;
int id ;
char * databaseName ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
if ( zend_get_parameters_ex ( 1 , & database_name ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & database_name , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( database_name ) ;
2001-09-25 21:58:48 +00:00
databaseName = Z_STRVAL_PP ( database_name ) ;
2001-03-13 20:58:47 +00:00
2001-07-30 08:24:42 +00:00
if ( databaseName = = NULL ) {
php_fbsql_select_db ( FB_SQL_G ( databaseName ) , phpLink TSRMLS_CC ) ;
} else {
php_fbsql_select_db ( databaseName , phpLink TSRMLS_CC ) ;
2001-03-13 20:58:47 +00:00
}
2004-08-24 17:59:01 +00:00
phpfbQuery ( INTERNAL_FUNCTION_PARAM_PASSTHRU , sql , phpLink , 0 ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-07-30 17:27:08 +00:00
/* {{{ proto resource fbsql_list_fields(string database_name, string table_name [, resource link_identifier])
2002-01-10 21:56:18 +00:00
Retrieve a list of all fields for the specified database . table */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_list_fields )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
2004-02-09 17:58:04 +00:00
zval * * fbsql_link_index = NULL , * * database_name , * * table_name ;
2001-05-31 18:43:29 +00:00
int id ;
char * databaseName , * tableName ;
2004-02-09 17:58:04 +00:00
char sql [ 1024 ] ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 2 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
if ( zend_get_parameters_ex ( 2 , & database_name , & table_name ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 3 :
if ( zend_get_parameters_ex ( 3 , & database_name , & table_name , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
convert_to_string_ex ( database_name ) ;
2001-09-25 21:58:48 +00:00
databaseName = Z_STRVAL_PP ( database_name ) ;
2001-05-31 18:43:29 +00:00
convert_to_string_ex ( table_name ) ;
2001-09-25 21:58:48 +00:00
tableName = Z_STRVAL_PP ( table_name ) ;
2001-03-13 20:58:47 +00:00
2001-07-30 08:24:42 +00:00
if ( ! php_fbsql_select_db ( databaseName , phpLink TSRMLS_CC ) ) {
RETURN_FALSE ;
}
2001-03-13 20:58:47 +00:00
2004-12-23 19:29:12 +00:00
if ( snprintf ( sql , sizeof ( sql ) , " SELECT * FROM %s WHERE 1=0; " , tableName ) < 0 ) {
RETURN_FALSE ;
}
2001-03-13 20:58:47 +00:00
2004-08-24 17:59:01 +00:00
phpfbQuery ( INTERNAL_FUNCTION_PARAM_PASSTHRU , sql , phpLink , 0 ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-06-12 00:39:05 +00:00
/* {{{ proto string fbsql_error([resource link_identifier])
2002-01-10 21:56:18 +00:00
Returns the last error string */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_error )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL ;
int id ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 0 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
break ;
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
if ( phpLink - > errorText = = NULL ) {
RETURN_FALSE ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
else {
RETURN_STRING ( phpLink - > errorText , 1 ) ;
2001-03-13 20:58:47 +00:00
}
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-06-12 00:39:05 +00:00
/* {{{ proto int fbsql_errno([resource link_identifier])
2002-01-10 21:56:18 +00:00
Returns the last error code */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_errno )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL ;
int id ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 0 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
break ;
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
RETURN_LONG ( phpLink - > errorNo ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-12-30 08:12:29 +00:00
/* {{{ proto bool fbsql_warnings([int flag])
2002-01-10 21:56:18 +00:00
Enable or disable FrontBase warnings */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_warnings )
{
2003-01-21 14:56:40 +00:00
int argc = ZEND_NUM_ARGS ( ) ;
2001-03-21 19:56:33 +00:00
zval * * argv [ 1 ] ;
2001-03-13 20:58:47 +00:00
2001-03-21 19:56:33 +00:00
if ( ( argc < 0 ) | | ( argc > 1 ) ) WRONG_PARAM_COUNT ;
2001-08-11 16:39:07 +00:00
if ( zend_get_parameters_ex ( argc , & argv [ 0 ] ) = = FAILURE ) RETURN_FALSE ;
2001-03-13 20:58:47 +00:00
if ( argc > = 1 )
{
2001-03-21 19:56:33 +00:00
convert_to_long_ex ( argv [ 0 ] ) ;
2001-09-25 22:49:04 +00:00
FB_SQL_G ( generateWarnings ) = Z_LVAL_PP ( argv [ 0 ] ) ! = 0 ;
2001-03-13 20:58:47 +00:00
}
2001-05-01 22:04:11 +00:00
RETURN_BOOL ( FB_SQL_G ( generateWarnings ) ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-06-12 00:39:05 +00:00
/* {{{ proto int fbsql_affected_rows([resource link_identifier])
2002-01-10 21:56:18 +00:00
Get the number of rows affected by the last statement */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_affected_rows )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL ;
int id ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 0 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
break ;
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2001-05-08 22:58:32 +00:00
RETURN_LONG ( phpLink - > affectedRows ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2004-08-24 17:59:01 +00:00
/* {{{ proto int fbsql_affected_rows([resource link_identifier])
Get the number of rows affected by the last statement */
PHP_FUNCTION ( fbsql_rows_fetched )
{
PHPFBResult * phpResult = NULL ;
zval * * result = NULL ;
int id ;
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & result ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE ( phpResult , PHPFBResult * , result , id , " FrontBase-Result " , le_result ) ;
if ( ! phpResult - > rowHandler ) {
RETURN_FALSE ;
}
else {
RETURN_LONG ( fbcrhRowCount ( phpResult - > rowHandler ) ) ;
}
}
/* }}} */
2001-06-12 00:39:05 +00:00
/* {{{ proto int fbsql_insert_id([resource link_identifier])
2002-01-10 21:56:18 +00:00
Get the internal index for the last insert statement */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_insert_id )
{
2001-05-31 18:43:29 +00:00
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL ;
int id ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 0 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-05-31 18:43:29 +00:00
CHECK_LINK ( id ) ;
break ;
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
RETURN_LONG ( phpLink - > insert_id ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-06-06 13:06:12 +00:00
/* {{{ phpSizeOfInt
*/
2001-03-21 19:56:33 +00:00
int phpSizeOfInt ( int i )
2001-03-13 20:58:47 +00:00
{
int s = 1 ;
2001-03-21 19:56:33 +00:00
if ( i < 0 )
2001-03-13 20:58:47 +00:00
{
s + + ;
i = - i ;
}
while ( ( i = i / 10 ) ) s + + ;
return s ;
}
2001-06-06 13:06:12 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2002-07-02 21:36:11 +00:00
void phpfbColumnAsString ( PHPFBResult * result , int column , void * data , int * length , char * * value TSRMLS_DC )
2001-03-13 20:58:47 +00:00
{
FBCMetaData * md = result - > metaData ;
const FBCDatatypeMetaData * dtmd = fbcmdDatatypeMetaDataAtIndex ( md , column ) ;
unsigned dtc = fbcdmdDatatypeCode ( dtmd ) ;
switch ( dtc )
{
case FB_Boolean :
{
unsigned char v = * ( ( unsigned char * ) ( data ) ) ;
if ( v = = 255 )
2001-08-11 16:39:07 +00:00
phpfbestrdup ( " Unknown " , length , value ) ;
2001-03-21 19:56:33 +00:00
else if ( v = = 0 )
2001-08-11 16:39:07 +00:00
phpfbestrdup ( " False " , length , value ) ;
2001-03-13 20:58:47 +00:00
else
2001-08-11 16:39:07 +00:00
phpfbestrdup ( " True " , length , value ) ;
2001-03-13 20:58:47 +00:00
}
break ;
2004-02-09 17:58:04 +00:00
2001-03-13 20:58:47 +00:00
case FB_PrimaryKey :
case FB_Integer :
{
2004-02-09 17:58:04 +00:00
int v = * ( ( int * ) data ) ;
char b [ 128 ] ;
2004-12-23 19:29:12 +00:00
snprintf ( b , sizeof ( b ) , " %d " , v ) ;
2001-08-11 16:39:07 +00:00
phpfbestrdup ( b , length , value ) ;
2001-03-13 20:58:47 +00:00
}
break ;
2003-02-12 20:44:00 +00:00
# ifdef FB_TinyInteger
2002-03-19 18:33:05 +00:00
case FB_TinyInteger :
{
2004-02-09 17:58:04 +00:00
short int v = * ( ( FBTinyInteger * ) data ) ;
char b [ 128 ] ;
2004-12-23 19:29:12 +00:00
snprintf ( b , sizeof ( b ) , " %d " , v ) ;
2002-03-19 18:33:05 +00:00
phpfbestrdup ( b , length , value ) ;
}
break ;
2003-02-12 20:44:00 +00:00
# endif
# ifdef FB_LongInteger
2002-03-19 18:33:05 +00:00
case FB_LongInteger :
{
2002-03-19 22:36:42 +00:00
FBLongInteger v = * ( ( FBLongInteger * ) data ) ;
2004-02-09 17:58:04 +00:00
char b [ 128 ] ;
2002-03-19 22:36:42 +00:00
# ifdef PHP_WIN32
2004-12-23 19:29:12 +00:00
snprintf ( b , sizeof ( b ) , " %I64i " , v ) ;
2002-03-19 22:36:42 +00:00
# else
2004-12-23 19:29:12 +00:00
snprintf ( b , sizeof ( b ) , " %ll " , v ) ;
2002-03-19 22:36:42 +00:00
# endif
2002-03-19 18:33:05 +00:00
phpfbestrdup ( b , length , value ) ;
}
break ;
2003-02-12 20:44:00 +00:00
# endif
2001-03-13 20:58:47 +00:00
case FB_SmallInteger :
{
short v = * ( ( short * ) data ) ;
2004-02-09 17:58:04 +00:00
char b [ 128 ] ;
2004-12-23 19:29:12 +00:00
snprintf ( b , sizeof ( b ) , " %d " , v ) ;
2001-08-11 16:39:07 +00:00
phpfbestrdup ( b , length , value ) ;
2001-03-13 20:58:47 +00:00
}
break ;
case FB_Float :
case FB_Real :
case FB_Double :
case FB_Numeric :
case FB_Decimal :
{
double v = * ( ( double * ) data ) ;
2004-02-09 17:58:04 +00:00
char b [ 128 ] ;
2004-12-23 19:29:12 +00:00
snprintf ( b , sizeof ( b ) , " %f " , v ) ;
2001-08-11 16:39:07 +00:00
phpfbestrdup ( b , length , value ) ;
2001-03-13 20:58:47 +00:00
}
break ;
case FB_Character :
case FB_VCharacter :
{
char * v = ( char * ) data ;
2001-08-11 16:39:07 +00:00
phpfbestrdup ( v , length , value ) ;
2001-03-13 20:58:47 +00:00
}
break ;
case FB_Bit :
case FB_VBit :
{
2004-02-09 17:58:04 +00:00
const FBCColumnMetaData * clmd = fbcmdColumnMetaDataAtIndex ( md , column ) ;
2001-03-13 20:58:47 +00:00
struct bitValue
{
2004-02-09 17:58:04 +00:00
unsigned int nBytes ;
2001-03-13 20:58:47 +00:00
unsigned char * bytes ;
} ;
2004-02-09 17:58:04 +00:00
struct bitValue * ptr = data ;
2001-03-13 20:58:47 +00:00
unsigned nBits = ptr - > nBytes * 8 ;
if ( dtc = = FB_Bit ) nBits = fbcdmdLength ( fbccmdDatatype ( clmd ) ) ;
2001-03-21 19:56:33 +00:00
if ( nBits % 8 = = 0 )
2001-03-13 20:58:47 +00:00
{
unsigned i ;
unsigned int l = nBits / 8 ;
2001-06-20 22:54:51 +00:00
* length = l * 2 + 3 + 1 ;
2001-03-13 20:58:47 +00:00
if ( value )
{
2004-02-09 17:58:04 +00:00
char * r = safe_emalloc ( l , 2 , 4 ) ;
2001-03-13 20:58:47 +00:00
r [ 0 ] = ' X ' ;
r [ 1 ] = ' \' ' ;
2001-03-21 19:56:33 +00:00
for ( i = 0 ; i < nBits / 8 ; i + + )
2001-03-13 20:58:47 +00:00
{
char c [ 4 ] ;
2001-08-11 16:39:07 +00:00
sprintf ( c , " %02x " , ptr - > bytes [ i ] ) ;
2001-03-13 20:58:47 +00:00
r [ i * 2 + 2 ] = c [ 0 ] ;
r [ i * 2 + 3 ] = c [ 1 ] ;
}
r [ i * 2 + 2 ] = ' \' ' ;
r [ i * 2 + 3 ] = 0 ;
2004-02-09 17:58:04 +00:00
* value = r ;
2001-03-13 20:58:47 +00:00
}
}
else
{
unsigned i ;
unsigned int l = nBits ;
2001-06-20 22:54:51 +00:00
* length = l * 2 + 3 + 1 ;
2001-03-13 20:58:47 +00:00
if ( value )
{
2004-12-23 19:29:12 +00:00
char * r = safe_emalloc ( l , 2 , 4 ) ;
2001-03-13 20:58:47 +00:00
r [ 0 ] = ' B ' ;
r [ 1 ] = ' \' ' ;
2001-03-21 19:56:33 +00:00
for ( i = 0 ; i < nBits ; i + + )
2001-03-13 20:58:47 +00:00
{
int bit = 0 ;
if ( i / 8 < ptr - > nBytes ) bit = ptr - > bytes [ i / 8 ] & ( 1 < < ( 7 - ( i % 8 ) ) ) ;
r [ i * 2 + 2 ] = bit ? ' 1 ' : ' 0 ' ;
}
r [ i * 2 + 2 ] = ' \' ' ;
r [ i * 2 + 3 ] = 0 ;
2004-02-09 17:58:04 +00:00
* value = r ;
2001-03-13 20:58:47 +00:00
}
}
}
break ;
case FB_Date :
case FB_Time :
case FB_TimeTZ :
case FB_Timestamp :
case FB_TimestampTZ :
{
char * v = ( char * ) data ;
2001-08-11 16:39:07 +00:00
phpfbestrdup ( v , length , value ) ;
2001-03-13 20:58:47 +00:00
}
break ;
case FB_YearMonth :
{
char b [ 128 ] ;
2004-02-09 17:58:04 +00:00
int v = * ( ( unsigned int * ) data ) ;
2004-12-23 19:29:12 +00:00
snprintf ( b , sizeof ( b ) , " %d " , v ) ;
2001-08-11 16:39:07 +00:00
phpfbestrdup ( b , length , value ) ;
2001-03-13 20:58:47 +00:00
}
break ;
case FB_DayTime :
{
char b [ 128 ] ;
double seconds = * ( ( double * ) data ) ;
2004-12-23 19:29:12 +00:00
snprintf ( b , sizeof ( b ) , " %f " , seconds ) ;
2001-08-11 16:39:07 +00:00
phpfbestrdup ( b , length , value ) ;
2001-03-13 20:58:47 +00:00
}
break ;
case FB_CLOB :
case FB_BLOB :
2001-10-10 00:42:00 +00:00
{
if ( * ( ( unsigned char * ) data ) = = ' \1 ' )
2002-09-04 03:57:59 +00:00
{ /* Direct */
2001-10-10 00:42:00 +00:00
* length = ( ( FBCBlobDirect * ) data ) - > blobSize ;
2001-10-15 17:33:14 +00:00
* value = estrndup ( ( char * ) ( ( FBCBlobDirect * ) data ) - > blobData , * length ) ;
2001-03-20 19:21:45 +00:00
}
else
{
2001-10-10 00:42:00 +00:00
FBCBlobHandle * lobHandle ;
2001-10-15 17:33:14 +00:00
unsigned char * bytes = ( unsigned char * ) data ;
char * handle = ( char * ) ( & bytes [ 1 ] ) ;
2001-10-10 00:42:00 +00:00
lobHandle = fbcbhInitWithHandle ( handle ) ;
* length = fbcbhBlobSize ( lobHandle ) ;
2001-10-16 23:08:38 +00:00
if ( result - > lobMode = = FBSQL_LOB_HANDLE ) {
phpfbestrdup ( fbcbhDescription ( lobHandle ) , length , value ) ;
}
else {
if ( dtc = = FB_BLOB )
* value = estrndup ( ( char * ) fbcdcReadBLOB ( result - > link - > connection , lobHandle ) , * length ) ;
else
* value = estrndup ( ( char * ) fbcdcReadCLOB ( result - > link - > connection , lobHandle ) , * length ) ;
}
2001-10-10 00:42:00 +00:00
fbcbhRelease ( lobHandle ) ;
2001-03-20 19:21:45 +00:00
}
}
break ;
2001-10-10 00:42:00 +00:00
2001-03-13 20:58:47 +00:00
default :
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Unimplemented type (%d) " , dtc ) ;
2001-03-13 20:58:47 +00:00
break ;
}
}
2001-06-06 13:06:12 +00:00
/* {{{ phpfbSqlResult
*/
2004-02-09 17:58:04 +00:00
void phpfbSqlResult ( INTERNAL_FUNCTION_PARAMETERS , PHPFBResult * result , int rowIndex , int columnIndex )
2001-03-13 20:58:47 +00:00
{
void * * row ;
if ( result - > list )
{
2001-08-11 16:39:07 +00:00
FBCPList * columns = ( FBCPList * ) fbcplValueForKey ( result - > list , " COLUMNS " ) ;
FBCPList * column = ( FBCPList * ) fbcplValueAtIndex ( columns , result - > rowIndex ) ;
2004-02-09 17:58:04 +00:00
if ( columnIndex = = 0 )
2001-03-20 19:21:45 +00:00
{ /* Name */
2001-08-11 16:39:07 +00:00
FBCPList * name = ( FBCPList * ) fbcplValueForKey ( column , " NAME " ) ;
2001-05-08 22:58:32 +00:00
RETURN_STRING ( ( char * ) fbcplString ( ( FBCPList * ) name ) , 1 ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-21 19:56:33 +00:00
else if ( columnIndex = = 2 )
2001-03-20 19:21:45 +00:00
{ /* Length */
2001-08-11 16:39:07 +00:00
FBCPList * name = ( FBCPList * ) fbcplValueForKey ( column , " WIDTH " ) ;
2001-05-08 22:58:32 +00:00
RETURN_STRING ( ( char * ) fbcplString ( ( FBCPList * ) name ) , 1 ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-21 19:56:33 +00:00
else if ( columnIndex = = 1 )
2001-03-20 19:21:45 +00:00
{ /* Type */
2001-08-11 16:39:07 +00:00
FBCPList * name = ( FBCPList * ) fbcplValueForKey ( column , " DATATYPE " ) ;
2001-05-08 22:58:32 +00:00
RETURN_STRING ( ( char * ) fbcplString ( ( FBCPList * ) name ) , 1 ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-21 19:56:33 +00:00
else if ( columnIndex = = 3 )
2001-03-20 19:21:45 +00:00
{ /* Flags */
2001-05-08 22:58:32 +00:00
RETURN_STRING ( " " , 1 ) ;
2001-03-13 20:58:47 +00:00
}
else
{
2001-05-08 22:58:32 +00:00
RETURN_STRING ( " " , 1 ) ;
2001-03-13 20:58:47 +00:00
}
}
else if ( result - > array )
2001-03-20 19:21:45 +00:00
{ /* Special case for get dbs */
2001-08-11 16:39:07 +00:00
RETURN_STRING ( fbaObjectAtIndex ( result - > array , rowIndex ) , 1 ) ;
2001-03-13 20:58:47 +00:00
}
2001-08-11 16:39:07 +00:00
else if ( ! phpfbFetchRow ( result , rowIndex ) )
2001-03-13 20:58:47 +00:00
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " No such row %d in result set %d " , rowIndex , rowIndex ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
else if ( columnIndex > = result - > columnCount )
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " No such column %d in result set %d " , columnIndex , rowIndex ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
else
{
2001-08-11 16:39:07 +00:00
row = fbcrhRowAtIndex ( result - > rowHandler , rowIndex ) ;
2001-03-13 20:58:47 +00:00
if ( row = = NULL )
{
RETURN_FALSE ;
}
else if ( row [ columnIndex ] )
{
2002-07-02 21:36:11 +00:00
phpfbColumnAsString ( result , columnIndex , row [ columnIndex ] , & Z_STRLEN_P ( return_value ) , & Z_STRVAL_P ( return_value ) TSRMLS_CC ) ;
2001-09-25 21:58:48 +00:00
Z_TYPE_P ( return_value ) = IS_STRING ;
2001-03-13 20:58:47 +00:00
}
else
{
2001-05-08 22:58:32 +00:00
RETURN_NULL ( ) ;
2001-03-13 20:58:47 +00:00
}
}
}
2001-06-06 13:06:12 +00:00
/* }}} */
2004-02-09 17:58:04 +00:00
2001-05-31 18:43:29 +00:00
/* {{{ proto mixed fbsql_result(int result [, int row [, mixed field]])
2001-12-30 08:12:29 +00:00
? ? ? */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_result )
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL , * * row = NULL , * * field = NULL ;
int rowIndex ;
int columnIndex ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_result_index , & row ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 3 :
if ( zend_get_parameters_ex ( 3 , & fbsql_result_index , & row , & field ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-03-13 20:58:47 +00:00
rowIndex = result - > rowIndex ;
2001-05-31 18:43:29 +00:00
if ( row )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_long_ex ( row ) ;
rowIndex = Z_LVAL_PP ( row ) ;
2001-03-13 20:58:47 +00:00
}
2004-02-09 17:58:04 +00:00
columnIndex = result - > columnIndex ;
2001-05-31 18:43:29 +00:00
if ( field )
2001-03-13 20:58:47 +00:00
{
2001-09-25 21:58:48 +00:00
if ( ( Z_TYPE_PP ( field ) = = IS_STRING ) & & ( result - > metaData ) )
2001-03-13 20:58:47 +00:00
{
for ( columnIndex = 0 ; columnIndex < result - > columnCount ; columnIndex + + )
{
const FBCColumnMetaData * cmd = fbcmdColumnMetaDataAtIndex ( result - > metaData , columnIndex ) ;
const char * lbl = fbccmdLabelName ( cmd ) ;
2001-09-25 21:58:48 +00:00
if ( strcmp ( ( char * ) lbl , Z_STRVAL_PP ( field ) ) = = 0 ) break ;
2001-03-13 20:58:47 +00:00
}
if ( columnIndex = = result - > columnCount ) RETURN_FALSE ;
}
else
{
2001-05-31 18:43:29 +00:00
convert_to_long_ex ( field ) ;
2001-09-25 21:58:48 +00:00
columnIndex = Z_LVAL_PP ( field ) ;
2001-03-21 19:56:33 +00:00
if ( columnIndex < 0 )
2001-03-13 20:58:47 +00:00
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Illegal column index - %d " , columnIndex ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
}
2004-02-09 17:58:04 +00:00
}
2001-08-11 16:39:07 +00:00
phpfbSqlResult ( INTERNAL_FUNCTION_PARAM_PASSTHRU , result , rowIndex , columnIndex ) ;
2001-03-13 20:58:47 +00:00
result - > columnIndex + + ;
if ( result - > columnIndex = = result - > columnCount )
{
result - > rowIndex + + ;
result - > columnIndex = 0 ;
}
}
2001-03-20 19:21:45 +00:00
/* }}} */
2003-06-15 15:29:46 +00:00
/* {{{ proto bool fbsql_next_result(int result)
2002-01-10 21:56:18 +00:00
Switch to the next result if multiple results are available */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_next_result )
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-03-13 20:58:47 +00:00
2004-02-09 17:58:04 +00:00
result - > currentResult + + ;
2001-03-13 20:58:47 +00:00
if ( result - > currentResult < result - > selectResults ) {
2004-02-09 17:58:04 +00:00
if ( result - > fetchHandle ) {
2001-05-31 18:43:29 +00:00
FBCMetaData * md = fbcdcCancelFetch ( result - > link - > connection , result - > fetchHandle ) ;
2001-04-16 16:27:11 +00:00
fbcmdRelease ( md ) ;
}
2001-03-13 20:58:47 +00:00
if ( result - > rowHandler ) fbcrhRelease ( result - > rowHandler ) ;
result - > metaData = ( FBCMetaData * ) fbcmdMetaDataAtIndex ( result - > ResultmetaData , result - > currentResult ) ;
result - > fetchHandle = fbcmdFetchHandle ( result - > metaData ) ;
result - > rowHandler = NULL ;
result - > batchSize = FB_SQL_G ( batchSize ) ;
result - > rowCount = 0x7fffffff ;
result - > columnCount = fbcmdColumnCount ( result - > metaData ) ; ;
result - > rowIndex = 0 ;
result - > columnIndex = 0 ;
result - > row = NULL ;
result - > array = NULL ;
result - > list = NULL ;
2001-05-31 18:43:29 +00:00
if ( result - > link )
result - > link - > affectedRows = fbcmdRowCount ( result - > metaData ) ;
2001-03-13 20:58:47 +00:00
RETURN_TRUE ;
}
else {
RETURN_FALSE ;
}
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-03-20 19:21:45 +00:00
/* {{{ proto int fbsql_num_rows(int result)
2002-01-10 21:56:18 +00:00
Get number of rows */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_num_rows )
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL ;
int rowCount ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-03-13 20:58:47 +00:00
2001-04-03 18:09:02 +00:00
if ( result - > array )
2001-03-13 20:58:47 +00:00
rowCount = result - > rowCount ;
2001-04-03 18:09:02 +00:00
else {
rowCount = fbcmdRowCount ( result - > metaData ) ;
if ( rowCount = = - 1 )
{
2001-08-11 16:39:07 +00:00
phpfbFetchRow ( result , 0x7fffffff ) ;
2001-04-03 18:09:02 +00:00
rowCount = result - > rowCount ;
}
2001-03-13 20:58:47 +00:00
}
2001-05-08 22:58:32 +00:00
RETURN_LONG ( rowCount ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
/* {{{ proto int fbsql_num_fields(int result)
2002-01-10 21:56:18 +00:00
Get number of fields in the result set */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_num_fields )
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-03-13 20:58:47 +00:00
2001-05-08 22:58:32 +00:00
RETURN_LONG ( result - > columnCount ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-10-16 23:08:38 +00:00
/* {{{ proto array fbsql_fetch_row(resource result)
2002-01-10 21:56:18 +00:00
Fetch a row of data . Returns an indexed array */
2001-04-17 17:39:43 +00:00
PHP_FUNCTION ( fbsql_fetch_row )
{
2003-07-03 16:53:04 +00:00
php_fbsql_fetch_hash ( INTERNAL_FUNCTION_PARAM_PASSTHRU , FBSQL_NUM , 1 ) ;
2001-04-17 17:39:43 +00:00
}
/* }}} */
2001-10-16 23:08:38 +00:00
/* {{{ proto object fbsql_fetch_assoc(resource result)
2002-01-10 21:56:18 +00:00
Detch a row of data . Returns an assoc array */
2001-04-17 17:39:43 +00:00
PHP_FUNCTION ( fbsql_fetch_assoc )
{
2003-07-03 16:53:04 +00:00
php_fbsql_fetch_hash ( INTERNAL_FUNCTION_PARAM_PASSTHRU , FBSQL_ASSOC , 1 ) ;
2001-04-17 17:39:43 +00:00
}
/* }}} */
2001-10-16 23:08:38 +00:00
/* {{{ proto object fbsql_fetch_object(resource result [, int result_type])
2002-01-10 21:56:18 +00:00
Fetch a row of data . Returns an object */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_fetch_object )
{
2003-07-03 16:53:04 +00:00
php_fbsql_fetch_hash ( INTERNAL_FUNCTION_PARAM_PASSTHRU , FBSQL_ASSOC , 2 ) ;
2001-09-25 21:58:48 +00:00
if ( Z_TYPE_P ( return_value ) = = IS_ARRAY ) {
2002-03-12 20:18:01 +00:00
object_and_properties_init ( return_value , ZEND_STANDARD_CLASS_DEF_PTR , Z_ARRVAL_P ( return_value ) ) ;
2001-03-13 20:58:47 +00:00
}
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-10-16 23:08:38 +00:00
/* {{{ proto array fbsql_fetch_array(resource result [, int result_type])
2001-12-30 08:12:29 +00:00
Fetches a result row as an array ( associative , numeric or both ) */
2001-04-17 17:39:43 +00:00
PHP_FUNCTION ( fbsql_fetch_array )
2001-03-13 20:58:47 +00:00
{
2003-07-03 16:53:04 +00:00
php_fbsql_fetch_hash ( INTERNAL_FUNCTION_PARAM_PASSTHRU , FBSQL_BOTH , 2 ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-10-29 01:51:08 +00:00
static void _parse_list ( zval * * return_value , FBCPList * list )
{
int count = fbcplCount ( list ) ;
int i , j ;
for ( i = 0 ; i < count ; i + + )
{
char * key = ( char * ) fbcplKeyAtIndex ( list , i ) ;
FBCPList * value = ( FBCPList * ) fbcplValueForKey ( list , key ) ;
if ( fbcplIsDictionary ( value ) )
{
zval * value_array ;
MAKE_STD_ZVAL ( value_array ) ;
array_init ( value_array ) ;
_parse_list ( & value_array , value ) ;
add_assoc_zval ( * return_value , key , value_array ) ;
}
else if ( fbcplIsArray ( value ) )
{
zval * value_array ;
int valcount = fbcplCount ( value ) ;
MAKE_STD_ZVAL ( value_array ) ;
array_init ( value_array ) ;
for ( j = 0 ; j < valcount ; j + + )
{
FBCPList * arrayValue = ( FBCPList * ) fbcplValueAtIndex ( value , j ) ;
if ( fbcplIsString ( arrayValue ) )
add_index_string ( value_array , j , ( char * ) fbcplString ( arrayValue ) , 1 ) ;
else {
_parse_list ( & value_array , arrayValue ) ;
}
}
add_assoc_zval ( * return_value , key , value_array ) ;
}
else if ( fbcplIsString ( value ) ) {
add_assoc_string ( * return_value , key , ( char * ) fbcplString ( value ) , 1 ) ;
}
}
}
2003-07-03 16:53:04 +00:00
static void php_fbsql_fetch_hash ( INTERNAL_FUNCTION_PARAMETERS , int result_type , int expected_args )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL , * * zresult_type = NULL ;
int rowIndex ;
int i ;
void * * row ;
2001-03-13 20:58:47 +00:00
2003-07-03 16:53:04 +00:00
if ( ZEND_NUM_ARGS ( ) > expected_args ) {
WRONG_PARAM_COUNT ;
}
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_result_index , & zresult_type ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_long_ex ( zresult_type ) ;
result_type = Z_LVAL_PP ( zresult_type ) ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-03-13 20:58:47 +00:00
rowIndex = result - > rowIndex ;
2001-05-31 18:43:29 +00:00
if ( ( ( result_type & FBSQL_NUM ) ! = FBSQL_NUM ) & & ( ( result_type & FBSQL_ASSOC ) ! = FBSQL_ASSOC ) )
2001-03-13 20:58:47 +00:00
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Illegal result type use FBSQL_NUM, FBSQL_ASSOC, or FBSQL_BOTH " ) ;
2001-05-31 18:43:29 +00:00
RETURN_FALSE ;
2001-03-13 20:58:47 +00:00
}
2003-01-18 19:49:28 +00:00
array_init ( return_value ) ;
2001-05-08 22:58:32 +00:00
if ( result - > fetchHandle = = NULL )
2001-03-13 20:58:47 +00:00
{
2001-10-29 01:51:08 +00:00
if ( result - > array = = NULL & & result - > list = = NULL )
2001-05-08 22:58:32 +00:00
{
2001-03-20 20:25:55 +00:00
RETURN_FALSE ;
}
2001-05-08 22:58:32 +00:00
if ( result - > rowIndex > = result - > rowCount )
{
RETURN_FALSE ;
}
2001-10-29 01:51:08 +00:00
if ( result - > list ) {
char * key ;
FBCPList * value ;
value = ( FBCPList * ) fbcplValueAtIndex ( result - > list , result - > rowIndex ) ;
key = ( char * ) fbcplKeyAtIndex ( result - > list , result - > rowIndex ) ;
2001-11-10 07:43:23 +00:00
2001-10-29 01:51:08 +00:00
if ( key & & key [ 0 ] = = 2 )
key = NULL ;
if ( fbcplIsDictionary ( value ) ) {
zval * value_array ;
MAKE_STD_ZVAL ( value_array ) ;
array_init ( value_array ) ;
_parse_list ( & value_array , value ) ;
if ( result_type & FBSQL_NUM | | key = = NULL )
{
add_index_zval ( return_value , 0 , value_array ) ;
}
if ( result_type & FBSQL_ASSOC & & key ! = NULL )
{
add_assoc_zval ( return_value , key , value_array ) ;
}
}
else if ( fbcplIsArray ( value ) ) {
zval * value_array ;
int valcount = fbcplCount ( value ) ;
int j ;
MAKE_STD_ZVAL ( value_array ) ;
array_init ( value_array ) ;
for ( j = 0 ; j < valcount ; j + + )
{
FBCPList * arrayValue = ( FBCPList * ) fbcplValueAtIndex ( value , j ) ;
if ( fbcplIsString ( arrayValue ) )
add_index_string ( value_array , j , ( char * ) fbcplString ( arrayValue ) , 1 ) ;
else {
_parse_list ( & value_array , arrayValue ) ;
}
}
if ( result_type & FBSQL_NUM | | key = = NULL )
{
add_index_zval ( return_value , 0 , value_array ) ;
}
if ( result_type & FBSQL_ASSOC & & key ! = NULL )
{
add_assoc_zval ( return_value , key , value_array ) ;
}
}
else if ( fbcplIsString ( value ) ) {
if ( result_type & FBSQL_NUM )
{
add_index_string ( return_value , 0 , ( char * ) fbcplString ( value ) , 1 ) ;
}
if ( result_type & FBSQL_ASSOC )
{
add_assoc_string ( return_value , key , ( char * ) fbcplString ( value ) , 1 ) ;
}
}
2001-05-08 22:58:32 +00:00
}
2001-10-29 01:51:08 +00:00
else {
if ( result_type & FBSQL_NUM )
{
add_index_string ( return_value , 0 , estrdup ( fbaObjectAtIndex ( result - > array , result - > rowIndex ) ) , 0 ) ;
}
if ( result_type & FBSQL_ASSOC )
{
add_assoc_string ( return_value , " Database " , estrdup ( fbaObjectAtIndex ( result - > array , result - > rowIndex ) ) , 0 ) ;
}
2001-05-08 22:58:32 +00:00
}
2001-03-13 20:58:47 +00:00
}
2001-05-08 22:58:32 +00:00
else {
if ( result - > rowCount = = 0 ) {
RETURN_FALSE ;
}
if ( result - > rowCount = = 0x7fffffff )
2001-03-13 20:58:47 +00:00
{
2001-08-11 16:39:07 +00:00
if ( ! phpfbFetchRow ( result , result - > rowIndex ) ) {
2001-05-08 22:58:32 +00:00
RETURN_FALSE ;
2001-03-13 20:58:47 +00:00
}
}
2001-08-11 16:39:07 +00:00
row = fbcrhRowAtIndex ( result - > rowHandler , rowIndex ) ;
2001-05-08 22:58:32 +00:00
if ( row = = NULL )
2001-03-13 20:58:47 +00:00
{
2001-05-08 22:58:32 +00:00
RETURN_FALSE ;
}
for ( i = 0 ; i < result - > columnCount ; i + + )
{
if ( row [ i ] )
2001-03-13 20:58:47 +00:00
{
2004-02-09 17:58:04 +00:00
char * value ;
2001-05-08 22:58:32 +00:00
unsigned int length ;
unsigned int c = 0 ;
2002-07-02 21:36:11 +00:00
phpfbColumnAsString ( result , i , row [ i ] , & length , & value TSRMLS_CC ) ;
2001-05-08 22:58:32 +00:00
if ( result_type & FBSQL_NUM )
{
2001-08-11 16:39:07 +00:00
add_index_stringl ( return_value , i , value , length , c ) ;
2001-05-08 22:58:32 +00:00
c = 1 ;
}
if ( result_type & FBSQL_ASSOC )
{
char * key = ( char * ) fbccmdLabelName ( fbcmdColumnMetaDataAtIndex ( result - > metaData , i ) ) ;
2001-08-11 16:39:07 +00:00
add_assoc_stringl ( return_value , key , value , length , c ) ;
2001-05-08 22:58:32 +00:00
}
2001-03-13 20:58:47 +00:00
}
2001-05-08 22:58:32 +00:00
else
2001-03-13 20:58:47 +00:00
{
2001-05-08 22:58:32 +00:00
if ( result_type & FBSQL_NUM )
{
2001-08-11 16:39:07 +00:00
add_index_unset ( return_value , i ) ;
2001-05-08 22:58:32 +00:00
}
if ( result_type & FBSQL_ASSOC )
{
char * key = ( char * ) fbccmdLabelName ( fbcmdColumnMetaDataAtIndex ( result - > metaData , i ) ) ;
2001-08-11 16:39:07 +00:00
add_assoc_unset ( return_value , key ) ;
2001-05-08 22:58:32 +00:00
}
2001-03-13 20:58:47 +00:00
}
}
}
2001-07-12 22:43:25 +00:00
result - > rowIndex + + ;
2001-03-13 20:58:47 +00:00
result - > columnIndex = 0 ;
}
2003-06-15 15:29:46 +00:00
/* {{{ proto bool fbsql_data_seek(int result, int row_number)
2002-01-10 21:56:18 +00:00
Move the internal row counter to the specified row_number */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_data_seek )
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL , * * row_number = NULL ;
2002-01-23 17:48:31 +00:00
unsigned int rowIndex ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_result_index , & row_number ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
convert_to_long_ex ( row_number ) ;
rowIndex = Z_LVAL_PP ( row_number ) ;
2001-03-13 20:58:47 +00:00
2001-03-21 19:56:33 +00:00
if ( rowIndex < 0 )
2001-03-13 20:58:47 +00:00
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Illegal row_index (%d) " , rowIndex ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
2001-08-11 16:39:07 +00:00
if ( result - > rowCount = = 0x7fffffff ) phpfbFetchRow ( result , rowIndex ) ;
2001-03-13 20:58:47 +00:00
if ( rowIndex > result - > rowCount ) RETURN_FALSE ;
result - > rowIndex = rowIndex ;
2002-01-10 21:56:18 +00:00
result - > columnIndex = 0 ;
2001-03-13 20:58:47 +00:00
RETURN_TRUE ;
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-05-31 18:43:29 +00:00
/* {{{ proto array fbsql_fetch_lengths(int result)
2002-01-10 21:56:18 +00:00
Returns an array of the lengths of each column in the result set */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_fetch_lengths )
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL ;
int i ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-03-13 20:58:47 +00:00
if ( result - > row = = NULL ) RETURN_FALSE ;
2003-01-18 19:49:28 +00:00
array_init ( return_value ) ;
2001-03-13 20:58:47 +00:00
for ( i = 0 ; i < result - > columnCount ; i + + )
{
2004-02-09 17:58:04 +00:00
unsigned length = 0 ;
2002-07-02 21:36:11 +00:00
if ( result - > row [ i ] ) phpfbColumnAsString ( result , i , result - > row [ i ] , & length , NULL TSRMLS_CC ) ;
2001-03-13 20:58:47 +00:00
add_index_long ( return_value , i , length ) ;
}
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
/* {{{ proto object fbsql_fetch_field(int result [, int field_index])
2002-01-10 21:56:18 +00:00
Get the field properties for a specified field_index */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_fetch_field )
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL , * * field_index = NULL ;
int column = - 1 ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_result_index , & field_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-03-13 20:58:47 +00:00
column = result - > columnIndex ;
2001-05-31 18:43:29 +00:00
if ( field_index )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_long_ex ( field_index ) ;
column = Z_LVAL_PP ( field_index ) ;
if ( column < 0 | | column > = result - > columnCount )
2001-03-13 20:58:47 +00:00
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " %d no such column in result " , column ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
}
2003-01-30 02:33:16 +00:00
object_init ( return_value ) ;
2001-08-11 16:39:07 +00:00
add_property_string ( return_value , " name " , ( char * ) fbccmdLabelName ( fbcmdColumnMetaDataAtIndex ( result - > metaData , column ) ) , 1 ) ;
add_property_string ( return_value , " table " , ( char * ) fbccmdTableName ( fbcmdColumnMetaDataAtIndex ( result - > metaData , column ) ) , 1 ) ;
add_property_long ( return_value , " max_length " , fbcdmdLength ( fbccmdDatatype ( fbcmdColumnMetaDataAtIndex ( result - > metaData , column ) ) ) ) ;
add_property_string ( return_value , " type " , ( char * ) fbcdmdDatatypeString ( fbcmdDatatypeMetaDataAtIndex ( result - > metaData , column ) ) , 1 ) ;
2001-04-25 18:01:22 +00:00
add_property_long ( return_value , " not_null " , ! fbccmdIsNullable ( fbcmdColumnMetaDataAtIndex ( result - > metaData , column ) ) ) ;
2001-03-20 19:21:45 +00:00
/* Remember to add the rest */
2001-08-11 16:39:07 +00:00
/* add_property_long(return_value, "primary_key", IS_PRI_KEY(fbsql_field->flags)?1:0); */
/* add_property_long(return_value, "multiple_key", (fbsql_field->flags&MULTIPLE_KEY_FLAG?1:0)); */
/* add_property_long(return_value, "unique_key", (fbsql_field->flags&UNIQUE_KEY_FLAG?1:0)); */
2001-09-25 21:58:48 +00:00
/* add_property_long(return_value, "numeric", IS_NUM(Z_TYPE_P(fbsql_field))?1:0); */
2001-08-11 16:39:07 +00:00
/* add_property_long(return_value, "blob", IS_BLOB(fbsql_field->flags)?1:0); */
/* add_property_long(return_value, "unsigned", (fbsql_field->flags&UNSIGNED_FLAG?1:0)); */
/* add_property_long(return_value, "zerofill", (fbsql_field->flags&ZEROFILL_FLAG?1:0)); */
2001-03-20 19:21:45 +00:00
}
/* }}} */
2001-05-31 18:43:29 +00:00
/* {{{ proto bool fbsql_field_seek(int result [, int field_index])
2001-12-30 08:12:29 +00:00
? ? ? */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_field_seek )
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL , * * field_index = NULL ;
int column = - 1 ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_result_index , & field_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-03-13 20:58:47 +00:00
column = result - > columnIndex ;
2001-05-31 18:43:29 +00:00
if ( field_index )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_long_ex ( field_index ) ;
column = Z_LVAL_PP ( field_index ) ;
if ( column < 0 | | column > = result - > columnCount )
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " %d no such column in result " , column ) ;
2001-05-31 18:43:29 +00:00
RETURN_FALSE ;
}
2001-03-13 20:58:47 +00:00
}
result - > columnIndex = column ;
RETURN_TRUE ;
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-05-31 18:43:29 +00:00
/* {{{ proto string fbsql_field_name(int result [, int field_index])
2002-01-10 21:56:18 +00:00
Get the column name for a specified field_index */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_field_name )
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL , * * field_index = NULL ;
int column = - 1 ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_result_index , & field_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-03-13 20:58:47 +00:00
column = result - > columnIndex ;
2001-05-31 18:43:29 +00:00
if ( field_index )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_long_ex ( field_index ) ;
column = Z_LVAL_PP ( field_index ) ;
if ( column < 0 | | column > = result - > columnCount )
2001-03-13 20:58:47 +00:00
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " %d no such column in result " , column ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
}
if ( result - > list )
{
2001-08-11 16:39:07 +00:00
phpfbSqlResult ( INTERNAL_FUNCTION_PARAM_PASSTHRU , result , result - > rowIndex , 0 ) ;
2001-03-13 20:58:47 +00:00
}
else if ( result - > metaData )
{
2001-05-08 22:58:32 +00:00
RETURN_STRING ( ( char * ) fbccmdLabelName ( fbcmdColumnMetaDataAtIndex ( result - > metaData , column ) ) , 1 ) ;
2001-03-13 20:58:47 +00:00
result - > columnIndex = column ;
}
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
/* {{{ proto string fbsql_field_table(int result [, int field_index])
2002-01-10 21:56:18 +00:00
Get the table name for a specified field_index */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_field_table )
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL , * * field_index = NULL ;
int column = - 1 ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_result_index , & field_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-03-13 20:58:47 +00:00
column = result - > columnIndex ;
2001-05-31 18:43:29 +00:00
if ( field_index )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_long_ex ( field_index ) ;
column = Z_LVAL_PP ( field_index ) ;
if ( column < 0 | | column > = result - > columnCount )
2001-03-13 20:58:47 +00:00
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " %d no such column in result " , column ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
}
2001-08-11 16:39:07 +00:00
RETURN_STRING ( ( char * ) fbccmdTableName ( fbcmdColumnMetaDataAtIndex ( result - > metaData , column ) ) , 1 ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2003-06-15 15:29:46 +00:00
/* {{{ proto mixed fbsql_field_len(int result [, int field_index])
2002-01-10 21:56:18 +00:00
Get the column length for a specified field_index */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_field_len )
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL , * * field_index = NULL ;
int column = - 1 ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_result_index , & field_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-03-13 20:58:47 +00:00
column = result - > columnIndex ;
2001-05-31 18:43:29 +00:00
if ( field_index )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_long_ex ( field_index ) ;
column = Z_LVAL_PP ( field_index ) ;
if ( column < 0 | | column > = result - > columnCount )
2001-03-13 20:58:47 +00:00
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " %d no such column in result " , column ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
}
if ( result - > list )
{
2001-08-11 16:39:07 +00:00
phpfbSqlResult ( INTERNAL_FUNCTION_PARAM_PASSTHRU , result , result - > rowIndex , 2 ) ;
2001-03-13 20:58:47 +00:00
}
else if ( result - > metaData )
{
2001-08-11 16:39:07 +00:00
RETURN_LONG ( fbcdmdLength ( fbccmdDatatype ( fbcmdColumnMetaDataAtIndex ( result - > metaData , column ) ) ) ) ;
2001-03-13 20:58:47 +00:00
}
else
{
RETURN_FALSE ;
}
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
/* {{{ proto string fbsql_field_type(int result [, int field_index])
2002-01-10 21:56:18 +00:00
Get the field type for a specified field_index */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_field_type )
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL , * * field_index = NULL ;
int column = - 1 ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_result_index , & field_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-03-13 20:58:47 +00:00
column = result - > columnIndex ;
2001-05-31 18:43:29 +00:00
if ( field_index )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_long_ex ( field_index ) ;
column = Z_LVAL_PP ( field_index ) ;
if ( column < 0 | | column > = result - > columnCount )
2001-03-13 20:58:47 +00:00
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " %d no such column in result " , column ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
}
if ( result - > list )
{
2001-08-11 16:39:07 +00:00
phpfbSqlResult ( INTERNAL_FUNCTION_PARAM_PASSTHRU , result , result - > rowIndex , 1 ) ;
2001-03-13 20:58:47 +00:00
}
else if ( result - > metaData )
{
2001-05-08 22:58:32 +00:00
RETURN_STRING ( ( char * ) fbcdmdDatatypeString ( fbcmdDatatypeMetaDataAtIndex ( result - > metaData , column ) ) , 1 ) ;
2001-03-13 20:58:47 +00:00
}
else
{
RETURN_FALSE ;
}
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-05-31 18:43:29 +00:00
/* {{{ proto string fbsql_field_flags(int result [, int field_index])
2001-12-30 08:12:29 +00:00
? ? ? */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_field_flags )
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL , * * field_index = NULL ;
int column = - 1 ;
2001-04-25 18:01:22 +00:00
char buf [ 512 ] ;
2001-05-31 18:43:29 +00:00
int len ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_result_index , & field_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-03-13 20:58:47 +00:00
column = result - > columnIndex ;
2001-05-31 18:43:29 +00:00
if ( field_index )
2001-03-13 20:58:47 +00:00
{
2001-05-31 18:43:29 +00:00
convert_to_long_ex ( field_index ) ;
column = Z_LVAL_PP ( field_index ) ;
if ( column < 0 | | column > = result - > columnCount )
2001-03-13 20:58:47 +00:00
{
2001-10-29 01:51:08 +00:00
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " %d no such column in result " , column ) ;
2001-03-13 20:58:47 +00:00
RETURN_FALSE ;
}
}
2001-04-25 18:01:22 +00:00
strcpy ( buf , " " ) ;
if ( ! fbccmdIsNullable ( fbcmdColumnMetaDataAtIndex ( result - > metaData , column ) ) ) {
strcat ( buf , " not_null " ) ;
2001-03-13 20:58:47 +00:00
}
2001-04-25 18:01:22 +00:00
#if 0
if ( IS_PRI_KEY ( fbsql_field - > flags ) ) {
strcat ( buf , " primary_key " ) ;
}
if ( fbsql_field - > flags & UNIQUE_KEY_FLAG ) {
strcat ( buf , " unique_key " ) ;
}
if ( fbsql_field - > flags & MULTIPLE_KEY_FLAG ) {
strcat ( buf , " multiple_key " ) ;
}
if ( IS_BLOB ( fbsql_field - > flags ) ) {
strcat ( buf , " blob " ) ;
}
if ( fbsql_field - > flags & UNSIGNED_FLAG ) {
strcat ( buf , " unsigned " ) ;
}
if ( fbsql_field - > flags & ZEROFILL_FLAG ) {
strcat ( buf , " zerofill " ) ;
}
if ( fbsql_field - > flags & BINARY_FLAG ) {
strcat ( buf , " binary " ) ;
}
if ( fbsql_field - > flags & ENUM_FLAG ) {
strcat ( buf , " enum " ) ;
}
if ( fbsql_field - > flags & AUTO_INCREMENT_FLAG ) {
strcat ( buf , " auto_increment " ) ;
}
if ( fbsql_field - > flags & TIMESTAMP_FLAG ) {
strcat ( buf , " timestamp " ) ;
}
# endif
len = strlen ( buf ) ;
/* remove trailing space, if present */
if ( len & & buf [ len - 1 ] = = ' ' ) {
buf [ len - 1 ] = 0 ;
len - - ;
}
2001-05-08 22:58:32 +00:00
RETURN_STRING ( buf , 1 ) ;
2001-03-13 20:58:47 +00:00
}
2001-03-20 19:21:45 +00:00
/* }}} */
2002-02-06 19:24:02 +00:00
/* {{{ proto string fbsql_table_name(resource result, int index)
Retreive the table name for index after a call to fbsql_list_tables ( ) */
PHP_FUNCTION ( fbsql_table_name )
{
PHPFBResult * result = NULL ;
2004-02-09 17:58:04 +00:00
zval * * fbsql_result_index = NULL , * * table_index ;
2002-02-06 19:24:02 +00:00
unsigned index ;
2004-02-09 17:58:04 +00:00
char * value ;
2002-02-06 19:24:02 +00:00
unsigned int length ;
void * * row ;
switch ( ZEND_NUM_ARGS ( ) ) {
case 2 :
if ( zend_get_parameters_ex ( 2 , & fbsql_result_index , & table_index ) = = FAILURE ) {
RETURN_FALSE ;
}
convert_to_long_ex ( table_index ) ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
index = Z_LVAL_PP ( table_index ) ;
if ( index < 0 )
{
if ( FB_SQL_G ( generateWarnings ) )
2002-12-03 19:39:25 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Illegal index (%i) " , index ) ;
2002-02-06 19:24:02 +00:00
RETURN_FALSE ;
}
if ( result - > rowCount = = 0x7fffffff ) phpfbFetchRow ( result , index ) ;
if ( index > result - > rowCount ) RETURN_FALSE ;
result - > rowIndex = index ;
result - > columnIndex = 0 ;
row = fbcrhRowAtIndex ( result - > rowHandler , index ) ;
2002-07-02 21:36:11 +00:00
phpfbColumnAsString ( result , 0 , row [ 0 ] , & length , & value TSRMLS_CC ) ;
2002-02-06 19:24:02 +00:00
RETURN_STRINGL ( value , length , 1 ) ;
}
/* }}} */
/* {{{ proto bool fbsql_free_result(resource result)
2002-01-10 21:56:18 +00:00
free the memory used to store a result */
2001-03-13 20:58:47 +00:00
PHP_FUNCTION ( fbsql_free_result )
{
2001-05-31 18:43:29 +00:00
PHPFBResult * result = NULL ;
zval * * fbsql_result_index = NULL ;
2001-03-13 20:58:47 +00:00
2001-05-31 18:43:29 +00:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_result_index ) = = FAILURE ) {
RETURN_FALSE ;
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
2001-03-13 20:58:47 +00:00
}
2001-05-31 18:43:29 +00:00
ZEND_FETCH_RESOURCE ( result , PHPFBResult * , fbsql_result_index , - 1 , " FrontBase-Result " , le_result ) ;
2001-09-25 21:58:48 +00:00
zend_list_delete ( Z_LVAL_PP ( fbsql_result_index ) ) ;
2001-03-13 20:58:47 +00:00
RETURN_TRUE ;
}
2001-03-20 19:21:45 +00:00
/* }}} */
2001-03-13 20:58:47 +00:00
2001-07-10 22:34:24 +00:00
/* {{{ proto array fbsql_get_autostart_info([resource link_identifier])
2001-12-30 08:12:29 +00:00
? ? ? */
2001-07-10 22:34:24 +00:00
PHP_FUNCTION ( fbsql_get_autostart_info )
{
PHPFBLink * phpLink = NULL ;
zval * * fbsql_link_index = NULL ;
int id ;
FBCAutoStartInfo * asInfo ;
switch ( ZEND_NUM_ARGS ( ) ) {
case 0 :
2001-07-30 17:27:08 +00:00
id = php_fbsql_get_default_link ( INTERNAL_FUNCTION_PARAM_PASSTHRU ) ;
2001-07-10 22:34:24 +00:00
CHECK_LINK ( id ) ;
break ;
case 1 :
if ( zend_get_parameters_ex ( 1 , & fbsql_link_index ) = = FAILURE ) {
RETURN_FALSE ;
}
id = - 1 ;
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
ZEND_FETCH_RESOURCE2 ( phpLink , PHPFBLink * , fbsql_link_index , id , " FrontBase-Link " , le_link , le_plink ) ;
2004-02-09 17:58:04 +00:00
if ( phpLink - > execHandler = = NULL ) phpLink - > execHandler = fbcehHandlerForHost ( phpLink - > hostName , 128 ) ;
2001-07-10 22:34:24 +00:00
if ( phpLink - > execHandler = = NULL ) {
2002-12-03 19:39:25 +00:00
if ( FB_SQL_G ( generateWarnings ) )
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " No valid Exec handler available for this connection " ) ;
2001-07-10 22:34:24 +00:00
RETURN_FALSE ;
}
else {
array_init ( return_value ) ;
asInfo = fbcehGetAutoStartInfo ( phpLink - > execHandler ) ;
if ( asInfo ! = NULL ) {
unsigned i ;
for ( i = 0 ; i < fbaCount ( asInfo - > infoLines ) ; i + + ) {
FBArray * infoLine = fbaObjectAtIndex ( asInfo - > infoLines , i ) ;
2002-09-04 03:57:59 +00:00
/*
if ( fbaCount ( infoLine ) = = 2 ) {
fbaObjectAtIndex ( infoLine , 0 ) ;
fbaObjectAtIndex ( infoLine , 1 ) ;
}
else {
*/
2001-07-10 22:34:24 +00:00
add_index_string ( return_value , i , fbaObjectAtIndex ( infoLine , 0 ) , 1 ) ;
2002-09-04 03:57:59 +00:00
/* }
*/
2001-07-10 22:34:24 +00:00
}
}
}
}
/* }}} */
2001-03-13 20:58:47 +00:00
# endif
2001-06-06 13:06:12 +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-06-06 13:06:12 +00:00
*/