function replayRulesOnExistingDB($offset = 0, $maxtime = 0, $items = array(), $params = array())
 {
     global $DB;
     if (isCommandLine()) {
         echo "replayRulesOnExistingDB started : " . date("r") . "\n";
     }
     $nb = 0;
     $i = $offset;
     //Select all the differents software
     $sql = "SELECT DISTINCT `glpi_printers`.`name`,\n                     `glpi_manufacturers`.`name` AS manufacturer,\n                     `glpi_printers`.`manufacturers_id` AS manufacturers_id,\n                     `glpi_printers`.`comment` AS comment\n              FROM `glpi_printers`\n              LEFT JOIN `glpi_manufacturers`\n                  ON (`glpi_manufacturers`.`id` = `glpi_printers`.`manufacturers_id`) ";
     // Do not replay on trash and templates
     $sql .= "WHERE `glpi_printers`.`is_deleted` = '0'\n                     AND `glpi_printers`.`is_template` = '0' ";
     if ($offset) {
         $sql .= " LIMIT " . intval($offset) . ",999999999";
     }
     $res = $DB->query($sql);
     $nb = $DB->numrows($res) + $offset;
     $step = $nb > 1000 ? 50 : ($nb > 20 ? floor($DB->numrows($res) / 20) : 1);
     while ($input = $DB->fetch_array($res)) {
         if (!($i % $step)) {
             if (isCommandLine()) {
                 echo date("H:i:s") . " replayRulesOnExistingDB : {$i}/{$nb} (" . round(memory_get_usage() / (1024 * 1024), 2) . " Mo)\n";
             } else {
                 changeProgressBarPosition($i, $nb, "{$i} / {$nb}");
             }
         }
         //Replay printer dictionnary rules
         $input = addslashes_deep($input);
         $res_rule = $this->processAllRules($input, array(), array());
         $res_rule = addslashes_deep($res_rule);
         foreach (array('manufacturer', 'is_global', 'name') as $attr) {
             if (isset($res_rule[$attr]) && $res_rule[$attr] == '') {
                 unset($res_rule[$attr]);
             }
         }
         //If the software's name or version has changed
         if (self::somethingHasChanged($res_rule, $input)) {
             $IDs = array();
             //Find all the printers in the database with the same name and manufacturer
             $sql = "SELECT `id`\n                    FROM `glpi_printers`\n                    WHERE `name` = '" . $input["name"] . "'\n                          AND `manufacturers_id` = '" . $input["manufacturers_id"] . "'";
             $res_printer = $DB->query($sql);
             if ($DB->numrows($res_printer) > 0) {
                 //Store all the software's IDs in an array
                 while ($result = $DB->fetch_array($res_printer)) {
                     $IDs[] = $result["id"];
                 }
                 //Replay dictionnary on all the softwares
                 $this->replayDirectionnaryOnPrintersByID($IDs, $res_rule);
             }
         }
         $i++;
         if ($maxtime) {
             $crt = explode(" ", microtime());
             if ($crt[0] + $crt[1] > $maxtime) {
                 break;
             }
         }
     }
     if (isCommandLine()) {
         echo "replayRulesOnExistingDB : {$i}/{$nb}               \n";
     } else {
         changeProgressBarPosition($i, $nb, "{$i} / {$nb}");
     }
     if (isCommandLine()) {
         echo "replayRulesOnExistingDB ended : " . date("r") . "\n";
     }
     return $i == $nb ? -1 : $i;
 }
 function ConvertField($force = 0)
 {
     include GLPI_ROOT . "/plugins/fusioninventory/inc_constants/snmp.mapping.constant.php";
     global $DB, $LANG;
     $constantsfield = array();
     foreach ($FUSIONINVENTORY_MAPPING[NETWORKING_TYPE] as $fieldtype => $array) {
         $constantsfield[$FUSIONINVENTORY_MAPPING[NETWORKING_TYPE][$fieldtype]['name']] = $fieldtype;
     }
     echo "<center><table align='center' width='500'>";
     echo "<tr>";
     echo "<td>";
     echo "Converting history port ...";
     echo "</td>";
     echo "</tr>";
     echo "<tr>";
     echo "<td>";
     createProgressBar("Update Ports history");
     $query = "SELECT *\n                FROM " . $this->table . "\n                WHERE `Field` != '0';";
     if ($result = $DB->query($query)) {
         $nb = $DB->numrows($result);
         if ($nb > 300000 and $force == '0') {
             echo $LANG['plugin_fusioninventory']["update"][0] . "<br/>";
             echo "cd glpi/plugins/fusioninventory/front/ && php -f cli_update.php";
             echo "<br/>Waiting...";
             file_put_contents(GLPI_PLUGIN_DOC_DIR . "/fusioninventory/cli-update.txt", "1");
             sleep(20);
             return;
         }
         $i = 0;
         while ($data = $DB->fetch_array($result)) {
             $i++;
             if (isset($constantsfield[$data['Field']])) {
                 $data['Field'] = $constantsfield[$data['Field']];
                 $query_update = "UPDATE `" . $this->table . "`\n                  SET `Field`='" . $data['Field'] . "'\n                  WHERE `ID`='" . $data['ID'] . "' ";
                 $DB->query($query_update);
                 if (preg_match("/000\$/", $i)) {
                     changeProgressBarPosition($i, $nb, "{$i} / {$nb}");
                 }
             }
         }
     }
     changeProgressBarPosition($i, $nb, "{$i} / {$nb}");
     echo "</td>";
     echo "</tr>";
     echo "</table></center>";
     // Move connections from glpi_plugin_fusioninventory_snmphistories to glpi_plugin_fusioninventory_snmphistoryconnections
     $pfihc = new PluginFusioninventorySnmphistoryconnection();
     echo "<br/><center><table align='center' width='500'>";
     echo "<tr>";
     echo "<td>";
     echo "Moving creation connections history ...";
     echo "</td>";
     echo "</tr>";
     echo "<tr>";
     echo "<td>";
     createProgressBar("Move create connections");
     $query = "SELECT *\n                FROM " . $this->table . "\n                WHERE `Field` = '0' \n                  AND ((`old_value` NOT LIKE '%:%')\n                        OR (`old_value` IS NULL))";
     if ($result = $DB->query($query)) {
         $nb = $DB->numrows($result);
         $i = 0;
         changeProgressBarPosition($i, $nb, "{$i} / {$nb}");
         while ($data = $DB->fetch_array($result)) {
             $i++;
             // Search port from mac address
             $query_port = "SELECT * FROM `glpi_networking_ports`\n               WHERE `ifmac`='" . $data['new_value'] . "' ";
             if ($result_port = $DB->query($query_port)) {
                 if ($DB->numrows($result_port) == '1') {
                     $input = array();
                     $data_port = $DB->fetch_assoc($result_port);
                     $input['FK_port_source'] = $data_port['ID'];
                     $query_port2 = "SELECT * FROM `glpi_networking_ports`\n                     WHERE `on_device` = '" . $data['new_device_ID'] . "'\n                        AND `device_type` = '" . $data['new_device_type'] . "' ";
                     if ($result_port2 = $DB->query($query_port2)) {
                         if ($DB->numrows($result_port2) == '1') {
                             $data_port2 = $DB->fetch_assoc($result_port2);
                             $input['FK_port_destination'] = $data_port2['ID'];
                             $input['date'] = $data['date_mod'];
                             $input['creation'] = 1;
                             $input['process_number'] = $data['FK_process'];
                             $pfihc->add($input);
                         }
                     }
                 }
             }
             $query_delete = "DELETE FROM `" . $this->table . "`\n                  WHERE `ID`='" . $data['ID'] . "' ";
             $DB->query($query_delete);
             if (preg_match("/00\$/", $i)) {
                 changeProgressBarPosition($i, $nb, "{$i} / {$nb}");
             }
         }
     }
     changeProgressBarPosition($i, $nb, "{$i} / {$nb}");
     echo "</td>";
     echo "</tr>";
     echo "</table></center>";
     echo "<br/><center><table align='center' width='500'>";
     echo "<tr>";
     echo "<td>";
     echo "Moving deleted connections history ...";
     echo "</td>";
     echo "</tr>";
     echo "<tr>";
     echo "<td>";
     createProgressBar("Move delete connections");
     $query = "SELECT *\n                FROM " . $this->table . "\n                WHERE `Field` = '0'\n                  AND ((`new_value` NOT LIKE '%:%')\n                        OR (`new_value` IS NULL))";
     if ($result = $DB->query($query)) {
         $nb = $DB->numrows($result);
         $i = 0;
         changeProgressBarPosition($i, $nb, "{$i} / {$nb}");
         while ($data = $DB->fetch_array($result)) {
             $i++;
             // Search port from mac address
             $query_port = "SELECT * FROM `glpi_networking_ports`\n               WHERE `ifmac`='" . $data['old_value'] . "' ";
             if ($result_port = $DB->query($query_port)) {
                 if ($DB->numrows($result_port) == '1') {
                     $input = array();
                     $data_port = $DB->fetch_assoc($result_port);
                     $input['FK_port_source'] = $data_port['ID'];
                     $query_port2 = "SELECT * FROM `glpi_networking_ports`\n                     WHERE `on_device` = '" . $data['old_device_ID'] . "'\n                        AND `device_type` = '" . $data['old_device_type'] . "' ";
                     if ($result_port2 = $DB->query($query_port2)) {
                         if ($DB->numrows($result_port2) == '1') {
                             $data_port2 = $DB->fetch_assoc($result_port2);
                             $input['FK_port_destination'] = $data_port2['ID'];
                             $input['date'] = $data['date_mod'];
                             $input['creation'] = 1;
                             $input['process_number'] = $data['FK_process'];
                             if ($input['FK_port_source'] != $input['FK_port_destination']) {
                                 $pfihc->add($input);
                             }
                         }
                     }
                 }
             }
             $query_delete = "DELETE FROM `" . $this->table . "`\n                  WHERE `ID`='" . $data['ID'] . "' ";
             $DB->query($query_delete);
             if (preg_match("/00\$/", $i)) {
                 changeProgressBarPosition($i, $nb, "{$i} / {$nb}");
             }
         }
     }
     changeProgressBarPosition($i, $nb, "{$i} / {$nb}");
     echo "</td>";
     echo "</tr>";
     echo "</table></center>";
 }
 /**
  * Merge softwares with current
  *
  * @param $item array of software ID to be merged
  *
  * @return boolean about success
  **/
 function merge($item)
 {
     global $DB, $LANG;
     $ID = $this->getField('id');
     echo "<div class='center'>";
     echo "<table class='tab_cadrehov'><tr><th>" . $LANG['software'][47] . "</th></tr>";
     echo "<tr class='tab_bg_2'><td>";
     createProgressBar($LANG['rulesengine'][90]);
     echo "</td></tr></table></div>\n";
     $item = array_keys($item);
     // Search for software version
     $req = $DB->request("glpi_softwareversions", array("softwares_id" => $item));
     $i = 0;
     if ($nb = $req->numrows()) {
         foreach ($req as $from) {
             $found = false;
             foreach ($DB->request("glpi_softwareversions", array("softwares_id" => $ID, "name" => $from["name"])) as $dest) {
                 // Update version ID on License
                 $sql = "UPDATE `glpi_softwarelicenses`\n                       SET `softwareversions_id_buy` = '" . $dest["id"] . "'\n                       WHERE `softwareversions_id_buy` = '" . $from["id"] . "'";
                 $DB->query($sql);
                 $sql = "UPDATE `glpi_softwarelicenses`\n                       SET `softwareversions_id_use` = '" . $dest["id"] . "'\n                       WHERE `softwareversions_id_use` = '" . $from["id"] . "'";
                 $DB->query($sql);
                 // Move installation to existing version in destination software
                 $sql = "UPDATE `glpi_computers_softwareversions`\n                       SET `softwareversions_id` = '" . $dest["id"] . "'\n                       WHERE `softwareversions_id` = '" . $from["id"] . "'";
                 $found = $DB->query($sql);
             }
             if ($found) {
                 // Installation has be moved, delete the source version
                 $sql = "DELETE\n                       FROM `glpi_softwareversions`\n                       WHERE `id` = '" . $from["id"] . "'";
             } else {
                 // Move version to destination software
                 $sql = "UPDATE `glpi_softwareversions`\n                       SET `softwares_id` = '{$ID}',\n                           `entities_id` = '" . $this->getField('entities_id') . "'\n                       WHERE `id` = '" . $from["id"] . "'";
             }
             if ($DB->query($sql)) {
                 $i++;
             }
             changeProgressBarPosition($i, $nb + 1);
         }
     }
     // Move software license
     $sql = "UPDATE `glpi_softwarelicenses`\n              SET `softwares_id` = '{$ID}'\n              WHERE `softwares_id` IN ('" . implode("','", $item) . "')";
     if ($DB->query($sql)) {
         $i++;
     }
     if ($i == $nb + 1) {
         //error_log ("All merge operations ok.");
         $soft = new self();
         foreach ($item as $old) {
             $soft->putInTrash($old, $LANG['software'][49]);
         }
     }
     changeProgressBarPosition($i, $nb + 1, $LANG['rulesengine'][91]);
     return $i == $nb + 1;
 }
 /**
  * Replay collection rules on an existing DB for model dropdowns
  *
  * @param $offset offset used to begin
  * @param $maxtime maximum time of process (reload at the end)
  *
  * @return -1 on completion else current offset
  **/
 function replayRulesOnExistingDBForModel($offset = 0, $maxtime = 0)
 {
     global $DB, $LANG;
     if (isCommandLine()) {
         echo "replayRulesOnExistingDB started : " . date("r") . "\n";
     }
     // Model check : need to check using manufacturer extra data
     if (strpos($this->item_table, 'models') === false) {
         echo "Error replaying rules";
         return false;
     }
     $model_table = getPlural(str_replace('models', '', $this->item_table));
     $model_field = getForeignKeyFieldForTable($this->item_table);
     // Need to give manufacturer from item table
     $Sql = "SELECT DISTINCT `glpi_manufacturers`.`id` AS idmanu,\n                     `glpi_manufacturers`.`name` AS manufacturer,\n                     `" . $this->item_table . "`.`id`,\n                     `" . $this->item_table . "`.`name` AS name,\n                     `" . $this->item_table . "`.`comment`\n              FROM `" . $this->item_table . "`,\n                   `{$model_table}`\n              LEFT JOIN `glpi_manufacturers`\n                  ON (`{$model_table}`.`manufacturers_id` = `glpi_manufacturers`.`id`)\n              WHERE `{$model_table}`.`{$model_field}` = `" . $this->item_table . "`.`id`";
     if ($offset) {
         $Sql .= " LIMIT " . intval($offset) . ",999999999";
     }
     $result = $DB->query($Sql);
     $nb = $DB->numrows($result) + $offset;
     $i = $offset;
     if ($result && $nb > $offset) {
         // Step to refresh progressbar
         $step = $nb > 20 ? floor($nb / 20) : 1;
         $tocheck = array();
         while ($data = $DB->fetch_array($result)) {
             if (!($i % $step)) {
                 if (isCommandLine()) {
                     echo "replayRulesOnExistingDB : {$i}/{$nb}\r";
                 } else {
                     changeProgressBarPosition($i, $nb, "{$i} / {$nb}");
                 }
             }
             // Model case
             if (isset($data["manufacturer"])) {
                 $data["manufacturer"] = Manufacturer::processName($data["manufacturer"]);
             }
             //Replay Type dictionnary
             $ID = Dropdown::importExternal(getItemTypeForTable($this->item_table), addslashes($data["name"]), -1, $data, addslashes($data["comment"]));
             if ($data['id'] != $ID) {
                 $tocheck[$data["id"]][] = $ID;
                 $sql = "UPDATE `{$model_table}`\n                       SET `{$model_field}` = '{$ID}'\n                       WHERE `{$model_field}` = '" . $data['id'] . "'";
                 if (empty($data['idmanu'])) {
                     $sql .= " AND (`manufacturers_id` IS NULL\n                                 OR `manufacturers_id` = '0')";
                 } else {
                     $sql .= " AND `manufacturers_id` = '" . $data['idmanu'] . "'";
                 }
                 $DB->query($sql);
             }
             $i++;
             if ($maxtime) {
                 $crt = explode(" ", microtime());
                 if ($crt[0] + $crt[1] > $maxtime) {
                     break;
                 }
             }
         }
         foreach ($tocheck as $ID => $tab) {
             $sql = "SELECT COUNT(*)\n                    FROM `{$model_table}`\n                    WHERE `{$model_field}` = '{$ID}'";
             $result = $DB->query($sql);
             $deletecartmodel = false;
             // No item left : delete old item
             if ($result && $DB->result($result, 0, 0) == 0) {
                 $Sql = "DELETE\n                       FROM `" . $this->item_table . "`\n                       WHERE `id` = '{$ID}'";
                 $resdel = $DB->query($Sql);
                 $deletecartmodel = true;
             }
             // Manage cartridge assoc Update items
             if ($this->getRuleClassName() == 'RuleDictionnaryPrinterModel') {
                 $sql = "SELECT *\n                       FROM `glpi_cartridgeitems_printermodels`\n                       WHERE `printermodels_id` = '{$ID}'";
                 if ($result = $DB->query($sql)) {
                     if ($DB->numrows($result)) {
                         // Get compatible cartridge type
                         $carttype = array();
                         while ($data = $DB->fetch_array($result)) {
                             $carttype[] = $data['cartridgeitems_id'];
                         }
                         // Delete cartrodges_assoc
                         if ($deletecartmodel) {
                             $sql = "DELETE\n                                FROM `glpi_cartridgeitems_printermodels`\n                                WHERE `printermodels_id` = 'id'";
                             $DB->query($sql);
                         }
                         // Add new assoc
                         if (!class_exists('CartridgeItem')) {
                             include_once GLPI_ROOT . "/inc/cartridgeitem.function.php";
                         }
                         $ct = new CartridgeItem();
                         foreach ($carttype as $cartID) {
                             foreach ($tab as $model) {
                                 $ct->addCompatibleType($cartID, $model);
                             }
                         }
                     }
                 }
             }
         }
         // each tocheck
     }
     if (isCommandLine()) {
         echo "replayRulesOnExistingDB ended : " . date("r") . "\n";
     } else {
         changeProgressBarPosition($i, $nb, "{$i} / {$nb}");
     }
     return $i == $nb ? -1 : $i;
 }