MDL-27120 backup: fixed docblock and code cleanup

This commit is contained in:
Rajesh Taneja
2012-05-29 16:22:45 +08:00
parent 7f98b12f91
commit e7b24943e6
6 changed files with 167 additions and 84 deletions
+21 -12
View File
@@ -27,17 +27,18 @@
defined('MOODLE_INTERNAL') || die();
// Cache for storing link encoders, so that we don't need to call
// register_link_encoders each time backup_xml_transformer is constructed
// TODO MDL-25290 replace global with MUC code.
global $LINKS_ENCODERS_CACHE;
$LINKS_ENCODERS_CACHE = array();
/**
* Class implementing the @xml_contenttrasnformed logic to be applied in moodle2 backups
*
* TODO: Finish phpdocs
*/
// cache for storing link encoders, so that we don't need to call
// register_link_encoders each time backup_xml_transformer is constructed
global $LINKS_ENCODERS_CACHE;
$LINKS_ENCODERS_CACHE = array();
class backup_xml_transformer extends xml_contenttransformer {
private $absolute_links_encoders; // array of static methods to be called in order to
@@ -47,18 +48,13 @@ class backup_xml_transformer extends xml_contenttransformer {
private $unicoderegexp; // to know if the site supports unicode regexp
public function __construct($courseid) {
global $LINKS_ENCODERS_CACHE;
$this->absolute_links_encoders = array();
$this->courseid = $courseid;
// Check if we support unicode modifiers in regular expressions
$this->unicoderegexp = @preg_match('/\pL/u', 'a'); // This will fail silently, returning false,
// if regexp libraries don't support unicode
// Register all the available content link encoders
if (empty($LINKS_ENCODERS_CACHE)) {
$LINKS_ENCODERS_CACHE = $this->register_link_encoders();
}
$this->absolute_links_encoders = $LINKS_ENCODERS_CACHE;
$this->absolute_links_encoders = $this->register_link_encoders();
}
public function process($content) {
@@ -142,7 +138,19 @@ class backup_xml_transformer extends xml_contenttransformer {
return $result;
}
/**
* Register all available content link encoders
*
* @return array encoder
* @todo MDL-25290 replace LINKS_ENCODERS_CACHE global with MUC code
*/
private function register_link_encoders() {
global $LINKS_ENCODERS_CACHE;
// If encoder is linked, then return cached encoder.
if (!empty($LINKS_ENCODERS_CACHE)) {
return $LINKS_ENCODERS_CACHE;
}
$encoders = array();
// Add the course encoder
@@ -171,6 +179,7 @@ class backup_xml_transformer extends xml_contenttransformer {
// Add local encodes
// TODO: Any interest? 1.9 never had that.
$LINKS_ENCODERS_CACHE = $encoders;
return $encoders;
}
}
+132 -32
View File
@@ -28,8 +28,38 @@
* TODO: Finish phpdocs
*/
abstract class restore_dbops {
static $BACKUP_IDS_CACHE = array();
static $BACKUP_IDS_EXIST = array();
/**
* Keep cache of backup records.
* @var array
* @todo MDL-25290 static should be replaced with MUC code.
*/
private static $backupidscache = array();
/**
* Keep track of backup ids which are cached.
* @var array
* @todo MDL-25290 static should be replaced with MUC code.
*/
private static $backupidsexist = array();
/**
* Count is expensive, so manually keeping track of
* backupidscache, to avoid memory issues.
* @var int
* @todo MDL-25290 static should be replaced with MUC code.
*/
private static $backupidscachesize = 2048;
/**
* Count is expensive, so manually keeping track of
* backupidsexist, to avoid memory issues.
* @var int
* @todo MDL-25290 static should be replaced with MUC code.
*/
private static $backupidsexistsize = 10240;
/**
* Slice backupids cache to add more data.
* @var int
* @todo MDL-25290 static should be replaced with MUC code.
*/
private static $backupidsslice = 512;
/**
* Return one array containing all the tasks that have been included
@@ -153,61 +183,131 @@ abstract class restore_dbops {
return $problems;
}
/**
* Return cached backup id's
*
* @param int $restoreid id of backup
* @param string $itemname name of the item
* @param int $itemid id of item
* @return array backup id's
* @todo MDL-25290 replace static backupids* with MUC code
*/
protected static function get_backup_ids_cached($restoreid, $itemname, $itemid) {
global $DB;
$key = "$itemid $itemname $restoreid";
if (!isset(self::$BACKUP_IDS_EXIST[$key])) {
return false;
// If record exists in cache then return.
if (isset(self::$backupidsexist[$key]) && isset(self::$backupidscache[$key])) {
// Return a copy of cached data, to avoid any alterations in cached data.
return clone self::$backupidscache[$key];
}
if (isset(self::$BACKUP_IDS_CACHE[$key])) {
return self::$BACKUP_IDS_CACHE[$key];
// Clean cache, if it's full.
if (self::$backupidscachesize <= 0) {
// Remove some records, to keep memory in limit.
self::$backupidscache = array_slice(self::$backupidscache, self::$backupidsslice, null, true);
self::$backupidscachesize = self::$backupidscachesize + self::$backupidsslice;
}
if (self::$backupidsexistsize <= 0) {
self::$backupidsexist = array_slice(self::$backupidsexist, self::$backupidsslice, null, true);
self::$backupidsexistsize = self::$backupidsexistsize + self::$backupidsslice;
}
// Retrive record from database.
$record = array(
'backupid' => $restoreid,
'itemname' => $itemname,
'itemid' => $itemid
);
if (count(self::$BACKUP_IDS_CACHE) > 2048) {
$BACKUP_IDS_CACHE = array();
if ($dbrec = $DB->get_record('backup_ids_temp', $record)) {
self::$backupidsexist[$key] = $dbrec->id;
self::$backupidscache[$key] = $dbrec;
self::$backupidscachesize--;
self::$backupidsexistsize--;
return $dbrec;
} else {
return false;
}
return self::$BACKUP_IDS_CACHE[$key] = $DB->get_record('backup_ids_temp', $record);
}
/**
* Cache backup ids'
*
* @param int $restoreid id of backup
* @param string $itemname name of the item
* @param int $itemid id of item
* @param array $extrarecord extra record which needs to be updated
* @return void
* @todo MDL-25290 replace static BACKUP_IDS_* with MUC code
*/
protected static function set_backup_ids_cached($restoreid, $itemname, $itemid, $extrarecord) {
global $DB;
$key = "$itemid $itemname $restoreid";
if (!isset(self::$BACKUP_IDS_EXIST[$key])) {
$record = array(
'backupid' => $restoreid,
'itemname' => $itemname,
'itemid' => $itemid,
'newitemid' => 0,
'parentitemid' => null,
'info' => null
);
$record = array_merge($record, $extrarecord);
$record['id'] = $DB->insert_record_raw('backup_ids_temp', $record);
self::$BACKUP_IDS_EXIST[$key] = $record['id'];
if (count(self::$BACKUP_IDS_CACHE) < 2048) {
// cache new records if we haven't got many yet
self::$BACKUP_IDS_CACHE[$key] = (object) $record;
$record = array(
'backupid' => $restoreid,
'itemname' => $itemname,
'itemid' => $itemid,
);
// If record is not cached then add one.
if (!isset(self::$backupidsexist[$key])) {
// If we have this record in db, then just update this.
if ($existingrecord = $DB->get_record('backup_ids_temp', $record)) {
self::$backupidsexist[$key] = $existingrecord->id;
self::$backupidsexistsize--;
self::update_backup_cached_record($record, $extrarecord, $key, $existingrecord);
} else {
// Add new record to cache and db.
$recorddefault = array (
'newitemid' => 0,
'parentitemid' => null,
'info' => null);
$record = array_merge($record, $recorddefault, $extrarecord);
$record['id'] = $DB->insert_record('backup_ids_temp', $record);
self::$backupidsexist[$key] = $record['id'];
self::$backupidsexistsize--;
if (self::$backupidscachesize > 0) {
// Cache new records if we haven't got many yet.
self::$backupidscache[$key] = (object) $record;
self::$backupidscachesize--;
}
}
} else {
if (!empty($extrarecord)) {
$extrarecord['id'] = self::$BACKUP_IDS_EXIST[$key];
$DB->update_record('backup_ids_temp', $extrarecord);
if (isset(self::$BACKUP_IDS_CACHE[$key])) {
$record = array_merge((array)self::$BACKUP_IDS_CACHE[$key], $extrarecord);
self::$BACKUP_IDS_CACHE[$key] = (object) $record;
self::update_backup_cached_record($record, $extrarecord, $key);
}
}
/**
* Updates existing backup record
*
* @param array $record record which needs to be updated
* @param array $extrarecord extra record which needs to be updated
* @param string $key unique key which is used to identify cached record
* @param stdClass $existingrecord (optional) existing record
*/
protected static function update_backup_cached_record($record, $extrarecord, $key, $existingrecord = null) {
global $DB;
// Update only if extrarecord is not empty.
if (!empty($extrarecord)) {
$extrarecord['id'] = self::$backupidsexist[$key];
$DB->update_record('backup_ids_temp', $extrarecord);
// Update existing cache or add new record to cache.
if (isset(self::$backupidscache[$key])) {
$record = array_merge((array)self::$backupidscache[$key], $extrarecord);
self::$backupidscache[$key] = (object) $record;
} else if (self::$backupidscachesize > 0) {
if ($existingrecord) {
self::$backupidscache[$key] = $existingrecord;
} else {
// Retrive record from database and cache updated records.
self::$backupidscache[$key] = $DB->get_record('backup_ids_temp', $record);
}
$record = array_merge((array)self::$backupidscache[$key], $extrarecord);
self::$backupidscache[$key] = (object) $record;
self::$backupidscachesize--;
}
}
}
+7 -7
View File
@@ -62,7 +62,7 @@ abstract class base_plan implements checksumable, executable {
foreach ($task->get_settings() as $key => $setting) {
if (!in_array($setting, $this->settings)) {
$name = $setting->get_name();
if(!isset($this->settings[$name])) {
if (!isset($this->settings[$name])) {
$this->settings[$name] = $setting;
} else {
throw new base_plan_exception('multiple_settings_by_name_found', $name);
@@ -89,17 +89,17 @@ abstract class base_plan implements checksumable, executable {
/**
* return one setting by name, useful to request root/course settings
* that are, by definition, unique by name. Throws exception if multiple
* are found
* that are, by definition, unique by name.
*
* TODO: Change this to string indexed array for quicker lookup. Not critical
* @param string $name name of the setting
* @throws base_plan_exception if setting name is not found.
*/
public function get_setting($name) {
$result = null;
if(isset($this->settings[$name])) {
$result = $this->settings[$name];
if (isset($this->settings[$name])) {
$result = $this->settings[$name];
} else {
throw new base_plan_exception('setting_by_name_not_found', $name);
throw new base_plan_exception('setting_by_name_not_found', $name);
}
return $result;
}
+4 -4
View File
@@ -147,9 +147,9 @@ class backup_ui_stage_initial extends backup_ui_stage {
}
}
}
// Add all settings at once
// Add all settings at once.
$form->add_settings($add_settings);
// Add dependencies
// Add dependencies.
foreach ($dependencies as $depsetting) {
$form->add_dependencies($depsetting);
}
@@ -265,8 +265,8 @@ class backup_ui_stage_schema extends backup_ui_stage {
}
}
$form->add_settings($add_settings);
foreach($dependencies as $depsetting) {
$form->add_dependencies($depsetting);
foreach ($dependencies as $depsetting) {
$form->add_dependencies($depsetting);
}
$this->stageform = $form;
}
+2 -20
View File
@@ -136,32 +136,14 @@ abstract class base_moodleform extends moodleform {
* @return bool
*/
function add_setting(backup_setting $setting, base_task $task=null) {
global $OUTPUT;
// If the setting cant be changed or isn't visible then add it as a fixed setting.
if (!$setting->get_ui()->is_changeable() || $setting->get_visibility() != backup_setting::VISIBLE) {
return $this->add_fixed_setting($setting, $task);
}
// First add the formatting for this setting
$this->add_html_formatting($setting);
// The call the add method with the get_element_properties array
call_user_func_array(array($this->_form, 'addElement'), $setting->get_ui()->get_element_properties($task, $OUTPUT));
$this->_form->setDefault($setting->get_ui_name(), $setting->get_value());
if ($setting->has_help()) {
list($identifier, $component) = $setting->get_help();
$this->_form->addHelpButton($setting->get_ui_name(), $identifier, $component);
}
$this->_form->addElement('html', html_writer::end_tag('div'));
return true;
return $this->add_settings(array(array($setting, $task)));
}
/**
* Adds multiple backup_settings as elements to the form
* @param array $settingstasks Consists of array($setting, $task) elements
* @return bool
*/
function add_settings(array $settingstasks) {
public function add_settings(array $settingstasks) {
global $OUTPUT;
$defaults = array();
@@ -149,15 +149,7 @@ class progressive_parser {
* handling parser paths, see MDL-24381
*/
public static function dirname($path) {
static $cache = array();
if (!isset($cache[$path])) {
if (count($cache) > 4096)
$cache = array();
$cache[$path] = str_replace('\\', '/', dirname($path));
}
return $cache[$path];
return str_replace('\\', '/', dirname($path));
}
// Protected API starts here