Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
30.77% covered (danger)
30.77%
8 / 26
33.33% covered (danger)
33.33%
3 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
DbFactory
32.00% covered (danger)
32.00%
8 / 25
33.33% covered (danger)
33.33%
3 / 9
85.75
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 newFromDefault
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isReadOnly
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getLB
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
 getSharedLB
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getEchoDb
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getSharedDb
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 getDB
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 canRetryPrimary
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace MediaWiki\Extension\Notifications;
4
5use MediaWiki\MediaWikiServices;
6use Wikimedia\Rdbms\IDatabase;
7use Wikimedia\Rdbms\ILoadBalancer;
8
9/**
10 * Database factory class, this will determine whether to use the main database
11 * or an external database defined in the configuration file
12 */
13class DbFactory {
14
15    /**
16     * The cluster for the database
17     * @var string|false
18     */
19    private $cluster;
20
21    /** @var string|false */
22    private $shared;
23
24    /** @var string|false */
25    private $sharedCluster;
26
27    /**
28     * @param string|false $cluster
29     * @param string|false $shared
30     * @param string|false $sharedCluster
31     */
32    public function __construct( $cluster = false, $shared = false, $sharedCluster = false ) {
33        $this->cluster = $cluster;
34        $this->shared = $shared;
35        $this->sharedCluster = $sharedCluster;
36    }
37
38    /**
39     * Create a db factory instance from default Echo configuration
40     * A singleton is not necessary because it's actually handled
41     * inside core database object
42     *
43     * @return DbFactory
44     */
45    public static function newFromDefault() {
46        global $wgEchoCluster, $wgEchoSharedTrackingDB, $wgEchoSharedTrackingCluster;
47
48        return new self( $wgEchoCluster, $wgEchoSharedTrackingDB, $wgEchoSharedTrackingCluster );
49    }
50
51    /**
52     * @return bool
53     */
54    public function isReadOnly() {
55        return ( $this->getLB()->getReadOnlyReason() !== false );
56    }
57
58    /**
59     * Get the database load balancer
60     * @return ILoadBalancer
61     */
62    protected function getLB() {
63        // Use the external db defined for Echo
64        if ( $this->cluster ) {
65            $lb = MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->getExternalLB( $this->cluster );
66        } else {
67            $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
68        }
69
70        return $lb;
71    }
72
73    /**
74     * @return ILoadBalancer
75     */
76    protected function getSharedLB() {
77        if ( $this->sharedCluster ) {
78            $lb = MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->getExternalLB( $this->sharedCluster );
79        } else {
80            $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
81        }
82
83        return $lb;
84    }
85
86    /**
87     * Get the database connection for Echo
88     * @param int $db Index of the connection to get
89     * @param string[] $groups Query groups.
90     * @return IDatabase
91     */
92    public function getEchoDb( $db, array $groups = [] ) {
93        return $this->getLB()->getConnection( $db, $groups );
94    }
95
96    /**
97     * @param int $db Index of the connection to get
98     * @param string[] $groups Query groups
99     *
100     * @return bool|IDatabase false if no shared db is configured
101     */
102    public function getSharedDb( $db, array $groups = [] ) {
103        if ( !$this->shared ) {
104            return false;
105        }
106
107        return $this->getSharedLB()->getConnection( $db, $groups, $this->shared );
108    }
109
110    /**
111     * Wrapper function for LBFactory::getExternalLB/getMainLB, some extensions like MobileFrontend is
112     * using this to issue sql queries against Echo database directly.  This
113     * is totally not accepted and should be updated to use Echo database access
114     * objects
115     *
116     * @deprecated Use newFromDefault() instead to create a db factory
117     * @param int $db Index of the connection to get
118     * @param string[] $groups Query groups.
119     * @param string|bool $wiki The wiki ID, or false for the current wiki
120     * @return IDatabase
121     */
122    public static function getDB( $db, array $groups = [], $wiki = false ) {
123        global $wgEchoCluster;
124
125        $services = MediaWikiServices::getInstance();
126
127        // Use the external db defined for Echo
128        if ( $wgEchoCluster ) {
129            $lb = $services->getDBLoadBalancerFactory()->getExternalLB( $wgEchoCluster );
130        } else {
131            if ( $wiki === false ) {
132                $lb = $services->getDBLoadBalancer();
133            } else {
134                $lb = $services->getDBLoadBalancerFactory()->getMainLB( $wiki );
135            }
136        }
137
138        return $lb->getConnection( $db, $groups, $wiki );
139    }
140
141    /**
142     * Check whether it makes sense to retry a failed lookup on the primary database.
143     * @return bool True if there are multiple servers and changes were made in this request; false otherwise
144     */
145    public function canRetryPrimary() {
146        return $this->getLB()->getServerCount() > 1 && $this->getLB()->hasOrMadeRecentPrimaryChanges();
147    }
148}
149
150class_alias( DbFactory::class, 'MWEchoDbFactory' );