📄 php_odbc.c
字号:
#ifdef HAVE_SQL_EXTENDED_FETCH if (rownum > 0 && result->fetch_abs) result->fetched = rownum; else#endif result->fetched++; for(i = 0; i < result->numcols; i++) { ALLOC_INIT_ZVAL(tmp); Z_TYPE_P(tmp) = IS_STRING; Z_STRLEN_P(tmp) = 0; sql_c_type = SQL_C_CHAR; switch(result->values[i].coltype) { case SQL_BINARY: case SQL_VARBINARY: case SQL_LONGVARBINARY: if (result->binmode <= 0) { Z_STRVAL_P(tmp) = empty_string; break; } if (result->binmode == 1) sql_c_type = SQL_C_BINARY; case SQL_LONGVARCHAR: if (IS_SQL_LONG(result->values[i].coltype) && result->longreadlen <= 0) { Z_STRVAL_P(tmp) = empty_string; break; } if (buf == NULL) buf = emalloc(result->longreadlen + 1); rc = SQLGetData(result->stmt, (UWORD)(i + 1), sql_c_type, buf, result->longreadlen + 1, &result->values[i].vallen); if (rc == SQL_ERROR) { odbc_sql_error(result->conn_ptr, result->stmt, "SQLGetData"); efree(buf); RETURN_FALSE; } if (rc == SQL_SUCCESS_WITH_INFO) { Z_STRLEN_P(tmp) = result->longreadlen; } else if (result->values[i].vallen == SQL_NULL_DATA) { ZVAL_NULL(tmp); break; } else { Z_STRLEN_P(tmp) = result->values[i].vallen; } Z_STRVAL_P(tmp) = estrndup(buf, Z_STRLEN_P(tmp)); break; default: if (result->values[i].vallen == SQL_NULL_DATA) { ZVAL_NULL(tmp); break; } Z_STRLEN_P(tmp) = result->values[i].vallen; Z_STRVAL_P(tmp) = estrndup(result->values[i].value,Z_STRLEN_P(tmp)); break; } if (result_type & ODBC_NUM) { zend_hash_index_update(Z_ARRVAL_P(return_value), i, &tmp, sizeof(pval *), NULL); } else { if (!*(result->values[i].name)) { zend_hash_update(Z_ARRVAL_P(return_value), Z_STRVAL_P(tmp), Z_STRLEN_P(tmp)+1, &tmp, sizeof(pval *), NULL); } else { zend_hash_update(Z_ARRVAL_P(return_value), result->values[i].name, strlen(result->values[i].name)+1, &tmp, sizeof(pval *), NULL); } } } if (buf) efree(buf);}/* }}} *//* {{{ proto object odbc_fetch_object(int result [, int rownumber]) Fetch a result row as an object */PHP_FUNCTION(odbc_fetch_object){ php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, ODBC_OBJECT); if (Z_TYPE_P(return_value) == IS_ARRAY) { object_and_properties_init(return_value, ZEND_STANDARD_CLASS_DEF_PTR, Z_ARRVAL_P(return_value)); }}/* }}} *//* {{{ proto array odbc_fetch_array(int result [, int rownumber]) Fetch a result row as an associative array */PHP_FUNCTION(odbc_fetch_array){ php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, ODBC_OBJECT);}/* }}} */#endif/* {{{ proto int odbc_fetch_into(resource result_id, array result_array, [, int rownumber]) Fetch one result row into an array */ PHP_FUNCTION(odbc_fetch_into){ int numArgs, i; odbc_result *result; RETCODE rc; SWORD sql_c_type; char *buf = NULL; pval **pv_res, **pv_res_arr, *tmp;#ifdef HAVE_SQL_EXTENDED_FETCH pval **pv_row; UDWORD crow; UWORD RowStatus[1]; SDWORD rownum = -1;#endif /* HAVE_SQL_EXTENDED_FETCH */ numArgs = ZEND_NUM_ARGS(); switch(numArgs) { case 2: if (zend_get_parameters_ex(2, &pv_res, &pv_res_arr) == FAILURE) { WRONG_PARAM_COUNT; } break;#ifdef HAVE_SQL_EXTENDED_FETCH case 3: if (zend_get_parameters_ex(3, &pv_res, &pv_res_arr, &pv_row) == FAILURE) { WRONG_PARAM_COUNT; } SEPARATE_ZVAL(pv_row); convert_to_long_ex(pv_row); rownum = Z_LVAL_PP(pv_row); break;#endif /* HAVE_SQL_EXTENDED_FETCH */ default: WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(result, odbc_result *, pv_res, -1, "ODBC result", le_result); if (result->numcols == 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No tuples available at this result index"); RETURN_FALSE; } if (Z_TYPE_PP(pv_res_arr) != IS_ARRAY) { array_init(*pv_res_arr); }#ifdef HAVE_SQL_EXTENDED_FETCH if (result->fetch_abs) { if (rownum > 0) rc = SQLExtendedFetch(result->stmt,SQL_FETCH_ABSOLUTE,rownum,&crow,RowStatus); else rc = SQLExtendedFetch(result->stmt,SQL_FETCH_NEXT,1,&crow,RowStatus); } else#endif rc = SQLFetch(result->stmt); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) RETURN_FALSE;#ifdef HAVE_SQL_EXTENDED_FETCH if (rownum > 0 && result->fetch_abs) result->fetched = rownum; else#endif result->fetched++; for(i = 0; i < result->numcols; i++) { ALLOC_ZVAL(tmp); tmp->refcount = 1; Z_TYPE_P(tmp) = IS_STRING; Z_STRLEN_P(tmp) = 0; sql_c_type = SQL_C_CHAR; switch(result->values[i].coltype) { case SQL_BINARY: case SQL_VARBINARY: case SQL_LONGVARBINARY: if (result->binmode <= 0) { Z_STRVAL_P(tmp) = empty_string; break; } if (result->binmode == 1) sql_c_type = SQL_C_BINARY; case SQL_LONGVARCHAR: if (IS_SQL_LONG(result->values[i].coltype) && result->longreadlen <= 0) { Z_STRVAL_P(tmp) = empty_string; break; } if (buf == NULL) buf = emalloc(result->longreadlen + 1); rc = SQLGetData(result->stmt, (UWORD)(i + 1),sql_c_type, buf, result->longreadlen + 1, &result->values[i].vallen); if (rc == SQL_ERROR) { odbc_sql_error(result->conn_ptr, result->stmt, "SQLGetData"); efree(buf); RETURN_FALSE; } if (rc == SQL_SUCCESS_WITH_INFO) { Z_STRLEN_P(tmp) = result->longreadlen; } else if (result->values[i].vallen == SQL_NULL_DATA) { ZVAL_NULL(tmp); break; } else { Z_STRLEN_P(tmp) = result->values[i].vallen; } Z_STRVAL_P(tmp) = estrndup(buf, Z_STRLEN_P(tmp)); break; default: if (result->values[i].vallen == SQL_NULL_DATA) { ZVAL_NULL(tmp); break; } Z_STRLEN_P(tmp) = result->values[i].vallen; Z_STRVAL_P(tmp) = estrndup(result->values[i].value,Z_STRLEN_P(tmp)); break; } zend_hash_index_update(Z_ARRVAL_PP(pv_res_arr), i, &tmp, sizeof(pval *), NULL); } if (buf) efree(buf); RETURN_LONG(result->numcols); }/* }}} *//* {{{ proto bool solid_fetch_prev(resource result_id) */ #if defined(HAVE_SOLID) || defined(HAVE_SOLID_30) || defined(HAVE_SOLID_35)PHP_FUNCTION(solid_fetch_prev){ odbc_result *result; RETCODE rc; pval **pv_res; if (zend_get_parameters_ex(1, &pv_res) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(result, odbc_result *, pv_res, -1, "ODBC result", le_result); if (result->numcols == 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No tuples available at this result index"); RETURN_FALSE; } rc = SQLFetchPrev(result->stmt); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { RETURN_FALSE; } if (result->fetched > 1) result->fetched--; RETURN_TRUE;}#endif/* }}} *//* {{{ proto bool odbc_fetch_row(resource result_id [, int row_number]) Fetch a row */PHP_FUNCTION(odbc_fetch_row){ int numArgs; SDWORD rownum = 1; odbc_result *result; RETCODE rc; pval **pv_res, **pv_row;#ifdef HAVE_SQL_EXTENDED_FETCH UDWORD crow; UWORD RowStatus[1];#endif numArgs = ZEND_NUM_ARGS(); switch (numArgs) { case 1: if (zend_get_parameters_ex(1, &pv_res) == FAILURE) WRONG_PARAM_COUNT; break; case 2: if (zend_get_parameters_ex(2, &pv_res, &pv_row) == FAILURE) WRONG_PARAM_COUNT; convert_to_long_ex(pv_row); rownum = Z_LVAL_PP(pv_row); break; default: WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(result, odbc_result *, pv_res, -1, "ODBC result", le_result); if (result->numcols == 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No tuples available at this result index"); RETURN_FALSE; }#ifdef HAVE_SQL_EXTENDED_FETCH if (result->fetch_abs) { if (numArgs > 1) rc = SQLExtendedFetch(result->stmt,SQL_FETCH_ABSOLUTE,rownum,&crow,RowStatus); else rc = SQLExtendedFetch(result->stmt,SQL_FETCH_NEXT,1,&crow,RowStatus); } else#endif rc = SQLFetch(result->stmt); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { RETURN_FALSE; } if (numArgs > 1) { result->fetched = rownum; } else { result->fetched++; } RETURN_TRUE;} /* }}} *//* {{{ proto mixed odbc_result(resource result_id, mixed field) Get result data */ PHP_FUNCTION(odbc_result){ char *field; int field_ind; SWORD sql_c_type = SQL_C_CHAR; odbc_result *result; int i = 0; RETCODE rc; SDWORD fieldsize; pval **pv_res, **pv_field;#ifdef HAVE_SQL_EXTENDED_FETCH UDWORD crow; UWORD RowStatus[1];#endif field_ind = -1; field = NULL; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2 , &pv_res, &pv_field) == FAILURE) { WRONG_PARAM_COUNT; } if (Z_TYPE_PP(pv_field) == IS_STRING) { field = Z_STRVAL_PP(pv_field); } else { convert_to_long_ex(pv_field); field_ind = Z_LVAL_PP(pv_field) - 1; } ZEND_FETCH_RESOURCE(result, odbc_result *, pv_res, -1, "ODBC result", le_result); if ((result->numcols == 0)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No tuples available at this result index"); RETURN_FALSE; } /* get field index if the field parameter was a string */ if (field != NULL) { if (result->values == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Result set contains no data"); RETURN_FALSE; } for(i = 0; i < result->numcols; i++) { if (!strcasecmp(result->values[i].name, field)) { field_ind = i; break; } } if (field_ind < 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field %s not found", field); RETURN_FALSE; } } else { /* check for limits of field_ind if the field parameter was an int */ if (field_ind >= result->numcols || field_ind < 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field index is larger than the number of fields"); RETURN_FALSE; } } if (result->fetched == 0) { /* User forgot to call odbc_fetch_row(), or wants to reload the results, do it now */#ifdef HAVE_SQL_EXTENDED_FETCH if (result->fetch_abs) rc = SQLExtendedFetch(result->stmt, SQL_FETCH_NEXT, 1, &crow,RowStatus); else#endif rc = SQLFetch(result->stmt); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) RETURN_FALSE; result->fetched++; } switch(result->values[field_ind].coltype) { case SQL_BINARY: case SQL_VARBINARY: case SQL_LONGVARBINARY: if (result->binmode <= 1) sql_c_type = SQL_C_BINARY; if (result->binmode <= 0) break; case SQL_LONGVARCHAR: if (IS_SQL_LONG(result->values[field_ind].coltype)) { if (result->longreadlen <= 0) break; else fieldsize = result->longreadlen; } else { SQLColAttributes(result->stmt, (UWORD)(field_ind + 1), (UWORD)((sql_c_type == SQL_C_BINARY) ? SQL_COLUMN_LENGTH : SQL_COLUMN_DISPLAY_SIZE), NULL, 0, NULL, &fieldsize); } /* For char data, the length of the returned string will be longreadlen - 1 */ fieldsize = (result->longreadlen <= 0) ? 4096 : result->longreadlen; field = emalloc(fieldsize); /* SQLGetData will truncate CHAR data to fieldsize - 1 bytes and append \0. * For binary data it is truncated to fieldsize bytes. */ rc = SQLGetData(result->stmt, (UWORD)(field_ind + 1), sql_c_type, field, fieldsize, &result->values[field_ind].vallen); if (rc == SQL_ERROR) { odbc_sql_error(result->conn_ptr, result->stmt, "SQLGetData"); efree(field); RETURN_FALSE; } if (result->values[field_ind].vallen == SQL_NULL_DATA) { efree(field); RETURN_NULL(); } else if (rc == SQL_NO_DATA_FOUND) { efree(field); RETURN_FALSE; } /* Reduce fieldlen by 1 if we have char data. One day we might have binary strings... */ if (result->values[field_ind].coltype == SQL_LONGVARCHAR) fieldsize -= 1; /* Don't duplicate result, saves one emalloc. For SQL_SUCCESS, the length is in vallen. */ RETURN_STRINGL(field, (rc == SQL_SUCCESS_WITH_INFO) ? fieldsize : result->values[field_ind].vallen, 0); break; default: if (result->values[field_ind].vallen == SQL_NULL_DATA) { RETURN_NULL(); } else { RETURN_STRINGL(result->values[field_ind].value, result->values[field_ind].vallen, 1); } break; }/* If we come here, output unbound LONG and/or BINARY column data to the client */ /* We emalloc 1 byte more for SQL_C_CHAR (trailing \0) */ fieldsize = (sql_c_type == SQL_C_CHAR) ? 4096 : 4095; field = emalloc(fieldsize); /* Call SQLGetData() until SQL_SUCCESS is returned */ while(1) { rc = SQLGetData(result->stmt, (UWORD)(field_ind + 1),sql_c_type, field, fieldsize, &result->values[field_ind].vallen); if (rc == SQL_ERROR) { odbc_sql_error(result->conn_ptr, result->stmt, "SQLGetData"); efree(field);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -