9use InvalidArgumentException;
39 throw new InvalidArgumentException(
"FileBackendGroup required in 'fbGroup' field." );
41 $this->fbGroup =
$params[
'fbGroup'];
52 $be = $this->fbGroup->backendFromPath(
$url );
56 return $be->getFileContents( [
'src' =>
$url ] );
71 foreach ( $urls as
$url ) {
72 $be = $this->fbGroup->backendFromPath(
$url );
74 $pathsByBackend[$be->getName()][] =
$url;
78 foreach ( $pathsByBackend as $backendName => $paths ) {
79 $be = $this->fbGroup->get( $backendName );
80 $blobs += $be->getFileContentsMulti( [
'srcs' => $paths ] );
87 public function store( $backend, $data ) {
88 $be = $this->fbGroup->get( $backend );
90 $rand = \Wikimedia\base_convert( (
string)mt_rand( 0, 46655 ), 10, 36, 3 );
93 $id = str_pad( $gen->newTimestampedUID128( 32 ), 26,
'0', STR_PAD_LEFT );
95 $domain = $this->isDbDomainExplicit
98 : WikiMap::getWikiIdFromDbDomain( $this->dbDomain );
99 $url = $be->getContainerStoragePath(
'data' ) .
'/' . rawurlencode( $domain );
102 ?
"/{$rand[0]}/{$rand[1]}/{$rand[2]}/{$id}"
103 :
"/{$rand[0]}/{$rand[1]}/{$id}";
105 $be->prepare( [
'dir' => dirname(
$url ),
'noAccess' => 1,
'noListing' => 1 ] );
106 $status = $be->create( [
'dst' =>
$url,
'content' => $data ] );
108 if ( $status->isOK() ) {
117 if ( parent::isReadOnly( $backend ) ) {
121 $be = $this->fbGroup->get( $backend );
123 return $be->isReadOnly();
128class_alias( ExternalStoreMwstore::class,
'ExternalStoreMwstore' );