Hi: Attached are three patches for ext/sybase. The first two fix bugs. The third adds a function, while at the same time removing a lot of redundant code. In order:
php5_sybase-fetch_object.diff: The sybase extension does not currently compile, since sybase_fetch_object was never converted to ZE2's new object API. This patch converts sybase_fetch_object, fixes three warnings, and checks the return value of malloc() in the one place it's used. Please apply this - ext/sybase is broken in PHP5 without it. php_sybase-string-termination: With --enable-debug turned on, both ZE1 and ZE2 emit warnings about null-termination for each call to sybase_query. These warnings are caused by php_sybase_get_column_content, which returns a zval whose internal string is not null-terminated. The original logic which terminated the string was #ifdef'ed out; this patch replaces it with a greatly simplified version. Tested with FreeTDS 0.60 against Microsoft SQL Server 2000; also applies cleanly to PHP4. php5_sybase-fetch_assoc.diff: Most of the other PHP database extensions have three ways for rows to be fetched: fetch_row (numeric keys), fetch_assoc (string keys), or fetch_array (both numeric and string keys). The ext/sybase extension currently has no sybase_fetch_assoc function. This patch adds sybase_fetch_assoc, while at the same time removing the duplication between sybase_fetch_row and php_sybase_fetch_hash. The result is a unified php_sybase_fetch_hash capable of fetching in either of the three modes, and three userland functions which pass through to it. (Depends: php5_sybase-fetch_object.diff) If these look okay, please apply. If not, I'll gladly fix and resend - just let me know. Thanks a lot, - Dave [EMAIL PROTECTED]
diff -ur php-5.0-rc1-dist/ext/sybase/php_sybase_db.c php-5.0-rc1/ext/sybase/php_sybase_db.c --- php-5.0-rc1-dist/ext/sybase/php_sybase_db.c 2004-01-27 20:43:39.000000000 -0500 +++ php-5.0-rc1/ext/sybase/php_sybase_db.c 2004-03-19 08:32:47.000000000 -0500 @@ -439,11 +439,11 @@ list_entry new_le; if (php_sybase_module.max_links!=-1 && php_sybase_module.num_links>=php_sybase_module.max_links) { - php_error_docref(NULL TSRMLS_CC, E_WARNING,"Sybase: Too many open links (%d)",php_sybase_module.num_links); + php_error_docref(NULL TSRMLS_CC, E_WARNING,"Sybase: Too many open links (%ld)",php_sybase_module.num_links); goto err_login; } if (php_sybase_module.max_persistent!=-1 && php_sybase_module.num_persistent>=php_sybase_module.max_persistent) { - php_error_docref(NULL TSRMLS_CC, E_WARNING,"Sybase: Too many open persistent links (%d)",php_sybase_module.num_persistent); + php_error_docref(NULL TSRMLS_CC, E_WARNING,"Sybase: Too many open persistent links (%ld)",php_sybase_module.num_persistent); goto err_login; } /* create the link */ @@ -457,7 +457,9 @@ } /* hash it up */ - sybase_ptr = (sybase_link *) malloc(sizeof(sybase_link)); + if ((sybase_ptr = (sybase_link *) malloc(sizeof(sybase_link))) == NULL) { + goto err_link; + } memcpy(sybase_ptr,&sybase,sizeof(sybase_link)); Z_TYPE(new_le) = php_sybase_module.le_plink; new_le.ptr = sybase_ptr; @@ -517,7 +519,7 @@ } } if (php_sybase_module.max_links!=-1 && php_sybase_module.num_links>=php_sybase_module.max_links) { - php_error_docref(NULL TSRMLS_CC, E_WARNING,"Sybase: Too many open links (%d)",php_sybase_module.num_links); + php_error_docref(NULL TSRMLS_CC, E_WARNING,"Sybase: Too many open links (%ld)",php_sybase_module.num_links); goto err_login; } @@ -711,7 +713,6 @@ char *res_buf; int res_length = dbdatlen(sybase_ptr->link,offset); int src_length = res_length; - register char *p; switch (coltype(offset)) { case SYBBINARY: @@ -1036,7 +1037,6 @@ zval **sybase_result_index; int type,i,id; sybase_result *result; - pval *field_content; if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &sybase_result_index)==FAILURE) { WRONG_PARAM_COUNT; @@ -1105,11 +1105,9 @@ PHP_FUNCTION(sybase_fetch_object) { php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU); - if (Z_TYPE_P(return_value)==IS_ARRAY) { - Z_TYPE_P(return_value)=IS_OBJECT; - Z_OBJPROP_P(return_value) = Z_ARRVAL_P(return_value); - Z_OBJCE_P(return_value) = ZEND_STANDARD_CLASS_DEF_PTR; - } + + if (Z_TYPE_P(return_value)==IS_ARRAY) + object_and_properties_init(return_value, ZEND_STANDARD_CLASS_DEF_PTR, Z_ARRVAL_P(return_value)); } /* }}} */
diff -ur php-5.0-rc1-dist/ext/sybase/php_sybase_db.c php-5.0-rc1/ext/sybase/php_sybase_db.c --- php-5.0-rc1-dist/ext/sybase/php_sybase_db.c 2004-03-19 10:17:50.000000000 -0500 +++ php-5.0-rc1/ext/sybase/php_sybase_db.c 2004-03-19 10:17:02.000000000 -0500 @@ -731,21 +731,15 @@ } res_buf = (char *) emalloc(res_length+1); - memset(res_buf,' ',res_length+1); /* XXX i'm sure there's a better way - but i don't have sybase here to test - 991105 [EMAIL PROTECTED] */ - dbconvert(NULL,coltype(offset),dbdata(sybase_ptr->link,offset), src_length,SYBCHAR,res_buf,res_length); -#if ilia_0 - /* get rid of trailing spaces */ - p = res_buf + res_length; - while (p >= res_buf && (*p == ' ' || *p == '\0')) { - p--; - } - *(++p) = 0; /* put a trailing NULL */ - res_length = p - res_buf; -#endif - Z_STRLEN_P(result) = res_length; + memset(res_buf,0,res_length+1); + dbconvert(NULL,coltype(offset),dbdata(sybase_ptr->link,offset),src_length,SYBCHAR,res_buf,res_length); + + /* Get rid of extra nulls */ + while (res_length > 0 && res_buf[res_length] == '\0') + res_length--; + Z_STRVAL_P(result) = res_buf; + Z_STRLEN_P(result) = res_length+1; Z_TYPE_P(result) = IS_STRING; } else { TSRMLS_FETCH();
diff -ur php-5.0-rc1-dist/ext/sybase/php_sybase_db.c php-5.0-rc1/ext/sybase/php_sybase_db.c --- php-5.0-rc1-dist/ext/sybase/php_sybase_db.c 2004-03-19 10:21:57.000000000 -0500 +++ php-5.0-rc1/ext/sybase/php_sybase_db.c 2004-03-19 10:32:37.000000000 -0500 @@ -92,6 +92,7 @@ PHP_FE(sybase_num_fields, NULL) PHP_FE(sybase_fetch_row, NULL) PHP_FE(sybase_fetch_array, NULL) + PHP_FE(sybase_fetch_assoc, NULL) PHP_FE(sybase_fetch_object, NULL) PHP_FE(sybase_data_seek, NULL) PHP_FE(sybase_fetch_field, NULL) @@ -111,6 +112,7 @@ PHP_FALIAS(mssql_num_fields, sybase_num_fields, NULL) PHP_FALIAS(mssql_fetch_row, sybase_fetch_row, NULL) PHP_FALIAS(mssql_fetch_array, sybase_fetch_array, NULL) + PHP_FALIAS(mssql_fetch_assoc, sybase_fetch_assoc, NULL) PHP_FALIAS(mssql_fetch_object, sybase_fetch_object, NULL) PHP_FALIAS(mssql_data_seek, sybase_data_seek, NULL) PHP_FALIAS(mssql_fetch_field, sybase_fetch_field, NULL) @@ -934,7 +936,7 @@ } /* }}} */ - + /* {{{ proto bool sybase_free_result(int result) Free result memory */ PHP_FUNCTION(sybase_free_result) @@ -1024,42 +1026,7 @@ } /* }}} */ -/* {{{ proto array sybase_fetch_row(int result) - Get row as enumerated array */ -PHP_FUNCTION(sybase_fetch_row) -{ - zval **sybase_result_index; - int type,i,id; - sybase_result *result; - - if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &sybase_result_index)==FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(sybase_result_index); - id = Z_LVAL_PP(sybase_result_index); - - result = (sybase_result *) zend_list_find(id,&type); - if (type!=php_sybase_module.le_result) { - php_error_docref(NULL TSRMLS_CC, E_WARNING,"%d is not a Sybase result index",id); - RETURN_FALSE; - } - - if (result->cur_row >= result->num_rows) { - RETURN_FALSE; - } - - array_init(return_value); - for (i=0; i<result->num_fields; i++) { - ZVAL_ADDREF(result->data[result->cur_row][i]); - zend_hash_index_update(Z_ARRVAL_P(return_value), i, (void *) &result->data[result->cur_row][i], sizeof(pval *), NULL); - } - result->cur_row++; -} -/* }}} */ - - -static void php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS) +static void php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int numeric_keys, int string_keys) { zval **sybase_result_index; sybase_result *result; @@ -1085,31 +1052,50 @@ array_init(return_value); for (i=0; i<result->num_fields; i++) { - ZVAL_ADDREF(result->data[result->cur_row][i]); - zend_hash_index_update(Z_ARRVAL_P(return_value), i, (void *) &result->data[result->cur_row][i], sizeof(pval *), NULL); - ZVAL_ADDREF(result->data[result->cur_row][i]); - zend_hash_update(Z_ARRVAL_P(return_value), result->fields[i].name, strlen(result->fields[i].name)+1, (void *) &result->data[result->cur_row][i], sizeof(pval *), NULL); + if (numeric_keys) { + ZVAL_ADDREF(result->data[result->cur_row][i]); + zend_hash_index_update(Z_ARRVAL_P(return_value), i, (void *) &result->data[result->cur_row][i], sizeof(pval *), NULL); + } + if (string_keys) { + ZVAL_ADDREF(result->data[result->cur_row][i]); + zend_hash_update(Z_ARRVAL_P(return_value), result->fields[i].name, strlen(result->fields[i].name)+1, (void *) &result->data[result->cur_row][i], sizeof(pval *), NULL); + } } result->cur_row++; } - /* {{{ proto object sybase_fetch_object(int result) Fetch row as object */ PHP_FUNCTION(sybase_fetch_object) { - php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU); + php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 1); 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 sybase_fetch_row(int result) + Get row as enumerated array */ +PHP_FUNCTION(sybase_fetch_row) +{ + php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1, 0); +} +/* }}} */ + /* {{{ proto array sybase_fetch_array(int result) Fetch row as array */ PHP_FUNCTION(sybase_fetch_array) { - php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU); + php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1, 1); +} +/* }}} */ + +/* {{{ proto array sybase_fetch_assoc(int result) + Fetch row as array */ +PHP_FUNCTION(sybase_fetch_assoc) +{ + php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 1); } /* }}} */
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php