📄 ifx.ec
字号:
RETURN_STRING(ifx_error(0), 0); /* ifx_error returns emalloced string */}/* }}} *//* ----------------------------------------------------------------------** string ifx_errormsg([int errorcode])**** returns the Informix errormessage associated with ** the most recent Informix error if SQLCODE is nonzero, or,** when the optional "errocode" param is present, the errormessage ** corresponding to "errorcode".** ----------------------------------------------------------------------*//* {{{ proto string ifx_errormsg([int errorcode]) Returns the Informix errormessage associated with */PHP_FUNCTION(ifx_errormsg){ zval **errcode; int ifx_errorcode; int msglen, maxmsglen; char *ifx_errmsg; char * returnmsg; switch(ZEND_NUM_ARGS()) { case 0: if (IFXG(sv_sqlcode) == 0) { ifx_errorcode = SQLCODE; } else { ifx_errorcode = IFXG(sv_sqlcode); } break; case 1: if (zend_get_parameters_ex(1, &errcode) == FAILURE) { RETURN_FALSE; } convert_to_long_ex(errcode); ifx_errorcode = Z_LVAL_PP(errcode); break; default: WRONG_PARAM_COUNT; break; } maxmsglen = 255; msglen = maxmsglen; /* Some bug fix, rgetlmsg doesnt always set the value */ ifx_errmsg = (char *)emalloc(maxmsglen + 1); if (ifx_errorcode != 0) { rgetlmsg(ifx_errorcode, ifx_errmsg, maxmsglen, &msglen); if (msglen > maxmsglen) { maxmsglen = msglen; ifx_errmsg = (char *)erealloc(ifx_errmsg, maxmsglen + 1); rgetlmsg(ifx_errorcode, ifx_errmsg, maxmsglen, &msglen); } } else { ifx_errmsg[0] = 0; } returnmsg = (char *) emalloc(strlen(ifx_errmsg) + 128); sprintf(returnmsg, ifx_errmsg, sqlca.sqlerrm); efree(ifx_errmsg); RETURN_STRING(returnmsg,0); }/* }}} *//* --------------------------------------------------------------** int ifx_affected_rows(int resultid)**** returns the number of rows affected by query $resultid**** for selects : estimated number of rows (sqlerrd[0])** for insert/update/delete : real number (sqlerrd[2])** ---------------------------------------------------------------*//* {{{ proto int ifx_affected_rows(resource resultid) Returns the number of rows affected by query identified by resultid */PHP_FUNCTION(ifx_affected_rows){ zval **result; IFX_RES *Ifx_Result; if (ZEND_NUM_ARGS() != 1 || (zend_get_parameters_ex(1, &result)) == FAILURE) { WRONG_PARAM_COUNT; } IFXG(sv_sqlcode) = 0; ZEND_FETCH_RESOURCE(Ifx_Result, IFX_RES *, result, -1, "Informix Result", le_result); RETURN_LONG(Ifx_Result->affected_rows);}/* }}} *//* ----------------------------------------------------------------------** array ifx_fetch_row(int resultid [, mixed $position])**** fetches the next row, or if using a scroll cursor, and position** is present, the row as given in position, into an associative** array with the fieldnames as key**** returns FALSE on error**** position can be : "FIRST", "NEXT", "LAST", "PREVIOUS", "CURRENT" ** or an absolute row number** ----------------------------------------------------------------------*//* {{{ proto array ifx_fetch_row(resource resultid [, mixed position]) Fetches the next row or <position> row if using a scroll cursor */PHP_FUNCTION(ifx_fetch_row){ zval **result, **position; IFX_RES *Ifx_Result;EXEC SQL BEGIN DECLARE SECTION; char *ifx; /* connection ID */ char *cursorid; /* query cursor id */ char *statemid; /* statement id */ char *descrpid; /* descriptor id */ int fieldcount; /* field count */ int i; /* an index */ char fieldname[64]; /* fieldname */ short fieldtype; /* field type */ int fieldleng; /* field length */$ifdef HAVE_IFX_IUS; ifx_int8_t int8_var; lvarchar *lvar_tmp;$endif; short indicator; int int_data; char *char_data; long date_data; interval intvl_data = {0}; datetime dt_data = {0}; decimal dec_data = {0}; short short_data; loc_t *locator_b;$ifdef HAVE_IFX_IUS; fixed binary 'blob' ifx_lo_t *slocator;$endif; float float_data; double double_data; int fetch_row;EXEC SQL END DECLARE SECTION; int num_fields; int locind,bid,bid_b; char string_data[256]; long long_data; char *p; char *fetch_pos; char *nullstr; switch (ZEND_NUM_ARGS()) { case 1: if (zend_get_parameters_ex(1, &result) == FAILURE) { RETURN_FALSE; } fetch_pos = NULL; fetch_row = 0; break; case 2: if (zend_get_parameters_ex(2, &result, &position) == FAILURE) { RETURN_FALSE; } if (Z_TYPE_PP(position) != IS_STRING) { fetch_pos = NULL; fetch_row = Z_LVAL_PP(position); } else { fetch_pos = Z_STRVAL_PP(position); fetch_row = 0; } break; default: WRONG_PARAM_COUNT; break; } ZEND_FETCH_RESOURCE(Ifx_Result, IFX_RES *, result, -1, "Informix Result", le_result); nullstr = php_intifx_null(TSRMLS_C); IFXG(sv_sqlcode) = 0; if (strcmp(Ifx_Result->cursorid, "") == 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not a select cursor!"); RETURN_FALSE; } ifx = Ifx_Result->connecid; cursorid = Ifx_Result->cursorid; statemid = Ifx_Result->statemid; descrpid = Ifx_Result->descrpid; fieldcount = Ifx_Result->numcols; 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_CC)) == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cant get BLOB from Result Set!"); RETURN_FALSE; } locind++; if (IFXG(blobinfile) == 0) { php_intifx_init_blob(locator_b, BLMODE_INMEM, 1 TSRMLS_CC); } else { php_intifx_init_blob(locator_b, BLMODE_INFILE, 1 TSRMLS_CC); } EXEC SQL SET DESCRIPTOR :descrpid VALUE :i DATA = :*locator_b; } } if (!Ifx_Result->isscroll) { EXEC SQL FETCH :cursorid USING SQL DESCRIPTOR :descrpid; } else { if (fetch_pos == NULL) { if (fetch_row != 0) { EXEC SQL FETCH ABSOLUTE :fetch_row :cursorid USING SQL DESCRIPTOR :descrpid; } else { EXEC SQL FETCH NEXT :cursorid USING SQL DESCRIPTOR :descrpid; } } else { if (!strcasecmp(fetch_pos, "NEXT")) { EXEC SQL FETCH NEXT :cursorid USING SQL DESCRIPTOR :descrpid; } else if (!strcasecmp(fetch_pos, "PREVIOUS")) { EXEC SQL FETCH PREVIOUS :cursorid USING SQL DESCRIPTOR :descrpid; } else if (!strcasecmp(fetch_pos, "FIRST")) { EXEC SQL FETCH FIRST :cursorid USING SQL DESCRIPTOR :descrpid; } else if (!strcasecmp(fetch_pos, "LAST")) { EXEC SQL FETCH LAST :cursorid USING SQL DESCRIPTOR :descrpid; } 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"); } } } if (SQLCODE != -451) { switch (ifx_check()) { case IFX_ERROR: IFXG(sv_sqlcode) = SQLCODE; { char *ifx_err = ifx_error(ifx); php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can not fetch row on cursor %s (%s)", ifx_err, cursorid); efree(ifx_err); RETURN_FALSE; } break; case IFX_NODATA: RETURN_FALSE; break; default: break; } } Ifx_Result->rowid++; array_init(return_value); num_fields = fieldcount; locind = 0; for (i = 1; i <= num_fields; i++) { EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :fieldtype = TYPE, :fieldname = NAME, :fieldleng = LENGTH, :indicator = INDICATOR; if (ifx_check() < 0) { char *ifx_err = ifx_error(ifx); IFXG(sv_sqlcode) = SQLCODE; php_error_docref(NULL TSRMLS_CC, E_WARNING, "Get descriptor (field # %d) fails (%s)", i, ifx_err); efree(ifx_err); RETURN_FALSE; } p = fieldname; /* rtrim fieldname */ while ((*p != ' ') && (p < &fieldname[sizeof(fieldname) - 1])) ++p; *p = 0; if (strcmp("(expression)", fieldname) == 0) { /* stored proc */ sprintf(fieldname, "[Expr_%d]", i); } if (indicator == -1) { /* NULL */ if ((IFXG(textasvarchar) == 0 && fieldtype == SQLTEXT) || (IFXG(byteasvarchar) == 0 && fieldtype == SQLBYTES)) { bid_b = Ifx_Result->res_id[locind]; /* call php_intifx_get_blobloc() to reset locator_b */ 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_CC); continue; } if ((fieldtype == SQLTEXT) || (fieldtype == SQLBYTES)$ifdef HAVE_IFX_IUS; || (fieldtype == SQLUDTFIXED)$endif; ) { /* call php_intifx_get_blobloc() to reset locator_b */ 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_CC); } add_assoc_string(return_value, fieldname, nullstr, DUP); continue; } /* NULL */ switch (fieldtype) { case SQLSERIAL: case SQLINT: EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :int_data = DATA; long_data = int_data; sprintf(string_data, "%ld", long_data); add_assoc_string(return_value, fieldname, string_data, DUP); break; case SQLSMINT: EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :short_data = DATA; long_data = short_data; sprintf(string_data, "%ld", long_data); add_assoc_string(return_value, fieldname, string_data, DUP); break; case SQLDECIMAL: case SQLMONEY: EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :dec_data = DATA; memset(string_data, 0x20, 64); dectoasc(&dec_data, string_data, 63, -1); for (p = string_data; *p != ' '; ++p) ; *p = 0; add_assoc_string(return_value, fieldname, string_data, DUP); break; case SQLSMFLOAT: EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :float_data = DATA; double_data = float_data; sprintf(string_data, "%17.17g", double_data); add_assoc_string(return_value, fieldname, string_data, DUP); break; case SQLFLOAT: EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :double_data = DATA; sprintf(string_data, "%17.17g", double_data); add_assoc_string(return_value, fieldname, string_data, DUP); break; case SQLDATE: EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :date_data = DATA; rdatestr(date_data, string_data); add_assoc_string(return_value, fieldname, string_data, DUP); break; case SQLDTIME: EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :dt_data = DATA; dttoasc(&dt_data, string_data); add_assoc_string(return_value, fieldname, string_data, DUP); break; case SQLINTERVAL: EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :intvl_data = DATA; intoasc(&intvl_data, string_data); add_assoc_string(return_value, fieldname, string_data, DUP); break;$ifdef HAVE_IFX_IUS; case SQLSERIAL8: case SQLINT8: EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :int8_var = DATA; memset(string_data, ' ', sizeof(string_data)); ifx_int8toasc(&int8_var, string_data, 200); p = string_data; /* rtrim string_data */ while ((*p != ' ') && (p < &string_data[sizeof(string_data) - 1])) ++p; *p = 0; add_assoc_string(return_value, fieldname, string_data, DUP); break; case SQLLVARCHAR: ifx_var_flag(&lvar_tmp, 1); EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :lvar_tmp = DATA; fieldleng = ifx_var_getlen(&lvar_tmp); if (fieldleng > 2) { /* fix by Alex Shepherd */ fieldleng -= 2; } if ((char_data = (char *)emalloc(fieldleng + 1)) == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Out of memory"); RETURN_FALSE; } memcpy(char_data, ifx_var_getdata(&lvar_tmp), fieldleng); ifx_var_dealloc(&lvar_tmp); add_assoc_stringl(return_value, fieldname, char_data, fieldleng, 0); break; case SQLBOOL:$endif; case SQLVCHAR: case SQLNVCHAR: case SQLCHAR: case SQLNCHAR: if ((char_data = (char *)emalloc(fieldleng + 1)) == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Out of memory"); RETURN_FALSE; } EXEC SQL GET DESCRIPTOR :descrpid VALUE :i :char_data = DATA; if (IFXG(charasvarchar) != 0 && (fieldtype == SQLCHAR || fieldtype == SQLNCHAR)) { ldchar(char_data, fieldleng, char_data); } add_assoc_string(return_value, fieldname, char_data, DUP); efree(char_data); char_data = NULL; break;$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); slocator = php_intifxus_get_slobloc(bid, &EG(regular_list) TSRMLS_CC); EXEC SQL SET DESCRIPTOR :descrpid VALUE :i DATA = :*slocat
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -