wiki.techinc.nl/includes/libs/rdbms/connectionmanager/ConnectionManager.php
Thiemo Kreuz 7a9d1afde5 ConnectionManager: Require ILoadBalancer instead of LoadBalancer
Since I4fdf7f7 more code stops returning the implementation, but only
returns the interface. This is a good, very welcome change. However,
ConnectionManager still requires the LoadBalancer implementation, for
no obvious reason. All code in this class works fine with the interface.

This is currently reported by Phan as a violation (and it actually is
one), e.g.:
https://integration.wikimedia.org/ci/job/mwext-php70-phan-docker/6433/console

Change-Id: I63cbb98fd277b0c64ab8b303888b9354c4be29e2
2018-05-14 13:27:23 +02:00

155 lines
3.8 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
* @ingroup Database
*/
namespace Wikimedia\Rdbms;
use InvalidArgumentException;
/**
* Database connection manager.
*
* This manages access to master and replica databases.
*
* @since 1.29
*
* @author Addshore
*/
class ConnectionManager {
/**
* @var ILoadBalancer
*/
private $loadBalancer;
/**
* The symbolic name of the target database, or false for the local wiki's database.
*
* @var string|false
*/
private $domain;
/**
* @var string[]
*/
private $groups = [];
/**
* @param ILoadBalancer $loadBalancer
* @param string|bool $domain Optional logical DB name, defaults to current wiki.
* This follows the convention for database names used by $loadBalancer.
* @param string[] $groups see LoadBalancer::getConnection
*
* @throws InvalidArgumentException
*/
public function __construct( ILoadBalancer $loadBalancer, $domain = false, array $groups = [] ) {
if ( !is_string( $domain ) && $domain !== false ) {
throw new InvalidArgumentException( '$dbName must be a string, or false.' );
}
$this->loadBalancer = $loadBalancer;
$this->domain = $domain;
$this->groups = $groups;
}
/**
* @param int $i
* @param string[]|null $groups
*
* @return Database
*/
private function getConnection( $i, array $groups = null ) {
$groups = $groups === null ? $this->groups : $groups;
return $this->loadBalancer->getConnection( $i, $groups, $this->domain );
}
/**
* @param int $i
* @param string[]|null $groups
*
* @return DBConnRef
*/
private function getConnectionRef( $i, array $groups = null ) {
$groups = $groups === null ? $this->groups : $groups;
return $this->loadBalancer->getConnectionRef( $i, $groups, $this->domain );
}
/**
* Returns a connection to the master DB, for updating. The connection should later be released
* by calling releaseConnection().
*
* @since 1.29
*
* @return Database
*/
public function getWriteConnection() {
return $this->getConnection( DB_MASTER );
}
/**
* Returns a database connection for reading. The connection should later be released by
* calling releaseConnection().
*
* @since 1.29
*
* @param string[]|null $groups
*
* @return Database
*/
public function getReadConnection( array $groups = null ) {
$groups = $groups === null ? $this->groups : $groups;
return $this->getConnection( DB_REPLICA, $groups );
}
/**
* @since 1.29
*
* @param IDatabase $db
*/
public function releaseConnection( IDatabase $db ) {
$this->loadBalancer->reuseConnection( $db );
}
/**
* Returns a connection ref to the master DB, for updating.
*
* @since 1.29
*
* @return DBConnRef
*/
public function getWriteConnectionRef() {
return $this->getConnectionRef( DB_MASTER );
}
/**
* Returns a database connection ref for reading.
*
* @since 1.29
*
* @param string[]|null $groups
*
* @return DBConnRef
*/
public function getReadConnectionRef( array $groups = null ) {
$groups = $groups === null ? $this->groups : $groups;
return $this->getConnectionRef( DB_REPLICA, $groups );
}
}