Insert an entry inside a table
public insertInTable ( $table, array $input ) : id | ||
$table | string The table to alter | |
$input | array | array The elements to add inside the table |
리턴 | id | of the last item inserted by mysql |
/** * Migrate tables from plugin fusinvdeploy to fusioninventory * all datas in exploded tables are merged and stored in json in order table * @param Migration $migration * @return nothing */ function migrateTablesFromFusinvDeploy($migration) { global $DB; if (TableExists("glpi_plugin_fusioninventory_deployorders") && TableExists("glpi_plugin_fusinvdeploy_checks") && TableExists("glpi_plugin_fusinvdeploy_files") && TableExists("glpi_plugin_fusinvdeploy_actions")) { //add json field in deploy order table to store datas from old misc tables $field_created = $migration->addField("glpi_plugin_fusioninventory_deployorders", "json", "longtext DEFAULT NULL"); $migration->migrationOneTable("glpi_plugin_fusioninventory_deployorders"); $final_datas = array(); //== glpi_plugin_fusioninventory_deployorders == $o_query = "SELECT * FROM glpi_plugin_fusioninventory_deployorders"; $o_res = $DB->query($o_query); while ($o_datas = $DB->fetch_assoc($o_res)) { $order_id = $o_datas['id']; $o_line = array(); $of_line = array(); $o_line['checks'] = array(); $o_line['actions'] = array(); $o_line['associatedFiles'] = array(); //=== Checks === if (TableExists("glpi_plugin_fusinvdeploy_checks")) { $c_query = "SELECT type, path, value, 'error' as `return`\n FROM glpi_plugin_fusinvdeploy_checks\n WHERE plugin_fusinvdeploy_orders_id = {$order_id}\n ORDER BY ranking ASC"; $c_res = $DB->query($c_query); $c_i = 0; while ($c_datas = $DB->fetch_assoc($c_res)) { foreach ($c_datas as $c_key => $c_value) { //specific case for filesytem sizes, convert to bytes if (!empty($c_value) && is_numeric($c_value) && $c_datas['type'] !== 'freespaceGreater') { $c_value = $c_value * 1024 * 1024; } //construct job check entry $o_line['checks'][$c_i][$c_key] = $c_value; } $c_i++; } } $files_list = array(); //=== Files === if (TableExists("glpi_plugin_fusinvdeploy_files")) { $f_query = "SELECT id, name, is_p2p as p2p, filesize, mimetype, " . "p2p_retention_days as `p2p-retention-duration`, uncompress, sha512 " . "FROM glpi_plugin_fusinvdeploy_files " . "WHERE plugin_fusinvdeploy_orders_id = {$order_id}"; $f_res = $DB->query($f_query); while ($f_datas = $DB->fetch_assoc($f_res)) { //jump to next entry if sha512 is empty // This kind of entries could happen sometimes on upload errors if (empty($f_datas['sha512'])) { continue; } //construct job file entry $o_line['associatedFiles'][] = $f_datas['sha512']; foreach ($f_datas as $f_key => $f_value) { //we don't store the sha512 field in json if ($f_key == "sha512" || $f_key == "id" || $f_key == "filesize" || $f_key == "mimetype") { continue; } //construct order file entry $of_line[$f_datas['sha512']][$f_key] = $f_value; } if (!in_array($f_datas['sha512'], $files_list)) { $files_list[] = $f_datas['sha512']; } } } //=== Actions === $cmdStatus['RETURNCODE_OK'] = 'okCode'; $cmdStatus['RETURNCODE_KO'] = 'errorCode'; $cmdStatus['REGEX_OK'] = 'okPattern'; $cmdStatus['REGEX_KO'] = 'errorPattern'; if (TableExists("glpi_plugin_fusinvdeploy_actions")) { $a_query = "SELECT *\n FROM glpi_plugin_fusinvdeploy_actions\n WHERE plugin_fusinvdeploy_orders_id = {$order_id}\n ORDER BY ranking ASC"; $a_res = $DB->query($a_query); $a_i = 0; while ($a_datas = $DB->fetch_assoc($a_res)) { //get type $type = strtolower(str_replace("PluginFusinvdeployAction_", "", $a_datas['itemtype'])); //specific case for command type $type = str_replace("command", "cmd", $type); //table for action itemtype $a_table = getTableForItemType($a_datas['itemtype']); //get table fields $at_query = "SELECT *\n FROM {$a_table}\n WHERE id = " . $a_datas['items_id']; $at_res = $DB->query($at_query); while ($at_datas = $DB->fetch_assoc($at_res)) { foreach ($at_datas as $at_key => $at_value) { //we don't store the id field of action itemtype table in json if ($at_key == "id") { continue; } //specific case for 'path' field if ($at_key == "path") { $o_line['actions'][$a_i][$type]['list'][] = $at_value; } else { //construct job actions entry $o_line['actions'][$a_i][$type][$at_key] = $at_value; } } //specific case for commands : we must add status and env vars if ($a_datas['itemtype'] === "PluginFusinvdeployAction_Command") { $ret_cmd_query = "SELECT type, value\n FROM glpi_plugin_fusinvdeploy_actions_commandstatus\n WHERE plugin_fusinvdeploy_commands_id = " . $at_datas['id']; $ret_cmd_res = $DB->query($ret_cmd_query); while ($res_cmd_datas = $DB->fetch_assoc($ret_cmd_res)) { // Skip empty retchecks type: // This surely means they have been drop at some point but entry has not been // removed from database. if (!empty($res_cmd_datas['type'])) { //construct command status array entry $o_line['actions'][$a_i][$type]['retChecks'][] = array('type' => $cmdStatus[$res_cmd_datas['type']], 'values' => array($res_cmd_datas['value'])); } } } } $a_i++; } } $final_datas[$order_id]['jobs'] = $o_line; $final_datas[$order_id]['associatedFiles'] = $of_line; unset($o_line); unset($of_line); } $options = 0; if (version_compare(PHP_VERSION, '5.3.3') >= 0) { $options = $options | JSON_NUMERIC_CHECK; } if (version_compare(PHP_VERSION, '5.4.0') >= 0) { $options = $options | JSON_UNESCAPED_SLASHES; } //store json in order table foreach ($final_datas as $order_id => $data) { $json = $DB->escape(json_encode($data, $options)); $order_query = "UPDATE glpi_plugin_fusioninventory_deployorders\n SET json = '{$json}'\n WHERE id = {$order_id}"; $DB->query($order_query); } } //=== Fileparts === if (TableExists('glpi_plugin_fusinvdeploy_fileparts') && TableExists('glpi_plugin_fusinvdeploy_files')) { $files_list = $DB->request('glpi_plugin_fusinvdeploy_files'); // multipart file datas foreach ($files_list as $file) { $sha = $file['sha512']; if (empty($sha)) { continue; } $shortsha = substr($sha, 0, 6); $fp_query = "SELECT fp.`sha512` as filepart_hash, " . " f.`sha512` as file_hash " . "FROM `glpi_plugin_fusinvdeploy_files` as f " . "INNER JOIN `glpi_plugin_fusinvdeploy_fileparts` as fp " . "ON f.`id` = fp.`plugin_fusinvdeploy_files_id` " . " AND f.`shortsha512` = '{$shortsha}' " . "GROUP BY fp.`sha512` " . "ORDER BY fp.`id`"; $fp_res = $DB->query($fp_query); if ($DB->numrows($fp_res) > 0) { //print("writing file : " . GLPI_PLUGIN_DOC_DIR."/fusioninventory/files/manifests/{$sha}" . "\n"); $fhandle = fopen(GLPI_PLUGIN_DOC_DIR . "/fusioninventory/files/manifests/{$sha}", 'w+'); while ($fp_datas = $DB->fetch_assoc($fp_res)) { if ($fp_datas['file_hash'] === $sha) { fwrite($fhandle, $fp_datas['filepart_hash'] . "\n"); } } fclose($fhandle); } } } //migrate fusinvdeploy_files to fusioninventory_deployfiles if (TableExists("glpi_plugin_fusinvdeploy_files")) { $DB->query("TRUNCATE TABLE `glpi_plugin_fusioninventory_deployfiles`"); if (FieldExists("glpi_plugin_fusinvdeploy_files", "filesize")) { $f_query = implode(array("SELECT files.`id`, files.`name`,", " files.`filesize`, files.`mimetype`,", " files.`sha512`, files.`shortsha512`,", " files.`create_date`,", " pkgs.`entities_id`, pkgs.`is_recursive`", "FROM glpi_plugin_fusinvdeploy_files as files", "LEFT JOIN glpi_plugin_fusioninventory_deployorders as orders", " ON orders.`id` = files.`plugin_fusinvdeploy_orders_id`", "LEFT JOIN glpi_plugin_fusioninventory_deploypackages as pkgs", " ON orders.`plugin_fusioninventory_deploypackages_id` = pkgs.`id`", "WHERE", " files.`shortsha512` != \"\""), " \n"); $f_res = $DB->query($f_query); while ($f_datas = $DB->fetch_assoc($f_res)) { $entry = array("id" => $f_datas["id"], "name" => $f_datas["name"], "filesize" => $f_datas["filesize"], "mimetype" => $f_datas["mimetype"], "shortsha512" => $f_datas["shortsha512"], "sha512" => $f_datas["sha512"], "comments" => "", "date_mod" => $f_datas["create_date"], "entities_id" => $f_datas["entities_id"], "is_recursive" => $f_datas["is_recursive"]); $migration->displayMessage("\n"); // Check if file exists $i_DeployFile = new PluginFusioninventoryDeployFile(); $migration->displayMessage("migrating file " . $entry['name'] . " sha:" . $entry['sha512'] . "\n"); if ($i_DeployFile->checkPresenceManifest($entry['sha512'])) { $migration->displayMessage("manifest exists" . "\n"); $migration->insertInTable("glpi_plugin_fusioninventory_deployfiles", $entry); } } } } /** * JSON orders fixer: * This piece of code makes sure that JSON orders in database are valid and will fix it * otherwise. */ $orders = $DB->request('glpi_plugin_fusioninventory_deployorders'); foreach ($orders as $order_config) { $pfDeployOrder = new PluginFusioninventoryDeployOrder(); $json_order = json_decode($order_config['json']); //print("deployorders fixer : actual order structure for ID ".$order_config['id']."\n" . print_r($json_order,true) ."\n"); // Checks for /jobs json property if (!isset($json_order->jobs) || !is_object($json_order->jobs)) { //print("deployorders fixer : create missing required 'jobs' property\n"); $json_order->jobs = new stdClass(); } if (!isset($json_order->jobs->checks)) { //print("deployorders fixer : create missing required '/jobs/checks' array property\n"); $json_order->jobs->checks = array(); } if (!isset($json_order->jobs->actions)) { //print("deployorders fixer : create missing required '/jobs/actions' array property\n"); $json_order->jobs->actions = array(); } if (!isset($json_order->jobs->associatedFiles)) { //print("deployorders fixer : create missing required '/jobs/associatedFiles' array property\n"); $json_order->jobs->associatedFiles = array(); } // Checks for /associatedFiles json property if (!isset($json_order->associatedFiles) || !is_object($json_order->associatedFiles)) { //print("deployorders fixer : create missing required 'associatedFiles' property\n"); $json_order->associatedFiles = new stdClass(); } //print( //"deployorders fixer : final order structure for ID ".$order_config['id']."\n" . // json_encode($json_order,JSON_PRETTY_PRINT) ."\n" //); $pfDeployOrder::updateOrderJson($order_config['id'], $json_order); } /** * Drop unused tables */ $old_deploy_tables = array('glpi_plugin_fusinvdeploy_actions', 'glpi_plugin_fusinvdeploy_actions_commandenvvariables', 'glpi_plugin_fusinvdeploy_actions_commands', 'glpi_plugin_fusinvdeploy_actions_commandstatus', 'glpi_plugin_fusinvdeploy_actions_copies', 'glpi_plugin_fusinvdeploy_actions_deletes', 'glpi_plugin_fusinvdeploy_actions_messages', 'glpi_plugin_fusinvdeploy_actions_mkdirs', 'glpi_plugin_fusinvdeploy_actions_moves', 'glpi_plugin_fusinvdeploy_checks', 'glpi_plugin_fusinvdeploy_fileparts', 'glpi_plugin_fusinvdeploy_files', 'glpi_plugin_fusinvdeploy_files_mirrors'); foreach ($old_deploy_tables as $table) { $migration->dropTable($table); } //drop unused views $old_deploy_views = array('glpi_plugin_fusinvdeploy_taskjobs', 'glpi_plugin_fusinvdeploy_tasks'); foreach ($old_deploy_views as $view) { $DB->query("DROP VIEW IF EXISTS {$view}"); } }