Hi: The enclosed patch makes the Sybase DBLib support compile against PHP 5 and ZE 2, fixes crashes in sybase_select_db() and sybase_affected_rows() related to incorrect zval initialization, implements the missing sybase_fetch_assoc(), removes a bunch of redundant calls to Z_STRLEN_PP() in php_sybase_do_connect(), and checks the return value of malloc() in the one place it's called. I've tested the modifications against a CVS snapshot of the FreeTDS dblib.
If everything in the patch looks okay, could this be applied? Thanks in advance, - Dave [EMAIL PROTECTED] Index: ext/sybase/php_sybase_db.c =================================================================== RCS file: /repository/php4/ext/sybase/php_sybase_db.c,v retrieving revision 1.48 diff -u -u -r1.48 php_sybase_db.c --- ext/sybase/php_sybase_db.c 15 Apr 2003 01:48:01 -0000 1.48 +++ ext/sybase/php_sybase_db.c 6 Jun 2003 18:06:55 -0000 @@ -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) @@ -322,7 +324,7 @@ host = Z_STRVAL_PP(yyhost); hashed_details_length = Z_STRLEN_PP(yyhost)+6+5; hashed_details = (char *) emalloc(hashed_details_length+1); - sprintf(hashed_details,"sybase_%s____", Z_STRVAL_PP(yyhost)); + sprintf(hashed_details,"sybase_%s____", host); /* SAFE */ } break; case 2: { @@ -337,7 +339,7 @@ user = Z_STRVAL_PP(yyuser); hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+6+5; hashed_details = (char *) emalloc(hashed_details_length+1); - sprintf(hashed_details,"sybase_%s_%s___",Z_STRVAL_PP(yyhost),Z_STRVAL_PP(yyuser)); + sprintf(hashed_details,"sybase_%s_%s___",host,user); /* SAFE */ } break; case 3: { @@ -354,7 +356,7 @@ passwd = Z_STRVAL_PP(yypasswd); hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+Z_STRLEN_PP(yypasswd)+6+5; hashed_details = (char *) emalloc(hashed_details_length+1); - sprintf(hashed_details,"sybase_%s_%s_%s__",Z_STRVAL_PP(yyhost),Z_STRVAL_PP(yyuser),Z_STRVAL_PP(yypasswd)); /* SAFE */ + sprintf(hashed_details,"sybase_%s_%s_%s__",host,user,passwd); /* SAFE */ } break; case 4: { @@ -373,7 +375,7 @@ charset = Z_STRVAL_PP(yycharset); hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+Z_STRLEN_PP(yypasswd)+Z_STRLEN_PP(yycharset)+6+5; hashed_details = (char *) emalloc(hashed_details_length+1); - sprintf(hashed_details,"sybase_%s_%s_%s_%s_",Z_STRVAL_PP(yyhost),Z_STRVAL_PP(yyuser),Z_STRVAL_PP(yypasswd),Z_STRVAL_PP(yycharset)); /* SAFE */ + sprintf(hashed_details,"sybase_%s_%s_%s_%s_",host,user,passwd,charset); /* SAFE */ } break; case 5: { @@ -392,9 +394,9 @@ passwd = Z_STRVAL_PP(yypasswd); charset = Z_STRVAL_PP(yycharset); appname = Z_STRVAL_PP(yyappname); - hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+Z_STRLEN_PP(yypasswd)+Z_STRLEN_P(yycharset)+Z_STRLEN_PP(yyappname)+6+5; + hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+Z_STRLEN_PP(yypasswd)+Z_STRLEN_PP(yycharset)+Z_STRLEN_PP(yyappname)+6+5; hashed_details = (char *) emalloc(hashed_details_length+1); - sprintf(hashed_details,"sybase_%s_%s_%s_%s_%s",Z_STRVAL_PP(yyhost),Z_STRVAL_PP(yyuser),Z_STRVAL_PP(yypasswd),Z_STRVAL_PP(yycharset),Z_STRVAL_PP(yyappname)); /* SAFE */ + sprintf(hashed_details,"sybase_%s_%s_%s_%s_%s",host,user,passwd,charset,appname); /* SAFE */ } break; default: @@ -455,7 +457,9 @@ } /* hash it up */ - sybase_ptr = (sybase_link *) malloc(sizeof(sybase_link)); + if (!(sybase_ptr = (sybase_link *) malloc(sizeof(sybase_link)))) + goto err_link; + memcpy(sybase_ptr,&sybase,sizeof(sybase_link)); Z_TYPE(new_le) = php_sybase_module.le_plink; new_le.ptr = sybase_ptr; @@ -621,8 +625,8 @@ Select Sybase database */ PHP_FUNCTION(sybase_select_db) { - zval *db, **sybase_link_index; - int id,type; + zval **db, **sybase_link_index; + int id, type; sybase_link *sybase_ptr; switch(ZEND_NUM_ARGS()) { @@ -630,6 +634,7 @@ if (zend_get_parameters_ex(1, &db) == FAILURE) { RETURN_FALSE; } + id = php_sybase_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); break; case 2: @@ -645,14 +650,14 @@ } CHECK_LINK(id); - + sybase_ptr = (sybase_link *) zend_list_find(id,&type); if (type!=php_sybase_module.le_link && type!=php_sybase_module.le_plink) { php_error_docref(NULL TSRMLS_CC, E_WARNING,"%d is not a Sybase link index",id); RETURN_FALSE; } - - convert_to_string(db); + + convert_to_string_ex(db); if (dbuse(sybase_ptr->link,Z_STRVAL_PP(db))==FAIL) { /*php_error_docref(NULL TSRMLS_CC, E_WARNING,"Sybase: Unable to select database: %s",sybase_error(sybase));*/ @@ -911,7 +916,7 @@ WRONG_PARAM_COUNT; } - convert_to_long_ex(sybase_result_index);~ + convert_to_long_ex(sybase_result_index); if (Z_LVAL_PP(sybase_result_index)==0) { RETURN_FALSE; } @@ -921,7 +926,7 @@ php_error_docref(NULL TSRMLS_CC, E_WARNING,"%d is not a Sybase result index",Z_LVAL_PP(sybase_result_index)); RETURN_FALSE; } - zend_list_delete(Z_LVAL_P(sybase_result_index)); + zend_list_delete(Z_LVAL_PP(sybase_result_index)); RETURN_TRUE; } /* }}} */ @@ -995,7 +1000,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; @@ -1024,7 +1028,7 @@ /* }}} */ -static void php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS) +static void php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int numerics) { zval **sybase_result_index; sybase_result *result; @@ -1050,8 +1054,10 @@ 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); + if (numerics) { + 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); } @@ -1063,11 +1069,9 @@ 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); 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; + object_and_properties_init(return_value, ZEND_STANDARD_CLASS_DEF_PTR, Z_ARRVAL_P(return_value)); } } /* }}} */ @@ -1076,7 +1080,15 @@ 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); +} +/* }}} */ + +/* {{{ 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); } /* }}} */ @@ -1284,7 +1296,7 @@ int i; for (i=0; i<result->num_fields; i++) { - if (!strcasecmp(result->fields[i].name,Z_STRVAL_P(field))) { + if (!strcasecmp(result->fields[i].name,Z_STRVAL_PP(field))) { field_offset = i; break; } @@ -1315,17 +1327,16 @@ Get number of affected rows in last query */ PHP_FUNCTION(sybase_affected_rows) { - zval *sybase_link_index = NULL; - sybase_link *sybase_ptr = NULL; - int id = 0; - int type = 0; + zval **sybase_link_index; + sybase_link *sybase_ptr; + int id, type; switch(ZEND_NUM_ARGS()) { case 0: id = php_sybase_module.default_link; break; case 1: - if (zend_get_parameters_ex(ht, 1, &sybase_link_index) == FAILURE) { + if (zend_get_parameters_ex(1, &sybase_link_index) == FAILURE) { RETURN_FALSE; } convert_to_long_ex(sybase_link_index); Index: ext/sybase/php_sybase_db.h =================================================================== RCS file: /repository/php4/ext/sybase/php_sybase_db.h,v retrieving revision 1.9 diff -u -u -r1.9 php_sybase_db.h --- ext/sybase/php_sybase_db.h 31 Dec 2002 16:07:58 -0000 1.9 +++ ext/sybase/php_sybase_db.h 6 Jun 2003 18:06:55 -0000 @@ -42,6 +42,7 @@ PHP_FUNCTION(sybase_num_fields); PHP_FUNCTION(sybase_fetch_row); PHP_FUNCTION(sybase_fetch_array); +PHP_FUNCTION(sybase_fetch_assoc); PHP_FUNCTION(sybase_fetch_object); PHP_FUNCTION(sybase_data_seek); PHP_FUNCTION(sybase_affected_rows); -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php