%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/cluster/install/wizards/bitrix/cluster.slave_start/scripts/ |
Current File : /home/bitrix/www/bitrix/modules/cluster/install/wizards/bitrix/cluster.slave_start/scripts/move.php |
<? define("STOP_STATISTICS", true); define("PUBLIC_AJAX_MODE", true); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); if(!$USER->IsAdmin() || !check_bitrix_sessid()) { echo GetMessage('CLUWIZ_ERROR_ACCESS_DENIED'); require_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_after.php"); die(); } require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/wizard.php"); $lang = $_REQUEST['lang']; if(!preg_match('/^[a-z0-9_]{2}$/i', $lang)) $lang = 'en'; $wizard = new CWizard("bitrix:cluster.slave_start"); $wizard->IncludeWizardLang("scripts/move.php", $lang); CModule::IncludeModule('cluster'); $STEP = intval($_REQUEST['STEP']); $node_id = intval($_REQUEST["node_id"]); if($node_id < 2) $nodeDB = false; else $nodeDB = CDatabase::GetDBNodeConnection($node_id, true, false); if(!is_object($nodeDB)) { echo GetMessage('CLUWIZ_CONNECTION_ERROR'); } elseif($STEP < 2) { $DB->Query("DELETE FROM b_cluster_table", false, '', array("fixed_connection"=>true)); $strError = CreateNodeTable($DB, $nodeDB, "b_cluster_table"); $arTables = array(); $rsTables = $DB->Query("show tables", false, '', array("fixed_connection"=>true)); while($arTable = $rsTables->Fetch()) { $arTables[] = $arTable["Tables_in_".$DB->DBName]; } foreach($arTables as $table_name) { if($table_name == "b_cluster_table") continue; $rsIndexes = $DB->Query("SHOW INDEX FROM `".$DB->ForSql($table_name)."`", true, '', array("fixed_connection"=>true)); if($rsIndexes) { $arIndexes = array(); while($ar = $rsIndexes->Fetch()) { if($ar["Non_unique"] == "0") $arIndexes[$ar["Key_name"]][$ar["Seq_in_index"]-1] = $ar["Column_name"]; } foreach($arIndexes as $IndexName => $arIndexColumns) { if(count($arIndexColumns) != 1) unset($arIndexes[$IndexName]); } if(count($arIndexes) > 0) { foreach($arIndexes as $IndexName => $arIndexColumns) { foreach($arIndexColumns as $SeqInIndex => $ColumnName) $key_column = $ColumnName; break; } } else { $key_column = false; } } else { $key_column = false; } $nodeDB->Add("b_cluster_table", array( "MODULE_ID" => "main", "TABLE_NAME" => $table_name, "KEY_COLUMN" => $key_column, "FROM_NODE_ID" => 1, "TO_NODE_ID" => $node_id, "LAST_ID" => false, )); } echo GetMessage("CLUWIZ_INIT"); echo '<script>MoveTables(2)</script>'; } else { $DB->Query("FLUSH TABLES WITH READ LOCK", false, '', array("fixed_connection"=>true)); $strError = ""; $end_time = time()+5; do { $rsTables = $nodeDB->Query("SELECT * FROM b_cluster_table ORDER BY ID", false, '', array("fixed_connection"=>true)); $arTable = $rsTables->Fetch(); if(!is_array($arTable)) break; if(strlen($arTable["LAST_ID"]) <= 0) $strError = CreateNodeTable($DB, $nodeDB, $arTable["TABLE_NAME"]); //It is a view if ($strError === false) { $nodeDB->Query(" DELETE FROM b_cluster_table WHERE ID = '".$arTable["ID"]."' ", false, '', array("fixed_connection"=>true)); continue; } $arTable["COLUMNS"] = GetTableColumns($DB, $arTable["TABLE_NAME"]); if($strError) { echo $strError; break; } $i = intval($arTable["REC_COUNT"]); $di = 0; $last_id = ''; $strInsert = ""; if(strlen($arTable["KEY_COLUMN"]) > 0) { $strSelect = " SELECT * FROM ".$arTable["TABLE_NAME"]." ".(strlen($arTable["LAST_ID"]) > 0? "WHERE ".$arTable["KEY_COLUMN"]." > '".$arTable["LAST_ID"]."'": "")." ORDER BY ".$arTable["KEY_COLUMN"]." LIMIT 1000 "; } else { $strSelect = " SELECT * FROM ".$arTable["TABLE_NAME"]." LIMIT ".(strlen($arTable["LAST_ID"]) > 0? $arTable["LAST_ID"].", ": "")."1000 "; } $rsSource = $DB->Query($strSelect, false, '', array("fixed_connection"=>true)); while($arSource = $rsSource->Fetch()) { $i++; $di++; if(!$strInsert) $strInsert = "insert into ".$arTable["TABLE_NAME"]." values"; else $strInsert .= ","; foreach($arSource as $key => $value) { if(!isset($value) || is_null($value)) $arSource[$key] = 'NULL'; elseif($arTable["COLUMNS"][$key] == 0) $arSource[$key] = $value; elseif($arTable["COLUMNS"][$key] == 1) { if(empty($value) && $value != '0') $arSource[$key] = '\'\''; else $arSource[$key] = '0x' . bin2hex($value); } elseif($arTable["COLUMNS"][$key] == 2) { $arSource[$key] = "'".$DB->ForSql($value)."'"; } } $strInsert .= "\n(".implode(", ", $arSource).")"; if($arTable["KEY_COLUMN"]) $last_id = $arSource[$arTable["KEY_COLUMN"]]; else $last_id = $i; if(strlen($strInsert) > 102400) { $nodeDB->Query($strInsert, false, '', array("fixed_connection"=>true)); $strInsert = ""; $nodeDB->Query(" UPDATE b_cluster_table SET LAST_ID = ".$last_id." ,REC_COUNT = ".$i." WHERE ID = '".$arTable["ID"]."' ", false, '', array("fixed_connection"=>true)); } if(time() > $end_time) break; } if(strlen($strInsert)) { $nodeDB->Query($strInsert, false, '', array("fixed_connection"=>true)); } if($arSource) { $nodeDB->Query(" UPDATE b_cluster_table SET LAST_ID = ".(strlen($arTable["KEY_COLUMN"]) > 0? $arSource[$arTable["KEY_COLUMN"]]: $i)." ,REC_COUNT = ".$i." WHERE ID = '".$arTable["ID"]."' ", false, '', array("fixed_connection"=>true)); } elseif(strlen($last_id)) { $nodeDB->Query(" UPDATE b_cluster_table SET LAST_ID = ".$last_id." ,REC_COUNT = ".$i." WHERE ID = '".$arTable["ID"]."' ", false, '', array("fixed_connection"=>true)); } else { $nodeDB->Query(" DELETE FROM b_cluster_table WHERE ID = '".$arTable["ID"]."' ", false, '', array("fixed_connection"=>true)); } } while (time() < $end_time); $DB->Query("UNLOCK TABLES", false, '', array("fixed_connection"=>true)); if(is_array($arTable)) { $rs = $nodeDB->Query("select count(*) CNT from b_cluster_table", false, '', array("fixed_connection"=>true)); $ar = $rs->Fetch(); echo GetMessage('CLUWIZ_TABLE_PROGRESS', array( "#table_name#" => $arTable["TABLE_NAME"], "#records#" => $i, "#tables#" => $ar["CNT"], )); echo "<script>MoveTables(2)</script>"; } else { echo '<p>',GetMessage("CLUWIZ_ALL_DONE"),'</p>'; echo '<p>',GetMessage("CLUWIZ_SITE_OPEN"),'</p>'; echo '<script>EnableButton();</script>'; } } function CreateNodeTable($nodeDB1, $nodeDB2, $TableName) { $rs = $nodeDB1->Query("show create table `".$nodeDB1->ForSQL($TableName)."`", false, '', array("fixed_connection"=>true)); $ar = $rs->Fetch(); if (!$ar) { return GetMessage('CLUWIZ_QUERY_ERROR'); } elseif ($ar["Create Table"] != "") { $rs = $nodeDB2->Query($ar["Create Table"], false, '', array("fixed_connection"=>true)); if (!$rs) return GetMessage('CLUWIZ_QUERY_ERROR'); else return ""; } elseif ($ar["Create View"] != "") { $rs = $nodeDB2->Query($ar["Create View"], false, '', array("fixed_connection"=>true)); if (!$rs) return GetMessage('CLUWIZ_QUERY_ERROR'); else return false; } else { return ""; } } function GetTableColumns($nodeDB, $TableName) { $arResult = array(); $sql = "SHOW COLUMNS FROM `".$TableName."`"; $res = $nodeDB->Query($sql, false, '', array("fixed_connection"=>true)); while($row = $res->Fetch()) { if(preg_match("/^(\w*int|year|float|double|decimal)/", $row["Type"])) $arResult[$row["Field"]] = 0; elseif(preg_match("/^(\w*binary)/", $row["Type"])) $arResult[$row["Field"]] = 1; else $arResult[$row["Field"]] = 2; } return $arResult; } require_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_after.php"); ?>