Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Normalize method signatures for fetch() and fetchAll(), ensuring compatibility with the PDOStatement signature #2527

Merged
merged 4 commits into from
Jun 6, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions UPGRADE.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,30 @@
# Upgrade to 2.6

## MINOR BC BREAK: `fetch()` and `fetchAll()` method signatures in `Doctrine\DBAL\Driver\ResultStatement`

1. ``Doctrine\DBAL\Driver\ResultStatement::fetch()`` now has 3 arguments instead of 1, respecting
``PDO::fetch()`` signature.

Before:

Doctrine\DBAL\Driver\ResultStatement::fetch($fetchMode);

After:

Doctrine\DBAL\Driver\ResultStatement::fetch($fetchMode, $cursorOrientation, $cursorOffset);

2. ``Doctrine\DBAL\Driver\ResultStatement::fetchAll()`` now has 3 arguments instead of 1, respecting
``PDO::fetchAll()`` signature.

Before:

Doctrine\DBAL\Driver\ResultStatement::fetchAll($fetchMode);

After:

Doctrine\DBAL\Driver\ResultStatement::fetch($fetchMode, $fetchArgument, $ctorArgs);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It probably should've been Doctrine\DBAL\Driver\ResultStatement::fetchAll($fetchMode, $fetchArgument, $ctorArgs);.



## MINOR BC BREAK: URL-style DSN with percentage sign in password

URL-style DSNs (e.g. ``mysql://foo@bar:localhost/db``) are now assumed to be percent-encoded
Expand Down
4 changes: 2 additions & 2 deletions lib/Doctrine/DBAL/Cache/ArrayStatement.php
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ public function getIterator()
/**
* {@inheritdoc}
*/
public function fetch($fetchMode = null)
public function fetch($fetchMode = null, $cursorOrientation = \PDO::FETCH_ORI_NEXT, $cursorOffset = 0)
{
if (isset($this->data[$this->num])) {
$row = $this->data[$this->num++];
Expand All @@ -122,7 +122,7 @@ public function fetch($fetchMode = null)
/**
* {@inheritdoc}
*/
public function fetchAll($fetchMode = null)
public function fetchAll($fetchMode = null, $fetchArgument = null, $ctorArgs = null)
{
$rows = array();
while ($row = $this->fetch($fetchMode)) {
Expand Down
4 changes: 2 additions & 2 deletions lib/Doctrine/DBAL/Cache/ResultCacheStatement.php
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ public function getIterator()
/**
* {@inheritdoc}
*/
public function fetch($fetchMode = null)
public function fetch($fetchMode = null, $cursorOrientation = \PDO::FETCH_ORI_NEXT, $cursorOffset = 0)
{
if ($this->data === null) {
$this->data = array();
Expand Down Expand Up @@ -179,7 +179,7 @@ public function fetch($fetchMode = null)
/**
* {@inheritdoc}
*/
public function fetchAll($fetchMode = null)
public function fetchAll($fetchMode = null, $fetchArgument = null, $ctorArgs = null)
{
$rows = array();
while ($row = $this->fetch($fetchMode)) {
Expand Down
12 changes: 6 additions & 6 deletions lib/Doctrine/DBAL/Driver/IBMDB2/DB2Statement.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class DB2Statement implements \IteratorAggregate, Statement
/**
* @var resource
*/
private $_stmt = null;
private $_stmt;

/**
* @var array
Expand Down Expand Up @@ -147,8 +147,8 @@ public function errorCode()
public function errorInfo()
{
return array(
0 => db2_stmt_errormsg(),
1 => db2_stmt_error(),
db2_stmt_errormsg(),
db2_stmt_error(),
);
}

Expand Down Expand Up @@ -207,7 +207,7 @@ public function getIterator()
/**
* {@inheritdoc}
*/
public function fetch($fetchMode = null)
public function fetch($fetchMode = null, $cursorOrientation = \PDO::FETCH_ORI_NEXT, $cursorOffset = 0)
{
// do not try fetching from the statement if it's not expected to contain result
// in order to prevent exceptional situation
Expand Down Expand Up @@ -243,14 +243,14 @@ public function fetch($fetchMode = null)
case \PDO::FETCH_OBJ:
return db2_fetch_object($this->_stmt);
default:
throw new DB2Exception("Given Fetch-Style " . $fetchMode . " is not supported.");
throw new DB2Exception('Given Fetch-Style ' . $fetchMode . ' is not supported.');
}
}

/**
* {@inheritdoc}
*/
public function fetchAll($fetchMode = null)
public function fetchAll($fetchMode = null, $fetchArgument = null, $ctorArgs = null)
{
$rows = array();

Expand Down
4 changes: 2 additions & 2 deletions lib/Doctrine/DBAL/Driver/Mysqli/MysqliStatement.php
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ private function _fetch()
/**
* {@inheritdoc}
*/
public function fetch($fetchMode = null)
public function fetch($fetchMode = null, $cursorOrientation = \PDO::FETCH_ORI_NEXT, $cursorOffset = 0)
{
// do not try fetching from the statement if it's not expected to contain result
// in order to prevent exceptional situation
Expand Down Expand Up @@ -313,7 +313,7 @@ public function fetch($fetchMode = null)
/**
* {@inheritdoc}
*/
public function fetchAll($fetchMode = null)
public function fetchAll($fetchMode = null, $fetchArgument = null, $ctorArgs = null)
{
$fetchMode = $fetchMode ?: $this->_defaultFetchMode;

Expand Down
4 changes: 2 additions & 2 deletions lib/Doctrine/DBAL/Driver/OCI8/OCI8Statement.php
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ public function getIterator()
/**
* {@inheritdoc}
*/
public function fetch($fetchMode = null)
public function fetch($fetchMode = null, $cursorOrientation = \PDO::FETCH_ORI_NEXT, $cursorOffset = 0)
{
// do not try fetching from the statement if it's not expected to contain result
// in order to prevent exceptional situation
Expand All @@ -405,7 +405,7 @@ public function fetch($fetchMode = null)
/**
* {@inheritdoc}
*/
public function fetchAll($fetchMode = null)
public function fetchAll($fetchMode = null, $fetchArgument = null, $ctorArgs = null)
{
$fetchMode = $fetchMode ?: $this->_defaultFetchMode;

Expand Down
14 changes: 7 additions & 7 deletions lib/Doctrine/DBAL/Driver/PDOStatement.php
Original file line number Diff line number Diff line change
Expand Up @@ -111,18 +111,18 @@ public function execute($params = null)
/**
* {@inheritdoc}
*/
public function fetch($fetchMode = null, $cursorOrientation = null, $cursorOffset = null)
public function fetch($fetchMode = null, $cursorOrientation = \PDO::FETCH_ORI_NEXT, $cursorOffset = 0)
{
try {
if ($fetchMode === null && $cursorOrientation === null && $cursorOffset === null) {
if ($fetchMode === null && \PDO::FETCH_ORI_NEXT === $cursorOrientation && 0 === $cursorOffset) {
return parent::fetch();
}

if ($cursorOrientation === null && $cursorOffset === null) {
if (\PDO::FETCH_ORI_NEXT === $cursorOrientation && 0 === $cursorOffset) {
return parent::fetch($fetchMode);
}

if ($cursorOffset === null) {
if (0 === $cursorOffset) {
return parent::fetch($fetchMode, $cursorOrientation);
}

Expand All @@ -138,15 +138,15 @@ public function fetch($fetchMode = null, $cursorOrientation = null, $cursorOffse
public function fetchAll($fetchMode = null, $fetchArgument = null, $ctorArgs = null)
{
try {
if ($fetchMode === null && $fetchArgument === null && $ctorArgs === null) {
if ($fetchMode === null && null === $fetchArgument && null === $ctorArgs) {
return parent::fetchAll();
}

if ($fetchArgument === null && $ctorArgs === null) {
if (null === $fetchArgument && null === $ctorArgs) {
return parent::fetchAll($fetchMode);
}

if ($ctorArgs === null) {
if (null === $ctorArgs) {
return parent::fetchAll($fetchMode, $fetchArgument);
}

Expand Down
42 changes: 33 additions & 9 deletions lib/Doctrine/DBAL/Driver/ResultStatement.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,29 +58,53 @@ public function setFetchMode($fetchMode, $arg2 = null, $arg3 = null);
/**
* Returns the next row of a result set.
*
* @param integer|null $fetchMode Controls how the next row will be returned to the caller.
* The value must be one of the PDO::FETCH_* constants,
* defaulting to PDO::FETCH_BOTH.
* @param int|null $fetchMode Controls how the next row will be returned to the caller.
* The value must be one of the \PDO::FETCH_* constants,
* defaulting to \PDO::FETCH_BOTH.
* @param int $cursorOrientation For a ResultStatement object representing a scrollable cursor,
* this value determines which row will be returned to the caller.
* This value must be one of the \PDO::FETCH_ORI_* constants,
* defaulting to \PDO::FETCH_ORI_NEXT. To request a scrollable
* cursor for your ResultStatement object, you must set the \PDO::ATTR_CURSOR
* attribute to \PDO::CURSOR_SCROLL when you prepare the SQL statement with
* \PDO::prepare().
* @param int $cursorOffset For a ResultStatement object representing a scrollable cursor for which the
* cursorOrientation parameter is set to \PDO::FETCH_ORI_ABS, this value
* specifies the absolute number of the row in the result set that shall be
* fetched.
* For a ResultStatement object representing a scrollable cursor for which the
* cursorOrientation parameter is set to \PDO::FETCH_ORI_REL, this value
* specifies the row to fetch relative to the cursor position before
* ResultStatement::fetch() was called.
*
* @return mixed The return value of this method on success depends on the fetch mode. In all cases, FALSE is
* returned on failure.
*
* @see PDO::FETCH_* constants.
*/
public function fetch($fetchMode = null);
public function fetch($fetchMode = null, $cursorOrientation = \PDO::FETCH_ORI_NEXT, $cursorOffset = 0);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This signature change is a BC break and needs upgrade/migration path in UPGRADE.md

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you @Ocramius, I've added a note in the upgrade path for 2.6 regarding these changes.


/**
* Returns an array containing all of the result set rows.
*
* @param integer|null $fetchMode Controls how the next row will be returned to the caller.
* The value must be one of the PDO::FETCH_* constants,
* defaulting to PDO::FETCH_BOTH.
* @param int|null $fetchMode Controls how the next row will be returned to the caller.
* The value must be one of the \PDO::FETCH_* constants,
* defaulting to \PDO::FETCH_BOTH.
* @param int|null $fetchArgument This argument has a different meaning depending on the value of the $fetchMode parameter:
* * \PDO::FETCH_COLUMN: Returns the indicated 0-indexed column.
* * \PDO::FETCH_CLASS: Returns instances of the specified class, mapping the columns of each
* row to named properties in the class.
* * \PDO::FETCH_FUNC: Returns the results of calling the specified function, using each row's
* columns as parameters in the call.
* @param array|null $ctorArgs Controls how the next row will be returned to the caller.
* The value must be one of the \PDO::FETCH_* constants,
* defaulting to \PDO::FETCH_BOTH.
*
* @return array
*
* @see PDO::FETCH_* constants.
* @see \PDO::FETCH_* constants.
*/
public function fetchAll($fetchMode = null);
public function fetchAll($fetchMode = null, $fetchArgument = null, $ctorArgs = null);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This signature change is a BC break and needs upgrade/migration path in UPGRADE.md


/**
* Returns a single column from the next row of a result set or FALSE if there are no more rows.
Expand Down
4 changes: 2 additions & 2 deletions lib/Doctrine/DBAL/Driver/SQLAnywhere/SQLAnywhereStatement.php
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ public function execute($params = null)
*
* @throws SQLAnywhereException
*/
public function fetch($fetchMode = null)
public function fetch($fetchMode = null, $cursorOrientation = \PDO::FETCH_ORI_NEXT, $cursorOffset = 0)
{
if ( ! is_resource($this->result)) {
return false;
Expand Down Expand Up @@ -235,7 +235,7 @@ public function fetch($fetchMode = null)
/**
* {@inheritdoc}
*/
public function fetchAll($fetchMode = null)
public function fetchAll($fetchMode = null, $fetchArgument = null, $ctorArgs = null)
{
$rows = array();

Expand Down
14 changes: 8 additions & 6 deletions lib/Doctrine/DBAL/Driver/SQLSrv/SQLSrvStatement.php
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ private function prepare()
$params = array();

foreach ($this->variables as $column => &$variable) {
if ($this->types[$column] === \PDO::PARAM_LOB) {
if (PDO::PARAM_LOB === $this->types[$column]) {
$params[$column - 1] = array(
&$variable,
SQLSRV_PARAM_IN,
Expand Down Expand Up @@ -302,8 +302,10 @@ public function getIterator()

/**
* {@inheritdoc}
*
* @throws SQLSrvException
*/
public function fetch($fetchMode = null)
public function fetch($fetchMode = null, $cursorOrientation = PDO::FETCH_ORI_NEXT, $cursorOffset = 0)
{
// do not try fetching from the statement if it's not expected to contain result
// in order to prevent exceptional situation
Expand All @@ -318,25 +320,25 @@ public function fetch($fetchMode = null)
return sqlsrv_fetch_array($this->stmt, self::$fetchMap[$fetchMode]) ?: false;
}

if ($fetchMode == PDO::FETCH_OBJ || $fetchMode == PDO::FETCH_CLASS) {
if (in_array($fetchMode, array(PDO::FETCH_OBJ, PDO::FETCH_CLASS), true)) {
$className = $this->defaultFetchClass;
$ctorArgs = $this->defaultFetchClassCtorArgs;

if (count($args) >= 2) {
$className = $args[1];
$ctorArgs = (isset($args[2])) ? $args[2] : array();
$ctorArgs = isset($args[2]) ? $args[2] : array();
}

return sqlsrv_fetch_object($this->stmt, $className, $ctorArgs) ?: false;
}

throw new SQLSrvException("Fetch mode is not supported!");
throw new SQLSrvException('Fetch mode is not supported!');
}

/**
* {@inheritdoc}
*/
public function fetchAll($fetchMode = null)
public function fetchAll($fetchMode = null, $fetchArgument = null, $ctorArgs = null)
{
$rows = array();

Expand Down
8 changes: 4 additions & 4 deletions lib/Doctrine/DBAL/Portability/Statement.php
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ public function getIterator()
/**
* {@inheritdoc}
*/
public function fetch($fetchMode = null)
public function fetch($fetchMode = null, $cursorOrientation = \PDO::FETCH_ORI_NEXT, $cursorOffset = 0)
{
$fetchMode = $fetchMode ?: $this->defaultFetchMode;

Expand All @@ -159,12 +159,12 @@ public function fetch($fetchMode = null)
/**
* {@inheritdoc}
*/
public function fetchAll($fetchMode = null, $columnIndex = 0)
public function fetchAll($fetchMode = null, $fetchArgument = null, $ctorArgs = null)
{
$fetchMode = $fetchMode ?: $this->defaultFetchMode;

if ($columnIndex != 0) {
$rows = $this->stmt->fetchAll($fetchMode, $columnIndex);
if ($fetchArgument) {
$rows = $this->stmt->fetchAll($fetchMode, $fetchArgument);
} else {
$rows = $this->stmt->fetchAll($fetchMode);
}
Expand Down
20 changes: 5 additions & 15 deletions lib/Doctrine/DBAL/Statement.php
Original file line number Diff line number Diff line change
Expand Up @@ -252,29 +252,19 @@ public function getIterator()
}

/**
* Fetches the next row from a result set.
*
* @param integer|null $fetchMode
*
* @return mixed The return value of this function on success depends on the fetch type.
* In all cases, FALSE is returned on failure.
* {@inheritdoc}
*/
public function fetch($fetchMode = null)
public function fetch($fetchMode = null, $cursorOrientation = \PDO::FETCH_ORI_NEXT, $cursorOffset = 0)
{
return $this->stmt->fetch($fetchMode);
}

/**
* Returns an array containing all of the result set rows.
*
* @param integer|null $fetchMode
* @param mixed $fetchArgument
*
* @return array An array containing all of the remaining rows in the result set.
* {@inheritdoc}
*/
public function fetchAll($fetchMode = null, $fetchArgument = 0)
public function fetchAll($fetchMode = null, $fetchArgument = null, $ctorArgs = null)
{
if ($fetchArgument !== 0) {
if ($fetchArgument) {
return $this->stmt->fetchAll($fetchMode, $fetchArgument);
}

Expand Down