CVS update: php3/functions

From: Date: Thu, 07 Jan 1999 08:58:08 +0000
Subject: CVS update: php3/functions
Groups: php.dev 
Request: Send a blank email to php-dev+get-3358@lists.php.net to get a copy of this message
Date: Thursday January 7, 1999 @ 3:58 Author: jah Update of /repository/php3/functions In directory asf:/u/temp/cvs-serv8331/functions Modified Files: interbase.c php3_interbase.h Log Message: ibase_timefmt now working. Rewrote the code attaching to database based on code by Colovic Igor <cigor@EUnet.yu>. A whole lot new functionality thanks to Andrew Avdeev <andy@simgts.mv.ru>. Index: php3/functions/interbase.c diff -c php3/functions/interbase.c:1.7 php3/functions/interbase.c:1.8 *** php3/functions/interbase.c:1.7 Fri Jan 1 12:59:12 1999 --- php3/functions/interbase.c Thu Jan 7 03:58:08 1999 *************** *** 24,34 **** | contact core@php.net. | +----------------------------------------------------------------------+ | Authors: Jouni Ahto <jah@cultnet.fi> | ! | | +----------------------------------------------------------------------+ */ ! /* $Id: interbase.c,v 1.7 1999/01/01 17:59:12 zeev Exp $ */ /* TODO: A lot... */ --- 24,34 ---- | contact core@php.net. | +----------------------------------------------------------------------+ | Authors: Jouni Ahto <jah@cultnet.fi> | ! | Andrew Avdeev <andy@simgts.mv.ru> | +----------------------------------------------------------------------+ */ ! /* $Id: interbase.c,v 1.8 1999/01/07 08:58:08 jah Exp $ */ /* TODO: A lot... */ *************** *** 50,61 **** --- 50,67 ---- {"ibase_close", php3_ibase_close, NULL}, {"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}, {NULL, NULL, NULL} }; *************** *** 67,73 **** NULL, php3_rinit_ibase, NULL, ! php3_info_ibase, STANDARD_MODULE_PROPERTIES }; /* }}} */ --- 73,79 ---- NULL, php3_rinit_ibase, NULL, ! /*php3_info_ibase*/ NULL, STANDARD_MODULE_PROPERTIES }; /* }}} */ *************** *** 75,88 **** /* {{{ thread safety stuff */ #if defined(THREAD_SAFE) typedef ibase_global_struct{ ! ibase_module php3_ibase_module; } ibase_global_struct; #define IBASE_GLOBAL(a) ibase_globals->a #define IBASE_TLS_VARS \ ! ibase_global_struct *ibase_globals; \ ! ibase_globals=TlsGetValue(IBASETls); #else #define IBASE_GLOBAL(a) a --- 81,94 ---- /* {{{ thread safety stuff */ #if defined(THREAD_SAFE) typedef ibase_global_struct{ ! ibase_module php3_ibase_module; } ibase_global_struct; #define IBASE_GLOBAL(a) ibase_globals->a #define IBASE_TLS_VARS \ ! ibase_global_struct *ibase_globals; \ ! ibase_globals=TlsGetValue(IBASETls); #else #define IBASE_GLOBAL(a) a *************** *** 91,116 **** #endif /* }}} */ /* {{{ _php3_ibase_close_link() */ ! static void _php3_ibase_close_link(isc_db_handle db) { ISC_STATUS status[20]; IBASE_TLS_VARS; ! isc_detach_database(status, &db); IBASE_GLOBAL(php3_ibase_module).num_links--; } /* }}} */ /* {{{ _php3_ibase_close_plink() */ ! static void _php3_ibase_close_plink(isc_db_handle db) { ISC_STATUS status[20]; IBASE_TLS_VARS; ! isc_detach_database(status, &db); php3_ibase_module.num_persistent--; php3_ibase_module.num_links--; } /* }}} */ --- 97,166 ---- #endif /* }}} */ + /* {{{ print interbase error */ + static void _php3_isc_interprete(ISC_STATUS *status) + { + #define IB_MSGSIZE 256 + char msg[IB_MSGSIZE*3], *s; + + s = msg; + while((s - msg) < IB_MSGSIZE + 2 && isc_interprete(s, &status)){ + strcat(msg, " "); + s = msg + strlen(msg); + } + php3_error(E_WARNING, "InterBase: %s",msg); + #undef IB_MSGSIZE + } + /* }}} */ + + /* {{{ _php3_ibase_rollback_trans() */ + static void _php3_ibase_rollback_trans(ibase_trans *ib_trans) + { + isc_tr_handle trans; + ISC_STATUS status[20]; + IBASE_TLS_VARS; + + if(ib_trans->trans != NULL){ + if(isc_rollback_transaction(status, &ib_trans->trans)){ + _php3_isc_interprete(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_isc_interprete(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_isc_interprete(status); ! } ! } ! isc_detach_database(status, &link->link); php3_ibase_module.num_persistent--; php3_ibase_module.num_links--; + efree(link); } /* }}} */ *************** *** 121,128 **** ISC_STATUS status[20]; IBASE_TLS_VARS; ! if (!IBASE_GLOBAL(php3_ibase_module).manualtransactions && result->commitok) { ! isc_commit_transaction(status, &result->trans); } if (result->sqlda != NULL) { for (i = 0; i < result->sqlda->sqld; i++) { --- 171,178 ---- ISC_STATUS status[20]; IBASE_TLS_VARS; ! if (result->result_trans != NULL) { /*FIXME : commit or rollback?*/ ! isc_commit_transaction(status, &result->result_trans); } if (result->sqlda != NULL) { for (i = 0; i < result->sqlda->sqld; i++) { *************** *** 142,147 **** --- 192,200 ---- int i; ISC_STATUS status[20]; + if (query->query_trans != NULL) { /*FIXME : commit or rollback?*/ + isc_commit_transaction(status, &query->query_trans); + } if (query->sqlda != NULL) { if (query->alloced) { for (i = 0; i < query->sqlda->sqld; i++) { *************** *** 170,181 **** if (cfg_get_long("ibase.max_links", &IBASE_GLOBAL(php3_ibase_module).max_links) == FAILURE) { IBASE_GLOBAL(php3_ibase_module).max_links = -1; } - /* - if (cfg_get_long("ibase.manualtransactions", &IBASE_GLOBAL(php3_ibase_module).manualtransactions) == FAILURE) { - IBASE_GLOBAL(php3_ibase_module).manualtransactions = 0; - } - */ - IBASE_GLOBAL(php3_ibase_module).manualtransactions = 0; if (cfg_get_string("ibase.default_user", &IBASE_GLOBAL(php3_ibase_module).default_user) == FAILURE || IBASE_GLOBAL(php3_ibase_module).default_user[0] == 0) { IBASE_GLOBAL(php3_ibase_module).default_user = ""; --- 223,228 ---- *************** *** 185,195 **** 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).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_link = register_list_destructors(_php3_ibase_close_link, NULL); IBASE_GLOBAL(php3_ibase_module).le_plink = register_list_destructors(NULL, _php3_ibase_close_plink); return SUCCESS; --- 232,243 ---- 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_link = register_list_destructors(_php3_ibase_close_link, NULL); IBASE_GLOBAL(php3_ibase_module).le_plink = register_list_destructors(NULL, _php3_ibase_close_plink); return SUCCESS; *************** *** 199,206 **** { IBASE_TLS_VARS; ! IBASE_GLOBAL(php3_ibase_module).default_link=-1; IBASE_GLOBAL(php3_ibase_module).num_links = php3_ibase_module.num_persistent; return SUCCESS; } --- 247,255 ---- { IBASE_TLS_VARS; ! IBASE_GLOBAL(php3_ibase_module).default_link= -1; IBASE_GLOBAL(php3_ibase_module).num_links = php3_ibase_module.num_persistent; + IBASE_GLOBAL(php3_ibase_module).timeformat = estrndup(IBASE_GLOBAL(php3_ibase_module).cfg_timeformat, strlen(IBASE_GLOBAL(php3_ibase_module).cfg_timeformat)); return SUCCESS; } *************** *** 209,219 **** int php3_mfinish_ibase(void) { } int php3_rfinish_ibase(void) { } - */ void php3_info_ibase(void) { --- 258,272 ---- int php3_mfinish_ibase(void) { } + */ int php3_rfinish_ibase(void) { + IBASE_TLS_VARS; + + efree(IBASE_GLOBAL(php3_ibase_module).timeformat); + return SUCCESS; } void php3_info_ibase(void) { *************** *** 222,261 **** /* }}} */ /* {{{ _php_ibase_attach_db() */ ! static int _php_ibase_attach_db(char *server, char *uname, int uname_len, char *passwd, int passwd_len, isc_db_handle *db) { ISC_STATUS status[20]; ! int db_parbuf_len = 4; ! short foo = 4; ! char dpb[255], *db_parbuf; ! if (uname_len) { ! db_parbuf_len += uname_len + 2; } ! if (passwd_len) { ! db_parbuf_len += passwd_len + 2; } ! db_parbuf = dpb; ! *db_parbuf++ = isc_dpb_version1; ! *db_parbuf++ = isc_dpb_num_buffers; ! *db_parbuf++ = 1; ! *db_parbuf++ = 90; ! if (uname_len) { ! if (passwd_len) { ! isc_expand_dpb(&db_parbuf, &foo, isc_dpb_user_name, uname, isc_dpb_password, passwd, NULL); ! } else { ! isc_expand_dpb(&db_parbuf, &foo, isc_dpb_user_name, uname, NULL); } } ! isc_attach_database(status, strlen(server), server, db, db_parbuf_len, dpb); if (status[0] == 1 && status[1]) { ! php3_error(E_WARNING,"Unable to connect to InterBase server: %s", "XXX"); ! return 1; } return 0; } --- 275,339 ---- /* }}} */ /* {{{ _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; + int dpb_length, len; ISC_STATUS status[20]; ! char msg[512]; ! dpb = dpb_buffer; ! ! *dpb++ = isc_dpb_version1; ! ! if (uname != NULL && (len = strlen(uname))) { ! *dpb++ = isc_dpb_user_name; ! *dpb++ = len; ! for (p = uname; *p;) { ! *dpb++ = *p++; ! } } ! if (passwd != NULL && (len = strlen(passwd))) { ! *dpb++ = isc_dpb_password; ! *dpb++ = strlen(passwd); ! for (p = passwd; *p;) { ! *dpb++ = *p++; ! } } ! if (charset != NULL && (len = strlen(charset))) { ! *dpb++ = isc_dpb_lc_ctype; ! *dpb++ = strlen(charset); ! for (p = charset; *p;) { ! *dpb++ = *p++; ! } ! } ! if (buffers) { ! *dpb++ = isc_dpb_num_buffers; ! *dpb++ = 1; ! *dpb++ = buffers; ! } ! ! #ifdef isc_dpb_sql_role_name ! if (role != NULL && (len = strlen(role))) { ! *dpb++ = isc_dpb_sql_role_name; ! *dpb++ = strlen(role); ! for (p = role; *p;) { ! *dpb++ = *p++; } } + #endif + + dpb_length = dpb - dpb_buffer; ! isc_attach_database(status, strlen(server), server, db, dpb_length, dpb_buffer); if (status[0] == 1 && status[1]) { ! _php3_isc_interprete(status); ! php3_error(E_WARNING,"Unable to connect to InterBase server: %s", msg); ! return 1; } return 0; } *************** *** 271,276 **** --- 349,355 ---- isc_db_handle db_handle = NULL; char *hashed_details; int hashed_details_length; + ibase_db_link *ib_link; IBASE_TLS_VARS; ib_uname = IBASE_GLOBAL(php3_ibase_module).default_user; *************** *** 349,366 **** RETURN_FALSE; } ! /* create the link */ ! if (_php_ibase_attach_db(ib_server, ib_uname, ib_uname_len, ib_passwd, ib_passwd_len, &db_handle)) { efree(hashed_details); RETURN_FALSE; } /* hash it up */ new_le.type = php3_ibase_module.le_plink; ! new_le.ptr = db_handle; if (_php3_hash_update(plist, hashed_details, hashed_details_length+1, (void *) &new_le, sizeof(list_entry), NULL)==FAILURE) { efree(hashed_details); RETURN_FALSE; } IBASE_GLOBAL(php3_ibase_module).num_links++; --- 428,449 ---- RETURN_FALSE; } ! /* create the ib_link */ ! if (_php_ibase_attach_db(ib_server, ib_uname, ib_passwd, NULL, 0, NULL, &db_handle)) { efree(hashed_details); RETURN_FALSE; } + 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; if (_php3_hash_update(plist, hashed_details, hashed_details_length+1, (void *) &new_le, sizeof(list_entry), NULL)==FAILURE) { efree(hashed_details); + efree(ib_link); RETURN_FALSE; } IBASE_GLOBAL(php3_ibase_module).num_links++; *************** *** 369,399 **** if (le->type != IBASE_GLOBAL(php3_ibase_module).le_plink) { RETURN_FALSE; } ! /* TODO: ensure that the link did not die */ ! ! db_handle = (isc_db_handle) le->ptr; } ! return_value->value.lval = php3_list_insert(db_handle, 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 pgsql link sits. ! * if it doesn't, open a new pgsql link, add it to the resource list, * and add a pointer to it with hashed_details as the key. */ if (_php3_hash_find(list,hashed_details,hashed_details_length+1,(void **) &index_ptr)==SUCCESS) { ! int type,link; void *ptr; if (index_ptr->type != le_index_ptr) { RETURN_FALSE; } ! link = (int) index_ptr->ptr; ! ptr = php3_list_find(link,&type); /* check if the link 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 = link; return_value->type = IS_LONG; efree(hashed_details); return; --- 452,482 ---- if (le->type != IBASE_GLOBAL(php3_ibase_module).le_plink) { RETURN_FALSE; } ! /* 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 pgsql ib_link sits. ! * if it doesn't, open a new pgsql ib_link, add it to the resource list, * and add a pointer to it with hashed_details as the key. */ if (_php3_hash_find(list,hashed_details,hashed_details_length+1,(void **) &index_ptr)==SUCCESS) { ! int type,xlink; void *ptr; if (index_ptr->type != le_index_ptr) { 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; efree(hashed_details); return; *************** *** 406,420 **** efree(hashed_details); RETURN_FALSE; } ! /* create the link */ ! if (_php_ibase_attach_db(ib_server, ib_uname, ib_uname_len, ib_passwd, ib_passwd_len, &db_handle)) { efree(hashed_details); RETURN_FALSE; } /* add it to the list */ ! return_value->value.lval = php3_list_insert(db_handle, IBASE_GLOBAL(php3_ibase_module).le_link); return_value->type = IS_LONG; /* add it to the hash */ --- 489,507 ---- efree(hashed_details); RETURN_FALSE; } ! /* create the ib_link */ ! if (_php_ibase_attach_db(ib_server, ib_uname, ib_passwd, NULL, 0, NULL, &db_handle)) { efree(hashed_details); RETURN_FALSE; } + 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 */ *************** *** 451,484 **** Close an InterBase connection */ void php3_ibase_close(INTERNAL_FUNCTION_PARAMETERS) { ! pval *ibase_link; ! int id, type; isc_db_handle db_handle; IBASE_TLS_VARS; switch (ARG_COUNT(ht)) { case 0: ! id = IBASE_GLOBAL(php3_ibase_module).default_link; break; case 1: ! if (getParameters(ht, 1, &ibase_link) == 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_error(E_WARNING, "%d is not an InterBase link index",id); RETURN_FALSE; } ! php3_list_delete(ibase_link->value.lval); RETURN_TRUE; } /* }}} */ --- 538,572 ---- Close an InterBase connection */ void php3_ibase_close(INTERNAL_FUNCTION_PARAMETERS) { ! pval *link_arg; ! ibase_db_link *ib_link; ! int link_id, type; isc_db_handle db_handle; IBASE_TLS_VARS; 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; } ! 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_error(E_WARNING, "%d is not an InterBase link index",link_id); RETURN_FALSE; } ! php3_list_delete(link_id); RETURN_TRUE; } /* }}} */ *************** *** 490,505 **** XSQLDA *isqlda; isqlda = (XSQLDA *) emalloc(XSQLDA_LENGTH(0)); ! isqlda->sqln = 0; ! isqlda->version = SQLDA_VERSION1; if (isc_dsql_allocate_statement(status, &db, query_handle)) { ! php3_error(E_WARNING, "InterBase: couldn't allocate space for query"); return NULL; } if (isc_dsql_prepare(status, &tr, query_handle, 0, query, 1, isqlda)) { ! php3_error(E_WARNING, "InterBase: couldn't prepare query"); return NULL; } --- 578,595 ---- 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_isc_interprete(status); return NULL; } if (isc_dsql_prepare(status, &tr, query_handle, 0, query, 1, isqlda)) { ! efree(isqlda); ! _php3_isc_interprete(status); return NULL; } *************** *** 510,516 **** if (isc_dsql_describe_bind(status, query_handle, 1, isqlda)) { ! php3_error(E_WARNING, "InterBase: couldn't describe placeholders in query"); } if (isqlda->sqld > 1) { --- 600,608 ---- if (isc_dsql_describe_bind(status, query_handle, 1, isqlda)) { ! efree(isqlda); ! _php3_isc_interprete(status); ! return NULL; } if (isqlda->sqld > 1) { *************** *** 518,524 **** isqlda->sqln = isqlda->sqld; isqlda->version = SQLDA_VERSION1; if (isc_dsql_describe(status, query_handle, 1, isqlda)) { ! php3_error(E_WARNING, "InterBase: couldn't describe query"); } return isqlda; } else if (isqlda->sqld == 1) { --- 610,618 ---- isqlda->sqln = isqlda->sqld; isqlda->version = SQLDA_VERSION1; if (isc_dsql_describe(status, query_handle, 1, isqlda)) { ! efree(isqlda); ! _php3_isc_interprete(status); ! return NULL; } return isqlda; } else if (isqlda->sqld == 1) { *************** *** 536,543 **** int i, coltype; static char query_info[] = { isc_info_sql_stmt_type }; char info_buffer[18]; ! short l; ! long query_type; XSQLDA *osqlda; /* --- 630,637 ---- int i, coltype; static char query_info[] = { isc_info_sql_stmt_type }; char info_buffer[18]; ! short l; ! long query_type; XSQLDA *osqlda; /* *************** *** 559,565 **** osqlda->version = SQLDA_VERSION1; if (isc_dsql_describe(status, &query_handle, 1, osqlda)) { ! php3_error(E_WARNING, "InterBase: couldn't describe query"); } if (osqlda->sqld) { --- 653,661 ---- osqlda->version = SQLDA_VERSION1; if (isc_dsql_describe(status, &query_handle, 1, osqlda)) { ! efree(osqlda); ! _php3_isc_interprete(status); ! return NULL; } if (osqlda->sqld) { *************** *** 567,573 **** osqlda->sqln = osqlda->sqld; osqlda->version = SQLDA_VERSION1; if (isc_dsql_describe(status, &query_handle, 1, osqlda)) { ! php3_error(E_WARNING, "InterBase: couldn't describe query"); } } for (i = 0; i < osqlda->sqld; i++) { --- 663,671 ---- osqlda->sqln = osqlda->sqld; osqlda->version = SQLDA_VERSION1; if (isc_dsql_describe(status, &query_handle, 1, osqlda)) { ! efree(osqlda); ! _php3_isc_interprete(status); ! return NULL; } } for (i = 0; i < osqlda->sqld; i++) { *************** *** 606,612 **** } if (isqlda == NULL) { if (isc_dsql_execute(status, &tr_handle, &query_handle, 1, NULL)) { ! php3_error(E_WARNING, "InterBase: couldn't execute query"); return NULL; } else { return osqlda; --- 704,711 ---- } if (isqlda == NULL) { if (isc_dsql_execute(status, &tr_handle, &query_handle, 1, NULL)) { ! efree(osqlda); ! _php3_isc_interprete(status); return NULL; } else { return osqlda; *************** *** 614,620 **** } else { if (isc_dsql_execute2(status, &tr_handle, &query_handle, 1, isqlda, osqlda)) { ! php3_error(E_WARNING, "InterBase: couldn't execute query"); return NULL; } else { return osqlda; --- 713,720 ---- } else { if (isc_dsql_execute2(status, &tr_handle, &query_handle, 1, isqlda, osqlda)) { ! efree(osqlda); ! _php3_isc_interprete(status); return NULL; } else { return osqlda; *************** *** 624,630 **** } else { /* Not select */ if (isc_dsql_execute(status, &tr_handle, &query_handle, 1, isqlda)) { ! php3_error(E_WARNING, "InterBase: couldn't execute query"); } /* if (!php3_ibase_module.manualtransactions) { --- 724,732 ---- } else { /* Not select */ if (isc_dsql_execute(status, &tr_handle, &query_handle, 1, isqlda)) { ! efree(osqlda); ! _php3_isc_interprete(status); ! return NULL; } /* if (!php3_ibase_module.manualtransactions) { *************** *** 641,653 **** } /* }}} */ /* {{{ proto int ibase_query([int link_identifier, ]string query) Execute a query (without parameter placeholders). */ void php3_ibase_query(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]; --- 743,928 ---- } /* }}} */ + /* {{{ 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, slot; + ibase_db_link *ib_link; + ibase_trans *ib_trans; + isc_tr_handle tr_handle = NULL; + ISC_STATUS status[20]; + IBASE_TLS_VARS; + + + 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; + } + link_id = IBASE_GLOBAL(php3_ibase_module).default_link; + convert_to_string(trans_arg); + trans_args = trans_arg->value.str.val; + 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; + convert_to_string(trans_arg); + trans_args = trans_arg->value.str.val; + 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_error(E_WARNING, "%d is not an InterBase link index",link_id); + RETURN_FALSE; + } + if(trans_args){ + tpb[tpb_len++] = isc_tpb_version3; + tpbp = tpb; + if(strstr(trans_args,"DEFAULT")){ + trans_def = 1; + if(ib_link->default_trans != NULL){ + php3_error(E_WARNING, "InterBase: DEFAULT transaction already started"); + RETURN_FALSE; + } + } + /* access mode */ + if(strstr(trans_args,"READ")) /* READ ONLY TRANSACTION */ + tpb[tpb_len++] = isc_tpb_read; + else + tpb[tpb_len++] = isc_tpb_write; + /* isolation level */ + if(strstr(trans_args,"COMMITED")) + tpb[tpb_len++] = isc_tpb_read_committed; + else if (strstr(trans_args,"CONSISTENCY")) + tpb[tpb_len++] = isc_tpb_consistency; + else + tpb[tpb_len++] = isc_tpb_concurrency; + /* lock resolution */ + if(strstr(trans_args,"NOWAIT")) + tpb[tpb_len++] = isc_tpb_nowait; + else + tpb[tpb_len++] = isc_tpb_wait; + + } + + if (isc_start_transaction(status, &tr_handle, 1, &ib_link->link, tpb_len, tpbp)) { + _php3_isc_interprete(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; + isc_tr_handle tr_handle; + ISC_STATUS status[20]; + IBASE_TLS_VARS; + + 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_error(E_WARNING, "%d is not an InterBase link or transaction index",trans_id); + RETURN_FALSE; + } + + if (commit) { + if(isc_commit_transaction(status, &tr_handle)){ + _php3_isc_interprete(status); + RETURN_FALSE; + } + }else{ + if(isc_rollback_transaction(status, &tr_handle)){ + _php3_isc_interprete(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) Execute a query (without parameter placeholders). */ void php3_ibase_query(INTERNAL_FUNCTION_PARAMETERS) { ! pval *link_arg, *query_arg, *trans_arg; ! int link_id, trans_id = 0, type, trans_query = 0; ! ibase_db_link *ib_link; ! ibase_trans *ib_trans; isc_tr_handle tr_handle = NULL; isc_stmt_handle query_handle = NULL; ISC_STATUS status[20]; *************** *** 657,697 **** 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_error(E_WARNING, "%d is not an InterBase link index", id); RETURN_FALSE; } - - convert_to_string(query); ! if (!IBASE_GLOBAL(php3_ibase_module).manualtransactions) { ! if (isc_start_transaction(status, &tr_handle, 1, &db_handle, 0, NULL)) { ! php3_error(E_WARNING, "InterBase: couldn't start transaction"); RETURN_FALSE; } ! } ! isqlda = _php3_ibase_prepare(db_handle, tr_handle, &query_handle, query->value.str.val); if (isqlda != NULL) { ! isc_rollback_transaction(status, &tr_handle); isc_dsql_free_statement(status, &query_handle, DSQL_drop); php3_error(E_WARNING, "InterBase: ibase_query doesn't support parameter placeholders in query"); RETURN_FALSE; --- 932,991 ---- 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; ! convert_to_long(trans_arg); ! trans_id = trans_arg->value.lval; 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_error(E_WARNING, "%d is not an InterBase link index",link_id); RETURN_FALSE; } ! if(trans_id != 0){ /* manual transaction */ ! ib_trans = (ibase_trans *) php3_list_find(trans_id, &type); ! if (type!=IBASE_GLOBAL(php3_ibase_module).le_trans) { ! php3_error(E_WARNING, "%d is not an InterBase transaction index",trans_id); RETURN_FALSE; } ! tr_handle = ib_trans->trans; ! }else if (ib_link->default_trans == NULL) { /* separate transaction */ ! trans_query = 1; ! if (isc_start_transaction(status, &tr_handle, 1, &ib_link->link, 0, NULL)) { ! _php3_isc_interprete(status); ! RETURN_FALSE; ! } ! } else ! tr_handle = ib_link->default_trans; ! ! convert_to_string(query_arg); ! isqlda = _php3_ibase_prepare(ib_link->link, tr_handle, &query_handle, query_arg->value.str.val); if (isqlda != NULL) { ! if(trans_query) ! isc_rollback_transaction(status, &tr_handle); isc_dsql_free_statement(status, &query_handle, DSQL_drop); php3_error(E_WARNING, "InterBase: ibase_query doesn't support parameter placeholders in query"); RETURN_FALSE; *************** *** 702,758 **** ibase_result = (ibase_result_handle *) emalloc(sizeof(ibase_result_handle)); ibase_result->result = query_handle; ibase_result->sqlda = osqlda; ! ibase_result->trans = tr_handle; ! ibase_result->commitok = 1; return_value->value.lval = php3_list_insert(ibase_result, php3_ibase_module.le_result); return_value->type = IS_LONG; } else { ! if (status[0] == 1 && status[1]) { ! if (!IBASE_GLOBAL(php3_ibase_module).manualtransactions) { isc_rollback_transaction(status, &tr_handle); isc_dsql_free_statement(status, &query_handle, DSQL_drop); RETURN_FALSE; ! } ! } else { ! if (!IBASE_GLOBAL(php3_ibase_module).manualtransactions) { isc_commit_transaction(status, &tr_handle); isc_dsql_free_statement(status, &query_handle, DSQL_drop); ! RETURN_FALSE; } } } } /* }}} */ ! /* {{{ proto int ibase_fetch_row(int result) ! Fetch a row from the results of a query. */ ! void php3_ibase_fetch_row(INTERNAL_FUNCTION_PARAMETERS) { ! pval *result; ! pval *pval_ptr; ! int type; ! int i, coltype, collen; ! char string_data[255]; ! char *fieldname; ! char *char_data; ! /* ! struct tm t; ! */ ibase_result_handle *ibase_result; ISC_STATUS status[20]; XSQLVAR *var; IBASE_VCHAR *vchar; IBASE_TLS_VARS; ! 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_error(E_WARNING,"%d is not an InterBase result index", result->value.lval); RETURN_FALSE; } --- 996,1042 ---- ibase_result = (ibase_result_handle *) emalloc(sizeof(ibase_result_handle)); ibase_result->result = query_handle; ibase_result->sqlda = osqlda; ! ibase_result->result_trans = trans_query ? tr_handle : 0; return_value->value.lval = php3_list_insert(ibase_result, php3_ibase_module.le_result); return_value->type = IS_LONG; } else { ! if (trans_query) { ! if (status[0] == 1 && status[1]) { isc_rollback_transaction(status, &tr_handle); isc_dsql_free_statement(status, &query_handle, DSQL_drop); RETURN_FALSE; ! } else { isc_commit_transaction(status, &tr_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_var; ! int type, 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; ! ! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result_var)==FAILURE) { WRONG_PARAM_COUNT; } ! convert_to_long(result_var); ! ibase_result = (ibase_result_handle *) php3_list_find(result_var->value.lval, &type); if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) { ! php3_error(E_WARNING,"%d is not an InterBase result index", result_var->value.lval); RETURN_FALSE; } *************** *** 761,866 **** RETURN_FALSE; } - var = ibase_result->sqlda->sqlvar; - if (isc_dsql_fetch(status, &ibase_result->result, 1, ibase_result->sqlda) != 100L) { if (array_init(return_value)==FAILURE) { RETURN_FALSE; } ! for (i = 0; i < ibase_result->sqlda->sqld; i++) { ! var[i].sqlname[var[i].sqlname_length] = '\0'; ! fieldname = var[i].sqlname; ! if (*var[i].sqlind < 0) { ! /* XXX. Column is NULL. This is not the best idea to do, think something... */ ! add_get_index_stringl(return_value, i, NULL, 0, (void **) &pval_ptr, 1); ! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1, pval_ptr); continue; ! } ! coltype = var[i].sqltype & ~1; ! switch(coltype) { case SQL_TEXT: { ! int len = var[i].sqllen; ! char_data = (char *)emalloc(sizeof(char)*(var[i].sqllen)); ! collen = sprintf(char_data, "%*.*s", len, len, ibase_result->sqlda->sqlvar[i].sqldata); if (php3_ini.magic_quotes_runtime) { int newlen; char *tmp = _php3_addslashes(char_data, collen, &newlen, 0); ! add_get_index_stringl(return_value, i, tmp, newlen, (void **) &pval_ptr, 0); } else { ! add_get_index_stringl(return_value, i, char_data, collen, (void **) &pval_ptr, 1); } ! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1, pval_ptr); efree(char_data); } break; case SQL_VARYING: { ! vchar = (IBASE_VCHAR *) var[i].sqldata; ! char_data = (char *)emalloc(sizeof(char)*(vchar->var_len)); 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); ! add_get_index_stringl(return_value, i, tmp, newlen, (void **) &pval_ptr, 0); } else { ! add_get_index_stringl(return_value, i, char_data, collen, (void **) &pval_ptr, 1); } ! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1, pval_ptr); efree(char_data); } break; case SQL_SHORT: ! collen = sprintf(string_data, "%d", *(short *)(var[i].sqldata)); ! add_get_index_stringl(return_value, i, string_data, collen, (void **) &pval_ptr, 1); ! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1, pval_ptr); break; case SQL_LONG: ! if (var[i].sqlscale) { int j, f = 1; float n; ! n = *(long *)(var[i].sqldata); ! for (j = 0; j < -var[i].sqlscale; j++) f *= 10; n /= f; ! collen = sprintf(string_data, "%.*f", -var[i].sqlscale, n); } else { ! collen = sprintf(string_data, "%ld", *(long *)(var[i].sqldata)); } ! add_get_index_stringl(return_value, i, string_data, collen, (void **) &pval_ptr, 1); ! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1, pval_ptr); break; case SQL_FLOAT: ! collen = sprintf(string_data, "%f", *(float *)(var[i].sqldata)); ! add_get_index_stringl(return_value, i, string_data, collen, (void **) &pval_ptr, 1); ! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1, pval_ptr); break; case SQL_DOUBLE: ! if (ibase_result->sqlda->sqlvar[i].sqlscale) { ! collen = sprintf(string_data, "%.*f", -var[i].sqlscale, *(double *)(var[i].sqldata)); } else { ! collen = sprintf(string_data, "%f", *(double *)(var[i].sqldata)); } ! add_get_index_stringl(return_value, i, string_data, collen, (void **) &pval_ptr, 1); ! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1, pval_ptr); break; case SQL_DATE: { ! struct tm *t; ! t = emalloc(sizeof(struct tm)); ! isc_decode_date((ISC_QUAD *) var[i].sqldata, t); ! /* #if HAVE_STRFTIME ! collen = (int) strftime(string_data, 255, IBASE_GLOBAL(php3_ibase_module).timeformat, t); #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 **) &pval_ptr, 1); ! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1, pval_ptr); ! efree(t); } break; case SQL_BLOB: --- 1045,1141 ---- 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); ! add_get_index_stringl(return_value, i, tmp, newlen, (void **) &result_var, 0); } else { ! add_get_index_stringl(return_value, i, char_data, collen, (void **) &result_var, 1); } ! _php3_hash_pointer_update(return_value->value.ht, var->sqlname, var->sqlname_length+1, result_var); efree(char_data); } 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); ! add_get_index_stringl(return_value, i, tmp, newlen, (void **) &result_var, 0); } else { ! add_get_index_stringl(return_value, i, char_data, collen, (void **) &result_var, 1); } ! _php3_hash_pointer_update(return_value->value.ht, var->sqlname, var->sqlname_length+1, result_var); efree(char_data); } break; case SQL_SHORT: ! collen = sprintf(string_data, "%d", *(short *)(var->sqldata)); ! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_var, 1); ! _php3_hash_pointer_update(return_value->value.ht, var->sqlname, var->sqlname_length+1, result_var); break; case SQL_LONG: ! if (var->sqlscale) { int j, f = 1; float n; ! n = *(long *)(var->sqldata); ! for (j = 0; j < -var->sqlscale; j++) 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_var, 1); ! _php3_hash_pointer_update(return_value->value.ht, var->sqlname, var->sqlname_length+1, result_var); break; case SQL_FLOAT: ! collen = sprintf(string_data, "%f", *(float *)(var->sqldata)); ! add_get_index_stringl(return_value, i, string_data, collen, (void **) &result_var, 1); ! _php3_hash_pointer_update(return_value->value.ht, var->sqlname, var->sqlname_length+1, result_var); 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_var, 1); ! _php3_hash_pointer_update(return_value->value.ht, var->sqlname, var->sqlname_length+1, result_var); 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_var, 1); ! _php3_hash_pointer_update(return_value->value.ht, var->sqlname, var->sqlname_length+1, result_var); } break; case SQL_BLOB: *************** *** 868,877 **** { /* TODO, currently just show the id */ ISC_QUAD bid; ! bid = *(ISC_QUAD ISC_FAR *) var[i].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 **) &pval_ptr, 1); ! _php3_hash_pointer_update(return_value->value.ht, fieldname, var[i].sqlname_length+1, pval_ptr); } break; default: --- 1143,1152 ---- { /* 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_var, 1); ! _php3_hash_pointer_update(return_value->value.ht, var->sqlname, var->sqlname_length+1, result_var); } break; default: *************** *** 884,914 **** } /* }}} */ /* {{{ proto int ibase_free_result(int result) Free the memory used by a result. */ void php3_ibase_free_result(INTERNAL_FUNCTION_PARAMETERS) { ! pval *result; ibase_result_handle *ibase_result; int type; IBASE_TLS_VARS; ! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result)==FAILURE) { WRONG_PARAM_COUNT; } ! convert_to_long(result); ! if (result->value.lval==0) { RETURN_FALSE; } ! ibase_result = (ibase_result_handle *) php3_list_find(result->value.lval,&type); if (type!=IBASE_GLOBAL(php3_ibase_module).le_result) { ! php3_error(E_WARNING,"%d is not an InterBase result index",result->value.lval); RETURN_FALSE; } ! php3_list_delete(result->value.lval); RETURN_TRUE; } /* }}} */ --- 1159,1208 ---- } /* }}} */ + /* {{{ proto array ibase_fetch_row(int result) + 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 array ibase_fetch_object(int result) + 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); + if (return_value->type==IS_ARRAY) { + return_value->type = IS_OBJECT; + } + } + /* }}} */ + /* {{{ 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; ! 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_error(E_WARNING,"%d is not an InterBase result index",result_var->value.lval); RETURN_FALSE; } ! php3_list_delete(result_var->value.lval); RETURN_TRUE; } /* }}} */ *************** *** 954,962 **** convert_to_string(query); ! if (!IBASE_GLOBAL(php3_ibase_module).manualtransactions) { if (isc_start_transaction(status, &tr_handle, 1, &db_handle, 0, NULL)) { ! php3_error(E_WARNING, "InterBase: couldn't start transaction"); RETURN_FALSE; } } --- 1248,1256 ---- 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_isc_interprete(status); RETURN_FALSE; } } *************** *** 965,971 **** ibase_query = (ibase_query_handle *) emalloc(sizeof(ibase_query_handle)); ibase_query->query = query_handle; ibase_query->sqlda = isqlda; ! ibase_query->trans = 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; --- 1259,1265 ---- ibase_query = (ibase_query_handle *) emalloc(sizeof(ibase_query_handle)); ibase_query->query = query_handle; ibase_query->sqlda = isqlda; ! ibase_query->query_trans = 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; *************** *** 1060,1066 **** RETURN_FALSE; } ! osqlda = _php3_ibase_execute(ibase_query->trans, 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; --- 1354,1361 ---- RETURN_FALSE; } ! /* FIXME: manual and other trans todo...*/ ! osqlda = _php3_ibase_execute(ibase_query->query_trans, 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; *************** *** 1073,1099 **** Free memory used by a query */ void php3_ibase_free_query(INTERNAL_FUNCTION_PARAMETERS) { ! pval *query; ibase_query_handle *ibase_query; int type; IBASE_TLS_VARS; ! 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_error(E_WARNING,"%d is not an InterBase query index", query->value.lval); RETURN_FALSE; } ! php3_list_delete(query->value.lval); RETURN_TRUE; } /* }}} */ --- 1368,1394 ---- 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; ! 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_error(E_WARNING,"%d is not an InterBase query index", query_arg->value.lval); RETURN_FALSE; } ! php3_list_delete(query_arg->value.lval); RETURN_TRUE; } /* }}} */ *************** *** 1102,1121 **** Sets the format of datetime columns returned from queries. Still nonfunctional. */ void php3_ibase_timefmt(INTERNAL_FUNCTION_PARAMETERS) { ! pval *pmode; IBASE_TLS_VARS; #if HAVE_STRFTIME ! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &pmode)==FAILURE) { WRONG_PARAM_COUNT; } ! convert_to_string(pmode); ! RETURN_TRUE; #else php3_error(E_WARNING,"InterBase: ibase_timefmt not supported on this platform"); RETURN_FALSE; #endif } /* }}} */ --- 1397,1519 ---- Sets the format of datetime columns returned from queries. Still nonfunctional. */ void php3_ibase_timefmt(INTERNAL_FUNCTION_PARAMETERS) { ! pval *fmt; IBASE_TLS_VARS; #if HAVE_STRFTIME ! if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &fmt)==FAILURE) { WRONG_PARAM_COUNT; } ! 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_error(E_WARNING,"InterBase: ibase_timefmt not supported on this platform"); RETURN_FALSE; #endif + } + /* }}} */ + + /* {{{ 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; + + 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_error(E_WARNING,"%d is not an InterBase result index", result->value.lval); + RETURN_FALSE; + } + + if (ibase_result->sqlda == NULL) { + php3_error(E_WARNING,"InterBase: trying to get num fields from a non-select query"); + RETURN_FALSE; + } + + return_value->value.lval = ibase_result->sqlda->sqld; + return_value->type = IS_LONG; + } + /* }}} */ + + /* {{{ 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_VCHAR *vchar; + IBASE_TLS_VARS; + + 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_error(E_WARNING,"%d is not an InterBase result index", result->value.lval); + RETURN_FALSE; + } + + if (ibase_result->sqlda == NULL) { + php3_error(E_WARNING,"InterBase: 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->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, 2, 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, 3, s, strlen(s), (void **) &result, 1); + _php3_hash_pointer_update(return_value->value.ht, "type", sizeof(char)*5, result); + } /* }}} */ Index: php3/functions/php3_interbase.h diff -c php3/functions/php3_interbase.h:1.3 php3/functions/php3_interbase.h:1.4 *** php3/functions/php3_interbase.h:1.3 Fri Jan 1 12:59:15 1999 --- php3/functions/php3_interbase.h Thu Jan 7 03:58:08 1999 *************** *** 24,34 **** | contact core@php.net. | +----------------------------------------------------------------------+ | Authors: Jouni Ahto <jah@cultnet.fi> | ! | | +----------------------------------------------------------------------+ */ ! /* $Id: php3_interbase.h,v 1.3 1999/01/01 17:59:15 zeev Exp $ */ #ifndef _PHP3_IBASE_H #define _PHP3_IBASE_H --- 24,34 ---- | contact core@php.net. | +----------------------------------------------------------------------+ | Authors: Jouni Ahto <jah@cultnet.fi> | ! | Andrew Avdeev <andy@simgts.mv.ru> | +----------------------------------------------------------------------+ */ ! /* $Id: php3_interbase.h,v 1.4 1999/01/07 08:58:08 jah Exp $ */ #ifndef _PHP3_IBASE_H #define _PHP3_IBASE_H *************** *** 53,86 **** extern void php3_ibase_close(INTERNAL_FUNCTION_PARAMETERS); extern void php3_ibase_query(INTERNAL_FUNCTION_PARAMETERS); extern void php3_ibase_fetch_row(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); typedef struct { long default_link; long num_links, num_persistent; long max_links, max_persistent; long allow_persistent; ! int le_link, le_plink, le_result, le_query; char *default_user, *default_password; - long manualtransactions; char *timeformat; } ibase_module; typedef struct _php3_ibase_result { isc_stmt_handle result; ! isc_tr_handle trans; XSQLDA *sqlda; - int commitok; } ibase_result_handle; typedef struct _php3_ibase_query { isc_stmt_handle query; ! isc_tr_handle trans; XSQLDA *sqlda; int alloced; } ibase_query_handle; --- 53,103 ---- extern void php3_ibase_close(INTERNAL_FUNCTION_PARAMETERS); extern void php3_ibase_query(INTERNAL_FUNCTION_PARAMETERS); extern void php3_ibase_fetch_row(INTERNAL_FUNCTION_PARAMETERS); + 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); + extern void php3_ibase_num_fields(INTERNAL_FUNCTION_PARAMETERS); + extern void php3_ibase_field_info(INTERNAL_FUNCTION_PARAMETERS); + extern void php3_ibase_trans(INTERNAL_FUNCTION_PARAMETERS); + extern void php3_ibase_commit(INTERNAL_FUNCTION_PARAMETERS); + extern void php3_ibase_rollback(INTERNAL_FUNCTION_PARAMETERS); + /* transactions per connect */ + #define IBASE_MAXTRANS 10 + typedef struct { long default_link; long num_links, num_persistent; long max_links, max_persistent; long allow_persistent; ! int le_trans, le_link, le_plink, le_result, le_query; char *default_user, *default_password; char *timeformat; + char *cfg_timeformat; } 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 _php3_ibase_result { isc_stmt_handle result; ! isc_tr_handle result_trans; /* transaction only for this result */ XSQLDA *sqlda; } ibase_result_handle; typedef struct _php3_ibase_query { isc_stmt_handle query; ! isc_tr_handle query_trans; XSQLDA *sqlda; int alloced; } ibase_query_handle; -- 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 (#3358) next »