public function setUp()
 {
     if (defined('SKIPPING')) {
         $this->markTestSkipped();
     }
     fResult::silenceNotices();
     //self::$db->enableDebugging(TRUE);
     $this->rollback_statements = array();
 }
Пример #2
0
 /**
  * Sets the number of rows returned by the query
  * 
  * @param  fResult $result  The result object for the query
  * @return void
  */
 private function setReturnedRows($result)
 {
     if (is_resource($result->getResult()) || is_object($result->getResult())) {
         if ($this->extension == 'mssql') {
             $result->setReturnedRows(mssql_num_rows($result->getResult()));
         } elseif ($this->extension == 'mysql') {
             $result->setReturnedRows(mysql_num_rows($result->getResult()));
         } elseif ($this->extension == 'mysqli') {
             $result->setReturnedRows(mysqli_num_rows($result->getResult()));
         } elseif ($this->extension == 'pgsql') {
             $result->setReturnedRows(pg_num_rows($result->getResult()));
         } elseif ($this->extension == 'sqlite') {
             $result->setReturnedRows(sqlite_num_rows($result->getResult()));
         }
     } elseif (is_array($result->getResult())) {
         $result->setReturnedRows(sizeof($result->getResult()));
     }
 }
Пример #3
0
 /**
  * Turns off notices about broken database extensions much as the MSSQL DBLib driver
  * 
  * @return void
  */
 public static function silenceNotices()
 {
     self::$silence_notices = TRUE;
 }
Пример #4
0
 /**
  * Executes the statement in buffered mode
  * 
  * @internal
  * 
  * @param  fResult $result     The object to place the result into
  * @param  array   $params     The parameters for the statement
  * @param  mixed   &$extra     A variable to place extra information needed by some database extensions
  * @param  boolean $different  If this statement is different than the last statement run on the fDatabase instance
  * @return void
  */
 public function executeQuery($result, $params, &$extra, $different)
 {
     if ($different && $this->used) {
         $this->regenerateStatement();
     }
     $this->used = TRUE;
     $extension = $this->database->getExtension();
     $connection = $this->database->getConnection();
     $statement = $this->statement;
     $params = $this->prepareParams($params);
     switch ($extension) {
         case 'ibm_db2':
             $extra = $statement;
             if (db2_execute($statement, $params)) {
                 $rows = array();
                 while ($row = db2_fetch_assoc($statement)) {
                     $rows[] = $row;
                 }
                 $result->setResult($rows);
                 unset($rows);
             } else {
                 $result->setResult(FALSE);
             }
             break;
         case 'mssql':
             $result->setResult(mssql_query($this->database->escape($statement, $params), $connection));
             break;
         case 'mysql':
             $result->setResult(mysql_query($this->database->escape($statement, $params), $connection));
             break;
         case 'mysqli':
             $extra = $this->statement;
             if ($statement->execute()) {
                 $rows = array();
                 $meta = $statement->result_metadata();
                 if ($meta) {
                     $row_references = array();
                     while ($field = $meta->fetch_field()) {
                         $row_references[] =& $row[$field->name];
                     }
                     call_user_func_array(array($statement, 'bind_result'), $row_references);
                     while ($statement->fetch()) {
                         $copied_row = array();
                         foreach ($row as $key => $val) {
                             $copied_row[$key] = $val;
                         }
                         $rows[] = $copied_row;
                     }
                 }
                 $result->setResult($rows);
                 $statement->free_result();
             } else {
                 $result->setResult(FALSE);
             }
             break;
         case 'oci8':
             $extra = $this->statement;
             if (oci_execute($extra, $this->database->isInsideTransaction() ? OCI_DEFAULT : OCI_COMMIT_ON_SUCCESS)) {
                 oci_fetch_all($extra, $rows, 0, -1, OCI_FETCHSTATEMENT_BY_ROW + OCI_ASSOC);
                 $result->setResult($rows);
                 unset($rows);
             } else {
                 $result->setResult(FALSE);
             }
             break;
         case 'odbc':
             $extra = $this->statement;
             if (odbc_execute($statement, $params)) {
                 $rows = array();
                 // Allow up to 1MB of binary data
                 odbc_longreadlen($statement, 1048576);
                 odbc_binmode($statement, ODBC_BINMODE_CONVERT);
                 while ($row = odbc_fetch_array($statement)) {
                     $rows[] = $row;
                 }
                 $result->setResult($rows);
                 unset($rows);
             } else {
                 $result->setResult(FALSE);
             }
             break;
         case 'pgsql':
             $result->setResult(pg_execute($connection, $this->identifier, $params));
             break;
         case 'sqlite':
             $result->setResult(sqlite_query($connection, $this->database->escape($statement, $params), SQLITE_ASSOC, $extra));
             break;
         case 'sqlsrv':
             $extra = $statement;
             if (sqlsrv_execute($statement)) {
                 $rows = array();
                 while ($row = sqlsrv_fetch_array($statement, SQLSRV_FETCH_ASSOC)) {
                     $rows[] = $row;
                 }
                 $result->setResult($rows);
                 unset($rows);
             } else {
                 $result->setResult(FALSE);
             }
             break;
         case 'pdo':
             $extra = $this->statement;
             if (preg_match('#^\\s*CREATE(\\s+OR\\s+REPLACE)?\\s+TRIGGER#i', $result->getSQL())) {
                 $extra->execute();
                 $returned_rows = array();
             } else {
                 if (!$extra->execute()) {
                     $returned_rows = FALSE;
                 } else {
                     $returned_rows = $extra->fetchAll(PDO::FETCH_ASSOC);
                     // The pdo_pgsql driver likes to return empty rows equal to the number of affected rows for insert and deletes
                     if ($this->database->getType() == 'postgresql' && $returned_rows && $returned_rows[0] == array()) {
                         $returned_rows = array();
                     }
                 }
             }
             $result->setResult($returned_rows);
             break;
     }
     return $result;
 }
Пример #5
0
 public function loadFromQuery(fResult $result)
 {
     try {
         $result->tossIfNoRows();
     } catch (fNoRowsException $e) {
         throw new sfNotFoundException();
     }
     $result = $result->asObjects();
     $this->loadFromObject($result->fetchRow());
     return $this;
 }
Пример #6
0
 /**
  * Executes the statement in buffered mode
  * 
  * @internal
  * 
  * @param  fResult $result     The object to place the result into
  * @param  array   $params     The parameters for the statement
  * @param  mixed   &$extra     A variable to place extra information needed by some database extensions
  * @param  boolean $different  If this statement is different than the last statement run on the fDatabase instance
  * @return void
  */
 public function executeQuery($result, $params, &$extra, $different)
 {
     if (is_array($params) && count($params) == 1 && is_array($params[0]) && count($this->placeholders) > 1) {
         $params = $params[0];
     }
     if ($different && $this->used) {
         $this->regenerateStatement();
     }
     $this->used = TRUE;
     $extension = $this->database->getExtension();
     if ($extension == 'pdo' && $this->database->getType() == 'mssql') {
         $extension = 'pdo_dblib';
     }
     $connection = $this->database->getConnection();
     $statement = $this->statement;
     $params = $this->prepareParams($params);
     switch ($extension) {
         case 'ibm_db2':
             $extra = $statement;
             if (db2_execute($statement, $params)) {
                 $rows = array();
                 while ($row = db2_fetch_assoc($statement)) {
                     $rows[] = $row;
                 }
                 $result->setResult($rows);
                 unset($rows);
             } else {
                 $result->setResult(FALSE);
             }
             break;
         case 'mssql':
             $result->setResult(mssql_query($this->database->escape($statement, $params), $connection));
             break;
         case 'mysql':
             $result->setResult(mysql_query($this->database->escape($statement, $params), $connection));
             break;
         case 'mysqli':
             $extra = $this->statement;
             if ($statement->execute()) {
                 $statement->store_result();
                 $rows = array();
                 $meta = $statement->result_metadata();
                 if ($meta) {
                     $row_references = array();
                     while ($field = $meta->fetch_field()) {
                         $row_references[] =& $row[$field->name];
                     }
                     call_user_func_array(array($statement, 'bind_result'), $row_references);
                     while ($statement->fetch()) {
                         $copied_row = array();
                         foreach ($row as $key => $val) {
                             $copied_row[$key] = $val;
                         }
                         $rows[] = $copied_row;
                     }
                     unset($row_references);
                     $meta->free_result();
                 }
                 $result->setResult($rows);
                 $statement->free_result();
             } else {
                 $result->setResult(FALSE);
             }
             break;
         case 'oci8':
             $extra = $this->statement;
             if (oci_execute($extra, $this->database->isInsideTransaction() ? OCI_DEFAULT : OCI_COMMIT_ON_SUCCESS)) {
                 // oci8 complains if you try to fetch results multiple times from a prepared statement
                 // if the statement does not returns any rows, so we ignore easy-to-detect non-selects
                 if (!preg_match('#\\s*(INSERT|UPDATE|DELETE)\\s+#i', $this->sql)) {
                     oci_fetch_all($extra, $rows, 0, -1, OCI_FETCHSTATEMENT_BY_ROW + OCI_ASSOC);
                 } else {
                     $rows = array();
                 }
                 $result->setResult($rows);
                 unset($rows);
             } else {
                 $result->setResult(FALSE);
             }
             break;
         case 'pgsql':
             $result->setResult(pg_execute($connection, $this->identifier, $params));
             break;
         case 'sqlite':
             $result->setResult(sqlite_query($connection, $this->database->escape($statement, $params), SQLITE_ASSOC, $extra));
             break;
         case 'sqlsrv':
             $extra = $statement;
             if (sqlsrv_execute($statement)) {
                 $rows = array();
                 while ($row = sqlsrv_fetch_array($statement, SQLSRV_FETCH_ASSOC)) {
                     $rows[] = $row;
                 }
                 $result->setResult($rows);
                 unset($rows);
             } else {
                 $result->setResult(FALSE);
             }
             break;
         case 'pdo':
             $extra = $this->statement;
             if (preg_match('#^\\s*CREATE(\\s+OR\\s+REPLACE)?\\s+TRIGGER#i', $result->getSQL())) {
                 $extra->execute();
                 $returned_rows = array();
             } else {
                 if (!$extra->execute()) {
                     $returned_rows = FALSE;
                 } else {
                     // This fixes a segfault issue with blobs and fetchAll() for pdo_ibm
                     if ($this->database->getType() == 'db2') {
                         $returned_rows = array();
                         $scanned_for_blobs = FALSE;
                         $blob_columns = array();
                         while (($row = $extra->fetch(PDO::FETCH_ASSOC)) !== FALSE) {
                             if (!$scanned_for_blobs) {
                                 foreach ($row as $key => $value) {
                                     if (is_resource($value)) {
                                         $blob_columns[] = $key;
                                     }
                                 }
                             }
                             foreach ($blob_columns as $blob_column) {
                                 $row[$blob_column] = stream_get_contents($row[$blob_column]);
                             }
                             $returned_rows[] = $row;
                         }
                     } else {
                         $returned_rows = $extra->fetchAll(PDO::FETCH_ASSOC);
                     }
                     // The pdo_pgsql driver likes to return empty rows equal to the number of affected rows for insert and deletes
                     if ($this->database->getType() == 'postgresql' && $returned_rows && $returned_rows[0] == array()) {
                         $returned_rows = array();
                     }
                 }
             }
             $result->setResult($returned_rows);
             break;
         case 'pdo_dblib':
             $extra = $connection->query($this->database->escape($statement, $params));
             $returned_rows = is_object($extra) ? $extra->fetchAll(PDO::FETCH_ASSOC) : $extra;
             $result->setResult($returned_rows);
             break;
     }
     return $result;
 }