]> granicus.if.org Git - php/commitdiff
- After readying Johannes's mail, the conclusion that a "smarter" system
authorDavid Coallier <davidc@php.net>
Mon, 10 Nov 2008 18:47:28 +0000 (18:47 +0000)
committerDavid Coallier <davidc@php.net>
Mon, 10 Nov 2008 18:47:28 +0000 (18:47 +0000)
  to find out if the return_value had the correct number of elements was
  definitely needed. Simply added a difference to both dbh and stmt to
  make sure that the error info always has 3 elements.

- Bug #44154 (pdo->errorInfo doesn't always return three elements)
- Now pdo->errorInfo() AND stmt->errorInfo() return three elements.

- [DOC] Make sure that not only the pdo->errorInfo() is returning 3 elms, but
  also the PDOStatement object

ext/pdo/pdo_dbh.c
ext/pdo/pdo_stmt.c

index e071ca8958d04ae8922b92f3811959b40e77d7b7..d8b433f7058956462d728e478f769af501757fd8 100755 (executable)
@@ -987,7 +987,10 @@ static PHP_METHOD(PDO, errorCode)
                RETURN_NULL();
        }
 
-       // Then we get back to the default fallback
+       /**
+        * Making sure that we fallback to the default implementation
+        * if the dbh->error_code is not null.
+        */
        RETURN_STRING(dbh->error_code, 1);
 }
 /* }}} */
@@ -996,11 +999,16 @@ static PHP_METHOD(PDO, errorCode)
    Fetch extended error information associated with the last operation on the database handle */
 static PHP_METHOD(PDO, errorInfo)
 {
+       int error_count;
+       int error_count_diff     = 0;
+       int error_expected_count = 3;
+
        pdo_dbh_t *dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
 
        if (zend_parse_parameters_none() == FAILURE) {
                return;
        }
+
        PDO_CONSTRUCT_CHECK;
 
        array_init(return_value);
@@ -1009,12 +1017,27 @@ static PHP_METHOD(PDO, errorInfo)
                add_next_index_string(return_value, dbh->query_stmt->error_code, 1);
        } else {
                add_next_index_string(return_value, dbh->error_code, 1);
-               add_next_index_null(return_value);
-               add_next_index_null(return_value);
        }
+
        if (dbh->methods->fetch_err) {
                dbh->methods->fetch_err(dbh, dbh->query_stmt, return_value TSRMLS_CC);
        }
+       
+       /**
+        * In order to be consistent, we have to make sure we add the good amount
+        * of nulls depending on the current number of elements. We make a simple
+        * difference and add the needed elements
+        */
+       error_count = zend_hash_num_elements(Z_ARRVAL_P(return_value));
+
+       if (error_expected_count > error_count) {
+               error_count_diff = error_expected_count - error_count;
+
+               int current_index;
+               for (current_index = 0; current_index < error_count_diff; current_index++) {
+                       add_next_index_null(return_value);
+               }
+       }
 }
 /* }}} */
 
index 27cb65c2d17d0f9cf0944de1609b1197d6df47ff..a7804499823791e44806ab84736b281471884bf4 100755 (executable)
@@ -1778,6 +1778,10 @@ static PHP_METHOD(PDOStatement, errorCode)
                return;
        }
 
+       if (stmt->error_code[0] == '\0') {
+               RETURN_NULL();
+       }
+
        RETURN_STRING(stmt->error_code, 1);
 }
 /* }}} */
@@ -1786,6 +1790,10 @@ static PHP_METHOD(PDOStatement, errorCode)
    Fetch extended error information associated with the last operation on the statement handle */
 static PHP_METHOD(PDOStatement, errorInfo)
 {
+       int error_count;
+       int error_count_diff     = 0;
+       int error_expected_count = 3;
+
        PHP_STMT_GET_OBJ;
 
        if (zend_parse_parameters_none() == FAILURE) {
@@ -1798,6 +1806,17 @@ static PHP_METHOD(PDOStatement, errorInfo)
        if (stmt->dbh->methods->fetch_err) {
                stmt->dbh->methods->fetch_err(stmt->dbh, stmt, return_value TSRMLS_CC);
        }
+
+       error_count = zend_hash_num_elements(Z_ARRVAL_P(return_value));
+
+       if (error_expected_count > error_count) {
+               error_count_diff = error_expected_count - error_count;
+               
+               int current_index;
+               for (current_index = 0; current_index < error_count_diff; current_index++) {
+                       add_next_index_null(return_value);
+               }
+       }
 }
 /* }}} */