static function GetList($arSelect, $arFilter, $arOrder)
{
global $DB;
if(!is_array($arSelect))
$arSelect = array();
if(count($arSelect) < 1)
$arSelect = array(
"ID",
"RULE_TYPE",
"ACTIVE",
"ADMIN_SECTION",
"SITE_ID",
"SORT",
"NAME",
"ACTIVE_FROM",
"ACTIVE_TO",
);
if(!is_array($arOrder))
$arOrder = array();
$arQueryOrder = array();
foreach($arOrder as $strColumn => $strDirection)
{
$strColumn = mb_strtoupper($strColumn);
$strDirection = mb_strtoupper($strDirection) == "ASC"? "ASC": "DESC";
switch($strColumn)
{
case "ID":
case "RULE_TYPE":
case "ACTIVE":
case "ADMIN_SECTION":
case "SITE_ID":
case "SORT":
case "NAME":
$arSelect[] = $strColumn;
$arQueryOrder[$strColumn] = $strColumn." ".$strDirection;
break;
case "ACTIVE_FROM":
case "ACTIVE_TO":
$arSelect[] = $strColumn;
$arSelect[] = $strColumn."_TIMESTAMP";
$arQueryOrder[$strColumn] = $strColumn."_TIMESTAMP ".$strDirection;
break;
}
}
$arQuerySelect = array();
foreach($arSelect as $strColumn)
{
$strColumn = mb_strtoupper($strColumn);
switch($strColumn)
{
case "ID":
case "RULE_TYPE":
case "ACTIVE":
case "ADMIN_SECTION":
case "SITE_ID":
case "SORT":
case "NAME":
case "ACTIVE_FROM_TIMESTAMP":
case "ACTIVE_TO_TIMESTAMP":
$arQuerySelect[$strColumn] = "r.".$strColumn;
break;
case "ACTIVE_FROM":
case "ACTIVE_TO":
$arQuerySelect[$strColumn] = $DB->DateToCharFunction("r.".$strColumn, "FULL")." AS ".$strColumn;
break;
}
}
if(count($arQuerySelect) < 1)
$arQuerySelect = array("ID"=>"r.ID");
$obQueryWhere = new CSQLWhere;
$arFields = array(
"ID" => array(
"TABLE_ALIAS" => "r",
"FIELD_NAME" => "r.ID",
"FIELD_TYPE" => "int",
"JOIN" => false,
),
"RULE_TYPE" => array(
"TABLE_ALIAS" => "r",
"FIELD_NAME" => "r.RULE_TYPE",
"FIELD_TYPE" => "string",
"JOIN" => false,
),
"ACTIVE" => array(
"TABLE_ALIAS" => "r",
"FIELD_NAME" => "r.ACTIVE",
"FIELD_TYPE" => "string",
"JOIN" => false,
),
"ADMIN_SECTION" => array(
"TABLE_ALIAS" => "r",
"FIELD_NAME" => "r.ADMIN_SECTION",
"FIELD_TYPE" => "string",
"JOIN" => false,
),
"SITE_ID" => array(
"TABLE_ALIAS" => "r",
"FIELD_NAME" => "r.SITE_ID",
"FIELD_TYPE" => "string",
"JOIN" => false,
),
"SORT" => array(
"TABLE_ALIAS" => "r",
"FIELD_NAME" => "r.SORT",
"FIELD_TYPE" => "int",
"JOIN" => false,
),
"NAME" => array(
"TABLE_ALIAS" => "r",
"FIELD_NAME" => "r.NAME",
"FIELD_TYPE" => "string",
"JOIN" => false,
),
"ACTIVE_FROM" => array(
"TABLE_ALIAS" => "r",
"FIELD_NAME" => "r.ACTIVE_FROM",
"FIELD_TYPE" => "datetime",
"JOIN" => false,
),
"ACTIVE_TO" => array(
"TABLE_ALIAS" => "r",
"FIELD_NAME" => "r.ACTIVE_TO",
"FIELD_TYPE" => "datetime",
"JOIN" => false,
),
);
$obQueryWhere->SetFields($arFields);
if(!is_array($arFilter))
$arFilter = array();
$strQueryWhere = $obQueryWhere->GetQuery($arFilter);
$bDistinct = $obQueryWhere->bDistinctReqired;
$strMaskJoin = "";
if(array_key_exists("PATH", $arFilter))
{
$path = trim($arFilter["PATH"]);
if($path)
{
$bDistinct = true;
$strMaskJoin = "
INNER JOIN b_sec_iprule_incl_mask im on im.IPRULE_ID = r.ID
LEFT JOIN b_sec_iprule_excl_mask em on em.IPRULE_ID = r.ID AND '".$DB->ForSQL($path)."' like em.LIKE_MASK
";
$strMaskWhere = "('".$DB->ForSQL($path)."' like im.LIKE_MASK AND em.IPRULE_ID is null)";
if($strQueryWhere)
$strQueryWhere = "(".$strQueryWhere.") AND ".$strMaskWhere;
else
$strQueryWhere = $strMaskWhere;
}
}
$strIPJoin = "";
if(array_key_exists("IP", $arFilter))
{
$ip = self::ip2number($arFilter["IP"]);
if($ip > 0)
{
$bDistinct = true;
$strIPJoin = "
INNER JOIN b_sec_iprule_incl_ip ii on ii.IPRULE_ID = r.ID
LEFT JOIN b_sec_iprule_excl_ip ei on ei.IPRULE_ID = r.ID AND ".$ip." between ei.IP_START AND ei.IP_END
";
$strIPWhere = "(".$ip." between ii.IP_START AND ii.IP_END AND ei.IPRULE_ID is null)";
if($strQueryWhere)
$strQueryWhere = "(".$strQueryWhere.") AND ".$strIPWhere;
else
$strQueryWhere = $strIPWhere;
}
}
$strSql = "
SELECT ".($bDistinct? "DISTINCT": "")."
".implode(", ", $arQuerySelect)."
FROM
b_sec_iprule r
".$strMaskJoin."
".$strIPJoin."
".$obQueryWhere->GetJoins()."
";
if($strQueryWhere)
{
$strSql .= "
WHERE
".$strQueryWhere."
";
}
if(count($arQueryOrder) > 0)
{
$strSql .= "
ORDER BY
".implode(", ", $arQueryOrder)."
";
}
return $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__);
}