34 "trac",
"taxf",
"auth",
"rolf",
"assf",
"svyf",
"extt",
"adve",
"fold");
46 "restore_trash" =>
false,
47 "purge_trash" =>
false 118 global $objDefinition,
$ilDB;
121 $this->rbac_object_types =
"'".implode(
"','",$objDefinition->getAllRBACObjects()).
"'";
122 $this->rbac_object_types = $objDefinition->getAllRBACObjects();
126 $this->logging =
true;
130 include_once
"./Services/Logging/classes/class.ilLog.php";
136 include_once
'./Services/Logging/classes/class.ilLog.php';
137 $this->scan_log =
new ilLog(CLIENT_DATA_DIR,
"scanlog.log");
138 $this->scan_log->setLogFormat(
"");
151 return array_keys($this->mode);
167 if ((!in_array($a_mode,array_keys($this->mode))
and $a_mode !=
"all")
or !is_bool($a_value))
169 $this->throwError(INVALID_PARAM, FATAL,
DEBUG);
173 if ($a_mode ==
"all")
175 foreach ($this->mode as $mode => $value)
177 $this->mode[
$mode] = $a_value;
182 $this->mode[$a_mode] = $a_value;
201 if (!in_array($a_mode,array_keys($this->mode)))
203 $this->throwError(VALIDATER_UNKNOWN_MODE, WARNING,
DEBUG);
207 return $this->mode[$a_mode];
227 if ($this->mode[
"restore"] ===
true)
229 $this->mode[
"scan"] =
true;
230 $this->mode[
"purge"] =
false;
233 if ($this->mode[
"purge"] ===
true)
235 $this->mode[
"scan"] =
true;
236 $this->mode[
"restore"] =
false;
239 if ($this->mode[
"restore_trash"] ===
true)
241 $this->mode[
"scan"] =
true;
242 $this->mode[
"purge_trash"] =
false;
245 if ($this->mode[
"purge_trash"] ===
true)
247 $this->mode[
"scan"] =
true;
248 $this->mode[
"restore_trash"] =
false;
251 if ($this->mode[
"clean"] ===
true)
253 $this->mode[
"scan"] =
true;
275 $summary .= $lng->txt(
"scanning_system");
278 $summary .= $lng->txt(
"disabled");
282 $summary .=
"<br/>".$lng->txt(
"searching_invalid_refs");
289 $summary .= $lng->txt(
"found_none");
292 $summary .=
"<br/>".$lng->txt(
"searching_invalid_childs");
300 $summary .= $lng->txt(
"found_none");
303 $summary .=
"<br/>".$lng->txt(
"searching_missing_objs");
311 $summary .= $lng->txt(
"found_none");
314 $summary .=
"<br/>".$lng->txt(
"searching_unbound_objs");
322 $summary .= $lng->txt(
"found_none");
325 $summary .=
"<br/>".$lng->txt(
"searching_deleted_objs");
333 $summary .= $lng->txt(
"found_none");
336 $summary .=
"<br/>".$lng->txt(
"searching_invalid_rolfs");
344 $summary .= $lng->txt(
"found_none");
347 $summary .=
"<br/><br/>".$lng->txt(
"analyzing_tree_structure");
350 $summary .= $lng->txt(
"tree_corrupt");
354 $summary .= $lng->txt(
"done");
360 $summary .=
"<br /><br />".$lng->txt(
"dumping_tree");
363 $summary .= $lng->txt(
"disabled");
368 if ($error_count > 0)
370 $summary .= $lng->txt(
"tree_corrupt");
374 $summary .= $lng->txt(
"done");
380 $summary .=
"<br /><br />".$lng->txt(
"cleaning");
383 $summary .= $lng->txt(
"disabled");
387 $summary .=
"<br />".$lng->txt(
"removing_invalid_refs");
390 $summary .= strtolower($lng->txt(
"done"));
394 $summary .= $lng->txt(
"nothing_to_remove").$lng->txt(
"skipped");
397 $summary .=
"<br />".$lng->txt(
"removing_invalid_childs");
400 $summary .= strtolower($lng->txt(
"done"));
404 $summary .= $lng->txt(
"nothing_to_remove").$lng->txt(
"skipped");
407 $summary .=
"<br />".$lng->txt(
"removing_invalid_rolfs");
410 $summary .= strtolower($lng->txt(
"done"));
414 $summary .= $lng->txt(
"nothing_to_remove").$lng->txt(
"skipped");
424 $summary .=
"<br /><br />".$lng->txt(
"restoring");
428 $summary .= $lng->txt(
"disabled");
432 $summary .=
"<br />".$lng->txt(
"restoring_missing_objs");
435 $summary .= strtolower($lng->txt(
"done"));
439 $summary .= $lng->txt(
"nothing_to_restore").$lng->txt(
"skipped");
442 $summary .=
"<br />".$lng->txt(
"restoring_unbound_objs");
445 $summary .= strtolower($lng->txt(
"done"));
449 $summary .= $lng->txt(
"nothing_to_restore").$lng->txt(
"skipped");
454 $summary .=
"<br /><br />".$lng->txt(
"restoring_trash");
458 $summary .= $lng->txt(
"disabled");
464 $summary .= strtolower($lng->txt(
"done"));
468 $summary .= $lng->txt(
"nothing_to_restore").$lng->txt(
"skipped");
473 $summary .=
"<br /><br />".$lng->txt(
"purging");
477 $summary .= $lng->txt(
"disabled");
481 $summary .=
"<br />".$lng->txt(
"purging_missing_objs");
484 $summary .= strtolower($lng->txt(
"done"));
488 $summary .= $lng->txt(
"nothing_to_purge").$lng->txt(
"skipped");
491 $summary .=
"<br />".$lng->txt(
"purging_unbound_objs");
494 $summary .= strtolower($lng->txt(
"done"));
498 $summary .= $lng->txt(
"nothing_to_purge").$lng->txt(
"skipped");
503 $summary .=
"<br /><br />".$lng->txt(
"purging_trash");
507 $summary .= $lng->txt(
"disabled");
513 $summary .= strtolower($lng->txt(
"done"));
517 $summary .= $lng->txt(
"nothing_to_purge").$lng->txt(
"skipped");
524 $summary .=
"<br /><br />".$lng->txt(
"cleaning_final");
527 $summary .=
"<br />".$lng->txt(
"initializing_gaps").
" ".strtolower($lng->txt(
"done"));
535 foreach ($this->mode as $mode => $value)
537 $arr[] = $mode.
"[".(int)$value.
"]";
558 if ($this->mode[
"scan"] !==
true)
564 $this->missing_objects =
array();
573 $q =
"SELECT object_data.*, ref_id FROM object_data ".
574 "LEFT JOIN object_reference ON object_data.obj_id = object_reference.obj_id ".
575 "LEFT JOIN tree ON object_reference.ref_id = tree.child ".
576 "WHERE tree.child IS NULL ".
577 "AND (object_reference.obj_id IS NOT NULL ".
578 " OR object_data.type <> 'file' AND ".
579 $ilDB->in(
'object_data.type',$this->rbac_object_types,
false,
'text').
581 $r = $this->db->query($q);
585 #if (!in_array($row->type,$this->object_types_exclude)) 588 $this->missing_objects[] =
array(
589 "obj_id" =>
$row->obj_id,
590 "type" =>
$row->type,
591 "ref_id" =>
$row->ref_id,
592 "child" =>
$row->child,
593 "title" =>
$row->title,
594 "desc" =>
$row->description,
595 "owner" =>
$row->owner,
596 "create_date" =>
$row->create_date,
597 "last_update" =>
$row->last_update
603 if (count($this->missing_objects) > 0)
605 $this->
writeScanLogLine(
"obj_id\ttype\tref_id\tchild\ttitle\tdesc\towner\tcreate_date\tlast_update");
630 if ($this->mode[
"scan"] !==
true)
636 $this->invalid_rolefolders =
array();
641 $q =
"SELECT object_data.*, ref_id FROM object_data ".
642 "LEFT JOIN object_reference ON object_data.obj_id = object_reference.obj_id ".
643 "LEFT JOIN tree ON object_reference.ref_id = tree.child ".
644 "WHERE (object_reference.obj_id IS NULL OR tree.child IS NULL) ".
645 "AND object_data.type='rolf'";
646 $r = $this->db->query($q);
650 $this->invalid_rolefolders[] =
array(
651 "obj_id" =>
$row->obj_id,
652 "type" =>
$row->type,
653 "ref_id" =>
$row->ref_id,
654 "child" =>
$row->child,
655 "title" =>
$row->title,
656 "desc" =>
$row->description,
657 "owner" =>
$row->owner,
658 "create_date" =>
$row->create_date,
659 "last_update" =>
$row->last_update
664 $q =
"SELECT object_data.*, ref_id FROM object_data ".
665 "LEFT JOIN object_reference ON object_data.obj_id = object_reference.obj_id ".
666 "LEFT JOIN tree ON object_reference.ref_id = tree.child ".
667 "WHERE object_reference.ref_id = ".$ilDB->quote(RECOVERY_FOLDER_ID,
'integer').
" ".
668 "AND object_data.type='rolf'";
669 $r = $this->db->query($q);
673 $this->invalid_rolefolders[] =
array(
674 "obj_id" =>
$row->obj_id,
675 "type" =>
$row->type,
676 "ref_id" =>
$row->ref_id,
677 "child" =>
$row->child,
678 "title" =>
$row->title,
679 "desc" =>
$row->description,
680 "owner" =>
$row->owner,
681 "create_date" =>
$row->create_date,
682 "last_update" =>
$row->last_update
687 if (count($this->invalid_rolefolders) > 0)
689 $this->
writeScanLogLine(
"obj_id\ttype\tref_id\tchild\ttitle\tdesc\towner\tcreate_date\tlast_update");
712 if ($this->mode[
"scan"] !==
true)
718 $this->invalid_rbac_entries =
array();
722 $q =
"SELECT object_data.*, ref_id FROM object_data ".
723 "LEFT JOIN object_reference ON object_data.obj_id = object_reference.obj_id ".
724 "LEFT JOIN tree ON object_reference.ref_id = tree.child ".
725 "WHERE (object_reference.obj_id IS NULL OR tree.child IS NULL) ".
726 "AND object_data.type='rolf'";
727 $r = $this->db->query($q);
731 $this->invalid_rolefolders[] =
array(
732 "obj_id" =>
$row->obj_id,
733 "type" =>
$row->type,
734 "ref_id" =>
$row->ref_id,
735 "child" =>
$row->child,
736 "title" =>
$row->title,
737 "desc" =>
$row->description,
738 "owner" =>
$row->owner,
739 "create_date" =>
$row->create_date,
740 "last_update" =>
$row->last_update
745 $q =
"SELECT object_data.*, ref_id FROM object_data ".
746 "LEFT JOIN object_reference ON object_data.obj_id = object_reference.obj_id ".
747 "LEFT JOIN tree ON object_reference.ref_id = tree.child ".
748 "WHERE object_reference.ref_id =".$ilDB->quote(RECOVERY_FOLDER_ID).
" ".
749 "AND object_data.type='rolf'";
750 $r = $this->db->query($q);
754 $this->invalid_rolefolders[] =
array(
755 "obj_id" =>
$row->obj_id,
756 "type" =>
$row->type,
757 "ref_id" =>
$row->ref_id,
758 "child" =>
$row->child,
759 "title" =>
$row->title,
760 "desc" =>
$row->description,
761 "owner" =>
$row->owner,
762 "create_date" =>
$row->create_date,
763 "last_update" =>
$row->last_update
768 if (count($this->invalid_rolefolders) > 0)
770 $this->
writeScanLogLine(
"obj_id\ttype\tref_id\tchild\ttitle\tdesc\towner\tcreate_date\tlast_update");
811 if ($this->mode[
"scan"] !==
true)
817 $this->invalid_references =
array();
820 $q =
"SELECT object_reference.* FROM object_reference ".
821 "LEFT JOIN object_data ON object_data.obj_id = object_reference.obj_id ".
822 "WHERE object_data.obj_id IS NULL ".
823 "OR ".$ilDB->in(
'object_data.type',$this->rbac_object_types,
true,
'text');
824 $r = $this->db->query($q);
828 $this->invalid_references[] =
array(
829 "ref_id" =>
$row->ref_id,
830 "obj_id" =>
$row->obj_id,
831 "msg" =>
"Object does not exist." 836 if (count($this->invalid_references) > 0)
874 if ($this->mode[
"scan"] !==
true)
880 $this->invalid_childs =
array();
884 $q =
"SELECT tree.*,object_reference.ref_id FROM tree ".
885 "LEFT JOIN object_reference ON tree.child = object_reference.ref_id ".
886 "LEFT JOIN object_data ON object_reference.obj_id = object_data.obj_id ".
887 "WHERE object_reference.ref_id IS NULL or object_data.obj_id IS NULL";
888 $r = $this->db->query($q);
891 $this->invalid_childs[] =
array(
892 "child" =>
$row->child,
893 "ref_id" =>
$row->ref_id,
894 "msg" =>
"No object found" 898 if (count($this->invalid_childs) > 0)
936 if ($this->mode[
"scan"] !==
true)
942 $this->unbound_objects =
array();
946 $q =
"SELECT T1.tree,T1.child,T1.parent,".
947 "T2.tree deleted,T2.parent grandparent ".
949 "LEFT JOIN tree T2 ON T2.child=T1.parent ".
950 "WHERE (T2.tree!=1 OR T2.tree IS NULL) AND T1.parent!=0";
951 $r = $this->db->query($q);
956 if (
$row->deleted === NULL)
958 $this->unbound_objects[] =
array(
959 "child" =>
$row->child,
960 "parent" =>
$row->parent,
961 "tree" =>
$row->tree,
962 "msg" =>
"No valid parent node found" 967 if (count($this->unbound_objects) > 0)
992 if ($this->mode[
"scan"] !==
true)
998 $this->deleted_objects =
array();
1003 $query =
"SELECT object_data.*,tree.tree,tree.child,tree.parent,deleted ".
1004 "FROM object_data ".
1005 "LEFT JOIN object_reference ON object_data.obj_id=object_reference.obj_id ".
1006 "LEFT JOIN tree ON tree.child=object_reference.ref_id ".
1007 " WHERE tree != 1 ".
1008 " ORDER BY deleted";
1011 include_once
'./Services/Calendar/classes/class.ilDateTime.php';
1016 $this->deleted_objects[] =
array(
1017 "child" =>
$row->child,
1018 "parent" =>
$row->parent,
1019 "tree" =>
$row->tree,
1020 "type" =>
$row->type,
1021 "title" =>
$row->title,
1022 "desc" =>
$row->description,
1023 "owner" =>
$row->owner,
1024 "deleted" =>
$row->deleted,
1025 "deleted_timestamp" => $tmp_date->get(
IL_CAL_UNIX),
1026 "create_date" =>
$row->create_date,
1027 "last_update" =>
$row->last_update
1031 if (count($this->deleted_objects) > 0)
1099 if ($this->mode[
"clean"] !==
true)
1106 if ($a_invalid_refs === NULL
and isset($this->invalid_references))
1112 if (!is_array($a_invalid_refs))
1114 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1118 if (count($a_invalid_refs) == 0)
1128 $message = sprintf(
'%s::removeInvalidReferences(): Started...',
1130 $ilLog->write($message,$ilLog->WARNING);
1135 foreach ($a_invalid_refs as $entry)
1137 $query =
"DELETE FROM object_reference WHERE ref_id= ".$this->db->quote($entry[
"ref_id"],
'integer').
1138 " AND obj_id = ".$this->db->quote($entry[
"obj_id"],
'integer').
" ";
1141 $message = sprintf(
'%s::removeInvalidReferences(): Reference %s removed',
1144 $ilLog->write($message,$ilLog->WARNING);
1166 if ($this->mode[
"clean"] !==
true)
1173 if ($a_invalid_childs === NULL
and isset($this->invalid_childs))
1179 if (!is_array($a_invalid_childs))
1181 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1186 if (count($a_invalid_childs) == 0)
1196 $message = sprintf(
'%s::removeInvalidChilds(): Started...',
1198 $ilLog->write($message,$ilLog->WARNING);
1200 foreach ($a_invalid_childs as $entry)
1202 $q =
"DELETE FROM tree WHERE child='".$entry[
"child"].
"'";
1203 $this->db->query($q);
1205 $message = sprintf(
'%s::removeInvalidChilds(): Entry child=%s removed',
1208 $ilLog->write($message,$ilLog->WARNING);
1231 if ($this->mode[
"clean"] !==
true)
1238 if ($a_invalid_rolefolders === NULL
and isset($this->invalid_rolefolders))
1244 if (!is_array($a_invalid_rolefolders))
1246 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1251 if (count($a_invalid_rolefolders) == 0)
1263 $message = sprintf(
'%s::removeInvalidRolefolders(): Started...',
1265 $ilLog->write($message,$ilLog->WARNING);
1270 foreach ($a_invalid_rolefolders as $rolf)
1273 if ($rolf[
"ref_id"] === NULL)
1277 $this->
writeScanLogLine(
"Created missing reference '".$rolf[
"ref_id"].
"' for rolefolder object '".$rolf[
"obj_id"].
"'");
1281 $obj_data =& $ilias->obj_factory->getInstanceByRefId($rolf[
"ref_id"]);
1282 $obj_data->delete();
1285 $this->
writeScanLogLine(
"Removed invalid rolefolder '".$rolf[
"title"].
"' (id=".$rolf[
"obj_id"].
",ref=".$rolf[
"ref_id"].
") from system");
1303 global $ilias,$rbacadmin,
$ilLog;
1306 if ($this->mode[
"restore"] !==
true)
1313 if ($a_missing_objects === NULL
and isset($this->missing_objects))
1319 if (!is_array($a_missing_objects))
1321 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1326 if (count($a_missing_objects) == 0)
1338 $message = sprintf(
'%s::restoreMissingObjects(): Started...',
1340 $ilLog->write($message,$ilLog->WARNING);
1345 foreach ($a_missing_objects as $missing_obj)
1348 if ($missing_obj[
"ref_id"] === NULL)
1352 $this->
writeScanLogLine(
"Created missing reference '".$missing_obj[
"ref_id"].
"' for object '".$missing_obj[
"obj_id"].
"'");
1356 #if (!in_array($missing_obj["type"],$this->object_types_exclude)) 1359 $rbacadmin->revokePermission($missing_obj[
"ref_id"]);
1360 $obj_data =& $ilias->obj_factory->getInstanceByRefId($missing_obj[
"ref_id"]);
1361 $obj_data->putInTree(RECOVERY_FOLDER_ID);
1362 $obj_data->setPermissions(RECOVERY_FOLDER_ID);
1366 $this->
writeScanLogLine(
"Restored object '".$missing_obj[
"title"].
"' (id=".$missing_obj[
"obj_id"].
",ref=".$missing_obj[
"ref_id"].
") in 'Restored objects folder'");
1389 if (empty($a_obj_id))
1391 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1395 $query =
"INSERT INTO object_reference (ref_id,obj_id) ".
1396 "VALUES (".$next_id = $ilDB->nextId(
'object_reference').
",".$this->db->quote($a_obj_id,
'integer').
" )";
1399 $message = sprintf(
'%s::restoreReference(): new reference %s for obj_id %s created',
1403 $ilLog->write($message,$ilLog->WARNING);
1423 if ($this->mode[
"restore"] !==
true)
1430 if ($a_unbound_objects === NULL
and isset($this->unbound_objects))
1436 if (!is_array($a_unbound_objects))
1438 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1442 $message = sprintf(
'%s::restoreUnboundObjects(): Started...',
1444 $ilLog->write($message,$ilLog->WARNING);
1464 if ($this->mode[
"restore_trash"] !==
true)
1471 if ($a_deleted_objects === NULL
and isset($this->deleted_objects))
1477 if (!is_array($a_deleted_objects))
1479 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1483 $message = sprintf(
'%s::restoreTrash(): Started...',
1485 $ilLog->write($message,$ilLog->WARNING);
1492 $q =
"DELETE FROM tree WHERE tree!=1";
1493 $this->db->query($q);
1495 $message = sprintf(
'%s::restoreTrash(): Removed all trees with tree id <> 1',
1497 $ilLog->write($message,$ilLog->WARNING);
1515 global $tree,$rbacadmin,$ilias,
$ilLog;
1518 if (!is_array($a_nodes))
1520 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1525 if (count($a_nodes) == 0)
1531 $message = sprintf(
'%s::restoreDeletedObjects()): Started...',
1533 $ilLog->write($message,$ilLog->WARNING);
1538 foreach ($a_nodes as $key => $node)
1540 if ($node[
"type"] ==
"rolf")
1543 $tree->deleteTree($node);
1545 $obj_data =& $ilias->obj_factory->getInstanceByRefId($node[
"child"]);
1546 $obj_data->delete();
1547 unset($a_nodes[$key]);
1552 foreach ($a_nodes as $node)
1555 $tree->deleteTree($node);
1557 $rbacadmin->revokePermission($node[
"child"]);
1558 $obj_data =& $ilias->obj_factory->getInstanceByRefId($node[
"child"]);
1559 $obj_data->putInTree(RECOVERY_FOLDER_ID);
1560 $obj_data->setPermissions(RECOVERY_FOLDER_ID);
1576 global $tree,$rbacadmin,$ilias,
$ilLog;
1579 if (!is_array($a_nodes))
1581 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1586 if (count($a_nodes) == 0)
1596 $subnodes =
array();
1599 $message = sprintf(
'%s::restoreSubTrees(): Started...',
1601 $ilLog->write($message,$ilLog->WARNING);
1604 foreach ($a_nodes as $node)
1607 $topnode = $tree->getNodeData($node[
"child"], $node[
'tree']);
1611 if ($topnode[
"type"] ==
"rolf")
1613 $rolfObj = $ilias->obj_factory->getInstanceByRefId($topnode[
"child"]);
1621 $subnodes[$node[
"child"]] = $tree->getSubtree($topnode);
1624 $tree->deleteTree($topnode);
1629 foreach ($subnodes as $key => $subnode)
1633 $rbacadmin->revokePermission($key);
1634 $obj_data =& $ilias->obj_factory->getInstanceByRefId($key);
1635 $obj_data->putInTree(RECOVERY_FOLDER_ID);
1636 $obj_data->setPermissions(RECOVERY_FOLDER_ID);
1641 array_shift($subnode);
1644 if (count($subnode) > 0)
1646 foreach ($subnode as $node)
1648 $rbacadmin->revokePermission($node[
"child"]);
1649 $obj_data =& $ilias->obj_factory->getInstanceByRefId($node[
"child"]);
1650 $obj_data->putInTree($node[
"parent"]);
1651 $obj_data->setPermissions($node[
"parent"]);
1679 if ($this->mode[
"purge_trash"] !==
true)
1686 if ($a_nodes === NULL
and isset($this->deleted_objects))
1692 $message = sprintf(
'%s::purgeTrash(): Started...',
1694 $ilLog->write($message,$ilLog->WARNING);
1714 if ($this->mode[
"purge"] !==
true)
1721 if ($a_nodes === NULL
and isset($this->unbound_objects))
1726 $message = sprintf(
'%s::purgeUnboundObjects(): Started...',
1728 $ilLog->write($message,$ilLog->WARNING);
1748 if ($this->mode[
"purge"] !==
true)
1755 if ($a_nodes === NULL
and isset($this->missing_objects))
1760 $message = sprintf(
'%s::purgeMissingObjects(): Started...',
1762 $ilLog->write($message,$ilLog->WARNING);
1780 $count_limit = $ilias->account->getPref(
"systemcheck_count_limit");
1781 if (! is_numeric($count_limit) || $count_limit < 0)
1783 $count_limit = count($a_nodes);
1785 $timestamp_limit =
time();
1786 $age_limit = $ilias->account->getPref(
"systemcheck_age_limit");
1787 if (is_numeric($age_limit) && $age_limit > 0)
1789 $timestamp_limit -= $age_limit * 60 * 60 * 24;
1791 $type_limit = $ilias->account->getPref(
"systemcheck_type_limit");
1794 $type_limit = trim($type_limit);
1795 if (strlen($type_limit) == 0)
1802 if (!is_array($a_nodes))
1804 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1811 foreach ($a_nodes as $node)
1813 if ($type_limit && $node[
'type'] != $type_limit)
1816 $node[
'child'].
"\t\t".$node[
'type'].
"\t\t".$node[
'title']
1823 if ($count > $count_limit)
1825 $this->
writeScanLogLine(
"Stopped purging after ".($count - 1).
" objects, because count limit was reached: ".$count_limit);
1828 if ($node[
"deleted_timestamp"] > $timestamp_limit)
1830 $this->
writeScanLogLine(
"Stopped purging after ".($count - 1).
" objects, because timestamp limit was reached: ".
date(
"c", $timestamp_limit));
1834 $ref_id = ($node[
"child"]) ? $node[
"child"] : $node[
"ref_id"];
1835 $node_obj =& $ilias->obj_factory->getInstanceByRefId(
$ref_id,
false);
1837 if ($node_obj ===
false)
1839 $this->invalid_objects[] = $node;
1843 $message = sprintf(
'%s::purgeObjects(): Removing object (id:%s ref:%s)',
1846 $node_obj->getId());
1847 $ilLog->write($message,$ilLog->WARNING);
1849 $startTime = microtime(
true);
1850 $node_obj->delete();
1852 $endTime = microtime(
true);
1855 "\t".$node[
'type'].
"\t".round($endTime-$startTime,1).
"\t".$node[
'title']);
1881 $message = sprintf(
'%s::initGapsInTree(): Started...',
1883 $ilLog->write($message,$ilLog->WARNING);
1886 if ($this->mode[
"clean"] !==
true)
1892 $tree->renumber(ROOT_FOLDER_ID);
1910 $call_loc =
$error->backtrace[count(
$error->backtrace)-1];
1911 $num_args = count($call_loc[
"args"]);
1915 foreach ($call_loc[
"args"] as $arg)
1917 $type = gettype($arg);
1922 $value = strlen($arg);
1926 $value = count($arg);
1930 $value = get_class($arg);
1934 $value = ($arg) ?
"true" :
"false";
1942 $arg_list[] =
array(
1944 "value" =>
"(".$value.
")" 1948 foreach ($arg_list as $arg)
1950 $arg_str .= implode(
"",$arg).
" ";
1954 $err_msg =
"<br/><b>".$error->getCode().
":</b> ".
$error->getMessage().
" in ".$call_loc[
"class"].$call_loc[
"type"].$call_loc[
"function"].
"()".
1955 "<br/>Called from: ".basename($call_loc[
"file"]).
" , line ".$call_loc[
"line"].
1956 "<br/>Passed parameters: [".$num_args.
"] ".$arg_str.
"<br/>";
1959 if (
$error->getUserInfo())
1961 printf(
"<br/>Parameter details:");
1963 var_dump($call_loc[
"args"]);
1967 if (
$error->getCode() == FATAL)
1980 foreach ($a_arr as $entry)
1982 $this->scan_log->write(implode(
"\t",$entry));
1993 $this->scan_log->write($a_msg);
2002 return is_file(CLIENT_DATA_DIR.
"/".$this->scan_log_file);
2010 @unlink(CLIENT_DATA_DIR.
"/".$this->scan_log_file);
2021 $scanfile =&
file(CLIENT_DATA_DIR.
"/".$this->scan_log_file);
2034 $logs = array_keys($a_scan_log,$this->scan_log_separator.
"\n");
2036 if (count($logs) > 0)
2038 return array_slice($a_scan_log,array_pop($logs)+2);
2068 $q =
'SELECT child FROM tree GROUP BY child HAVING COUNT(*) > 1';
2069 $r = $this->db->query($q);
2070 $duplicateNodes =
array();
2073 $duplicateNodes[] =
$row->child;
2077 $q =
"SELECT tree.*,ref.ref_id,dat.obj_id objobj_id,ref.obj_id refobj_id,ref.deleted,dat.* " 2079 .
"RIGHT JOIN object_reference ref ON tree.child = ref.ref_id " 2080 .
"RIGHT JOIN object_data dat ON ref.obj_id = dat.obj_id " 2082 .
"ORDER BY tree, lft, type, dat.title";
2083 $r = $this->db->query($q);
2087 .
'<td>tree, child, parent, lft, rgt, depth</td>' 2088 .
'<td>ref_id, ref.obj_id, deleted</td>' 2089 .
'<td>obj_id, type, owner, title</td>' 2098 $repository_tree_count = 0;
2099 $trash_trees_count = 0;
2100 $other_trees_count = 0;
2101 $not_in_tree_count = 0;
2104 $previousNumber = 0;
2111 if($this->workspace_object_ids &&
2112 in_array(
$row->objobj_id, $this->workspace_object_ids))
2118 if (is_null(
$row->child))
2120 switch (
$row->type) {
2134 if (is_null(
$row->ref_id)) {
2144 $isParentOkay =
false;
2147 $isDepthOkay =
false;
2161 $isParentOkay =
false;
2164 $isDepthOkay =
false;
2169 $not_in_tree_count++;
2174 .(($isRowOkay) ?
'' :
'<font color=#ff0000>')
2177 .(($isParentOkay) ?
'' :
'parent:<b>')
2179 .(($isParentOkay) ?
'' :
'</b>')
2181 .(($isLftOkay) ?
'' :
'lft:<b>')
2183 .(($isLftOkay) ?
'' :
'</b>')
2185 .(($isRgtOkay) ?
'' :
'rgt:<b>')
2187 .(($isRgtOkay) ?
'' :
'</b>')
2189 .(($isDepthOkay) ?
'' :
'depth:<b>')
2191 .(($isDepthOkay) ?
'' :
'</b>')
2192 .(($isRowOkay) ?
'' :
'</font>')
2194 .(($isRowOkay) ?
'' :
'<font color=#ff0000>')
2195 .(($isRefRefOkay && $isChildOkay) ?
'' :
'ref.ref_id:<b>')
2197 .(($isRefRefOkay && $isChildOkay) ?
'' :
'</b>')
2199 .(($isRefObjOkay) ?
'' :
'ref.obj_id:<b>')
2201 .(($isRefObjOkay) ?
'' :
'</b>')
2202 .(($isRowOkay) ?
'' :
'<font color=#ff0000>')
2203 .((
$row->deleted != null) ?
', '.$row->deleted :
'')
2205 .(($isRowOkay) ?
'' :
'<font color=#ff0000>')
2211 .(($isRowOkay) ?
'' :
' <b>*ERROR*</b><font color=#ff0000>')
2221 for ($i = 1; $i <
$row->depth; $i++)
2227 if (count($stack) == 0 || $stack[0]->tree !=
$row->tree)
2230 $previousNumber =
$row->lft - 1;
2236 while (count($stack) > 0 && $stack[count($stack) - 1]->rgt < $row->lft)
2238 $popped = array_pop($stack);
2241 $gap = $popped->rgt - $previousNumber - 1;
2245 for ($i = 1; $i < $popped->depth; $i++)
2247 $poppedIndent .=
". ";
2251 .
'<td colspan=2><div align="right">' 2252 .
'<font color=#00cc00>*gap* for '.($gap/2).
' nodes at end of </font>' 2255 .
'<font color=#00cc00>' 2257 .$popped->obj_id.
', ' 2259 .$popped->login.
', ' 2266 $previousNumber = $popped->rgt;
2275 $isChildOkay =
true;
2276 $isParentOkay =
true;
2279 $isDepthOkay =
true;
2282 if (count($stack) > 0)
2284 $parent = $stack[count($stack) - 1];
2285 if ($parent->depth + 1 !=
$row->depth)
2287 $isDepthOkay =
false;
2290 if ($parent->child !=
$row->parent)
2292 $isParentOkay =
false;
2295 if(
$GLOBALS[
'ilSetting']->
get(
'main_tree_impl',
'ns') ==
'ns')
2297 if ($parent->lft >=
$row->lft)
2302 if ($parent->rgt <=
$row->rgt)
2311 if(
$GLOBALS[
'ilSetting']->
get(
'main_tree_impl',
'ns') ==
'ns')
2320 if (in_array(
$row->child, $duplicateNodes))
2322 $isChildOkay =
false;
2327 $isRefRefOkay =
true;
2328 $isRefObjOkay =
true;
2329 if (
$row->ref_id == null)
2331 $isRefRefOkay =
false;
2334 if (
$row->obj_id == null)
2336 $isRefObjOkay =
false;
2347 if(
$GLOBALS[
'ilSetting']->
get(
'main_tree_impl',
'ns') ==
'ns')
2349 $gap =
$row->lft - $previousNumber - 1;
2350 $previousNumber =
$row->lft;
2355 .
'<td colspan=2><div align="right">' 2356 .
'<font color=#00cc00>*gap* for '.($gap/2).
' nodes between </font>' 2359 .
'<font color=#00cc00>siblings</font>' 2371 . (($isRowOkay) ?
'' :
'<font color=#ff0000>')
2373 .
$row->child .
', ' 2374 . (($isParentOkay) ?
'' :
'parent:<b>')
2376 . (($isParentOkay) ?
'' :
'</b>')
2378 . (($isLftOkay) ?
'' :
'lft:<b>')
2380 . (($isLftOkay) ?
'' :
'</b>')
2382 . (($isRgtOkay) ?
'' :
'rgt:<b>')
2384 . (($isRgtOkay) ?
'' :
'</b>')
2386 . (($isDepthOkay) ?
'' :
'depth:<b>')
2388 . (($isDepthOkay) ?
'' :
'</b>')
2389 . (($isRowOkay) ?
'' :
'</font>')
2391 . (($isRowOkay) ?
'' :
'<font color=#ff0000>')
2392 . (($isRefRefOkay && $isChildOkay) ?
'' :
'ref.ref_id:<b>')
2394 . (($isRefRefOkay && $isChildOkay) ?
'' :
'</b>')
2396 . (($isRefObjOkay) ?
'' :
'ref.obj_id:<b>')
2398 . (($isRefObjOkay) ?
'' :
'</b>')
2399 . (($isRowOkay) ?
'' :
'<font color=#ff0000>')
2400 . ((
$row->tree < 0) ?
', ' .
$row->deleted :
'')
2402 . (($isRowOkay) ?
'' :
'<font color=#ff0000>')
2404 .
$row->obj_id .
', ' 2406 .
$row->login .
', ' 2408 . (($isRowOkay) ?
'' :
' <b>*ERROR*</b><font color=#ff0000>')
2420 if (
$row->tree == 1)
2422 $repository_tree_count++;
2424 else if (
$row->tree < 0)
2426 $trash_trees_count++;
2430 $other_trees_count++;
2436 while (count($stack) > 0)
2438 $popped = array_pop($stack);
2441 $gap = $popped->rgt - $previousNumber - 1;
2445 for ($i = 1; $i < $popped->depth; $i++)
2447 $poppedIndent .=
". ";
2451 .
'<td colspan=2><div align="right">' 2452 .
'<font color=#00cc00>*gap* for '.($gap/2).
' nodes at end of </font>' 2455 .
'<font color=#00cc00>' 2457 .$popped->obj_id.
', ' 2459 .$popped->login.
', ' 2466 $previousNumber = $popped->rgt;
2473 if ($error_count > 0)
2475 $this->
writeScanLogLine(
'<font color=#ff0000>'.$error_count.
' errors found while dumping tree.</font>');
2481 $this->
writeScanLogLine(
"$repository_tree_count nodes in repository tree");
2487 return $error_count;
2494 if(!is_array($this->media_pool_ids))
2496 $this->media_pool_ids =
array();
2497 $query =
"SELECT child FROM mep_tree ";
2499 while(
$row = $ilDB->fetchObject(
$res))
2501 $this->media_pool_ids[] =
$row->child;
2505 return in_array($a_obj_id,$this->media_pool_ids) ? true :
false;
2524 return in_array(
$a_type,$this->object_types_exclude);
2531 if($this->workspace_object_ids === null)
2533 $this->workspace_object_ids =
array();
2536 $set = $ilDB->query(
"SELECT DISTINCT(obj_id) FROM object_reference_ws");
2537 while(
$row = $ilDB->fetchAssoc($set))
2539 $this->workspace_object_ids[] =
$row[
"obj_id"];
2543 $set = $ilDB->query(
"SELECT id FROM usr_portfolio");
2544 while(
$row = $ilDB->fetchAssoc($set))
2546 $this->workspace_object_ids[] =
$row[
"id"];
2558 if(is_array($this->workspace_object_ids))
2560 foreach($a_data as $idx => $item)
2562 if(in_array($item[$a_index], $this->workspace_object_ids))
2564 unset($a_data[$idx]);
checkTreeStructure($a_startnode=null)
restoreMissingObjects($a_missing_objects=NULL)
Restores missing reference and/or tree entry for all objects found by this::getMissingObjects() Resto...
findDeletedObjects()
Search database for all tree entries having no valid parent (=> no valid path to root node) and store...
__construct($a_log=false)
Constructor.
getDeletedObjects()
Gets all object in trash.
setMode($a_mode, $a_value)
set mode of ilValidator Usage: setMode("restore",true) => enable object restorey setMode("all",true) => enable all features For all possible modes see variables declaration
findMissingObjects()
Search database for all object entries with missing reference and/or tree entry and stores result in ...
getInvalidChilds()
Gets all tree entries without any link to a valid object.
removeInvalidReferences($a_invalid_refs=NULL)
Removes all reference entries that are linked with invalid object IDs.
removeInvalidRolefolders($a_invalid_rolefolders=NULL)
Removes invalid rolefolders.
static _removeEntry($a_tree, $a_child, $a_db_table="tree")
STATIC METHOD Removes a single entry from a tree.
$GLOBALS['loaded']
Global hash that tracks already loaded includes.
purgeMissingObjects($a_nodes=NULL)
Removes all missing objects from system.
deleteScanLog()
Delete scan log.
dumpTree()
Dumps the Tree structure into the scan log.
restoreSubTrees($a_nodes)
Restore objects (and their subobjects) to RecoveryFolder.
findInvalidChilds()
Search database for all tree entries without any link to a valid object and stores result in $this->i...
getUnboundObjects()
Gets all tree entries having no valid parent (=> no valid path to root node) Returns an array with ch...
removeInvalidChilds($a_invalid_childs=NULL)
Removes all tree entries without any link to a valid object.
isExcludedFromRecovery($a_type, $a_obj_id)
Check if type is excluded from recovery.
hasScanLog()
Quickly determine if there is a scan log.
getInvalidReferences()
Gets all reference entries that are not linked with a valid object id.
validate()
Performs the validation for each enabled mode.
getMissingObjects()
Gets all object entries with missing reference and/or tree entry.
date( 'd-M-Y', $objPHPExcel->getProperties() ->getCreated())
purgeObjects($a_nodes)
removes objects from system
purgeUnboundObjects($a_nodes=NULL)
Removes all invalid objects from system.
findInvalidReferences()
Search database for all reference entries that are not linked with a valid object id and stores resul...
Reload workbook from saved file
restoreDeletedObjects($a_nodes)
Restore deleted objects (and their subobjects) to RecoveryFolder.
findInvalidRolefolders()
Search database for all rolefolder object entries with missing reference entry.
restoreTrash($a_deleted_objects=NULL)
Restore all objects in trash to RecoveryFolder NOTE: All objects will be restored to top of RecoveryF...
Create styles array
The data for the language used.
getInvalidRolefolders()
Gets invalid rolefolders (same as missing objects)
filterWorkspaceObjects(array &$a_data, $a_index="obj_id")
get_last_scan($a_scan_log)
purgeTrash($a_nodes=NULL)
Removes all objects in trash from system.
getPossibleModes()
get possible ilValidator modes public
restoreUnboundObjects($a_unbound_objects=NULL)
Restore objects (and their subobjects) to RecoveryFolder that are valid but not linked correctly in t...
findUnboundObjects()
Search database for all tree entries having no valid parent (=> no valid path to root node) and store...
setModeDependencies()
Sets modes by considering mode dependencies; some modes require other modes to be activated...
findInvalidRBACEntries()
Search database for all role entries that are linked to invalid ref_ids.
handleErr($error)
Callback function handles PEAR_error and outputs detailed infos about error TODO: implement that in g...
Add data(end) time
Method that wraps PHPs time in order to allow simulations with the workflow.
isModeEnabled($a_mode)
Is a particular mode enabled?
ILIAS Data Validator & Recovery Tool.
restoreReference($a_obj_id)
restore a reference for an object Creates a new reference entry in DB table object_reference for $a_o...
writeScanLogArray($a_arr)
initGapsInTree()
Initializes gaps in lft/rgt values of a tree.