* @defgroup ExternalStorage ExternalStorage
*/
+use MediaWiki\MediaWikiServices;
+
/**
* Interface for data storage in external repositories.
*
* @return ExternalStoreMedium|bool The store class or false on error
*/
public static function getStoreObject( $proto, array $params = [] ) {
- global $wgExternalStores;
-
- if ( !$wgExternalStores || !in_array( $proto, $wgExternalStores ) ) {
- return false; // protocol not enabled
- }
-
- $class = 'ExternalStore' . ucfirst( $proto );
-
- // Any custom modules should be added to $wgAutoLoadClasses for on-demand loading
- return class_exists( $class ) ? new $class( $params ) : false;
+ return MediaWikiServices::getInstance()
+ ->getExternalStoreFactory()
+ ->getStoreObject( $proto, $params );
}
/**
* @param array $urls The URLs of the text to get
* @return array Map from url to its data. Data is either string when found
* or false on failure.
+ * @throws MWException
*/
public static function batchFetchFromURLs( array $urls ) {
$batches = [];
if ( $store === false ) {
throw new MWException( "Invalid external storage protocol - $storeUrl" );
}
+
try {
- $url = $store->store( $path, $data ); // Try to save the object
+ if ( $store->isReadOnly( $path ) ) {
+ $msg = 'read only';
+ } else {
+ $url = $store->store( $path, $data );
+ if ( strlen( $url ) ) {
+ return $url; // a store accepted the write; done!
+ }
+ $msg = 'operation failed';
+ }
} catch ( Exception $error ) {
- $url = false;
- }
- if ( strlen( $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" );
+ $msg = 'caught exception';
}
+
+ 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 ($msg)" );
}
// All stores failed
if ( $error ) {