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
dave@codewhore.org
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);