%PDF- %PDF-
Direktori : /proc/self/root/home/bitrix/www/bitrix/modules/controller/classes/general/ |
Current File : //proc/self/root/home/bitrix/www/bitrix/modules/controller/classes/general/update_db_updater.php |
<? $US_HOST_PROCESS_MAIN = ($US_HOST_PROCESS_MAIN ? True : False); define("US_CALL_TYPE", "DB"); define("US_SAVE_UPDATERS_DIR", "/bitrix/updaters"); define("US_DB_VERSIONS_FILE", $_SERVER["DOCUMENT_ROOT"].BX_PERSONAL_ROOT."/php_interface/versions.php"); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client.php"); if (!function_exists("DBUpdaterCheckUpdates")) { function DBUpdaterLock() { global $DB, $APPLICATION; $uniq = $APPLICATION->GetServerUniqID(); if ($DB->type == "MYSQL") { $dbLock = $DB->Query("SELECT GET_LOCK('".$uniq."_DBUpdater', 0) as L", false, "File: ".__FILE__."<br>Line: ".__LINE__); $arLock = $dbLock->Fetch(); if ($arLock["L"] == "1") return true; else return false; } elseif ($DB->type == "ORACLE") { $dbLock = $DB->Query(" declare my_lock_id number; my_result number; lock_failed exception; pragma exception_init(lock_failed, -54); begin my_lock_id:=dbms_utility.get_hash_value(to_char('".$uniq."_DBUpdater'), 0, 1024); my_result:=dbms_lock.request(my_lock_id, dbms_lock.x_mode, 0, true); -- Return value: -- 0 - success -- 1 - timeout -- 2 - deadlock -- 3 - parameter error -- 4 - already own lock specified by 'id' or 'lockhandle' -- 5 - illegal lockhandle if(my_result<>0 and my_result<>4)then raise lock_failed; end if; end; ", true); return ($dbLock !== false); } else { $i = 60; $DB->Query("DELETE FROM B_OPTION WHERE MODULE_ID = 'main' AND NAME = '".$uniq."_DBUpdater' AND SITE_ID IS NULL AND DATEDIFF(SECOND, CONVERT(DATETIME, DESCRIPTION), GETDATE()) > ".$i, false, "File: ".__FILE__."<br>Line: ".__LINE__); $DB->Query("SET LOCK_TIMEOUT 1", false, "File: ".__FILE__."<br>Line: ".__LINE__); $dbLock = $DB->Query("INSERT INTO B_OPTION(MODULE_ID, NAME, SITE_ID, VALUE, DESCRIPTION) VALUES ('main', '".$uniq."_DBUpdater', NULL, NULL, CONVERT(VARCHAR(128), GETDATE()))", true); $DB->Query("SET LOCK_TIMEOUT -1", false, "File: ".__FILE__."<br>Line: ".__LINE__); return ($dbLock !== false); } } function DBUpdaterUnLock() { global $DB, $APPLICATION; $uniq = $APPLICATION->GetServerUniqID(); if ($DB->type == "MYSQL") { $dbLock = $DB->Query("SELECT RELEASE_LOCK('".$uniq."_DBUpdater') as L", false, "File: ".__FILE__."<br>Line: ".__LINE__); $arLock = $dbLock->Fetch(); if($arLock["L"] == "0") return false; else return true; } elseif ($DB->type == "ORACLE") { return true; } else { $DB->Query("DELETE FROM B_OPTION WHERE MODULE_ID = 'main' AND NAME = '".$uniq."_DBUpdater' AND SITE_ID IS NULL", false, "File: ".__FILE__."<br>Line: ".__LINE__); return true; } } function DBUpdaterCheckUpdates($US_HOST_PROCESS_MAIN) { if (!file_exists(US_DB_VERSIONS_FILE)) DBUpdaterCollectDBVersionsNew("A", "", ""); $arDBVersions = array(); include(US_DB_VERSIONS_FILE); if (!file_exists($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/versions.php")) return array(); $arVersions = array(); include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/versions.php"); $arResult = array(); foreach ($arDBVersions as $moduleID => $dbVersion) { if ($US_HOST_PROCESS_MAIN && $moduleID != "main" || !$US_HOST_PROCESS_MAIN && $moduleID == "main") continue; if (array_key_exists($moduleID, $arVersions)) { if (CUpdateClient::CompareVersions($arVersions[$moduleID], $dbVersion) > 0) $arResult[$moduleID] = $dbVersion; } } return $arResult; } function DBUpdaterCollectDBVersionsNew($collectTypeParam, $moduleIdParam, $versionIdParam) { $arDBVersions = array(); include(US_DB_VERSIONS_FILE); @unlink(US_DB_VERSIONS_FILE); $errorMessage = ""; $arDBVersionsNew = CUpdateClient::GetCurrentModules($errorMessage, false); if (StrLen($errorMessage) <= 0) { $f = fopen(US_DB_VERSIONS_FILE, "w"); fwrite($f, "<"."?\n"); fwrite($f, "\$arDBVersions = array(\n"); foreach ($arDBVersionsNew as $moduleID => $version) { if (!array_key_exists($moduleID, $arDBVersions)) $arDBVersions[$moduleID] = $version; if ($collectTypeParam == "A") { fwrite($f, "\t\"".htmlspecialcharsbx($moduleID)."\" => \"".htmlspecialcharsbx($version)."\",\n"); } elseif ($collectTypeParam == "M") { if ($moduleID == "main") fwrite($f, "\t\"".htmlspecialcharsbx($moduleID)."\" => \"".htmlspecialcharsbx($version)."\",\n"); else fwrite($f, "\t\"".htmlspecialcharsbx($moduleID)."\" => \"".htmlspecialcharsbx($arDBVersions[$moduleID])."\",\n"); } elseif ($collectTypeParam == "O") { if ($moduleID != "main") fwrite($f, "\t\"".htmlspecialcharsbx($moduleID)."\" => \"".htmlspecialcharsbx($version)."\",\n"); else fwrite($f, "\t\"".htmlspecialcharsbx($moduleID)."\" => \"".htmlspecialcharsbx($arDBVersions[$moduleID])."\",\n"); } elseif ($collectTypeParam == "N") { if ($moduleID == $moduleIdParam) fwrite($f, "\t\"".htmlspecialcharsbx($moduleID)."\" => \"".htmlspecialcharsbx($versionIdParam)."\",\n"); else fwrite($f, "\t\"".htmlspecialcharsbx($moduleID)."\" => \"".htmlspecialcharsbx($arDBVersions[$moduleID])."\",\n"); } } fwrite($f, ");\n"); fwrite($f, "?".">"); fclose($f); } else { CControllerClient::SendMessage("SITE_UPDATE_KERNEL_DB", "N", $errorMessage); } } function DBUpdaterUpdateFromVersion($moduleID, $dbVersion) { if (StrLen($moduleID) <= 0) return; if (StrLen($dbVersion) <= 0) return; $errorMessage = ""; if (file_exists($_SERVER["DOCUMENT_ROOT"].US_SAVE_UPDATERS_DIR."/".$moduleID) && is_dir($_SERVER["DOCUMENT_ROOT"].US_SAVE_UPDATERS_DIR."/".$moduleID)) { $arUpdaters = array(); if ($handle = @opendir($_SERVER["DOCUMENT_ROOT"].US_SAVE_UPDATERS_DIR."/".$moduleID)) { while (false !== ($dir = readdir($handle))) { if ($dir == "." || $dir == "..") continue; if (substr($dir, 0, 7) == "updater") { if (is_file($_SERVER["DOCUMENT_ROOT"].US_SAVE_UPDATERS_DIR."/".$moduleID."/".$dir)) { $num = substr($dir, 7, strlen($dir) - 11); if (substr($dir, strlen($dir) - 9) == "_post.php") $num = substr($dir, 7, strlen($dir) - 16); $arUpdaters[] = array("/".$dir, Trim($num)); } elseif (file_exists($_SERVER["DOCUMENT_ROOT"].US_SAVE_UPDATERS_DIR."/".$moduleID."/".$dir."/index.php")) { $num = substr($dir, 7); if (substr($dir, strlen($dir) - 5) == "_post") $num = substr($dir, 7, strlen($dir) - 12); $arUpdaters[] = array("/".$dir."/index.php", Trim($num)); } } } closedir($handle); } for ($i1 = 0; $i1 < count($arUpdaters) - 1; $i1++) { for ($j1 = $i1 + 1; $j1 < count($arUpdaters); $j1++) { if (CUpdateClient::CompareVersions($arUpdaters[$i1][1], $arUpdaters[$j1][1]) > 0) { $tmp1 = $arUpdaters[$i1]; $arUpdaters[$i1] = $arUpdaters[$j1]; $arUpdaters[$j1] = $tmp1; } } } for ($i1 = 0; $i1 < count($arUpdaters); $i1++) { if (CUpdateClient::CompareVersions($arUpdaters[$i1][1], $dbVersion) <= 0) continue; $errorMessageTmp = ""; CUpdateClient::RunUpdaterScript($_SERVER["DOCUMENT_ROOT"].US_SAVE_UPDATERS_DIR."/".$moduleID.$arUpdaters[$i1][0], $errorMessageTmp, "", $moduleID); if (strlen($errorMessageTmp) > 0) $errorMessage .= str_replace("#MODULE#", $moduleID, str_replace("#VER#", $arUpdaters[$i1][1], GetMessage("SUPP_UK_UPDN_ERR"))).": ".$errorMessageTmp.".<br>"; DBUpdaterCollectDBVersionsNew("N", $moduleID, $arUpdaters[$i1][1]); } } if (StrLen($errorMessage) > 0) CControllerClient::SendMessage("SITE_UPDATE_KERNEL_DB", "N", $errorMessage); } } $arDBVersions = DBUpdaterCheckUpdates($US_HOST_PROCESS_MAIN); if (count($arDBVersions) > 0) { @set_time_limit(0); ini_set("track_errors", "1"); ignore_user_abort(true); if (DBUpdaterLock()) { require_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/classes/general/controller_member.php"); foreach ($arDBVersions as $moduleID => $dbVersion) DBUpdaterUpdateFromVersion($moduleID, $dbVersion); DBUpdaterCollectDBVersionsNew($US_HOST_PROCESS_MAIN ? "M" : "O", "", ""); CControllerClient::SendMessage("SITE_UPDATE_KERNEL_DB", "Y", ""); DBUpdaterUnLock(); LocalRedirect($_SERVER["REQUEST_URI"]); } else { echo "Web site is now updating. Please wait for about one minute."; die(); } } ?>