/** * @param IDatabase $dbw * @param string $fname Caller name (usually __METHOD__) * @param callable $callback Callback that takes (IDatabase, method name string) */ public function __construct(IDatabase $dbw, $fname, callable $callback) { $this->dbw = $dbw; $this->fname = $fname; $this->callback = $callback; if ($this->dbw->trxLevel()) { $this->dbw->onTransactionResolution([$this, 'cancelOnRollback'], $fname); } }
/** * @param callable $callback * @param string $fname Calling method * @param IDatabase|null $dbw Abort if this DB is rolled back [optional] (since 1.28) */ public function __construct(callable $callback, $fname = 'unknown', IDatabase $dbw = null) { $this->callback = $callback; $this->fname = $fname; if ($dbw && $dbw->trxLevel()) { $dbw->onTransactionResolution([$this, 'cancelOnRollback'], $fname); } }
/** * Handle a DBQueryError which occurred during a write operation. * * @param DBError $exception * @param IDatabase|null $db DB handle or null if connection failed * @param int $serverIndex * @throws Exception */ protected function handleWriteError(DBError $exception, IDatabase $db = null, $serverIndex) { if (!$db) { $this->markServerDown($exception, $serverIndex); } elseif ($db->wasReadOnlyError()) { if ($db->trxLevel() && $this->usesMainDB()) { // Errors like deadlocks and connection drops already cause rollback. // For consistency, we have no choice but to throw an error and trigger // complete rollback if the main DB is also being used as the cache DB. throw $exception; } } $this->logger->error("DBError: {$exception->getMessage()}"); if ($exception instanceof DBConnectionError) { $this->setLastError(BagOStuff::ERR_UNREACHABLE); $this->logger->debug(__METHOD__ . ": ignoring connection error"); } else { $this->setLastError(BagOStuff::ERR_UNEXPECTED); $this->logger->debug(__METHOD__ . ": ignoring query error"); } }