]> granicus.if.org Git - php/commitdiff
- Fixed bug #26407 (Result set fetching broken around transactions)
authorTimm Friebe <thekid@php.net>
Sun, 15 Feb 2004 10:53:45 +0000 (10:53 +0000)
committerTimm Friebe <thekid@php.net>
Sun, 15 Feb 2004 10:53:45 +0000 (10:53 +0000)
ext/sybase_ct/php_sybase_ct.c

index d078075176bd31a2a6ae1dc2a9557db54774a610..3f866e854b66549e2a8227255970f5ad19506207 100644 (file)
@@ -1091,8 +1091,8 @@ static int php_sybase_fetch_result_row (sybase_result *result, int numrows)
        CS_INT retcode;
        
        /* We've already fetched everything */
-       if (result->last_retcode == CS_END_DATA) {
-               return CS_END_DATA;
+       if (result->last_retcode == CS_END_DATA || result->last_retcode == CS_END_RESULTS) {
+               return result->last_retcode;
        }
        
        if (numrows!=-1) numrows+= result->num_rows;
@@ -1143,7 +1143,6 @@ static int php_sybase_fetch_result_row (sybase_result *result, int numrows)
        }
        
        result->last_retcode= retcode;
-       
        switch (retcode) {
                case CS_END_DATA:
                        retcode = php_sybase_finish_results(result);
@@ -1278,12 +1277,13 @@ static sybase_result * php_sybase_fetch_result_set (sybase_link *sybase_ptr, int
                result->fields[i].numeric = result->numerics[i];
                Z_TYPE(result->fields[i]) = result->types[i];
        }
-
+       
        retcode= php_sybase_fetch_result_row(result, buffered ? 1 : -1);
        if (retcode == CS_FAIL) {
                return NULL;
        }
 
+       result->last_retcode = retcode;
        return result;
 }
 
@@ -1412,7 +1412,6 @@ static void php_sybase_query (INTERNAL_FUNCTION_PARAMETERS, int buffered)
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Cannot read results");
                        RETURN_FALSE;
                }
-
                switch ((int) restype) {
                        case CS_CMD_FAIL:
                        default:
@@ -1471,6 +1470,7 @@ static void php_sybase_query (INTERNAL_FUNCTION_PARAMETERS, int buffered)
                                                                RETURN_FALSE;
                                                        }
                                                        status = Q_RESULT;
+                                                       retcode = result->last_retcode; 
                                                } else {
                                                        /* Unexpected results, cancel them. */
                                                        ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_CURRENT);
@@ -1488,8 +1488,10 @@ static void php_sybase_query (INTERNAL_FUNCTION_PARAMETERS, int buffered)
                                if (status == Q_FAILURE) {
                                        ct_cancel(NULL, sybase_ptr->cmd, CS_CANCEL_ALL);
                                }
+                               if (retcode == CS_END_RESULTS) {
+                                       break;
+                               }
                        }
-
                        switch (retcode) {
                                case CS_END_RESULTS:
                                        /* Normal. */
@@ -1513,7 +1515,7 @@ static void php_sybase_query (INTERNAL_FUNCTION_PARAMETERS, int buffered)
                                        break;
                        }
                }
-               
+
                /* Retry deadlocks up until deadlock_retry_count times */               
                if (sybase_ptr->deadlock && SybCtG(deadlock_retry_count) != -1 && ++deadlock_count > SybCtG(deadlock_retry_count)) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase:  Retried deadlock %d times [max: %ld], giving up\n", deadlock_count- 1, SybCtG(deadlock_retry_count));
@@ -1667,7 +1669,7 @@ PHP_FUNCTION(sybase_fetch_row)
        ZEND_FETCH_RESOURCE(result, sybase_result *, sybase_result_index, -1, "Sybase result", le_result);
 
        /* Unbuffered? */
-       if (result->last_retcode != CS_END_DATA) {
+       if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS) {
                php_sybase_fetch_result_row(result, 1);
        }
        
@@ -1704,7 +1706,7 @@ static void php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int numerics)
        ZEND_FETCH_RESOURCE(result, sybase_result *, sybase_result_index, -1, "Sybase result", le_result);
 
        /* Unbuffered ? Fetch next row */
-       if (result->last_retcode != CS_END_DATA) {
+       if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS) {
                php_sybase_fetch_result_row(result, 1);
        }
 
@@ -1817,7 +1819,7 @@ PHP_FUNCTION(sybase_data_seek)
        convert_to_long_ex(offset);
 
        /* Unbuffered ? */
-       if (result->last_retcode != CS_END_DATA && Z_LVAL_PP(offset)>=result->num_rows) {
+       if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS && Z_LVAL_PP(offset)>=result->num_rows) {
                php_sybase_fetch_result_row(result, Z_LVAL_PP(offset));
        }
        
@@ -1945,7 +1947,7 @@ PHP_FUNCTION(sybase_field_seek)
        field_offset = Z_LVAL_PP(offset);
        
        /* Unbuffered ? */
-       if (result->last_retcode != CS_END_DATA && field_offset>=result->num_rows) {
+       if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS && field_offset>=result->num_rows) {
                php_sybase_fetch_result_row(result, field_offset);
        }
 
@@ -1978,7 +1980,7 @@ PHP_FUNCTION(sybase_result)
        convert_to_long_ex(row);
        
        /* Unbuffered ? */
-       if (result->last_retcode != CS_END_DATA && Z_LVAL_PP(row) >= result->num_rows) {
+       if (result->last_retcode != CS_END_DATA && result->last_retcode != CS_END_RESULTS && Z_LVAL_PP(row) >= result->num_rows) {
                php_sybase_fetch_result_row(result, Z_LVAL_PP(row));
        }