69 "trac",
"taxf",
"auth",
"rolf",
"assf",
"svyf",
"extt",
"adve",
"fold");
81 "restore_trash" =>
false,
82 "purge_trash" =>
false 155 $this->obj_definition = $DIC[
"objDefinition"];
156 $this->db = $DIC->database();
157 $this->lng = $DIC->language();
158 $this->log = $DIC[
"ilLog"];
159 $this->rbacadmin = $DIC->rbac()->admin();
160 $this->tree = $DIC->repositoryTree();
161 $this->
user = $DIC->user();
162 $objDefinition = $DIC[
"objDefinition"];
163 $ilDB = $DIC->database();
166 $this->rbac_object_types =
"'" . implode(
"','", $objDefinition->getAllRBACObjects()) .
"'";
167 $this->rbac_object_types = $objDefinition->getAllRBACObjects();
169 if ($a_log ===
true) {
170 $this->logging =
true;
174 include_once
"./Services/Logging/classes/class.ilLog.php";
180 include_once
'./Services/Logging/classes/class.ilLog.php';
181 $this->scan_log =
new ilLog(CLIENT_DATA_DIR,
"scanlog.log");
182 $this->scan_log->setLogFormat(
"");
195 return array_keys($this->mode);
211 if ((!in_array($a_mode, array_keys($this->mode))
and $a_mode !=
"all")
or !is_bool($a_value)) {
212 $this->throwError(INVALID_PARAM, FATAL,
DEBUG);
216 if ($a_mode ==
"all") {
217 foreach ($this->mode as
$mode => $value) {
218 $this->mode[
$mode] = $a_value;
221 $this->mode[$a_mode] = $a_value;
240 if (!in_array($a_mode, array_keys($this->mode))) {
241 $this->throwError(VALIDATER_UNKNOWN_MODE, WARNING,
DEBUG);
245 return $this->mode[$a_mode];
265 if ($this->mode[
"restore"] ===
true) {
266 $this->mode[
"scan"] =
true;
267 $this->mode[
"purge"] =
false;
270 if ($this->mode[
"purge"] ===
true) {
271 $this->mode[
"scan"] =
true;
272 $this->mode[
"restore"] =
false;
275 if ($this->mode[
"restore_trash"] ===
true) {
276 $this->mode[
"scan"] =
true;
277 $this->mode[
"purge_trash"] =
false;
280 if ($this->mode[
"purge_trash"] ===
true) {
281 $this->mode[
"scan"] =
true;
282 $this->mode[
"restore_trash"] =
false;
285 if ($this->mode[
"clean"] ===
true) {
286 $this->mode[
"scan"] =
true;
312 $summary .=
"<br/>" .
$lng->txt(
"searching_invalid_refs");
319 $summary .=
"<br/>" .
$lng->txt(
"searching_invalid_childs");
326 $summary .=
"<br/>" .
$lng->txt(
"searching_missing_objs");
333 $summary .=
"<br/>" .
$lng->txt(
"searching_unbound_objs");
340 $summary .=
"<br/>" .
$lng->txt(
"searching_deleted_objs");
347 $summary .=
"<br/>" .
$lng->txt(
"searching_invalid_rolfs");
354 $summary .=
"<br/><br/>" .
$lng->txt(
"analyzing_tree_structure");
369 if ($error_count > 0) {
382 $summary .=
"<br />" .
$lng->txt(
"removing_invalid_refs");
389 $summary .=
"<br />" .
$lng->txt(
"removing_invalid_childs");
396 $summary .=
"<br />" .
$lng->txt(
"removing_invalid_rolfs");
415 $summary .=
"<br />" .
$lng->txt(
"restoring_missing_objs");
422 $summary .=
"<br />" .
$lng->txt(
"restoring_unbound_objs");
431 $summary .=
"<br /><br />" .
$lng->txt(
"restoring_trash");
449 $summary .=
"<br />" .
$lng->txt(
"purging_missing_objs");
456 $summary .=
"<br />" .
$lng->txt(
"purging_unbound_objs");
465 $summary .=
"<br /><br />" .
$lng->txt(
"purging_trash");
479 $summary .=
"<br /><br />" .
$lng->txt(
"cleaning_final");
481 $summary .=
"<br />" .
$lng->txt(
"initializing_gaps") .
" " . strtolower(
$lng->txt(
"done"));
489 foreach ($this->mode as
$mode => $value) {
490 $arr[] =
$mode .
"[" . (int) $value .
"]";
511 if ($this->mode[
"scan"] !==
true) {
516 $this->missing_objects = array();
525 $q =
"SELECT object_data.*, ref_id FROM object_data " .
526 "LEFT JOIN object_reference ON object_data.obj_id = object_reference.obj_id " .
527 "LEFT JOIN tree ON object_reference.ref_id = tree.child " .
528 "WHERE tree.child IS NULL " .
529 "AND (object_reference.obj_id IS NOT NULL " .
530 " OR object_data.type <> 'file' AND " .
531 $ilDB->in(
'object_data.type', $this->rbac_object_types,
false,
'text') .
533 $r = $this->db->query($q);
536 #if (!in_array($row->type,$this->object_types_exclude)) 538 $this->missing_objects[] = array(
539 "obj_id" =>
$row->obj_id,
540 "type" =>
$row->type,
541 "ref_id" =>
$row->ref_id,
542 "child" =>
$row->child,
543 "title" =>
$row->title,
544 "desc" =>
$row->description,
545 "owner" =>
$row->owner,
546 "create_date" =>
$row->create_date,
547 "last_update" =>
$row->last_update
553 if (count($this->missing_objects) > 0) {
554 $this->
writeScanLogLine(
"obj_id\ttype\tref_id\tchild\ttitle\tdesc\towner\tcreate_date\tlast_update");
579 if ($this->mode[
"scan"] !==
true) {
584 $this->invalid_rolefolders = array();
589 $q =
"SELECT object_data.*, ref_id FROM object_data " .
590 "LEFT JOIN object_reference ON object_data.obj_id = object_reference.obj_id " .
591 "LEFT JOIN tree ON object_reference.ref_id = tree.child " .
592 "WHERE (object_reference.obj_id IS NULL OR tree.child IS NULL) " .
593 "AND object_data.type='rolf'";
594 $r = $this->db->query($q);
597 $this->invalid_rolefolders[] = array(
598 "obj_id" =>
$row->obj_id,
599 "type" =>
$row->type,
600 "ref_id" =>
$row->ref_id,
601 "child" =>
$row->child,
602 "title" =>
$row->title,
603 "desc" =>
$row->description,
604 "owner" =>
$row->owner,
605 "create_date" =>
$row->create_date,
606 "last_update" =>
$row->last_update
611 $q =
"SELECT object_data.*, ref_id FROM object_data " .
612 "LEFT JOIN object_reference ON object_data.obj_id = object_reference.obj_id " .
613 "LEFT JOIN tree ON object_reference.ref_id = tree.child " .
614 "WHERE object_reference.ref_id = " .
$ilDB->quote(RECOVERY_FOLDER_ID,
'integer') .
" " .
615 "AND object_data.type='rolf'";
616 $r = $this->db->query($q);
619 $this->invalid_rolefolders[] = array(
620 "obj_id" =>
$row->obj_id,
621 "type" =>
$row->type,
622 "ref_id" =>
$row->ref_id,
623 "child" =>
$row->child,
624 "title" =>
$row->title,
625 "desc" =>
$row->description,
626 "owner" =>
$row->owner,
627 "create_date" =>
$row->create_date,
628 "last_update" =>
$row->last_update
633 if (count($this->invalid_rolefolders) > 0) {
634 $this->
writeScanLogLine(
"obj_id\ttype\tref_id\tchild\ttitle\tdesc\towner\tcreate_date\tlast_update");
657 if ($this->mode[
"scan"] !==
true) {
662 $this->invalid_rbac_entries = array();
666 $q =
"SELECT object_data.*, ref_id FROM object_data " .
667 "LEFT JOIN object_reference ON object_data.obj_id = object_reference.obj_id " .
668 "LEFT JOIN tree ON object_reference.ref_id = tree.child " .
669 "WHERE (object_reference.obj_id IS NULL OR tree.child IS NULL) " .
670 "AND object_data.type='rolf'";
671 $r = $this->db->query($q);
674 $this->invalid_rolefolders[] = array(
675 "obj_id" =>
$row->obj_id,
676 "type" =>
$row->type,
677 "ref_id" =>
$row->ref_id,
678 "child" =>
$row->child,
679 "title" =>
$row->title,
680 "desc" =>
$row->description,
681 "owner" =>
$row->owner,
682 "create_date" =>
$row->create_date,
683 "last_update" =>
$row->last_update
688 $q =
"SELECT object_data.*, ref_id FROM object_data " .
689 "LEFT JOIN object_reference ON object_data.obj_id = object_reference.obj_id " .
690 "LEFT JOIN tree ON object_reference.ref_id = tree.child " .
691 "WHERE object_reference.ref_id =" .
$ilDB->quote(RECOVERY_FOLDER_ID) .
" " .
692 "AND object_data.type='rolf'";
693 $r = $this->db->query($q);
696 $this->invalid_rolefolders[] = array(
697 "obj_id" =>
$row->obj_id,
698 "type" =>
$row->type,
699 "ref_id" =>
$row->ref_id,
700 "child" =>
$row->child,
701 "title" =>
$row->title,
702 "desc" =>
$row->description,
703 "owner" =>
$row->owner,
704 "create_date" =>
$row->create_date,
705 "last_update" =>
$row->last_update
710 if (count($this->invalid_rolefolders) > 0) {
711 $this->
writeScanLogLine(
"obj_id\ttype\tref_id\tchild\ttitle\tdesc\towner\tcreate_date\tlast_update");
752 if ($this->mode[
"scan"] !==
true) {
757 $this->invalid_references = array();
760 $q =
"SELECT object_reference.* FROM object_reference " .
761 "LEFT JOIN object_data ON object_data.obj_id = object_reference.obj_id " .
762 "WHERE object_data.obj_id IS NULL " .
763 "OR " .
$ilDB->in(
'object_data.type', $this->rbac_object_types,
true,
'text');
764 $r = $this->db->query($q);
767 $this->invalid_references[] = array(
768 "ref_id" =>
$row->ref_id,
769 "obj_id" =>
$row->obj_id,
770 "msg" =>
"Object does not exist." 775 if (count($this->invalid_references) > 0) {
812 if ($this->mode[
"scan"] !==
true) {
817 $this->invalid_childs = array();
821 $q =
"SELECT tree.*,object_reference.ref_id FROM tree " .
822 "LEFT JOIN object_reference ON tree.child = object_reference.ref_id " .
823 "LEFT JOIN object_data ON object_reference.obj_id = object_data.obj_id " .
824 "WHERE object_reference.ref_id IS NULL or object_data.obj_id IS NULL";
825 $r = $this->db->query($q);
827 $this->invalid_childs[] = array(
828 "child" =>
$row->child,
829 "ref_id" =>
$row->ref_id,
830 "msg" =>
"No object found" 834 if (count($this->invalid_childs) > 0) {
871 if ($this->mode[
"scan"] !==
true) {
876 $this->unbound_objects = array();
880 $q =
"SELECT T1.tree,T1.child,T1.parent," .
881 "T2.tree deleted,T2.parent grandparent " .
883 "LEFT JOIN tree T2 ON T2.child=T1.parent " .
884 "WHERE (T2.tree!=1 OR T2.tree IS NULL) AND T1.parent!=0";
885 $r = $this->db->query($q);
889 if (
$row->deleted === null) {
890 $this->unbound_objects[] = array(
891 "child" =>
$row->child,
892 "parent" =>
$row->parent,
893 "tree" =>
$row->tree,
894 "msg" =>
"No valid parent node found" 899 if (count($this->unbound_objects) > 0) {
923 if ($this->mode[
"scan"] !==
true) {
928 $this->deleted_objects = array();
933 $query =
"SELECT object_data.*,tree.tree,tree.child,tree.parent,deleted " .
934 "FROM object_data " .
935 "LEFT JOIN object_reference ON object_data.obj_id=object_reference.obj_id " .
936 "LEFT JOIN tree ON tree.child=object_reference.ref_id " .
937 " WHERE tree != 1 " .
941 include_once
'./Services/Calendar/classes/class.ilDateTime.php';
945 $this->deleted_objects[] = array(
946 "child" =>
$row->child,
947 "parent" =>
$row->parent,
948 "tree" =>
$row->tree,
949 "type" =>
$row->type,
950 "title" =>
$row->title,
951 "desc" =>
$row->description,
952 "owner" =>
$row->owner,
953 "deleted" =>
$row->deleted,
954 "deleted_timestamp" => $tmp_date->get(
IL_CAL_UNIX),
955 "create_date" =>
$row->create_date,
956 "last_update" =>
$row->last_update
960 if (count($this->deleted_objects) > 0) {
1027 if ($this->mode[
"clean"] !==
true) {
1033 if ($a_invalid_refs === null
and isset($this->invalid_references)) {
1038 if (!is_array($a_invalid_refs)) {
1039 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1043 if (count($a_invalid_refs) == 0) {
1053 '%s::removeInvalidReferences(): Started...',
1061 foreach ($a_invalid_refs as $entry) {
1062 $query =
"DELETE FROM object_reference WHERE ref_id= " . $this->db->quote($entry[
"ref_id"],
'integer') .
1063 " AND obj_id = " . $this->db->quote($entry[
"obj_id"],
'integer') .
" ";
1067 '%s::removeInvalidReferences(): Reference %s removed',
1093 if ($this->mode[
"clean"] !==
true) {
1099 if ($a_invalid_childs === null
and isset($this->invalid_childs)) {
1104 if (!is_array($a_invalid_childs)) {
1105 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1110 if (count($a_invalid_childs) == 0) {
1120 '%s::removeInvalidChilds(): Started...',
1125 foreach ($a_invalid_childs as $entry) {
1126 $q =
"DELETE FROM tree WHERE child='" . $entry[
"child"] .
"'";
1127 $this->db->query($q);
1130 '%s::removeInvalidChilds(): Entry child=%s removed',
1157 if ($this->mode[
"clean"] !==
true) {
1163 if ($a_invalid_rolefolders === null
and isset($this->invalid_rolefolders)) {
1168 if (!is_array($a_invalid_rolefolders)) {
1169 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1174 if (count($a_invalid_rolefolders) == 0) {
1186 '%s::removeInvalidRolefolders(): Started...',
1194 foreach ($a_invalid_rolefolders as $rolf) {
1196 if ($rolf[
"ref_id"] === null) {
1199 $this->
writeScanLogLine(
"Created missing reference '" . $rolf[
"ref_id"] .
"' for rolefolder object '" . $rolf[
"obj_id"] .
"'");
1204 $obj_data->delete();
1207 $this->
writeScanLogLine(
"Removed invalid rolefolder '" . $rolf[
"title"] .
"' (id=" . $rolf[
"obj_id"] .
",ref=" . $rolf[
"ref_id"] .
") from system");
1229 if ($this->mode[
"restore"] !==
true) {
1235 if ($a_missing_objects === null
and isset($this->missing_objects)) {
1240 if (!is_array($a_missing_objects)) {
1241 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1246 if (count($a_missing_objects) == 0) {
1258 '%s::restoreMissingObjects(): Started...',
1266 foreach ($a_missing_objects as $missing_obj) {
1268 if ($missing_obj[
"ref_id"] === null) {
1271 $this->
writeScanLogLine(
"Created missing reference '" . $missing_obj[
"ref_id"] .
"' for object '" . $missing_obj[
"obj_id"] .
"'");
1275 #if (!in_array($missing_obj["type"],$this->object_types_exclude)) 1277 $rbacadmin->revokePermission($missing_obj[
"ref_id"]);
1279 $obj_data->putInTree(RECOVERY_FOLDER_ID);
1280 $obj_data->setPermissions(RECOVERY_FOLDER_ID);
1284 $this->
writeScanLogLine(
"Restored object '" . $missing_obj[
"title"] .
"' (id=" . $missing_obj[
"obj_id"] .
",ref=" . $missing_obj[
"ref_id"] .
") in 'Restored objects folder'");
1307 if (empty($a_obj_id)) {
1308 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1312 $query =
"INSERT INTO object_reference (ref_id,obj_id) " .
1313 "VALUES (" . $next_id =
$ilDB->nextId(
'object_reference') .
"," . $this->db->quote($a_obj_id,
'integer') .
" )";
1317 '%s::restoreReference(): new reference %s for obj_id %s created',
1342 if ($this->mode[
"restore"] !==
true) {
1348 if ($a_unbound_objects === null
and isset($this->unbound_objects)) {
1353 if (!is_array($a_unbound_objects)) {
1354 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1359 '%s::restoreUnboundObjects(): Started...',
1382 if ($this->mode[
"restore_trash"] !==
true) {
1388 if ($a_deleted_objects === null
and isset($this->deleted_objects)) {
1393 if (!is_array($a_deleted_objects)) {
1394 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1399 '%s::restoreTrash(): Started...',
1408 $q =
"DELETE FROM tree WHERE tree!=1";
1409 $this->db->query($q);
1412 '%s::restoreTrash(): Removed all trees with tree id <> 1',
1438 if (!is_array($a_nodes)) {
1439 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1444 if (count($a_nodes) == 0) {
1450 '%s::restoreDeletedObjects()): Started...',
1458 foreach ($a_nodes as
$key => $node) {
1459 if ($node[
"type"] ==
"rolf") {
1461 $tree->deleteTree($node);
1464 $obj_data->delete();
1465 unset($a_nodes[
$key]);
1470 foreach ($a_nodes as $node) {
1472 $tree->deleteTree($node);
1474 $rbacadmin->revokePermission($node[
"child"]);
1476 $obj_data->putInTree(RECOVERY_FOLDER_ID);
1477 $obj_data->setPermissions(RECOVERY_FOLDER_ID);
1498 if (!is_array($a_nodes)) {
1499 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1504 if (count($a_nodes) == 0) {
1513 $subnodes = array();
1517 '%s::restoreSubTrees(): Started...',
1523 foreach ($a_nodes as $node) {
1525 $topnode =
$tree->getNodeData($node[
"child"], $node[
'tree']);
1529 if ($topnode[
"type"] ==
"rolf") {
1538 $subnodes[$node[
"child"]] =
$tree->getSubtree($topnode);
1541 $tree->deleteTree($topnode);
1546 foreach ($subnodes as
$key => $subnode) {
1551 $obj_data->putInTree(RECOVERY_FOLDER_ID);
1552 $obj_data->setPermissions(RECOVERY_FOLDER_ID);
1557 array_shift($subnode);
1560 if (count($subnode) > 0) {
1561 foreach ($subnode as $node) {
1562 $rbacadmin->revokePermission($node[
"child"]);
1564 $obj_data->putInTree($node[
"parent"]);
1565 $obj_data->setPermissions($node[
"parent"]);
1593 if ($this->mode[
"purge_trash"] !==
true) {
1599 if ($a_nodes === null
and isset($this->deleted_objects)) {
1603 '%s::purgeTrash(): Started...',
1626 if ($this->mode[
"purge"] !==
true) {
1632 if ($a_nodes === null
and isset($this->unbound_objects)) {
1637 '%s::purgeUnboundObjects(): Started...',
1660 if ($this->mode[
"purge"] !==
true) {
1666 if ($a_nodes === null
and isset($this->missing_objects)) {
1671 '%s::purgeMissingObjects(): Started...',
1693 $count_limit =
$ilUser->getPref(
"systemcheck_count_limit");
1694 if (!is_numeric($count_limit) || $count_limit < 0) {
1695 $count_limit = count($a_nodes);
1697 $timestamp_limit = time();
1698 $age_limit =
$ilUser->getPref(
"systemcheck_age_limit");
1699 if (is_numeric($age_limit) && $age_limit > 0) {
1700 $timestamp_limit -= $age_limit * 60 * 60 * 24;
1702 $type_limit =
$ilUser->getPref(
"systemcheck_type_limit");
1704 $type_limit = trim($type_limit);
1705 if (strlen($type_limit) == 0) {
1711 if (!is_array($a_nodes)) {
1712 $this->throwError(INVALID_PARAM, WARNING,
DEBUG);
1719 foreach ($a_nodes as $node) {
1720 if ($type_limit && $node[
'type'] != $type_limit) {
1723 $node[
'child'] .
"\t\t" . $node[
'type'] .
"\t\t" . $node[
'title']
1730 if ($count > $count_limit) {
1731 $this->
writeScanLogLine(
"Stopped purging after " . ($count - 1) .
" objects, because count limit was reached: " . $count_limit);
1734 if ($node[
"deleted_timestamp"] > $timestamp_limit) {
1735 $this->
writeScanLogLine(
"Stopped purging after " . ($count - 1) .
" objects, because timestamp limit was reached: " . date(
"c", $timestamp_limit));
1739 $ref_id = ($node[
"child"]) ? $node[
"child"] : $node[
"ref_id"];
1742 if ($node_obj ===
false) {
1743 $this->invalid_objects[] = $node;
1748 '%s::purgeObjects(): Removing object (id:%s ref:%s)',
1755 $startTime = microtime(
true);
1756 $node_obj->delete();
1758 $endTime = microtime(
true);
1761 "\t" . $node[
'type'] .
"\t" . round($endTime - $startTime, 1) .
"\t" . $node[
'title']);
1789 '%s::initGapsInTree(): Started...',
1795 if ($this->mode[
"clean"] !==
true) {
1800 $tree->renumber(ROOT_FOLDER_ID);
1818 $call_loc = $error->backtrace[count($error->backtrace) - 1];
1819 $num_args = count($call_loc[
"args"]);
1821 if ($num_args > 0) {
1822 foreach ($call_loc[
"args"] as $arg) {
1823 $type = gettype($arg);
1827 $value = strlen($arg);
1831 $value = count($arg);
1835 $value = get_class($arg);
1839 $value = ($arg) ?
"true" :
"false";
1847 $arg_list[] = array(
1849 "value" =>
"(" . $value .
")" 1853 foreach ($arg_list as $arg) {
1854 $arg_str .= implode(
"", $arg) .
" ";
1858 $err_msg =
"<br/><b>" . $error->getCode() .
":</b> " . $error->getMessage() .
" in " . $call_loc[
"class"] . $call_loc[
"type"] . $call_loc[
"function"] .
"()" .
1859 "<br/>Called from: " . basename($call_loc[
"file"]) .
" , line " . $call_loc[
"line"] .
1860 "<br/>Passed parameters: [" . $num_args .
"] " . $arg_str .
"<br/>";
1863 if ($error->getUserInfo()) {
1864 printf(
"<br/>Parameter details:");
1866 var_dump($call_loc[
"args"]);
1870 if ($error->getCode() == FATAL) {
1881 foreach ($a_arr as $entry) {
1882 $this->scan_log->write(implode(
"\t", $entry));
1892 $this->scan_log->write($a_msg);
1901 return is_file(CLIENT_DATA_DIR .
"/" . $this->scan_log_file);
1909 @unlink(CLIENT_DATA_DIR .
"/" . $this->scan_log_file);
1919 $scanfile = &file(CLIENT_DATA_DIR .
"/" . $this->scan_log_file);
1931 $logs = array_keys($a_scan_log, $this->scan_log_separator .
"\n");
1933 if (count($logs) > 0) {
1934 return array_slice($a_scan_log, array_pop($logs) + 2);
1964 $q =
'SELECT child FROM tree GROUP BY child HAVING COUNT(*) > 1';
1965 $r = $this->db->query($q);
1966 $duplicateNodes = array();
1968 $duplicateNodes[] =
$row->child;
1972 $q =
"SELECT tree.*,ref.ref_id,dat.obj_id objobj_id,ref.obj_id refobj_id,ref.deleted,dat.* " 1974 .
"RIGHT JOIN object_reference ref ON tree.child = ref.ref_id " 1975 .
"RIGHT JOIN object_data dat ON ref.obj_id = dat.obj_id " 1977 .
"ORDER BY tree, lft, type, dat.title";
1978 $r = $this->db->query($q);
1982 .
'<td>tree, child, parent, lft, rgt, depth</td>' 1983 .
'<td>ref_id, ref.obj_id, deleted</td>' 1984 .
'<td>obj_id, type, owner, title</td>' 1993 $repository_tree_count = 0;
1994 $trash_trees_count = 0;
1995 $other_trees_count = 0;
1996 $not_in_tree_count = 0;
1999 $previousNumber = 0;
2005 if ($this->workspace_object_ids &&
2006 in_array(
$row->objobj_id, $this->workspace_object_ids)) {
2011 if (is_null(
$row->child)) {
2012 switch (
$row->type) {
2026 if (is_null(
$row->ref_id)) {
2036 $isParentOkay =
false;
2039 $isDepthOkay =
false;
2053 $isParentOkay =
false;
2056 $isDepthOkay =
false;
2061 $not_in_tree_count++;
2066 . (($isRowOkay) ?
'' :
'<font color=#ff0000>')
2068 .
$row->child .
', ' 2069 . (($isParentOkay) ?
'' :
'parent:<b>')
2071 . (($isParentOkay) ?
'' :
'</b>')
2073 . (($isLftOkay) ?
'' :
'lft:<b>')
2075 . (($isLftOkay) ?
'' :
'</b>')
2077 . (($isRgtOkay) ?
'' :
'rgt:<b>')
2079 . (($isRgtOkay) ?
'' :
'</b>')
2081 . (($isDepthOkay) ?
'' :
'depth:<b>')
2083 . (($isDepthOkay) ?
'' :
'</b>')
2084 . (($isRowOkay) ?
'' :
'</font>')
2086 . (($isRowOkay) ?
'' :
'<font color=#ff0000>')
2087 . (($isRefRefOkay && $isChildOkay) ?
'' :
'ref.ref_id:<b>')
2089 . (($isRefRefOkay && $isChildOkay) ?
'' :
'</b>')
2091 . (($isRefObjOkay) ?
'' :
'ref.obj_id:<b>')
2093 . (($isRefObjOkay) ?
'' :
'</b>')
2094 . (($isRowOkay) ?
'' :
'<font color=#ff0000>')
2095 . ((
$row->deleted != null) ?
', ' .
$row->deleted :
'')
2097 . (($isRowOkay) ?
'' :
'<font color=#ff0000>')
2099 .
$row->obj_id .
', ' 2101 .
$row->login .
', ' 2103 . (($isRowOkay) ?
'' :
' <b>*ERROR*</b><font color=#ff0000>')
2118 if (count($stack) == 0 || $stack[0]->tree !=
$row->tree) {
2120 $previousNumber =
$row->lft - 1;
2126 while (count($stack) > 0 && $stack[count($stack) - 1]->rgt < $row->lft) {
2127 $popped = array_pop($stack);
2130 $gap = $popped->rgt - $previousNumber - 1;
2133 for (
$i = 1;
$i < $popped->depth;
$i++) {
2134 $poppedIndent .=
". ";
2138 .
'<td colspan=2><div align="right">' 2139 .
'<font color=#00cc00>*gap* for ' . ($gap / 2) .
' nodes at end of </font>' 2142 .
'<font color=#00cc00>' 2144 . $popped->obj_id .
', ' 2145 . $popped->type .
', ' 2146 . $popped->login .
', ' 2153 $previousNumber = $popped->rgt;
2162 $isChildOkay =
true;
2163 $isParentOkay =
true;
2166 $isDepthOkay =
true;
2169 if (count($stack) > 0) {
2170 $parent = $stack[count($stack) - 1];
2171 if ($parent->depth + 1 !=
$row->depth) {
2172 $isDepthOkay =
false;
2175 if ($parent->child !=
$row->parent) {
2176 $isParentOkay =
false;
2179 if (
$GLOBALS[
'ilSetting']->
get(
'main_tree_impl',
'ns') ==
'ns') {
2180 if ($parent->lft >=
$row->lft) {
2184 if ($parent->rgt <=
$row->rgt) {
2192 if (
$GLOBALS[
'ilSetting']->
get(
'main_tree_impl',
'ns') ==
'ns') {
2199 if (in_array(
$row->child, $duplicateNodes)) {
2200 $isChildOkay =
false;
2205 $isRefRefOkay =
true;
2206 $isRefObjOkay =
true;
2207 if (
$row->ref_id == null) {
2208 $isRefRefOkay =
false;
2211 if (
$row->obj_id == null) {
2212 $isRefObjOkay =
false;
2222 if (
$GLOBALS[
'ilSetting']->
get(
'main_tree_impl',
'ns') ==
'ns') {
2223 $gap =
$row->lft - $previousNumber - 1;
2224 $previousNumber =
$row->lft;
2228 .
'<td colspan=2><div align="right">' 2229 .
'<font color=#00cc00>*gap* for ' . ($gap / 2) .
' nodes between </font>' 2232 .
'<font color=#00cc00>siblings</font>' 2244 . (($isRowOkay) ?
'' :
'<font color=#ff0000>')
2246 .
$row->child .
', ' 2247 . (($isParentOkay) ?
'' :
'parent:<b>')
2249 . (($isParentOkay) ?
'' :
'</b>')
2251 . (($isLftOkay) ?
'' :
'lft:<b>')
2253 . (($isLftOkay) ?
'' :
'</b>')
2255 . (($isRgtOkay) ?
'' :
'rgt:<b>')
2257 . (($isRgtOkay) ?
'' :
'</b>')
2259 . (($isDepthOkay) ?
'' :
'depth:<b>')
2261 . (($isDepthOkay) ?
'' :
'</b>')
2262 . (($isRowOkay) ?
'' :
'</font>')
2264 . (($isRowOkay) ?
'' :
'<font color=#ff0000>')
2265 . (($isRefRefOkay && $isChildOkay) ?
'' :
'ref.ref_id:<b>')
2267 . (($isRefRefOkay && $isChildOkay) ?
'' :
'</b>')
2269 . (($isRefObjOkay) ?
'' :
'ref.obj_id:<b>')
2271 . (($isRefObjOkay) ?
'' :
'</b>')
2272 . (($isRowOkay) ?
'' :
'<font color=#ff0000>')
2273 . ((
$row->tree < 0) ?
', ' .
$row->deleted :
'')
2275 . (($isRowOkay) ?
'' :
'<font color=#ff0000>')
2277 .
$row->obj_id .
', ' 2279 .
$row->login .
', ' 2281 . (($isRowOkay) ?
'' :
' <b>*ERROR*</b><font color=#ff0000>')
2293 if (
$row->tree == 1) {
2294 $repository_tree_count++;
2295 } elseif (
$row->tree < 0) {
2296 $trash_trees_count++;
2298 $other_trees_count++;
2304 while (count($stack) > 0) {
2305 $popped = array_pop($stack);
2308 $gap = $popped->rgt - $previousNumber - 1;
2311 for (
$i = 1;
$i < $popped->depth;
$i++) {
2312 $poppedIndent .=
". ";
2316 .
'<td colspan=2><div align="right">' 2317 .
'<font color=#00cc00>*gap* for ' . ($gap / 2) .
' nodes at end of </font>' 2320 .
'<font color=#00cc00>' 2322 . $popped->obj_id .
', ' 2323 . $popped->type .
', ' 2324 . $popped->login .
', ' 2331 $previousNumber = $popped->rgt;
2338 if ($error_count > 0) {
2339 $this->
writeScanLogLine(
'<font color=#ff0000>' . $error_count .
' errors found while dumping tree.</font>');
2343 $this->
writeScanLogLine(
"$repository_tree_count nodes in repository tree");
2349 return $error_count;
2356 if (!is_array($this->media_pool_ids)) {
2357 $this->media_pool_ids = array();
2358 $query =
"SELECT child FROM mep_tree ";
2361 $this->media_pool_ids[] =
$row->child;
2365 return in_array($a_obj_id, $this->media_pool_ids) ? true :
false;
2382 return in_array(
$a_type, $this->object_types_exclude);
2389 if ($this->workspace_object_ids === null) {
2390 $this->workspace_object_ids = array();
2393 $set =
$ilDB->query(
"SELECT DISTINCT(obj_id) FROM object_reference_ws");
2394 while (
$row =
$ilDB->fetchAssoc($set)) {
2395 $this->workspace_object_ids[] =
$row[
"obj_id"];
2399 $set =
$ilDB->query(
"SELECT id FROM usr_portfolio");
2400 while (
$row =
$ilDB->fetchAssoc($set)) {
2401 $this->workspace_object_ids[] =
$row[
"id"];
2408 if (
sizeof($a_data)) {
2412 if (is_array($this->workspace_object_ids)) {
2413 foreach ($a_data as $idx => $item) {
2414 if (in_array($item[$a_index], $this->workspace_object_ids)) {
2415 unset($a_data[$idx]);
checkTreeStructure($a_startnode=null)
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 ...
removeInvalidChilds($a_invalid_childs=null)
Removes all tree entries without any link to a valid object.
restoreTrash($a_deleted_objects=null)
Restore all objects in trash to RecoveryFolder NOTE: All objects will be restored to top of RecoveryF...
purgeTrash($a_nodes=null)
Removes all objects in trash from system.
getInvalidChilds()
Gets all tree entries without any link to a valid object.
static _removeEntry($a_tree, $a_child, $a_db_table="tree")
STATIC METHOD Removes a single entry from a tree.
deleteScanLog()
Delete scan log.
purgeUnboundObjects($a_nodes=null)
Removes all invalid objects from system.
dumpTree()
Dumps the Tree structure into the scan log.
restoreSubTrees($a_nodes)
Restore objects (and their subobjects) to RecoveryFolder.
purgeMissingObjects($a_nodes=null)
Removes all missing objects from system.
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...
isExcludedFromRecovery($a_type, $a_obj_id)
Check if type is excluded from recovery.
hasScanLog()
Quickly determine if there is a scan log.
removeInvalidReferences($a_invalid_refs=null)
Removes all reference entries that are linked with invalid object IDs.
catch(Exception $e) $message
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.
foreach($_POST as $key=> $value) $res
removeInvalidRolefolders($a_invalid_rolefolders=null)
Removes invalid rolefolders.
purgeObjects($a_nodes)
removes objects from system
findInvalidReferences()
Search database for all reference entries that are not linked with a valid object id and stores resul...
restoreDeletedObjects($a_nodes)
Restore deleted objects (and their subobjects) to RecoveryFolder.
findInvalidRolefolders()
Search database for all rolefolder object entries with missing reference entry.
getInvalidRolefolders()
Gets invalid rolefolders (same as missing objects)
filterWorkspaceObjects(array &$a_data, $a_index="obj_id")
get_last_scan($a_scan_log)
restoreUnboundObjects($a_unbound_objects=null)
Restore objects (and their subobjects) to RecoveryFolder that are valid but not linked correctly in t...
getPossibleModes()
get possible ilValidator modes public
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.
static getInstanceByRefId($a_ref_id, $stop_on_error=true)
get an instance of an Ilias object by reference id
handleErr($error)
Callback function handles PEAR_error and outputs detailed infos about error TODO: implement that in g...
isModeEnabled($a_mode)
Is a particular mode enabled?
ILIAS Data Validator & Recovery Tool.
restoreMissingObjects($a_missing_objects=null)
Restores missing reference and/or tree entry for all objects found by this::getMissingObjects() Resto...
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.
$GLOBALS['JPEG_Segment_Names']
Global Variable: XMP_tag_captions.