insertInTable() public method

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
return id of the last item inserted by mysql
Ejemplo n.º 1
0
/**
 * 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}");
    }
}