%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/modules/cluster/classes/general/
Upload File :
Create Path :
Current File : /home/bitrix/www/bitrix/modules/cluster/classes/general/queue.php

<?php
IncludeModuleLangFile(__FILE__);

class CClusterQueue
{
	public static function Add($group_id, $command, $param1, $param2, $param3)
	{
		global $DB;

		$sql_group_id = "'".intval($group_id)."'";
		$sql_command = "'".$DB->ForSQL($command, 50)."'";
		$sql_param1 = CClusterQueue::QuoteParam($param1);
		$sql_param2 = CClusterQueue::QuoteParam($param2);
		$sql_param3 = CClusterQueue::QuoteParam($param3);
		$DB->StartUsingMasterOnly();
		$DB->Query("
			INSERT INTO b_cluster_queue (
			TIMESTAMP_X, GROUP_ID, COMMAND, PARAM1, PARAM2, PARAM3
			) values (
			".$DB->CurrentTimeFunction().", ".$sql_group_id.", ".$sql_command.", ".$sql_param1.", ".$sql_param2.", ".$sql_param3."
			)
		");
		$DB->StopUsingMasterOnly();
	}

	public static function QuoteParam($str)
	{
		global $DB;

		if(is_bool($str))
			return "'b:".($str === true? "t": "f")."'";
		elseif(is_string($str))
			return "'s:".$DB->ForSQL($str, 250)."'";
		else
			return "null";
	}

	public static function UnQuoteParam($str)
	{
		if(strlen($str) > 0)
		{
			$prefix = substr($str, 0, 2);
			if($prefix === "s:")
				return substr($str, 2);
			if($prefix === "b:")
				return substr($str, 2) === "t";
		}
		return null;
	}

	public static function Run()
	{
		global $DB;
		$DB->StartUsingMasterOnly();
		do
		{
			//read data
			$ids = array();
			$queue = array();
			$rs = $DB->Query($DB->TopSql("
				SELECT *
				FROM b_cluster_queue
				WHERE GROUP_ID = ".BX_CLUSTER_GROUP."
				ORDER BY ID
			", 100));
			while ($ar = $rs->Fetch())
			{
				$queueKey = $ar["COMMAND"]."|".$ar["PARAM1"]."|".$ar["PARAM2"]."|".$ar["PARAM3"];
				$queue[$queueKey] = $ar;
				$ids[] = intval($ar["ID"]);
			}

			$uid = CMain::GetServerUniqID()."_cluster_queue_".BX_CLUSTER_GROUP;

			if (!empty($ids))
			{
				$lock = $DB->Query("SELECT GET_LOCK('".$uid."', 0) as L")->Fetch();
				if ($lock["L"] == "0")
				{
					$DB->StopUsingMasterOnly();
					return false;
				}
			}

			//clean cache
			foreach ($queue as $ar)
			{
				$class_name = $ar["COMMAND"];
				if (class_exists($class_name))
				{
					$object = new $class_name;
					$object->QueueRun(
						CClusterQueue::UnQuoteParam($ar["PARAM1"]),
						CClusterQueue::UnQuoteParam($ar["PARAM2"]),
						CClusterQueue::UnQuoteParam($ar["PARAM3"])
					);
				}
			}

			//mark as done
			if ($ids)
			{
				$DB->Query("DELETE FROM b_cluster_queue WHERE ID in (".implode(",", $ids).")");
				$DB->Query("SELECT RELEASE_LOCK('".$uid."')");
			}
		}
		while ($queue);
		$DB->StopUsingMasterOnly();
	}
}

Zerion Mini Shell 1.0