MDL-59700 filestorage: Rework repositories to avoid add_file_to_pool

For historical reasons repositories need to call add_file_to_pool
to sync file records. However now that a before_file_created hook
has been added additional information is needed by add_file_to_pool.

Ideally add_file_to_pool and friends will become private/protected,
so we need to remove all uses of it in core.

This patch adds some new methods to the file class to allow syncing
to be managed internally by the file and the file_storage class.
This commit is contained in:
Cameron Ball 2017-08-07 15:27:46 +08:00
parent 8243706542
commit 03756f0bdb
No known key found for this signature in database
GPG Key ID: 305B7F70214D810C
8 changed files with 53 additions and 13 deletions

View File

@ -1456,6 +1456,30 @@ class file_storage {
return $this->get_file_instance($newrecord);
}
/**
* Synchronise stored file from file.
*
* @param stored_file $file Stored file to synchronise.
* @param string $path Path to the file to synchronise from.
* @param stdClass $filerecord The file record from the database.
*/
public function synchronise_stored_file_from_file(stored_file $file, $path, $filerecord) {
list($contenthash, $filesize) = $this->add_file_to_pool($path, null, $filerecord);
$file->set_synchronized($contenthash, $filesize);
}
/**
* Synchronise stored file from string.
*
* @param stored_file $file Stored file to synchronise.
* @param string $content File content.
* @param stdClass $filerecord The file record from the database.
*/
public function synchronise_stored_file_from_string(stored_file $file, $content, $filerecord) {
list($contenthash, $filesize) = $this->add_string_to_pool($content, $filerecord);
$file->set_synchronized($contenthash, $filesize);
}
/**
* Create a new alias/shortcut file from file reference information
*

View File

@ -588,6 +588,24 @@ class stored_file {
return $this->fs->create_directory($this->file_record->contextid, $this->file_record->component, $this->file_record->filearea, $this->file_record->itemid, $filepath);
}
/**
* Set synchronised content from file.
*
* @param string $path Path to the file.
*/
public function set_synchronised_content_from_file($path) {
$this->fs->synchronise_stored_file_from_file($this, $path, $this->file_record);
}
/**
* Set synchronised content from content.
*
* @param string $content File content.
*/
public function set_synchronised_content_from_string($content) {
$this->fs->synchronise_stored_file_from_string($this, $content, $this->file_record);
}
/**
* Synchronize file if it is a reference and needs synchronizing
*

View File

@ -430,9 +430,7 @@ class repository_boxnet extends repository {
$result = $c->download_one($url, null, array('filepath' => $path, 'timeout' => $CFG->repositorysyncimagetimeout));
$info = $c->get_info();
if ($result === true && isset($info['http_code']) && $info['http_code'] == 200) {
$fs = get_file_storage();
list($contenthash, $filesize, $newfile) = $fs->add_file_to_pool($path);
$file->set_synchronized($contenthash, $filesize);
$file->set_synchronised_content_from_file($path);
return true;
}
}

View File

@ -662,9 +662,7 @@ class repository_dropbox extends repository {
]);
$info = $c->get_info();
if ($result === true && isset($info['http_code']) && $info['http_code'] == 200) {
$fs = get_file_storage();
list($contenthash, $filesize, ) = $fs->add_file_to_pool($saveas);
$file->set_synchronized($contenthash, $filesize);
$file->set_synchronised_content_from_file($saveas);
return true;
}
} catch (Exception $e) {

View File

@ -214,9 +214,7 @@ class repository_equella extends repository {
$path = $this->prepare_file('');
$result = $c->download_one($url, null, array('filepath' => $path, 'followlocation' => true, 'timeout' => $CFG->repositorysyncimagetimeout));
if ($result === true) {
$fs = get_file_storage();
list($contenthash, $filesize, $newfile) = $fs->add_file_to_pool($path);
$file->set_synchronized($contenthash, $filesize);
$file->set_synchronised_content_from_file($path);
return true;
}
} else {

View File

@ -577,7 +577,9 @@ class repository_filesystem extends repository {
$filesize = filesize($filepath);
} else {
// Copy file into moodle filepool (used to generate an image thumbnail).
list($contenthash, $filesize, $newfile) = $fs->add_file_to_pool($filepath);
$file->set_timemodified(filemtime($filepath));
$file->set_synchronised_content_from_file($filepath);
return true;
}
} else {
// Update only file size so file will NOT be copied into moodle filepool.

View File

@ -1757,9 +1757,7 @@ abstract class repository implements cacheable_object {
try {
$fileinfo = $this->get_file($file->get_reference());
if (isset($fileinfo['path'])) {
list($contenthash, $filesize, $newfile) = $fs->add_file_to_pool($fileinfo['path']);
// set this file and other similar aliases synchronised
$file->set_synchronized($contenthash, $filesize);
$file->set_synchronised_content_from_file($fileinfo['path']);
} else {
throw new moodle_exception('errorwhiledownload', 'repository', '', '');
}

View File

@ -3,6 +3,10 @@ information provided here is intended especially for developers. Full
details of the repository API are available on Moodle docs:
http://docs.moodle.org/dev/Repository_API
=== 3.4 ===
Repositories should no longer directly call file_system#add_file_to_pool or file_system#add_string_to_pool
instead they should call the stored_file method, set_synchronised_content_from_file or set_synchronised_content_from_string
=== 3.3 ===
The skydrive repository is deprecated - please migrate to the newer onedrive repository.