MDL-53425 blocklib: Perform deletion of block instances by chunk

This commit is contained in:
Jun Pataleta
2016-05-30 11:24:27 +08:00
parent eba73c81f1
commit d1654d9803
2 changed files with 33 additions and 23 deletions
+21 -11
View File
@@ -2061,21 +2061,31 @@ function blocks_delete_instance($instance, $nolongerused = false, $skipblockstab
function blocks_delete_instances($instanceids) {
global $DB;
$instances = $DB->get_recordset_list('block_instances', 'id', $instanceids);
foreach ($instances as $instance) {
blocks_delete_instance($instance, false, true);
$limit = 1000;
$count = count($instanceids);
$chunks = [$instanceids];
if ($count > $limit) {
$chunks = array_chunk($instanceids, $limit);
}
$instances->close();
$DB->delete_records_list('block_positions', 'blockinstanceid', $instanceids);
$DB->delete_records_list('block_instances', 'id', $instanceids);
// Perform deletion for each chunk.
foreach ($chunks as $chunk) {
$instances = $DB->get_recordset_list('block_instances', 'id', $chunk);
foreach ($instances as $instance) {
blocks_delete_instance($instance, false, true);
}
$instances->close();
$preferences = array();
foreach ($instanceids as $instanceid) {
$preferences[] = 'block' . $instanceid . 'hidden';
$preferences[] = 'docked_block_instance_' . $instanceid;
$DB->delete_records_list('block_positions', 'blockinstanceid', $chunk);
$DB->delete_records_list('block_instances', 'id', $chunk);
$preferences = array();
foreach ($chunk as $instanceid) {
$preferences[] = 'block' . $instanceid . 'hidden';
$preferences[] = 'docked_block_instance_' . $instanceid;
}
$DB->delete_records_list('user_preferences', 'name', $preferences);
}
$DB->delete_records_list('user_preferences', 'name', $preferences);
}
/**