From: Aaron Schulz Date: Wed, 24 Sep 2008 18:38:25 +0000 (+0000) Subject: Add insertRandom() with failover back. Currently not used just yet. X-Git-Tag: 1.31.0-rc.0~45108 X-Git-Url: http://git.cyclocoop.org/%24action?a=commitdiff_plain;h=4b22cb1c928b4d608551b5cb815646508e6a23da;p=lhc%2Fweb%2Fwiklou.git Add insertRandom() with failover back. Currently not used just yet. --- diff --git a/includes/ExternalStore.php b/includes/ExternalStore.php index e2b7856673..272bcfc000 100644 --- a/includes/ExternalStore.php +++ b/includes/ExternalStore.php @@ -14,7 +14,7 @@ */ class ExternalStore { /* Fetch data from given URL */ - static function fetchFromURL($url) { + static function fetchFromURL( $url ) { global $wgExternalStores; if( !$wgExternalStores ) @@ -44,7 +44,7 @@ class ExternalStore { $class = 'ExternalStore' . ucfirst( $proto ); /* Any custom modules should be added to $wgAutoLoadClasses for on-demand loading */ - if( !class_exists( $class ) ){ + if( !class_exists( $class ) ) { return false; } @@ -66,4 +66,47 @@ class ExternalStore { return $store->store( $params, $data ); } } + + /** + * Like insert() above, but does more of the work for us. + * 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 + */ + public static function randomInsert( $data ) { + global $wgDefaultExternalStore; + $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 ); + if ( $store === false ) { + throw new MWException( "Invalid external storage protocol - $storeUrl" ); + } + try { + $url = $store->store( $params, $data ); // Try to save the object + } catch ( DBConnectionError $error ) { + $url = false; + } + if ( $url ) { + return $url; // Done! + } else { + 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" ); + } + } + // All stores failed + if ( $error ) { + // Rethrow the last connection error + throw $error; + } else { + throw new MWException( "Unable to store text to external storage" ); + } + } } diff --git a/includes/ExternalStoreDB.php b/includes/ExternalStoreDB.php index 549412d18b..f2e80c98fe 100644 --- a/includes/ExternalStoreDB.php +++ b/includes/ExternalStoreDB.php @@ -56,7 +56,7 @@ class ExternalStoreDB { * Fetch data from given URL * @param string $url An url of the form DB://cluster/id or DB://cluster/id/itemid for concatened storage. */ - function fetchFromURL($url) { + function fetchFromURL( $url ) { $path = explode( '/', $url ); $cluster = $path[2]; $id = $path[3]; @@ -122,12 +122,14 @@ class ExternalStoreDB { * @return string URL */ function store( $cluster, $data ) { - $fname = 'ExternalStoreDB::store'; - - $dbw =& $this->getMaster( $cluster ); - + $dbw = $this->getMaster( $cluster ); + if( !$dbw ) { + return false; + } $id = $dbw->nextSequenceValue( 'blob_blob_id_seq' ); - $dbw->insert( $this->getTable( $dbw ), array( 'blob_id' => $id, 'blob_text' => $data ), $fname ); + $dbw->insert( $this->getTable( $dbw ), + array( 'blob_id' => $id, 'blob_text' => $data ), + __METHOD__ ); $id = $dbw->insertId(); if ( $dbw->getFlag( DBO_TRX ) ) { $dbw->immediateCommit();