Add external repositories support for Revision, would
authorDomas Mituzas <midom@users.mediawiki.org>
Mon, 18 Apr 2005 17:21:27 +0000 (17:21 +0000)
committerDomas Mituzas <midom@users.mediawiki.org>
Mon, 18 Apr 2005 17:21:27 +0000 (17:21 +0000)
follow url if flag on text set, allows pluggable storage
modules and migration from databases to somewhere
else (huh, other databases ;-)

includes/DefaultSettings.php
includes/ExternalStore.php [new file with mode: 0644]
includes/ExternalStoreHttp.php [new file with mode: 0644]
includes/Revision.php

index e4a7067..549f2aa 100644 (file)
@@ -1278,6 +1278,18 @@ $wgEnableSorbs = true;
  */
 $wgCountCategorizedImagesAsUsed = false;
 
+/** 
+ * External stores allow including content 
+ * from non database sources following URL links
+ * 
+ * Short names of ExternalStore classes may be specified in an array here:
+ * $wgExternalStores = array("http","file","custom")...
+ * 
+ * CAUTION: Access to database might lead to code execution
+ */
+$wgExternalStores = false;
+
+
 } else {
        die();
 }
diff --git a/includes/ExternalStore.php b/includes/ExternalStore.php
new file mode 100644 (file)
index 0000000..78e1b84
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+/**
+ * 
+ * @package MediaWiki
+ *
+ * Constructor class for data kept in external repositories
+ *
+ * External repositories might be populated by maintenance/async 
+ * scripts, thus partial moving of data may be possible, as well 
+ * as possibility to have any storage format (i.e. for archives)
+ *
+ */
+class ExternalStore {
+       /* Fetch data from given URL */
+       function fetchFromURL($url) {
+               global $wgExternalStores;
+
+               if (!$wgExternalStores) 
+                       return false;
+
+               @list($proto,$path)=explode('://',$url,2);
+               /* Bad URL */
+               if ($path=="") 
+                       return false;
+               /* Protocol not enabled */
+               if (!in_array( $proto, $wgExternalStores ))
+                       return false;
+
+               $class='ExternalStore'.ucfirst($proto);
+               /* Preloaded modules might exist, especially ones serving multiple protocols */
+               if (!class_exists($class)) {
+                       if (!include_once($class.'.php'))
+                               return false;   
+               }
+               $store=new $class();
+               return $store->fetchFromURL($url);
+       }
+
+       /* XXX: may require other methods, for store, delete, 
+        * whatever, for initial ext storage  
+        */
+}
+?>
diff --git a/includes/ExternalStoreHttp.php b/includes/ExternalStoreHttp.php
new file mode 100644 (file)
index 0000000..d7c1cc8
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+/**
+ * 
+ * @package MediaWiki
+ *
+ * Example class for HTTP accessable external objects
+ *
+ */
+class ExternalStoreHttp {
+       /* Fetch data from given URL */
+       function fetchFromURL($url) {
+        ini_set( "allow_url_fopen", true );
+        $ret = file_get_contents( $url );
+        ini_set( "allow_url_fopen", false );
+               return $ret;
+       }
+
+       /* XXX: may require other methods, for store, delete, 
+        * whatever, for initial ext storage  
+        */
+}
+?>
index d6418e3..67eb4be 100644 (file)
@@ -378,6 +378,18 @@ class Revision {
                        return false;
                }
 
+               # Use external methods for external objects, text in table is URL-only then
+               if ( in_array( 'external', $flags ) ) {
+                       $url=$text;
+                       @list($proto,$path)=explode('://',$url,2);
+                       if ($path=="") {
+                               wfProfileOut( $fname );
+                               return false;
+                       }
+                       require_once('ExternalStore.php');
+                       $text=ExternalStore::fetchFromURL($url);
+               }
+
                if( in_array( 'gzip', $flags ) ) {
                        # Deal with optional compression of archived pages.
                        # This can be done periodically via maintenance/compressOld.php, and
@@ -555,4 +567,4 @@ class Revision {
        }
        
 }
-?>
\ No newline at end of file
+?>