X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2FExternalStore.php;h=6a7790793f1f44f0dda5af555843c561142f00e7;hb=e46c9a91fd9ab6f9e1e41ffbfb31551a92b95307;hp=e73b9a1bd6a448648d35593328201f349d9ba610;hpb=7b61c1972ab9afd405115a027e0925bbb2632b6e;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/ExternalStore.php b/includes/ExternalStore.php index e73b9a1bd6..6a7790793f 100644 --- a/includes/ExternalStore.php +++ b/includes/ExternalStore.php @@ -13,8 +13,20 @@ * @ingroup ExternalStorage */ class ExternalStore { - /* Fetch data from given URL */ - static function fetchFromURL( $url ) { + var $mParams; + + function __construct( $params = array() ) { + $this->mParams = $params; + } + + /** + * Fetch data from given URL + * + * @param $url String: The URL of the text to get + * @param $params Array: associative array of parameters for the ExternalStore object. + * @return The text stored or false on error + */ + static function fetchFromURL( $url, $params = array() ) { global $wgExternalStores; if( !$wgExternalStores ) @@ -25,16 +37,20 @@ 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 + * + * @param $proto String: type of external storage, should be a value in $wgExternalStores + * @param $params Array: associative array of parameters for the ExternalStore object. + * @return ExternalStore subclass or false on error */ - static function getStoreObject( $proto ) { + static function getStoreObject( $proto, $params = array() ) { global $wgExternalStores; if( !$wgExternalStores ) return false; @@ -48,18 +64,18 @@ class ExternalStore { return false; } - return new $class(); + return new $class($params); } /** * Store a data item to an external store, identified by a partial URL * The protocol part is used to identify the class, the rest is passed to the * class itself as a parameter. - * Returns the URL of the stored data item, or false on error + * @return 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 { @@ -72,35 +88,49 @@ class ExternalStore { * This function does not need a url param, it builds it by * itself. It also fails-over to the next possible clusters. * - * @param string $data - * Returns the URL of the stored data item, or false on error + * @param $data String + * @param $storageParams Array: associative array of parameters for the ExternalStore object. + * @return The URL of the stored data item, or false on error */ - public static function randomInsert( $data ) { + public static function insertToDefault( $data, $storageParams = array() ) { global $wgDefaultExternalStore; - $tryStorages = (array)$wgDefaultExternalStore; - // Do not wait and do second retry per master if we - // have other active cluster masters to try instead. - $retry = count($tryStorages) > 1 ? false : true; - while ( count($tryStorages) > 0 ) { - $index = mt_rand(0, count( $tryStorages ) - 1); - $storeUrl = $tryStorages[$index]; + $tryStores = (array)$wgDefaultExternalStore; + $error = false; + while ( count( $tryStores ) > 0 ) { + $index = mt_rand(0, count( $tryStores ) - 1); + $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" ); - return false; + } + try { + $url = $store->store( $params, $data ); // Try to save the object + } catch ( DBConnectionError $error ) { + $url = false; + } catch( DBQueryError $error ) { + $url = false; + } + if ( $url ) { + return $url; // Done! } else { - $url = $store->store( $params, $data, $retry ); // Try to save the object - if ( $url ) { - return $url; // Done! - } else { - unset( $tryStorages[$index] ); // Don't try this one again! - sort( $tryStorages ); // Must have consecutive keys - wfDebugLog( 'ExternalStorage', "Unable to store text to external storage $storeUrl" ); - } + unset( $tryStores[$index] ); // Don't try this one again! + $tryStores = array_values( $tryStores ); // Must have consecutive keys + wfDebugLog( 'ExternalStorage', "Unable to store text to external storage $storeUrl" ); } } - throw new MWException( "Unable to store text to external storage" ); - return false; // All cluster masters dead :( + // All stores failed + if ( $error ) { + // Rethrow the last connection error + throw $error; + } else { + 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 ) ); } }