PHP_FUNCTION(odbc_result)
{
char *field;
+ zend_string *field_str;
int field_ind;
SQLSMALLINT sql_c_type = SQL_C_CHAR;
odbc_result *result;
}
/* For char data, the length of the returned string will be longreadlen - 1 */
fieldsize = (result->longreadlen <= 0) ? 4096 : result->longreadlen;
- field = emalloc(fieldsize);
+ field_str = zend_string_alloc(fieldsize, 0);
/* 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, (SQLUSMALLINT)(field_ind + 1), sql_c_type,
- field, fieldsize, &result->values[field_ind].vallen);
+ ZSTR_VAL(field_str), fieldsize, &result->values[field_ind].vallen);
if (rc == SQL_ERROR) {
odbc_sql_error(result->conn_ptr, result->stmt, "SQLGetData");
- efree(field);
+ zend_string_free(field_str);
RETURN_FALSE;
}
if (result->values[field_ind].vallen == SQL_NULL_DATA) {
- efree(field);
+ zend_string_free(field_str);
RETURN_NULL();
} else if (rc == SQL_NO_DATA_FOUND) {
- efree(field);
+ zend_string_free(field_str);
RETURN_FALSE;
}
/* Reduce fieldlen by 1 if we have char data. One day we might
/* Don't duplicate result, saves one emalloc.
For SQL_SUCCESS, the length is in vallen.
*/
- RETVAL_STRINGL(field, (rc == SQL_SUCCESS_WITH_INFO) ? fieldsize : result->values[field_ind].vallen);
- // TODO: avoid dpouble reallocation ???
- efree(field);
- return;
+ if (rc != SQL_SUCCESS_WITH_INFO) {
+ field_str = zend_string_truncate(field_str, result->values[field_ind].vallen, 0);
+ }
+ RETURN_NEW_STR(field_str);
break;
default: