Merge "TableDiffFormatter: Don't repeatedly call array_shift()"
[lhc/web/wiklou.git] / includes / site / DBSiteStore.php
index 17764a1..974789f 100644 (file)
@@ -26,6 +26,7 @@
  *
  * @license GNU GPL v2+
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ * @author Daniel Kinzler
  */
 class DBSiteStore implements SiteStore {
 
@@ -35,15 +36,20 @@ class DBSiteStore implements SiteStore {
        protected $sites = null;
 
        /**
-        * @since 1.25
-        * @param null $sitesTable Unused since 1.27
+        * @var LoadBalancer
         */
-       public function __construct( $sitesTable = null ) {
-               if ( $sitesTable !== null ) {
-                       throw new InvalidArgumentException(
-                               __METHOD__ . ': $sitesTable parameter must be null'
-                       );
-               }
+       private $dbLoadBalancer;
+
+       /**
+        * @since 1.27
+        *
+        * @todo: inject some kind of connection manager that is aware of the target wiki,
+        * instead of injecting a LoadBalancer.
+        *
+        * @param LoadBalancer $dbLoadBalancer
+        */
+       public function __construct( LoadBalancer $dbLoadBalancer ) {
+               $this->dbLoadBalancer = $dbLoadBalancer;
        }
 
        /**
@@ -67,11 +73,11 @@ class DBSiteStore implements SiteStore {
        protected function loadSites() {
                $this->sites = new SiteList();
 
-               $dbr = wfGetDB( DB_SLAVE );
+               $dbr = $this->dbLoadBalancer->getConnection( DB_SLAVE );
 
                $res = $dbr->select(
                        'sites',
-                       array(
+                       [
                                'site_id',
                                'site_global_key',
                                'site_type',
@@ -83,10 +89,10 @@ class DBSiteStore implements SiteStore {
                                'site_data',
                                'site_forward',
                                'site_config',
-                       ),
+                       ],
                        '',
                        __METHOD__,
-                       array( 'ORDER BY' => 'site_global_key' )
+                       [ 'ORDER BY' => 'site_global_key' ]
                );
 
                foreach ( $res as $row ) {
@@ -108,12 +114,12 @@ class DBSiteStore implements SiteStore {
                // Batch load the local site identifiers.
                $ids = $dbr->select(
                        'site_identifiers',
-                       array(
+                       [
                                'si_site',
                                'si_type',
                                'si_key',
-                       ),
-                       array(),
+                       ],
+                       [],
                        __METHOD__
                );
 
@@ -124,6 +130,8 @@ class DBSiteStore implements SiteStore {
                                $this->sites->setSite( $site );
                        }
                }
+
+               $this->dbLoadBalancer->reuseConnection( $dbr );
        }
 
        /**
@@ -153,7 +161,7 @@ class DBSiteStore implements SiteStore {
         * @return bool Success indicator
         */
        public function saveSite( Site $site ) {
-               return $this->saveSites( array( $site ) );
+               return $this->saveSites( [ $site ] );
        }
 
        /**
@@ -170,21 +178,21 @@ class DBSiteStore implements SiteStore {
                        return true;
                }
 
-               $dbw = wfGetDB( DB_MASTER );
+               $dbw = $this->dbLoadBalancer->getConnection( DB_MASTER );
 
                $dbw->startAtomic( __METHOD__ );
 
                $success = true;
 
-               $internalIds = array();
-               $localIds = array();
+               $internalIds = [];
+               $localIds = [];
 
                foreach ( $sites as $site ) {
                        if ( $site->getInternalId() !== null ) {
                                $internalIds[] = $site->getInternalId();
                        }
 
-                       $fields = array(
+                       $fields = [
                                // Site data
                                'site_global_key' => $site->getGlobalId(), // TODO: check not null
                                'site_type' => $site->getType(),
@@ -198,12 +206,12 @@ class DBSiteStore implements SiteStore {
                                // Site config
                                'site_forward' => $site->shouldForward() ? 1 : 0,
                                'site_config' => serialize( $site->getExtraConfig() ),
-                       );
+                       ];
 
                        $rowId = $site->getInternalId();
                        if ( $rowId !== null ) {
                                $success = $dbw->update(
-                                       'sites', $fields, array( 'site_id' => $rowId ), __METHOD__
+                                       'sites', $fields, [ 'site_id' => $rowId ], __METHOD__
                                ) && $success;
                        } else {
                                $rowId = $dbw->nextSequenceValue( 'sites_site_id_seq' );
@@ -214,15 +222,15 @@ class DBSiteStore implements SiteStore {
 
                        foreach ( $site->getLocalIds() as $idType => $ids ) {
                                foreach ( $ids as $id ) {
-                                       $localIds[] = array( $rowId, $idType, $id );
+                                       $localIds[] = [ $rowId, $idType, $id ];
                                }
                        }
                }
 
-               if ( $internalIds !== array() ) {
+               if ( $internalIds !== [] ) {
                        $dbw->delete(
                                'site_identifiers',
-                               array( 'si_site' => $internalIds ),
+                               [ 'si_site' => $internalIds ],
                                __METHOD__
                        );
                }
@@ -230,17 +238,19 @@ class DBSiteStore implements SiteStore {
                foreach ( $localIds as $localId ) {
                        $dbw->insert(
                                'site_identifiers',
-                               array(
+                               [
                                        'si_site' => $localId[0],
                                        'si_type' => $localId[1],
                                        'si_key' => $localId[2],
-                               ),
+                               ],
                                __METHOD__
                        );
                }
 
                $dbw->endAtomic( __METHOD__ );
 
+               $this->dbLoadBalancer->reuseConnection( $dbw );
+
                $this->reset();
 
                return $success;
@@ -263,13 +273,15 @@ class DBSiteStore implements SiteStore {
         * @return bool Success
         */
        public function clear() {
-               $dbw = wfGetDB( DB_MASTER );
+               $dbw = $this->dbLoadBalancer->getConnection( DB_MASTER );
 
                $dbw->startAtomic( __METHOD__ );
                $ok = $dbw->delete( 'sites', '*', __METHOD__ );
                $ok = $dbw->delete( 'site_identifiers', '*', __METHOD__ ) && $ok;
                $dbw->endAtomic( __METHOD__ );
 
+               $this->dbLoadBalancer->reuseConnection( $dbw );
+
                $this->reset();
 
                return $ok;