示例#1
0
 /**
  * Mark a foreign connection as being available for reuse under a different
  * DB name or prefix. This mechanism is reference-counted, and must be called
  * the same number of times as getConnection() to work.
  *
  * @param DatabaseBase $conn
  * @throws MWException
  */
 public function reuseConnection($conn)
 {
     $serverIndex = $conn->getLBInfo('serverIndex');
     $refCount = $conn->getLBInfo('foreignPoolRefCount');
     if ($serverIndex === null || $refCount === null) {
         wfDebug(__METHOD__ . ": this connection was not opened as a foreign connection\n");
         /**
          * This can happen in code like:
          *   foreach ( $dbs as $db ) {
          *     $conn = $lb->getConnection( DB_SLAVE, array(), $db );
          *     ...
          *     $lb->reuseConnection( $conn );
          *   }
          * When a connection to the local DB is opened in this way, reuseConnection()
          * should be ignored
          */
         return;
     }
     $dbName = $conn->getDBname();
     $prefix = $conn->tablePrefix();
     if (strval($prefix) !== '') {
         $wiki = "{$dbName}-{$prefix}";
     } else {
         $wiki = $dbName;
     }
     if ($this->mConns['foreignUsed'][$serverIndex][$wiki] !== $conn) {
         throw new MWException(__METHOD__ . ": connection not found, has " . "the connection been freed already?");
     }
     $conn->setLBInfo('foreignPoolRefCount', --$refCount);
     if ($refCount <= 0) {
         $this->mConns['foreignFree'][$serverIndex][$wiki] = $conn;
         unset($this->mConns['foreignUsed'][$serverIndex][$wiki]);
         wfDebug(__METHOD__ . ": freed connection {$serverIndex}/{$wiki}\n");
     } else {
         wfDebug(__METHOD__ . ": reference count for {$serverIndex}/{$wiki} reduced to {$refCount}\n");
     }
 }
示例#2
0
 /**
  * @param array $params
  */
 public function __construct(array $params)
 {
     $this->db = $params['connection'];
     parent::__construct(['servers' => [['type' => $this->db->getType(), 'host' => $this->db->getServer(), 'dbname' => $this->db->getDBname(), 'load' => 1]], 'trxProfiler' => $this->trxProfiler]);
     if (isset($params['readOnlyReason'])) {
         $this->db->setLBInfo('readOnlyReason', $params['readOnlyReason']);
     }
 }