From: Andrew Garrett Date: Thu, 26 Mar 2009 13:28:22 +0000 (+0000) Subject: Allow storage of blobs to ES on foreign wikis, by calling ExternalStore::storeToForei... X-Git-Tag: 1.31.0-rc.0~42343 X-Git-Url: http://git.cyclocoop.org/%7B%24www_url%7Dadmin/compta/pie.php?a=commitdiff_plain;h=76635cbaf012d028c6f3f78fe2de8bfa5f2276ff;p=lhc%2Fweb%2Fwiklou.git Allow storage of blobs to ES on foreign wikis, by calling ExternalStore::storeToForeignDefault, related changes including adding an associative array parameter to the ExternalStore constructor. Currently this parameter is just used to specify on which wiki the external store is wanted, but could be expanded in future. --- diff --git a/includes/ExternalStore.php b/includes/ExternalStore.php index 1e750bb5fa..d759d67097 100644 --- a/includes/ExternalStore.php +++ b/includes/ExternalStore.php @@ -13,8 +13,14 @@ * @ingroup ExternalStorage */ class ExternalStore { + var $mParams; + + function __construct( $params = array() ) { + $this->mParams = $params; + } + /* Fetch data from given URL */ - static function fetchFromURL( $url ) { + static function fetchFromURL( $url, $params = array() ) { global $wgExternalStores; if( !$wgExternalStores ) @@ -25,16 +31,16 @@ class ExternalStore { if( $path == '' ) return false; - $store = self::getStoreObject( $proto ); + $store = self::getStoreObject( $proto, $params ); if ( $store === false ) return false; return $store->fetchFromURL( $url ); } /** - * Get an external store object of the given type + * Get an external store object of the given type, with the given parameters */ - static function getStoreObject( $proto ) { + static function getStoreObject( $proto, $params = array() ) { global $wgExternalStores; if( !$wgExternalStores ) return false; @@ -48,7 +54,7 @@ class ExternalStore { return false; } - return new $class(); + return new $class($params); } /** @@ -57,9 +63,9 @@ class ExternalStore { * class itself as a parameter. * Returns the URL of the stored data item, or false on error */ - static function insert( $url, $data ) { + static function insert( $url, $data, $params = array() ) { list( $proto, $params ) = explode( '://', $url, 2 ); - $store = self::getStoreObject( $proto ); + $store = self::getStoreObject( $proto, $params ); if ( $store === false ) { return false; } else { @@ -73,9 +79,10 @@ class ExternalStore { * itself. It also fails-over to the next possible clusters. * * @param string $data + * @param array $params Associative array of parameters for the ExternalStore object. * Returns the URL of the stored data item, or false on error */ - public static function insertToDefault( $data ) { + public static function insertToDefault( $data, $storageParams = array() ) { global $wgDefaultExternalStore; $tryStores = (array)$wgDefaultExternalStore; $error = false; @@ -84,7 +91,7 @@ class ExternalStore { $storeUrl = $tryStores[$index]; wfDebug( __METHOD__.": trying $storeUrl\n" ); list( $proto, $params ) = explode( '://', $storeUrl, 2 ); - $store = self::getStoreObject( $proto ); + $store = self::getStoreObject( $proto, $storageParams ); if ( $store === false ) { throw new MWException( "Invalid external storage protocol - $storeUrl" ); } @@ -111,4 +118,9 @@ class ExternalStore { throw new MWException( "Unable to store text to external storage" ); } } + + /** Like insertToDefault, but inserts on another wiki */ + public static function insertToForeignDefault( $data, $wiki ) { + return self::insertToDefault( $data, array( 'wiki' => $wiki ) ); + } } diff --git a/includes/ExternalStoreDB.php b/includes/ExternalStoreDB.php index 9fa7d1b170..9aa3af85a6 100644 --- a/includes/ExternalStoreDB.php +++ b/includes/ExternalStoreDB.php @@ -26,21 +26,29 @@ $wgExternalBlobCache = array(); */ class ExternalStoreDB { + function __construct( $params = array() ) { + $this->mParams = $params; + } + /** @todo Document.*/ function &getLoadBalancer( $cluster ) { - return wfGetLBFactory()->getExternalLB( $cluster ); + $wiki = isset($this->mParams['wiki']) ? $this->mParams['wiki'] : false; + + return wfGetLBFactory()->getExternalLB( $cluster, $wiki ); } /** @todo Document.*/ function &getSlave( $cluster ) { + $wiki = isset($this->mParams['wiki']) ? $this->mParams['wiki'] : false; $lb =& $this->getLoadBalancer( $cluster ); - return $lb->getConnection( DB_SLAVE ); + return $lb->getConnection( DB_SLAVE, array(), $wiki ); } /** @todo Document.*/ function &getMaster( $cluster ) { + $wiki = isset($this->mParams['wiki']) ? $this->mParams['wiki'] : false; $lb =& $this->getLoadBalancer( $cluster ); - return $lb->getConnection( DB_MASTER ); + return $lb->getConnection( DB_MASTER, array(), $wiki ); } /** @todo Document.*/