CVS update: php3/functions

From: Date: Sun, 31 Jan 1999 10:33:10 +0000
Subject: CVS update: php3/functions
Groups: php.dev 
Request: Send a blank email to php-dev+get-3797@lists.php.net to get a copy of this message
Date: Sunday January 31, 1999 @ 5:33 Author: andrew Update of /repository/php3/functions In directory asf:/u/temp/cvs-serv15034/php3/functions Modified Files: interbase.c php3_interbase.h Log Message: Add InterBase blob support. Blobs read only yet. Add ibase_errmsg() user-level function. Index: php3/functions/interbase.c diff -c php3/functions/interbase.c:1.9 php3/functions/interbase.c:1.10 *** php3/functions/interbase.c:1.9 Sat Jan 23 09:45:22 1999 --- php3/functions/interbase.c Sun Jan 31 05:33:09 1999 *************** *** 28,34 **** +----------------------------------------------------------------------+ */ ! /* $Id: interbase.c,v 1.9 1999/01/23 14:45:22 eschmid Exp $ */ /* TODO: A lot... */ --- 28,34 ---- +----------------------------------------------------------------------+ */ ! /* $Id: interbase.c,v 1.10 1999/01/31 10:33:09 andrew Exp $ */ /* TODO: A lot... */ *************** *** 56,68 **** {"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} }; php3_module_entry ibase_module_entry = --- 56,82 ---- {"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 = *************** *** 78,83 **** --- 92,102 ---- }; /* }}} */ + /* {{{ 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{ *************** *** 96,128 **** ibase_module php3_ibase_module; #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); --- 115,180 ---- 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); *************** *** 137,143 **** if(link->default_trans != NULL){ if(isc_rollback_transaction(status, &link->default_trans)){ ! _php3_isc_interprete(status); } } isc_detach_database(status, &link->link); --- 189,195 ---- if(link->default_trans != NULL){ if(isc_rollback_transaction(status, &link->default_trans)){ ! _php3_ibase_error(status); } } isc_detach_database(status, &link->link); *************** *** 154,166 **** 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); } /* }}} */ --- 206,218 ---- 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--; ! free(link); } /* }}} */ *************** *** 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++) { --- 223,230 ---- 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++) { *************** *** 192,199 **** 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) { --- 244,251 ---- 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) { *************** *** 238,243 **** --- 290,296 ---- 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); return SUCCESS; *************** *** 250,255 **** --- 303,309 ---- 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)); + IBASE_GLOBAL(php3_ibase_module).errmsg = emalloc(sizeof(char)*MAX_ERRMSG); return SUCCESS; } *************** *** 265,270 **** --- 319,325 ---- IBASE_TLS_VARS; efree(IBASE_GLOBAL(php3_ibase_module).timeformat); + efree(IBASE_GLOBAL(php3_ibase_module).errmsg); return SUCCESS; } *************** *** 280,286 **** char dpb_buffer[256], *dpb, *p; int dpb_length, len; ISC_STATUS status[20]; - char msg[512]; dpb = dpb_buffer; --- 335,340 ---- *************** *** 328,338 **** 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; --- 382,389 ---- 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; *************** *** 350,357 **** char *hashed_details; int hashed_details_length; ibase_db_link *ib_link; ! IBASE_TLS_VARS; ! 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; --- 401,410 ---- 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; *************** *** 418,429 **** list_entry new_le; if (IBASE_GLOBAL(php3_ibase_module).max_links!=-1 && IBASE_GLOBAL(php3_ibase_module).num_links>=IBASE_GLOBAL(php3_ibase_module).max_links) { ! php3_error(E_WARNING,"InterBase: Too many open links (%d)", IBASE_GLOBAL(php3_ibase_module).num_links); efree(hashed_details); RETURN_FALSE; } if (IBASE_GLOBAL(php3_ibase_module).max_persistent!=-1 && IBASE_GLOBAL(php3_ibase_module).num_persistent>=IBASE_GLOBAL(php3_ibase_module).max_persistent) { ! php3_error(E_WARNING,"InterBase: Too many open persistent links (%d)", IBASE_GLOBAL(php3_ibase_module).num_persistent); efree(hashed_details); RETURN_FALSE; } --- 471,482 ---- list_entry new_le; if (IBASE_GLOBAL(php3_ibase_module).max_links!=-1 && IBASE_GLOBAL(php3_ibase_module).num_links>=IBASE_GLOBAL(php3_ibase_module).max_links) { ! _php3_module_error("Too many open links (%d)", IBASE_GLOBAL(php3_ibase_module).num_links); efree(hashed_details); RETURN_FALSE; } if (IBASE_GLOBAL(php3_ibase_module).max_persistent!=-1 && IBASE_GLOBAL(php3_ibase_module).num_persistent>=IBASE_GLOBAL(php3_ibase_module).max_persistent) { ! _php3_module_error("Too many open persistent links (%d)", IBASE_GLOBAL(php3_ibase_module).num_persistent); efree(hashed_details); RETURN_FALSE; } *************** *** 462,469 **** 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) { --- 515,522 ---- 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. */ if (_php3_hash_find(list,hashed_details,hashed_details_length+1,(void **) &index_ptr)==SUCCESS) { *************** *** 485,491 **** } } if (IBASE_GLOBAL(php3_ibase_module).max_links!=-1 && IBASE_GLOBAL(php3_ibase_module).num_links>=IBASE_GLOBAL(php3_ibase_module).max_links) { ! php3_error(E_WARNING,"InterBase: Too many open links (%d)", IBASE_GLOBAL(php3_ibase_module).num_links); efree(hashed_details); RETURN_FALSE; } --- 538,544 ---- } } if (IBASE_GLOBAL(php3_ibase_module).max_links!=-1 && IBASE_GLOBAL(php3_ibase_module).num_links>=IBASE_GLOBAL(php3_ibase_module).max_links) { ! _php3_module_error("Too many open links (%d)", IBASE_GLOBAL(php3_ibase_module).num_links); efree(hashed_details); RETURN_FALSE; } *************** *** 541,549 **** 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; --- 594,603 ---- 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; *************** *** 562,568 **** 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; } --- 616,622 ---- 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; } *************** *** 583,595 **** 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; } --- 637,649 ---- 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; } *************** *** 601,607 **** if (isc_dsql_describe_bind(status, query_handle, 1, isqlda)) { efree(isqlda); ! _php3_isc_interprete(status); return NULL; } --- 655,661 ---- if (isc_dsql_describe_bind(status, query_handle, 1, isqlda)) { efree(isqlda); ! _php3_ibase_error(status); return NULL; } *************** *** 611,617 **** isqlda->version = SQLDA_VERSION1; if (isc_dsql_describe(status, query_handle, 1, isqlda)) { efree(isqlda); ! _php3_isc_interprete(status); return NULL; } return isqlda; --- 665,671 ---- isqlda->version = SQLDA_VERSION1; if (isc_dsql_describe(status, query_handle, 1, isqlda)) { efree(isqlda); ! _php3_ibase_error(status); return NULL; } return isqlda; *************** *** 654,660 **** if (isc_dsql_describe(status, &query_handle, 1, osqlda)) { efree(osqlda); ! _php3_isc_interprete(status); return NULL; } --- 708,714 ---- if (isc_dsql_describe(status, &query_handle, 1, osqlda)) { efree(osqlda); ! _php3_ibase_error(status); return NULL; } *************** *** 664,670 **** osqlda->version = SQLDA_VERSION1; if (isc_dsql_describe(status, &query_handle, 1, osqlda)) { efree(osqlda); ! _php3_isc_interprete(status); return NULL; } } --- 718,724 ---- osqlda->version = SQLDA_VERSION1; if (isc_dsql_describe(status, &query_handle, 1, osqlda)) { efree(osqlda); ! _php3_ibase_error(status); return NULL; } } *************** *** 705,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; --- 759,765 ---- 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; *************** *** 714,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; --- 768,774 ---- } else { if (isc_dsql_execute2(status, &tr_handle, &query_handle, 1, isqlda, osqlda)) { efree(osqlda); ! _php3_ibase_error(status); return NULL; } else { return osqlda; *************** *** 724,755 **** } 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) { - if(0) { - isc_commit_transaction(status, tr_handle); - } else { - isc_rollback_transaction(status, tr_handle); - } - } - */ } return NULL; } /* }}} */ /* {{{ 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; --- 778,814 ---- } 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; *************** *** 757,762 **** --- 816,823 ---- IBASE_TLS_VARS; + RESET_ERRMSG; + switch (ARG_COUNT(ht)) { case 0: link_id = IBASE_GLOBAL(php3_ibase_module).default_link; *************** *** 784,816 **** } 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; --- 845,877 ---- } 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; else tpb[tpb_len++] = isc_tpb_write; /* isolation level */ ! if(strstr(trans_args,"COMMITED")||strstr(trans_args,"commited")) tpb[tpb_len++] = isc_tpb_read_committed; ! else if (strstr(trans_args,"CONSISTENCY")||strstr(trans_args,"consistency")) tpb[tpb_len++] = isc_tpb_consistency; else tpb[tpb_len++] = isc_tpb_concurrency; /* lock resolution */ ! if(strstr(trans_args,"NOWAIT")||strstr(trans_args,"nowait")) tpb[tpb_len++] = isc_tpb_nowait; else tpb[tpb_len++] = isc_tpb_wait; *************** *** 818,824 **** } if (isc_start_transaction(status, &tr_handle, 1, &ib_link->link, tpb_len, tpbp)) { ! _php3_isc_interprete(status); RETURN_FALSE; } --- 879,885 ---- } if (isc_start_transaction(status, &tr_handle, 1, &ib_link->link, tpb_len, tpbp)) { ! _php3_ibase_error(status); RETURN_FALSE; } *************** *** 842,851 **** 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: --- 903,915 ---- 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: *************** *** 872,899 **** 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; } --- 936,963 ---- 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; } *************** *** 903,909 **** Commit transaction */ void php3_ibase_commit(INTERNAL_FUNCTION_PARAMETERS) { ! _php3_ibase_trans_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, COMMIT); } /* }}} */ --- 967,973 ---- Commit transaction */ void php3_ibase_commit(INTERNAL_FUNCTION_PARAMETERS) { ! _php3_ibase_trans_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, COMMIT); } /* }}} */ *************** *** 915,935 **** } /* }}} */ ! /* {{{ 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]; XSQLDA *isqlda, *osqlda; ibase_result_handle *ibase_result; ! IBASE_TLS_VARS; switch (ARG_COUNT(ht)) { case 1: if (getParameters(ht, 1, &query_arg) == FAILURE) { --- 979,1001 ---- } /* }}} */ ! /* {{{ 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; ! 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) { *************** *** 949,957 **** 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; --- 1015,1022 ---- 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; *************** *** 960,1012 **** 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; } ! osqlda = _php3_ibase_execute(tr_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->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; } --- 1025,1075 ---- 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; } *************** *** 1015,1025 **** } /* }}} */ /* {{{ _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]; --- 1078,1089 ---- } /* }}} */ + /* {{{ _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]; *************** *** 1027,1047 **** 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; } if (ibase_result->sqlda == NULL) { ! php3_error(E_WARNING,"InterBase: trying to fetch results from a non-select query"); RETURN_FALSE; } --- 1091,1132 ---- 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; } *************** *** 1062,1073 **** 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: --- 1147,1158 ---- 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: *************** *** 1078,1095 **** 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) { --- 1163,1180 ---- 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) { *************** *** 1104,1116 **** } 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) { --- 1189,1201 ---- } 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) { *************** *** 1118,1125 **** } 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; --- 1203,1210 ---- } 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; *************** *** 1134,1152 **** 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: 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_var, 1); ! _php3_hash_pointer_update(return_value->value.ht, var->sqlname, var->sqlname_length+1, result_var); } break; default: --- 1219,1301 ---- 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: *************** *** 1159,1174 **** } /* }}} */ ! /* {{{ 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 object 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); --- 1308,1323 ---- } /* }}} */ ! /* {{{ 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); *************** *** 1178,1183 **** --- 1327,1333 ---- } /* }}} */ + /* {{{ proto int ibase_free_result(int result) Free the memory used by a result. */ void php3_ibase_free_result(INTERNAL_FUNCTION_PARAMETERS) *************** *** 1187,1192 **** --- 1337,1344 ---- int type; IBASE_TLS_VARS; + RESET_ERRMSG; + if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result_var)==FAILURE) { WRONG_PARAM_COUNT; } *************** *** 1199,1205 **** 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); --- 1351,1357 ---- 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); *************** *** 1221,1226 **** --- 1373,1380 ---- ibase_query_handle *ibase_query; IBASE_TLS_VARS; + RESET_ERRMSG; + switch (ARG_COUNT(ht)) { case 1: if (getParameters(ht, 1, &query) == FAILURE) { *************** *** 1242,1248 **** 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; } --- 1396,1402 ---- 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; } *************** *** 1250,1256 **** 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; } } --- 1404,1410 ---- 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; } } *************** *** 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; --- 1413,1419 ---- 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; *************** *** 1275,1280 **** --- 1429,1436 ---- int type; IBASE_TLS_VARS; + RESET_ERRMSG; + if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &query)==FAILURE) { WRONG_PARAM_COUNT; } *************** *** 1287,1298 **** 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; } if (ibase_query->sqlda == NULL) { ! php3_error(E_WARNING,"InterBase: trying to bind a query having no parameter placeholders"); RETURN_FALSE; } --- 1443,1454 ---- 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; } *************** *** 1338,1343 **** --- 1494,1501 ---- XSQLDA *osqlda; IBASE_TLS_VARS; + RESET_ERRMSG; + if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &query)==FAILURE) { WRONG_PARAM_COUNT; } *************** *** 1350,1361 **** 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; } /* 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; --- 1508,1519 ---- 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; *************** *** 1373,1378 **** --- 1531,1538 ---- int type; IBASE_TLS_VARS; + RESET_ERRMSG; + if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &query_arg)==FAILURE) { WRONG_PARAM_COUNT; } *************** *** 1385,1391 **** 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); --- 1545,1551 ---- 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); *************** *** 1393,1398 **** --- 1553,1559 ---- } /* }}} */ + /* {{{ proto int ibase_timefmt(string format) Sets the format of datetime columns returned from queries. Still nonfunctional. */ void php3_ibase_timefmt(INTERNAL_FUNCTION_PARAMETERS) *************** *** 1400,1405 **** --- 1561,1568 ---- pval *fmt; IBASE_TLS_VARS; + RESET_ERRMSG; + #if HAVE_STRFTIME if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &fmt)==FAILURE) { WRONG_PARAM_COUNT; *************** *** 1409,1420 **** 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) --- 1572,1584 ---- 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"); 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) *************** *** 1423,1428 **** --- 1587,1594 ---- int type; ibase_result_handle *ibase_result; + RESET_ERRMSG; + if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result)==FAILURE) { WRONG_PARAM_COUNT; } *************** *** 1431,1450 **** 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) --- 1597,1616 ---- 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) *************** *** 1454,1461 **** 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; --- 1620,1628 ---- 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; *************** *** 1465,1476 **** 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; } --- 1632,1643 ---- 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; } *************** *** 1486,1522 **** 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); } /* }}} */ #endif /* --- 1653,2233 ---- 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); + } + /* }}} */ + + + #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); + } + /* }}} */ + + + /* {{{ 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); } /* }}} */ + + /* {{{ 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; + } + /* }}} */ + + + /* from file.c. I'm not sure, this variables always initialized? */ + 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 /* *************** *** 1525,1527 **** --- 2236,2239 ---- * c-basic-offset: 4 * End: */ + Index: php3/functions/php3_interbase.h diff -c php3/functions/php3_interbase.h:1.4 php3/functions/php3_interbase.h:1.5 *** php3/functions/php3_interbase.h:1.4 Thu Jan 7 03:58:08 1999 --- php3/functions/php3_interbase.h Sun Jan 31 05:33:10 1999 *************** *** 28,34 **** +----------------------------------------------------------------------+ */ ! /* $Id: php3_interbase.h,v 1.4 1999/01/07 08:58:08 jah Exp $ */ #ifndef _PHP3_IBASE_H #define _PHP3_IBASE_H --- 28,34 ---- +----------------------------------------------------------------------+ */ ! /* $Id: php3_interbase.h,v 1.5 1999/01/31 10:33:10 andrew Exp $ */ #ifndef _PHP3_IBASE_H #define _PHP3_IBASE_H *************** *** 60,83 **** 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 { --- 60,98 ---- 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); + + extern void php3_ibase_blob_create(INTERNAL_FUNCTION_PARAMETERS); + extern void php3_ibase_blob_add(INTERNAL_FUNCTION_PARAMETERS); + extern void php3_ibase_blob_cancel(INTERNAL_FUNCTION_PARAMETERS); + extern void php3_ibase_blob_open(INTERNAL_FUNCTION_PARAMETERS); + extern void php3_ibase_blob_get(INTERNAL_FUNCTION_PARAMETERS); + extern void php3_ibase_blob_close(INTERNAL_FUNCTION_PARAMETERS); + extern void php3_ibase_blob_echo(INTERNAL_FUNCTION_PARAMETERS); + extern void php3_ibase_blob_info(INTERNAL_FUNCTION_PARAMETERS); + extern void php3_ibase_blob_import(INTERNAL_FUNCTION_PARAMETERS); ! extern void php3_ibase_errmsg(INTERNAL_FUNCTION_PARAMETERS); + #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 { *************** *** 89,103 **** 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; --- 104,128 ---- 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; -- 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 (#3797) next »