Add insertRandom() with failover back. Currently not used just yet.
authorAaron Schulz <aaron@users.mediawiki.org>
Wed, 24 Sep 2008 18:38:25 +0000 (18:38 +0000)
committerAaron Schulz <aaron@users.mediawiki.org>
Wed, 24 Sep 2008 18:38:25 +0000 (18:38 +0000)
includes/ExternalStore.php
includes/ExternalStoreDB.php

index e2b7856..272bcfc 100644 (file)
@@ -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" );
+               }
+       }
 }
index 549412d..f2e80c9 100644 (file)
@@ -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();