use Bitrix\Main\Loader; define("ADMIN_MODULE_NAME", "perfmon"); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php"); /** @global CMain $APPLICATION */ /** @global CDatabase $DB */ /** @global CUser $USER */ $RIGHT = $APPLICATION->GetGroupRight("perfmon"); if($RIGHT == "D") $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); $isAdmin = $USER->CanDoOperation('edit_php'); if(!Loader::includeModule('perfmon')) $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/perfmon/prolog.php"); IncludeModuleLangFile(__FILE__); $aTabs = array( array( "DIV" => "edit1", "TAB" => GetMessage("PERFMON_IDETAIL_TABLE_TAB"), "ICON" => "main_user_edit", "TITLE" => GetMessage("PERFMON_IDETAIL_TABLE_TAB_TITLE"), ), array( "DIV" => "edit2", "TAB" => GetMessage("PERFMON_IDETAIL_QUERY_TAB"), "ICON" => "main_user_edit", "TITLE" => GetMessage("PERFMON_IDETAIL_QUERY_TAB_TITLE"), ), array( "DIV" => "edit3", "TAB" => GetMessage("PERFMON_IDETAIL_INDEX_TAB"), "ICON" => "main_user_edit", "TITLE" => GetMessage("PERFMON_IDETAIL_INDEX_TAB_TITLE"), ), ); $tabControl = new CAdminTabControl("tabControl", $aTabs); $ID = intval($_REQUEST["ID"]); // Id of the edited record $rsSuggest = CPerfomanceIndexSuggest::GetList( array("ID", "TABLE_NAME", "TABLE_ALIAS", "COLUMN_NAMES", "SQL_TEXT", "SQL_EXPLAIN", "SQL_TIME", "SQL_COUNT"), array("=ID" => $ID), array() ); $arSuggest = $rsSuggest->Fetch(); if(!$arSuggest) $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); $sql = CPerfomanceSQL::Format($arSuggest["SQL_TEXT"]); $sql = htmlspecialcharsEx($sql); $sql = preg_replace("/(".preg_quote($arSuggest["TABLE_NAME"])."\\s+(?i:as\\s+)*".$arSuggest["TABLE_ALIAS"].")\\s+/", "\\1 ", $sql); foreach(explode(",", $arSuggest["COLUMN_NAMES"]) as $column_name) $sql = str_replace($arSuggest["TABLE_ALIAS"].".".$column_name, "".$arSuggest["TABLE_ALIAS"].".".$column_name."", $sql); $arSuggest["FORMATTED_SQL_TEXT"] = $sql; $arColumns = explode(",", $arSuggest["COLUMN_NAMES"]); $arTableStat = CPerfQueryStat::GatherTableStat($arSuggest["TABLE_NAME"]); $obTable = new CPerfomanceTable; $arIndexes = $obTable->GetIndexes($arSuggest["TABLE_NAME"]); $arQueries = array(); $rsQueries = CPerfomanceSQL::GetList( array("ID", "SQL_TEXT"), array("=SUGGEST_ID" => $ID), array("ID" => "ASC"), false, array("nTopCount" => 10) ); while($arQuery = $rsQueries->Fetch()) { $arQuery["STAT"] = array(); $arQuery["WHERE"] = array(); $arQuery["JOIN"] = array(); $q = new CPerfQuery; if($q->parse($q->transform2select($arQuery["SQL_TEXT"]))) { foreach($arColumns as $column_name) { $arQuery["WHERE"][$column_name] = $q->find_value($arSuggest["TABLE_NAME"], $column_name); if($arQuery["WHERE"][$column_name] == "") $arQuery["JOIN"][$column_name] = $q->find_join($arSuggest["TABLE_NAME"], $column_name); else $arQuery["JOIN"][$column_name] = ""; } } $sql = CPerfomanceSQL::Format($arQuery["SQL_TEXT"]); $sql = htmlspecialcharsEx($sql); $sql = preg_replace("/(".preg_quote($arSuggest["TABLE_NAME"])."\\s+(?i:as\\s+)*".$arSuggest["TABLE_ALIAS"].")\\s+/", "\\1 ", $sql); foreach(explode(",", $arSuggest["COLUMN_NAMES"]) as $column_name) $sql = str_replace($arSuggest["TABLE_ALIAS"].".".$column_name, "".$arSuggest["TABLE_ALIAS"].".".$column_name."", $sql); $arQuery["FORMATTED_SQL_TEXT"] = $sql; foreach($arColumns as $column_name) { if($arQuery["WHERE"][$column_name]) { $arColStat = CPerfQueryStat::GatherColumnStatByValue($arSuggest["TABLE_NAME"], $column_name, trim($arQuery["WHERE"][$column_name], "'")); if($arColStat && $arColStat["TABLE_ROWS"] > 0) { $arQuery["STAT"][$column_name] = $arColStat["COLUMN_ROWS"]/$arColStat["TABLE_ROWS"]; } } elseif($arQuery["JOIN"][$column_name]) { $arColStat = CPerfQueryStat::GatherColumnStatOverall($arSuggest["TABLE_NAME"], $column_name); if($arColStat && $arColStat["TABLE_ROWS"] > 0) { $arQuery["STAT"][$column_name] = 1/$arColStat["TABLE_ROWS"]; } } else { $arQuery["STAT"] = ""; } } $arQueries[] = $arQuery; } function _sort_index_columns($a, $b) { if($a > $b) return 1; elseif($a < $b) return -1; else return 0; } $arIndexColumns = array(); foreach($arColumns as $column_name) { $arIndexColumns[$column_name] = 0; $i = 0; foreach($arQueries as $i => $arQuery) $arIndexColumns[$column_name] += $arQuery["STAT"][$column_name]; $arIndexColumns[$column_name] /= $i + 1; } if(count($arIndexColumns) > 1) { $bHasSelective = false; foreach($arIndexColumns as $column_name => $stat) if($stat < 0.05) $bHasSelective = true; if($bHasSelective) foreach($arIndexColumns as $column_name => $stat) if($stat > 0.05) unset($arIndexColumns[$column_name]); uasort($arIndexColumns, "_sort_index_columns"); } $arIndexColumns = array_keys($arIndexColumns); $table = trim($arSuggest["TABLE_NAME"], "`"); $index = array(); foreach ($arIndexColumns as $indColumn) $index[] = trim($indColumn, "`"); $IndexExists = $DB->GetIndexName($table, $index); $strError = ''; if($_SERVER["REQUEST_METHOD"] === "POST" && check_bitrix_sessid() && $isAdmin) { if(isset($_REQUEST["create_index"]) && isset($_REQUEST["ddl"])) { $res = $DB->Query($_REQUEST["ddl"], true); if(is_object($res)) { CPerfomanceIndexComplete::Add(array( "TABLE_NAME" => $arSuggest["TABLE_NAME"], "COLUMN_NAMES" => $arSuggest["COLUMN_NAMES"], "INDEX_NAME" => $_REQUEST["index_name"], "BANNED" => "N", )); LocalRedirect("/bitrix/admin/perfmon_index_detail.php?ID=".$ID."&lang=".LANGUAGE_ID."&".$tabControl->ActiveTabParam()); } else { $strError = $DB->GetErrorMessage(); } } elseif(isset($_REQUEST["drop_index"]) && isset($_REQUEST["ddl"])) { $res = $DB->Query($_REQUEST["ddl"], true); if(is_object($res)) { CPerfomanceIndexComplete::DeleteByTableName($arSuggest["TABLE_NAME"], $arSuggest["COLUMN_NAMES"]); LocalRedirect("/bitrix/admin/perfmon_index_detail.php?ID=".$ID."&lang=".LANGUAGE_ID."&".$tabControl->ActiveTabParam()); } else $strError = $DB->GetErrorMessage(); } elseif(isset($_REQUEST["ban_index"])) { CPerfomanceIndexComplete::Add(array( "TABLE_NAME" => $arSuggest["TABLE_NAME"], "COLUMN_NAMES" => $arSuggest["COLUMN_NAMES"], "INDEX_NAME" => false, "BANNED" => "Y", )); LocalRedirect("/bitrix/admin/perfmon_index_list.php?lang=".LANGUAGE_ID); } } $APPLICATION->SetTitle(GetMessage("PERFMON_IDETAIL_TABLE_TITLE")); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php"); $aMenu = array( array( "TEXT" => GetMessage("PERFMON_IDETAIL_MENU_LIST"), "TITLE" => GetMessage("PERFMON_IDETAIL_MENU_LIST_TITLE"), "LINK" => "perfmon_index_list.php?lang=".LANGUAGE_ID, "ICON" => "btn_list", ) ); $context = new CAdminContextMenu($aMenu); $context->Show(); if($strError) { $message = new CAdminMessage(array( "MESSAGE" => GetMessage("admin_lib_error"), "DETAILS" => $strError, "TYPE" => "ERROR", )); echo $message->Show(); } ?>
$tabControl->ShowWarnings("editform", $message); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php"); ?>