* @brief */ include ('../inc/includes.php'); $DB->query("SET FOREIGN_KEY_CHECKS = '0';"); $result = $DB->list_tables(); $numtab = 0; while ($t=$DB->fetch_array($result)) { $query = "ALTER TABLE `$t[0]` TYPE = innodb"; $DB->query($query); } $relations = getDbRelations(); $query = array(); foreach ( $relations as $totable => $rels) { foreach ($rels as $fromtable => $fromfield) { if ($fromtable[0]=="_") { $fromtable = substr($fromtable, 1); } if (!is_array($fromfield)) { $query[$fromtable][] = " ADD CONSTRAINT `". $fromtable."_".$fromfield."` FOREIGN KEY (`$fromfield`) REFERENCES `$totable` (`id`) "; } else { foreach ($fromfield as $f) {
/** Check if the dropdown $ID is used into item tables * * @return boolean : is the value used ? **/ function isUsed() { global $DB; $ID = $this->fields['id']; $RELATION = getDbRelations(); if (isset($RELATION[$this->getTable()])) { foreach ($RELATION[$this->getTable()] as $tablename => $field) { if ($tablename[0] != '_') { if (!is_array($field)) { $query = "SELECT COUNT(*) AS cpt\n FROM `{$tablename}`\n WHERE `{$field}` = '{$ID}'"; $result = $DB->query($query); if ($DB->result($result, 0, "cpt") > 0) { return true; } } else { foreach ($field as $f) { $query = "SELECT COUNT(*) AS cpt\n FROM `{$tablename}`\n WHERE `{$f}` = '{$ID}'"; $result = $DB->query($query); if ($DB->result($result, 0, "cpt") > 0) { return true; } } } } } } return false; }
/** * Can I change recusvive flag to false * check if there is "linked" object in another entity * * May be overloaded if needed * * @return booleen **/ function canUnrecurs() { global $DB, $CFG_GLPI; $ID = $this->fields['id']; if ($ID < 0 || !$this->fields['is_recursive']) { return true; } $entities = "('" . $this->fields['entities_id'] . "'"; foreach (getAncestorsOf("glpi_entities", $this->fields['entities_id']) as $papa) { $entities .= ",'{$papa}'"; } $entities .= ")"; $RELATION = getDbRelations(); if ($this instanceof CommonTreeDropdown) { $f = getForeignKeyFieldForTable($this->getTable()); if (countElementsInTable($this->getTable(), "`{$f}`='{$ID}' AND entities_id NOT IN {$entities}") > 0) { return false; } } if (isset($RELATION[$this->getTable()])) { foreach ($RELATION[$this->getTable()] as $tablename => $field) { $itemtype = getItemTypeForTable($tablename); $item = new $itemtype(); if ($item->isEntityAssign()) { // 1->N Relation if (is_array($field)) { foreach ($field as $f) { if (countElementsInTable($tablename, "`{$f}`='{$ID}' AND entities_id NOT IN {$entities}") > 0) { return false; } } } else { if (countElementsInTable($tablename, "`{$field}`='{$ID}' AND entities_id NOT IN {$entities}") > 0) { return false; } } } else { foreach ($RELATION as $othertable => $rel) { // Search for a N->N Relation with devices if ($othertable == "_virtual_device" && isset($rel[$tablename])) { $devfield = $rel[$tablename][0]; // items_id... $typefield = $rel[$tablename][1]; // itemtype... $sql = "SELECT DISTINCT `{$typefield}` AS itemtype\n FROM `{$tablename}`\n WHERE `{$field}`='{$ID}'"; $res = $DB->query($sql); // Search linked device of each type if ($res) { while ($data = $DB->fetch_assoc($res)) { $itemtype = $data["itemtype"]; $itemtable = getTableForItemType($itemtype); $item = new $itemtype(); if ($item->isEntityAssign()) { if (countElementsInTable(array($tablename, $itemtable), "`{$tablename}`.`{$field}`='{$ID}'\n AND `{$tablename}`.`{$typefield}`='{$itemtype}'\n AND `{$tablename}`.`{$devfield}`=`{$itemtable}`.id\n AND `{$itemtable}`.`entities_id`\n NOT IN {$entities}") > '0') { return false; } } } } // Search for another N->N Relation } else { if ($othertable != $this->getTable() && isset($rel[$tablename])) { $itemtype = getItemTypeForTable($othertable); $item = new $itemtype(); if ($item->isEntityAssign()) { if (is_array($rel[$tablename])) { foreach ($rel[$tablename] as $otherfield) { if (countElementsInTable(array($tablename, $othertable), "`{$tablename}`.`{$field}`='{$ID}'\n AND `{$tablename}`.`{$otherfield}`\n =`{$othertable}`.id\n AND `{$othertable}`.`entities_id`\n NOT IN {$entities}") > '0') { return false; } } } else { $otherfield = $rel[$tablename]; if (countElementsInTable(array($tablename, $othertable), "`{$tablename}`.`{$field}`={$ID}\n AND `{$tablename}`.`{$otherfield}`=`{$othertable}`.id\n AND `{$othertable}`.`entities_id`\n NOT IN {$entities}") > '0') { return false; } } } } } } } } } // Doc links to this item if ($this->getType() > 0 && countElementsInTable(array('glpi_documents_items', 'glpi_documents'), "`glpi_documents_items`.`items_id`='{$ID}'\n AND `glpi_documents_items`.`itemtype`=" . $this->getType() . "\n AND `glpi_documents_items`.`documents_id`=`glpi_documents`.`id`\n AND `glpi_documents`.`entities_id` NOT IN {$entities}") > '0') { return false; } // TODO : do we need to check all relations in $RELATION["_virtual_device"] for this item return true; }
/** * Can I change recursive flag to false * check if there is "linked" object in another entity * * May be overloaded if needed * * @return booleen **/ function canUnrecurs() { global $DB, $CFG_GLPI; $ID = $this->fields['id']; if ($ID < 0 || !$this->fields['is_recursive']) { return true; } $entities = getAncestorsOf('glpi_entities', $this->fields['entities_id']); $entities[] = $this->fields['entities_id']; $RELATION = getDbRelations(); if ($this instanceof CommonTreeDropdown) { $f = getForeignKeyFieldForTable($this->getTable()); if (countElementsInTable($this->getTable(), [$f => $ID, 'NOT' => ['entities_id' => $entities]]) > 0) { return false; } } if (isset($RELATION[$this->getTable()])) { foreach ($RELATION[$this->getTable()] as $tablename => $field) { if ($tablename[0] != '_') { $itemtype = getItemTypeForTable($tablename); $item = new $itemtype(); if ($item->isEntityAssign()) { // 1->N Relation if (is_array($field)) { foreach ($field as $f) { if (countElementsInTable($tablename, [$f => $ID, 'NOT' => ['entities_id' => $entities]]) > 0) { return false; } } } else { if (countElementsInTable($tablename, [$field => $ID, 'NOT' => ['entities_id' => $entities]]) > 0) { return false; } } } else { foreach ($RELATION as $othertable => $rel) { // Search for a N->N Relation with devices if ($othertable == "_virtual_device" && isset($rel[$tablename])) { $devfield = $rel[$tablename][0]; // items_id... $typefield = $rel[$tablename][1]; // itemtype... $sql = "SELECT DISTINCT `{$typefield}` AS itemtype\n FROM `{$tablename}`\n WHERE `{$field}`='{$ID}'"; $res = $DB->query($sql); // Search linked device of each type if ($res) { while ($data = $DB->fetch_assoc($res)) { $itemtype = $data["itemtype"]; $itemtable = getTableForItemType($itemtype); $item = new $itemtype(); if ($item->isEntityAssign()) { if (countElementsInTable(array($tablename, $itemtable), ["{$tablename}.{$field}" => $ID, "{$tablename}.{$typefield}" => $itemtype, 'FKEY' => [$tablename => $devfield, $itemtable => 'id'], 'NOT' => [$itemtable . '.entities_id' => $entities]]) > '0') { return false; } } } } } else { if ($othertable != $this->getTable() && isset($rel[$tablename])) { // Search for another N->N Relation $itemtype = getItemTypeForTable($othertable); $item = new $itemtype(); if ($item->isEntityAssign()) { if (is_array($rel[$tablename])) { foreach ($rel[$tablename] as $otherfield) { if (countElementsInTable(array($tablename, $othertable), ["{$tablename}.{$field}" => $ID, 'FKEY' => [$tablename => $otherfield, $othertable => 'id'], 'NOT' => [$othertable . '.entities_id' => $entities]]) > '0') { return false; } } } else { $otherfield = $rel[$tablename]; if (countElementsInTable(array($tablename, $othertable), ["{$tablename}.{$field}" => $ID, 'FKEY' => [$tablename => $otherfield, $othertable => 'id'], 'NOT' => [$othertable . '.entities_id' => $entities]]) > '0') { return false; } } } } } } } } } } // Doc links to this item if ($this->getType() > 0 && countElementsInTable(array('glpi_documents_items', 'glpi_documents'), ['glpi_documents_items.items_id' => $ID, 'glpi_documents_items.itemtype' => $this->getType(), 'FKEY' => ['glpi_documents_items' => 'documents_id', 'glpi_documents' => 'id'], 'NOT' => ['glpi_documents.entities_id' => $entities]]) > '0') { return false; } // TODO : do we need to check all relations in $RELATION["_virtual_device"] for this item return true; }