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

Reply via email to