function ReIndexAll($bFull = false, $max_execution_time = 0, $NS = Array(), $clear_suggest = false) { global $APPLICATION; $DB = CDatabase::GetModuleConnection('search'); @set_time_limit(0); if(!is_array($NS)) $NS = Array(); if($max_execution_time<=0) { $NS_OLD=$NS; $NS=Array("CLEAR"=>"N", "MODULE"=>"", "ID"=>"", "SESS_ID"=>md5(uniqid(""))); if($NS_OLD["SITE_ID"]!="") $NS["SITE_ID"]=$NS_OLD["SITE_ID"]; if($NS_OLD["MODULE_ID"]!="") $NS["MODULE_ID"]=$NS_OLD["MODULE_ID"]; } $NS["CNT"] = IntVal($NS["CNT"]); if(!$bFull && strlen($NS["SESS_ID"])!=32) $NS["SESS_ID"] = md5(uniqid("")); $p1 = getmicrotime(); $DB->StartTransaction(); CSearch::ReindexLock(); if($NS["CLEAR"] != "Y") { if($bFull) { foreach(GetModuleEvents("search", "OnBeforeFullReindexClear", true) as $arEvent) ExecuteModuleEventEx($arEvent); CSearchTags::CleanCache(); $DB->Query("TRUNCATE TABLE b_search_content_param", false, "File: ".__FILE__."<br>Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_content_site", false, "File: ".__FILE__."<br>Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_content_right", false, "File: ".__FILE__."<br>Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_content_title", false, "File: ".__FILE__."<br>Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_tags", false, "File: ".__FILE__."<br>Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_content_freq", false, "File: ".__FILE__."<br>Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_content", false, "File: ".__FILE__."<br>Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_suggest", false, "File: ".__FILE__."<br>Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_user_right", false, "File: ".__FILE__."<br>Line: ".__LINE__); CSearchFullText::getInstance()->truncate(); COption::SetOptionString("search", "full_reindex_required", "N"); } elseif($clear_suggest) { $DB->Query("TRUNCATE TABLE b_search_suggest", false, "File: ".__FILE__."<br>Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_user_right", false, "File: ".__FILE__."<br>Line: ".__LINE__); $DB->Query("TRUNCATE TABLE b_search_content_freq", false, "File: ".__FILE__."<br>Line: ".__LINE__); } } $NS["CLEAR"] = "Y"; clearstatcache(); if( ($NS["MODULE"]=="" || $NS["MODULE"]=="main") && ($NS["MODULE_ID"]=="" || $NS["MODULE_ID"]=="main") ) { $arLangDirs = Array(); $arFilter = Array("ACTIVE"=>"Y"); if($NS["SITE_ID"]!="") $arFilter["ID"]=$NS["SITE_ID"]; $r = CSite::GetList($by="sort", $order="asc", $arFilter); while($arR = $r->Fetch()) { $path = rtrim($arR["DIR"], "/"); $arLangDirs[$arR["ABS_DOC_ROOT"]."/".$path."/"] = $arR; } //get rid of duplicates $dub = Array(); foreach($arLangDirs as $path=>$arR) { foreach($arLangDirs as $path2=>$arR2) { if($path==$path2) continue; if(substr($path, 0, strlen($path2)) == $path2) $dub[] = $path; } } foreach($dub as $p) unset($arLangDirs[$p]); foreach($arLangDirs as $arR) { $site = $arR["ID"]; $path = rtrim($arR["DIR"], "/"); $site_path = $site."|".$path."/"; if( $max_execution_time > 0 && $NS["MODULE"] == "main" && substr($NS["ID"]."/", 0, strlen($site_path)) != $site_path ) continue; //for every folder CSearch::RecurseIndex(Array($site, $path), $max_execution_time, $NS); if( $max_execution_time > 0 && strlen($NS["MODULE"]) > 0 ) { $DB->Commit(); return $NS; } } } $p1 = getmicrotime(); //for every who wants to reindex $oCallBack = new CSearchCallback; $oCallBack->max_execution_time = $max_execution_time; foreach(GetModuleEvents("search", "OnReindex", true) as $arEvent) { if($NS["MODULE_ID"]!="" && $NS["MODULE_ID"]!=$arEvent["TO_MODULE_ID"]) continue; if($max_execution_time>0 && strlen($NS["MODULE"])>0 && $NS["MODULE"]!= "main" && $NS["MODULE"]!=$arEvent["TO_MODULE_ID"]) continue; //here we get recordset $oCallBack->MODULE = $arEvent["TO_MODULE_ID"]; $oCallBack->CNT = &$NS["CNT"]; $oCallBack->SESS_ID = $NS["SESS_ID"]; $r = &$oCallBack; $arResult = ExecuteModuleEventEx($arEvent, array($NS, $r, "Index")); if(is_array($arResult)) //old way { foreach($arResult as $arFields) { $ID = $arFields["ID"]; if(strlen($ID) > 0) { unset($arFields["ID"]); $NS["CNT"]++; CSearch::Index($arEvent["TO_MODULE_ID"], $ID, $arFields, false, $NS["SESS_ID"]); } } } else //new method { if($max_execution_time>0 && $arResult!==false && strlen(".".$arResult)>1) { $DB->Commit(); return Array( "MODULE"=>$arEvent["TO_MODULE_ID"], "CNT"=>$oCallBack->CNT, "ID"=>$arResult, "CLEAR"=>$NS["CLEAR"], "SESS_ID"=>$NS["SESS_ID"], "SITE_ID"=>$NS["SITE_ID"], "MODULE_ID"=>$NS["MODULE_ID"], ); } } $NS["MODULE"] = ""; } if(!$bFull) { CSearch::DeleteOld($NS["SESS_ID"], $NS["MODULE_ID"], $NS["SITE_ID"]); } $DB->Commit(); return $NS["CNT"]; }