static function UpdateCounters($member_id, $task_id = false)
{
/** @global CMain $APPLICATION */
global $APPLICATION;
global $DB;
$member_id = intval($member_id);
$lockIdSql = $DB->ForSQL("X".$APPLICATION->GetServerUniqID()."_update_counters_".$member_id);
$DB->Query("SELECT GET_LOCK('".$lockIdSql."', -1) as L");
$arMember = CControllerMember::GetMember($member_id);
if(!$arMember)
{
$e = new CApplicationException("Member #".$member_id." is not found.");
$APPLICATION->ThrowException($e);
$DB->Query("SELECT RELEASE_LOCK('".$lockIdSql."') as L");
return false;
}
$dbr_group = CControllerGroup::GetList(array(), array("=ID" => $arMember["CONTROLLER_GROUP_ID"]), array("UF_*"));
if(!$ar_group = $dbr_group->Fetch())
{
$e = new CApplicationException("Group #".$arMember["CONTROLLER_GROUP_ID"]." is not found.");
$APPLICATION->ThrowException($e);
$DB->Query("SELECT RELEASE_LOCK('".$lockIdSql."') as L");
return false;
}
$strCommand = "echo 'DATE_FORMAT='.urlencode(CSite::GetDateFormat()).'&';n";
if($ar_group["CHECK_COUNTER_FREE_SPACE"] == "Y")
{
$strCommand .= "function counter_free_space($APPLICATION, $USER, $DB) {n";
$strCommand .= " $quota = new CDiskQuota();n";
$strCommand .= " $disk_quota = $quota->GetDiskQuota();n";
$strCommand .= " if(is_bool($disk_quota))n";
$strCommand .= " return -1;n";
$strCommand .= " elsen";
$strCommand .= " return round($disk_quota/1024, 2);n";
$strCommand .= "}n";
$strCommand .= "echo 'COUNTER_FREE_SPACE='.urlencode(counter_free_space($APPLICATION, $USER, $DB)).'&';n";
}
if($ar_group["CHECK_COUNTER_SITES"] == "Y")
{
$strCommand .= "function counter_sites($APPLICATION, $USER, $DB) {n";
$strCommand .= " $by = 'sort';n";
$strCommand .= " $order = 'asc';n";
$strCommand .= " $dbr = CSite::GetList($by, $order, array('ACTIVE'=>'Y'));n";
$strCommand .= " return $dbr->SelectedRowsCount();n";
$strCommand .= "}n";
$strCommand .= "echo 'COUNTER_SITES='.urlencode(counter_sites($APPLICATION, $USER, $DB)).'&';n";
}
if($ar_group["CHECK_COUNTER_USERS"] == "Y")
{
$strCommand .= "function counter_users($APPLICATION, $USER, $DB) {n";
$strCommand .= " $dbr = $DB->Query("SELECT COUNT(1) as USER_COUNT FROM b_user U WHERE (U.EXTERNAL_AUTH_ID IS NULL OR U.EXTERNAL_AUTH_ID='')");n";
$strCommand .= " $ar = $dbr->Fetch();n";
$strCommand .= " return $ar['USER_COUNT'];n";
$strCommand .= "}n";
$strCommand .= "echo 'COUNTER_USERS='.urlencode(counter_users($APPLICATION, $USER, $DB)).'&';n";
}
if($ar_group["CHECK_COUNTER_LAST_AUTH"] == "Y")
{
$strCommand .= "function counter_last_auth($APPLICATION, $USER, $DB) {n";
$strCommand .= " $dbr = $DB->Query("SELECT MAX(U.LAST_LOGIN) as LAST_LOGIN FROM b_user U");n";
$strCommand .= " $ar = $dbr->Fetch();n";
$strCommand .= " return $ar['LAST_LOGIN'];n";
$strCommand .= "}n";
$strCommand .= "echo 'COUNTER_LAST_AUTH='.urlencode(counter_last_auth($APPLICATION, $USER, $DB)).'&';n";
}
$rsCounters = CControllerCounter::GetMemberCounters($member_id);
while($arCounter = $rsCounters->Fetch())
{
$strCommand .= "function counter_".$arCounter['ID']."($APPLICATION, $USER, $DB) {n";
$strCommand .= " return eval("".EscapePHPString($arCounter["COMMAND"])."");n";
$strCommand .= "}n";
$strCommand .= "echo '".$arCounter['ID']."='.urlencode(counter_".$arCounter['ID']."($APPLICATION, $USER, $DB)).'&';n";
}
foreach(GetModuleEvents("controller", "OnBeforeUpdateCounters", true) as $arEvent)
{
ExecuteModuleEventEx($arEvent, array($arMember, $ar_group, &$strCommand));
}
$command_result = CControllerMember::RunCommand($member_id, $strCommand, array(), $task_id, 'run_immediate');
if($command_result===false)
{
$e = $APPLICATION->GetException();
if(!is_object($e))
{
$e = new CApplicationException("Command execution error.");
$APPLICATION->ThrowException($e);
}
$DB->Query("SELECT RELEASE_LOCK('".$lockIdSql."') as L");
return false;
}
$ar_command_result = array();
parse_str($command_result, $ar_command_result);
//Try to guess encoding and convert to controller site charset
foreach($ar_command_result as $k => $v)
$ar_command_result[$k] = CUtil::ConvertToLangCharset($v);
$arFields = array(
"TIMESTAMP" => $arMember["TIMESTAMP_X"],
"~COUNTERS_UPDATED" => $DB->CurrentTimeFunction(),
);
if(array_key_exists('COUNTER_FREE_SPACE', $ar_command_result))
$arFields['COUNTER_FREE_SPACE'] = intval($ar_command_result['COUNTER_FREE_SPACE']);
if(array_key_exists('COUNTER_SITES', $ar_command_result))
$arFields['COUNTER_SITES'] = intval($ar_command_result['COUNTER_SITES']);
if(array_key_exists('COUNTER_USERS', $ar_command_result))
$arFields['COUNTER_USERS'] = intval($ar_command_result['COUNTER_USERS']);
if(array_key_exists('COUNTER_LAST_AUTH', $ar_command_result))
$arFields['COUNTER_LAST_AUTH'] = $DB->FormatDate($ar_command_result['COUNTER_LAST_AUTH'], 'YYYY-MM-DD HH:MI:SS', CSite::GetDateFormat());
if(!CControllerMember::Update($member_id, $arFields))
{
$e = $APPLICATION->GetException();
$e = new CApplicationException(GetMessage("CTRLR_MEM_COUNTERS_ERR1").$e->GetString());
$APPLICATION->ThrowException($e);
$DB->Query("SELECT RELEASE_LOCK('".$lockIdSql."') as L");
return false;
}
CControllerCounter::UpdateMemberValues($member_id, $ar_command_result);
$DB->Query("SELECT RELEASE_LOCK('".$lockIdSql."') as L");
return $arFields;
}