/** * 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"); } }
/** * @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']); } }