CVS update: php3/functions

From: Date: Tue, 02 Mar 1999 13:08:31 +0000
Subject: CVS update: php3/functions
Groups: php.dev 
Request: Send a blank email to php-dev+get-4433@lists.php.net to get a copy of this message
Date: Tuesday March 2, 1999 @ 8:08 Author: andrew Update of /repository/php3/functions In directory asf:/u/temp/cvs-serv13627/functions Modified Files: interbase.c php3_interbase.h Log Message: Many changes. ibase_prepare() and ibase_execute() now work ibase_query() support placeholders blobs read/write support added transactions redesign link and transaction handles combine in one variable some bugs killed and some new added... Index: php3/functions/interbase.c diff -c php3/functions/interbase.c:1.11 php3/functions/interbase.c:1.12 *** php3/functions/interbase.c:1.11 Sun Jan 31 12:57:27 1999 --- php3/functions/interbase.c Tue Mar 2 08:08:30 1999 *************** *** 1,36 **** /* +----------------------------------------------------------------------+ ! | PHP HTML Embedded Scripting Language Version 3.0 | +----------------------------------------------------------------------+ ! | Copyright (c) 1997-1999 PHP Development Team (See Credits file) | +----------------------------------------------------------------------+ | This program is free software; you can redistribute it and/or modify | ! | it under the terms of one of the following licenses: | ! | | | A) the GNU General Public License as published by the Free Software | ! | Foundation; either version 2 of the License, or (at your option) | ! | any later version. | ! | | ! | B) the PHP License as published by the PHP Development Team and | ! | included in the distribution in the file: LICENSE | ! | | ! | This program is distributed in the hope that it will be useful, | ! | but WITHOUT ANY WARRANTY; without even the implied warranty of | ! | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ! | GNU General Public License for more details. | ! | | ! | You should have received a copy of both licenses referred to here. | ! | If you did not, or have any questions about PHP licensing, please | ! | contact core@php.net. | +----------------------------------------------------------------------+ ! | Authors: Jouni Ahto <jah@cultnet.fi> | ! | Andrew Avdeev <andy@simgts.mv.ru> | +----------------------------------------------------------------------+ */ ! /* $Id: interbase.c,v 1.11 1999/01/31 17:57:27 andrew Exp $ */ ! /* TODO: A lot... */ #include "config.h" #include "php.h" --- 1,37 ---- /* +----------------------------------------------------------------------+ ! | PHP HTML Embedded Scripting Language Version 3.0 | +----------------------------------------------------------------------+ ! | Copyright (c) 1997-1999 PHP Development Team (See Credits file) | +----------------------------------------------------------------------+ | This program is free software; you can redistribute it and/or modify | ! | it under the terms of one of the following licenses: | ! | | | A) the GNU General Public License as published by the Free Software | ! | Foundation; either version 2 of the License, or (at your option) | ! | any later version. | ! | | ! | B) the PHP License as published by the PHP Development Team and | ! | included in the distribution in the file: LICENSE | ! | | ! | This program is distributed in the hope that it will be useful, | ! | but WITHOUT ANY WARRANTY; without even the implied warranty of | ! | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ! | GNU General Public License for more details. | ! | | ! | You should have received a copy of both licenses referred to here. | ! | If you did not, or have any questions about PHP licensing, please | ! | contact core@php.net. | +----------------------------------------------------------------------+ ! | Authors: Jouni Ahto <jah@cultnet.fi> | ! | Andrew Avdeev <andy@simgts.mv.ru> | +----------------------------------------------------------------------+ */ ! /* $Id: interbase.c,v 1.12 1999/03/02 13:08:30 andrew Exp $ */ ! /* TODO: Arrays, roles? ! A lot... */ #include "config.h" #include "php.h" *************** *** 42,49 **** #include <time.h> #include "php3_list.h" #include "php3_string.h" ! /* {{{ extension definition structures */ function_entry ibase_functions[] = { {"ibase_connect", php3_ibase_connect, NULL}, {"ibase_pconnect", php3_ibase_pconnect, NULL}, --- 43,52 ---- #include <time.h> #include "php3_list.h" #include "php3_string.h" + #include "fsock.h" + #include "head.h" ! /* {{{ extension definition structures */ /*FOLD00*/ function_entry ibase_functions[] = { {"ibase_connect", php3_ibase_connect, NULL}, {"ibase_pconnect", php3_ibase_pconnect, NULL}, *************** *** 51,82 **** {"ibase_query", php3_ibase_query, NULL}, {"ibase_fetch_row", php3_ibase_fetch_row, NULL}, {"ibase_fetch_object", php3_ibase_fetch_object,NULL}, ! {"ibase_free_result", php3_ibase_free_result, NULL}, {"ibase_prepare", php3_ibase_prepare, NULL}, - {"ibase_bind", php3_ibase_bind, NULL}, {"ibase_execute", php3_ibase_execute, NULL}, {"ibase_free_query", php3_ibase_free_query, NULL}, ! {"ibase_timefmt", php3_ibase_timefmt, NULL}, ! {"ibase_num_fields", php3_ibase_num_fields, NULL}, ! {"ibase_field_info", php3_ibase_field_info, NULL}, ! {"ibase_trans", php3_ibase_trans, NULL}, {"ibase_commit", php3_ibase_commit, NULL}, ! {"ibase_rollback", php3_ibase_rollback, NULL}, ! ! {"ibase_blob_info", php3_ibase_blob_info, NULL}, ! {"ibase_blob_create", php3_ibase_blob_create, NULL}, ! {"ibase_blob_add", php3_ibase_blob_add, NULL}, ! {"ibase_blob_cancel", php3_ibase_blob_cancel, NULL}, {"ibase_blob_close", php3_ibase_blob_close, NULL}, {"ibase_blob_open", php3_ibase_blob_open, NULL}, ! {"ibase_blob_get", php3_ibase_blob_get, NULL}, ! {"ibase_blob_echo", php3_ibase_blob_echo, NULL}, ! {"ibase_blob_import", php3_ibase_blob_import, NULL}, ! ! {"ibase_errmsg", php3_ibase_errmsg, NULL}, ! {NULL, NULL, NULL} }; php3_module_entry ibase_module_entry = --- 54,84 ---- {"ibase_query", php3_ibase_query, NULL}, {"ibase_fetch_row", php3_ibase_fetch_row, NULL}, {"ibase_fetch_object", php3_ibase_fetch_object,NULL}, ! {"ibase_free_result", php3_ibase_free_result, NULL}, {"ibase_prepare", php3_ibase_prepare, NULL}, {"ibase_execute", php3_ibase_execute, NULL}, {"ibase_free_query", php3_ibase_free_query, NULL}, ! {"ibase_timefmt", php3_ibase_timefmt, NULL}, ! {"ibase_num_fields", php3_ibase_num_fields, NULL}, ! {"ibase_field_info", php3_ibase_field_info, NULL}, ! {"ibase_trans", php3_ibase_trans, NULL}, {"ibase_commit", php3_ibase_commit, NULL}, ! {"ibase_rollback", php3_ibase_rollback, NULL}, ! ! {"ibase_blob_info", php3_ibase_blob_info, NULL}, ! {"ibase_blob_create", php3_ibase_blob_create, NULL}, ! {"ibase_blob_add", php3_ibase_blob_add, NULL}, ! {"ibase_blob_cancel", php3_ibase_blob_cancel, NULL}, {"ibase_blob_close", php3_ibase_blob_close, NULL}, {"ibase_blob_open", php3_ibase_blob_open, NULL}, ! {"ibase_blob_get", php3_ibase_blob_get, NULL}, ! {"ibase_blob_echo", php3_ibase_blob_echo, NULL}, ! {"ibase_blob_import", php3_ibase_blob_import, NULL}, ! ! {"ibase_errmsg", php3_ibase_errmsg, NULL}, ! {NULL, NULL, NULL} }; php3_module_entry ibase_module_entry = *************** *** 86,103 **** php3_minit_ibase, NULL, php3_rinit_ibase, ! NULL, ! /*php3_info_ibase*/ NULL, STANDARD_MODULE_PROPERTIES }; /* }}} */ - /* {{{ prototype for blob destructor */ - static void _php3_ibase_free_blob(ibase_blob_handle *ib_blob); /* }}} */ ! /* {{{ thread safety stuff */ #if defined(THREAD_SAFE) typedef ibase_global_struct{ ibase_module php3_ibase_module; --- 88,195 ---- php3_minit_ibase, NULL, php3_rinit_ibase, ! php3_rfinish_ibase, ! php3_info_ibase, STANDARD_MODULE_PROPERTIES }; /* }}} */ + + + /* {{{ internal macros and structs */ /*FOLD00*/ + + /* db_handle and transaction handle keep in one variable + link = db_handle * IBASE_TRANS_ON_LINK + trans_handle + */ + + /* get link and transaction from long argument + */ + #define GET_LINK_TRANS(link_id, ib_link, trans_n) { \ + int type; \ + trans_n = link_id % IBASE_TRANS_ON_LINK; \ + link_id /= IBASE_TRANS_ON_LINK; \ + ib_link = (ibase_db_link *) php3_list_find(link_id, &type); \ + if (type!=IBASE_GLOBAL(php3_ibase_module).le_link && type!=IBASE_GLOBAL(php3_ibase_module).le_plink) { \ + _php3_module_error("%d is not link or transaction index",link_id); \ + RETURN_FALSE; \ + }} + + + /* get query */ + #define GET_QUERY(query_id, ib_query) { \ + int type; \ + ib_query = (ibase_query *) php3_list_find(query_id, &type); \ + if (type!=IBASE_GLOBAL(php3_ibase_module).le_query) { \ + _php3_module_error("%d is not query index",query_id); \ + RETURN_FALSE; \ + }} + + /* get result */ + #define GET_RESULT(result_id, ib_result) { \ + int type; \ + ib_result = (ibase_result *) php3_list_find(result_id, &type); \ + if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) { \ + _php3_module_error("%d is not result index",result_id); \ + RETURN_FALSE; \ + }} + + + #define RESET_ERRMSG { IBASE_GLOBAL(php3_ibase_module).errmsg[0] = '\0';} + + #define TEST_ERRMSG ( IBASE_GLOBAL(php3_ibase_module).errmsg[0] != '\0') + + /* sql variables union + used for convert and binding input variables + */ + typedef struct{ + union{ + short sval; + float fval; + ISC_QUAD qval; + }val; + short sqlind; + }BIND_BUF; + + + /* get blob identifier from argument + */ + #define GET_BLOB_ID_ARG(blob_arg, ib_blob) \ + {\ + if(blob_arg->type != IS_STRING\ + || blob_arg->value.str.len != sizeof(ibase_blob_handle)\ + || ((ibase_blob_handle *)(blob_arg->value.str.val))->bl_handle != 0){\ + _php3_module_error("invalid blob id");\ + RETURN_FALSE;\ + }\ + ib_blob = (ibase_blob_handle *)blob_arg->value.str.val;\ + } + + + /* get blob handle from argument + note: blob already open when handle active + */ + #define GET_BLOB_HANDLE_ARG(blob_arg, blob_ptr) \ + { \ + int type; \ + convert_to_long(blob_arg); \ + blob_ptr = (ibase_blob_handle *) php3_list_find(blob_arg->value.lval, &type); \ + if (type!=IBASE_GLOBAL(php3_ibase_module).le_blob) { \ + _php3_module_error("%d is not blob handle",blob_arg->value.lval); \ + RETURN_FALSE; \ + } \ + } + + /* blob information struct */ + typedef struct { + ISC_LONG max_segment; /* Length of longest segment */ + ISC_LONG num_segments; /* Total number of segments */ + ISC_LONG total_length; /* Total length of blob */ + int bl_stream; /* blob is stream ? */ + }IBASE_BLOBINFO; /* }}} */ ! /* {{{ thread safety stuff */ /*FOLD00*/ #if defined(THREAD_SAFE) typedef ibase_global_struct{ ibase_module php3_ibase_module; *************** *** 115,214 **** ibase_module php3_ibase_module; #endif /* }}} */ - ! ! #define RESET_ERRMSG { IBASE_GLOBAL(php3_ibase_module).errmsg[0] = '\0';} ! #define TEST_ERRMSG ( IBASE_GLOBAL(php3_ibase_module).errmsg[0] != '\0') ! /* {{{ proto string ibase_errmsg() ! Return error message */ void php3_ibase_errmsg(INTERNAL_FUNCTION_PARAMETERS) { ! char *errmsg = IBASE_GLOBAL(php3_ibase_module).errmsg; ! IBASE_TLS_VARS; ! if(errmsg[0]){ ! RETURN_STRING(errmsg,1); ! } ! RETURN_FALSE; } /* }}} */ ! /* {{{ _php3_ibase_error(ISC_STATUS *status) ! print interbase error and save it for ibase_errmsg() */ static void _php3_ibase_error(ISC_STATUS *status) { ! char *s, *errmsg = IBASE_GLOBAL(php3_ibase_module).errmsg; s = errmsg; while((s - errmsg) < MAX_ERRMSG - (IBASE_MSGSIZE + 2) && isc_interprete(s, &status)){ ! strcat(errmsg, " "); s = errmsg + strlen(errmsg); } php3_error(E_WARNING, "InterBase: %s",errmsg); } /* }}} */ ! /* {{{ _php3_module_error(char *msg, ...) ! print php interbase module error and save it for ibase_errmsg() */ static void _php3_module_error(char *msg, ...) { ! char *errmsg = IBASE_GLOBAL(php3_ibase_module).errmsg; ! va_list ap; ! int len; va_start(ap, msg); len = vsnprintf(errmsg, MAX_ERRMSG - 1, msg, ap); ! va_end(ap); ! errmsg[len] = '\0'; ! php3_error(E_WARNING, "InterBase module: %s",errmsg); } /* }}} */ ! /* {{{ _php3_ibase_rollback_trans() */ ! static void _php3_ibase_rollback_trans(ibase_trans *ib_trans) { ISC_STATUS status[20]; ! IBASE_TLS_VARS; ! ! if(ib_trans->trans != NULL){ ! if(isc_rollback_transaction(status, &ib_trans->trans)){ _php3_ibase_error(status); } } - efree(ib_trans); } /* }}} */ ! /* {{{ _php3_ibase_close_link() */ static void _php3_ibase_close_link(ibase_db_link *link) { ISC_STATUS status[20]; IBASE_TLS_VARS; ! if(link->default_trans != NULL){ ! if(isc_rollback_transaction(status, &link->default_trans)){ ! _php3_ibase_error(status); ! } ! } isc_detach_database(status, &link->link); IBASE_GLOBAL(php3_ibase_module).num_links--; efree(link); } /* }}} */ ! /* {{{ _php3_ibase_close_plink() */ static void _php3_ibase_close_plink(ibase_db_link *link) { ISC_STATUS status[20]; IBASE_TLS_VARS; ! if(link->default_trans != NULL){ ! if(isc_rollback_transaction(status, &link->default_trans)){ ! _php3_ibase_error(status); ! } ! } isc_detach_database(status, &link->link); php3_ibase_module.num_persistent--; php3_ibase_module.num_links--; --- 207,329 ---- ibase_module php3_ibase_module; #endif /* }}} */ ! /* error handling ---------------------------- */ ! /* {{{ proto string ibase_errmsg() */ /*FOLD00*/ ! /* Return error message */ void php3_ibase_errmsg(INTERNAL_FUNCTION_PARAMETERS) { ! char *errmsg = IBASE_GLOBAL(php3_ibase_module).errmsg; ! IBASE_TLS_VARS; ! if(errmsg[0]){ ! RETURN_STRING(errmsg,1); ! } ! RETURN_FALSE; } /* }}} */ ! ! /* {{{ _php3_ibase_error() */ /*FOLD00*/ ! /* print interbase error and save it for ibase_errmsg() */ static void _php3_ibase_error(ISC_STATUS *status) { ! char *s, *errmsg = IBASE_GLOBAL(php3_ibase_module).errmsg; s = errmsg; while((s - errmsg) < MAX_ERRMSG - (IBASE_MSGSIZE + 2) && isc_interprete(s, &status)){ ! strcat(errmsg, " "); s = errmsg + strlen(errmsg); } php3_error(E_WARNING, "InterBase: %s",errmsg); } /* }}} */ + ! /* {{{ _php3_module_error() */ /*FOLD00*/ ! /* print php interbase module error and save it for ibase_errmsg() */ static void _php3_module_error(char *msg, ...) { ! char *errmsg = IBASE_GLOBAL(php3_ibase_module).errmsg; ! va_list ap; ! int len; va_start(ap, msg); len = vsnprintf(errmsg, MAX_ERRMSG - 1, msg, ap); ! va_end(ap); ! errmsg[len] = '\0'; ! php3_error(E_WARNING, "InterBase module: %s",errmsg); } /* }}} */ + + + /* destructors ---------------------- */ + + + /* {{{ _php3_ibase_free_xsqlda() */ /*FOLD00*/ + /* not actual destructor ... */ + static void _php3_ibase_free_xsqlda(XSQLDA *sqlda) + { + int i; + XSQLVAR *var; + + if(sqlda){ + var = sqlda->sqlvar; + for (i = 0; i < sqlda->sqld; i++, var++) { + efree(var->sqldata); + if(var->sqlind) + efree(var->sqlind); + } + efree(sqlda); + } + } + /* }}} */ + ! /* {{{ _php3_ibase_commit_link() */ /*FOLD00*/ ! static void _php3_ibase_commit_link(ibase_db_link *link) { ISC_STATUS status[20]; ! int i; ! ! if(link->trans[0] != NULL){ /* commit default */ ! if(isc_commit_transaction(status, &link->trans[0])){ _php3_ibase_error(status); } + } + for(i = 1; i < IBASE_TRANS_ON_LINK; i++){ + if(link->trans[i] != NULL){ + if(isc_rollback_transaction(status, &link->trans[i])){ + _php3_ibase_error(status); + } + } } } /* }}} */ ! ! /* {{{ _php3_ibase_close_link() */ /*FOLD00*/ static void _php3_ibase_close_link(ibase_db_link *link) { ISC_STATUS status[20]; IBASE_TLS_VARS; ! _php3_ibase_commit_link(link); isc_detach_database(status, &link->link); IBASE_GLOBAL(php3_ibase_module).num_links--; efree(link); } /* }}} */ ! ! /* {{{ _php3_ibase_close_plink() */ /*FOLD00*/ static void _php3_ibase_close_plink(ibase_db_link *link) { ISC_STATUS status[20]; IBASE_TLS_VARS; ! _php3_ibase_commit_link(link); isc_detach_database(status, &link->link); php3_ibase_module.num_persistent--; php3_ibase_module.num_links--; *************** *** 216,267 **** } /* }}} */ ! /* {{{ _php3_ibase_free_result() */ ! static void _php3_ibase_free_result(ibase_result_handle *result) { - int i; ISC_STATUS status[20]; ! IBASE_TLS_VARS; ! ! if (result->trans_single) { /*FIXME : commit or rollback?*/ ! isc_commit_transaction(status, &result->trans_handle); ! } ! if (result->sqlda != NULL) { ! for (i = 0; i < result->sqlda->sqld; i++) { ! efree(result->sqlda->sqlvar[i].sqldata); ! efree(result->sqlda->sqlvar[i].sqlind); } ! efree(result->sqlda); } - isc_dsql_free_statement(status, &result->result, DSQL_drop); - efree(result); } /* }}} */ ! /* {{{ _php3_ibase_free_query() */ ! static void _php3_ibase_free_query(ibase_query_handle *query) { - int i; ISC_STATUS status[20]; ! if (query->trans_single) { /*FIXME : commit or rollback?*/ ! isc_commit_transaction(status, &query->trans_handle); ! } ! if (query->sqlda != NULL) { ! if (query->alloced) { ! for (i = 0; i < query->sqlda->sqld; i++) { ! efree(query->sqlda->sqlvar[i].sqldata); ! efree(query->sqlda->sqlvar[i].sqlind); } } - efree(query->sqlda); } ! isc_dsql_free_statement(status, &query->query, DSQL_drop); ! efree(query); } /* }}} */ ! /* {{{ startup, shutdown and info functions */ int php3_minit_ibase(INIT_FUNC_ARGS) { IBASE_TLS_VARS; --- 331,399 ---- } /* }}} */ ! ! /* {{{ _php3_ibase_free_result() */ /*FOLD00*/ ! static void _php3_ibase_free_result(ibase_result *ib_result) { ISC_STATUS status[20]; ! ! if (ib_result){ ! _php3_ibase_free_xsqlda(ib_result->out_sqlda); ! if(ib_result->drop_stmt && ib_result->stmt){ ! if(isc_dsql_free_statement(status, &ib_result->stmt, DSQL_drop)){ ! _php3_ibase_error(status); ! } ! }else{ ! if(isc_dsql_free_statement(status, &ib_result->stmt, DSQL_close)){ ! _php3_ibase_error(status); ! } } ! efree(ib_result); } } /* }}} */ ! ! /* {{{ _php3_ibase_free_query() */ /*FOLD00*/ ! static void _php3_ibase_free_query(ibase_query *ib_query) { ISC_STATUS status[20]; ! if(ib_query){ ! if (ib_query->in_sqlda) { ! efree(ib_query->in_sqlda); ! } ! if (ib_query->out_sqlda) { ! efree(ib_query->out_sqlda); ! } ! if(ib_query->stmt){ ! if(isc_dsql_free_statement(status, &ib_query->stmt, DSQL_drop)){ ! _php3_ibase_error(status); } + } + efree(ib_query); + } + } + /* }}} */ + + + /* {{{ _php3_ibase_free_blob() */ /*FOLD00*/ + static void _php3_ibase_free_blob(ibase_blob_handle *ib_blob) + { + ISC_STATUS status[20]; + IBASE_TLS_VARS; + + if(ib_blob->bl_handle != NULL){ /* blob open*/ + if(isc_cancel_blob(status, &ib_blob->bl_handle)){ + _php3_ibase_error(status); } } ! efree(ib_blob); } /* }}} */ ! ! /* {{{ startup, shutdown and info functions */ /*FOLD00*/ int php3_minit_ibase(INIT_FUNC_ARGS) { IBASE_TLS_VARS; *************** *** 284,295 **** IBASE_GLOBAL(php3_ibase_module).default_password = ""; } if (cfg_get_string("ibase.timeformat", &IBASE_GLOBAL(php3_ibase_module).timeformat) == FAILURE) { ! IBASE_GLOBAL(php3_ibase_module).cfg_timeformat = "%Y-%m-%d %H:%M:%S"; } IBASE_GLOBAL(php3_ibase_module).num_persistent=0; IBASE_GLOBAL(php3_ibase_module).le_result = register_list_destructors(_php3_ibase_free_result, NULL); IBASE_GLOBAL(php3_ibase_module).le_query = register_list_destructors(_php3_ibase_free_query, NULL); - IBASE_GLOBAL(php3_ibase_module).le_trans = register_list_destructors(_php3_ibase_rollback_trans, NULL); IBASE_GLOBAL(php3_ibase_module).le_blob = register_list_destructors(_php3_ibase_free_blob, NULL); IBASE_GLOBAL(php3_ibase_module).le_link = register_list_destructors(_php3_ibase_close_link, NULL); IBASE_GLOBAL(php3_ibase_module).le_plink = register_list_destructors(NULL, _php3_ibase_close_plink); --- 416,426 ---- IBASE_GLOBAL(php3_ibase_module).default_password = ""; } if (cfg_get_string("ibase.timeformat", &IBASE_GLOBAL(php3_ibase_module).timeformat) == FAILURE) { ! IBASE_GLOBAL(php3_ibase_module).cfg_timeformat = "%m/%d/%Y %H:%M:%S"; } IBASE_GLOBAL(php3_ibase_module).num_persistent=0; IBASE_GLOBAL(php3_ibase_module).le_result = register_list_destructors(_php3_ibase_free_result, NULL); IBASE_GLOBAL(php3_ibase_module).le_query = register_list_destructors(_php3_ibase_free_query, NULL); IBASE_GLOBAL(php3_ibase_module).le_blob = register_list_destructors(_php3_ibase_free_blob, NULL); IBASE_GLOBAL(php3_ibase_module).le_link = register_list_destructors(_php3_ibase_close_link, NULL); IBASE_GLOBAL(php3_ibase_module).le_plink = register_list_destructors(NULL, _php3_ibase_close_plink); *************** *** 322,335 **** efree(IBASE_GLOBAL(php3_ibase_module).errmsg); return SUCCESS; } ! void php3_info_ibase(void) { ! /* TODO */ } /* }}} */ ! /* {{{ _php_ibase_attach_db() */ static int _php_ibase_attach_db(char *server, char *uname, char *passwd, char *charset, int buffers, char *role, isc_db_handle *db) { char dpb_buffer[256], *dpb, *p; --- 453,468 ---- efree(IBASE_GLOBAL(php3_ibase_module).errmsg); return SUCCESS; } + ! void php3_info_ibase(void) /*FOLD00*/ { ! php3_printf(""); } /* }}} */ ! ! /* {{{ _php_ibase_attach_db() */ /*FOLD00*/ static int _php_ibase_attach_db(char *server, char *uname, char *passwd, char *charset, int buffers, char *role, isc_db_handle *db) { char dpb_buffer[256], *dpb, *p; *************** *** 382,410 **** dpb_length = dpb - dpb_buffer; ! if(isc_attach_database(status, strlen(server), server, db, dpb_length, dpb_buffer)){ _php3_ibase_error(status); return 1; } return 0; } /* }}} */ ! /* {{{ _php3_ibase_connect() */ static void _php3_ibase_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) { pval *server, *uname, *passwd; char *ib_server, *ib_uname, *ib_passwd; ! int ib_server_len, ib_uname_len, ib_passwd_len; isc_db_handle db_handle = NULL; char *hashed_details; int hashed_details_length; ibase_db_link *ib_link; ! IBASE_TLS_VARS; ! ! RESET_ERRMSG; ! ib_uname = IBASE_GLOBAL(php3_ibase_module).default_user; ib_passwd = IBASE_GLOBAL(php3_ibase_module).default_password; ib_uname_len = ib_uname ? strlen(ib_uname) : 0; --- 515,544 ---- dpb_length = dpb - dpb_buffer; ! if(isc_attach_database(status, strlen(server), server, db, dpb_length, dpb_buffer)){ _php3_ibase_error(status); return 1; } return 0; } /* }}} */ + ! /* {{{ _php3_ibase_connect() */ /*FOLD00*/ static void _php3_ibase_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) { pval *server, *uname, *passwd; char *ib_server, *ib_uname, *ib_passwd; ! int i, ib_server_len, ib_uname_len, ib_passwd_len; isc_db_handle db_handle = NULL; char *hashed_details; int hashed_details_length; ibase_db_link *ib_link; ! IBASE_TLS_VARS; ! ! RESET_ERRMSG; ! ib_uname = IBASE_GLOBAL(php3_ibase_module).default_user; ib_passwd = IBASE_GLOBAL(php3_ibase_module).default_password; ib_uname_len = ib_uname ? strlen(ib_uname) : 0; *************** *** 490,496 **** ib_link = (ibase_db_link *) malloc(sizeof(ibase_db_link)); ib_link->link = db_handle; ! ib_link->default_trans = NULL; /* hash it up */ new_le.type = php3_ibase_module.le_plink; new_le.ptr = ib_link; --- 624,632 ---- ib_link = (ibase_db_link *) malloc(sizeof(ibase_db_link)); ib_link->link = db_handle; ! for(i = 0; i < IBASE_TRANS_ON_LINK; i++) ! ib_link->trans[i] = NULL; ! /* hash it up */ new_le.type = php3_ibase_module.le_plink; new_le.ptr = ib_link; *************** *** 507,520 **** } /* TODO: ensure that the ib_link did not die */ ib_link = (ibase_db_link *) le->ptr; - ib_link->default_trans = NULL; } ! return_value->value.lval = php3_list_insert(ib_link, IBASE_GLOBAL(php3_ibase_module).le_plink); return_value->type = IS_LONG; } else { list_entry *index_ptr, new_index_ptr; ! /* first we check the hash for the hashed_details key. if it exists, * it should point us to the right offset where the actual ib_link sits. * if it doesn't, open a new ib_link, add it to the resource list, * and add a pointer to it with hashed_details as the key. --- 643,656 ---- } /* TODO: ensure that the ib_link did not die */ ib_link = (ibase_db_link *) le->ptr; } ! return_value->value.lval = IBASE_TRANS_ON_LINK * ! php3_list_insert(ib_link, IBASE_GLOBAL(php3_ibase_module).le_plink); return_value->type = IS_LONG; } else { list_entry *index_ptr, new_index_ptr; ! /* first we check the hash for the hashed_details key. if it exists, * it should point us to the right offset where the actual ib_link sits. * if it doesn't, open a new ib_link, add it to the resource list, * and add a pointer to it with hashed_details as the key. *************** *** 527,533 **** RETURN_FALSE; } xlink = (int) index_ptr->ptr; ! ptr = php3_list_find(xlink,&type); /* check if the xlink is still there */ if (ptr && (type==IBASE_GLOBAL(php3_ibase_module).le_link || type==IBASE_GLOBAL(php3_ibase_module).le_plink)) { return_value->value.lval = IBASE_GLOBAL(php3_ibase_module).default_link = xlink; return_value->type = IS_LONG; --- 663,669 ---- RETURN_FALSE; } xlink = (int) index_ptr->ptr; ! ptr = php3_list_find(xlink,&type); /* check if the xlink is still there */ if (ptr && (type==IBASE_GLOBAL(php3_ibase_module).le_link || type==IBASE_GLOBAL(php3_ibase_module).le_plink)) { return_value->value.lval = IBASE_GLOBAL(php3_ibase_module).default_link = xlink; return_value->type = IS_LONG; *************** *** 551,560 **** ib_link = (ibase_db_link *) emalloc(sizeof(ibase_db_link)); ib_link->link = db_handle; ! ib_link->default_trans = NULL; /* add it to the list */ ! return_value->value.lval = php3_list_insert(ib_link, IBASE_GLOBAL(php3_ibase_module).le_link); return_value->type = IS_LONG; /* add it to the hash */ --- 687,698 ---- ib_link = (ibase_db_link *) emalloc(sizeof(ibase_db_link)); ib_link->link = db_handle; ! for(i = 0; i < IBASE_TRANS_ON_LINK; i++) ! ib_link->trans[i] = NULL; /* add it to the list */ ! return_value->value.lval = IBASE_TRANS_ON_LINK * ! php3_list_insert(ib_link, IBASE_GLOBAL(php3_ibase_module).le_link); return_value->type = IS_LONG; /* add it to the hash */ *************** *** 571,603 **** } /* }}} */ ! /* {{{ proto int ibase_connect(string database [, string username] [, string password]) ! Open a connection to an InterBase database */ void php3_ibase_connect(INTERNAL_FUNCTION_PARAMETERS) { _php3_ibase_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); } /* }}} */ ! /* {{{ proto int ibase_pconnect(string database [, string username] [, string password]) ! Open a persistent connection to an InterBase database */ void php3_ibase_pconnect(INTERNAL_FUNCTION_PARAMETERS) { _php3_ibase_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); } /* }}} */ ! /* {{{ proto int ibase_close([int link_identifier]) ! Close an InterBase connection */ void php3_ibase_close(INTERNAL_FUNCTION_PARAMETERS) { pval *link_arg; ibase_db_link *ib_link; ! int link_id, type; IBASE_TLS_VARS; - RESET_ERRMSG; - switch (ARG_COUNT(ht)) { case 0: link_id = IBASE_GLOBAL(php3_ibase_module).default_link; --- 709,744 ---- } /* }}} */ ! ! /* {{{ proto int ibase_connect(string database [, string username] [, string password]) */ /*FOLD00*/ ! /* Open a connection to an InterBase database */ void php3_ibase_connect(INTERNAL_FUNCTION_PARAMETERS) { _php3_ibase_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); } /* }}} */ + ! /* {{{ proto int ibase_pconnect(string database [, string username] [, string password]) */ /*FOLD00*/ ! /* Open a persistent connection to an InterBase database */ void php3_ibase_pconnect(INTERNAL_FUNCTION_PARAMETERS) { _php3_ibase_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); } /* }}} */ ! ! /* {{{ proto int ibase_close([int link_identifier]) */ /*FOLD00*/ ! /* Close an InterBase connection */ void php3_ibase_close(INTERNAL_FUNCTION_PARAMETERS) { pval *link_arg; ibase_db_link *ib_link; ! int link_id, trans_n; IBASE_TLS_VARS; + + RESET_ERRMSG; switch (ARG_COUNT(ht)) { case 0: link_id = IBASE_GLOBAL(php3_ibase_module).default_link; *************** *** 614,823 **** break; } ! ib_link = (ibase_db_link *) php3_list_find(link_id, &type); ! if (type!=IBASE_GLOBAL(php3_ibase_module).le_link && type!=IBASE_GLOBAL(php3_ibase_module).le_plink) { ! _php3_module_error("%d is not link index",link_id); ! RETURN_FALSE; ! } php3_list_delete(link_id); RETURN_TRUE; } /* }}} */ ! /* {{{ _php3_ibase_prepare() */ ! static XSQLDA *_php3_ibase_prepare(isc_db_handle db, isc_tr_handle tr, isc_stmt_handle *query_handle, char *query) { ! ISC_STATUS status[20]; ! XSQLDA *isqlda; ! isqlda = (XSQLDA *) emalloc(XSQLDA_LENGTH(0)); ! isqlda->sqln = 0; ! isqlda->version = SQLDA_VERSION1; ! if (isc_dsql_allocate_statement(status, &db, query_handle)) { ! efree(isqlda); _php3_ibase_error(status); ! return NULL; } ! if (isc_dsql_prepare(status, &tr, query_handle, 0, query, 1, isqlda)) { ! efree(isqlda); _php3_ibase_error(status); ! return NULL; } - - /* - * Check if query has placeholders and needs binding. If it has, allocate - * input sqlda big enough and return it. - */ ! ! if (isc_dsql_describe_bind(status, query_handle, 1, isqlda)) { ! efree(isqlda); _php3_ibase_error(status); ! return NULL; } ! ! if (isqlda->sqld > 1) { ! isqlda = (XSQLDA *) erealloc(isqlda, XSQLDA_LENGTH(isqlda->sqld)); ! isqlda->sqln = isqlda->sqld; ! isqlda->version = SQLDA_VERSION1; ! if (isc_dsql_describe(status, query_handle, 1, isqlda)) { ! efree(isqlda); _php3_ibase_error(status); ! return NULL; } - return isqlda; - } else if (isqlda->sqld == 1) { - return isqlda; - } else { - efree(isqlda); - return NULL; } } /* }}} */ ! /* {{{ _php3_ibase_execute() */ ! static XSQLDA *_php3_ibase_execute(isc_tr_handle tr_handle, isc_stmt_handle query_handle, XSQLDA *isqlda, ISC_STATUS *status) { ! int i, coltype; ! static char query_info[] = { isc_info_sql_stmt_type }; ! char info_buffer[18]; ! short l; ! long query_type; ! XSQLDA *osqlda; ! /* ! * Find out what kind of query is to be executed. ! */ ! if (!isc_dsql_sql_info(status, &query_handle, sizeof(query_info), query_info, sizeof(info_buffer), info_buffer)) { ! l = (short) isc_vax_integer((char ISC_FAR *) info_buffer + 1, 2); ! query_type = isc_vax_integer((char ISC_FAR *) info_buffer + 3, l); ! } - if (query_type == isc_info_sql_stmt_select || query_type == isc_info_sql_stmt_select_for_upd) { - /* - * Select, need to allocate output sqlda and and prepare it for use. - */ ! osqlda = (XSQLDA *) emalloc(XSQLDA_LENGTH(0)); ! osqlda->sqln = 0; ! osqlda->version = SQLDA_VERSION1; ! if (isc_dsql_describe(status, &query_handle, 1, osqlda)) { ! efree(osqlda); ! _php3_ibase_error(status); ! return NULL; ! } ! if (osqlda->sqld) { ! osqlda = (XSQLDA *) erealloc(osqlda, XSQLDA_LENGTH(osqlda->sqld)); ! osqlda->sqln = osqlda->sqld; ! osqlda->version = SQLDA_VERSION1; ! if (isc_dsql_describe(status, &query_handle, 1, osqlda)) { ! efree(osqlda); ! _php3_ibase_error(status); ! return NULL; ! } } ! for (i = 0; i < osqlda->sqld; i++) { ! osqlda->sqlvar[i].sqlind = (short *) emalloc(sizeof(short)); ! coltype = osqlda->sqlvar[i].sqltype & ~1; ! switch(coltype) ! { ! case SQL_TEXT: ! osqlda->sqlvar[i].sqldata = (char *) emalloc(sizeof(char)*(osqlda->sqlvar[i].sqllen)); ! break; ! case SQL_VARYING: ! osqlda->sqlvar[i].sqldata = (char *) emalloc(sizeof(char)*(osqlda->sqlvar[i].sqllen+2)); ! break; ! case SQL_SHORT: ! osqlda->sqlvar[i].sqldata = (char *) emalloc(sizeof(short)); ! break; ! case SQL_LONG: ! osqlda->sqlvar[i].sqldata = (char *) emalloc(sizeof(long)); ! break; ! case SQL_FLOAT: ! osqlda->sqlvar[i].sqldata = (char *) emalloc(sizeof(float)); ! break; ! case SQL_DOUBLE: ! osqlda->sqlvar[i].sqldata = (char *) emalloc(sizeof(double)); ! break; ! case SQL_DATE: ! osqlda->sqlvar[i].sqldata = (char *) emalloc(sizeof(ISC_QUAD)); ! break; ! case SQL_BLOB: ! osqlda->sqlvar[i].sqldata = (char *) emalloc(sizeof(ISC_QUAD)); ! break; ! case SQL_ARRAY: ! osqlda->sqlvar[i].sqldata = (char *) emalloc(sizeof(ISC_QUAD)); ! break; ! } } ! if (isqlda == NULL) { ! if (isc_dsql_execute(status, &tr_handle, &query_handle, 1, NULL)) { ! efree(osqlda); ! _php3_ibase_error(status); ! return NULL; ! } else { ! return osqlda; ! } ! } else { ! if (isc_dsql_execute2(status, &tr_handle, &query_handle, 1, isqlda, osqlda)) { ! efree(osqlda); ! _php3_ibase_error(status); ! return NULL; ! } else { ! return osqlda; ! } ! } ! } else { ! /* Not select */ ! if (isc_dsql_execute(status, &tr_handle, &query_handle, 1, isqlda)) { ! _php3_ibase_error(status); ! return NULL; } } ! ! return NULL; } /* }}} */ - - #define GET_TRANS_ARG(trans_arg,trans_ptr) { \ - int type; \ - convert_to_long(trans_arg); \ - trans_ptr = (ibase_trans *) php3_list_find(trans_arg->value.lval, &type);\ - if (type!=IBASE_GLOBAL(php3_ibase_module).le_trans) {\ - _php3_module_error("%d is not transaction index",trans_arg->value.lval);\ - RETURN_FALSE;\ - } \ - } - - #define TRANS_HANDLE(ib_trans,ib_link) \ - (ib_trans ? ib_trans->trans : (ib_link->default_trans ? ib_link->default_trans : 0)) ! ! /* {{{ proto int ibase_trans([int link_identifier, ][string trans_args]) ! Start transaction */ void php3_ibase_trans(INTERNAL_FUNCTION_PARAMETERS) { pval *link_arg, *trans_arg; char tpb[20], *tpbp = NULL, *trans_args = NULL; ! int tpb_len = 0, link_id, trans_id, type, trans_def = 0; ibase_db_link *ib_link; - ibase_trans *ib_trans; - isc_tr_handle tr_handle = NULL; ISC_STATUS status[20]; IBASE_TLS_VARS; ! RESET_ERRMSG; ! switch (ARG_COUNT(ht)) { case 0: link_id = IBASE_GLOBAL(php3_ibase_module).default_link; --- 755,1072 ---- break; } ! GET_LINK_TRANS(link_id, ib_link, trans_n); php3_list_delete(link_id); RETURN_TRUE; } /* }}} */ ! ! /* {{{ _php3_ibase_alloc_query() */ /*FOLD00*/ ! /* allocate and prepare query */ ! static int _php3_ibase_alloc_query(ibase_query **ib_queryp, isc_db_handle link, isc_tr_handle trans, char *query) { ! #define IB_QUERY (*ib_queryp) ! ISC_STATUS status[20]; ! IB_QUERY = emalloc(sizeof(ibase_query)); ! IB_QUERY->link = link; ! IB_QUERY->trans = trans; ! IB_QUERY->stmt = NULL; ! ! if (isc_dsql_allocate_statement(status, &link, &IB_QUERY->stmt)) { _php3_ibase_error(status); ! efree(IB_QUERY); ! IB_QUERY=NULL; ! return FAILURE; } ! IB_QUERY->out_sqlda = emalloc(XSQLDA_LENGTH(0)); ! IB_QUERY->out_sqlda->sqln = 0; ! IB_QUERY->out_sqlda->version = SQLDA_VERSION1; ! ! if (isc_dsql_prepare(status, &IB_QUERY->trans, &IB_QUERY->stmt, 0, query, SQLDA_VERSION1, IB_QUERY->out_sqlda)) { _php3_ibase_error(status); ! efree(IB_QUERY->out_sqlda); ! efree(IB_QUERY); ! IB_QUERY = NULL; ! return FAILURE; ! } ! /* not enough output variables ? */ ! if(IB_QUERY->out_sqlda->sqld > IB_QUERY->out_sqlda->sqln){ ! IB_QUERY->out_sqlda = erealloc(IB_QUERY->out_sqlda,XSQLDA_LENGTH(IB_QUERY->out_sqlda->sqld)); ! IB_QUERY->out_sqlda->sqln = IB_QUERY->out_sqlda->sqld; ! IB_QUERY->out_sqlda->version = SQLDA_VERSION1; ! if (isc_dsql_describe(status, &IB_QUERY->stmt, SQLDA_VERSION1, IB_QUERY->out_sqlda)) { ! _php3_ibase_error(status); ! efree(IB_QUERY->out_sqlda); ! efree(IB_QUERY); ! IB_QUERY = NULL; ! return FAILURE; ! } } ! /* maybe have input placeholders? */ ! IB_QUERY->in_sqlda = emalloc(XSQLDA_LENGTH(0)); ! IB_QUERY->in_sqlda->sqln = 0; ! IB_QUERY->in_sqlda->version = SQLDA_VERSION1; ! if (isc_dsql_describe_bind(status, &IB_QUERY->stmt, SQLDA_VERSION1, IB_QUERY->in_sqlda)) { ! efree(IB_QUERY->out_sqlda); ! efree(IB_QUERY->in_sqlda); ! efree(IB_QUERY); ! IB_QUERY = NULL; _php3_ibase_error(status); ! return FAILURE; } ! /* not enough input variables ? */ ! if(IB_QUERY->in_sqlda->sqln < IB_QUERY->in_sqlda->sqld){ ! IB_QUERY->in_sqlda = erealloc(IB_QUERY->in_sqlda,XSQLDA_LENGTH(IB_QUERY->in_sqlda->sqld)); ! IB_QUERY->in_sqlda->sqln = IB_QUERY->in_sqlda->sqld; ! IB_QUERY->in_sqlda->version = SQLDA_VERSION1; ! if (isc_dsql_describe_bind(status, &IB_QUERY->stmt, SQLDA_VERSION1, IB_QUERY->in_sqlda)) { ! efree(IB_QUERY->out_sqlda); ! efree(IB_QUERY->in_sqlda); ! efree(IB_QUERY); ! IB_QUERY = NULL; _php3_ibase_error(status); ! return FAILURE; } } + + /* no, haven't placeholders at all */ + if(IB_QUERY->in_sqlda->sqld == 0){ + efree(IB_QUERY->in_sqlda); + IB_QUERY->in_sqlda = NULL; + } + + if(IB_QUERY->out_sqlda->sqld == 0){ + efree(IB_QUERY->out_sqlda); + IB_QUERY->out_sqlda = NULL; + } + + return SUCCESS; + #undef IB_QUERY } /* }}} */ + ! /* {{{ _php3_ibase_bind() */ /*FOLD00*/ ! /* bind php variables to XSQLDA */ ! static int _php3_ibase_bind(XSQLDA *sqlda, pval **b_vars, BIND_BUF *buf) { ! XSQLVAR *var; ! pval *b_var; ! int i; ! ! var = sqlda->sqlvar; ! for(i = 0; i < sqlda->sqld; var++, i++) { /* binded vars */ ! buf[i].sqlind = 0; ! var->sqlind = &buf[i].sqlind; ! b_var = b_vars[i]; ! switch(var->sqltype & ~1) { ! case SQL_TEXT: /* direct to variable */ ! case SQL_VARYING: ! convert_to_string(b_var); ! var->sqldata = (void ISC_FAR *)b_var->value.str.val; ! var->sqllen = b_var->value.str.len; ! var->sqltype = SQL_TEXT + (var->sqltype & 1); ! break; ! case SQL_SHORT: ! convert_to_long(b_var); ! if(b_var->value.lval > SHRT_MAX || b_var->value.lval < SHRT_MIN){ ! _php3_module_error("field %*s overflow", var->aliasname_length, var->aliasname); ! return FAILURE; ! } ! buf[i].val.sval = (short)b_var->value.lval; ! var->sqldata = (void ISC_FAR *)(&buf[i].val.sval); ! break; ! case SQL_LONG: /* direct to variable */ ! convert_to_long(b_var); ! var->sqldata = (void ISC_FAR *)(&b_var->value.lval); ! break; ! case SQL_FLOAT: ! convert_to_double(b_var); ! buf[i].val.fval = (float)b_var->value.dval; ! var->sqldata = (void ISC_FAR *)(&buf[i].val.fval); ! break; ! case SQL_DOUBLE: /* direct to variable */ ! convert_to_double(b_var); ! var->sqldata = (void ISC_FAR *)(&b_var->value.dval); ! break; ! case SQL_DATE: ! { ! struct tm t; ! ! t.tm_year = t.tm_mon = t.tm_mday = t.tm_hour = ! t.tm_min = t.tm_sec = 0; ! ! convert_to_string(b_var); ! #if HAVE_STRFTIME /*FIXME: HAVE_STRPTIME ?*/ ! strptime(b_var->value.str.val, IBASE_GLOBAL(php3_ibase_module).timeformat, &t); ! #else ! { ! int n = sscanf(b_var->value.str.val,"%d%*[/]%d%*[/]%d %d%*[:]%d%*[:]%d", ! &t.tm_mon, &t.tm_mday, &t.tm_year, &t.tm_hour, &t.tm_min, &t.tm_sec); ! if(n != 3 && n != 6){ ! _php3_module_error("invalid date/time format"); ! return FAILURE; ! } ! ! t.tm_year -= 1900; ! t.tm_mon--; ! } ! #endif ! isc_encode_date(&t, &buf[i].val.qval); ! var->sqldata = (void ISC_FAR *)(&buf[i].val.qval); ! } ! break; ! case SQL_BLOB: ! { ! ibase_blob_handle *ib_blob_id; ! if(b_var->type != IS_STRING ! || b_var->value.str.len != sizeof(ibase_blob_handle) ! || ((ibase_blob_handle *)(b_var->value.str.val))->bl_handle != 0){ ! _php3_module_error("invalid blob id string"); ! return FAILURE; ! } ! ib_blob_id = (ibase_blob_handle *)b_var->value.str.val; ! ! var->sqldata = (void ISC_FAR *)&ib_blob_id->bl_qd; ! } ! break; ! case SQL_ARRAY: ! _php3_module_error("binding arrays not supported yet"); ! return FAILURE; ! break; ! }/*switch*/ ! }/*for*/ ! return SUCCESS; ! } ! /* }}} */ ! ! /* {{{ _php3_ibase_alloc_xsqlda() */ /*FOLD00*/ ! static void _php3_ibase_alloc_xsqlda(XSQLDA *sqlda) ! { ! int i; ! XSQLVAR *var = sqlda->sqlvar; ! for (i = 0; i < sqlda->sqld; i++, var++) { ! switch(var->sqltype & ~1){ ! case SQL_TEXT: ! var->sqldata = emalloc(sizeof(char)*(var->sqllen)); ! break; ! case SQL_VARYING: ! var->sqldata = emalloc(sizeof(char)*(var->sqllen+sizeof(short))); ! break; ! case SQL_SHORT: ! var->sqldata = emalloc(sizeof(short)); ! break; ! case SQL_LONG: ! var->sqldata = emalloc(sizeof(long)); ! break; ! case SQL_FLOAT: ! var->sqldata = emalloc(sizeof(float)); ! break; ! case SQL_DOUBLE: ! var->sqldata = emalloc(sizeof(double)); ! break; ! case SQL_DATE: ! case SQL_BLOB: ! case SQL_ARRAY: ! var->sqldata = emalloc(sizeof(ISC_QUAD)); ! break; ! }/*switch*/ ! if(var->sqltype & 1) /* sql NULL flag */ ! var->sqlind = emalloc(sizeof(short)); ! else ! var->sqlind = NULL; ! }/* for*/ ! } ! /* }}} */ ! /* {{{ _php3_ibase_exec() */ /*FOLD00*/ ! static int _php3_ibase_exec(ibase_result **ib_resultp, ibase_query *ib_query, int argc, pval **args) ! { ! #define IB_RESULT (*ib_resultp) ! XSQLDA *in_sqlda = NULL, *out_sqlda = NULL; ! BIND_BUF *bind_buf = NULL; ! int rv = FAILURE; ! ISC_STATUS status[20]; ! IB_RESULT = NULL; ! ! /* allocate sqlda and output buffers */ ! if(ib_query->out_sqlda){ /* output variables in select, select for update */ ! IB_RESULT = emalloc(sizeof(ibase_result)); ! IB_RESULT->link = ib_query->link; ! IB_RESULT->trans = ib_query->trans; ! IB_RESULT->stmt = ib_query->stmt; ! IB_RESULT->drop_stmt = 0; /* when free result close but not drop!*/ ! out_sqlda = IB_RESULT->out_sqlda = emalloc(XSQLDA_LENGTH(ib_query->out_sqlda->sqld)); ! memcpy(out_sqlda,ib_query->out_sqlda,XSQLDA_LENGTH(ib_query->out_sqlda->sqld)); ! _php3_ibase_alloc_xsqlda(out_sqlda); ! } ! if(ib_query->in_sqlda){ /* has placeholders */ ! if (ib_query->in_sqlda->sqld != argc){ ! _php3_module_error("placeholders (%d) and variables (%d) mismatch",ib_query->in_sqlda->sqld, argc); ! goto _php3_ibase_exec_error; /* yes mommy, goto! */ } ! in_sqlda = emalloc(XSQLDA_LENGTH(ib_query->in_sqlda->sqld)); ! memcpy(in_sqlda,ib_query->in_sqlda,XSQLDA_LENGTH(ib_query->in_sqlda->sqld)); ! bind_buf = emalloc(sizeof(BIND_BUF) * ib_query->in_sqlda->sqld); ! if(_php3_ibase_bind(in_sqlda, args, bind_buf) == FAILURE){ ! goto _php3_ibase_exec_error; } ! } ! ! if (isc_dsql_execute(status, &ib_query->trans, &ib_query->stmt, 1, in_sqlda)) { ! _php3_ibase_error(status); ! goto _php3_ibase_exec_error; ! } ! ! rv = SUCCESS; ! _php3_ibase_exec_error: /* I'm a bad boy... */ ! if(in_sqlda) ! efree(in_sqlda); ! if(bind_buf) ! efree(bind_buf); ! ! if(rv == FAILURE){ ! if(IB_RESULT){ ! efree(IB_RESULT); ! IB_RESULT = NULL; } + if(out_sqlda) + efree(out_sqlda); } ! ! return rv; ! #undef IB_RESULT } /* }}} */ ! /* {{{ proto int ibase_trans([int link_identifier, ][string trans_args]) */ /*FOLD00*/ ! /* Start transaction */ void php3_ibase_trans(INTERNAL_FUNCTION_PARAMETERS) { pval *link_arg, *trans_arg; char tpb[20], *tpbp = NULL, *trans_args = NULL; ! int tpb_len = 0, link_id, trans_n; ibase_db_link *ib_link; ISC_STATUS status[20]; IBASE_TLS_VARS; ! RESET_ERRMSG; ! switch (ARG_COUNT(ht)) { case 0: link_id = IBASE_GLOBAL(php3_ibase_module).default_link; *************** *** 843,863 **** WRONG_PARAM_COUNT; break; } ! ib_link = (ibase_db_link *) php3_list_find(link_id, &type); ! if (type!=IBASE_GLOBAL(php3_ibase_module).le_link && type!=IBASE_GLOBAL(php3_ibase_module).le_plink) { ! _php3_module_error("%d is not link index",link_id); ! RETURN_FALSE; ! } if(trans_args){ tpb[tpb_len++] = isc_tpb_version3; ! tpbp = tpb; ! if(strstr(trans_args,"DEFAULT")||strstr(trans_args,"default")){ ! trans_def = 1; ! if(ib_link->default_trans != NULL){ ! _php3_module_error("default transaction already started"); ! RETURN_FALSE; ! } ! } /* access mode */ if(strstr(trans_args,"READ")||strstr(trans_args,"read")) /* READ ONLY TRANSACTION */ tpb[tpb_len++] = isc_tpb_read; --- 1092,1103 ---- WRONG_PARAM_COUNT; break; } ! ! GET_LINK_TRANS(link_id, ib_link, trans_n); ! if(trans_args){ tpb[tpb_len++] = isc_tpb_version3; ! tpbp = tpb; /* access mode */ if(strstr(trans_args,"READ")||strstr(trans_args,"read")) /* READ ONLY TRANSACTION */ tpb[tpb_len++] = isc_tpb_read; *************** *** 878,1182 **** } ! if (isc_start_transaction(status, &tr_handle, 1, &ib_link->link, tpb_len, tpbp)) { _php3_ibase_error(status); RETURN_FALSE; } ! if(trans_def){ ! ib_link->default_trans = tr_handle; ! RETURN_TRUE; ! }else{ ! ib_trans = (ibase_trans *) emalloc(sizeof(ibase_trans)); ! ib_trans->trans = tr_handle; ! trans_id = php3_list_insert(ib_trans, IBASE_GLOBAL(php3_ibase_module).le_trans); ! RETURN_LONG(trans_id); ! } } /* }}} */ ! /* {{{ _php3_ibase_trans_end() */ ! #define COMMIT 1 ! #define ROLLBACK 0 ! static void _php3_ibase_trans_end(INTERNAL_FUNCTION_PARAMETERS, int commit) { - pval *trans_arg; - int trans_id, type; - ibase_db_link *ib_link; - ibase_trans *ib_trans = NULL; - isc_tr_handle tr_handle; ISC_STATUS status[20]; ! IBASE_TLS_VARS; ! ! ! RESET_ERRMSG; ! switch (ARG_COUNT(ht)) { case 0: ! trans_id = IBASE_GLOBAL(php3_ibase_module).default_link; break; ! case 1: ! if (getParameters(ht, 1, &trans_arg) == FAILURE) { RETURN_FALSE; } ! convert_to_long(trans_arg); ! trans_id = trans_arg->value.lval; break; default: WRONG_PARAM_COUNT; break; - } - ib_trans = (ibase_trans *) php3_list_find(trans_id, &type); - ib_link = (ibase_db_link *)ib_trans; - if (type==IBASE_GLOBAL(php3_ibase_module).le_link || type==IBASE_GLOBAL(php3_ibase_module).le_plink) { - ib_link = (ibase_db_link *)ib_trans; /* default transaction */ - ib_trans = NULL; - tr_handle = ib_link->default_trans; - }else if (type==IBASE_GLOBAL(php3_ibase_module).le_trans){ - ib_link = NULL; /* manual transaction */ - tr_handle = ib_trans->trans; - }else{ - _php3_module_error("%d is not link or transaction index",trans_id); - RETURN_FALSE; } if (commit) { ! if(isc_commit_transaction(status, &tr_handle)){ ! _php3_ibase_error(status); ! RETURN_FALSE; } }else{ ! if(isc_rollback_transaction(status, &tr_handle)){ ! _php3_ibase_error(status); ! RETURN_FALSE; } } ! ! if(ib_link){ /* default transaction */ ! ib_link->default_trans = NULL; ! }else{ /* manual transaction */ ! ib_trans->trans = NULL; /* already commited or rolled...*/ ! php3_list_delete(trans_id); ! } RETURN_TRUE; } /* }}} */ ! /* {{{ proto int ibase_commit([int link_identifier, ] int trans_number) ! Commit transaction */ void php3_ibase_commit(INTERNAL_FUNCTION_PARAMETERS) { ! _php3_ibase_trans_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, COMMIT); } /* }}} */ ! /* {{{ proto int ibase_rollback([int link_identifier, ] int trans_number) ! Roolback transaction */ void php3_ibase_rollback(INTERNAL_FUNCTION_PARAMETERS) { _php3_ibase_trans_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, ROLLBACK); } /* }}} */ ! /* {{{ proto int ibase_query([int link_identifier, ]string query[, trans]) ! Execute a query (without parameter placeholders). */ void php3_ibase_query(INTERNAL_FUNCTION_PARAMETERS) { ! pval *link_arg, *query_arg, *trans_arg; ! int link_id, type, trans_single = 0; ibase_db_link *ib_link; ! ibase_trans *ib_trans = NULL; ! isc_tr_handle trans_handle = NULL; ! isc_stmt_handle query_handle = NULL; ! ISC_STATUS status[20]; ! XSQLDA *isqlda, *osqlda; ! ibase_result_handle *ibase_result; ! IBASE_TLS_VARS; ! RESET_ERRMSG; ! switch (ARG_COUNT(ht)) { ! case 1: ! if (getParameters(ht, 1, &query_arg) == FAILURE) { ! RETURN_FALSE; ! } ! link_id = IBASE_GLOBAL(php3_ibase_module).default_link; ! break; ! case 2: ! if (getParameters(ht, 2, &link_arg, &query_arg) == FAILURE) { ! RETURN_FALSE; ! } ! convert_to_long(link_arg); ! link_id = link_arg->value.lval; ! break; ! case 3: ! if (getParameters(ht, 3, &link_arg, &query_arg, &trans_arg) == FAILURE) { ! RETURN_FALSE; ! } ! convert_to_long(link_arg); ! link_id = link_arg->value.lval; ! GET_TRANS_ARG(trans_arg,ib_trans); ! break; ! default: ! WRONG_PARAM_COUNT; ! break; } ! ib_link = (ibase_db_link *) php3_list_find(link_id, &type); ! if (type!=IBASE_GLOBAL(php3_ibase_module).le_link && type!=IBASE_GLOBAL(php3_ibase_module).le_plink) { ! _php3_module_error("%d is not link index",link_id); ! RETURN_FALSE; ! } ! ! trans_handle = TRANS_HANDLE(ib_trans,ib_link); ! ! trans_single = (trans_handle == NULL); ! if(trans_single){ ! if (isc_start_transaction(status, &trans_handle, 1, &ib_link->link, 0, NULL)) { ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! } ! ! convert_to_string(query_arg); ! isqlda = _php3_ibase_prepare(ib_link->link, trans_handle, &query_handle, query_arg->value.str.val); ! if(TEST_ERRMSG){ ! RETURN_FALSE; ! } ! if (isqlda != NULL) { ! if(trans_single) ! isc_rollback_transaction(status, &trans_handle); ! isc_dsql_free_statement(status, &query_handle, DSQL_drop); ! _php3_module_error("ibase_query doesn't support parameter placeholders in query"); RETURN_FALSE; } ! osqlda = _php3_ibase_execute(trans_handle, query_handle, isqlda, status); ! if (osqlda != NULL) { ! ibase_result = (ibase_result_handle *) emalloc(sizeof(ibase_result_handle)); ! ibase_result->result = query_handle; ! ibase_result->sqlda = osqlda; ! ibase_result->trans_handle = trans_handle; ! ibase_result->trans_single = trans_single; ! ibase_result->link = ib_link->link; ! RETURN_LONG(php3_list_insert(ibase_result, php3_ibase_module.le_result)); ! } else { ! if (trans_single) { ! if (status[0] && status[1]) { ! isc_rollback_transaction(status, &trans_handle); ! isc_dsql_free_statement(status, &query_handle, DSQL_drop); ! RETURN_FALSE; ! } else { ! isc_commit_transaction(status, &trans_handle); ! isc_dsql_free_statement(status, &query_handle, DSQL_drop); ! RETURN_TRUE; ! } ! } } } /* }}} */ ! /* {{{ _php3_ibase_fetch_hash() */ static void _php3_ibase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS) { pval *result_arg, *blflag_arg; ! int type, blobchar = 0, i, collen; char string_data[255], *char_data; ! ibase_result_handle *ibase_result; ISC_STATUS status[20]; XSQLVAR *var; IBASE_VCHAR *vchar; IBASE_TLS_VARS; ! RESET_ERRMSG; ! switch(ARG_COUNT(ht)){ ! case 1: ! if (ARG_COUNT(ht)==1 && getParameters(ht, 1, &result_arg)==FAILURE) { ! RETURN_FALSE; ! } ! break; ! case 2: ! if(ARG_COUNT(ht)==2 && getParameters(ht, 2, &result_arg, &blflag_arg)==FAILURE) { ! RETURN_FALSE; ! } ! convert_to_string(blflag_arg); ! if(strcasecmp(blflag_arg->value.str.val,"TEXT")){ /* FIXME: need? */ ! _php3_module_error("invalid blob flag '%s'", blflag_arg->value.str.val); ! RETURN_FALSE; ! }else{ ! blobchar = 1; ! } ! break; ! default: ! WRONG_PARAM_COUNT; ! break; - } - - convert_to_long(result_arg); - ibase_result = (ibase_result_handle *) php3_list_find(result_arg->value.lval, &type); - - if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) { - _php3_module_error("%d is not result index", result_arg->value.lval); - RETURN_FALSE; } ! if (ibase_result->sqlda == NULL) { _php3_module_error("trying to fetch results from a non-select query"); RETURN_FALSE; } ! if (isc_dsql_fetch(status, &ibase_result->result, 1, ibase_result->sqlda) != 100L) { ! if (array_init(return_value)==FAILURE) { ! RETURN_FALSE; ! } ! var = ibase_result->sqlda->sqlvar; ! for (i = 0; i < ibase_result->sqlda->sqld; i++, var++) { ! if (*var->sqlind == -1) /* in SQL null, in PHP variable not set */ ! continue; ! switch(var->sqltype & ~1) { ! case SQL_TEXT: ! { ! char_data = (char *)emalloc(sizeof(char)*(var->sqllen+1)); ! collen = sprintf(char_data, "%*.*s", var->sqllen, var->sqllen, var->sqldata); ! if (php3_ini.magic_quotes_runtime) { ! int newlen; ! char *tmp = _php3_addslashes(char_data, collen, &newlen, 0); ! efree(char_data); ! add_get_index_stringl(return_value, i, tmp, newlen, (void **) &result_arg, 0); ! } else { ! add_get_index_stringl(return_value, i, char_data, collen, (void **) &result_arg, 0); ! } ! _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); } ! break; ! case SQL_VARYING: ! { ! vchar = (IBASE_VCHAR *) var->sqldata; ! char_data = (char *)emalloc(sizeof(char)*(vchar->var_len+1)); ! collen = sprintf(char_data, "%*.*s", vchar->var_len, vchar->var_len, vchar->var_str); ! if (php3_ini.magic_quotes_runtime) { ! int newlen; ! char *tmp = _php3_addslashes(char_data, collen, &newlen, 0); ! efree(char_data); ! add_get_index_stringl(return_value, i, tmp, newlen, (void **) &result_arg, 0); ! } else { ! add_get_index_stringl(return_value, i, char_data, collen, (void **) &result_arg, 0); ! } ! _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); } - break; - case SQL_SHORT: - collen = sprintf(string_data, "%d", *(short *)(var->sqldata)); - add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1); _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! break; ! case SQL_LONG: if (var->sqlscale) { int j, f = 1; float n; --- 1118,1408 ---- } ! /* find empty transaction slot */ ! for(trans_n = 0; trans_n < IBASE_TRANS_ON_LINK ! && ib_link->trans[trans_n]; trans_n++) ! ; ! if(trans_n == IBASE_TRANS_ON_LINK){ ! _php3_module_error("too many transactions on link"); ! RETURN_FALSE; ! } ! ! if (isc_start_transaction(status, &ib_link->trans[trans_n], 1, &ib_link->link, tpb_len, tpbp)) { _php3_ibase_error(status); RETURN_FALSE; } ! RETURN_LONG(link_id * IBASE_TRANS_ON_LINK + trans_n); } /* }}} */ ! ! /* {{{ _php3_ibase_def_trans() */ /*FOLD00*/ ! /* open default transaction */ ! static int _php3_ibase_def_trans(ibase_db_link * ib_link, int trans_n) { ISC_STATUS status[20]; ! ! if(trans_n == 0 && ib_link->trans[0] == NULL){ ! if (isc_start_transaction(status, &ib_link->trans[0], 1, &ib_link->link, 0, NULL)) { ! _php3_ibase_error(status); ! return FAILURE; ! } ! } ! return SUCCESS; ! } ! /*}}}*/ ! ! ! /* {{{ _php3_ibase_trans_end() */ /*FOLD00*/ ! #define COMMIT 1 ! #define ROLLBACK 0 ! static void _php3_ibase_trans_end(INTERNAL_FUNCTION_PARAMETERS, int commit) ! { ! pval *link_trans_arg; ! int link_id = 0, trans_n = 0; ! ibase_db_link *ib_link; ! ISC_STATUS status[20]; ! IBASE_TLS_VARS; ! ! RESET_ERRMSG; ! switch (ARG_COUNT(ht)) { case 0: ! link_id = IBASE_GLOBAL(php3_ibase_module).default_link; break; ! case 1: ! if (getParameters(ht, 1, &link_trans_arg) == FAILURE) { RETURN_FALSE; } ! convert_to_long(link_trans_arg); ! link_id = link_trans_arg->value.lval; break; default: WRONG_PARAM_COUNT; break; } + GET_LINK_TRANS(link_id, ib_link, trans_n); + if (commit) { ! if(isc_commit_transaction(status, &ib_link->trans[trans_n])){ ! _php3_ibase_error(status); ! RETURN_FALSE; } }else{ ! if(isc_rollback_transaction(status, &ib_link->trans[trans_n])){ ! _php3_ibase_error(status); ! RETURN_FALSE; } } ! ib_link->trans[trans_n] = NULL; RETURN_TRUE; } /* }}} */ ! ! /* {{{ proto int ibase_commit([int link_identifier, ] int trans_number) */ /*FOLD00*/ ! /* Commit transaction */ void php3_ibase_commit(INTERNAL_FUNCTION_PARAMETERS) { ! _php3_ibase_trans_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, COMMIT); } /* }}} */ + ! /* {{{ proto int ibase_rollback([int link_identifier, ] int trans_number) */ /*FOLD00*/ ! /* Roolback transaction */ void php3_ibase_rollback(INTERNAL_FUNCTION_PARAMETERS) { _php3_ibase_trans_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, ROLLBACK); } /* }}} */ ! ! /* {{{ proto int ibase_query([int link_identifier, ]string query[,bind args]) */ /*FOLD00*/ ! /* Execute a query. */ void php3_ibase_query(INTERNAL_FUNCTION_PARAMETERS) { ! pval **args, **bind_args = NULL; ! int i, link_id = 0, trans_n = 0, bind_n = 0; ! char *query; ibase_db_link *ib_link; ! ibase_query *ib_query; ! ibase_result *ib_result; ! IBASE_TLS_VARS; ! RESET_ERRMSG; ! if(ARG_COUNT(ht) < 1){ ! WRONG_PARAM_COUNT; ! } ! ! args = emalloc(sizeof(pval*) * ARG_COUNT(ht)); ! if (getParametersArray(ht, ARG_COUNT(ht), args) == FAILURE) { ! efree(args); ! RETURN_FALSE; } + + i = 0; + if(args[i]->type == IS_LONG){ /* link or transaction argument */ + link_id = args[i]->value.lval; + i++; /* next arg */ + }else{ + link_id = IBASE_GLOBAL(php3_ibase_module).default_link; + } + + GET_LINK_TRANS(link_id, ib_link, trans_n); + + if(args[i]->type == IS_STRING){ /* query argument */ + query = args[i]->value.str.val; + i++; /* next arg */ + }else{ + _php3_module_error("query argument missed"); + efree(args); + RETURN_FALSE; + } + + if(ARG_COUNT(ht) > i){ /* have variables to bind */ + bind_n = ARG_COUNT(ht) - i; + bind_args = &args[i]; + } ! /* open default transaction */ ! if(_php3_ibase_def_trans(ib_link, trans_n) == FAILURE){ ! efree(args); ! RETURN_FALSE; ! } ! if(_php3_ibase_alloc_query(&ib_query, ib_link->link, ib_link->trans[trans_n], query) == FAILURE){ ! efree(args); RETURN_FALSE; } ! if(_php3_ibase_exec(&ib_result, ib_query, bind_n, bind_args) == FAILURE){ ! _php3_ibase_free_query(ib_query); ! efree(args); ! RETURN_FALSE; ! } ! ! efree(args); ! ! if(ib_result) { /* select statement */ ! ib_result->drop_stmt = 1; /* drop stmt when free result */ ! ib_query->stmt = NULL; /* keep stmt when free query */ ! _php3_ibase_free_query(ib_query); ! RETURN_LONG(php3_list_insert(ib_result, php3_ibase_module.le_result)); ! }else{ ! _php3_ibase_free_query(ib_query); ! RETURN_TRUE; } } /* }}} */ ! /* {{{ _php3_ibase_fetch_hash() */ /*FOLD00*/ static void _php3_ibase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS) { pval *result_arg, *blflag_arg; ! int blobchar = 0, i, collen; char string_data[255], *char_data; ! ibase_result *ib_result; ISC_STATUS status[20]; XSQLVAR *var; IBASE_VCHAR *vchar; IBASE_TLS_VARS; ! RESET_ERRMSG; ! switch(ARG_COUNT(ht)){ ! case 1: ! if (ARG_COUNT(ht)==1 && getParameters(ht, 1, &result_arg)==FAILURE) { ! RETURN_FALSE; ! } ! break; ! case 2: ! if(ARG_COUNT(ht)==2 && getParameters(ht, 2, &result_arg, &blflag_arg)==FAILURE) { ! RETURN_FALSE; ! } ! convert_to_string(blflag_arg); ! if(strcasecmp(blflag_arg->value.str.val,"TEXT")){ /* FIXME: need? */ ! _php3_module_error("invalid blob flag '%s'", blflag_arg->value.str.val); ! RETURN_FALSE; ! }else{ ! blobchar = 1; ! } ! break; ! default: ! WRONG_PARAM_COUNT; ! break; } + + convert_to_long(result_arg); + + GET_RESULT(result_arg->value.lval, ib_result); ! if (ib_result->out_sqlda == NULL) { _php3_module_error("trying to fetch results from a non-select query"); RETURN_FALSE; } ! if(isc_dsql_fetch(status, &ib_result->stmt, 1, ib_result->out_sqlda) == 100L){ ! RETURN_FALSE; /* end of cursor */ ! } ! ! if(status[0] && status[1]){ /* error in fetch */ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ! if (array_init(return_value)==FAILURE) { ! RETURN_FALSE; ! } ! var = ib_result->out_sqlda->sqlvar; ! for (i = 0; i < ib_result->out_sqlda->sqld; i++, var++) { ! switch(var->sqltype & ~1) { ! case SQL_TEXT: ! if (((var->sqltype & 1) == 0) || *var->sqlind != -1){ ! char_data = (char *)emalloc(sizeof(char)*(var->sqllen+1)); ! collen = sprintf(char_data, "%*.*s", var->sqllen, var->sqllen, var->sqldata); ! if (php3_ini.magic_quotes_runtime) { ! int newlen; ! char *tmp = _php3_addslashes(char_data, collen, &newlen, 0); ! efree(char_data); ! add_get_index_stringl(return_value, i, tmp, newlen, (void **) &result_arg, 0); ! } else { ! add_get_index_stringl(return_value, i, char_data, collen, (void **) &result_arg, 0); } ! _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! } ! break; ! case SQL_VARYING: ! if (((var->sqltype & 1) == 0) || *var->sqlind != -1){ ! vchar = (IBASE_VCHAR *) var->sqldata; ! char_data = (char *)emalloc(sizeof(char)*(vchar->var_len+1)); ! collen = sprintf(char_data, "%*.*s", vchar->var_len, vchar->var_len, vchar->var_str); ! if (php3_ini.magic_quotes_runtime) { ! int newlen; ! char *tmp = _php3_addslashes(char_data, collen, &newlen, 0); ! efree(char_data); ! add_get_index_stringl(return_value, i, tmp, newlen, (void **) &result_arg, 0); ! } else { ! add_get_index_stringl(return_value, i, char_data, collen, (void **) &result_arg, 0); } _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! } ! break; ! case SQL_SHORT: ! if (((var->sqltype & 1) == 0) || *var->sqlind != -1){ ! add_get_index_long(return_value, i, *(short *)(var->sqldata), (void **) &result_arg); ! _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! } ! break; ! case SQL_LONG: ! if (((var->sqltype & 1) == 0) || *var->sqlind != -1){ if (var->sqlscale) { int j, f = 1; float n; *************** *** 1185,1323 **** f *= 10; n /= f; collen = sprintf(string_data, "%.*f", -var->sqlscale, n); ! } else { ! collen = sprintf(string_data, "%ld", *(long *)(var->sqldata)); } - add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1); _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! break; ! case SQL_FLOAT: ! collen = sprintf(string_data, "%f", *(float *)(var->sqldata)); ! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1); _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! break; ! case SQL_DOUBLE: if (var->sqlscale) { collen = sprintf(string_data, "%.*f", -var->sqlscale, *(double *)(var->sqldata)); } else { ! collen = sprintf(string_data, "%f", *(double *)(var->sqldata)); } - add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1); _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! break; ! case SQL_DATE: { ! struct tm t; ! isc_decode_date((ISC_QUAD *) var->sqldata, &t); ! #if HAVE_STRFTIME ! collen = (int) strftime(string_data, 255, IBASE_GLOBAL(php3_ibase_module).timeformat, &t); #else ! if(!t.tm_hour && !t.tm_min && !t.tm_sec) ! collen = sprintf(string_data, "%4d-%02d-%02d", t.tm_year+1900, t.tm_mon+1, t.tm_mday); ! else ! collen = sprintf(string_data, "%4d-%02d-%02d %02d:%02d:%02d", t.tm_year+1900, t.tm_mon+1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec); #endif add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1); _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! } ! break; ! case SQL_BLOB: ! if(blobchar){ ! int stat; ! isc_blob_handle bl_handle = NULL; ! ISC_LONG bl_len = 0, cur_len = 0, max_len; ! char bl_items[1], *bl_data, bl_info[20], *p; ! ! if(isc_open_blob(status, &ibase_result->link, &ibase_result->trans_handle, &bl_handle, (ISC_QUAD ISC_FAR *) var->sqldata)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ! bl_items[0] = isc_info_blob_total_length; ! if(isc_blob_info(status,&bl_handle,sizeof(bl_items),bl_items,sizeof(bl_info),bl_info)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! /* find total length of blob's data */ ! for (p = bl_info; *p != isc_info_end && p < bl_info+sizeof(bl_info);){ ! int item_len, item = *p++; ! item_len = (short)isc_vax_integer(p, 2); ! p += 2; ! if (item == isc_info_blob_total_length) ! bl_len = isc_vax_integer(p, item_len); ! p += item_len; ! } ! ! bl_data = emalloc(bl_len+1); ! ! for(cur_len = stat = 0; stat == 0 && cur_len < max_len; ){ ! unsigned short seg_len, max_seg = max_len-cur_len > USHRT_MAX ? USHRT_MAX : max_len-cur_len; ! stat = isc_get_segment(status, &bl_handle, &seg_len, max_seg, &bl_data[cur_len]); ! cur_len += seg_len; ! if(cur_len > max_len){ /* never!*/ ! efree(bl_data); ! _php3_module_error("php module internal error in %s %d",__FILE__,__LINE__); ! RETURN_FALSE; ! } ! } ! ! if (status[0] && (status[1] != isc_segstr_eof)){ ! efree(bl_data); ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! bl_data[cur_len] = '\0'; ! if(isc_close_blob(status, &bl_handle)){ ! efree(bl_data); ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! add_get_index_stringl(return_value, i, bl_data, cur_len, (void **) &result_arg, 0); ! _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! }else{ /* blob id only */ ! /* return string ! "db_handle:trans_handle:blob_quad_high:blob_quad_low" ! */ ! ISC_QUAD *bl_qd = (ISC_QUAD ISC_FAR *) var->sqldata; ! ! collen = sprintf(string_data, "%p:%p:%lx:%lx", ibase_result->link,ibase_result->trans_handle, ! bl_qd->gds_quad_high, bl_qd->gds_quad_low); ! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1); ! _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! } ! break; ! case SQL_ARRAY: ! { ! /* TODO, currently just show the id */ ! ISC_QUAD bid; ! bid = *(ISC_QUAD ISC_FAR *) var->sqldata; ! sprintf(string_data, "%lx:%lx", bid.isc_quad_high, bid.isc_quad_low); ! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1); ! _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! } ! break; ! default: ! break; ! } ! } ! } else { ! RETURN_FALSE; ! } } /* }}} */ ! /* {{{ proto array ibase_fetch_row(int result [,blob_flag]) ! Fetch a row with blob's body from the results of a query. */ void php3_ibase_fetch_row(INTERNAL_FUNCTION_PARAMETERS) { _php3_ibase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU); } /* }}} */ ! /* {{{ proto object ibase_fetch_object(int result [,blob_flag]) ! Fetch a object with blob's body from the results of a query. */ void php3_ibase_fetch_object(INTERNAL_FUNCTION_PARAMETERS) { _php3_ibase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU); --- 1411,1559 ---- f *= 10; n /= f; collen = sprintf(string_data, "%.*f", -var->sqlscale, n); ! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1); } else { ! add_get_index_long(return_value, i, *(long *)(var->sqldata), (void **) &result_arg); } _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! } ! break; ! case SQL_FLOAT: ! if (((var->sqltype & 1) == 0) || *var->sqlind != -1){ ! add_get_index_double(return_value, i, *(float *)(var->sqldata), (void **) &result_arg); _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! } ! break; ! case SQL_DOUBLE: ! if (((var->sqltype & 1) == 0) || *var->sqlind != -1){ if (var->sqlscale) { collen = sprintf(string_data, "%.*f", -var->sqlscale, *(double *)(var->sqldata)); + add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1); } else { ! add_get_index_double(return_value, i, *(double *)(var->sqldata), (void **) &result_arg); } _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! } ! break; ! case SQL_DATE: ! if (((var->sqltype & 1) == 0) || *var->sqlind != -1){ ! struct tm t; ! ! isc_decode_date((ISC_QUAD *) var->sqldata, &t); ! t.tm_zone = "none"; /* timezone in database ? */ ! #if HAVE_STRFTIME ! collen = (int) strftime(string_data, 255, IBASE_GLOBAL(php3_ibase_module).timeformat, &t); #else ! if(!t.tm_hour && !t.tm_min && !t.tm_sec) ! collen = sprintf(string_data, "%02d/%02d/%4d", t.tm_mon+1, t.tm_mday, t.tm_year+1900); ! else ! collen = sprintf(string_data, "%02d/%02d/%4d %02d:%02d:%02d", ! t.tm_mon+1, t.tm_mday, t.tm_year+1900, t.tm_hour, t.tm_min, t.tm_sec); #endif + add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1); + _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); + } + break; + case SQL_BLOB: + if(blobchar){ /* text ? */ + if (((var->sqltype & 1) == 0) || *var->sqlind != -1){ + int stat; + isc_blob_handle bl_handle = NULL; + ISC_LONG max_len = 0, cur_len = 0; + char bl_items[1], *bl_data, bl_info[20], *p; + + if(isc_open_blob(status, &ib_result->link, &ib_result->trans, &bl_handle, (ISC_QUAD ISC_FAR *) var->sqldata)){ + _php3_ibase_error(status); + RETURN_FALSE; + } + + bl_items[0] = isc_info_blob_total_length; + if(isc_blob_info(status,&bl_handle,sizeof(bl_items),bl_items,sizeof(bl_info),bl_info)){ + _php3_ibase_error(status); + RETURN_FALSE; + } + /* find total length of blob's data */ + for (p = bl_info; *p != isc_info_end && p < bl_info+sizeof(bl_info);){ + int item_len, item = *p++; + item_len = (short)isc_vax_integer(p, 2); + p += 2; + if (item == isc_info_blob_total_length) + max_len = isc_vax_integer(p, item_len); + p += item_len; + } + + bl_data = emalloc(max_len+1); + + for(cur_len = stat = 0; stat == 0 && cur_len < max_len; ){ + unsigned short seg_len, max_seg = max_len-cur_len > USHRT_MAX ? USHRT_MAX : max_len-cur_len; + stat = isc_get_segment(status, &bl_handle, &seg_len, max_seg, &bl_data[cur_len]); + cur_len += seg_len; + if(cur_len > max_len){ /* never!*/ + efree(bl_data); + _php3_module_error("php module internal error in %s %d",__FILE__,__LINE__); + RETURN_FALSE; + } + } + + if (status[0] && status[1] && (status[1] != isc_segstr_eof)){ + efree(bl_data); + _php3_ibase_error(status); + RETURN_FALSE; + } + bl_data[cur_len] = '\0'; + if(isc_close_blob(status, &bl_handle)){ + efree(bl_data); + _php3_ibase_error(status); + RETURN_FALSE; + } + add_get_index_stringl(return_value, i, bl_data, cur_len, (void **) &result_arg, 0); + _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); + } /* if not null */ + }else{ /* blob id only */ + ISC_QUAD *bl_qd = (ISC_QUAD ISC_FAR *) var->sqldata; + ibase_blob_handle ib_blob_id; + + ib_blob_id.link = ib_result->link; + ib_blob_id.trans_handle = ib_result->trans; + ib_blob_id.bl_qd.gds_quad_high = bl_qd->gds_quad_high; + ib_blob_id.bl_qd.gds_quad_low = bl_qd->gds_quad_low; + ib_blob_id.bl_handle = NULL; + + add_get_index_stringl(return_value, i, (char *)&ib_blob_id, sizeof(ibase_blob_handle), (void **) &result_arg, 1); + _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); + } + break; + case SQL_ARRAY: + { + /* TODO, currently just show the id */ + ISC_QUAD bid; + bid = *(ISC_QUAD ISC_FAR *) var->sqldata; + sprintf(string_data, "%lx:%lx", bid.isc_quad_high, bid.isc_quad_low); add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_arg, 1); _php3_hash_pointer_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, result_arg); ! } ! break; ! default: ! break; ! }/*switch*/ ! }/*for field*/ } /* }}} */ + ! /* {{{ proto array ibase_fetch_row(int result [,blob_flag]) */ /*FOLD00*/ ! /* Fetch a row from the results of a query. */ void php3_ibase_fetch_row(INTERNAL_FUNCTION_PARAMETERS) { _php3_ibase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU); } /* }}} */ ! ! /* {{{ proto object ibase_fetch_object(int result [,blob_flag]) */ /*FOLD00*/ ! /* Fetch a object from the results of a query. */ void php3_ibase_fetch_object(INTERNAL_FUNCTION_PARAMETERS) { _php3_ibase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU); *************** *** 1328,1567 **** /* }}} */ ! /* {{{ proto int ibase_free_result(int result) ! Free the memory used by a result. */ void php3_ibase_free_result(INTERNAL_FUNCTION_PARAMETERS) { ! pval *result_var; ! ibase_result_handle *ibase_result; ! int type; IBASE_TLS_VARS; ! RESET_ERRMSG; ! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result_var)==FAILURE) { WRONG_PARAM_COUNT; } ! convert_to_long(result_var); ! if (result_var->value.lval==0) { RETURN_FALSE; } ! ibase_result = (ibase_result_handle *) php3_list_find(result_var->value.lval,&type); ! if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) { ! _php3_module_error("%d is not result index",result_var->value.lval); ! RETURN_FALSE; ! } ! php3_list_delete(result_var->value.lval); RETURN_TRUE; } /* }}} */ ! /* {{{ proto int ibase_prepare([int link_identifier, ]string query) ! Prepare a query for later binding of parameter placeholders and execution. */ void php3_ibase_prepare(INTERNAL_FUNCTION_PARAMETERS) { ! pval *query, *ibase_link; ! int id, type; ! isc_db_handle db_handle; ! isc_tr_handle tr_handle = NULL; ! isc_stmt_handle query_handle = NULL; ! ISC_STATUS status[20]; ! XSQLDA *isqlda; ! ibase_query_handle *ibase_query; IBASE_TLS_VARS; ! RESET_ERRMSG; switch (ARG_COUNT(ht)) { case 1: ! if (getParameters(ht, 1, &query) == FAILURE) { RETURN_FALSE; } ! id = IBASE_GLOBAL(php3_ibase_module).default_link; break; case 2: ! if (getParameters(ht, 2, &ibase_link, &query) == FAILURE) { RETURN_FALSE; } ! convert_to_long(ibase_link); ! id = ibase_link->value.lval; break; default: WRONG_PARAM_COUNT; break; } ! db_handle = (isc_db_handle) php3_list_find(id, &type); ! if (type!=IBASE_GLOBAL(php3_ibase_module).le_link && type!=IBASE_GLOBAL(php3_ibase_module).le_plink) { ! _php3_module_error("%d is not link index", id); RETURN_FALSE; } ! convert_to_string(query); ! ! if (1/*!IBASE_GLOBAL(php3_ibase_module).manualtransactions*/) { ! if (isc_start_transaction(status, &tr_handle, 1, &db_handle, 0, NULL)) { ! _php3_ibase_error(status); ! RETURN_FALSE; ! } } ! isqlda = _php3_ibase_prepare(db_handle, tr_handle, &query_handle, query->value.str.val); ! ibase_query = (ibase_query_handle *) emalloc(sizeof(ibase_query_handle)); ! ibase_query->query = query_handle; ! ibase_query->sqlda = isqlda; ! ibase_query->trans_handle = tr_handle; ! ibase_query->alloced = 0; ! return_value->value.lval = php3_list_insert(ibase_query, php3_ibase_module.le_query); ! return_value->type = IS_LONG; } /* }}} */ ! /* {{{ proto int ibase_bind (int query) ! Bind parameter placeholders in a previously prepared query. Still nonfunctional. */ ! void php3_ibase_bind(INTERNAL_FUNCTION_PARAMETERS) { ! pval *query; ! ibase_query_handle *ibase_query; ! int type; IBASE_TLS_VARS; ! RESET_ERRMSG; ! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &query)==FAILURE) { WRONG_PARAM_COUNT; } - - convert_to_long(query); - if (query->value.lval==0) { - RETURN_FALSE; - } - - ibase_query = (ibase_query_handle *) php3_list_find(query->value.lval,&type); - - if (type!=IBASE_GLOBAL(php3_ibase_module).le_query) { - _php3_module_error("%d is not query index",query->value.lval); - RETURN_FALSE; - } ! if (ibase_query->sqlda == NULL) { ! _php3_module_error("trying to bind a query having no parameter placeholders"); RETURN_FALSE; } ! /* TODO ! for (i = 0; i < ibase_query->sqlda->sqld; i++) { ! ibase_query->sqlda->sqlvar[i].sqlind = (short *) emalloc(sizeof(short)); ! coltype = ibase_query->sqlda->sqlvar[i].sqltype & ~1; ! switch(coltype) ! { ! case SQL_TEXT: ! break; ! case SQL_VARYING: ! break; ! case SQL_SHORT: ! break; ! case SQL_LONG: ! break; ! case SQL_FLOAT: ! break; ! case SQL_DOUBLE: ! break; ! case SQL_DATE: ! break; ! case SQL_BLOB: ! break; ! case SQL_ARRAY: ! break; ! } ! } ! */ ! } ! /* }}} */ ! ! /* {{{ proto int ibase_execute(int query) ! Execute a previously prepared (and possibly binded) query. */ ! void php3_ibase_execute(INTERNAL_FUNCTION_PARAMETERS) ! { ! pval *query; ! ibase_query_handle *ibase_query; ! ibase_result_handle *ibase_result; ! int type; ! ISC_STATUS status[20]; ! XSQLDA *osqlda; ! IBASE_TLS_VARS; ! ! RESET_ERRMSG; ! ! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &query)==FAILURE) { ! WRONG_PARAM_COUNT; } ! convert_to_long(query); ! if (query->value.lval==0) { RETURN_FALSE; } ! ibase_query = (ibase_query_handle *) php3_list_find(query->value.lval,&type); ! if (type!=IBASE_GLOBAL(php3_ibase_module).le_query) { ! _php3_module_error("%d is not query index", query->value.lval); ! RETURN_FALSE; } ! ! /* FIXME: manual and other trans todo...*/ ! osqlda = _php3_ibase_execute(ibase_query->trans_handle, ibase_query->query, ibase_query->sqlda, status); ! ibase_result = (ibase_result_handle *) emalloc(sizeof(ibase_result_handle)); ! ibase_result->result = ibase_query->query; ! ibase_result->sqlda = osqlda; ! return_value->value.lval = php3_list_insert(ibase_result, IBASE_GLOBAL(php3_ibase_module).le_result); ! return_value->type = IS_LONG; } /* }}} */ ! /* {{{ proto int ibase_free_query(int query) ! Free memory used by a query */ void php3_ibase_free_query(INTERNAL_FUNCTION_PARAMETERS) { pval *query_arg; ! ibase_query_handle *ibase_query; ! int type; IBASE_TLS_VARS; ! RESET_ERRMSG; ! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &query_arg)==FAILURE) { WRONG_PARAM_COUNT; } convert_to_long(query_arg); ! if (query_arg->value.lval==0) { ! RETURN_FALSE; ! } ! ! ibase_query = (ibase_query_handle *) php3_list_find(query_arg->value.lval, &type); - if (type!=IBASE_GLOBAL(php3_ibase_module).le_query) { - _php3_module_error("%d is not query index", query_arg->value.lval); - RETURN_FALSE; - } php3_list_delete(query_arg->value.lval); RETURN_TRUE; } /* }}} */ ! /* {{{ proto int ibase_timefmt(string format) ! Sets the format of datetime columns returned from queries. Still nonfunctional. */ void php3_ibase_timefmt(INTERNAL_FUNCTION_PARAMETERS) { pval *fmt; IBASE_TLS_VARS; ! RESET_ERRMSG; #if HAVE_STRFTIME if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &fmt)==FAILURE) { --- 1564,1722 ---- /* }}} */ ! /* {{{ proto int ibase_free_result(int result) */ /*FOLD00*/ ! /* Free the memory used by a result. */ void php3_ibase_free_result(INTERNAL_FUNCTION_PARAMETERS) { ! pval *result_arg; ! ibase_result *ib_result; IBASE_TLS_VARS; ! RESET_ERRMSG; ! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result_arg)==FAILURE) { WRONG_PARAM_COUNT; } ! convert_to_long(result_arg); ! if (result_arg->value.lval==0) { RETURN_FALSE; } ! GET_RESULT(result_arg->value.lval, ib_result); ! php3_list_delete(result_arg->value.lval); RETURN_TRUE; } /* }}} */ + ! /* {{{ proto int ibase_prepare([int link_identifier, ]string query) */ /*FOLD00*/ ! /* Prepare a query for later execution. */ void php3_ibase_prepare(INTERNAL_FUNCTION_PARAMETERS) { ! pval *link_arg, *query_arg; ! int link_id, trans_n = 0; ! ibase_db_link *ib_link; ! ibase_query *ib_query; ! char *query; IBASE_TLS_VARS; ! RESET_ERRMSG; switch (ARG_COUNT(ht)) { case 1: ! if (getParameters(ht, 1, &query_arg) == FAILURE) { RETURN_FALSE; } ! link_id = IBASE_GLOBAL(php3_ibase_module).default_link; break; case 2: ! if (getParameters(ht, 2, &link_arg, &query_arg) == FAILURE) { RETURN_FALSE; } ! convert_to_long(link_arg); ! link_id = link_arg->value.lval; break; default: WRONG_PARAM_COUNT; break; } ! GET_LINK_TRANS(link_id, ib_link, trans_n); ! ! convert_to_string(query_arg); ! query = query_arg->value.str.val; ! ! /* open default transaction */ ! if(_php3_ibase_def_trans(ib_link, trans_n) == FAILURE){ RETURN_FALSE; } ! if(_php3_ibase_alloc_query(&ib_query, ib_link->link, ib_link->trans[trans_n], query) == FAILURE){ ! RETURN_FALSE; } ! RETURN_LONG(php3_list_insert(ib_query, IBASE_GLOBAL(php3_ibase_module).le_query)); } /* }}} */ + ! /* {{{ proto int ibase_execute(int query [,bind_args ... ]) */ /*FOLD00*/ ! /* Execute a previously prepared query. */ ! void php3_ibase_execute(INTERNAL_FUNCTION_PARAMETERS) { ! pval **args, **bind_args = NULL; ! ibase_query *ib_query; ! ibase_result *ib_result; IBASE_TLS_VARS; ! RESET_ERRMSG; ! if(ARG_COUNT(ht) < 1){ WRONG_PARAM_COUNT; } ! args = emalloc(sizeof(pval*) * ARG_COUNT(ht)); ! if (getParametersArray(ht, ARG_COUNT(ht), args) == FAILURE) { ! efree(args); RETURN_FALSE; } ! GET_QUERY(args[0]->value.lval, ib_query); ! ! if(ARG_COUNT(ht) > 1){ /* have variables to bind */ ! bind_args = &args[1]; } ! if( _php3_ibase_exec(&ib_result, ib_query, ARG_COUNT(ht)-1, bind_args) == FAILURE){; ! efree(args); RETURN_FALSE; } ! efree(args); ! if (ib_result) { /* select statement */ ! RETURN_LONG(php3_list_insert(ib_result, php3_ibase_module.le_result)); } ! ! RETURN_TRUE; } /* }}} */ ! ! /* {{{ proto int ibase_free_query(int query) */ /*FOLD00*/ ! /* Free memory used by a query */ void php3_ibase_free_query(INTERNAL_FUNCTION_PARAMETERS) { pval *query_arg; ! ibase_query *ib_query; IBASE_TLS_VARS; ! RESET_ERRMSG; ! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &query_arg) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_long(query_arg); ! ! GET_QUERY(query_arg->value.lval, ib_query); php3_list_delete(query_arg->value.lval); RETURN_TRUE; } /* }}} */ ! /* {{{ proto int ibase_timefmt(string format) */ /*FOLD00*/ ! /* Sets the format of datetime columns returned from queries. Still nonfunctional. */ void php3_ibase_timefmt(INTERNAL_FUNCTION_PARAMETERS) { pval *fmt; IBASE_TLS_VARS; ! RESET_ERRMSG; #if HAVE_STRFTIME if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &fmt)==FAILURE) { *************** *** 1569,1575 **** } convert_to_string(fmt); efree(IBASE_GLOBAL(php3_ibase_module).timeformat); ! IBASE_GLOBAL(php3_ibase_module).timeformat = estrndup(fmt->value.str.val, fmt->value.str.len); RETURN_TRUE; #else _php3_module_error("ibase_timefmt not supported on this platform"); --- 1724,1730 ---- } convert_to_string(fmt); efree(IBASE_GLOBAL(php3_ibase_module).timeformat); ! IBASE_GLOBAL(php3_ibase_module).timeformat = estrdup(fmt->value.str.val); RETURN_TRUE; #else _php3_module_error("ibase_timefmt not supported on this platform"); *************** *** 1579,1964 **** /* }}} */ ! /* {{{ proto int ibase_num_fields(int result) ! Get the number of fields in result */ void php3_ibase_num_fields(INTERNAL_FUNCTION_PARAMETERS) { pval *result; int type; ! ibase_result_handle *ibase_result; ! RESET_ERRMSG; if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result)==FAILURE) { WRONG_PARAM_COUNT; } convert_to_long(result); ! ibase_result = (ibase_result_handle *) php3_list_find(result->value.lval, &type); if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) { _php3_module_error("%d is not result index", result->value.lval); RETURN_FALSE; } ! if (ibase_result->sqlda == NULL) { _php3_module_error("trying to get num fields from a non-select query"); RETURN_FALSE; } ! RETURN_LONG(ibase_result->sqlda->sqld); } /* }}} */ ! /* {{{ proto array ibase_field_info(int result, int field_number) ! Get information about a field */ void php3_ibase_field_info(INTERNAL_FUNCTION_PARAMETERS) { ! pval *result, *field; ! int type, len; ! ibase_result_handle *ibase_result; char buf[30], *s; XSQLVAR *var; ! IBASE_TLS_VARS; ! RESET_ERRMSG; ! if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &result, &field)==FAILURE) { WRONG_PARAM_COUNT; } - - convert_to_long(result); - ibase_result = (ibase_result_handle *) php3_list_find(result->value.lval, &type); ! if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) { ! _php3_module_error("%d is not result index", result->value.lval); ! RETURN_FALSE; ! } ! if (ibase_result->sqlda == NULL) { _php3_module_error("trying to get field info from a non-select query"); RETURN_FALSE; } ! convert_to_long(field); ! if (field->value.lval<0 || field->value.lval>=ibase_result->sqlda->sqld) RETURN_FALSE; if (array_init(return_value)==FAILURE) RETURN_FALSE; ! ! var = ibase_result->sqlda->sqlvar + field->value.lval; ! ! add_get_index_stringl(return_value, 0, var->sqlname, var->sqlname_length, (void **) &result, 1); ! _php3_hash_pointer_update(return_value->value.ht, "name", sizeof(char)*5, result); ! add_get_index_stringl(return_value, 1, var->aliasname, var->aliasname_length, (void **) &result, 1); ! _php3_hash_pointer_update(return_value->value.ht, "alias", sizeof(char)*6, result); ! add_get_index_stringl(return_value, 2, var->relname, var->relname_length, (void **) &result, 1); ! _php3_hash_pointer_update(return_value->value.ht, "relation", sizeof(char)*9, result); len = sprintf(buf, "%d", var->sqllen); ! add_get_index_stringl(return_value, 3, buf, len, (void **) &result, 1); ! _php3_hash_pointer_update(return_value->value.ht, "length", sizeof(char)*7, result); switch (var->sqltype & ~1){ ! case SQL_TEXT: s = "TEXT"; break; ! case SQL_VARYING: s = "VARYING"; break; ! case SQL_SHORT: s = "SHORT"; break; ! case SQL_LONG: s = "LONG"; break; ! case SQL_FLOAT: s = "FLOAT"; break; ! case SQL_DOUBLE: s = "DOUBLE"; break; ! case SQL_D_FLOAT: s = "D_FLOAT"; break; ! case SQL_DATE: s = "DATE"; break; ! case SQL_BLOB: s = "BLOB"; break; ! case SQL_ARRAY: s = "ARRAY"; break; ! case SQL_QUAD: s = "QUAD"; break; default: sprintf(buf,"unknown (%d)", var->sqltype & ~1); s = buf; break; } ! add_get_index_stringl(return_value, 4, s, strlen(s), (void **) &result, 1); ! _php3_hash_pointer_update(return_value->value.ht, "type", sizeof(char)*5, result); } /* }}} */ - - /* begin blobs *********************************************/ - - #define IBASE_BLOB_SEG 4096 - - /* get string blob identifier from argument - format: database_link:transaction_handle:gds_quad_high:gds_quad_low - */ - #define GET_BLOB_STR_ARG(blob_arg, link, trans_handle, bl_qd) \ - if(blob_arg->type != IS_STRING || \ - sscanf(blob_arg->value.str.val,"%p%*[:]%p%*[:]%lx%*[:]%lx", \ - &link,&trans_handle,&bl_qd.gds_quad_high,&bl_qd.gds_quad_low) != 4){ \ - _php3_module_error("invalid blob id string"); \ - RETURN_FALSE; \ - } - ! /* get blob handle from argument ! note: blob already open when handle active ! */ ! #define GET_BLOB_HANDLE_ARG(blob_arg, blob_ptr) \ ! { \ ! int type; \ ! convert_to_long(blob_arg); \ ! blob_ptr = (ibase_blob_handle *) php3_list_find(blob_arg->value.lval, &type); \ ! if (type!=IBASE_GLOBAL(php3_ibase_module).le_blob) { \ ! _php3_module_error("%d is not blob handle",blob_arg->value.lval); \ ! RETURN_FALSE; \ ! } \ ! } ! /* internal struct */ ! typedef struct { ! ISC_LONG max_segment; /* Length of longest segment */ ! ISC_LONG num_segments; /* Total number of segments */ ! ISC_LONG total_length; /* Total length of blob */ ! int bl_stream; /* blob is stream ? */ ! }IBASE_BLOBINFO; ! ! ! /* {{{ int _php3_ibase_blob_info(isc_blob_handle bl_handle,IBASE_BLOBINFO *bl_info)*/ static int _php3_ibase_blob_info(isc_blob_handle bl_handle,IBASE_BLOBINFO *bl_info) { - ISC_STATUS status[20]; - - static char bl_items[] = { - isc_info_blob_num_segments, - isc_info_blob_max_segment, - isc_info_blob_total_length, - isc_info_blob_type - }; - - char bl_inf[sizeof(long)*8], *p; - - bl_info->max_segment = 0; - bl_info->num_segments = 0; - bl_info->total_length = 0; - bl_info->bl_stream = 0; - - if(isc_blob_info(status,&bl_handle,sizeof(bl_items),bl_items,sizeof(bl_inf),bl_inf)){ - _php3_ibase_error(status); - return -1; - } - - for (p = bl_inf; *p != isc_info_end && p < bl_inf+sizeof(bl_inf);){ - int item_len, item = *p++; - item_len = (short)isc_vax_integer(p, 2); - p += 2; - switch(item){ - case isc_info_blob_num_segments: - bl_info->num_segments = isc_vax_integer(p, item_len); - break; - case isc_info_blob_max_segment: - bl_info->max_segment = isc_vax_integer(p, item_len); - break; - case isc_info_blob_total_length: - bl_info->total_length = isc_vax_integer(p, item_len); - break; - case isc_info_blob_type: - bl_info->bl_stream = isc_vax_integer(p, item_len); - break; - case isc_info_end: - break; - case isc_info_truncated: - case isc_info_error: /* hmm. don't think so...*/ - _php3_ibase_error(status); - return -1; - }/*switch*/ - p += item_len; - }/*for*/ - return 0; - } - /* }}} */ - - /* {{{ _php3_ibase_free_blob() ibase_blob_handle destructor */ - static void _php3_ibase_free_blob(ibase_blob_handle *ib_blob) - { ISC_STATUS status[20]; - IBASE_TLS_VARS; ! if(ib_blob->bl_handle != NULL){ /* blob open*/ ! if(isc_cancel_blob(status, &ib_blob->bl_handle)){ ! _php3_ibase_error(status); ! } } ! efree(ib_blob); } /* }}} */ ! /* {{{ proto int ibase_blob_create([[int link_identifier ], int trans_arg]) ! Create blob for adding data */ void php3_ibase_blob_create(INTERNAL_FUNCTION_PARAMETERS) { ! pval *link_arg,*trans_arg; ! int type, link_id = 0; ISC_STATUS status[20]; ibase_db_link *ib_link; ! ibase_trans *ib_trans = NULL; ! ibase_blob_handle *ib_blob; ! IBASE_TLS_VARS; ! RESET_ERRMSG; ! switch (ARG_COUNT(ht)) { ! case 0: ! link_id = IBASE_GLOBAL(php3_ibase_module).default_link; ! break; ! case 1: ! if (getParameters(ht, 1, &trans_arg) == FAILURE) { ! RETURN_FALSE; ! } ! GET_TRANS_ARG(trans_arg, ib_trans); link_id = IBASE_GLOBAL(php3_ibase_module).default_link; break; ! case 2: ! if (getParameters(ht, 2, &link_arg, &trans_arg) == FAILURE) { RETURN_FALSE; } convert_to_long(link_arg); ! link_id = link_arg->value.lval; ! GET_TRANS_ARG(trans_arg, ib_trans); break; default: WRONG_PARAM_COUNT; break; } ! ib_link = (ibase_db_link *) php3_list_find(link_id, &type); ! if (type!=IBASE_GLOBAL(php3_ibase_module).le_link && type!=IBASE_GLOBAL(php3_ibase_module).le_plink) { ! _php3_module_error("%d is not link index",link_id); ! RETURN_FALSE; ! } ! ! ib_blob = (ibase_blob_handle *) emalloc(sizeof(ibase_blob_handle)); ! ib_blob->trans_handle = ib_trans ? ib_trans->trans : ib_link->default_trans; ! ib_blob->link = ib_link->link; ! ib_blob->bl_handle = NULL; ! ! if (isc_create_blob(status, &ib_blob->link, &ib_blob->trans_handle, &ib_blob->bl_handle,&ib_blob->bl_qd)){ ! efree(ib_blob); ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ! RETURN_LONG(php3_list_insert(ib_blob, IBASE_GLOBAL(php3_ibase_module).le_blob)); } /* }}} */ ! /* {{{ proto int ibase_blob_open(string blob_id) ! Open blob for retriving data parts */ void php3_ibase_blob_open(INTERNAL_FUNCTION_PARAMETERS) { pval *blob_arg; ISC_STATUS status[20]; ! ibase_blob_handle *ib_blob; ! IBASE_TLS_VARS; ! RESET_ERRMSG; if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &blob_arg)==FAILURE) { WRONG_PARAM_COUNT; ! } ! ib_blob = (ibase_blob_handle *) emalloc(sizeof(ibase_blob_handle)); ! GET_BLOB_STR_ARG(blob_arg,ib_blob->link,ib_blob->trans_handle,ib_blob->bl_qd) ! ib_blob->bl_handle = NULL; ! if (isc_open_blob(status, &ib_blob->link, &ib_blob->trans_handle, &ib_blob->bl_handle, &ib_blob->bl_qd)){ ! efree(ib_blob); ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! RETURN_LONG(php3_list_insert(ib_blob, IBASE_GLOBAL(php3_ibase_module).le_blob)); } /* }}} */ ! /* {{{ proto int ibase_blob_put(int blob_id, string data) ! Add data into created blob */ void php3_ibase_blob_add(INTERNAL_FUNCTION_PARAMETERS) { pval *blob_arg,*string_arg; ISC_STATUS status[20]; ! ibase_blob_handle *ib_blob; ! IBASE_TLS_VARS; ! RESET_ERRMSG; ! if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &blob_arg, &string_arg)==FAILURE) { WRONG_PARAM_COUNT; ! } ! GET_BLOB_HANDLE_ARG(blob_arg, ib_blob); ! convert_to_string(string_arg); ! if (isc_put_segment(status, &ib_blob->bl_handle, string_arg->value.str.len, string_arg->value.str.val)){ ! _php3_ibase_error(status); RETURN_FALSE; ! } ! RETURN_TRUE; } /* }}} */ ! /* {{{ proto string ibase_blob_get(int blob_id, int len) ! Get len bytes data from open blob */ void php3_ibase_blob_get(INTERNAL_FUNCTION_PARAMETERS) { pval *blob_arg, *len_arg; ! int stat; ! char *bl_data; ! unsigned short max_len = 0, cur_len, seg_len; ! ISC_STATUS status[20]; ! ibase_blob_handle *ib_blob; ! IBASE_TLS_VARS; ! ! RESET_ERRMSG; ! ! if(ARG_COUNT(ht) != 2 || getParameters(ht, 2, &blob_arg, &len_arg) == FAILURE) { ! WRONG_PARAM_COUNT; ! } ! ! convert_to_long(len_arg); ! max_len = len_arg->value.lval; ! ! GET_BLOB_HANDLE_ARG(blob_arg, ib_blob); ! ! bl_data = emalloc(max_len+1); ! ! for(cur_len = stat = 0; stat == 0; ){ ! stat = isc_get_segment(status, &ib_blob->bl_handle, &seg_len, max_len-cur_len, &bl_data[cur_len]); ! cur_len += seg_len; ! if(cur_len > max_len){ /* never!*/ ! efree(bl_data); ! _php3_module_error("php module internal error in %s %d",__FILE__,__LINE__); ! RETURN_FALSE; ! } ! } ! ! bl_data[cur_len] = '\0'; ! if (status[0] && (status[1] != isc_segstr_eof && status[1] != isc_segment)){ ! efree(bl_data); ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! RETURN_STRINGL(bl_data,cur_len,0); } /* }}} */ --- 1734,2067 ---- /* }}} */ ! /* {{{ proto int ibase_num_fields(int result) */ /*FOLD00*/ ! /* Get the number of fields in result */ void php3_ibase_num_fields(INTERNAL_FUNCTION_PARAMETERS) { pval *result; int type; ! ibase_result *ib_result; ! RESET_ERRMSG; if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result)==FAILURE) { WRONG_PARAM_COUNT; } convert_to_long(result); ! ib_result = (ibase_result *) php3_list_find(result->value.lval, &type); if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) { _php3_module_error("%d is not result index", result->value.lval); RETURN_FALSE; } ! if (ib_result->out_sqlda == NULL) { _php3_module_error("trying to get num fields from a non-select query"); RETURN_FALSE; } ! RETURN_LONG(ib_result->out_sqlda->sqld); } /* }}} */ ! /* {{{ proto array ibase_field_info(int result, int field_number) */ /*FOLD00*/ ! /* Get information about a field */ void php3_ibase_field_info(INTERNAL_FUNCTION_PARAMETERS) { ! pval *ret_val, *result_arg, *field_arg; ! ibase_result *ib_result; char buf[30], *s; + int len; XSQLVAR *var; ! IBASE_TLS_VARS; ! RESET_ERRMSG; ! if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &result_arg, &field_arg)==FAILURE) { WRONG_PARAM_COUNT; } ! convert_to_long(result_arg); ! GET_RESULT(result_arg->value.lval, ib_result); ! ! if (ib_result->out_sqlda == NULL) { _php3_module_error("trying to get field info from a non-select query"); RETURN_FALSE; } ! convert_to_long(field_arg); ! if (field_arg->value.lval<0 || field_arg->value.lval>=ib_result->out_sqlda->sqld) RETURN_FALSE; if (array_init(return_value)==FAILURE) RETURN_FALSE; ! ! var = ib_result->out_sqlda->sqlvar + field_arg->value.lval; ! ! add_get_index_stringl(return_value, 0, var->sqlname, var->sqlname_length, (void **) &ret_val, 1); ! _php3_hash_pointer_update(return_value->value.ht, "name", sizeof(char)*5, ret_val); ! add_get_index_stringl(return_value, 1, var->aliasname, var->aliasname_length, (void **) &ret_val, 1); ! _php3_hash_pointer_update(return_value->value.ht, "alias", sizeof(char)*6, ret_val); ! add_get_index_stringl(return_value, 2, var->relname, var->relname_length, (void **) &ret_val, 1); ! _php3_hash_pointer_update(return_value->value.ht, "relation", sizeof(char)*9, ret_val); len = sprintf(buf, "%d", var->sqllen); ! add_get_index_stringl(return_value, 3, buf, len, (void **) &ret_val, 1); ! _php3_hash_pointer_update(return_value->value.ht, "length", sizeof(char)*7, ret_val); switch (var->sqltype & ~1){ ! case SQL_TEXT: s = "TEXT"; break; ! case SQL_VARYING: s = "VARYING"; break; ! case SQL_SHORT: s = "SHORT"; break; ! case SQL_LONG: s = "LONG"; break; ! case SQL_FLOAT: s = "FLOAT"; break; ! case SQL_DOUBLE: s = "DOUBLE"; break; ! case SQL_D_FLOAT: s = "D_FLOAT"; break; ! case SQL_DATE: s = "DATE"; break; ! case SQL_BLOB: s = "BLOB"; break; ! case SQL_ARRAY: s = "ARRAY"; break; ! case SQL_QUAD: s = "QUAD"; break; default: sprintf(buf,"unknown (%d)", var->sqltype & ~1); s = buf; break; } ! add_get_index_stringl(return_value, 4, s, strlen(s), (void **) &ret_val, 1); ! _php3_hash_pointer_update(return_value->value.ht, "type", sizeof(char)*5, ret_val); } /* }}} */ ! /* blobs ----------------------------------- */ ! /* {{{ _php3_ibase_blob_info(isc_blob_handle bl_handle,IBASE_BLOBINFO *bl_info) */ /*FOLD00*/ static int _php3_ibase_blob_info(isc_blob_handle bl_handle,IBASE_BLOBINFO *bl_info) { ISC_STATUS status[20]; ! static char bl_items[] = { ! isc_info_blob_num_segments, ! isc_info_blob_max_segment, ! isc_info_blob_total_length, ! isc_info_blob_type ! }; ! ! char bl_inf[sizeof(long)*8], *p; ! ! bl_info->max_segment = 0; ! bl_info->num_segments = 0; ! bl_info->total_length = 0; ! bl_info->bl_stream = 0; ! ! if(isc_blob_info(status,&bl_handle,sizeof(bl_items),bl_items,sizeof(bl_inf),bl_inf)){ ! _php3_ibase_error(status); ! return FAILURE; } ! ! for (p = bl_inf; *p != isc_info_end && p < bl_inf+sizeof(bl_inf);){ ! int item_len, item = *p++; ! item_len = (short)isc_vax_integer(p, 2); ! p += 2; ! switch(item){ ! case isc_info_blob_num_segments: ! bl_info->num_segments = isc_vax_integer(p, item_len); ! break; ! case isc_info_blob_max_segment: ! bl_info->max_segment = isc_vax_integer(p, item_len); ! break; ! case isc_info_blob_total_length: ! bl_info->total_length = isc_vax_integer(p, item_len); ! break; ! case isc_info_blob_type: ! bl_info->bl_stream = isc_vax_integer(p, item_len); ! break; ! case isc_info_end: ! break; ! case isc_info_truncated: ! case isc_info_error: /* hmm. don't think so...*/ ! _php3_ibase_error(status); ! return FAILURE; ! }/*switch*/ ! p += item_len; ! }/*for*/ ! return SUCCESS; } /* }}} */ ! /* {{{ proto int ibase_blob_create([int link_identifier]) */ /*FOLD00*/ ! /* Create blob for adding data */ void php3_ibase_blob_create(INTERNAL_FUNCTION_PARAMETERS) { ! pval *link_arg; ! int trans_n, link_id = 0; ISC_STATUS status[20]; ibase_db_link *ib_link; ! ibase_blob_handle *ib_blob; ! IBASE_TLS_VARS; ! RESET_ERRMSG; ! switch (ARG_COUNT(ht)) { ! case 0: link_id = IBASE_GLOBAL(php3_ibase_module).default_link; break; ! case 1: ! if (getParameters(ht, 1, &link_arg) == FAILURE) { RETURN_FALSE; } convert_to_long(link_arg); ! link_id = link_arg->value.lval; break; default: WRONG_PARAM_COUNT; break; } ! GET_LINK_TRANS(link_id, ib_link, trans_n); ! ! /* open default transaction */ ! if(_php3_ibase_def_trans(ib_link, trans_n) == FAILURE){ ! RETURN_FALSE; ! } ! ! ib_blob = (ibase_blob_handle *) emalloc(sizeof(ibase_blob_handle)); ! ib_blob->trans_handle = ib_link->trans[trans_n]; ! ib_blob->link = ib_link->link; ! ib_blob->bl_handle = NULL; ! ! if (isc_create_blob(status, &ib_blob->link, &ib_blob->trans_handle, &ib_blob->bl_handle,&ib_blob->bl_qd)){ ! efree(ib_blob); ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ! RETURN_LONG(php3_list_insert(ib_blob, IBASE_GLOBAL(php3_ibase_module).le_blob)); } /* }}} */ ! /* {{{ proto int ibase_blob_open(string blob_id) */ /*FOLD00*/ ! /* Open blob for retriving data parts */ void php3_ibase_blob_open(INTERNAL_FUNCTION_PARAMETERS) { pval *blob_arg; ISC_STATUS status[20]; ! ibase_blob_handle *ib_blob, *ib_blob_id; ! IBASE_TLS_VARS; ! RESET_ERRMSG; if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &blob_arg)==FAILURE) { WRONG_PARAM_COUNT; ! } ! ib_blob = (ibase_blob_handle *) emalloc(sizeof(ibase_blob_handle)); ! GET_BLOB_ID_ARG(blob_arg,ib_blob_id); ! ib_blob->link = ib_blob_id->link; ! ib_blob->trans_handle = ib_blob_id->trans_handle; ! ib_blob->bl_qd.gds_quad_high = ib_blob_id->bl_qd.gds_quad_high; ! ib_blob->bl_qd.gds_quad_low = ib_blob_id->bl_qd.gds_quad_low; ! ib_blob->bl_handle = NULL; ! ! if(ib_blob->bl_qd.gds_quad_high || ib_blob->bl_qd.gds_quad_low){ /*not null ?*/ ! if (isc_open_blob(status, &ib_blob->link, &ib_blob->trans_handle, &ib_blob->bl_handle, &ib_blob->bl_qd)){ ! efree(ib_blob); ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! } ! RETURN_LONG(php3_list_insert(ib_blob, IBASE_GLOBAL(php3_ibase_module).le_blob)); } /* }}} */ ! /* {{{ proto int ibase_blob_add(int blob_id, string data) */ /*FOLD00*/ ! /* Add data into created blob */ void php3_ibase_blob_add(INTERNAL_FUNCTION_PARAMETERS) { pval *blob_arg,*string_arg; ISC_STATUS status[20]; ! ibase_blob_handle *ib_blob; ! IBASE_TLS_VARS; ! RESET_ERRMSG; ! if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &blob_arg, &string_arg)==FAILURE) { WRONG_PARAM_COUNT; ! } ! GET_BLOB_HANDLE_ARG(blob_arg, ib_blob); ! convert_to_string(string_arg); ! if (isc_put_segment(status, &ib_blob->bl_handle, string_arg->value.str.len, string_arg->value.str.val)){ ! _php3_ibase_error(status); RETURN_FALSE; ! } ! RETURN_TRUE; } /* }}} */ ! /* {{{ proto string ibase_blob_get(int blob_id, int len) */ /*FOLD00*/ ! /* Get len bytes data from open blob */ void php3_ibase_blob_get(INTERNAL_FUNCTION_PARAMETERS) { pval *blob_arg, *len_arg; ! int stat; ! char *bl_data; ! unsigned short max_len = 0, cur_len, seg_len; ! ISC_STATUS status[20]; ! ibase_blob_handle *ib_blob; ! IBASE_TLS_VARS; ! ! RESET_ERRMSG; ! ! if(ARG_COUNT(ht) != 2 || getParameters(ht, 2, &blob_arg, &len_arg) == FAILURE) { ! WRONG_PARAM_COUNT; ! } ! ! convert_to_long(len_arg); ! max_len = len_arg->value.lval; ! ! GET_BLOB_HANDLE_ARG(blob_arg, ib_blob); ! ! if(ib_blob->bl_qd.gds_quad_high || ib_blob->bl_qd.gds_quad_low){ /*not null ?*/ ! ! bl_data = emalloc(max_len+1); ! ! for(cur_len = stat = 0; stat == 0; ){ ! stat = isc_get_segment(status, &ib_blob->bl_handle, &seg_len, max_len-cur_len, &bl_data[cur_len]); ! cur_len += seg_len; ! if(cur_len > max_len){ /* never!*/ ! efree(bl_data); ! _php3_module_error("php module internal error in %s %d",__FILE__,__LINE__); ! RETURN_FALSE; ! } ! } ! ! bl_data[cur_len] = '\0'; ! if (status[0] && (status[1] != isc_segstr_eof && status[1] != isc_segment)){ ! efree(bl_data); ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! RETURN_STRINGL(bl_data,cur_len,0); ! }else{ /* null blob */ ! RETURN_STRING("",1); /* empty string */ ! } } /* }}} */ *************** *** 1966,2014 **** #define BLOB_CLOSE 1 #define BLOB_CANCEL 2 ! /* {{{ int ibase_blob_close(int blob_id) ! Close or Cancel created or Close open blob */ static void _php3_ibase_blob_end(INTERNAL_FUNCTION_PARAMETERS, int bl_end) { pval *blob_arg; ISC_STATUS status[20]; ! ibase_blob_handle *ib_blob; ! char string_data[80]; ! IBASE_TLS_VARS; ! RESET_ERRMSG; ! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &blob_arg)==FAILURE) { WRONG_PARAM_COUNT; ! } ! GET_BLOB_HANDLE_ARG(blob_arg, ib_blob); ! if(bl_end == BLOB_CLOSE){ /* return string id here */ ! if (isc_close_blob(status, &ib_blob->bl_handle)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ib_blob->bl_handle = NULL; ! sprintf(string_data, "%p:%p:%lx:%lx", ib_blob->link,ib_blob->trans_handle, ! ib_blob->bl_qd.gds_quad_high, ib_blob->bl_qd.gds_quad_low); ! php3_list_delete(blob_arg->value.lval); ! RETURN_STRING(string_data,1); ! }else{ /* discard created blob */ ! if (isc_cancel_blob(status, &ib_blob->bl_handle)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ib_blob->bl_handle = NULL; ! php3_list_delete(blob_arg->value.lval); ! RETURN_TRUE; ! } } /* }}} */ ! /* {{{ proto int ibase_blob_close(int blob_id) ! Close blob */ void php3_ibase_blob_close(INTERNAL_FUNCTION_PARAMETERS) { _php3_ibase_blob_end(INTERNAL_FUNCTION_PARAM_PASSTHRU,BLOB_CLOSE); --- 2069,2116 ---- #define BLOB_CLOSE 1 #define BLOB_CANCEL 2 ! /* {{{ _php3_ibase_blob_end() */ /*FOLD00*/ ! /* Close or Cancel created or Close open blob */ static void _php3_ibase_blob_end(INTERNAL_FUNCTION_PARAMETERS, int bl_end) { pval *blob_arg; ISC_STATUS status[20]; ! ibase_blob_handle *ib_blob; ! IBASE_TLS_VARS; ! RESET_ERRMSG; ! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &blob_arg)==FAILURE) { WRONG_PARAM_COUNT; ! } ! GET_BLOB_HANDLE_ARG(blob_arg, ib_blob); ! if(bl_end == BLOB_CLOSE){ /* return id here */ ! if(ib_blob->bl_qd.gds_quad_high || ib_blob->bl_qd.gds_quad_low){ /*not null ?*/ ! if (isc_close_blob(status, &ib_blob->bl_handle)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! } ! ib_blob->bl_handle = NULL; ! RETVAL_STRINGL((char *)ib_blob, sizeof(ibase_blob_handle), 1); ! php3_list_delete(blob_arg->value.lval); ! }else{ /* discard created blob */ ! if (isc_cancel_blob(status, &ib_blob->bl_handle)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ib_blob->bl_handle = NULL; ! php3_list_delete(blob_arg->value.lval); ! RETURN_TRUE; ! } } /* }}} */ ! /* {{{ proto int ibase_blob_close(int blob_id) */ /*FOLD00*/ ! /* Close blob */ void php3_ibase_blob_close(INTERNAL_FUNCTION_PARAMETERS) { _php3_ibase_blob_end(INTERNAL_FUNCTION_PARAM_PASSTHRU,BLOB_CLOSE); *************** *** 2016,2023 **** /* }}} */ ! /* {{{ proto int ibase_blob_cancel(int blob_id) ! Cancel creating blob */ void php3_ibase_blob_cancel(INTERNAL_FUNCTION_PARAMETERS) { _php3_ibase_blob_end(INTERNAL_FUNCTION_PARAM_PASSTHRU,BLOB_CANCEL); --- 2118,2125 ---- /* }}} */ ! /* {{{ proto int ibase_blob_cancel(int blob_id) */ /*FOLD00*/ ! /* Cancel creating blob */ void php3_ibase_blob_cancel(INTERNAL_FUNCTION_PARAMETERS) { _php3_ibase_blob_end(INTERNAL_FUNCTION_PARAM_PASSTHRU,BLOB_CANCEL); *************** *** 2025,2126 **** /* }}} */ ! /* {{{ proto object ibase_blob_info(string blob_id_str) ! Return blob length and other useful info */ void php3_ibase_blob_info(INTERNAL_FUNCTION_PARAMETERS) { pval *blob_arg, *result_var; ISC_STATUS status[20]; ! isc_tr_handle trans_handle; ! isc_db_handle link; ! isc_blob_handle bl_handle = NULL; ! ISC_QUAD bl_qd; ! IBASE_BLOBINFO bl_info; ! IBASE_TLS_VARS; ! RESET_ERRMSG; ! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &blob_arg)==FAILURE) { WRONG_PARAM_COUNT; ! } ! ! GET_BLOB_STR_ARG(blob_arg,link,trans_handle,bl_qd); ! ! if (isc_open_blob(status, &link, &trans_handle, &bl_handle, &bl_qd)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ! if (array_init(return_value)==FAILURE){ ! RETURN_FALSE; ! } ! ! if(_php3_ibase_blob_info(bl_handle,&bl_info)){ ! RETURN_FALSE; ! } ! ! add_get_index_long(return_value, 0, bl_info.total_length, (void **)&result_var); ! _php3_hash_pointer_update(return_value->value.ht, "length", sizeof("length"), result_var); ! ! add_get_index_long(return_value, 1, bl_info.num_segments, (void **)&result_var); ! _php3_hash_pointer_update(return_value->value.ht, "numseg", sizeof("numseg"), result_var); ! ! add_get_index_long(return_value, 2, bl_info.max_segment, (void **)&result_var); _php3_hash_pointer_update(return_value->value.ht, "maxseg", sizeof("maxseg"), result_var); add_get_index_long(return_value, 3, bl_info.bl_stream, (void **)&result_var); ! _php3_hash_pointer_update(return_value->value.ht, "stream", sizeof("stream"), result_var); } /* }}} */ ! /* {{{ proto int ibase_blob_echo(string blob_id_str) ! Output blob contents to browser */ void php3_ibase_blob_echo(INTERNAL_FUNCTION_PARAMETERS) { pval *blob_arg; ! char bl_data[IBASE_BLOB_SEG]; ! unsigned short seg_len; ISC_STATUS status[20]; ! isc_tr_handle trans_handle; ! isc_db_handle link; ! isc_blob_handle bl_handle = NULL; ! ISC_QUAD bl_qd; ! IBASE_TLS_VARS; ! RESET_ERRMSG; if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &blob_arg)==FAILURE) { WRONG_PARAM_COUNT; ! } ! GET_BLOB_STR_ARG(blob_arg, link,trans_handle,bl_qd); ! ! if (!php3_header()) { ! RETURN_FALSE; ! } ! ! if (isc_open_blob(status, &link, &trans_handle, &bl_handle,&bl_qd)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ! while(!isc_get_segment(status, &bl_handle, &seg_len, sizeof(bl_data), bl_data) ! || status[1] == isc_segment){ ! PHPWRITE(bl_data,seg_len); ! } ! ! if (status[0] && (status[1] != isc_segstr_eof)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ! if (isc_close_blob(status, &bl_handle)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! RETURN_TRUE; } /* }}} */ --- 2127,2250 ---- /* }}} */ ! /* {{{ proto object ibase_blob_info(string blob_id_str) */ /*FOLD00*/ ! /* Return blob length and other useful info */ void php3_ibase_blob_info(INTERNAL_FUNCTION_PARAMETERS) { pval *blob_arg, *result_var; ISC_STATUS status[20]; ! ibase_blob_handle *ib_blob_id; ! IBASE_BLOBINFO bl_info; ! IBASE_TLS_VARS; ! RESET_ERRMSG; ! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &blob_arg)==FAILURE) { WRONG_PARAM_COUNT; ! } ! ! GET_BLOB_ID_ARG(blob_arg, ib_blob_id); ! ! if (array_init(return_value)==FAILURE){ ! RETURN_FALSE; ! } ! ! if(ib_blob_id->bl_qd.gds_quad_high || ib_blob_id->bl_qd.gds_quad_low){ /*not null ?*/ ! if (isc_open_blob(status, &ib_blob_id->link, &ib_blob_id->trans_handle, ! &ib_blob_id->bl_handle, &ib_blob_id->bl_qd)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ! if(_php3_ibase_blob_info(ib_blob_id->bl_handle,&bl_info)){ ! RETURN_FALSE; ! } ! if(isc_close_blob(status, &ib_blob_id->bl_handle)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ib_blob_id->bl_handle = NULL; ! }else{ /* null blob, all values to zero */ ! bl_info.max_segment = 0; ! bl_info.num_segments = 0; ! bl_info.total_length = 0; ! bl_info.bl_stream = 0; ! } ! ! add_get_index_long(return_value, 0, bl_info.total_length, (void **)&result_var); ! _php3_hash_pointer_update(return_value->value.ht, "length", sizeof("length"), result_var); ! ! add_get_index_long(return_value, 1, bl_info.num_segments, (void **)&result_var); ! _php3_hash_pointer_update(return_value->value.ht, "numseg", sizeof("numseg"), result_var); ! ! add_get_index_long(return_value, 2, bl_info.max_segment, (void **)&result_var); _php3_hash_pointer_update(return_value->value.ht, "maxseg", sizeof("maxseg"), result_var); add_get_index_long(return_value, 3, bl_info.bl_stream, (void **)&result_var); ! _php3_hash_pointer_update(return_value->value.ht, "stream", sizeof("stream"), result_var); ! ! add_get_index_long(return_value, 4, ! (!ib_blob_id->bl_qd.gds_quad_high ! && !ib_blob_id->bl_qd.gds_quad_low), ! (void **)&result_var); ! _php3_hash_pointer_update(return_value->value.ht, "isnull", sizeof("isnull"), result_var); } /* }}} */ ! /* {{{ proto int ibase_blob_echo(string blob_id_str) */ /*FOLD00*/ ! /* Output blob contents to browser */ void php3_ibase_blob_echo(INTERNAL_FUNCTION_PARAMETERS) { pval *blob_arg; ! char bl_data[IBASE_BLOB_SEG]; ! unsigned short seg_len; ISC_STATUS status[20]; ! ibase_blob_handle *ib_blob_id; ! ! ISC_QUAD bl_qd; ! ! IBASE_TLS_VARS; ! RESET_ERRMSG; if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &blob_arg)==FAILURE) { WRONG_PARAM_COUNT; ! } ! /* GET_BLOB_STR_ARG(blob_arg, link,trans_handle,bl_qd); */ ! GET_BLOB_ID_ARG(blob_arg, ib_blob_id); ! ! if (!php3_header()) { ! RETURN_FALSE; ! } ! ! if(bl_qd.gds_quad_high || bl_qd.gds_quad_low){ /*not null ?*/ ! ! if (isc_open_blob(status, &ib_blob_id->link, &ib_blob_id->trans_handle, ! &ib_blob_id->bl_handle,&ib_blob_id->bl_qd)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! while(!isc_get_segment(status, &ib_blob_id->bl_handle, &seg_len, sizeof(bl_data), bl_data) ! || status[1] == isc_segment){ ! PHPWRITE(bl_data,seg_len); ! } ! ! if (status[0] && (status[1] != isc_segstr_eof)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ! if (isc_close_blob(status, &ib_blob_id->bl_handle)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ib_blob_id->bl_handle = NULL; ! }/* not null ? */ ! ! RETURN_TRUE; } /* }}} */ *************** *** 2129,2231 **** extern int le_fp,le_pp; extern int wsa_fp; ! /* {{{ proto string ibase_blob_import([link_id, ] file_id [, trans_id]) ! Create blob, copy file in it, and close it*/ void php3_ibase_blob_import(INTERNAL_FUNCTION_PARAMETERS) { ! pval *link_arg, *file_arg, *trans_arg; ! int type, link_id = 0, file_id, size, b; int issock=0, socketd=0, *sock; ! ISC_STATUS status[20]; ! ISC_QUAD bl_qd; ! isc_tr_handle trans_handle = NULL; ! isc_blob_handle bl_handle = NULL; ibase_db_link *ib_link; ! ibase_trans *ib_trans = NULL; ! char string_data[80], ! bl_data[IBASE_BLOB_SEG]; /* FIXME? blob_seg_size parameter? */ FILE *fp; ! IBASE_TLS_VARS; ! RESET_ERRMSG; ! switch (ARG_COUNT(ht)) { ! case 1: if (getParameters(ht, 1, &file_arg) == FAILURE) { RETURN_FALSE; ! } link_id = IBASE_GLOBAL(php3_ibase_module).default_link; ! break; case 2: if (getParameters(ht, 2, &link_arg, &file_arg) == FAILURE) { - RETURN_FALSE; - } - convert_to_long(link_arg); - link_id = link_arg->value.lval; - break; - case 3: - if (getParameters(ht, 3, &link_arg, &file_arg, &trans_arg) == FAILURE) { RETURN_FALSE; ! } convert_to_long(link_arg); link_id = link_arg->value.lval; - GET_TRANS_ARG(trans_arg, ib_trans); break; default: WRONG_PARAM_COUNT; break; ! } ! convert_to_long(file_arg); ! file_id = file_arg->value.lval; ! fp = php3_list_find(file_id,&type); ! if (type==GLOBAL(wsa_fp)){ ! issock=1; ! sock = php3_list_find(file_id,&type); ! socketd=*sock; } if ((!fp || (type!=GLOBAL(le_fp) && type!=GLOBAL(le_pp))) && (!socketd || type!=GLOBAL(wsa_fp))) { _php3_module_error("Unable to find file identifier %d",file_id); RETURN_FALSE; } ! ib_link = (ibase_db_link *) php3_list_find(link_id, &type); ! if (type!=IBASE_GLOBAL(php3_ibase_module).le_link && type!=IBASE_GLOBAL(php3_ibase_module).le_plink) { ! _php3_module_error("%d is not link index",link_id); ! RETURN_FALSE; ! } ! ! trans_handle = ib_trans ? ib_trans->trans : ib_link->default_trans; ! ! if (isc_create_blob(status, &ib_link->link, &trans_handle, &bl_handle,&bl_qd)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! size = 0; while(issock?(b=SOCK_FGETS(bl_data,sizeof(bl_data),socketd)):(b = fread(bl_data, 1, sizeof(bl_data), fp)) > 0) { ! if (isc_put_segment(status, &bl_handle, b, bl_data)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! size += b ; ! } ! ! if (isc_close_blob(status, &bl_handle)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! ! sprintf(string_data, "%p:%p:%lx:%lx", ib_link->link,trans_handle, ! bl_qd.gds_quad_high, bl_qd.gds_quad_low); php3_list_delete(file_id); ! RETURN_STRING(string_data,1); } /* }}} */ - - /* end blobs **********************************************/ #endif --- 2253,2345 ---- extern int le_fp,le_pp; extern int wsa_fp; ! /* {{{ proto string ibase_blob_import([link_identifier, ] file_id) */ /*FOLD00*/ ! /* Create blob, copy file in it, and close it*/ void php3_ibase_blob_import(INTERNAL_FUNCTION_PARAMETERS) { ! pval *link_arg, *file_arg; ! int trans_n, type, link_id = 0, file_id, size, b; int issock=0, socketd=0, *sock; ! ISC_STATUS status[20]; ! ibase_blob_handle ib_blob; ibase_db_link *ib_link; ! char bl_data[IBASE_BLOB_SEG]; /* FIXME? blob_seg_size parameter? */ FILE *fp; ! IBASE_TLS_VARS; ! RESET_ERRMSG; ! switch (ARG_COUNT(ht)) { ! case 1: if (getParameters(ht, 1, &file_arg) == FAILURE) { RETURN_FALSE; ! } link_id = IBASE_GLOBAL(php3_ibase_module).default_link; ! break; case 2: if (getParameters(ht, 2, &link_arg, &file_arg) == FAILURE) { RETURN_FALSE; ! } convert_to_long(link_arg); link_id = link_arg->value.lval; break; default: WRONG_PARAM_COUNT; break; ! } ! ! GET_LINK_TRANS(link_id, ib_link, trans_n); ! ! /* open default transaction */ ! if(_php3_ibase_def_trans(ib_link, trans_n) == FAILURE){ ! RETURN_FALSE; ! } ! convert_to_long(file_arg); ! file_id = file_arg->value.lval; ! fp = php3_list_find(file_id, &type); ! if (type == GLOBAL(wsa_fp)){ ! issock = 1; ! sock = php3_list_find(file_id, &type); ! socketd =* sock; } if ((!fp || (type!=GLOBAL(le_fp) && type!=GLOBAL(le_pp))) && (!socketd || type!=GLOBAL(wsa_fp))) { _php3_module_error("Unable to find file identifier %d",file_id); RETURN_FALSE; } ! ib_blob.link = ib_link->link; ! ib_blob.trans_handle = ib_link->trans[trans_n]; ! ib_blob.bl_handle = NULL; ! ib_blob.bl_qd.gds_quad_high = 0; ! ib_blob.bl_qd.gds_quad_low = 0; ! ! if (isc_create_blob(status, &ib_blob.link, &ib_blob.trans_handle, &ib_blob.bl_handle,&ib_blob.bl_qd)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! size = 0; while(issock?(b=SOCK_FGETS(bl_data,sizeof(bl_data),socketd)):(b = fread(bl_data, 1, sizeof(bl_data), fp)) > 0) { ! if (isc_put_segment(status, &ib_blob.bl_handle, b, bl_data)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } ! size += b ; ! } ! ! if (isc_close_blob(status, &ib_blob.bl_handle)){ ! _php3_ibase_error(status); ! RETURN_FALSE; ! } php3_list_delete(file_id); ! ! ib_blob.bl_handle = NULL; ! RETVAL_STRINGL((char *)&ib_blob, sizeof(ibase_blob_handle), 1); } /* }}} */ #endif Index: php3/functions/php3_interbase.h diff -c php3/functions/php3_interbase.h:1.5 php3/functions/php3_interbase.h:1.6 *** php3/functions/php3_interbase.h:1.5 Sun Jan 31 05:33:10 1999 --- php3/functions/php3_interbase.h Tue Mar 2 08:08:30 1999 *************** *** 1,34 **** /* +----------------------------------------------------------------------+ ! | PHP HTML Embedded Scripting Language Version 3.0 | +----------------------------------------------------------------------+ ! | Copyright (c) 1997-1999 PHP Development Team (See Credits file) | +----------------------------------------------------------------------+ | This program is free software; you can redistribute it and/or modify | ! | it under the terms of one of the following licenses: | ! | | | A) the GNU General Public License as published by the Free Software | ! | Foundation; either version 2 of the License, or (at your option) | ! | any later version. | ! | | ! | B) the PHP License as published by the PHP Development Team and | ! | included in the distribution in the file: LICENSE | ! | | ! | This program is distributed in the hope that it will be useful, | ! | but WITHOUT ANY WARRANTY; without even the implied warranty of | ! | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ! | GNU General Public License for more details. | ! | | ! | You should have received a copy of both licenses referred to here. | ! | If you did not, or have any questions about PHP licensing, please | ! | contact core@php.net. | +----------------------------------------------------------------------+ ! | Authors: Jouni Ahto <jah@cultnet.fi> | ! | Andrew Avdeev <andy@simgts.mv.ru> | +----------------------------------------------------------------------+ */ ! /* $Id: php3_interbase.h,v 1.5 1999/01/31 10:33:10 andrew Exp $ */ #ifndef _PHP3_IBASE_H #define _PHP3_IBASE_H --- 1,34 ---- /* +----------------------------------------------------------------------+ ! | PHP HTML Embedded Scripting Language Version 3.0 | +----------------------------------------------------------------------+ ! | Copyright (c) 1997-1999 PHP Development Team (See Credits file) | +----------------------------------------------------------------------+ | This program is free software; you can redistribute it and/or modify | ! | it under the terms of one of the following licenses: | ! | | | A) the GNU General Public License as published by the Free Software | ! | Foundation; either version 2 of the License, or (at your option) | ! | any later version. | ! | | ! | B) the PHP License as published by the PHP Development Team and | ! | included in the distribution in the file: LICENSE | ! | | ! | This program is distributed in the hope that it will be useful, | ! | but WITHOUT ANY WARRANTY; without even the implied warranty of | ! | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ! | GNU General Public License for more details. | ! | | ! | You should have received a copy of both licenses referred to here. | ! | If you did not, or have any questions about PHP licensing, please | ! | contact core@php.net. | +----------------------------------------------------------------------+ ! | Authors: Jouni Ahto <jah@cultnet.fi> | ! | Andrew Avdeev <andy@simgts.mv.ru> | +----------------------------------------------------------------------+ */ ! /* $Id: php3_interbase.h,v 1.6 1999/03/02 13:08:30 andrew Exp $ */ #ifndef _PHP3_IBASE_H #define _PHP3_IBASE_H *************** *** 47,52 **** --- 47,53 ---- extern int php3_minit_ibase(INIT_FUNC_ARGS); extern int php3_rinit_ibase(INIT_FUNC_ARGS); extern int php3_mfinish_ibase(void); + extern int php3_rfinish_ibase(void); extern void php3_info_ibase(void); extern void php3_ibase_connect(INTERNAL_FUNCTION_PARAMETERS); extern void php3_ibase_pconnect(INTERNAL_FUNCTION_PARAMETERS); *************** *** 56,62 **** extern void php3_ibase_fetch_object(INTERNAL_FUNCTION_PARAMETERS); extern void php3_ibase_free_result(INTERNAL_FUNCTION_PARAMETERS); extern void php3_ibase_prepare(INTERNAL_FUNCTION_PARAMETERS); - extern void php3_ibase_bind(INTERNAL_FUNCTION_PARAMETERS); extern void php3_ibase_execute(INTERNAL_FUNCTION_PARAMETERS); extern void php3_ibase_free_query(INTERNAL_FUNCTION_PARAMETERS); extern void php3_ibase_timefmt(INTERNAL_FUNCTION_PARAMETERS); --- 57,62 ---- *************** *** 82,135 **** #define IBASE_MSGSIZE 256 #define MAX_ERRMSG (IBASE_MSGSIZE*2) typedef struct { long default_link; long num_links, num_persistent; long max_links, max_persistent; long allow_persistent; ! int le_blob, le_trans, le_link, le_plink, le_result, le_query; char *default_user, *default_password; char *timeformat; ! char *cfg_timeformat; ! char *errmsg; } ibase_module; typedef struct { ! isc_tr_handle trans; ! } ibase_trans; ! ! typedef struct { ! isc_tr_handle default_trans; /* default transaction*/ isc_db_handle link; } ibase_db_link; typedef struct { ! isc_tr_handle trans_handle; ! isc_db_handle link; ! ISC_QUAD bl_qd; ! isc_blob_handle bl_handle; } ibase_blob_handle; ! typedef struct _php3_ibase_result { ! isc_stmt_handle result; ! isc_tr_handle trans_handle; ! int trans_single; /* commit transaction when free result */ isc_db_handle link; /* db link for this result */ ! XSQLDA *sqlda; ! } ibase_result_handle; ! typedef struct _php3_ibase_query { ! isc_stmt_handle query; ! isc_tr_handle trans_handle; ! int trans_single; /* commit transaction when free query */ ! XSQLDA *sqlda; ! int alloced; ! } ibase_query_handle; typedef struct _php3_ibase_varchar { ! short var_len; ! char var_str[1]; } IBASE_VCHAR; extern ibase_module php3_ibase_module; --- 82,132 ---- #define IBASE_MSGSIZE 256 #define MAX_ERRMSG (IBASE_MSGSIZE*2) + #define IBASE_TRANS_ON_LINK 10 + #define IBASE_BLOB_SEG 4096 typedef struct { long default_link; long num_links, num_persistent; long max_links, max_persistent; long allow_persistent; ! int le_blob, le_link, le_plink, le_result, le_query; char *default_user, *default_password; char *timeformat; ! char *cfg_timeformat; ! char *errmsg; } ibase_module; typedef struct { ! isc_tr_handle trans[IBASE_TRANS_ON_LINK]; isc_db_handle link; } ibase_db_link; typedef struct { ! isc_tr_handle trans_handle; ! isc_db_handle link; ! ISC_QUAD bl_qd; ! isc_blob_handle bl_handle; } ibase_blob_handle; ! typedef struct { isc_db_handle link; /* db link for this result */ ! isc_tr_handle trans; ! isc_stmt_handle stmt; ! XSQLDA *in_sqlda, *out_sqlda; ! } ibase_query; ! typedef struct { ! isc_db_handle link; /* db link for this result */ ! isc_tr_handle trans; ! isc_stmt_handle stmt; ! int drop_stmt; ! XSQLDA *out_sqlda; ! } ibase_result; typedef struct _php3_ibase_varchar { ! short var_len; ! char var_str[1]; } IBASE_VCHAR; extern ibase_module php3_ibase_module; -- PHP Development Mailing List http://www.php.net/ To unsubscribe send an empty message to php-dev-unsubscribe@lists.php.net For help: php-dev-help@lists.php.net

« previous php.dev (#4433) next »