/** * @see ExternalStoreMedium::store() */ public function store($backend, $data) { $be = FileBackendGroup::singleton()->get($backend); if ($be instanceof FileBackend) { // Get three random base 36 characters to act as shard directories $rand = wfBaseConvert(mt_rand(0, 46655), 10, 36, 3); // Make sure ID is roughly lexicographically increasing for performance $id = str_pad(UIDGenerator::newTimestampedUID128(32), 26, '0', STR_PAD_LEFT); // Segregate items by wiki ID for the sake of bookkeeping $wiki = isset($this->params['wiki']) ? $this->params['wiki'] : wfWikiID(); $url = $be->getContainerStoragePath('data') . '/' . rawurlencode($wiki) . "/{$rand[0]}/{$rand[1]}/{$rand[2]}/{$id}"; $be->prepare(array('dir' => dirname($url), 'noAccess' => 1, 'noListing' => 1)); if ($be->create(array('dst' => $url, 'content' => $data))->isOK()) { return $url; } } return false; }