From: Corne' Cornelius Date: Wed, 19 Feb 2003 09:29:26 +0000 (+0000) Subject: - Added Input Descriptor Binding to be used by blobs. This fixed a bug X-Git-Tag: RELEASE_0_5~879 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ad56bbe4a468091dc0f41345ac8e3afb127a4526;p=php - Added Input Descriptor Binding to be used by blobs. This fixed a bug where ESQL/C would cause a Segmentation fault if the first blob in a result is NULL or '' as soon as it gets a result with blob != NULL - Fixed leaks where blobs resources weren't always freed --- diff --git a/ext/informix/ifx.ec b/ext/informix/ifx.ec index 7d167e7134..816218ba70 100644 --- a/ext/informix/ifx.ec +++ b/ext/informix/ifx.ec @@ -67,24 +67,30 @@ static void php_ifx_set_default_link(int id TSRMLS_DC); static long php_intifx_getType(long id, HashTable *list TSRMLS_DC); static long php_intifx_create_blob(long type, long mode, char* param, long len, HashTable *list TSRMLS_DC); +static long php_intifx_init_blob(loc_t *blob, long mode, long new TSRMLS_DC); +static long php_intifx_init_blob_inmem(loc_t *blob, long new TSRMLS_DC); +static long php_intifx_init_blob_infile(loc_t *blob, long new TSRMLS_DC); +static void php_intifx_release_blob(loc_t *blob TSRMLS_DC); static long php_intifx_free_blob(long id, HashTable *list TSRMLS_DC); -static long php_intifx2_free_blob(long id, HashTable *list TSRMLS_DC); static long php_intifx_get_blob(long bid, HashTable *list, char** content TSRMLS_DC); static long php_intifx_update_blob(long bid, char* param, long len, HashTable *list TSRMLS_DC); static loc_t *php_intifx_get_blobloc(long bid, HashTable *list TSRMLS_DC); -static char* php_intifx_create_tmpfile(long bid TSRMLS_DC); +static char* php_intifx_create_tmpfile(TSRMLS_DC); static long php_intifx_copy_blob(long bid, HashTable *list TSRMLS_DC); +static long php_intifx_alloc_ibind(IFX_RES *Ifx_Result, int items TSRMLS_DC); +static long php_intifx_preparse(char *statement TSRMLS_DC); +static long php_intifx_count_descriptors(char *p_statemid TSRMLS_DC); static char* php_intifx_null(TSRMLS_D); static long php_intifx_create_char(char* param, long len, HashTable *list TSRMLS_DC); static long php_intifx_free_char(long id, HashTable *list TSRMLS_DC); static long php_intifx_update_char(long bid, char* param, long len, HashTable *list TSRMLS_DC); static long php_intifx_get_char(long bid, HashTable *list, char** content TSRMLS_DC); #if HAVE_IFX_IUS -static long php_intifxus_create_slob(long create_mode, HashTable *list TSRMLS_DC); +static long php_intifxus_create_slob(long create_mode, HashTable *list); static long php_intifxus_free_slob(long bid, HashTable *list TSRMLS_DC); static long php_intifxus_close_slob(long bid, HashTable *list TSRMLS_DC); static long php_intifxus_open_slob(long bid, long create_mode, HashTable *list TSRMLS_DC); -static long php_intifxus_new_slob(HashTable *list TSRMLS_DC); +static long php_intifxus_new_slob(HashTable *list); static ifx_lo_t *php_intifxus_get_slobloc(long bid, HashTable *list TSRMLS_DC); #endif @@ -116,7 +122,7 @@ typedef char IFX[128]; { \ if (ifx_check() < 0) { \ IFXG(sv_sqlcode) = SQLCODE; \ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Set connection %s fails (%s)", ifx, ifx_error(ifx)); \ + php_error(E_WARNING, "%s(): Set connection %s fails (%s)", get_active_function_name(TSRMLS_C), ifx, ifx_error(ifx)); \ RETURN_FALSE; \ } \ } @@ -301,7 +307,7 @@ EXEC SQL END DECLARE SECTION; EXEC SQL close database; EXEC SQL DISCONNECT CURRENT; } - free(link); + efree(link); IFXG(num_persistent)--; IFXG(num_links)--; } @@ -312,6 +318,35 @@ static void ifx_free_result(zend_rsrc_list_entry *rsrc TSRMLS_DC) efree(Ifx_Result); } +static void ifx_free_blob(zend_rsrc_list_entry *rsrc TSRMLS_DC) +{ + IFX_IDRES *Ifx_blob = (IFX_IDRES *)rsrc->ptr; + + +#if IFX_VERSION < 724 /* this Informix memory leak is fixed from 7.24 on */ + /* according to the current PERL DBD::Informix */ + /* and otherwise I get segmenation violations with 7.30 */ + + if(Ifx_blob->BLOB.mode==BLMODE_INMEM) { + if(Ifx_blob->BLOB.blob_data.loc_buffer==NULL || Ifx_blob->BLOB.blob_data.loc_size<=0) {;} else { + efree(Ifx_blob->BLOB.blob_data.loc_buffer); + } + } else { + if(Ifx_blob->BLOB.blob_data.loc_fname!=NULL) { + efree(Ifx_blob->BLOB.blob_data.loc_fname); + } + } + +#elif IFX_VERSION >= 952 /* This memory leak seems to be broken again */ + /* somewhere between 9.21 and 9.52 */ + + php_intifx_release_blob(&Ifx_blob->BLOB.blob_data TSRMLS_C); + +#endif + + efree(Ifx_blob); +} + PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("ifx.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateInt, allow_persistent, zend_ifx_globals, ifx_globals) STD_PHP_INI_ENTRY_EX("ifx.max_persistent", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_persistent, zend_ifx_globals, ifx_globals, display_link_numbers) @@ -342,7 +377,7 @@ PHP_MINIT_FUNCTION(ifx) REGISTER_INI_ENTRIES(); le_result = zend_register_list_destructors_ex(ifx_free_result,NULL, "informix result", module_number); - le_idresult = zend_register_list_destructors_ex(NULL, NULL, "informix id result", module_number); + le_idresult = zend_register_list_destructors_ex(ifx_free_blob, NULL, "informix id result", module_number); le_link = zend_register_list_destructors_ex(_close_ifx_link,NULL, "informix link", module_number); le_plink = zend_register_list_destructors_ex(NULL,_close_ifx_plink,"informix persistent link", module_number); ifx_module_entry.type = type; @@ -411,6 +446,7 @@ static void php_ifx_set_default_link(int id TSRMLS_DC) static void php_ifx_do_connect(INTERNAL_FUNCTION_PARAMETERS,int persistent) { + zval **yyhost, **yyuser, **yypasswd; char *hashed_details; int hashed_details_length; @@ -421,7 +457,7 @@ EXEC SQL END DECLARE SECTION; if (PG(sql_safe_mode)) { if (ZEND_NUM_ARGS()>0) { - php_error_docref(NULL TSRMLS_CC, E_NOTICE, "SQL safe mode in effect - ignoring host/user/password information"); + php_error(E_NOTICE, "%s(): SQL safe mode in effect - ignoring host/user/password information", get_active_function_name(TSRMLS_C)); } host = passwd = NULL; user = php_get_current_user(); @@ -429,30 +465,55 @@ EXEC SQL END DECLARE SECTION; hashed_details = (char *) emalloc(hashed_details_length+1); sprintf(hashed_details,"ifx__%s_",user); } else { - int host_len = 0, user_len = 0, passwd_len = 0; - host = user = passwd = NULL; - - /* set default values if any are avaliable */ - if (IFXG(default_host)) { - host = IFXG(default_host); - host_len = strlen(host); - } - if (IFXG(default_user)) { - user = IFXG(default_user); - user_len = strlen(IFXG(default_user)); - } - if (IFXG(default_password)) { - passwd = IFXG(default_password); - passwd_len = strlen(IFXG(default_password)); - } + host = IFXG(default_host); + user = IFXG(default_user); + passwd = IFXG(default_password); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sss", &host, &host_len, &user, &user_len, &passwd, &passwd_len) == FAILURE) { - return; + switch(ZEND_NUM_ARGS()) { + case 0: /* defaults */ + break; + case 1: { + if (zend_get_parameters_ex(1, &yyhost)==FAILURE) { + RETURN_FALSE; + } + convert_to_string_ex(yyhost); + host = Z_STRVAL_PP(yyhost); + } + break; + case 2: { + if (zend_get_parameters_ex(2, &yyhost, &yyuser)==FAILURE) { + RETURN_FALSE; + } + convert_to_string_ex(yyhost); + convert_to_string_ex(yyuser); + host = Z_STRVAL_PP(yyhost); + user = Z_STRVAL_PP(yyuser); + } + break; + case 3: { + if (zend_get_parameters_ex(3, &yyhost, &yyuser, &yypasswd)==FAILURE) { + RETURN_FALSE; + } + convert_to_string_ex(yyhost); + convert_to_string_ex(yyuser); + convert_to_string_ex(yypasswd); + host = Z_STRVAL_PP(yyhost); + user = Z_STRVAL_PP(yyuser); + passwd = Z_STRVAL_PP(yypasswd); + } + break; + default: + WRONG_PARAM_COUNT; + break; } - hashed_details_length = sizeof("ifx___") - 1 + host_len + user_len + passwd_len; + hashed_details_length = sizeof("ifx___")-1+ strlen(SAFE_STRING(host))+ + strlen(SAFE_STRING(user))+ + strlen(SAFE_STRING(passwd)); hashed_details = (char *) emalloc(hashed_details_length+1); - sprintf(hashed_details,"ifx_%s_%s_%s", SAFE_STRING(host), SAFE_STRING(user), SAFE_STRING(passwd)); + sprintf(hashed_details,"ifx_%s_%s_%s", SAFE_STRING(host), + SAFE_STRING(user), + SAFE_STRING(passwd)); } IFXG(sv_sqlcode) = 0; @@ -468,27 +529,27 @@ EXEC SQL END DECLARE SECTION; list_entry new_le; if (IFXG(max_links)!=-1 && IFXG(num_links) >= IFXG(max_links)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%d)", IFXG(num_links)); + php_error(E_WARNING, "%s(): Too many open links (%d)", get_active_function_name(TSRMLS_C), IFXG(num_links)); efree(hashed_details); RETURN_FALSE; } if (IFXG(max_persistent)!=-1 && IFXG(num_persistent) >= IFXG(max_persistent)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open persistent links (%d)", IFXG(num_persistent)); + php_error(E_WARNING, "%s(): Too many open persistent links (%d)", get_active_function_name(TSRMLS_C), IFXG(num_persistent)); efree(hashed_details); RETURN_FALSE; } /* create the link */ - ifx = (char *) malloc(sizeof(IFX)); + ifx = (char *) emalloc(sizeof(IFX)); IFXG(connectionid)++; - sprintf(ifx,"%s%x", SAFE_STRING(user), IFXG(connectionid)); + sprintf(ifx,"%s%x", user, IFXG(connectionid)); EXEC SQL CONNECT TO :host AS :ifx USER :user USING :passwd WITH CONCURRENT TRANSACTION; if (ifx_check() == IFX_ERROR) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ifx_error(ifx)); - free(ifx); + php_error(E_WARNING, "%s(): %s", get_active_function_name(TSRMLS_C), ifx_error(ifx)); + efree(ifx); efree(hashed_details); RETURN_FALSE; } @@ -498,7 +559,7 @@ EXEC SQL END DECLARE SECTION; new_le.ptr = ifx; if (zend_hash_update(&EG(persistent_list), hashed_details, hashed_details_length+1, (void *) &new_le, sizeof(list_entry), NULL)==FAILURE) { - free(ifx); + efree(ifx); efree(hashed_details); RETURN_FALSE; } @@ -517,7 +578,7 @@ EXEC SQL END DECLARE SECTION; if (ifx_check() == IFX_ERROR) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Link to server lost, unable to reconnect (%s)", ifx_error(ifx)); + php_error(E_WARNING, "%s(): Link to server lost, unable to reconnect (%s)", get_active_function_name(TSRMLS_C), ifx_error(ifx)); zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_length+1); efree(hashed_details); RETURN_FALSE; @@ -555,7 +616,7 @@ EXEC SQL END DECLARE SECTION; if (ifx_check() == IFX_ERROR) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to connect (%s)", ifx_error(ifx)); + php_error(E_WARNING, "%s(): Unable to connect (%s)", get_active_function_name(TSRMLS_C), ifx_error(ifx)); zend_hash_del(&EG(regular_list), hashed_details, hashed_details_length+1); efree(hashed_details); RETURN_FALSE; @@ -572,7 +633,7 @@ EXEC SQL END DECLARE SECTION; } } if (IFXG(max_links) != -1 && IFXG(num_links) >= IFXG(max_links)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%d)", IFXG(num_links)); + php_error(E_WARNING, "%s(): Too many open links (%d)", get_active_function_name(TSRMLS_C), IFXG(num_links)); efree(hashed_details); RETURN_FALSE; } @@ -585,7 +646,7 @@ EXEC SQL END DECLARE SECTION; if (ifx_check() == IFX_ERROR) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ifx_error(ifx)); + php_error(E_WARNING,"%s(): %s", get_active_function_name(TSRMLS_C), ifx_error(ifx)); efree(hashed_details); efree(ifx); RETURN_FALSE; @@ -710,6 +771,7 @@ EXEC SQL BEGIN DECLARE SECTION; char cursorid[32]; /* query cursor id */ char statemid[32]; /* statement id */ char descrpid[32]; /* descriptor id */ + char i_descrpid[32]; /* input descriptor binding */ char *statement; /* query text */ int fieldcount; /* field count */ int i; /* field index */ @@ -720,12 +782,12 @@ EXEC SQL BEGIN DECLARE SECTION; char *char_tmp; long len; int indicator; + int desc_count; $ifdef HAVE_IFX_IUS; fixed binary 'blob' ifx_lo_t *slocator; $endif; EXEC SQL END DECLARE SECTION; - char *blobfilename; int locind; int ctype; int affected_rows; @@ -735,6 +797,7 @@ EXEC SQL END DECLARE SECTION; int cursoryproc; int argc=ZEND_NUM_ARGS(); long ifx_type; + int num_params; if(argc < 2 || zend_get_parameters_ex(argc, &query, &ifx_link, &dummy, &dummy)==FAILURE) { WRONG_PARAM_COUNT; @@ -752,6 +815,7 @@ EXEC SQL END DECLARE SECTION; sprintf(statemid, "statem%x", IFXG(cursorid)); sprintf(cursorid, "cursor%x", IFXG(cursorid)); sprintf(descrpid, "descrp%x", IFXG(cursorid)); + sprintf(i_descrpid, "i_descrp%x", IFXG(cursorid)); EXEC SQL set connection :ifx; PHP_IFX_CHECK_CONNECTION(ifx); @@ -759,48 +823,69 @@ EXEC SQL END DECLARE SECTION; EXEC SQL PREPARE :statemid FROM :statement; if (ifx_check() < 0) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Prepare fails (%s)", ifx_error(ifx)); + php_error(E_WARNING, "%s(): Prepare fails (%s)", get_active_function_name(TSRMLS_C), ifx_error(ifx)); RETURN_FALSE; } affected_rows = sqlca.sqlerrd[0]; /* save estimated affected rows */ for (e = 0; e < 6; e++) sqlerrd[e] = sqlca.sqlerrd[e]; - EXEC SQL ALLOCATE DESCRIPTOR :descrpid WITH MAX 384; - if (ifx_check() < 0) { + num_params = php_intifx_preparse(statement); + + Ifx_Result = (IFX_RES *) emalloc(sizeof(IFX_RES)); + if (Ifx_Result == NULL) { + php_error(E_WARNING, "%s(): Out of memory allocating IFX_RES", get_active_function_name(TSRMLS_C)); + EXEC SQL free :statemid; + RETURN_FALSE; + } + + /* initialize result data structure */ + + Ifx_Result->rowid = 0; + strcpy(Ifx_Result->connecid, ifx); + strcpy(Ifx_Result->cursorid, cursorid); + strcpy(Ifx_Result->descrpid, descrpid); + strcpy(Ifx_Result->i_descrpid, i_descrpid); + strcpy(Ifx_Result->statemid, statemid); + Ifx_Result->numcols = 0; + Ifx_Result->numicols = 0; + + for (i = 0; i < MAX_RESID; ++i) { + Ifx_Result->res_id[i] = -1; + } + + + if (!php_intifx_alloc_ibind(Ifx_Result, num_params)) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Allocate desciptor <%s> fails (%s)", descrpid, ifx_error(ifx)); EXEC SQL free :statemid; + efree(Ifx_Result); + php_error(E_WARNING, "%s(): Allocate i_desciptor <%s> fails (%s)", get_active_function_name(TSRMLS_C), i_descrpid, ifx_error(ifx)); RETURN_FALSE; } + - EXEC SQL DESCRIBE :statemid USING SQL DESCRIPTOR :descrpid; + desc_count = php_intifx_count_descriptors(statemid); + if (desc_count == 0) + desc_count = 1; + + EXEC SQL ALLOCATE DESCRIPTOR :descrpid WITH MAX :desc_count; if (ifx_check() < 0) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Describe fails (%s)", ifx_error(ifx)); - EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; + php_error(E_WARNING, "%s(): Allocate desciptor <%s> fails (%s)", get_active_function_name(TSRMLS_C), descrpid, ifx_error(ifx)); EXEC SQL free :statemid; RETURN_FALSE; } - query_type = sqlca.sqlcode; - - Ifx_Result = (IFX_RES *) emalloc(sizeof(IFX_RES)); - if (Ifx_Result == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Out of memory allocating IFX_RES"); + EXEC SQL DESCRIBE :statemid USING SQL DESCRIPTOR :descrpid; + if (ifx_check() < 0) { + IFXG(sv_sqlcode) = SQLCODE; + php_error(E_WARNING, "%s(): Describe fails (%s)", get_active_function_name(TSRMLS_C), ifx_error(ifx)); EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; EXEC SQL free :statemid; RETURN_FALSE; } - /* initialize result data structure */ - - Ifx_Result->rowid = 0; - strcpy(Ifx_Result->connecid, ifx); - strcpy(Ifx_Result->descrpid, descrpid); - for (i = 0; i < MAX_RESID; ++i) { - Ifx_Result->res_id[i] = -1; - } + query_type = sqlca.sqlcode; cursoryproc = 0; if (query_type == SQ_EXECPROC) { @@ -820,10 +905,9 @@ EXEC SQL END DECLARE SECTION; */ zval **pblobidarr, **tmp; + EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; + Ifx_Result->iscursory = 0; - strcpy(Ifx_Result->cursorid, ""); - strcpy(Ifx_Result->descrpid, descrpid); - strcpy(Ifx_Result->statemid, statemid); if(argc > 3) { WRONG_PARAM_COUNT; @@ -835,25 +919,22 @@ EXEC SQL END DECLARE SECTION; EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; EXEC SQL free :statemid; efree(Ifx_Result); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't get blob array param"); + php_error(E_WARNING, "%s(): Can't get blob array param", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } + if (Z_TYPE_PP(pblobidarr) != IS_ARRAY) { IFXG(sv_sqlcode) = SQLCODE; EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; EXEC SQL free :statemid; efree(Ifx_Result); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Blob-parameter is not an array"); + php_error(E_WARNING, "%s(): Blob-parameter is not an array", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } zend_hash_internal_pointer_reset((*pblobidarr)->value.ht); - i=1; - while (zend_hash_get_current_data((*pblobidarr)->value.ht, (void **) &tmp) == SUCCESS) { + for (i = 1; i <= num_params && (zend_hash_get_current_data((*pblobidarr)->value.ht, (void **) &tmp) == SUCCESS); ++i) { convert_to_long(*tmp); - if ((query_type == SQ_UPDATE) || (query_type == SQ_UPDALL)) { - EXEC SQL SET DESCRIPTOR :descrpid COUNT = :i; - } ifx_type=php_intifx_getType((int)(*tmp)->value.lval,&EG(regular_list) TSRMLS_CC); switch(ifx_type) { @@ -863,21 +944,22 @@ EXEC SQL END DECLARE SECTION; if(locator==NULL) { IFXG(sv_sqlcode) = SQLCODE; EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; + EXEC SQL DEALLOCATE DESCRIPTOR :i_descrpid; EXEC SQL free :statemid; efree(Ifx_Result); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not an Informix blob-result index", (int)((*tmp)->value.lval)); + php_error(E_WARNING,"%s(): %d is not an Informix blob-result index", get_active_function_name(TSRMLS_C), (int)((*tmp)->value.lval)); RETURN_FALSE; } if(locator->loc_loctype==LOCFNAME) { locator->loc_oflags=LOC_RONLY; } - EXEC SQL SET DESCRIPTOR :descrpid VALUE :i DATA= :*locator, TYPE= :loc_t_type; + EXEC SQL SET DESCRIPTOR :i_descrpid VALUE :i DATA = :*locator, TYPE = :loc_t_type; break; case TYPE_CHAR: len=php_intifx_get_char((int)((*tmp)->value.lval),&EG(regular_list),&char_tmp TSRMLS_CC); indicator=0; - if(char_tmp==NULL || len<0) { + if(char_tmp==NULL || len < 0) { indicator=-1; } len++; @@ -889,11 +971,33 @@ EXEC SQL END DECLARE SECTION; TYPE= :sqlchar_type; break; } - i++; + + if (ifx_check() < 0) { + IFXG(sv_sqlcode) = SQLCODE; + EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; + EXEC SQL DEALLOCATE DESCRIPTOR :i_descrpid; + EXEC SQL free :statemid; + efree(Ifx_Result); + php_error(E_WARNING, "%s(): Execute immediate fails : %s (%s)", get_active_function_name(TSRMLS_C), statement, ifx_error(ifx)); + RETURN_FALSE; + } + zend_hash_move_forward((*pblobidarr)->value.ht); } Ifx_Result->paramquery=1; - EXEC SQL EXECUTE :statemid USING SQL DESCRIPTOR :descrpid; + + if (--i != num_params) { + EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; + EXEC SQL DEALLOCATE DESCRIPTOR :i_descrpid; + EXEC SQL free :statemid; + efree(Ifx_Result); + php_error(E_WARNING, "%s(): Execute immediate fails : number of created blobs doesn't match placeholders (?)", get_active_function_name(TSRMLS_C), statement); + RETURN_FALSE; + } + + + EXEC SQL EXECUTE :statemid USING SQL DESCRIPTOR :i_descrpid; + } else { EXEC SQL EXECUTE :statemid; } @@ -901,9 +1005,12 @@ EXEC SQL END DECLARE SECTION; if (ifx_check() < 0) { IFXG(sv_sqlcode) = SQLCODE; EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; + if (Ifx_Result->numicols > 0) { + EXEC SQL DEALLOCATE DESCRIPTOR :i_descrpid; + } EXEC SQL free :statemid; efree(Ifx_Result); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Execute immediate fails : %s (%s)", statement, ifx_error(ifx)); + php_error(E_WARNING, "%s(): Execute immediate fails : %s (%s)", get_active_function_name(TSRMLS_C), statement, ifx_error(ifx)); RETURN_FALSE; } Ifx_Result->affected_rows = sqlca.sqlerrd[2]; /* really affected */ @@ -940,7 +1047,7 @@ EXEC SQL END DECLARE SECTION; EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; EXEC SQL free :statemid; efree(Ifx_Result); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can not get descriptor %s (%s)", descrpid, ifx_error(ifx)); + php_error(E_WARNING, "%s(): Can not get descriptor %s (%s)", get_active_function_name(TSRMLS_C), descrpid, ifx_error(ifx)); RETURN_FALSE; } @@ -954,6 +1061,10 @@ EXEC SQL END DECLARE SECTION; Ifx_Result->ishold = 1; } + /* + * ifx_do part + */ + if (Ifx_Result->isscroll) { if (Ifx_Result->ishold) { EXEC SQL DECLARE :cursorid SCROLL CURSOR WITH HOLD FOR :statemid; @@ -973,7 +1084,7 @@ EXEC SQL END DECLARE SECTION; EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; EXEC SQL free :statemid; efree(Ifx_Result); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Declare cursor fails (%s)", ifx_error(ifx)); + php_error(E_WARNING, "%s(): Declare cursor fails (%s)", get_active_function_name(TSRMLS_C), ifx_error(ifx)); RETURN_FALSE; } @@ -984,12 +1095,9 @@ EXEC SQL END DECLARE SECTION; EXEC SQL free :statemid; EXEC SQL free :cursorid; efree(Ifx_Result); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Open cursor fails (%s)", ifx_error(ifx)); + php_error(E_WARNING, "%s(): Open cursor fails (%s)", get_active_function_name(TSRMLS_C), ifx_error(ifx)); RETURN_FALSE; } - strcpy(Ifx_Result->cursorid, cursorid); - strcpy(Ifx_Result->descrpid, descrpid); - strcpy(Ifx_Result->statemid, statemid); /* check for text/blob columns */ locind = 0; @@ -1002,25 +1110,31 @@ $endif; ) { int bid = 0; if(fieldtype==SQLTEXT) { - bid=php_intifx_create_blob(TYPE_BLTEXT,BLMODE_INMEM,"",-1,&EG(regular_list) TSRMLS_CC); - locator=php_intifx_get_blobloc(bid,&EG(regular_list) TSRMLS_CC); + if(IFXG(blobinfile)==0) { + bid=php_intifx_create_blob(TYPE_BLTEXT,BLMODE_INMEM,"",-1,&EG(regular_list) TSRMLS_CC); + locator=php_intifx_get_blobloc(bid,&EG(regular_list) TSRMLS_CC); + } else { + bid=php_intifx_create_blob(TYPE_BLTEXT,BLMODE_INFILE, "",-1,&EG(regular_list) TSRMLS_CC); + locator=php_intifx_get_blobloc(bid,&EG(regular_list) TSRMLS_CC); + } EXEC SQL SET DESCRIPTOR :descrpid VALUE :i DATA = :*locator; } - if(fieldtype==SQLBYTES) { + else if(fieldtype==SQLBYTES) { if(IFXG(blobinfile)==0) { bid=php_intifx_create_blob(TYPE_BLBYTE,BLMODE_INMEM,"",-1,&EG(regular_list) TSRMLS_CC); locator=php_intifx_get_blobloc(bid,&EG(regular_list) TSRMLS_CC); } else { - blobfilename=php_intifx_create_tmpfile(i TSRMLS_CC); - bid=php_intifx_create_blob(TYPE_BLBYTE,BLMODE_INFILE, blobfilename,strlen(blobfilename),&EG(regular_list) TSRMLS_CC); + bid=php_intifx_create_blob(TYPE_BLBYTE,BLMODE_INFILE, "",-1,&EG(regular_list) TSRMLS_CC); locator=php_intifx_get_blobloc(bid,&EG(regular_list) TSRMLS_CC); - locator->loc_oflags=LOC_WONLY; } EXEC SQL SET DESCRIPTOR :descrpid VALUE :i DATA = :*locator; } + + php_intifx_release_blob(locator TSRMLS_C); + $ifdef HAVE_IFX_IUS; if(fieldtype==SQLUDTFIXED) { - bid = php_intifxus_new_slob(&EG(regular_list) TSRMLS_CC); + bid=php_intifxus_new_slob(&EG(regular_list)); slocator=php_intifxus_get_slobloc(bid,&EG(regular_list) TSRMLS_CC); EXEC SQL SET DESCRIPTOR :descrpid VALUE :i DATA = :*slocator; } @@ -1066,6 +1180,7 @@ EXEC SQL BEGIN DECLARE SECTION; char cursorid[32]; /* query cursor id */ char statemid[32]; /* statement id */ char descrpid[32]; /* descriptor id */ + char i_descrpid[32]; /* input descriptor binding */ char *statement; /* query text */ int fieldcount; /* field count */ int i; /* field index */ @@ -1077,6 +1192,7 @@ EXEC SQL BEGIN DECLARE SECTION; int indicator; long sqlerrd[6]; int e; + int desc_count; EXEC SQL END DECLARE SECTION; int ctype; @@ -1085,6 +1201,7 @@ EXEC SQL END DECLARE SECTION; int cursoryproc; int argc=ZEND_NUM_ARGS(); long ifx_type; + int num_params; if(argc < 2 || zend_get_parameters_ex(argc, &query, &ifx_link, &dummy, &dummy)==FAILURE) { WRONG_PARAM_COUNT; @@ -1102,6 +1219,7 @@ EXEC SQL END DECLARE SECTION; sprintf(statemid, "statem%x", IFXG(cursorid)); sprintf(cursorid, "cursor%x", IFXG(cursorid)); sprintf(descrpid, "descrp%x", IFXG(cursorid)); + sprintf(i_descrpid, "i_descrp%x", IFXG(cursorid)); EXEC SQL set connection :ifx; PHP_IFX_CHECK_CONNECTION(ifx); @@ -1109,49 +1227,69 @@ EXEC SQL END DECLARE SECTION; EXEC SQL PREPARE :statemid FROM :statement; if (ifx_check() < 0) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Prepare fails (%s)", ifx_error(ifx)); + php_error(E_WARNING, "%s(): Prepare fails (%s)", get_active_function_name(TSRMLS_C), ifx_error(ifx)); RETURN_FALSE; } affected_rows = sqlca.sqlerrd[0]; /* save estimated affected rows */ for (e = 0; e < 6; e++) sqlerrd[e] = sqlca.sqlerrd[e]; - EXEC SQL ALLOCATE DESCRIPTOR :descrpid WITH MAX 384; - if (ifx_check() < 0) { + num_params = php_intifx_preparse(statement); + + Ifx_Result = (IFX_RES *) emalloc(sizeof(IFX_RES)); + if (Ifx_Result == NULL) { + php_error(E_WARNING, "%s(): Out of memory allocating IFX_RES", get_active_function_name(TSRMLS_C)); + EXEC SQL free :statemid; + RETURN_FALSE; + } + + /* initialize result data structure */ + + Ifx_Result->rowid = 0; + strcpy(Ifx_Result->connecid, ifx); + strcpy(Ifx_Result->cursorid, cursorid); + strcpy(Ifx_Result->descrpid, descrpid); + strcpy(Ifx_Result->i_descrpid, i_descrpid); + strcpy(Ifx_Result->statemid, statemid); + Ifx_Result->numcols = 0; + Ifx_Result->numicols = 0; + + for (i = 0; i < MAX_RESID; ++i) { + Ifx_Result->res_id[i] = -1; + } + + + if (!php_intifx_alloc_ibind(Ifx_Result, num_params)) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Allocate desciptor <%s> fails (%s)", descrpid, ifx_error(ifx)); EXEC SQL free :statemid; + efree(Ifx_Result); + php_error(E_WARNING, "%s(): Allocate i_desciptor <%s> fails (%s)", get_active_function_name(TSRMLS_C), i_descrpid, ifx_error(ifx)); RETURN_FALSE; } - EXEC SQL DESCRIBE :statemid USING SQL DESCRIPTOR :descrpid; + + desc_count = php_intifx_count_descriptors(statemid); + if (desc_count == 0) + desc_count = 1; + + EXEC SQL ALLOCATE DESCRIPTOR :descrpid WITH MAX :desc_count; if (ifx_check() < 0) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Describe fails (%s)", ifx_error(ifx)); - EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; + php_error(E_WARNING, "%s(): Allocate desciptor <%s> fails (%s)", get_active_function_name(TSRMLS_C), descrpid, ifx_error(ifx)); EXEC SQL free :statemid; RETURN_FALSE; } - - query_type = sqlca.sqlcode; - - Ifx_Result = (IFX_RES *) emalloc(sizeof(IFX_RES)); - if (Ifx_Result == NULL) { + + EXEC SQL DESCRIBE :statemid USING SQL DESCRIPTOR :descrpid; + if (ifx_check() < 0) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Out of memory allocating IFX_RES"); + php_error(E_WARNING, "%s(): Describe fails (%s)", get_active_function_name(TSRMLS_C), ifx_error(ifx)); EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; EXEC SQL free :statemid; RETURN_FALSE; } - /* initialize result data structure */ - Ifx_Result->rowid = 0; - strcpy(Ifx_Result->connecid, ifx); - strcpy(Ifx_Result->descrpid, descrpid); - strcpy(Ifx_Result->statemid, statemid); - for (i = 0; i < MAX_RESID; ++i) { - Ifx_Result->res_id[i] = -1; - } + query_type = sqlca.sqlcode; cursoryproc = 0; if (query_type == SQ_EXECPROC) { @@ -1171,10 +1309,9 @@ EXEC SQL END DECLARE SECTION; */ zval **pblobidarr, **tmp; + EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; + Ifx_Result->iscursory = 0; - strcpy(Ifx_Result->cursorid, cursorid); - strcpy(Ifx_Result->cursorid, ""); - strcpy(Ifx_Result->descrpid, descrpid); if(argc > 3) { WRONG_PARAM_COUNT; @@ -1182,32 +1319,28 @@ EXEC SQL END DECLARE SECTION; if(argc == 3) { Ifx_Result->paramquery=1; - if (zend_get_parameters_ex(3, &dummy, &dummy,&pblobidarr) == FAILURE) { + if (zend_get_parameters_ex(3, &dummy, &dummy, &pblobidarr) == FAILURE) { IFXG(sv_sqlcode) = SQLCODE; EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; EXEC SQL free :statemid; efree(Ifx_Result); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't get blob array param"); + php_error(E_WARNING, "%s(): Can't get blob array param", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } - if((*pblobidarr)->type != IS_ARRAY) { + if (Z_TYPE_PP(pblobidarr) != IS_ARRAY) { IFXG(sv_sqlcode) = SQLCODE; EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; EXEC SQL free :statemid; efree(Ifx_Result); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Blob-parameter not an array"); + php_error(E_WARNING, "%s(): Blob-parameter not an array", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } zend_hash_internal_pointer_reset((*pblobidarr)->value.ht); - i=1; - while (zend_hash_get_current_data((*pblobidarr)->value.ht, (void **) &tmp) == SUCCESS) { + for (i = 1; i <= num_params && (zend_hash_get_current_data((*pblobidarr)->value.ht, (void **) &tmp) == SUCCESS); ++i) { convert_to_long(*tmp); - if ((query_type == SQ_UPDATE) || (query_type == SQ_UPDALL)) { - EXEC SQL SET DESCRIPTOR :descrpid COUNT = :i; - } - + ifx_type=php_intifx_getType((int)(*tmp)->value.lval,&EG(regular_list) TSRMLS_CC); switch(ifx_type) { case TYPE_BLTEXT: @@ -1216,19 +1349,20 @@ EXEC SQL END DECLARE SECTION; if(locator==NULL) { IFXG(sv_sqlcode) = SQLCODE; EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; + EXEC SQL DEALLOCATE DESCRIPTOR :i_descrpid; EXEC SQL free :statemid; efree(Ifx_Result); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix blob-result index", (int)((*tmp)->value.lval)); + php_error(E_WARNING, "%s(): %d is not a Informix blob-result index", get_active_function_name(TSRMLS_C), (int)((*tmp)->value.lval)); RETURN_FALSE; } if(locator->loc_loctype==LOCFNAME) { locator->loc_oflags=LOC_RONLY; } - EXEC SQL SET DESCRIPTOR :descrpid VALUE :i DATA= :*locator, TYPE=:loc_t_type; + EXEC SQL SET DESCRIPTOR :i_descrpid VALUE :i DATA = :*locator, TYPE = :loc_t_type; break; + case TYPE_CHAR: len=php_intifx_get_char((int)((*tmp)->value.lval),&EG(regular_list),&char_tmp TSRMLS_CC); - indicator=0; if(char_tmp==NULL || len < 0) { indicator=-1; @@ -1242,9 +1376,30 @@ EXEC SQL END DECLARE SECTION; TYPE= :sqlchar_type; break; } - i++; + + if (ifx_check() < 0) { + IFXG(sv_sqlcode) = SQLCODE; + EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; + EXEC SQL DEALLOCATE DESCRIPTOR :i_descrpid; + EXEC SQL free :statemid; + efree(Ifx_Result); + php_error(E_WARNING, "%s(): Execute immediate fails : %s (%s)", get_active_function_name(TSRMLS_C), statement, ifx_error(ifx)); + RETURN_FALSE; + } + zend_hash_move_forward((*pblobidarr)->value.ht); + } + + if (--i != num_params) { + EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; + EXEC SQL DEALLOCATE DESCRIPTOR :i_descrpid; + EXEC SQL free :statemid; + efree(Ifx_Result); + php_error(E_WARNING, "%s(): Execute immediate fails : number of created blobs doesn't match placeholders (?)", get_active_function_name(TSRMLS_C), statement); + RETURN_FALSE; + } + } Ifx_Result->affected_rows = affected_rows; /* saved estimated from prepare */ @@ -1255,6 +1410,7 @@ EXEC SQL END DECLARE SECTION; ## SELECT-STATEMENT ## */ + ctype = 0; /* preset */ switch(argc) { @@ -1272,7 +1428,6 @@ EXEC SQL END DECLARE SECTION; break; } - strcpy(Ifx_Result->cursorid, cursorid); Ifx_Result->iscursory = 1; Ifx_Result->affected_rows = affected_rows; /* saved estimated from prepare */ @@ -1284,9 +1439,10 @@ EXEC SQL END DECLARE SECTION; EXEC SQL DEALLOCATE DESCRIPTOR :descrpid; EXEC SQL free :statemid; efree(Ifx_Result); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can not get descriptor %s (%s)", descrpid, ifx_error(ifx)); + php_error(E_WARNING, "%s(): Can not get descriptor %s (%s)", get_active_function_name(TSRMLS_C), descrpid, ifx_error(ifx)); RETURN_FALSE; } + Ifx_Result->numcols = fieldcount; Ifx_Result->isscroll = Ifx_Result->ishold = 0; @@ -1326,6 +1482,7 @@ EXEC SQL BEGIN DECLARE SECTION; char *cursorid; /* query cursor id */ char *statemid; /* statement id */ char *descrpid; /* descriptor id */ + char *i_descrpid; /* descriptor id */ int fieldcount; /* field count */ int i; /* field index */ short fieldtype; @@ -1337,7 +1494,6 @@ $endif; EXEC SQL END DECLARE SECTION; int locind; - char *blobfilename; if(ZEND_NUM_ARGS() != 1 || (zend_get_parameters_ex(1, &result)==FAILURE)) { WRONG_PARAM_COUNT; @@ -1351,25 +1507,26 @@ EXEC SQL END DECLARE SECTION; cursorid = Ifx_Result->cursorid; statemid = Ifx_Result->statemid; descrpid = Ifx_Result->descrpid; + i_descrpid = Ifx_Result->i_descrpid; fieldcount = Ifx_Result->numcols; EXEC SQL set connection :ifx; PHP_IFX_CHECK_CONNECTION(ifx); if (Ifx_Result->iscursory < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Resultindex %d is not a prepared query", Z_LVAL_PP(result)); + php_error(E_WARNING, "%s(): Resultindex %d is not a prepared query", get_active_function_name(TSRMLS_C), Z_LVAL_PP(result)); RETURN_FALSE; } if (Ifx_Result->iscursory==0) { /* execute immediate */ if(Ifx_Result->paramquery!=0) { - EXEC SQL EXECUTE :statemid USING SQL DESCRIPTOR :descrpid; + EXEC SQL EXECUTE :statemid USING SQL DESCRIPTOR :i_descrpid; } else { EXEC SQL EXECUTE :statemid; } if (ifx_check() < 0) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Execute immediate fails: %s", ifx_error(ifx)); + php_error(E_WARNING, "%s(): Execute immediate fails: %s", get_active_function_name(TSRMLS_C), ifx_error(ifx)); RETURN_FALSE; } Ifx_Result->affected_rows = sqlca.sqlerrd[2]; /* really affected */ @@ -1391,14 +1548,14 @@ EXEC SQL END DECLARE SECTION; if (ifx_check() < 0) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Declare cursor fails (%s)", ifx_error(ifx)); + php_error(E_WARNING, "%s(): Declare cursor fails (%s)", get_active_function_name(TSRMLS_C), ifx_error(ifx)); RETURN_FALSE; } EXEC SQL OPEN :cursorid; if (ifx_check() < 0) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Open cursor fails (%s)", ifx_error(ifx)); + php_error(E_WARNING, "%s(): Open cursor fails (%s)", get_active_function_name(TSRMLS_C), ifx_error(ifx)); RETURN_FALSE; } @@ -1414,25 +1571,28 @@ $endif; int bid = 0; if(fieldtype==SQLTEXT) { - bid=php_intifx_create_blob(TYPE_BLTEXT,BLMODE_INMEM,"",-1,&EG(regular_list) TSRMLS_CC); - locator=php_intifx_get_blobloc(bid,&EG(regular_list) TSRMLS_CC); + if(IFXG(blobinfile)==0) { + bid=php_intifx_create_blob(TYPE_BLTEXT,BLMODE_INMEM,"",-1,&EG(regular_list) TSRMLS_CC); + locator=php_intifx_get_blobloc(bid,&EG(regular_list) TSRMLS_CC); + } else { + bid=php_intifx_create_blob(TYPE_BLTEXT,BLMODE_INFILE,"", -1,&EG(regular_list) TSRMLS_CC); + locator=php_intifx_get_blobloc(bid,&EG(regular_list) TSRMLS_CC); + } EXEC SQL SET DESCRIPTOR :descrpid VALUE :i DATA = :*locator; } - if(fieldtype==SQLBYTES) { + else if(fieldtype==SQLBYTES) { if(IFXG(blobinfile)==0) { bid=php_intifx_create_blob(TYPE_BLBYTE,BLMODE_INMEM,"",-1,&EG(regular_list) TSRMLS_CC); locator=php_intifx_get_blobloc(bid,&EG(regular_list) TSRMLS_CC); } else { - blobfilename=php_intifx_create_tmpfile(i TSRMLS_CC); - bid=php_intifx_create_blob(TYPE_BLBYTE,BLMODE_INFILE,blobfilename,strlen(blobfilename),&EG(regular_list) TSRMLS_CC); + bid=php_intifx_create_blob(TYPE_BLBYTE,BLMODE_INFILE,"", -1,&EG(regular_list) TSRMLS_CC); locator=php_intifx_get_blobloc(bid,&EG(regular_list) TSRMLS_CC); - locator->loc_oflags=LOC_WONLY; } EXEC SQL SET DESCRIPTOR :descrpid VALUE :i DATA = :*locator; } $ifdef HAVE_IFX_IUS; if(fieldtype==SQLUDTFIXED) { - bid=php_intifxus_new_slob(&EG(regular_list) TSRMLS_CC); + bid=php_intifxus_new_slob(&EG(regular_list)); slocator=php_intifxus_get_slobloc(bid,&EG(regular_list) TSRMLS_CC); EXEC SQL SET DESCRIPTOR :descrpid VALUE :i DATA = :*slocator; } @@ -1526,7 +1686,7 @@ PHP_FUNCTION(ifx_errormsg) rgetlmsg(ifx_errorcode, ifx_errmsg, maxmsglen, &msglen); if (msglen > maxmsglen) { maxmsglen = msglen + 1; - free(ifx_errmsg); + efree(ifx_errmsg); ifx_errmsg = (char *)malloc(maxmsglen + 1); rgetlmsg(ifx_errorcode, ifx_errmsg, maxmsglen, &msglen); } @@ -1536,7 +1696,7 @@ PHP_FUNCTION(ifx_errormsg) returnmsg = (char *) emalloc(strlen(ifx_errmsg) + 128); sprintf(returnmsg,ifx_errmsg, sqlca.sqlerrm); - free(ifx_errmsg); + efree(ifx_errmsg); RETURN_STRING(returnmsg,0); } /* }}} */ @@ -1625,7 +1785,6 @@ EXEC SQL END DECLARE SECTION; char string_data[256]; long long_data; char *p; - char *blobfilename; char *fetch_pos; char *nullstr; @@ -1660,7 +1819,7 @@ EXEC SQL END DECLARE SECTION; IFXG(sv_sqlcode) = 0; if (strcmp(Ifx_Result->cursorid,"") == 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not a select cursor!"); + php_error(E_WARNING, "%s(): Not a select cursor!", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } @@ -1673,6 +1832,27 @@ EXEC SQL END DECLARE SECTION; EXEC SQL set connection :ifx; PHP_IFX_CHECK_CONNECTION(ifx); + locind = 0; + for (i = 1; i <= Ifx_Result->numcols; i++) { + + EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :fieldtype = TYPE; + if (fieldtype == SQLBYTES || fieldtype == SQLTEXT) { + bid_b = Ifx_Result->res_id[locind]; + if ((locator_b = php_intifx_get_blobloc(bid_b, &EG(regular_list) TSRMLS_C)) == NULL) { + php_error(E_WARNING, "%s(): Cant get BLOB from Result Set!", get_active_function_name(TSRMLS_C)); + RETURN_FALSE; + } + locind++; + + if(IFXG(blobinfile)==0) { + php_intifx_init_blob(locator_b, BLMODE_INMEM, 1); + } else { + php_intifx_init_blob(locator_b, BLMODE_INFILE, 1); + } + EXEC SQL SET DESCRIPTOR :descrpid VALUE :i DATA = :*locator_b; + } + } + if (!Ifx_Result->isscroll) { EXEC SQL FETCH :cursorid USING SQL DESCRIPTOR :descrpid; } else { @@ -1694,7 +1874,7 @@ EXEC SQL END DECLARE SECTION; } else if (!strcasecmp(fetch_pos,"CURRENT")) { EXEC SQL FETCH CURRENT :cursorid USING SQL DESCRIPTOR :descrpid; } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid positioning arg on fetch"); + php_error(E_WARNING, "%s(): Invalid positioning arg on fetch", get_active_function_name(TSRMLS_C)); } } } @@ -1703,7 +1883,7 @@ EXEC SQL END DECLARE SECTION; switch (ifx_check()) { case IFX_ERROR: IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can not fetch row on cursor %s (%s)", ifx_error(ifx), cursorid); + php_error(E_WARNING, "%s(): Can not fetch row on cursor %s (%s)", get_active_function_name(TSRMLS_C), ifx_error(ifx), cursorid); RETURN_FALSE; break; case IFX_NODATA: @@ -1715,7 +1895,9 @@ EXEC SQL END DECLARE SECTION; } Ifx_Result->rowid++; - array_init(return_value); + if (array_init(return_value)==FAILURE) { + RETURN_FALSE; + } num_fields = fieldcount; locind = 0; @@ -1728,7 +1910,7 @@ EXEC SQL END DECLARE SECTION; if (ifx_check() < 0) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Get descriptor (field # %d) fails (%s)", i, ifx_error(ifx)); + php_error(E_WARNING, "%s(): Get descriptor (field # %d) fails (%s)", get_active_function_name(TSRMLS_C), i, ifx_error(ifx)); RETURN_FALSE; } @@ -1743,10 +1925,12 @@ EXEC SQL END DECLARE SECTION; if( (IFXG(textasvarchar)==0 && fieldtype==SQLTEXT) || (IFXG(byteasvarchar)==0 && fieldtype==SQLBYTES)) { bid_b=Ifx_Result->res_id[locind]; + locator_b=php_intifx_get_blobloc(bid_b,&EG(regular_list) TSRMLS_CC); bid=php_intifx_copy_blob(bid_b, &EG(regular_list) TSRMLS_CC); php_intifx_update_blob(bid,nullstr,strlen(nullstr),&EG(regular_list) TSRMLS_CC); add_assoc_long(return_value,fieldname,bid); ++locind; + php_intifx_release_blob(locator_b TSRMLS_C); continue; } if ((fieldtype==SQLTEXT) || (fieldtype==SQLBYTES) @@ -1754,7 +1938,10 @@ $ifdef HAVE_IFX_IUS; || (fieldtype==SQLUDTFIXED) $endif; ) { + bid_b=Ifx_Result->res_id[locind]; + locator_b=php_intifx_get_blobloc(bid_b,&EG(regular_list) TSRMLS_CC); ++locind; + php_intifx_release_blob(locator_b TSRMLS_C); } add_assoc_string(return_value, fieldname, nullstr, DUP); continue; @@ -1826,7 +2013,7 @@ $ifdef HAVE_IFX_IUS; fieldleng=ifx_var_getlen(&lvar_tmp); if (fieldleng > 2) fieldleng -= 2; /* fix by Alex Shepherd */ if ((char_data = (char *)emalloc(fieldleng + 1)) == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Out of memory"); + php_error(E_WARNING, "%s(): Out of memory", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } memcpy(char_data,ifx_var_getdata(&lvar_tmp),fieldleng); @@ -1840,7 +2027,7 @@ $endif; case SQLCHAR : case SQLNCHAR : if ((char_data = (char *)emalloc(fieldleng + 1)) == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Out of memory"); + php_error(E_WARNING, "%s(): Out of memory", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :char_data = DATA; @@ -1855,7 +2042,7 @@ $ifdef HAVE_IFX_IUS; case SQLUDTFIXED : bid_b=Ifx_Result->res_id[locind]; add_assoc_long(return_value,fieldname,bid_b); - bid=php_intifxus_new_slob(&EG(regular_list) TSRMLS_CC); + bid=php_intifxus_new_slob(&EG(regular_list)); slocator=php_intifxus_get_slobloc(bid,&EG(regular_list) TSRMLS_CC); EXEC SQL SET DESCRIPTOR :descrpid VALUE :i DATA = :*slocator; Ifx_Result->res_id[locind]=bid; @@ -1867,6 +2054,14 @@ $endif; bid_b=Ifx_Result->res_id[locind]; locator_b=php_intifx_get_blobloc(bid_b,&EG(regular_list) TSRMLS_CC); ++locind; + + if(IFXG(blobinfile)==0) { + php_intifx_init_blob(locator_b, BLMODE_INMEM, 0); + } + else { + php_intifx_init_blob(locator_b, BLMODE_INFILE, 0); + } + EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :*locator_b = DATA; /* work around for ESQL/C bug with NULL values and BLOBS */ @@ -1878,10 +2073,10 @@ $endif; if (locator_b->loc_indicator == -1) { if((IFXG(textasvarchar)==0 && fieldtype==SQLTEXT) || (IFXG(byteasvarchar)==0 && fieldtype==SQLBYTES)) { - bid_b=Ifx_Result->res_id[locind]; bid=php_intifx_copy_blob(bid_b, &EG(regular_list) TSRMLS_CC); php_intifx_update_blob(bid,nullstr,strlen(nullstr),&EG(regular_list) TSRMLS_CC); add_assoc_long(return_value,fieldname,bid); + php_intifx_release_blob(locator_b TSRMLS_C); break; } if ((fieldtype==SQLTEXT) || (fieldtype==SQLBYTES) @@ -1890,26 +2085,16 @@ $ifdef HAVE_IFX_IUS; $endif; ) { add_assoc_string(return_value, fieldname, nullstr, DUP); + php_intifx_release_blob(locator_b TSRMLS_C); break; } } if (locator_b->loc_status < 0) { /* blob too large */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "No memory (%d bytes) for blob", locator_b->loc_bufsize); + php_error(E_WARNING, "%s(): No memory (%d bytes) for blob", get_active_function_name(TSRMLS_C), locator_b->loc_bufsize); RETURN_FALSE; } - /* copy blob */ - bid=php_intifx_copy_blob(bid_b, &EG(regular_list) TSRMLS_CC); - - /* and generate new tempfile for next row */ - if(locator_b->loc_loctype==LOCFNAME) { - blobfilename=php_intifx_create_tmpfile(bid_b TSRMLS_CC); - php_intifx_update_blob(bid_b,blobfilename,strlen(blobfilename),&EG(regular_list) TSRMLS_CC); - efree(blobfilename); - EXEC SQL SET DESCRIPTOR :descrpid VALUE :i DATA= :*locator_b; - } - /* return blob as VARCHAR ? */ /* note that in case of "blobinfile" */ /* you get the file name */ @@ -1922,18 +2107,32 @@ $endif; char *content; long lg; - lg=php_intifx_get_blob(bid, &EG(regular_list), &content TSRMLS_CC); + lg=php_intifx_get_blob(bid_b, &EG(regular_list), &content TSRMLS_CC); if(content == NULL || lg < 0) { add_assoc_string(return_value,fieldname,nullstr,DUP); } else { add_assoc_stringl(return_value,fieldname,content,lg,DUP); } - php_intifx_free_blob(bid, &EG(regular_list) TSRMLS_CC); + + if (locator_b->loc_loctype == LOCMEMORY) { + locator_b->loc_buffer = NULL; + } + php_intifx_release_blob(locator_b TSRMLS_C); break; } + /* copy blob */ + bid=php_intifx_copy_blob(bid_b, &EG(regular_list) TSRMLS_CC); + /* no, return as blob id */ add_assoc_long(return_value,fieldname,bid); + + if (locator_b->loc_loctype == LOCMEMORY) { + locator_b->loc_buffer = NULL; + } + + php_intifx_release_blob(locator_b TSRMLS_C); + break; default : sprintf(string_data,"ESQL/C : %s : unsupported field type[%d]", fieldname, fieldleng); @@ -2024,7 +2223,7 @@ EXEC SQL END DECLARE SECTION; ZEND_FETCH_RESOURCE(Ifx_Result, IFX_RES *, result, -1, "Informix Result", le_result); if (strcmp(Ifx_Result->cursorid,"") == 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not a select cursor!"); + php_error(E_WARNING, "%s(): Not a select cursor!", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } @@ -2042,7 +2241,7 @@ EXEC SQL END DECLARE SECTION; switch (ifx_check()) { case IFX_ERROR: IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can not fetch next row on cursor %s (%s)", ifx_error(ifx), cursorid); + php_error(E_WARNING, "%s(): Can not fetch next row on cursor %s (%s)", get_active_function_name(TSRMLS_C), ifx_error(ifx), cursorid); RETURN_FALSE; break; case IFX_NODATA: @@ -2072,7 +2271,7 @@ EXEC SQL END DECLARE SECTION; EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :fieldname = NAME; if (ifx_check() < 0) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Get descriptor (field # %d) fails (%s)", i, ifx_error(ifx)); + php_error(E_WARNING, "%s(): Get descriptor (field # %d) fails (%s)", get_active_function_name(TSRMLS_C), i, ifx_error(ifx)); RETURN_FALSE; } @@ -2099,7 +2298,7 @@ EXEC SQL END DECLARE SECTION; if (ifx_check() < 0) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Get descriptor (field # %d) fails (%s)", i, ifx_error(ifx)); + php_error(E_WARNING, "%s(): Get descriptor (field # %d) fails (%s)", get_active_function_name(TSRMLS_C), i, ifx_error(ifx)); RETURN_FALSE; } @@ -2178,7 +2377,7 @@ $ifdef HAVE_IFX_IUS; if (fieldleng > 2) fieldleng -= 2; /* fix by Alex Shepherd */ if ((char_data = (char *)emalloc(fieldleng + 1)) == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Out of memory"); + php_error(E_WARNING, "%s(): Out of memory", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } memcpy(char_data,ifx_var_getdata(&lvar_tmp),fieldleng); @@ -2192,7 +2391,7 @@ $endif; case SQLNCHAR : case SQLNVCHAR : if ((char_data = (char *)emalloc(fieldleng + 1)) == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Out of memory"); + php_error(E_WARNING, "%s(): Out of memory", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :char_data = DATA; @@ -2228,7 +2427,7 @@ $endif; } } if (locator_b->loc_status < 0) { /* blob too large */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not enough memory (%d bytes) for blob", locator_b->loc_bufsize); + php_error(E_WARNING, "%s(): Not enough memory (%d bytes) for blob", get_active_function_name(TSRMLS_C), locator_b->loc_bufsize); RETURN_FALSE; } @@ -2239,15 +2438,15 @@ $endif; php_printf("%s", nullstr); } else { /* need an extra byte for string terminator */ - copy_content = malloc(lg + 1); + copy_content = emalloc(lg + 1); if (copy_content == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not enough memory for TEXT column"); + php_error(E_WARNING, "%s(): Not enough memory for TEXT column", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } memcpy(copy_content, content, lg); copy_content[lg]=0; php_printf("%s", copy_content); - free(copy_content); + efree(copy_content); } break; @@ -2268,7 +2467,7 @@ $endif; switch (ifx_check()) { case IFX_ERROR: IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can not fetch next row on cursor %s (%s)", ifx_error(ifx), cursorid); + php_error(E_WARNING, "%s(): Can not fetch next row on cursor %s (%s)", get_active_function_name(TSRMLS_C), ifx_error(ifx), cursorid); RETURN_FALSE; break; case IFX_NODATA: @@ -2324,7 +2523,7 @@ EXEC SQL END DECLARE SECTION; ZEND_FETCH_RESOURCE(Ifx_Result, IFX_RES *, result, -1, "Informix Result", le_result); if (strcmp(Ifx_Result->cursorid,"") == 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not a select cursor!"); + php_error(E_WARNING, "%s(): Not a select cursor!", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } @@ -2337,13 +2536,15 @@ EXEC SQL END DECLARE SECTION; EXEC SQL set connection :ifx; PHP_IFX_CHECK_CONNECTION(ifx); - array_init(return_value); + if (array_init(return_value)==FAILURE) { + RETURN_FALSE; + } num_fields = fieldcount; for (i = 1; i <= num_fields; i++) { EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :fieldname = NAME, :fieldtype = TYPE; if (ifx_check() < 0) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Get descriptor (field # %d) fails (%s)", i, ifx_error(ifx)); + php_error(E_WARNING, "%s(): Get descriptor (field # %d) fails (%s)", get_active_function_name(TSRMLS_C), i, ifx_error(ifx)); RETURN_FALSE; } @@ -2480,7 +2681,7 @@ EXEC SQL END DECLARE SECTION; ZEND_FETCH_RESOURCE(Ifx_Result, IFX_RES *, result, -1, "Informix Result", le_result); if (strcmp(Ifx_Result->cursorid,"") == 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not a select cursor!"); + php_error(E_WARNING, "%s(): Not a select cursor!", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } @@ -2493,7 +2694,9 @@ EXEC SQL END DECLARE SECTION; EXEC SQL set connection :ifx; PHP_IFX_CHECK_CONNECTION(ifx); - array_init(return_value); + if (array_init(return_value)==FAILURE) { + RETURN_FALSE; + } num_fields = fieldcount; for (i = 1; i <= num_fields; i++) { @@ -2506,7 +2709,7 @@ EXEC SQL END DECLARE SECTION; if (ifx_check() < 0) { IFXG(sv_sqlcode) = SQLCODE; - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Get descriptor (field # %d) fails (%s)", i, ifx_error(ifx)); + php_error(E_WARNING, "%s(): Get descriptor (field # %d) fails (%s)", get_active_function_name(TSRMLS_C), i, ifx_error(ifx)); RETURN_FALSE; } @@ -2649,7 +2852,9 @@ PHP_FUNCTION(ifx_getsqlca) ZEND_FETCH_RESOURCE(Ifx_Result, IFX_RES *, result, -1, "Informix Result", le_result); /* create pseudo-row array to return */ - array_init(return_value); + if (array_init(return_value)==FAILURE) { + RETURN_FALSE; + } /* fill array with 6 fields sqlerrd0 .. sqlerrd5 */ /* each ESQLC call saves these sqlca values */ @@ -2722,7 +2927,7 @@ EXEC SQL END DECLARE SECTION; for (i = 0; i < MAX_RESID; ++i) { if (Ifx_Result->res_id[i]>0) { - php_intifx2_free_blob(Ifx_Result->res_id[i],&EG(regular_list) TSRMLS_CC); + zend_list_delete(Ifx_Result->res_id[i]); Ifx_Result->res_id[i]=-1; } } @@ -2732,7 +2937,7 @@ EXEC SQL END DECLARE SECTION; statemid = Ifx_Result->statemid; descrpid = Ifx_Result->descrpid; - EXEC SQL set connection :ifx; + EXEC SQL set connection :ifx; PHP_IFX_CHECK_CONNECTION(ifx); EXEC SQL free :statemid; @@ -2767,7 +2972,7 @@ static long php_intifx_getType(long id, HashTable *list TSRMLS_DC) Ifx_res = (IFX_IDRES *) zend_list_find(id,&type); if (type!=le_idresult) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix id-result index", id); + php_error(E_WARNING, "%s(): %d is not a Informix id-result index", get_active_function_name(TSRMLS_C), id); return -1; } return Ifx_res->type; @@ -2789,29 +2994,29 @@ static long php_intifx_getType(long id, HashTable *list TSRMLS_DC) Creates a blob-object */ PHP_FUNCTION(ifx_create_blob) { - zval **pmode, **pparam,**ptype; + zval *pmode, *pparam,*ptype; long id; long mode,type; - if (ZEND_NUM_ARGS() !=3 || zend_get_parameters_ex(3, &ptype,&pmode,&pparam) == FAILURE) { + if (ZEND_NUM_ARGS()!=3 || getParameters(ht, 3, &ptype,&pmode,&pparam)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pmode); - convert_to_string_ex(pparam); - convert_to_long_ex(ptype); + convert_to_long(pmode); + convert_to_string(pparam); + convert_to_long(ptype); - type = Z_LVAL_PP(ptype); + type=Z_LVAL_P(ptype); if(type != 0) { - type = TYPE_BLTEXT; + type=TYPE_BLTEXT; } - mode = Z_LVAL_PP(pmode); + mode=Z_LVAL_P(pmode); if(mode != 0) { mode=BLMODE_INFILE; } - id=php_intifx_create_blob(type,mode,Z_STRVAL_PP(pparam),Z_STRLEN_PP(pparam),&EG(regular_list) TSRMLS_CC); + id=php_intifx_create_blob(type,mode,Z_STRVAL_P(pparam),Z_STRLEN_P(pparam),&EG(regular_list) TSRMLS_CC); if(id < 0) { RETURN_FALSE; @@ -2824,7 +3029,7 @@ PHP_FUNCTION(ifx_create_blob) * internal function * long php_intifx_create_blob(long type, long mode, char* param, long len, HashTable *list TSRMLS_DC) * - * creates an blob-object + * creates an blob-object for the PHP Resource list * type: 1=TEXT, 0=BYTE * mode: blob-object holds 0=the content in momory, 1=content in file * param: if mode=0: pointer to the content @@ -2840,7 +3045,7 @@ static long php_intifx_create_blob(long type, long mode, char* param, long len, Ifx_blob=emalloc(sizeof(IFX_IDRES)); if(Ifx_blob==NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create blob-resource"); + php_error(E_WARNING, "%s(): Can't create blob-resource", get_active_function_name(TSRMLS_C)); return -1; } @@ -2853,42 +3058,121 @@ static long php_intifx_create_blob(long type, long mode, char* param, long len, } Ifx_blob->BLOB.mode=(int)mode; + if (php_intifx_init_blob(&Ifx_blob->BLOB.blob_data, mode, 1) < 0) { + php_error(E_WARNING, "%s(): Can't create blob-resource", get_active_function_name(TSRMLS_C)); + return -1; + } + if(mode==BLMODE_INMEM) { if(len>=0) { char *content=emalloc(len); if(content==NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create blob-resource"); + php_error(E_WARNING, "%s(): Can't create blob-resource", get_active_function_name(TSRMLS_C)); return -1; } memcpy(content,param,len); - Ifx_blob->BLOB.blob_data.loc_loctype=LOCMEMORY; Ifx_blob->BLOB.blob_data.loc_buffer=content; Ifx_blob->BLOB.blob_data.loc_bufsize=len; Ifx_blob->BLOB.blob_data.loc_size=len; - Ifx_blob->BLOB.blob_data.loc_mflags=0; - Ifx_blob->BLOB.blob_data.loc_oflags=0; - } else { - Ifx_blob->BLOB.blob_data.loc_loctype=LOCMEMORY; - Ifx_blob->BLOB.blob_data.loc_buffer=NULL; - Ifx_blob->BLOB.blob_data.loc_bufsize=-1; - Ifx_blob->BLOB.blob_data.loc_size=-1; - Ifx_blob->BLOB.blob_data.loc_mflags=0; Ifx_blob->BLOB.blob_data.loc_oflags=0; } - } else { /* mode = BLMODE_INFILE */ - char *filename=emalloc(len+1); + } + + return zend_list_insert(Ifx_blob,le_idresult); +} + +static long php_intifx_init_blob(loc_t *blob, long mode, long new TSRMLS_DC) { + + if (new) { + memset(blob, 0, sizeof(loc_t)); + } + + blob->loc_status = 0; + blob->loc_type = SQLTEXT; + blob->loc_xfercount = 0; + blob->loc_indicator = 0; + + if (mode == BLMODE_INMEM) { + return php_intifx_init_blob_inmem(blob, new); + } + else { + return php_intifx_init_blob_infile(blob, new); + } + + return 1; +} + +static long php_intifx_init_blob_inmem(loc_t *blob, long new TSRMLS_DC) { + + blob->loc_loctype=LOCMEMORY; + + if (new) { + blob->loc_buffer=NULL; + blob->loc_bufsize=-1; + blob->loc_size=0; + } + blob->loc_mflags=0; + blob->loc_oflags=0; + + return 1; +} + +static long php_intifx_init_blob_infile(loc_t *blob, long new TSRMLS_DC) { + + char *filename; + + if (new) { + filename = php_intifx_create_tmpfile(TSRMLS_C); if(filename==NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create blob-resource"); + php_error(E_WARNING, "%s(): Can't create blob-resource", get_active_function_name(TSRMLS_C)); return -1; } - memcpy(filename,param,len); - filename[len]=0; - Ifx_blob->BLOB.blob_data.loc_loctype=LOCFNAME; - Ifx_blob->BLOB.blob_data.loc_fname=filename; - Ifx_blob->BLOB.blob_data.loc_oflags=LOC_WONLY; - Ifx_blob->BLOB.blob_data.loc_size=-1; + blob->loc_fname = filename; + blob->loc_size = 0; + blob->loc_fd = -1; } - return zend_list_insert(Ifx_blob,le_idresult); + + blob->loc_loctype = LOCFNAME; + blob->lc_union.lc_file.lc_mode = 0666; + blob->loc_oflags = LOC_WONLY | LOC_RONLY; + + return 1; +} + +static void php_intifx_release_blob(loc_t *blob TSRMLS_DC) { + + switch (blob->loc_loctype) { + + case LOCMEMORY: + + if (blob->loc_buffer != NULL) { + efree(blob->loc_buffer); + blob->loc_buffer = NULL; + } + break; + + case LOCFNAME: + + if (blob->loc_fd >= 0) { + close(blob->loc_fd); + } + blob->loc_fd = -1; + + if (blob->loc_fname != NULL) { + unlink(blob->loc_fname); + efree(blob->loc_fname); + blob->loc_fname = NULL; + } + + break; + + case LOCFILE: + case LOCUSER: + default: + break; + + } + } /* ---------------------------------------------------------------------- @@ -2905,15 +3189,15 @@ static long php_intifx_create_blob(long type, long mode, char* param, long len, Duplicates the given blob-object */ PHP_FUNCTION(ifx_copy_blob) { - zval **pbid; + zval *pbid; long newid; - if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &pbid)==FAILURE) { + if (ZEND_NUM_ARGS()!=1 || getParameters(ht, 1, &pbid)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pbid); + convert_to_long(pbid); - newid=php_intifx_copy_blob(Z_LVAL_PP(pbid),&EG(regular_list) TSRMLS_CC); + newid=php_intifx_copy_blob(Z_LVAL_P(pbid),&EG(regular_list) TSRMLS_CC); if(newid<0) { RETURN_FALSE; } @@ -2925,7 +3209,7 @@ PHP_FUNCTION(ifx_copy_blob) * internal function * long php_intifx_copy_blob(long bid, HashTable *list) * - * duplicates the given blob-object + * duplicates the given blob-object in the PHP resource list * bid: Id of Blobobject * list: internal hashlist of php * @@ -2939,14 +3223,19 @@ static long php_intifx_copy_blob(long bid, HashTable *list TSRMLS_DC) int type; Ifx_blob_orig = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult || !(Ifx_blob_orig->type==TYPE_BLBYTE || Ifx_blob_orig->type==TYPE_BLTEXT)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix blob-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING,"%s(): %d is not a Informix blob-result index", get_active_function_name(TSRMLS_C), bid); + return -1; + } + + if (!(Ifx_blob_orig->type==TYPE_BLBYTE || Ifx_blob_orig->type==TYPE_BLTEXT)) { + php_error(E_WARNING, "%s(): %d is not a Informix BYTE or TEXT type", get_active_function_name(TSRMLS_C), bid); return -1; } Ifx_blob=emalloc(sizeof(IFX_IDRES)); if(Ifx_blob==NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create blob-resource"); + php_error(E_WARNING,"%s(): Can't create blob-resource", get_active_function_name(TSRMLS_C)); return -1; } @@ -2958,39 +3247,33 @@ static long php_intifx_copy_blob(long bid, HashTable *list TSRMLS_DC) locator=&(Ifx_blob->BLOB.blob_data); locator_orig=&(Ifx_blob_orig->BLOB.blob_data); + if (php_intifx_init_blob(locator, Ifx_blob->BLOB.mode, 1) < 0) { + php_error(E_WARNING, "%s(): Can't create blob-resource", get_active_function_name(TSRMLS_C)); + return -1; + } + if(Ifx_blob->BLOB.mode==BLMODE_INMEM) { char *content; - if(locator_orig->loc_size>=0 && locator_orig->loc_buffer!=NULL) { + + if(locator_orig->loc_bufsize>=0 && locator_orig->loc_buffer!=NULL) { if((content=emalloc(locator_orig->loc_size))==NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create blob-resource"); + php_error(E_WARNING,"%s(): Can't create blob-resource", get_active_function_name(TSRMLS_C)); return -1; } - memcpy(content,locator_orig->loc_buffer, locator_orig->loc_size); + memcpy(content,locator_orig->loc_buffer, locator_orig->loc_bufsize); locator->loc_buffer=content; - locator->loc_bufsize=locator_orig->loc_size; + locator->loc_bufsize=locator_orig->loc_bufsize; locator->loc_size=locator_orig->loc_size; - } else { - locator->loc_buffer=NULL; - locator->loc_bufsize=-1; - locator->loc_size=-1; - } - locator->loc_loctype=LOCMEMORY; - locator->loc_mflags=0; - locator->loc_oflags=0; - } else { /* BLMODE_INFILE */ - char *filename; + } + } + else { /* BLMODE_INFILE */ - if((filename=emalloc(strlen(locator_orig->loc_fname)+1))==NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create blob-resource"); - return -1; + if (locator_orig->loc_size) { + php_copy_file(locator_orig->loc_fname, locator->loc_fname TSRMLS_C); } - strcpy(filename,locator_orig->loc_fname); - locator->loc_loctype=LOCFNAME; - locator->loc_fname=filename; - locator->loc_size=-1; - locator->loc_oflags=locator_orig->loc_oflags; } + return zend_list_insert(Ifx_blob,le_idresult); } @@ -3007,15 +3290,15 @@ static long php_intifx_copy_blob(long bid, HashTable *list TSRMLS_DC) Deletes the blob-object */ PHP_FUNCTION(ifx_free_blob) { - zval **pid; + zval *pid; long ret; - if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &pid) == FAILURE) { + if (ZEND_NUM_ARGS()!=1 || getParameters(ht, 1, &pid)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pid); + convert_to_long(pid); - ret=php_intifx_free_blob(Z_LVAL_PP(pid),&EG(regular_list) TSRMLS_CC); + ret=php_intifx_free_blob(pid->value.lval,&EG(regular_list) TSRMLS_CC); if(ret<0) { RETURN_FALSE; } @@ -3027,7 +3310,7 @@ PHP_FUNCTION(ifx_free_blob) * internal function * long php_intifx_free_blob(long bid, HashTable *list) * - * deletes the blob-object + * deletes the blob-object from the PHP Resource List * bid: Id of Blobobject * list: internal hashlist of php * @@ -3041,69 +3324,22 @@ static long php_intifx_free_blob(long bid, HashTable *list TSRMLS_DC) int type; Ifx_blob = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult && !(Ifx_blob->type==TYPE_BLTEXT || Ifx_blob->type==TYPE_BLBYTE)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix blob-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING, "%s(): %d is not a Informix blob-result index", get_active_function_name(TSRMLS_C), bid); return -1; } - if(Ifx_blob->BLOB.mode==BLMODE_INMEM) { - if(Ifx_blob->BLOB.blob_data.loc_buffer==NULL || Ifx_blob->BLOB.blob_data.loc_size<=0) {;} else { - efree(Ifx_blob->BLOB.blob_data.loc_buffer); - } - } else { /* BLMODE_INFILE */ - if(Ifx_blob->BLOB.blob_data.loc_fname!=NULL) { - efree(Ifx_blob->BLOB.blob_data.loc_fname); - } - } - zend_list_delete(bid); - efree(Ifx_blob); - return 0; -} - -/* ---------------------------------------------------------------------- - * internal function - * long php_intifx2_free_blob(long bid, HashTable *list) - * - * deletes the blob-object - * bid: Id of Blobobject - * list: internal hashlist of php - * - * return -1 on error otherwise 0 - * FREES BYTE-MEMORY WITH FREE(), for blob memory allocated by ESQL/C - * use this for freeing blob-source after select (in ifx_free_result) - * ---------------------------------------------------------------------- -*/ -static long php_intifx2_free_blob(long bid, HashTable *list TSRMLS_DC) -{ - IFX_IDRES *Ifx_blob; - int type; - - Ifx_blob = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult && !(Ifx_blob->type==TYPE_BLTEXT || Ifx_blob->type==TYPE_BLBYTE)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix blob-result index", bid); + if (!(Ifx_blob->type==TYPE_BLTEXT || Ifx_blob->type==TYPE_BLBYTE)) { + php_error(E_WARNING, "%s(): %d is not a Informix BYTE or TEXT type", get_active_function_name(TSRMLS_C), bid); return -1; } -#if IFX_VERSION < 724 /* this Informix memory leak is fixed from 7.24 on */ - /* according to the current PERL DBD::Informix */ - /* and otherwise I get segmenation violations with 7.30 */ - - if(Ifx_blob->BLOB.mode==BLMODE_INMEM) { - if(Ifx_blob->BLOB.blob_data.loc_buffer==NULL || Ifx_blob->BLOB.blob_data.loc_size<=0) {;} else { - free(Ifx_blob->BLOB.blob_data.loc_buffer); - } - } else { - if(Ifx_blob->BLOB.blob_data.loc_fname!=NULL) { - efree(Ifx_blob->BLOB.blob_data.loc_fname); - } - } -#endif - zend_list_delete(bid); - efree(Ifx_blob); + return 0; } + /* ---------------------------------------------------------------------- ** string ifx_get_blob(int bid) ** @@ -3117,16 +3353,16 @@ static long php_intifx2_free_blob(long bid, HashTable *list TSRMLS_DC) Returns the content of the blob-object */ PHP_FUNCTION(ifx_get_blob) { - zval **pbid; + zval *pbid; char *content; long len; - if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &pbid) == FAILURE) { + if (ZEND_NUM_ARGS()!=1 || getParameters(ht, 1, &pbid)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pbid); + convert_to_long(pbid); - len=php_intifx_get_blob(Z_LVAL_PP(pbid),&EG(regular_list),&content TSRMLS_CC); + len=php_intifx_get_blob(pbid->value.lval,&EG(regular_list),&content TSRMLS_CC); if(content==NULL || len<0) { RETURN_STRING(php_intifx_null(TSRMLS_C),1); } @@ -3152,8 +3388,13 @@ static long php_intifx_get_blob(long bid, HashTable *list, char** content TSRMLS int type; Ifx_blob = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult && !(Ifx_blob->type==TYPE_BLTEXT || Ifx_blob->type==TYPE_BLBYTE)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix blob-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING, "%s(): %d is not a Informix blob-result index", get_active_function_name(TSRMLS_C), bid); + return -1; + } + + if (!(Ifx_blob->type==TYPE_BLTEXT || Ifx_blob->type==TYPE_BLBYTE)) { + php_error(E_WARNING, "%s(): %d is not a Informix BYTE or TEXT type", get_active_function_name(TSRMLS_C), bid); return -1; } @@ -3181,10 +3422,16 @@ static loc_t *php_intifx_get_blobloc(long bid, HashTable *list TSRMLS_DC) int type; Ifx_blob = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult && !(Ifx_blob->type==TYPE_BLTEXT || Ifx_blob->type==TYPE_BLBYTE)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix blob-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING, "%s(): %d is not a Informix blob-result index", get_active_function_name(TSRMLS_C), bid); return NULL; } + + if (!(Ifx_blob->type==TYPE_BLTEXT || Ifx_blob->type==TYPE_BLBYTE)) { + php_error(E_WARNING, "%s(): %d is not a Informix BYTE or TEXT type", get_active_function_name(TSRMLS_C), bid); + return NULL; + } + return &(Ifx_blob->BLOB.blob_data); } @@ -3204,15 +3451,15 @@ static loc_t *php_intifx_get_blobloc(long bid, HashTable *list TSRMLS_DC) Updates the content of the blob-object */ PHP_FUNCTION(ifx_update_blob) { - zval **pbid, **pparam; + zval *pbid, *pparam; - if (ZEND_NUM_ARGS() !=2 || zend_get_parameters_ex(2, &pbid,&pparam) == FAILURE) { + if (ZEND_NUM_ARGS()!=2 || getParameters(ht, 2, &pbid,&pparam)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pbid); - convert_to_string_ex(pparam); + convert_to_long(pbid); + convert_to_string(pparam); - if(php_intifx_update_blob(Z_LVAL_PP(pbid),Z_STRVAL_PP(pparam),Z_STRLEN_PP(pparam), &EG(regular_list) TSRMLS_CC) < 0) { + if(php_intifx_update_blob(Z_LVAL_P(pbid),Z_STRVAL_P(pparam),Z_STRLEN_P(pparam), &EG(regular_list) TSRMLS_CC) < 0) { RETURN_FALSE; } RETURN_TRUE; @@ -3237,8 +3484,13 @@ static long php_intifx_update_blob(long bid, char* param, long len, HashTable *l int type; Ifx_blob = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult && !(Ifx_blob->type==TYPE_BLTEXT || Ifx_blob->type==TYPE_BLBYTE)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix blob-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING,"%s(): %d is not a Informix blob-result index", get_active_function_name(TSRMLS_C), bid); + return -1; + } + + if (!(Ifx_blob->type==TYPE_BLTEXT || Ifx_blob->type==TYPE_BLBYTE)) { + php_error(E_WARNING, "%s(): %d is not a Informix BYTE or TEXT type", get_active_function_name(TSRMLS_C), bid); return -1; } @@ -3250,7 +3502,7 @@ static long php_intifx_update_blob(long bid, char* param, long len, HashTable *l } if(len >= 0) { if((content=emalloc(len))==NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create blob-resource"); + php_error(E_WARNING, "%s(): Can't create blob-resource", get_active_function_name(TSRMLS_C)); return -1; } memcpy(content,param, len); @@ -3271,7 +3523,7 @@ static long php_intifx_update_blob(long bid, char* param, long len, HashTable *l efree(Ifx_blob->BLOB.blob_data.loc_fname); } if((filename=emalloc(len+1))==NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create blob-resource"); + php_error(E_WARNING, "%s(): Can't create blob-resource", get_active_function_name(TSRMLS_C)); return -1; } memcpy(filename,param, len); @@ -3285,11 +3537,11 @@ static long php_intifx_update_blob(long bid, char* param, long len, HashTable *l /*------------------------------------------------- * internal function * - * php_intifx_create_tmpfile(long bid TSRMLS_DC) + * php_intifx_create_tmpfile(TSRMLS_DC) * creates a temporary file to store a blob in *------------------------------------------------- */ -static char* php_intifx_create_tmpfile(long bid TSRMLS_DC) +static char* php_intifx_create_tmpfile(TSRMLS_DC) { char filename[10]; char *blobdir; @@ -3300,11 +3552,12 @@ static char* php_intifx_create_tmpfile(long bid TSRMLS_DC) if ((blobdir = getenv("php_blobdir")) == NULL) { blobdir="."; } - sprintf(filename,"blb%d",(int)bid); + sprintf(filename,"blb"); if ((fp = php_open_temporary_file(blobdir, filename, &opened_path TSRMLS_CC))) { fclose(fp); retval=estrndup(opened_path, strlen(opened_path)); + efree(opened_path); } else { retval=NULL; } @@ -3325,14 +3578,14 @@ static char* php_intifx_create_tmpfile(long bid TSRMLS_DC) Sets the default blob-mode for all select-queries */ PHP_FUNCTION(ifx_blobinfile_mode) { - zval **pmode; + zval *pmode; - if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &pmode) == FAILURE) { + if (ZEND_NUM_ARGS()!=1 || getParameters(ht, 1, &pmode)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pmode); + convert_to_long(pmode); - IFXG(blobinfile)=Z_LVAL_PP(pmode); + IFXG(blobinfile)=Z_LVAL_P(pmode); RETURN_TRUE; } /* }}} */ @@ -3351,14 +3604,14 @@ PHP_FUNCTION(ifx_blobinfile_mode) Sets the default text-mode for all select-queries */ PHP_FUNCTION(ifx_textasvarchar) { - zval **pmode; + zval *pmode; - if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &pmode) == FAILURE) { + if (ZEND_NUM_ARGS()!=1 || getParameters(ht, 1, &pmode)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pmode); + convert_to_long(pmode); - IFXG(textasvarchar)=Z_LVAL_PP(pmode); + IFXG(textasvarchar)=Z_LVAL_P(pmode); RETURN_TRUE; } /* }}} */ @@ -3377,14 +3630,14 @@ PHP_FUNCTION(ifx_textasvarchar) Sets the default byte-mode for all select-queries */ PHP_FUNCTION(ifx_byteasvarchar) { - zval **pmode; + zval *pmode; - if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &pmode) == FAILURE) { + if (ZEND_NUM_ARGS()!=1 || getParameters(ht, 1, &pmode)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pmode); + convert_to_long(pmode); - IFXG(byteasvarchar)=Z_LVAL_PP(pmode); + IFXG(byteasvarchar)=Z_LVAL_P(pmode); RETURN_TRUE; } @@ -3402,19 +3655,154 @@ PHP_FUNCTION(ifx_byteasvarchar) Sets the default return value of a NULL-value on a fetch-row */ PHP_FUNCTION(ifx_nullformat) { - zval **pmode; + zval *pmode; - if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &pmode) == FAILURE) { + if (ZEND_NUM_ARGS()!=1 || getParameters(ht, 1, &pmode)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pmode); + convert_to_long(pmode); - IFXG(nullformat)=Z_LVAL_PP(pmode); + IFXG(nullformat)=Z_LVAL_P(pmode); RETURN_TRUE; } /* }}} */ +/* ---------------------------------------------------------------------- + * int php_intifx_alloc_ibind(IFX_RES *Ifx_Result, int items TSRMLS_DC) + * + * Allocates descriptors for input parameters + * return 0 for error. 1 for ok + * ---------------------------------------------------------------------- +*/ +static long php_intifx_alloc_ibind(IFX_RES *Ifx_Result, int items TSRMLS_DC) { + + EXEC SQL BEGIN DECLARE SECTION; + char *i_bind = Ifx_Result->i_descrpid; + int bind_size = items; + EXEC SQL END DECLARE SECTION; + + if (items > Ifx_Result->numicols) { + + if (Ifx_Result->numicols > 0) { + EXEC SQL DEALLOCATE DESCRIPTOR :i_bind; + if (ifx_check() < 0) { + return 0; + } + } + + EXEC SQL ALLOCATE DESCRIPTOR :i_bind WITH MAX :bind_size; + if (ifx_check() < 0) { + return 0; + } + + Ifx_Result->numicols = items; + } + + return 1; + +} + +/* ---------------------------------------------------------------------- + * int php_intifx_preparse(char *statement TSRMLS_DC) + * + * Count the placeholders (?) parameters in the statement + * return -1 for error. 0 or number of question marks + * ---------------------------------------------------------------------- +*/ +static long php_intifx_preparse(char *statement TSRMLS_DC) { + + + char end_quote = '\0'; + char *src; + char *dst; + int idx = 0; + int style = 0; + int laststyle = 0; + char ch; + + src = statement; + dst = statement; + while ((ch = *src++) != '\0') + { + if (ch == end_quote) + end_quote = '\0'; + else if (end_quote != '\0') + { + *dst++ = ch; + continue; + } + else if (ch == '\'' || ch == '\"') + end_quote = ch; + else if (ch == '{') + end_quote = '}'; + else if (ch == '-' && *src == '-') + { + end_quote = '\n'; + } + if (ch == '?') + { + /* X/Open standard */ + *dst++ = '?'; + idx++; + style = 3; + } + else + { + /* Perhaps ':=' PL/SQL construct or dbase:table in Informix */ + /* Or it could be :2 or :22 as part of a DATETIME/INTERVAL */ + *dst++ = ch; + continue; + } + if (laststyle && style != laststyle) + return -1; + + laststyle = style; + } + + *dst = '\0'; + return(idx); + +} + + +/* ---------------------------------------------------------------------- + * int php_intifx_count_descriptors(char *p_statemid TSRMLS_DC) + * + * count the number of descriptors allocated for a certain statement + * return 384 or number of descriptors + * ---------------------------------------------------------------------- +*/ +static long php_intifx_count_descriptors(char *p_statemid TSRMLS_DC) { + + EXEC SQL BEGIN DECLARE SECTION; + char *statemid = p_statemid; + EXEC SQL END DECLARE SECTION; + + struct sqlda *s_da; + int ret = 384; + + EXEC SQL DESCRIBE :statemid INTO s_da; + + if (ifx_check() >= 0) { + + ret = s_da->sqld; + +/* + * Thanks to DBD-Informix + */ + +#if (ESQLC_VERSION >= 720 || (ESQLC_VERSION >= 501 && ESQLC_VERSION < 600)) + SqlFreeMem(s_da, SQLDA_FREE); +#else + free(s_da); +#endif + } + + return ret; + +} + /* ---------------------------------------------------------------------- * void php_intifx_null() * @@ -3447,15 +3835,15 @@ static char* php_intifx_null(TSRMLS_D) Creates a char-object */ PHP_FUNCTION(ifx_create_char) { - zval **pparam; + zval *pparam; long id; - if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &pparam) == FAILURE) { + if (ZEND_NUM_ARGS()!=1 || getParameters(ht, 1, &pparam)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_string_ex(pparam); + convert_to_string(pparam); - id=php_intifx_create_char(Z_STRVAL_PP(pparam),Z_STRLEN_PP(pparam),&EG(regular_list) TSRMLS_CC); + id=php_intifx_create_char(Z_STRVAL_P(pparam),Z_STRLEN_P(pparam),&EG(regular_list) TSRMLS_CC); if(id < 0) { RETURN_FALSE; @@ -3481,7 +3869,7 @@ static long php_intifx_create_char(char* param, long len, HashTable *list TSRMLS Ifx_char=emalloc(sizeof(IFX_IDRES)); if(Ifx_char==NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create char-resource"); + php_error(E_WARNING, "%s(): Can't create char-resource", get_active_function_name(TSRMLS_C)); return -1; } @@ -3494,7 +3882,7 @@ static long php_intifx_create_char(char* param, long len, HashTable *list TSRMLS Ifx_char->CHAR.char_data=emalloc(len+1); if(Ifx_char->CHAR.char_data==NULL) { efree(Ifx_char); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create char-resource"); + php_error(E_WARNING, "%s(): Can't create char-resource", get_active_function_name(TSRMLS_C)); return -1; } memcpy(Ifx_char->CHAR.char_data,param,len); @@ -3517,16 +3905,16 @@ static long php_intifx_create_char(char* param, long len, HashTable *list TSRMLS Returns the content of the char-object */ PHP_FUNCTION(ifx_get_char) { - zval **pbid; + zval *pbid; char *content; long len; - if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &pbid) == FAILURE) { + if (ZEND_NUM_ARGS()!=1 || getParameters(ht, 1, &pbid)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pbid); + convert_to_long(pbid); - len=php_intifx_get_char(Z_LVAL_PP(pbid),&EG(regular_list),&content TSRMLS_CC); + len=php_intifx_get_char(Z_LVAL_P(pbid),&EG(regular_list),&content TSRMLS_CC); if(content==NULL || len < 0) { RETURN_STRING("",1); } @@ -3552,11 +3940,17 @@ static long php_intifx_get_char(long bid, HashTable *list, char** content TSRMLS int type; Ifx_char = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult && !(Ifx_char->type==TYPE_CHAR)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix char-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING, "%s(): %d is not a Informix char-result index", get_active_function_name(TSRMLS_C), bid); return -1; } + if (!Ifx_char->type==TYPE_CHAR) { + php_error(E_WARNING, "%s(): %d is not a Informix CHAR type", get_active_function_name(TSRMLS_C), bid); + return -1; + } + + *content=Ifx_char->CHAR.char_data; return Ifx_char->CHAR.len; } @@ -3574,14 +3968,14 @@ static long php_intifx_get_char(long bid, HashTable *list, char** content TSRMLS Deletes the char-object */ PHP_FUNCTION(ifx_free_char) { - zval **pid; + zval *pid; - if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &pid) == FAILURE) { + if (ZEND_NUM_ARGS()!=1 || getParameters(ht, 1, &pid)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pid); + convert_to_long(pid); - if(php_intifx_free_char(Z_LVAL_PP(pid),&EG(regular_list) TSRMLS_CC) < 0) { + if(php_intifx_free_char(Z_LVAL_P(pid),&EG(regular_list) TSRMLS_CC) < 0) { RETURN_FALSE; } RETURN_TRUE; @@ -3605,8 +3999,13 @@ static long php_intifx_free_char(long bid, HashTable *list TSRMLS_DC) int type; Ifx_char = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult && !(Ifx_char->type==TYPE_CHAR)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix char-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING, "%s(): %d is not a Informix char-result index", get_active_function_name(TSRMLS_C), bid); + return -1; + } + + if (!Ifx_char->type==TYPE_CHAR) { + php_error(E_WARNING, "%s(): %d is not a Informix CHAR type", get_active_function_name(TSRMLS_C), bid); return -1; } @@ -3632,15 +4031,15 @@ static long php_intifx_free_char(long bid, HashTable *list TSRMLS_DC) Updates the content of the char-object */ PHP_FUNCTION(ifx_update_char) { - zval **pbid, **pparam; + zval *pbid,*pparam; - if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &pbid,&pparam) == FAILURE) { + if (ZEND_NUM_ARGS()!=2 || getParameters(ht, 2, &pbid,&pparam)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pbid); - convert_to_string_ex(pparam); + convert_to_long(pbid); + convert_to_string(pparam); - if(php_intifx_update_char(Z_LVAL_PP(pbid),Z_STRVAL_PP(pparam),Z_STRLEN_PP(pparam),&EG(regular_list) TSRMLS_CC) < 0) { + if(php_intifx_update_char(Z_LVAL_P(pbid),Z_STRVAL_P(pparam),Z_STRLEN_P(pparam),&EG(regular_list) TSRMLS_CC) < 0) { RETURN_FALSE; } RETURN_TRUE; @@ -3665,8 +4064,13 @@ static long php_intifx_update_char(long bid, char* param, long len, HashTable *l int type; Ifx_char = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult && !(Ifx_char->type==TYPE_CHAR)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix char-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING, "%s(): %d is not a Informix char-result index", get_active_function_name(TSRMLS_C), bid); + return -1; + } + + if (!Ifx_char->type==TYPE_CHAR) { + php_error(E_WARNING, "%s(): %d is not a Informix CHAR type", get_active_function_name(TSRMLS_C), bid); return -1; } @@ -3682,7 +4086,7 @@ static long php_intifx_update_char(long bid, char* param, long len, HashTable *l } else { Ifx_char->CHAR.char_data=emalloc(len+1); if(Ifx_char->CHAR.char_data==NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create char-resource"); + php_error(E_WARNING, "%s(): Can't create char-resource", get_active_function_name(TSRMLS_C)); return -1; } memcpy(Ifx_char->CHAR.char_data,param,len); @@ -3692,6 +4096,7 @@ static long php_intifx_update_char(long bid, char* param, long len, HashTable *l return 0; } + $ifdef HAVE_IFX_IUS; /* ---------------------------------------------------------------------- @@ -3707,15 +4112,15 @@ $ifdef HAVE_IFX_IUS; Creates a slob-object and opens it */ PHP_FUNCTION(ifxus_create_slob) { - zval **pmode; + zval *pmode; long id; long mode,create_mode; - if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &pmode)==FAILURE) { + if (ZEND_NUM_ARGS()!=1 || getParameters(ht, 1, &pmode)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pmode); - mode=Z_LVAL_PP(pmode); + convert_to_long(pmode); + mode=Z_LVAL_P(pmode); create_mode=0; if((mode&1) !=0) @@ -3731,7 +4136,7 @@ PHP_FUNCTION(ifxus_create_slob) if((mode&32) !=0) create_mode|=LO_NOBUFFER; - id = php_intifxus_create_slob(create_mode, &EG(regular_list) TSRMLS_CC); + id=php_intifxus_create_slob(create_mode,&EG(regular_list)); if(id < 0) { RETURN_FALSE; @@ -3757,20 +4162,20 @@ static long php_intifxus_create_slob(long create_mode, HashTable *list TSRMLS_DC Ifx_slob=emalloc(sizeof(IFX_IDRES)); if(Ifx_slob==NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create slob-resource"); + php_error(E_WARNING, "%s(): Can't create slob-resource", get_active_function_name(TSRMLS_C)); return -1; } errcode=ifx_lo_def_create_spec(&(Ifx_slob->SLOB.createspec)); if(errcode<0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create slob-resource: %d", errcode); + php_error(E_WARNING, "%s(): Can't create slob-resource: %d", get_active_function_name(TSRMLS_C), errcode); return -1; } Ifx_slob->type=TYPE_SLOB; Ifx_slob->SLOB.lofd=ifx_lo_create(Ifx_slob->SLOB.createspec,create_mode,&(Ifx_slob->SLOB.slob_data),&errcode); if(errcode<0 || Ifx_slob->SLOB.lofd<0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create slob-resource: %d", errcode); + php_error(E_WARNING, "%s(): Can't create slob-resource: %d", get_active_function_name(TSRMLS_C), errcode); return -1; } return zend_list_insert(Ifx_slob,le_idresult); @@ -3789,14 +4194,14 @@ static long php_intifxus_create_slob(long create_mode, HashTable *list TSRMLS_DC Deletes the slob-object */ PHP_FUNCTION(ifxus_free_slob) { - zval **pid; + zval *pid; - if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &pid) == FAILURE) { + if (ZEND_NUM_ARGS()!=1 || getParameters(ht, 1, &pid)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pid); + convert_to_long(pid); - if(php_intifxus_free_slob(Z_LVAL_PP(pid),&EG(regular_list) TSRMLS_CC) < 0) { + if(php_intifxus_free_slob(Z_LVAL_P(pid),&EG(regular_list) TSRMLS_CC) < 0) { RETURN_FALSE; } RETURN_TRUE; @@ -3820,11 +4225,16 @@ static long php_intifxus_free_slob(long bid, HashTable *list TSRMLS_DC) int type; Ifx_slob = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult || Ifx_slob->type!=TYPE_SLOB) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix slob-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING, "%s(): %d is not a Informix slob-result index", get_active_function_name(TSRMLS_C), bid); return -1; } - + + if (Ifx_slob->type!=TYPE_SLOB) { + php_error(E_WARNING, "%s(): %d is not a Informix SLOB type", get_active_function_name(TSRMLS_C), bid); + return -1; + } + if(php_intifxus_close_slob(bid, &EG(regular_list) TSRMLS_CC) < 0) { return -1; } @@ -3851,13 +4261,13 @@ static long php_intifxus_free_slob(long bid, HashTable *list TSRMLS_DC) Deletes the slob-object */ PHP_FUNCTION(ifxus_close_slob) { - zval **pid; + zval *pid; - if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &pid) == FAILURE) { + if (ZEND_NUM_ARGS()!=1 || getParameters(ht, 1, &pid)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pid); - if(php_intifxus_close_slob(Z_LVAL_PP(pid),&EG(regular_list) TSRMLS_CC) < 0) { + convert_to_long(pid); + if(php_intifxus_close_slob(Z_LVAL_P(pid),&EG(regular_list) TSRMLS_CC) < 0) { RETURN_FALSE; } RETURN_TRUE; @@ -3881,18 +4291,23 @@ static long php_intifxus_close_slob(long bid, HashTable *list TSRMLS_DC) int type; Ifx_slob = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult || Ifx_slob->type!=TYPE_SLOB) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix slob-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING, "%s(): %d is not a Informix slob-result index", get_active_function_name(TSRMLS_C), bid); return -1; } - + + if (Ifx_slob->type!=TYPE_SLOB) { + php_error(E_WARNING, "%s(): %d is not a Informix SLOB type", get_active_function_name(TSRMLS_C), bid); + return -1; + } + if(Ifx_slob->SLOB.lofd<0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Slob-resource already closed"); + php_error(E_WARNING, "%s(): Slob-resource already closed", get_active_function_name(TSRMLS_C)); return -1; } if(ifx_lo_close(Ifx_slob->SLOB.lofd)<0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't close slob-resource"); + php_error(E_WARNING, "%s(): Can't close slob-resource", get_active_function_name(TSRMLS_C)); return -1; } Ifx_slob->SLOB.lofd=-1; @@ -3913,15 +4328,15 @@ static long php_intifxus_close_slob(long bid, HashTable *list TSRMLS_DC) Opens an slob-object */ PHP_FUNCTION(ifxus_open_slob) { - zval **pbid, **pmode; + zval *pbid,*pmode; long mode,create_mode; - if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(1, &pbid, &pmode) == FAILURE) { + if (ZEND_NUM_ARGS()!=2 || getParameters(ht, 1, &pbid,&pmode)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pmode); - convert_to_long_ex(pbid); - mode=Z_LVAL_PP(pmode); + convert_to_long(pmode); + convert_to_long(pbid); + mode=Z_LVAL_P(pmode); create_mode=0; if((mode&1) !=0) @@ -3937,7 +4352,7 @@ PHP_FUNCTION(ifxus_open_slob) if((mode&32) !=0) create_mode|=LO_NOBUFFER; - RETURN_LONG(php_intifxus_open_slob(Z_LVAL_PP(pbid),create_mode,&EG(regular_list) TSRMLS_CC)); + RETURN_LONG(php_intifxus_open_slob(Z_LVAL_P(pbid),create_mode,&EG(regular_list) TSRMLS_CC)); } /* }}} */ @@ -3959,19 +4374,24 @@ static long php_intifxus_open_slob(long bid, long create_mode, HashTable *list T int type; Ifx_slob = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult || Ifx_slob->type!=TYPE_SLOB) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix slob-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING, "%s(): %d is not a Informix slob-result index", get_active_function_name(TSRMLS_C), bid); + return -1; + } + + if (Ifx_slob->type!=TYPE_SLOB) { + php_error(E_WARNING, "%s(): %d is not a Informix SLOB type", get_active_function_name(TSRMLS_C), bid); return -1; } if(Ifx_slob->SLOB.lofd>0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Slob-resource already open"); + php_error(E_WARNING, "%s(): Slob-resource already open", get_active_function_name(TSRMLS_C)); return -1; } Ifx_slob->SLOB.lofd=ifx_lo_open(&(Ifx_slob->SLOB.slob_data),create_mode,&errcode); if(errcode < 0 || Ifx_slob->SLOB.lofd < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't open slob-resource: %d", errcode); + php_error(E_WARNING, "%s(): Can't open slob-resource: %d", get_active_function_name(TSRMLS_C), errcode); return -1; } return 0; @@ -3979,20 +4399,20 @@ static long php_intifxus_open_slob(long bid, long create_mode, HashTable *list T /* ---------------------------------------------------------------------- * internal function - * long php_intifxus_new_slob(HashTable *list TSRMLS_DC) + * long php_intifxus_new_slob(HashTable *list) * * creates an slob-object but don't open it * list: internal hashlist of php * return -1 on error otherwise the new slob-Object-id * ---------------------------------------------------------------------- */ -static long php_intifxus_new_slob(HashTable *list TSRMLS_DC) +static long php_intifxus_new_slob(HashTable *list) { IFX_IDRES *Ifx_slob; Ifx_slob=emalloc(sizeof(IFX_IDRES)); if(Ifx_slob==NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't create slob-resource"); + php_error(E_WARNING, "%s(): Can't create slob-resource", get_active_function_name(TSRMLS_C)); return -1; } @@ -4017,10 +4437,16 @@ static ifx_lo_t *php_intifxus_get_slobloc(long bid, HashTable *list TSRMLS_DC) int type; Ifx_slob = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult || Ifx_slob->type!=TYPE_SLOB) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix slob-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING, "%s(): %d is not a Informix slob-result index", get_active_function_name(TSRMLS_C), bid); + return NULL; + } + + if (Ifx_slob->type!=TYPE_SLOB) { + php_error(E_WARNING, "%s(): %d is not a Informix SLOB type", get_active_function_name(TSRMLS_C), bid); return NULL; } + return &(Ifx_slob->SLOB.slob_data); } @@ -4037,32 +4463,37 @@ static ifx_lo_t *php_intifxus_get_slobloc(long bid, HashTable *list TSRMLS_DC) Returns the current file or seek position of an open slob-object */ PHP_FUNCTION(ifxus_tell_slob) { - zval **pbid; + zval *pbid; long bid; IFX_IDRES *Ifx_slob; ifx_int8_t akt_seek_pos; int type; long lakt_seek_pos; - if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &pbid) == FAILURE) { + if (ZEND_NUM_ARGS()!=1 || getParameters(ht, 1, &pbid)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pbid); - bid=Z_LVAL_PP(pbid); + convert_to_long(pbid); + bid=Z_LVAL_P(pbid); Ifx_slob = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult || Ifx_slob->type!=TYPE_SLOB) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix slob-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING,"%s(): %d is not a Informix slob-result index", get_active_function_name(TSRMLS_C), bid); + RETURN_FALSE; + } + + if (Ifx_slob->type!=TYPE_SLOB) { + php_error(E_WARNING, "%s(): %d is not a Informix SLOB type", get_active_function_name(TSRMLS_C), bid); RETURN_FALSE; } if(ifx_lo_tell(Ifx_slob->SLOB.lofd,&akt_seek_pos)<0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't perform tell-operation"); + php_error(E_WARNING,"%s(): Can't perform tell-operation", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } if(ifx_int8tolong(&akt_seek_pos,&lakt_seek_pos)<0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Seek-position to large for long"); + php_error(E_WARNING, "%s(): Seek-position to large for long", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } RETURN_LONG(lakt_seek_pos); @@ -4084,42 +4515,47 @@ PHP_FUNCTION(ifxus_tell_slob) Sets the current file or seek position of an open slob-object */ PHP_FUNCTION(ifxus_seek_slob) { - zval **pbid, **pmode, **poffset; + zval *pbid, *pmode, *poffset; long bid,lakt_seek_pos; IFX_IDRES *Ifx_slob; ifx_int8_t akt_seek_pos,offset; int type,mode; - if (ZEND_NUM_ARGS() !=3 || zend_get_parameters_ex(3, &pbid, &pmode, &poffset) == FAILURE) { + if (ZEND_NUM_ARGS()!=3 || getParameters(ht, 3, &pbid, &pmode, &poffset)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pbid); - convert_to_long_ex(pmode); - convert_to_long_ex(poffset); + convert_to_long(pbid); + convert_to_long(pmode); + convert_to_long(poffset); - bid=Z_LVAL_PP(pbid); + bid=Z_LVAL_P(pbid); Ifx_slob = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult || Ifx_slob->type!=TYPE_SLOB) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix slob-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING, "%s(): %d is not a Informix slob-result index", get_active_function_name(TSRMLS_C), bid); + RETURN_FALSE; + } + + if (Ifx_slob->type!=TYPE_SLOB) { + php_error(E_WARNING, "%s(): %d is not a Informix SLOB type", get_active_function_name(TSRMLS_C), bid); RETURN_FALSE; } mode=LO_SEEK_SET; - if(Z_LVAL_PP(pmode)==1) { + if(Z_LVAL_P(pmode)==1) { mode=LO_SEEK_CUR; } - if(Z_LVAL_PP(pmode)==2) { + if(Z_LVAL_P(pmode)==2) { mode=LO_SEEK_END; } - ifx_int8cvlong(Z_LVAL_PP(poffset),&offset); + ifx_int8cvlong(Z_LVAL_P(poffset),&offset); if(ifx_lo_seek(Ifx_slob->SLOB.lofd,&offset,mode,&akt_seek_pos)<0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't perform seek-operation"); + php_error(E_WARNING, "%s(): Can't perform seek-operation", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } if(ifx_int8tolong(&akt_seek_pos,&lakt_seek_pos)<0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Seek-position to large for long"); + php_error(E_WARNING, "%s(): Seek-position to large for long", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } RETURN_LONG(lakt_seek_pos); @@ -4140,30 +4576,35 @@ PHP_FUNCTION(ifxus_seek_slob) Reads nbytes of the slob-object */ PHP_FUNCTION(ifxus_read_slob) { - zval **pbid, **pnbytes; + zval *pbid, *pnbytes; long bid, nbytes; IFX_IDRES *Ifx_slob; int errcode,type; char *buffer; - if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &pbid, &pnbytes) == FAILURE) { + if (ZEND_NUM_ARGS()!=2 || getParameters(ht, 2, &pbid, &pnbytes)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pbid); - convert_to_long_ex(pnbytes); + convert_to_long(pbid); + convert_to_long(pnbytes); - bid=Z_LVAL_PP(pbid); + bid=Z_LVAL_P(pbid); Ifx_slob = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult || Ifx_slob->type!=TYPE_SLOB) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix slob-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING, "%s(): %d is not a Informix slob-result index", get_active_function_name(TSRMLS_C), bid); + RETURN_FALSE; + } + + if (Ifx_slob->type!=TYPE_SLOB) { + php_error(E_WARNING, "%s(): %d is not a Informix SLOB type", get_active_function_name(TSRMLS_C), bid); RETURN_FALSE; } - nbytes=Z_LVAL_PP(pnbytes); + nbytes=Z_LVAL_P(pnbytes); buffer=emalloc(nbytes); if(ifx_lo_read(Ifx_slob->SLOB.lofd,buffer,nbytes,&errcode)<0) { efree(buffer); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error reading slob: %d", errcode); + php_error(E_WARNING, "%s(): Error reading slob: %d", get_active_function_name(TSRMLS_C), errcode); RETURN_FALSE; } RETURN_STRINGL(buffer,nbytes,0); @@ -4184,35 +4625,40 @@ PHP_FUNCTION(ifxus_read_slob) Writes a string into the slob-object */ PHP_FUNCTION(ifxus_write_slob) { - zval **pbid, **pcontent; + zval *pbid, *pcontent; long bid, nbytes; IFX_IDRES *Ifx_slob; int errcode,type; char *buffer; - if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &pbid, &pcontent) == FAILURE) { + if (ZEND_NUM_ARGS()!=2 || getParameters(ht, 2, &pbid, &pcontent)==FAILURE) { WRONG_PARAM_COUNT; } - convert_to_long_ex(pbid); - convert_to_string_ex(pcontent); + convert_to_long(pbid); + convert_to_string(pcontent); - bid=Z_LVAL_PP(pbid); + bid=Z_LVAL_P(pbid); Ifx_slob = (IFX_IDRES *) zend_list_find(bid,&type); - if (type!=le_idresult || Ifx_slob->type!=TYPE_SLOB) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a Informix slob-result index", bid); + if (type!=le_idresult) { + php_error(E_WARNING, "%s(): %d is not a Informix slob-result index", get_active_function_name(TSRMLS_C), bid); + RETURN_FALSE; + } + + if (Ifx_slob->type!=TYPE_SLOB) { + php_error(E_WARNING, "%s(): %d is not a Informix SLOB type", get_active_function_name(TSRMLS_C), bid); RETURN_FALSE; } - buffer=Z_STRVAL_PP(pcontent); - nbytes=Z_STRLEN_PP(pcontent); + buffer=Z_STRVAL_P(pcontent); + nbytes=Z_STRLEN_P(pcontent); if(nbytes<=0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "String has no content"); + php_error(E_WARNING, "%s(): String has no content", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } if((nbytes=ifx_lo_write(Ifx_slob->SLOB.lofd,buffer,nbytes,&errcode))<0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error writing slob: %d", errcode); + php_error(E_WARNING, "%s(): Error writing slob: %d", get_active_function_name(TSRMLS_C), errcode); RETURN_FALSE; }