Merge "rdbms: rename wasKnownStatementRollbackError() to isKnownStatementRollbackError()"

This commit is contained in:
jenkins-bot 2022-03-22 23:16:04 +00:00 committed by Gerrit Code Review
commit 04426c6a05
7 changed files with 18 additions and 14 deletions

View file

@ -77,6 +77,8 @@ because of Phabricator reports.
- ::fetchRow()
- ::numRows()
- ::freeResult()
* Database::wasKnownStatementRollbackError() was removed. Subclasses should
override isKnownStatementRollbackError() instead.
* …
=== Deprecations in 1.39 ===

View file

@ -1333,7 +1333,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
$reconnected = $this->replaceLostConnection( $lastErrno, __METHOD__ );
} else {
# Check if only the last query was rolled back
$recoverableSR = $this->wasKnownStatementRollbackError();
$recoverableSR = $this->isKnownStatementRollbackError( $lastErrno );
}
if ( $sql === self::PING_QUERY ) {
@ -3907,12 +3907,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
/**
* @stable to override
* @param int|string $errno
* @return bool Whether it is known that the last query error only caused statement rollback
* @note This is for backwards compatibility for callers catching DBError exceptions in
* order to ignore problems like duplicate key errors or foreign key violations
* @since 1.31
* @since 1.39
*/
protected function wasKnownStatementRollbackError() {
protected function isKnownStatementRollbackError( $errno ) {
return false; // don't know; it could have caused a transaction rollback
}

View file

@ -1229,11 +1229,11 @@ abstract class DatabaseMysqlBase extends Database {
return $errno == 2013 || $errno == 2006;
}
protected function wasKnownStatementRollbackError() {
$errno = $this->lastErrno();
protected function isKnownStatementRollbackError( $errno ) {
// https://mariadb.com/kb/en/mariadb-error-codes/
// https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html
if ( $errno === 1205 ) { // lock wait timeout
// Note that this is uncached to avoid stale values of SET is used
// Note that this is uncached to avoid stale values if SET is used
$res = $this->query(
"SELECT @@innodb_rollback_on_timeout AS Value",
__METHOD__,
@ -1245,7 +1245,6 @@ abstract class DatabaseMysqlBase extends Database {
return ( $row && !$row->Value );
}
// See https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html
return in_array( $errno, [ 1022, 1062, 1216, 1217, 1137, 1146, 1051, 1054 ], true );
}

View file

@ -662,7 +662,7 @@ __INDEXATTR__;
return in_array( $errno, $codes, true );
}
protected function wasKnownStatementRollbackError() {
protected function isKnownStatementRollbackError( $errno ) {
return false; // transaction has to be rolled-back from error state
}

View file

@ -633,7 +633,7 @@ class DatabaseSqlite extends Database {
return $errno == 17; // SQLITE_SCHEMA;
}
protected function wasKnownStatementRollbackError() {
protected function isKnownStatementRollbackError( $errno ) {
// ON CONFLICT ROLLBACK clauses make it so that SQLITE_CONSTRAINT error is
// ambiguous with regard to whether it implies a ROLLBACK or an ABORT happened.
// https://sqlite.org/lang_createtable.html#uniqueconst

View file

@ -110,7 +110,7 @@ class DatabaseTestHelper extends Database {
* @param int $errno Error number
* @param string $error Error text
* @param array $options
* - wasKnownStatementRollbackError: Return value for wasKnownStatementRollbackError()
* - isKnownStatementRollbackError: Return value for isKnownStatementRollbackError()
*/
public function forceNextQueryError( $errno, $error, $options = [] ) {
$this->nextError = [ 'errno' => $errno, 'error' => $error ] + $options;
@ -195,8 +195,10 @@ class DatabaseTestHelper extends Database {
return $this->lastError ? $this->lastError['error'] : 'test';
}
protected function wasKnownStatementRollbackError() {
return $this->lastError['wasKnownStatementRollbackError'] ?? false;
protected function isKnownStatementRollbackError( $errno ) {
return ( $this->lastError['errno'] ?? 0 ) === $errno
? ( $this->lastError['isKnownStatementRollbackError'] ?? false )
: false;
}
public function fieldInfo( $table, $field ) {

View file

@ -2375,7 +2375,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
$doError = function () {
$this->database->forceNextQueryError( 666, 'Evilness', [
'wasKnownStatementRollbackError' => true,
'isKnownStatementRollbackError' => true,
] );
try {
$this->database->delete( 'error', '1', __CLASS__ . '::SomeCaller' );