/** * 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; }
/** * Executes an SQL query * * @param fResult $result The result object for the query * @return void */ private function executeQuery($result) { // We don't want errors and an exception $old_level = error_reporting(error_reporting() & ~E_WARNING); if ($this->extension == 'mssql') { $result->setResult(mssql_query($result->getSQL(), $this->connection)); } elseif ($this->extension == 'mysql') { $result->setResult(mysql_query($result->getSQL(), $this->connection)); } elseif ($this->extension == 'mysqli') { $result->setResult(mysqli_query($this->connection, $result->getSQL())); } elseif ($this->extension == 'oci8') { $oci_statement = oci_parse($this->connection, $result->getSQL()); if (oci_execute($oci_statement, $this->inside_transaction ? OCI_DEFAULT : OCI_COMMIT_ON_SUCCESS)) { oci_fetch_all($oci_statement, $rows, 0, -1, OCI_FETCHSTATEMENT_BY_ROW + OCI_ASSOC); $result->setResult($rows); unset($rows); } else { $result->setResult(FALSE); } } elseif ($this->extension == 'odbc') { $resource = odbc_exec($this->connection, $result->getSQL()); if (is_resource($resource)) { $rows = array(); // Allow up to 1MB of binary data odbc_longreadlen($resource, 1048576); odbc_binmode($resource, ODBC_BINMODE_CONVERT); while ($row = odbc_fetch_array($resource)) { $rows[] = $row; } $result->setResult($rows); unset($rows); } else { $result->setResult($resource); } } elseif ($this->extension == 'pgsql') { $result->setResult(pg_query($this->connection, $result->getSQL())); } elseif ($this->extension == 'sqlite') { $result->setResult(sqlite_query($this->connection, $result->getSQL(), SQLITE_ASSOC, $sqlite_error_message)); } elseif ($this->extension == 'sqlsrv') { $resource = sqlsrv_query($this->connection, $result->getSQL()); if (is_resource($resource)) { $rows = array(); while ($row = sqlsrv_fetch_array($resource, SQLSRV_FETCH_ASSOC)) { $rows[] = $row; } $result->setResult($rows); unset($rows); } else { $result->setResult($resource); } } elseif ($this->extension == 'pdo') { if (preg_match('#^\\s*CREATE(\\s+OR\\s+REPLACE)?\\s+TRIGGER#i', $result->getSQL())) { $this->connection->exec($result->getSQL()); $pdo_statement = FALSE; $returned_rows = array(); } else { $pdo_statement = $this->connection->query($result->getSQL()); $returned_rows = is_object($pdo_statement) ? $pdo_statement->fetchAll(PDO::FETCH_ASSOC) : $pdo_statement; // The pdo_pgsql driver likes to return empty rows equal to the number of affected rows for insert and deletes if ($this->type == 'postgresql' && $returned_rows && $returned_rows[0] == array()) { $returned_rows = array(); } } $result->setResult($returned_rows); } error_reporting($old_level); if ($this->extension == 'sqlite') { $this->checkForError($result, $sqlite_error_message); } elseif ($this->extension == 'oci8') { $this->checkForError($result, $oci_statement); } else { $this->checkForError($result); } if ($this->extension == 'pdo') { $this->setAffectedRows($result, $pdo_statement); if ($pdo_statement) { $pdo_statement->closeCursor(); } unset($pdo_statement); } elseif ($this->extension == 'oci8') { $this->setAffectedRows($result, $oci_statement); oci_free_statement($oci_statement); } elseif ($this->extension == 'odbc') { $this->setAffectedRows($result, $resource); odbc_free_result($resource); } elseif ($this->extension == 'sqlsrv') { $this->setAffectedRows($result, $resource); sqlsrv_free_stmt($resource); } else { $this->setAffectedRows($result); } $this->setReturnedRows($result); $this->handleAutoIncrementedValue($result); }
/** * 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; }