1<?php 2/** 3 * Simple generator of database connections that always returns the same object. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18 * http://www.gnu.org/copyleft/gpl.html 19 * 20 * @file 21 * @ingroup Database 22 */ 23 24namespace Wikimedia\Rdbms; 25 26use BadMethodCallException; 27use InvalidArgumentException; 28 29/** 30 * An LBFactory class that always returns a single database object. 31 */ 32class LBFactorySingle extends LBFactory { 33 /** @var LoadBalancerSingle */ 34 private $lb; 35 36 /** 37 * @param array $conf An associative array with one member: 38 * - connection: The IDatabase connection object 39 */ 40 public function __construct( array $conf ) { 41 parent::__construct( $conf ); 42 43 if ( !isset( $conf['connection'] ) ) { 44 throw new InvalidArgumentException( "Missing 'connection' argument." ); 45 } 46 47 $lb = new LoadBalancerSingle( array_merge( 48 $this->baseLoadBalancerParams( $this->getOwnershipId() ), 49 $conf 50 ) ); 51 $this->initLoadBalancer( $lb ); 52 53 $this->lb = $lb; 54 } 55 56 /** 57 * @param IDatabase $db Live connection handle 58 * @param array $params Parameter map to LBFactorySingle::__constructs() 59 * @return LBFactorySingle 60 * @since 1.28 61 */ 62 public static function newFromConnection( IDatabase $db, array $params = [] ) { 63 return new static( array_merge( 64 [ 'localDomain' => $db->getDomainID() ], 65 $params, 66 [ 'connection' => $db ] 67 ) ); 68 } 69 70 public function newMainLB( $domain = false, $owner = null ) { 71 throw new BadMethodCallException( "Method is not supported." ); 72 } 73 74 public function getMainLB( $domain = false ) { 75 return $this->lb; 76 } 77 78 public function newExternalLB( $cluster, $owner = null ) { 79 throw new BadMethodCallException( "Method is not supported." ); 80 } 81 82 public function getExternalLB( $cluster ) { 83 throw new BadMethodCallException( "Method is not supported." ); 84 } 85 86 public function getAllMainLBs() { 87 return [ 'DEFAULT' => $this->lb ]; 88 } 89 90 public function getAllExternalLBs() { 91 return []; 92 } 93 94 public function forEachLB( $callback, array $params = [] ) { 95 if ( isset( $this->lb ) ) { // may not be set during _destruct() 96 $callback( $this->lb, ...$params ); 97 } 98 } 99} 100