• Модуль: cluster
  • Путь к файлу: ~/bitrix/modules/cluster/classes/mysql/dbnode_check.php
  • Класс: CClusterDBNodeCheck
  • Вызов: CClusterDBNodeCheck::SlaveNodeConnection
function SlaveNodeConnection($db_host, $db_name, $db_login, $db_password, $master_host=false, $master_port=false, $master_id = 1)
{
	global $DB;

	$node_id = "v99";
	CClusterDBNode::GetByID($node_id, array(
		"ACTIVE" => "Y",
		"STATUS" => "ONLINE",
		"DB_HOST" => $db_host,
		"DB_NAME" => $db_name,
		"DB_LOGIN" => $db_login,
		"DB_PASSWORD" => $db_password,
	));

	ob_start();
	$nodeDB = CDatabase::GetDBNodeConnection($node_id, true);
	$error = ob_get_contents();
	ob_end_clean();

	if(is_object($nodeDB))
	{
		//Test if this connection is not the same as master
		$bSkipSecondTest = false;
		//1. Make sure that no replication is runnung
		$rs = $nodeDB->Query("show slave status");
		if($ar = $rs->Fetch())
		{
			if($ar["Slave_IO_State"] <> '')
			{
				if($ar["Master_Host"] != $master_host || $ar["Master_Port"] != $master_port)
					return GetMessage("CLU_RUNNING_SLAVE");
				else
					$bSkipSecondTest = true; //The replication is OK
			}
		}
		//2. Check if b_cluster_dbnode exists on node
		if($nodeDB->TableExists("b_cluster_dbnode") && !$bSkipSecondTest)
		{
			//2.1 Generate uniq id
			$uniqid = md5(mt_rand());
			$DB->Query("UPDATE b_cluster_dbnode SET UNIQID='".$uniqid."' WHERE ID=1", false, '', array("fixed_connection"=>true));
			$rs = $nodeDB->Query("SELECT UNIQID FROM b_cluster_dbnode WHERE ID=1", true);
			if($rs)
			{
				if($ar = $rs->Fetch())
				{
					if($ar["UNIQID"] == $uniqid)
						return GetMessage("CLU_SAME_DATABASE");
				}
			}
		}
		//3. Check master connect
		if($master_host !== false && $master_port !== false)
		{
			$node_id = "v98";
			if($master_id == 1)
			{
				CClusterDBNode::GetByID($node_id, array(
					"ACTIVE" => "Y",
					"STATUS" => "ONLINE",
					"DB_HOST" => $master_host.":".$master_port,
					"DB_NAME" => $DB->DBName,
					"DB_LOGIN" => $DB->DBLogin,
					"DB_PASSWORD" => $DB->DBPassword,
				));
			}
			else
			{
				$node_id = $master_id;
			}

			ob_start();
			$masterDB = CDatabase::GetDBNodeConnection($node_id, true);
			$error = ob_get_contents();
			ob_end_clean();
			if(is_object($masterDB))
			{
				//3.1 Check if b_cluster_dbnode is the same as on master
				if(!$masterDB->TableExists("b_cluster_dbnode"))
					return GetMessage("CLU_NOT_MASTER");

				//3.2 Generate uniq id
				$uniqid = md5(mt_rand());
				$DB->Query("UPDATE b_cluster_dbnode SET UNIQID='".$uniqid."' WHERE ID=1", false, '', array("fixed_connection"=>true));
				$rs = $masterDB->Query("SELECT UNIQID FROM b_cluster_dbnode WHERE ID=1", true, '', array("fixed_connection"=>true));
				if(!$rs)
					return GetMessage("CLU_NOT_MASTER");

				$ar = $rs->Fetch();
				if(!$ar)
					return GetMessage("CLU_NOT_MASTER");

				if($ar["UNIQID"] != $uniqid)
					return GetMessage("CLU_NOT_MASTER");
			}
			else
			{
				return GetMessage("CLU_MASTER_CONNECT_ERROR").$error;
			}
		}

		return $nodeDB;
	}
	else
	{
		return $error;
	}
}