Your IP : 3.145.17.171


Current Path : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/modules/cluster/classes/general/
Upload File :
Current File : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/modules/cluster/classes/general/dbnode.php

<?php
IncludeModuleLangFile(__FILE__);

class CAllClusterDBNode
{
	public static function GetByID($node_id, $arVirtNode=false)
	{
		global $DB, $CACHE_MANAGER;
		static $arNodes = false;
		static $arVirtNodes = array();

		//This code sets and gets virtual nodes
		//needed to test connection just before
		//save node credentials into db
		if(preg_match('/^v(\d+)$/', $node_id))
		{
			if(is_array($arVirtNode))
			{
				$arVirtNodes[$node_id] = $arVirtNode;
				return true;
			}
			else
			{
				return $arVirtNodes[$node_id];
			}
		}

		//Normal method continues here
		$node_id = intval($node_id);
		if($arNodes === false)
		{
			$cache_id = "db_nodes";
			if(
				CACHED_b_cluster_dbnode !== false
				&& $CACHE_MANAGER->Read(CACHED_b_cluster_dbnode, $cache_id, "b_cluster_dbnode")
			)
			{
				$arNodes = $CACHE_MANAGER->Get($cache_id);
			}
			else
			{
				$arNodes = array();

				$rs = $DB->Query("SELECT * FROM b_cluster_dbnode ORDER BY ID", false, '', array('fixed_connection'=>true));
				while($ar = $rs->Fetch())
					$arNodes[intval($ar['ID'])] = $ar;

				if(CACHED_b_cluster_dbnode !== false)
					$CACHE_MANAGER->Set($cache_id, $arNodes);
			}
		}

		return $arNodes[$node_id];
	}

	function Add($arFields)
	{
		global $DB, $CACHE_MANAGER;

		if(!$this->CheckFields($arFields, 0))
			return false;

		if(!array_key_exists("ACTIVE", $arFields))
			$arFields["ACTIVE"] = "Y";

		$ID = $DB->Add("b_cluster_dbnode", $arFields);

		if(CACHED_b_cluster_dbnode !== false)
			$CACHE_MANAGER->CleanDir("b_cluster_dbnode");

		return $ID;
	}

	public static function Delete($ID, $bStopSlave = true)
	{
		global $DB, $CACHE_MANAGER;
		$ID = intval($ID);

		$res = $DB->Query("select ID from b_cluster_dbnode WHERE ID=1 OR MASTER_ID = ".$ID, false, '', array('fixed_connection'=>true));
		if ($bStopSlave)
		{
			while($ar = $res->Fetch())
			{
				if(!CClusterSlave::Stop($ar["ID"]))
					return false;
			}
		}

		if($res)
			$res = $DB->Query("DELETE FROM b_cluster_dbnode WHERE ID = ".$ID, false, '', array('fixed_connection'=>true));

		if(CACHED_b_cluster_dbnode !== false)
			$CACHE_MANAGER->CleanDir("b_cluster_dbnode");

		return $res;
	}

	function Update($ID, $arFields)
	{
		global $DB, $CACHE_MANAGER;
		$ID = intval($ID);

		if($ID <= 0)
			return false;

		if(!$this->CheckFields($arFields, $ID))
			return false;

		unset($arFields["GROUP_ID"]);

		$strUpdate = $DB->PrepareUpdate("b_cluster_dbnode", $arFields);
		if($strUpdate <> '')
		{
			$strSql = "
				UPDATE b_cluster_dbnode SET
				".$strUpdate."
				WHERE ID = ".$ID."
			";
			if(!$DB->Query($strSql, false, '', array('fixed_connection'=>true)))
				return false;
		}

		if(CACHED_b_cluster_dbnode !== false)
			$CACHE_MANAGER->CleanDir("b_cluster_dbnode");

		return true;
	}

	public static function SetOffline($node_id)
	{
		global $DB, $CACHE_MANAGER, $APPLICATION;

		$rs = $DB->Query("
			UPDATE b_cluster_dbnode SET
			STATUS = 'OFFLINE'
			WHERE ID = ".intval($node_id)."
			AND STATUS <> 'OFFLINE'
		", false, '', array('fixed_connection'=>true));
		if($rs->AffectedRowsCount() > 0)
		{
			if(CACHED_b_cluster_dbnode !== false)
				$CACHE_MANAGER->CleanDir("b_cluster_dbnode");

			if(!CAgent::AddAgent("CClusterDBNode::BringOnline();", "cluster", "N", 10))
				$APPLICATION->ResetException();
		}
	}

	public static function SetOnline($node_id)
	{
		global $DB, $CACHE_MANAGER;

		$DB->Query("
			UPDATE b_cluster_dbnode SET
			STATUS = 'ONLINE'
			WHERE ID = ".intval($node_id)."
		", false, '', array('fixed_connection'=>true));

		if(CACHED_b_cluster_dbnode !== false)
			$CACHE_MANAGER->CleanDir("b_cluster_dbnode");
	}

	public static function BringOnline()
	{
		$rsOfflineNodes = CClusterDBNode::GetList(array(), array("=STATUS" => "OFFLINE"), array("ID"));
		if($arNode = $rsOfflineNodes->Fetch())
		{
			ob_start();
			$nodeDB = CDatabase::GetDBNodeConnection($arNode["ID"], true, false);
			ob_end_clean();
			if(is_object($nodeDB))
				CClusterDBNode::SetOnline($arNode["ID"]);

			return "CClusterDBNode::BringOnline();";
		}
		return "";
	}

	public static function GetList($arOrder=false, $arFilter=false, $arSelect=false)
	{
		global $DB;

		if(!is_array($arSelect))
			$arSelect = array();
		if(count($arSelect) < 1)
			$arSelect = array(
				"ID",
				"ACTIVE",
				"ROLE_ID",
				"NAME",
				"DESCRIPTION",
				"DB_HOST",
				"DB_NAME",
				"DB_LOGIN",
				"DB_PASSWORD",
				"MASTER_ID",
				"SERVER_ID",
				"STATUS",
				"WEIGHT",
				"SELECTABLE",
				"GROUP_ID"
			);

		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 "NAME":
					$arSelect[] = $strColumn;
					$arQueryOrder[$strColumn] = $strColumn." ".$strDirection;
					break;
			}
		}

		$arQuerySelect = array();
		foreach($arSelect as $strColumn)
		{
			$strColumn = mb_strtoupper($strColumn);
			switch($strColumn)
			{
				case "ID":
				case "ACTIVE":
				case "ROLE_ID":
				case "NAME":
				case "DESCRIPTION":
				case "DB_HOST":
				case "DB_NAME":
				case "DB_LOGIN":
				case "DB_PASSWORD":
				case "MASTER_ID":
				case "SERVER_ID":
				case "STATUS":
				case "WEIGHT":
				case "SELECTABLE":
				case "GROUP_ID":
					$arQuerySelect[$strColumn] = "n.".$strColumn;
					break;
			}
		}
		if(count($arQuerySelect) < 1)
			$arQuerySelect = array("ID"=>"n.ID");

		$obQueryWhere = new CSQLWhere;
		$arFields = array(
			"ID" => array(
				"TABLE_ALIAS" => "n",
				"FIELD_NAME" => "n.ID",
				"FIELD_TYPE" => "int",
				"JOIN" => false,
			),
			"GROUP_ID" => array(
				"TABLE_ALIAS" => "n",
				"FIELD_NAME" => "n.GROUP_ID",
				"FIELD_TYPE" => "string",
				"JOIN" => false,
			),
			"ROLE_ID" => array(
				"TABLE_ALIAS" => "n",
				"FIELD_NAME" => "n.ROLE_ID",
				"FIELD_TYPE" => "string",
				"JOIN" => false,
			),
			"ACTIVE" => array(
				"TABLE_ALIAS" => "n",
				"FIELD_NAME" => "n.ACTIVE",
				"FIELD_TYPE" => "string",
				"JOIN" => false,
			),
			"SERVER_ID" => array(
				"TABLE_ALIAS" => "n",
				"FIELD_NAME" => "n.SERVER_ID",
				"FIELD_TYPE" => "int",
				"JOIN" => false,
			),
			"MASTER_ID" => array(
				"TABLE_ALIAS" => "n",
				"FIELD_NAME" => "n.MASTER_ID",
				"FIELD_TYPE" => "int",
				"JOIN" => false,
			),
			"STATUS" => array(
				"TABLE_ALIAS" => "n",
				"FIELD_NAME" => "n.STATUS",
				"FIELD_TYPE" => "string",
				"JOIN" => false,
			),
			"NAME" => array(
				"TABLE_ALIAS" => "n",
				"FIELD_NAME" => "n.NAME",
				"FIELD_TYPE" => "string",
				"JOIN" => false,
			),
		);
		$obQueryWhere->SetFields($arFields);

		if(!is_array($arFilter))
			$arFilter = array();
		$strQueryWhere = $obQueryWhere->GetQuery($arFilter);

		$bDistinct = $obQueryWhere->bDistinctReqired;

		$strSql = "
			SELECT ".($bDistinct? "DISTINCT": "")."
			".implode(", ", $arQuerySelect)."
			FROM
				b_cluster_dbnode n
			".$obQueryWhere->GetJoins()."
		";

		if($strQueryWhere)
		{
			$strSql .= "
				WHERE
				".$strQueryWhere."
			";
		}

		if(count($arQueryOrder) > 0)
		{
			$strSql .= "
				ORDER BY
				".implode(", ", $arQueryOrder)."
			";
		}

		return $DB->Query($strSql, false, '', array('fixed_connection'=>true));
	}

	public static function getServerList()
	{
		global $DB;
		$result = array();
		$rsData = $DB->Query("
			SELECT ID, GROUP_ID, ROLE_ID, DB_HOST
			FROM b_cluster_dbnode
			ORDER BY GROUP_ID, ID
		");
		while ($arData = $rsData->Fetch())
		{
			if ($arData["ROLE_ID"] == "SLAVE" || $arData["ROLE_ID"] == "MASTER")
				$edit_url = "/bitrix/admin/cluster_slave_edit.php?lang=".LANGUAGE_ID."&group_id=".$arData["GROUP_ID"]."&ID=".$arData["ID"];
			elseif ($arData["ROLE_ID"] == "MODULE")
				$edit_url = "/bitrix/admin/cluster_dbnode_edit.php?lang=".LANGUAGE_ID."&ID=".$arData["ID"];
			else
				$edit_url = "";

			$host = "";
			$match = array();
			if (
				preg_match("/\\(\\s*HOST\\s*=\\s*([^)]+)\\)/i", $arData["DB_HOST"], $match)
				|| preg_match("/^([^:]+)(:|)/", $arData["DB_HOST"], $match)
			)
			{
				if ($match[1] !== 'localhost' && $match[1] !== '127.0.0.1')
					$host = $arData["DB_HOST"];
			}

			$result[] = array(
				"ID" => $arData["ID"],
				"GROUP_ID" => $arData["GROUP_ID"],
				"SERVER_TYPE" => "database",
				"ROLE_ID" => $arData["ROLE_ID"],
				"HOST" => $arData["DB_HOST"],
				"DEDICATED" => $host == ""? "N": "Y",
				"EDIT_URL" => $edit_url,
			);
		}
		return $result;
	}

	public static function GetModules($node_id)
	{
		global $DB;
		static $arCache = false;
		if($arCache === false)
		{
			$arCache = array();
			$rs = $DB->Query("SELECT * from b_option WHERE NAME='dbnode_id'", false, '', array('fixed_connection'=>true));
			while($ar = $rs->Fetch())
				if(is_numeric($ar["VALUE"]))
					$arCache[intval($ar["VALUE"])][$ar["MODULE_ID"]] = $ar["MODULE_ID"];
		}
		if(isset($arCache[$node_id]))
			return $arCache[$node_id];
		else
			return array();
	}

	public static function GetListForModuleInstall()
	{
		return CClusterDBNode::GetList(
			array("NAME"=>"ASC","ID"=>"ASC")
			,array("=ACTIVE"=>"Y", "=ROLE_ID"=>"MODULE", "=STATUS"=>"READY")
			,array("ID", "NAME")
		);
	}
}