db = $db; parent::__construct( $error ); } } /** * Base class for the more common types of database errors. These are known to occur * frequently, so we try to give friendly error messages for them. * * @ingroup Database * @since 1.23 */ class DBExpectedError extends DBError implements MessageSpecifier { /** @var string[] Message parameters */ protected $params; function __construct( IDatabase $db = null, $error, array $params = [] ) { parent::__construct( $db, $error ); $this->params = $params; } public function getKey() { return 'databaseerror-text'; } public function getParams() { return $this->params; } } /** * @ingroup Database */ class DBConnectionError extends DBExpectedError { /** * @param IDatabase $db Object throwing the error * @param string $error Error text */ function __construct( IDatabase $db = null, $error = 'unknown error' ) { $msg = 'Cannot access the database'; if ( trim( $error ) != '' ) { $msg .= ": $error"; } parent::__construct( $db, $msg ); } } /** * @ingroup Database */ class DBQueryError extends DBExpectedError { /** @var string */ public $error; /** @var integer */ public $errno; /** @var string */ public $sql; /** @var string */ public $fname; /** * @param IDatabase $db * @param string $error * @param int|string $errno * @param string $sql * @param string $fname */ function __construct( IDatabase $db, $error, $errno, $sql, $fname ) { if ( $db instanceof DatabaseBase && $db->wasConnectionError( $errno ) ) { $message = "A connection error occured. \n" . "Query: $sql\n" . "Function: $fname\n" . "Error: $errno $error\n"; } else { $message = "A database error has occurred. Did you forget to run " . "maintenance/update.php after upgrading? See: " . "https://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script\n" . "Query: $sql\n" . "Function: $fname\n" . "Error: $errno $error\n"; } parent::__construct( $db, $message ); $this->error = $error; $this->errno = $errno; $this->sql = $sql; $this->fname = $fname; } } /** * @ingroup Database */ class DBReadOnlyError extends DBExpectedError { } /** * @ingroup Database */ class DBTransactionError extends DBExpectedError { } /** * @ingroup Database */ class DBTransactionSizeError extends DBTransactionError { function getKey() { return 'transaction-duration-limit-exceeded'; } } /** * Exception class for replica DB wait timeouts * @ingroup Database */ class DBReplicationWaitError extends DBExpectedError { } /** * @ingroup Database */ class DBUnexpectedError extends DBError { } /** * Exception class for attempted DB access * @ingroup Database */ class DBAccessError extends DBUnexpectedError { public function __construct() { parent::__construct( "Mediawiki tried to access the database via wfGetDB(). " . "This is not allowed, because database access has been disabled." ); } }