summaryrefslogtreecommitdiff
path: root/www/wiki/includes/libs/rdbms/lbfactory/LBFactorySingle.php
blob: 587ab23c02b9d9c9f5ceb263ebf9924520aff7b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php
/**
 * Simple generator of database connections that always returns the same object.
 *
 * 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;
use BadMethodCallException;

/**
 * An LBFactory class that always returns a single database object.
 */
class LBFactorySingle extends LBFactory {
	/** @var LoadBalancerSingle */
	private $lb;

	/**
	 * @param array $conf An associative array with one member:
	 *  - connection: The IDatabase connection object
	 */
	public function __construct( array $conf ) {
		parent::__construct( $conf );

		if ( !isset( $conf['connection'] ) ) {
			throw new InvalidArgumentException( "Missing 'connection' argument." );
		}

		$lb = new LoadBalancerSingle( array_merge( $this->baseLoadBalancerParams(), $conf ) );
		$this->initLoadBalancer( $lb );
		$this->lb = $lb;
	}

	/**
	 * @param IDatabase $db Live connection handle
	 * @param array $params Parameter map to LBFactorySingle::__constructs()
	 * @return LBFactorySingle
	 * @since 1.28
	 */
	public static function newFromConnection( IDatabase $db, array $params = [] ) {
		return new static( [ 'connection' => $db ] + $params );
	}

	/**
	 * @param bool|string $domain (unused)
	 * @return LoadBalancerSingle
	 */
	public function newMainLB( $domain = false ) {
		return $this->lb;
	}

	/**
	 * @param bool|string $domain (unused)
	 * @return LoadBalancerSingle
	 */
	public function getMainLB( $domain = false ) {
		return $this->lb;
	}

	public function newExternalLB( $cluster ) {
		throw new BadMethodCallException( "Method is not supported." );
	}

	public function getExternalLB( $cluster ) {
		throw new BadMethodCallException( "Method is not supported." );
	}

	/**
	 * @return LoadBalancerSingle[] Map of (cluster name => LoadBalancer)
	 */
	public function getAllMainLBs() {
		return [ 'DEFAULT' => $this->lb ];
	}

	/**
	 * @return LoadBalancerSingle[] Map of (cluster name => LoadBalancer)
	 */
	public function getAllExternalLBs() {
		return [];
	}

	/**
	 * @param string|callable $callback
	 * @param array $params
	 */
	public function forEachLB( $callback, array $params = [] ) {
		if ( isset( $this->lb ) ) { // may not be set during _destruct()
			call_user_func_array( $callback, array_merge( [ $this->lb ], $params ) );
		}
	}
}