[FileBackend] Made it easy to use registed file backend config in multi-write backends.
authorAaron <aschulz@wikimedia.org>
Wed, 9 May 2012 17:35:04 +0000 (10:35 -0700)
committerAaron <aschulz@wikimedia.org>
Wed, 9 May 2012 17:39:32 +0000 (10:39 -0700)
Change-Id: Idce8c06a56bd0debac5f2217bef89b4fe8bf5ba8

includes/filerepo/backend/FileBackendGroup.php
includes/filerepo/backend/FileBackendMultiWrite.php

index 69c227d..8bbc96d 100644 (file)
@@ -156,6 +156,21 @@ class FileBackendGroup {
                return $this->backends[$name]['instance'];
        }
 
+       /**
+        * Get the config array for a backend object with a given name
+        *
+        * @param $name string
+        * @return Array
+        * @throws MWException
+        */
+       public function config( $name ) {
+               if ( !isset( $this->backends[$name] ) ) {
+                       throw new MWException( "No backend defined with the name `$name`." );
+               }
+               $class = $this->backends[$name]['class'];
+               return array( 'class' => $class ) + $this->backends[$name]['config'];
+       }
+
        /**
         * Get an appropriate backend object from a storage path
         *
index 769aef6..8cb32fe 100644 (file)
@@ -57,6 +57,9 @@ class FileBackendMultiWrite extends FileBackend {
         *                     FileBackendStore class, but with these additional settings:
         *                         'class'         : The name of the backend class
         *                         'isMultiMaster' : This must be set for one backend.
+        *                         'template:      : If given a backend name, this will use
+        *                                           the config of that backend as a template.
+        *                                           Values specified here take precedence.
         *     'syncChecks'  : Integer bitfield of internal backend sync checks to perform.
         *                     Possible bits include self::CHECK_SIZE and self::CHECK_TIME.
         *                     The checks are done before allowing any file operations.
@@ -68,6 +71,11 @@ class FileBackendMultiWrite extends FileBackend {
                // Construct backends here rather than via registration
                // to keep these backends hidden from outside the proxy.
                foreach ( $config['backends'] as $index => $config ) {
+                       if ( isset( $config['template'] ) ) {
+                               // Config is just a modified version of a registered backend's.
+                               // This should only be used when that config is used only be this backend.
+                               $config = $config + FileBackendGroup::singleton()->config( $config['template'] );
+                       }
                        $name = $config['name'];
                        if ( isset( $namesUsed[$name] ) ) { // don't break FileOp predicates
                                throw new MWException( "Two or more backends defined with the name $name." );