| Current Path : /var/www/element/data/www/greenpr.ru/bitrix3/modules/perfmon/admin/ |
| Current File : /var/www/element/data/www/greenpr.ru/bitrix3/modules/perfmon/admin/perfmon_explain.php |
<?
define("ADMIN_MODULE_NAME", "perfmon");
define("PERFMON_STOP", true);
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/perfmon/include.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/perfmon/prolog.php");
IncludeModuleLangFile(__FILE__);
$RIGHT = $APPLICATION->GetGroupRight("perfmon");
if($RIGHT=="D")
$APPLICATION->AuthForm(GetMessage("ACCESS_DENIED"));
$APPLICATION->SetTitle(GetMessage("PERFMON_EXPLAIN_TITLE"));
$ID = IntVal($ID);
$sTableID = "tbl_perfmon_explain";
$lAdmin = new CAdminList($sTableID);
if($DBType == "mysql")
{
$arHeader = array(
array(
"id" => "select_type",
"content" => GetMessage("PERFMON_EXPLAIN_F_SELECT_TYPE"),
"align" => "left",
"default" => true,
),
array(
"id" => "table",
"content" => GetMessage("PERFMON_EXPLAIN_F_TABLE"),
"align" => "left",
"default" => true,
),
array(
"id" => "type",
"content" => GetMessage("PERFMON_EXPLAIN_F_TYPE"),
"align" => "left",
"default" => true,
),
array(
"id" => "possible_keys",
"content" => GetMessage("PERFMON_EXPLAIN_F_POSSIBLE_KEYS"),
"align" => "left",
"default" => true,
),
array(
"id" => "key",
"content" => GetMessage("PERFMON_EXPLAIN_F_KEY"),
"align" => "left",
"default" => true,
),
array(
"id" => "key_len",
"content" => GetMessage("PERFMON_EXPLAIN_F_KEY_LEN"),
"align" => "right",
"default" => true,
),
array(
"id" => "ref",
"content" => GetMessage("PERFMON_EXPLAIN_F_REF"),
"align" => "left",
"default" => true,
),
array(
"id" => "rows",
"content" => GetMessage("PERFMON_EXPLAIN_F_ROWS"),
"align" => "right",
"default" => true,
),
array(
"id" => "Extra",
"content" => GetMessage("PERFMON_EXPLAIN_F_EXTRA"),
"align" => "left",
"default" => true,
),
);
}
elseif($DBType == "oracle")
{
$arHeader = array(
array(
"id" => "OPERATION",
"content" => GetMessage("PERFMON_EXPLAIN_F_OPERATION"),
"align" => "left",
"default" => true,
),
array(
"id" => "OBJECT_NAME",
"content" => GetMessage("PERFMON_EXPLAIN_F_OBJECT_NAME"),
"align" => "left",
"default" => true,
),
array(
"id" => "OBJECT_TYPE",
"content" => GetMessage("PERFMON_EXPLAIN_F_OBJECT_TYPE"),
"align" => "left",
"default" => true,
),
array(
"id" => "OPTIONS",
"content" => GetMessage("PERFMON_EXPLAIN_F_EXTRA"),
"align" => "left",
"default" => true,
),
/* array(
"id" => "ACCESS_PREDICATES",
"content" => GetMessage("PERFMON_EXPLAIN_F_EXTRA"),
"align" => "left",
"default" => true,
),*/
/* array(
"id" => "FILTER_PREDICATES",
"content" => GetMessage("PERFMON_EXPLAIN_F_EXTRA"),
"align" => "left",
"default" => true,
),*/
array(
"id" => "CARDINALITY",
"content" => GetMessage("PERFMON_EXPLAIN_F_ROWS"),
"align" => "right",
"default" => true,
),
array(
"id" => "COST",
"content" => GetMessage("PERFMON_EXPLAIN_F_COST"),
"align" => "right",
"default" => true,
),
);
}
else
{
$arHeader = array(
);
}
$lAdmin->AddHeaders($arHeader);
$arPlan = false;
$cData = new CPerfomanceSQL;
$rsSQL = $cData->GetList(array("ID", "SQL_TEXT"), array("=ID" => $ID), array(), false);
$arSQL = $rsSQL->Fetch();
if($arSQL && preg_match("#^\s*SELECT\s+#i", $arSQL["SQL_TEXT"]))
{
if($DBType == "mysql")
{
$rsData = $DB->Query("explain ".$arSQL["SQL_TEXT"]);
}
elseif($DBType == "oracle")
{
$rsData = $DB->Query("explain plan for ".$arSQL["SQL_TEXT"]);
if($rsData)
{
$rsData = $DB->Query("select * from plan_table order by ID");
$arPlan = $rsData->Fetch();
}
}
elseif($DBType == "mssql")
{
$rsData = $DB->Query("SET SHOWPLAN_ALL ON;");
$rsData = $DB->Query($arSQL["SQL_TEXT"]);
$rsData = $DB->Query("SET SHOWPLAN_ALL OFF;");
}
else
{
$rsData = false;
}
}
else
{
$rsData = false;
}
if($rsData)
{
$SQL_TEXT = CPerfomanceSQL::Format($arSQL["SQL_TEXT"]);
$lAdmin->BeginPrologContent();
if(class_exists("geshi"))
{
$obGeSHi =& new GeSHi($SQL_TEXT, 'sql');
echo $obGeSHi->parse_code();
}
else
{
echo str_replace(
array(" ", "\n"),
array(" ", "<br>"),
htmlspecialchars($SQL_TEXT)
);
}
if($arPlan["OPTIMIZER"])
{
echo "<p>".GetMessage("PERFMON_EXPLAIN_F_OPTIMIZER").": ".$arPlan["OPTIMIZER"]."</p>";
echo "<p>".GetMessage("PERFMON_EXPLAIN_F_COST").": ".$arPlan["POSITION"]."</p>";
}
$lAdmin->EndPrologContent();
}
else
{
$rsData = new CDBResult;
$rsData->InitFromArray(array());
$lAdmin->BeginPrologContent();
$message = new CAdminMessage(array("MESSAGE"=>GetMessage("PERFMON_EXPLAIN_SQL_ERROR"), "TYPE"=>"ERROR"));
echo $message->Show();
$lAdmin->EndPrologContent();
}
$Comment = "";
$rsData = new CAdminResult($rsData, $sTableID);
$rsData->NavStart();
while($arRes = $rsData->NavNext(true, "f_"))
{
if(array_key_exists("DEPTH", $arRes))
$arRes["OPERATION"] = str_repeat(" ", $arRes["DEPTH"]).$arRes["OPERATION"];
if(array_key_exists("select_type", $arRes))
$arRes["select_type"] = $arRes["id"]." ".$arRes["select_type"];
$row =& $lAdmin->AddRow($f_ID, $arRes);
if(array_key_exists("Comment", $arRes))
$Comment .= $arRes["Comment"]."\n";
}
if($Comment)
{
$lAdmin->BeginEpilogContent();
$message = new CAdminMessage(array("MESSAGE"=>$Comment, "TYPE"=>"OK"));
echo $message->Show();
$lAdmin->EndEpilogContent();
}
$lAdmin->AddFooter(array());
$lAdmin->CheckListMode();
/***************************************************************************
HTML form
****************************************************************************/
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_popup_admin.php");
$lAdmin->DisplayList();
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_popup_admin.php");
?>