thekid          Tue Nov 12 08:13:13 2002 EDT

  Modified files:              
    /php4/ext/sybase_ct php_sybase_ct.c 
  Log:
  - Added optional parameter to sybase_fetch_object() (Timm)
  - Changed php_error and zend_error to php_error_docref (Timm)
  - Changed sybase_query() to clean up and free unread results (Timm)
  
  
Index: php4/ext/sybase_ct/php_sybase_ct.c
diff -u php4/ext/sybase_ct/php_sybase_ct.c:1.71 php4/ext/sybase_ct/php_sybase_ct.c:1.72
--- php4/ext/sybase_ct/php_sybase_ct.c:1.71     Tue Nov  5 03:29:57 2002
+++ php4/ext/sybase_ct/php_sybase_ct.c  Tue Nov 12 08:13:12 2002
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_sybase_ct.c,v 1.71 2002/11/05 08:29:57 thekid Exp $ */
+/* $Id: php_sybase_ct.c,v 1.72 2002/11/12 13:13:12 thekid Exp $ */
 
 
 #ifdef HAVE_CONFIG_H
@@ -43,9 +43,9 @@
        PHP_FE(sybase_close,                            NULL)
        PHP_FE(sybase_select_db,                        NULL)
        PHP_FE(sybase_query,                            NULL)
-       PHP_FE(sybase_unbuffered_query,         NULL)
+       PHP_FE(sybase_unbuffered_query,                 NULL)
        PHP_FE(sybase_free_result,                      NULL)
-       PHP_FE(sybase_get_last_message,         NULL)
+       PHP_FE(sybase_get_last_message,                 NULL)
        PHP_FE(sybase_num_rows,                         NULL)
        PHP_FE(sybase_num_fields,                       NULL)
        PHP_FE(sybase_fetch_row,                        NULL)
@@ -54,37 +54,37 @@
        PHP_FE(sybase_fetch_object,                     NULL)
        PHP_FE(sybase_data_seek,                        NULL)
        PHP_FE(sybase_fetch_field,                      NULL)
-       PHP_FE(sybase_field_seek,                  NULL)
+       PHP_FE(sybase_field_seek,                       NULL)
        PHP_FE(sybase_result,                           NULL)
-       PHP_FE(sybase_affected_rows,            NULL)
-       PHP_FE(sybase_min_client_severity,      NULL)
-       PHP_FE(sybase_min_server_severity,      NULL)
-       PHP_FE(sybase_set_message_handler,      NULL)
-       PHP_FE(sybase_deadlock_retry_count, NULL)
+       PHP_FE(sybase_affected_rows,                    NULL)
+       PHP_FE(sybase_min_client_severity,              NULL)
+       PHP_FE(sybase_min_server_severity,              NULL)
+       PHP_FE(sybase_set_message_handler,              NULL)
+       PHP_FE(sybase_deadlock_retry_count,             NULL)
 
-       PHP_FALIAS(mssql_connect,                       sybase_connect,                
 NULL)
+       PHP_FALIAS(mssql_connect,                       sybase_connect,                
+ NULL)
        PHP_FALIAS(mssql_pconnect,                      sybase_pconnect,               
 NULL)
        PHP_FALIAS(mssql_close,                         sybase_close,                  
 NULL)
        PHP_FALIAS(mssql_select_db,                     sybase_select_db,              
 NULL)
        PHP_FALIAS(mssql_query,                         sybase_query,                  
 NULL)
-       PHP_FALIAS(mssql_unbuffered_query,      sybase_unbuffered_query,NULL)
-       PHP_FALIAS(mssql_free_result,           sybase_free_result,             NULL)
-       PHP_FALIAS(mssql_get_last_message,      sybase_get_last_message,NULL)
+       PHP_FALIAS(mssql_unbuffered_query,              sybase_unbuffered_query,       
+ NULL)
+       PHP_FALIAS(mssql_free_result,                   sybase_free_result,            
+ NULL)
+       PHP_FALIAS(mssql_get_last_message,              sybase_get_last_message,       
+ NULL)
        PHP_FALIAS(mssql_num_rows,                      sybase_num_rows,               
 NULL)
-       PHP_FALIAS(mssql_num_fields,            sybase_num_fields,              NULL)
+       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_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)
-       PHP_FALIAS(mssql_field_seek,            sybase_field_seek,              NULL)
+       PHP_FALIAS(mssql_fetch_field,                   sybase_fetch_field,            
+ NULL)
+       PHP_FALIAS(mssql_field_seek,                    sybase_field_seek,             
+ NULL)
        PHP_FALIAS(mssql_result,                        sybase_result,                 
 NULL)
-       PHP_FALIAS(mssql_affected_rows,         sybase_affected_rows,   NULL)
-       PHP_FALIAS(mssql_min_client_severity,   sybase_min_client_severity,     NULL)
-       PHP_FALIAS(mssql_min_server_severity,   sybase_min_server_severity,     NULL)
-       PHP_FALIAS(mssql_set_message_handler,   sybase_set_message_handler,     NULL)
-       PHP_FALIAS(mssql_deadlock_retry_count,  sybase_deadlock_retry_count, NULL)
+       PHP_FALIAS(mssql_affected_rows,                 sybase_affected_rows,          
+ NULL)
+       PHP_FALIAS(mssql_min_client_severity,           sybase_min_client_severity,    
+ NULL)
+       PHP_FALIAS(mssql_min_server_severity,           sybase_min_server_severity,    
+ NULL)
+       PHP_FALIAS(mssql_set_message_handler,           sybase_set_message_handler,    
+ NULL)
+       PHP_FALIAS(mssql_deadlock_retry_count,          sybase_deadlock_retry_count,   
+ NULL)
        {NULL, NULL, NULL}
 };
 
@@ -102,7 +102,7 @@
 
 ZEND_DECLARE_MODULE_GLOBALS(sybase)
 
-#define CHECK_LINK(link) { if (link==-1) { php_error(E_WARNING, "Sybase:  A link to 
the server could not be established"); RETURN_FALSE; } }
+#define CHECK_LINK(link) { if (link==-1) { php_error_docref(NULL TSRMLS_CC, 
+E_WARNING, "Sybase:  A link to the server could not be established"); RETURN_FALSE; } 
+}
 
 
 static int _clean_invalid_results(list_entry *le TSRMLS_DC)
@@ -165,7 +165,7 @@
         */
        if (ct_con_props(sybase_ptr->connection, CS_GET, CS_CON_STATUS,
                                         &con_status, CS_UNUSED, NULL)!=CS_SUCCEED) {
-               php_error(E_WARNING, "Sybase:  Unable to get connection status on 
close");
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Unable to get 
+connection status on close");
                /* Assume the worst. */
                con_status = CS_CONSTAT_CONNECTED | CS_CONSTAT_DEAD;
        }
@@ -191,7 +191,7 @@
         */
        if (ct_con_props(sybase_ptr->connection, CS_GET, CS_CON_STATUS,
                                         &con_status, CS_UNUSED, NULL)!=CS_SUCCEED) {
-               php_error(E_WARNING, "Sybase:  Unable to get connection status on 
close");
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Unable to get 
+connection status on close");
                /* Assume the worst. */
                con_status = CS_CONSTAT_CONNECTED | CS_CONSTAT_DEAD;
        }
@@ -213,7 +213,7 @@
        TSRMLS_FETCH();
 
        if (CS_SEVERITY(errmsg->msgnumber) >= SybCtG(min_client_severity)) {
-               php_error(E_WARNING, "Sybase:  Client message:  %s (severity %d)", 
errmsg->msgstring, CS_SEVERITY(errmsg->msgnumber));
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Client message:  
+%s (severity %d)", errmsg->msgstring, CS_SEVERITY(errmsg->msgnumber));
        }
        STR_FREE(SybCtG(server_message));
        SybCtG(server_message) = estrdup(errmsg->msgstring);
@@ -259,7 +259,7 @@
                        ZVAL_STRING(&text, srvmsg->text, 0);
                        
                        if (call_user_function_ex(EG(function_table), NULL, 
SybCtG(callback_name), &retval, 5, args, 0, NULL TSRMLS_CC)== FAILURE) {
-                               php_error(E_WARNING, "Sybase:  Cannot call the 
messagehandler %s", Z_STRVAL_P(SybCtG(callback_name)));
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  
+Cannot call the messagehandler %s", Z_STRVAL_P(SybCtG(callback_name)));
                        }
                        if (retval) {
                                handled= ((Z_TYPE_P(retval) != IS_BOOL) || 
(Z_BVAL_P(retval) != 0));
@@ -268,7 +268,7 @@
                }
 
                if (!handled) {
-                       php_error(E_WARNING, "Sybase:  Server message:  %s (severity 
%d, procedure %s)",
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Server 
+message:  %s (severity %d, procedure %s)",
                                        srvmsg->text, srvmsg->severity, 
((srvmsg->proclen>0) ? srvmsg->proc : "N/A"));
                }
        }
@@ -314,11 +314,11 @@
 
        /* Initialize message handlers */
        if (ct_callback(sybase_globals->context, NULL, CS_SET, CS_SERVERMSG_CB, 
(CS_VOID *)_server_message_handler)!=CS_SUCCEED) {
-               php_error(E_WARNING, "Sybase:  Unable to set server message handler");
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Unable to set 
+server message handler");
        }
 
        if (ct_callback(sybase_globals->context, NULL, CS_SET, CS_CLIENTMSG_CB, 
(CS_VOID *)_client_message_handler)!=CS_SUCCEED) {
-               php_error(E_WARNING, "Sybase:  Unable to set client message handler");
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Unable to set 
+client message handler");
        }
 
        /* Set datetime conversion format to "Nov  3 1998  8:06PM".
@@ -330,7 +330,7 @@
        {
                CS_INT dt_convfmt = CS_DATES_SHORT;
                if (cs_dt_info(sybase_globals->context, CS_SET, NULL, CS_DT_CONVFMT, 
CS_UNUSED, &dt_convfmt, sizeof(dt_convfmt), NULL)!=CS_SUCCEED) {
-                       php_error(E_WARNING, "Sybase:  Unable to set datetime 
conversion format");
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Unable 
+to set datetime conversion format");
                }
        }
 
@@ -346,13 +346,13 @@
        if (cfg_get_long("sybct.login_timeout", &timeout)==SUCCESS) {
                CS_INT cs_login_timeout = timeout;
                if (ct_config(sybase_globals->context, CS_SET, CS_LOGIN_TIMEOUT, 
&cs_login_timeout, CS_UNUSED, NULL)!=CS_SUCCEED) {
-                       php_error(E_WARNING, "Sybase:  Unable to set login timeoutt");
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Unable 
+to set login timeout");
                }
        }
        if (cfg_get_long("sybct.timeout", &timeout)==SUCCESS) {
                CS_INT cs_timeout = timeout;
                if (ct_config(sybase_globals->context, CS_SET, CS_TIMEOUT, 
&cs_timeout, CS_UNUSED, NULL)!=CS_SUCCEED) {
-                       php_error(E_WARNING, "Sybase:  Unable to set timeout");
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Unable 
+to set timeout");
                }
        }
        sybase_globals->num_persistent=0;
@@ -422,13 +422,13 @@
 
        /* set a CS_CONNECTION record */
        if (ct_con_alloc(SybCtG(context), &sybase->connection)!=CS_SUCCEED) {
-               php_error(E_WARNING, "Sybase:  Unable to allocate connection record");
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Unable to 
+allocate connection record");
                return 0;
        }
 
        /* Note - this saves a copy of sybase, not a pointer to it. */
        if (ct_con_props(sybase->connection, CS_SET, CS_USERDATA, &sybase, 
CS_SIZEOF(sybase), NULL)!=CS_SUCCEED) {
-               php_error(E_WARNING, "Sybase:  Unable to set userdata");
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Unable to set 
+userdata");
                ct_con_drop(sybase->connection);
                return 0;
        }
@@ -451,16 +451,16 @@
 
        if (charset) {
                if (cs_loc_alloc(SybCtG(context), &tmp_locale)!=CS_SUCCEED) {
-                       php_error(E_WARNING, "Sybase: Unable to allocate locale 
information.");
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: Unable to 
+allocate locale information.");
                } else {
                        if (cs_locale(SybCtG(context), CS_SET, tmp_locale, CS_LC_ALL, 
NULL, CS_NULLTERM, NULL)!=CS_SUCCEED) {
-                               php_error(E_WARNING, "Sybase: Unable to load default 
locale data.");
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: 
+Unable to load default locale data.");
                        } else {
                                if (cs_locale(SybCtG(context), CS_SET, tmp_locale, 
CS_SYB_CHARSET, charset, CS_NULLTERM, NULL)!=CS_SUCCEED) {
-                                       php_error(E_WARNING, "Sybase: Unable to update 
character set.");
+                                       php_error_docref(NULL TSRMLS_CC, E_WARNING, 
+"Sybase: Unable to update character set.");
                                } else {
                                        if (ct_con_props(sybase->connection, CS_SET, 
CS_LOC_PROP, tmp_locale, CS_UNUSED, NULL)!=CS_SUCCEED) {
-                                               php_error(E_WARNING, "Sybase: Unable 
to update connection properties.");
+                                               php_error_docref(NULL TSRMLS_CC, 
+E_WARNING, "Sybase: Unable to update connection properties.");
                                        }
                                }
                        }
@@ -473,13 +473,13 @@
 
        /* create the link */
        if (ct_connect(sybase->connection, host, CS_NULLTERM)!=CS_SUCCEED) {
-               php_error(E_WARNING, "Sybase:  Unable to connect");
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Unable to 
+connect");
                ct_con_drop(sybase->connection);
                return 0;
        }
 
        if (ct_cmd_alloc(sybase->connection, &sybase->cmd)!=CS_SUCCEED) {
-               php_error(E_WARNING, "Sybase:  Unable to allocate command record");
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Unable to 
+allocate command record");
                ct_close(sybase->connection, CS_UNUSED);
                ct_con_drop(sybase->connection);
                return 0;
@@ -609,12 +609,12 @@
                        list_entry new_le;
 
                        if (SybCtG(max_links)!=-1 && 
SybCtG(num_links)>=SybCtG(max_links)) {
-                               php_error(E_WARNING, "Sybase:  Too many open links 
(%d)", SybCtG(num_links));
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  
+Too many open links (%d)", SybCtG(num_links));
                                efree(hashed_details);
                                RETURN_FALSE;
                        }
                        if (SybCtG(max_persistent)!=-1 && 
SybCtG(num_persistent)>=SybCtG(max_persistent)) {
-                               php_error(E_WARNING, "Sybase:  Too many open 
persistent links (%d)", SybCtG(num_persistent));
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  
+Too many open persistent links (%d)", SybCtG(num_persistent));
                                efree(hashed_details);
                                RETURN_FALSE;
                        }
@@ -652,7 +652,7 @@
 
                        if (ct_con_props(sybase_ptr->connection, CS_GET, CS_CON_STATUS,
                                                         &con_status, CS_UNUSED, 
NULL)!=CS_SUCCEED) {
-                               php_error(E_WARNING, "Sybase:  Unable to get 
connection status");
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  
+Unable to get connection status");
                                efree(hashed_details);
                                RETURN_FALSE;
                        }
@@ -712,7 +712,7 @@
                        }
                }
                if (SybCtG(max_links)!=-1 && SybCtG(num_links)>=SybCtG(max_links)) {
-                       php_error(E_WARNING, "Sybase:  Too many open links (%d)", 
SybCtG(num_links));
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Too many 
+open links (%d)", SybCtG(num_links));
                        efree(hashed_details);
                        RETURN_FALSE;
                }
@@ -951,6 +951,9 @@
        }
        efree(result->tmp_buffer);
 
+       /* Indicate we have read all rows */
+       result->sybase_ptr->active_result_index= 0;
+
        /* The only restype we should get now is CS_CMD_DONE, possibly
         * followed by a CS_STATUS_RESULT/CS_CMD_SUCCEED/CS_CMD_DONE
         * sequence if the command was a stored procedure call.  But we
@@ -975,10 +978,12 @@
                        case CS_ROW_RESULT:
                                /* Unexpected results, cancel them. */
                        case CS_STATUS_RESULT:
+                               php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Sybase:  
+Unexpected results, cancelling current");
                                ct_cancel(NULL, result->sybase_ptr->cmd, 
CS_CANCEL_CURRENT);
                                break;
 
                        default:
+                               php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Sybase:  
+Unexpected results, cancelling all");
                                ct_cancel(NULL, result->sybase_ptr->cmd, 
CS_CANCEL_ALL);
                                break;
                }
@@ -1008,9 +1013,6 @@
                        result = NULL;
                        break;
        }
-       
-       /* Indicate we have read all rows */
-       result->sybase_ptr->active_result_index= 0;
 }
 
 static int php_sybase_fetch_result_row (sybase_result *result, int numrows) 
@@ -1028,7 +1030,7 @@
                        || retcode==CS_ROW_FAIL) {
                /*
                if (retcode==CS_ROW_FAIL) {
-                       php_error(E_WARNING, "Sybase:  Error reading row %d", 
result->num_rows);
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Error 
+reading row %d", result->num_rows);
                }
                */
                
@@ -1257,11 +1259,24 @@
        
        /* Check to see if a previous sybase_unbuffered_query has read all rows */
        if (sybase_ptr->active_result_index) {
-               zend_error(E_NOTICE, "Sybase:  Called %s() without first fetching all 
rows from a previous unbuffered query",
+               zval *tmp;
+               
+               php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Sybase:  Called %s() 
+without first fetching all rows from a previous unbuffered query",
                        get_active_function_name(TSRMLS_C));
                if (sybase_ptr->cmd) {
                        ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL);
                }
+               
+               /* Get the resultset and free it */
+               ALLOC_ZVAL(tmp);
+               Z_LVAL_P(tmp)= sybase_ptr->active_result_index;
+               Z_TYPE_P(tmp)= IS_RESOURCE;
+               INIT_PZVAL(tmp);
+               ZEND_FETCH_RESOURCE(result, sybase_result *, &tmp, -1, "Sybase 
+result", le_result);
+               if (result) {
+                       php_sybase_finish_results(result);
+               }
+               zval_dtor(tmp);
                zend_list_delete(sybase_ptr->active_result_index);
                sybase_ptr->active_result_index= 0;
        }
@@ -1284,14 +1299,14 @@
                         * CS_BUSY for some reason.
                         */
                        sybase_ptr->dead = 1;
-                       zend_error(E_WARNING, "Sybase:  Connection is dead");
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  
+Connection is dead");
                        RETURN_FALSE;
                }
 
                if (ct_send(sybase_ptr->cmd)!=CS_SUCCEED) {
                        ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL);
                        sybase_ptr->dead = 1;
-                       zend_error(E_WARNING, "Sybase:  Cannot send command");
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Cannot 
+send command");
                        RETURN_FALSE;
                }
 
@@ -1304,7 +1319,7 @@
                if (ct_results(sybase_ptr->cmd, &restype)!=CS_SUCCEED) {
                        ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL);
                        sybase_ptr->dead = 1;
-                       zend_error(E_WARNING, "Sybase:  Cannot read results");
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Cannot 
+read results");
                        RETURN_FALSE;
                }
     
@@ -1399,7 +1414,7 @@
                
                /* Retry deadlocks up until deadlock_retry_count times */              
 
                if (sybase_ptr->deadlock && SybCtG(deadlock_retry_count) != -1 && 
++deadlock_count > SybCtG(deadlock_retry_count)) {
-                       zend_error(E_WARNING, "Sybase:  Retried deadlock %d times 
[max: %d], giving up\n", deadlock_count- 1, SybCtG(deadlock_retry_count));
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Retried 
+deadlock %d times [max: %d], giving up\n", deadlock_count- 1, 
+SybCtG(deadlock_retry_count));
                        if (result != NULL) {
                                _free_sybase_result(result);
                        }
@@ -1478,7 +1493,7 @@
        
        /* Did we fetch up until the end? */
        if (result->last_retcode != CS_END_DATA) {
-               /* zend_error(E_WARNING, "Sybase:  Cancelling the rest of the 
results\n"); */
+               /* php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Cancelling 
+the rest of the results\n"); */
                ct_cancel(NULL, result->sybase_ptr->cmd, CS_CANCEL_ALL);
                php_sybase_finish_results(result);
        }
@@ -1557,7 +1572,6 @@
        
        /* At the end? */
        if (result->cur_row >= result->num_rows) {
-           result->sybase_ptr->active_result_index= 0;
                RETURN_FALSE;
        }
 
@@ -1595,7 +1609,6 @@
 
        /* At the end? */
        if (result->cur_row >= result->num_rows) {
-           result->sybase_ptr->active_result_index= 0;
                RETURN_FALSE;
        }
 
@@ -1629,13 +1642,45 @@
 }
 
 
-/* {{{ proto object sybase_fetch_object(int result)
+/* {{{ proto object sybase_fetch_object(int result [, mixed object])
    Fetch row as object */
 PHP_FUNCTION(sybase_fetch_object)
 {
+       zval **object= NULL;
+       zval *sybase_result_index;
+       zend_class_entry *ce= NULL;
+       
+       /* Was a second parameter given? */
+       if (2 == ZEND_NUM_ARGS()) {
+               if (zend_get_parameters_ex(2, &sybase_result_index, &object) == 
+FAILURE) {
+                       WRONG_PARAM_COUNT;
+               }
+               
+               switch (Z_TYPE_PP(object)) {
+                       case IS_OBJECT:
+                               ce= Z_OBJCE_PP(object);
+                               break;
+                       default:
+                               convert_to_string_ex(object);
+                               zend_str_tolower(Z_STRVAL_PP(object), 
+Z_STRLEN_PP(object));
+                               zend_hash_find(EG(class_table), Z_STRVAL_PP(object), 
+Z_STRLEN_PP(object)+1, (void **)&ce);
+
+                               if (!ce) {
+                                       php_error_docref(NULL TSRMLS_CC, E_NOTICE, 
+"Sybase:  Class %s has not been declared", Z_STRVAL_PP(object));
+                                       ce= ZEND_STANDARD_CLASS_DEF_PTR;
+                               }
+               }
+               
+               ht= 1;
+       }
+       
        php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
        if (Z_TYPE_P(return_value)==IS_ARRAY) {
-               object_and_properties_init(return_value, ZEND_STANDARD_CLASS_DEF_PTR, 
Z_ARRVAL_P(return_value));
+               object_and_properties_init(
+                       return_value, 
+                       object ? ce : ZEND_STANDARD_CLASS_DEF_PTR, 
+                       Z_ARRVAL_P(return_value)
+               );
        }
 }
 /* }}} */
@@ -1678,7 +1723,7 @@
        }
        
        if (Z_LVAL_P(offset)<0 || Z_LVAL_P(offset)>=result->num_rows) {
-               php_error(E_WARNING, "Sybase:  Bad row offset");
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Bad row offset");
                RETURN_FALSE;
        }
 
@@ -1767,7 +1812,7 @@
 
        if (field_offset<0 || field_offset >= result->num_fields) {
                if (ZEND_NUM_ARGS()==2) { /* field specified explicitly */
-                       php_error(E_WARNING, "Sybase:  Bad column offset");
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Bad 
+column offset");
                }
                RETURN_FALSE;
        }
@@ -1807,7 +1852,7 @@
        }
 
        if (field_offset<0 || field_offset >= result->num_fields) {
-               php_error(E_WARNING, "Sybase:  Bad column offset");
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Bad column 
+offset");
                RETURN_FALSE;
        }
 
@@ -1834,9 +1879,13 @@
 
        convert_to_long(row);
        
+       /* Unbuffered ? */
+       if (result->last_retcode != CS_END_DATA && Z_LVAL_P(row)>=result->num_rows) {
+               php_sybase_fetch_result_row(result, Z_LVAL_P(row));
+       }
 
        if (Z_LVAL_P(row)<0 || Z_LVAL_P(row)>=result->num_rows) {
-               php_error(E_WARNING, "Sybase:  Bad row offset (%d)", Z_LVAL_P(row));
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Bad row offset 
+(%d)", Z_LVAL_P(row));
                RETURN_FALSE;
        }
 
@@ -1851,7 +1900,7 @@
                                }
                        }
                        if (i>=result->num_fields) { /* no match found */
-                               php_error(E_WARNING, "Sybase:  %s field not found in 
result", Z_STRVAL_P(field));
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  
+%s field not found in result", Z_STRVAL_P(field));
                                RETURN_FALSE;
                        }
                        break;
@@ -1860,7 +1909,7 @@
                        convert_to_long(field);
                        field_offset = Z_LVAL_P(field);
                        if (field_offset<0 || field_offset>=result->num_fields) {
-                               php_error(E_WARNING, "Sybase:  Bad column offset 
specified");
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  
+Bad column offset specified");
                                RETURN_FALSE;
                        }
                        break;
@@ -1997,11 +2046,12 @@
        }
        
        if (Z_TYPE_PP(params[0]) == IS_NULL) {
+               efree(params);
                RETURN_TRUE;
        }
 
        if (!zend_is_callable(*params[0], 0, &name)) {
-               zend_error(E_WARNING, "%s(): First argumented is expected to be a 
valid callback, '%s' was given", get_active_function_name(TSRMLS_C), name);
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s(): First argumented is 
+expected to be a valid callback, '%s' was given", get_active_function_name(TSRMLS_C), 
+name);
                efree(name);
                efree(params);
                RETURN_FALSE;

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to