Пример #1
0
* @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) {
Пример #2
0
 /** 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;
 }
Пример #3
0
 /**
  * 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;
 }
Пример #4
0
 /**
  * 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;
 }