Beispiel #1
0
 /**
  * @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);
     }
 }
Beispiel #2
0
 /**
  * @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);
     }
 }
Beispiel #3
0
 /**
  * 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");
     }
 }