%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/controller/classes/general/ |
| Current File : //home/bitrix/www/bitrix/modules/controller/classes/general/controllertask.php |
<?
##############################################
# Bitrix Site Manager #
# Copyright (c) 2002-2007 Bitrix #
# http://www.bitrixsoft.com #
# mailto:sources@bitrixsoft.com #
##############################################
IncludeModuleLangFile(__FILE__);
class CControllerTask
{
public static function GetTaskArray()
{
return Array(
'SET_SETTINGS'=>GetMessage("CTRLR_TASK_TYPE_SET_SETTINGS"),
'UPDATE'=>GetMessage("CTRLR_TASK_TYPE_UPDATE"),
'COUNTERS_UPDATE'=>GetMessage("CTRLR_TASK_TYPE_COUNTERS_UPDATE"),
'REMOTE_COMMAND'=>GetMessage("CTRLR_TASK_TYPE_REMOTE_COMMAND"),
'CLOSE_MEMBER'=>GetMessage("CTRLR_TASK_TYPE_CLOSE_MEMBER")
);
}
public static function GetStatusArray()
{
return Array(
'N'=>GetMessage("CTRLR_TASK_STATUS_NEW"),
'P'=>GetMessage("CTRLR_TASK_STATUS_PART"),
'Y'=>GetMessage("CTRLR_TASK_STATUS_COMPL"),
'F'=>GetMessage("CTRLR_TASK_STATUS_FAIL"),
);
}
public static function CheckFields(&$arFields, $ID = false)
{
/** @global CMain $APPLICATION */
global $APPLICATION;
$arMsg = Array();
if($ID>0)
unset($arFields["ID"]);
global $DB;
if(($ID===false || is_set($arFields, "TASK_ID")) && strlen($arFields["TASK_ID"])<=0)
$arMsg[] = array("id"=>"TASK_ID", "text"=> GetMessage("CTRLR_TASK_ERR_ID"));
elseif(is_set($arFields, "TASK_ID"))
{
$arTaskID = CControllerTask::GetTaskArray();
if(!isset($arTaskID[$arFields['TASK_ID']]))
$arMsg[] = array("id"=>"TASK_ID", "text"=> GetMessage("CTRLR_TASK_ERR_BAD_ID"));
}
if(($ID===false || is_set($arFields, "CONTROLLER_MEMBER_ID")) && Intval($arFields["CONTROLLER_MEMBER_ID"])<=0)
$arMsg[] = array("id"=>"CONTROLLER_MEMBER_ID", "text"=> GetMessage("CTRLR_TASK_ERR_CLIENTID"));
if(isset($arFields["INIT_EXECUTE"]))
$arFields["INIT_CRC"] = crc32($arFields["INIT_EXECUTE"]);
if(count($arMsg)<=0 && $ID===false)
{
$strSql = "
SELECT INIT_EXECUTE
FROM b_controller_task
WHERE CONTROLLER_MEMBER_ID='".IntVal($arFields["CONTROLLER_MEMBER_ID"])."'
AND TASK_ID='".$DB->ForSQL($arFields["TASK_ID"], 255)."'
AND DATE_EXECUTE IS NULL
";
$dbr = $DB->Query($strSql);
while($ar = $dbr->Fetch())
{
if(intval($ar["INIT_EXECUTE"]) == intval($arFields["INIT_EXECUTE"]))
{
$arMsg[] = array("id"=>"TASK_ID", "text"=> GetMessage("CTRLR_TASK_ERR_ALREADY")." [".IntVal($arFields["CONTROLLER_MEMBER_ID"])."].");
break;
}
}
}
$APPLICATION->ResetException();
if ($ID === false)
{
foreach (GetModuleEvents("controller", "OnBeforeTaskAdd", true) as $arEvent)
{
$bEventRes = ExecuteModuleEventEx($arEvent, array($arFields));
if ($bEventRes === false)
{
if ($err = $APPLICATION->GetException())
{
$arMsg[] = array(
"id" => "ID",
"text" => $err->GetString()." [".IntVal($arFields["CONTROLLER_MEMBER_ID"])."].",
);
}
else
{
$arMsg[] = array(
"id" => "ID",
"text" => "Unknown error."." [".IntVal($arFields["CONTROLLER_MEMBER_ID"])."].",
);
}
break;
}
}
}
if(count($arMsg)>0)
{
$e = new CAdminException($arMsg);
$APPLICATION->ThrowException($e);
return false;
}
if($ID===false && !is_set($arFields, "DATE_CREATE"))
$arFields["~DATE_CREATE"] = $DB->CurrentTimeFunction();
return true;
}
public static function Add($arFields)
{
global $DB;
if(!CControllerTask::CheckFields($arFields))
return false;
unset($arFields["TIMESTAMP_X"]);
unset($arFields["~TIMESTAMP_X"]);
$ID = $DB->Add("b_controller_task", $arFields, array("INIT_EXECUTE", "INIT_EXECUTE_PARAMS"));
return $ID;
}
public static function Update($ID, $arFields)
{
global $DB;
if(!CControllerTask::CheckFields($arFields, $ID))
return false;
unset($arFields["TIMESTAMP_X"]);
$arFields["~TIMESTAMP_X"] = $DB->CurrentTimeFunction();
$arUpdateBinds = array();
$strUpdate = $DB->PrepareUpdateBind("b_controller_task", $arFields, "", false, $arUpdateBinds);
$strSql = "UPDATE b_controller_task SET ".$strUpdate." WHERE ID=".intval($ID);
$arBinds = array();
foreach($arUpdateBinds as $field_id)
$arBinds[$field_id] = $arFields[$field_id];
$DB->QueryBind($strSql, $arBinds);
return true;
}
public static function Delete($ID)
{
global $DB;
$DB->Query("DELETE FROM b_controller_task WHERE ID=".intval($ID));
return true;
}
public static function GetList($arOrder = Array(), $arFilter = Array(), $bCnt = false, $arNavParams = false)
{
global $DB;
static $arFields = array(
"ID" => Array("FIELD_NAME" => "T.ID", "FIELD_TYPE" => "int"),
"TIMESTAMP_X" => Array("FIELD_NAME" => "T.TIMESTAMP_X", "FIELD_TYPE" => "datetime"),
"DATE_CREATE" => Array("FIELD_NAME" => "T.DATE_CREATE", "FIELD_TYPE" => "datetime"),
"TASK_ID" => Array("FIELD_NAME" => "T.TASK_ID", "FIELD_TYPE" => "string"),
"CONTROLLER_MEMBER_ID" => Array("FIELD_NAME" => "T.CONTROLLER_MEMBER_ID", "FIELD_TYPE" => "int"),
"CONTROLLER_MEMBER_NAME" => Array("FIELD_NAME" => "M.NAME", "FIELD_TYPE" => "string"),
"CONTROLLER_MEMBER_URL" => Array("FIELD_NAME" => "M.URL", "FIELD_TYPE" => "string"),
"STATUS" => Array("FIELD_NAME" => "T.STATUS", "FIELD_TYPE" => "string"),
"DATE_EXECUTE" => Array("FIELD_NAME" => "T.DATE_EXECUTE", "FIELD_TYPE" => "datetime"),
);
$obWhere = new CSQLWhere;
$obWhere->SetFields($arFields);
$arFilterNew = Array();
foreach($arFilter as $k=>$value)
if(is_array($value) || strlen($value)>0 || $value === false)
$arFilterNew[$k]=$value;
$strWhere = $obWhere->GetQuery($arFilterNew);
if($bCnt)
{
$strSelect = "
SELECT
COUNT('x') as C
,MIN(T.ID) as MIN_ID
,MAX(T.ID) as MAX_ID
";
}
else
{
$strSelect = "
SELECT
T.ID
,T.TASK_ID
,T.CONTROLLER_MEMBER_ID
,T.INIT_EXECUTE
,T.INIT_EXECUTE_PARAMS
,T.INIT_CRC
,T.UPDATE_PERIOD
,T.RESULT_EXECUTE
,T.STATUS
,M.NAME as CONTROLLER_MEMBER_NAME
,M.URL as CONTROLLER_MEMBER_URL
,".$DB->DateToCharFunction("T.TIMESTAMP_X")." as TIMESTAMP_X
,".$DB->DateToCharFunction("T.DATE_EXECUTE")." as DATE_EXECUTE
,".$DB->DateToCharFunction("T.DATE_CREATE")." as DATE_CREATE
";
}
$strSql = "
FROM b_controller_task T
INNER JOIN b_controller_member M ON T.CONTROLLER_MEMBER_ID = M.ID
".(strlen($strWhere) <= 0 ? "" : "WHERE ".$strWhere)."
";
$strOrder = CControllerAgent::_OrderBy($arOrder, $arFields);
if (is_array($arNavParams) && $arNavParams["nTopCount"] > 0)
{
$strSql = $DB->TopSQL($strSelect.$strSql.$strOrder, $arNavParams["nTopCount"]);
$dbr = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
}
elseif (is_array($arNavParams))
{
$res_cnt = $DB->Query("SELECT count('x') CNT ".$strSql);
$ar_cnt = $res_cnt->Fetch();
$dbr = new CDBResult();
$dbr->NavQuery($strSelect.$strSql.$strOrder, $ar_cnt["CNT"], $arNavParams);
}
else
{
$dbr = $DB->Query($strSelect.$strSql.$strOrder, false, "File: ".__FILE__."<br>Line: ".__LINE__);
}
$dbr->is_filtered = (strlen($strWhere) > 0);
return $dbr;
}
public static function GetByID($ID)
{
return CControllerTask::GetList(Array(), Array("ID"=>IntVal($ID)));
}
public static function ProcessTask($ID)
{
/** @global CMain $APPLICATION */
global $APPLICATION;
/** @global CDatabase $DB */
global $DB;
$ID = intval($ID);
$lockId = "X".$APPLICATION->GetServerUniqID()."_ctask_".$ID;
$STATUS = "0";
// locking the task
if(!CControllerAgent::_Lock($lockId))
{
$APPLICATION->ResetException();
return $STATUS;
}
// selecting task
$strSql =
"SELECT T.*, M.SHARED_KERNEL ".
"FROM b_controller_task T LEFT JOIN b_controller_member M ON T.CONTROLLER_MEMBER_ID=M.ID ".
"WHERE T.ID='".$ID."' AND T.STATUS<>'Y'";
$db_task = $DB->Query($strSql);
if($ar_task = $db_task->Fetch())
{
$arControllerLog = array(
'CONTROLLER_MEMBER_ID' => $ar_task["CONTROLLER_MEMBER_ID"],
'TASK_ID' => $ar_task['ID'],
'STATUS' => 'Y',
);
$RESULT = '';
$STATUS = 'Y';
unset($INIT_EXECUTE_PARAMS);
$APPLICATION->ResetException();
switch($ar_task['TASK_ID'])
{
case 'SET_SETTINGS':
$arControllerLog['NAME'] = 'SET_SETTINGS';
$res = CControllerMember::SetGroupSettings($ar_task["CONTROLLER_MEMBER_ID"], $ar_task['ID']);
if ($res === false)
{
$e = $APPLICATION->GetException();
$STATUS = "F";
$RESULT = $e->GetString();
$arControllerLog['STATUS'] = 'N';
}
else
{
$RESULT = $res;
}
break;
case 'CLOSE_MEMBER':
$arControllerLog['NAME'] = 'SITE_CLOSING';
$res = CControllerMember::CloseMember($ar_task["CONTROLLER_MEMBER_ID"], $ar_task['INIT_EXECUTE_PARAMS'], $ar_task['ID']);
if ($res === false)
{
$STATUS = "F";
$e = $APPLICATION->GetException();
if ($e)
$RESULT = $e->GetString();
}
else
{
$RESULT = $res;
}
break;
case 'UPDATE':
$arControllerLog['NAME'] = 'SITE_UPDATE';
if($ar_task["SHARED_KERNEL"] == "Y")
{
$STATUS = "F";
$RESULT = GetMessage("CTRLR_TASK_ERR_KERNEL");
$arControllerLog['STATUS'] = 'N';
}
else
{
$command = 'require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client.php");';
if($ar_task["STATUS"]=="P" && strlen($ar_task["INIT_EXECUTE_PARAMS"])>0)
$command .= 'echo trim(CUpdateControllerSupport::Update("'.EscapePHPString($ar_task["INIT_EXECUTE_PARAMS"]).'"));';
else
$command .= 'echo trim(CUpdateControllerSupport::Update(""));';
$res = CControllerMember::RunCommand($ar_task["CONTROLLER_MEMBER_ID"], $command, array(), $ar_task['ID']);
if($res!==false)
{
if(($p = strpos($res, "|"))>0)
{
$result_code = substr($res, 0, $p);
$RESULT = substr($res, $p + 1);
}
else
{
$result_code = $res;
$RESULT = $res;
}
if($result_code=='ERR')
{
$STATUS = "F";
$arControllerLog['STATUS'] = 'N';
}
elseif($result_code=='STP0') // STP
{
$STATUS = "P";
}
elseif($result_code!='FIN') // other command
{
$STATUS = "P";
$INIT_EXECUTE_PARAMS = $result_code;
}
else
{
$RESULT = GetMessage("CTRLR_TASK_UPD_COMPL");
}
}
else
{
$STATUS = "F";
$e = $APPLICATION->GetException();
$RESULT = $e->GetString();
$arControllerLog['STATUS'] = 'N';
}
}
break;
case 'COUNTERS_UPDATE':
$arControllerLog['NAME'] = 'UPDATE_COUNTERS';
$res = CControllerMember::UpdateCounters($ar_task["CONTROLLER_MEMBER_ID"], $ar_task['ID']);
$RESULT = '';
if($res!==false)
{
foreach($res as $k=>$v)
$RESULT .= "$k=$v;\r\n";
}
else
{
$e = $APPLICATION->GetException();
$STATUS = "F";
$RESULT = $e->GetString();
$arControllerLog['STATUS'] = 'N';
}
break;
case 'REMOTE_COMMAND':
$arControllerLog['NAME'] = 'REMOTE_COMMAND';
if(strlen($ar_task['INIT_EXECUTE_PARAMS'])>0)
$ar_task['INIT_EXECUTE_PARAMS'] = unserialize($ar_task['INIT_EXECUTE_PARAMS']);
else
$ar_task['INIT_EXECUTE_PARAMS'] = Array();
$res = CControllerMember::RunCommand($ar_task["CONTROLLER_MEMBER_ID"], $ar_task['INIT_EXECUTE'], $ar_task['INIT_EXECUTE_PARAMS'], $ar_task['ID']);
if($res!==false)
$RESULT = $res;
else
{
$STATUS = "F";
$e = $APPLICATION->GetException();
$RESULT = $e->GetString();
$arControllerLog['STATUS'] = 'N';
}
break;
case 'SEND_FILE':
$arControllerLog['NAME'] = 'SEND_FILE';
break;
}
if(!isset($arControllerLog['DESCRIPTION']))
$arControllerLog['DESCRIPTION'] = $RESULT;
CControllerLog::Add($arControllerLog);
// updating status
$arUpdateFields = array(
"STATUS" => $STATUS,
"~DATE_EXECUTE" => $DB->CurrentTimeFunction(),
"RESULT_EXECUTE" => $RESULT,
"INDEX_SALT" => rand(),
);
if(isset($INIT_EXECUTE_PARAMS))
$arUpdateFields["INIT_EXECUTE_PARAMS"] = $INIT_EXECUTE_PARAMS;
$arUpdateBinds = array();
$strUpdate = $DB->PrepareUpdateBind("b_controller_task", $arUpdateFields, "", false, $arUpdateBinds);
$strSql = "UPDATE b_controller_task SET ".$strUpdate." WHERE ID=".$ID;
$arBinds = array();
foreach($arUpdateBinds as $field_id)
$arBinds[$field_id] = $arUpdateFields[$field_id];
$DB->QueryBind($strSql, $arBinds);
}
// unlocking
CControllerAgent::_UnLock($lockId);
return $STATUS;
}
public static function ProcessAllTask()
{
$dbrTask = CControllerTask::GetList(array("ID" => "ASC"), array("=STATUS" => array('N', 'P')));
while ($arTask = $dbrTask->Fetch())
{
CControllerTask::ProcessTask($arTask["ID"]);
}
return true;
}
}
?>