/// <summary> Creates a HTML output file of the current subdirectory and file information. </summary> /// <param name="OutputFile"> Path and filename for the output HTML file (minus extension) </param> /// <returns> TRUE if successful, otherwise FALSE </returns> /// <example> To see examples, look at the examples listed under the main <see cref="DirectoryCrawler"/> class. </example> public bool CreateHTML(string OutputFile) { try { // Create the new HTML file LogFileXHTML htmlFile = new LogFileXHTML(OutputFile + ".html", "List of Files", "DirectoryIterator"); htmlFile.New(); htmlFile.DateStampingEnabled = false; // Create the list of directories StringDictionary directories = new StringDictionary(); string tempDir; for (int j = 0; j < dirTbl.Rows.Count; j++) { tempDir = dirTbl.Rows[j][1].ToString(); if (tempDir[tempDir.Length - 1] != '\\') { tempDir = tempDir + "\\"; } directories.Add(dirTbl.Rows[j][0].ToString(), tempDir); } // Iterate through each row in the file table and add to the Sorted List SortedList files = new SortedList(); for (int i = 0; i < fileTbl.Rows.Count; i++) { if (!files.ContainsKey(fileTbl.Rows[i][0])) { files.Add(fileTbl.Rows[i][0], directories[fileTbl.Rows[i][2].ToString()] + fileTbl.Rows[i][0].ToString() + "." + fileTbl.Rows[i][1].ToString()); } } // Add the process information htmlFile.AddError("RESULTS FROM DIRECTORY ITERATION STARTING AT: " + startingDirectoryList); htmlFile.AddError("PROCESS COMPLETED ON " + DateTime.Now.ToLongDateString().ToUpper()); htmlFile.AddNonError("<br />"); // Now, add from the sorted list to the file for (int i = 0; i < files.Count; i++) { htmlFile.AddNonError(files.GetByIndex(i).ToString()); } // Add a completion statement at the bottom htmlFile.AddComplete(files.Count + " FILES FOUND"); // Must be successful, so return true return(true); } catch { // Error was detected return(false); } }
/// <summary> Immediately perform all requested tasks </summary> /// <param name="BuildProductionMarcxmlFeed"> Flag indicates if the MarcXML feed for OPACs should be produced </param> /// <param name="BuildTestMarcxmlFeed"> Flag indicates if the items set to be put in a TEST feed should have their MarcXML feed produced</param> /// <param name="RunBulkloader"> Flag indicates if the preload </param> /// <param name="CompleteStaticRebuild"> Flag indicates whether to rebuild all the item static pages </param> /// <param name="MarcRebuild"> Flag indicates if all the MarcXML files for each resource should be rewritten from the METS/MODS metadata files </param> public void Execute_Immediately(bool BuildProductionMarcxmlFeed, bool BuildTestMarcxmlFeed, bool RunBulkloader, bool CompleteStaticRebuild, bool MarcRebuild) { // start with warnings on imagemagick and ghostscript not being installed if (SobekCM_Library_Settings.ImageMagick_Executable.Length == 0) { Console.WriteLine("WARNING: Could not find ImageMagick installed. Some image processing will be unavailable."); } if (SobekCM_Library_Settings.Ghostscript_Executable.Length == 0) { Console.WriteLine("WARNING: Could not find GhostScript installed. Some PDF processing will be unavailable."); } if (CompleteStaticRebuild) { Console.WriteLine("Beginning static rebuild"); LogFileXHTML staticRebuildLog = new LogFileXHTML(Application.StartupPath + "/Logs/static_rebuild.html"); Static_Pages_Builder builder = new Static_Pages_Builder(SobekCM_Library_Settings.Application_Server_URL, SobekCM_Library_Settings.Static_Pages_Location, SobekCM_Library_Settings.Application_Server_Network); builder.Rebuild_All_Static_Pages(staticRebuildLog, true, SobekCM_Library_Settings.Local_Log_Directory, String.Empty, -1); } if (MarcRebuild) { Static_Pages_Builder builder = new Static_Pages_Builder(SobekCM_Library_Settings.Application_Server_URL, SobekCM_Library_Settings.Static_Pages_Location, SobekCM_Library_Settings.Application_Server_Network); builder.Rebuild_All_MARC_Files(SobekCM_Library_Settings.Image_Server_Network); } if (BuildProductionMarcxmlFeed) { Create_Complete_MarcXML_Feed(false); } if (BuildTestMarcxmlFeed) { Create_Complete_MarcXML_Feed(true); } // Create the log string directory = SobekCM_Library_Settings.Local_Log_Directory; if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } // Run the PRELOADER if (RunBulkloader) { Run_BulkLoader(verbose); } else { Console.WriteLine("PreLoader skipped per command line arguments"); } }
private void Run_BulkLoader(bool Verbose) { // Create the local log directories if (!Directory.Exists(SobekCM_Library_Settings.Local_Log_Directory)) { Console.WriteLine("Creating local log directory: " + SobekCM_Library_Settings.Local_Log_Directory); Directory.CreateDirectory(SobekCM_Library_Settings.Local_Log_Directory); } // Determine the new log name string log_name = "incoming_" + controllerStarted.Year + "_" + controllerStarted.Month.ToString().PadLeft(2, '0') + "_" + controllerStarted.Day.ToString().PadLeft(2, '0') + ".html"; string local_log_name = SobekCM_Library_Settings.Local_Log_Directory + "\\" + log_name; // Create the new log file LogFileXHTML preloader_logger = new LogFileXHTML(local_log_name, "SobekCM Incoming Packages Log", "UFDC_Builder.exe", true); // Step through each database instance foreach (Database_Instance_Configuration dbConfig in SobekCM_Library_Settings.Database_Connections) { try { if (!dbConfig.Is_Active) { Console.WriteLine(dbConfig.Name + " is set to INACTIVE"); preloader_logger.AddNonError(dbConfig.Name + " is set to INACTIVE"); } else { SobekCM_Database.Connection_String = dbConfig.Connection_String; Worker_BulkLoader newLoader = new Worker_BulkLoader(preloader_logger, verbose, dbConfig.Name, dbConfig.Can_Abort); newLoader.Perform_BulkLoader(Verbose); // Save information about this last run Library.Database.SobekCM_Database.Set_Setting("Builder Version", SobekCM_Library_Settings.CURRENT_BUILDER_VERSION); Library.Database.SobekCM_Database.Set_Setting("Builder Last Run Finished", DateTime.Now.ToString()); Library.Database.SobekCM_Database.Set_Setting("Builder Last Message", newLoader.Final_Message); } } catch { } } }
/// <summary> Continuously execute the processes in a recurring background thread </summary> public void Execute_In_Background() { // Load all the settings SobekCM_Library_Settings.Refresh(Library.Database.SobekCM_Database.Get_Settings_Complete(null)); // Set the variable which will control background execution int time_between_polls = SobekCM_Library_Settings.Builder_Override_Seconds_Between_Polls; if ((time_between_polls < 0) || (SobekCM_Library_Settings.Database_Connections.Count == 1)) { time_between_polls = Convert.ToInt32(SobekCM_Library_Settings.Builder_Seconds_Between_Polls); } // Determine the new log name string log_name = "incoming_" + controllerStarted.Year + "_" + controllerStarted.Month.ToString().PadLeft(2, '0') + "_" + controllerStarted.Day.ToString().PadLeft(2, '0') + ".html"; string local_log_name = SobekCM_Library_Settings.Local_Log_Directory + "\\" + log_name; // Create the new log file LogFileXHTML preloader_logger = new LogFileXHTML(local_log_name, "SobekCM Incoming Packages Log", "UFDC_Builder.exe", true); // start with warnings on imagemagick and ghostscript not being installed if (SobekCM_Library_Settings.ImageMagick_Executable.Length == 0) { Console.WriteLine("WARNING: Could not find ImageMagick installed. Some image processing will be unavailable."); preloader_logger.AddNonError("WARNING: Could not find ImageMagick installed. Some image processing will be unavailable."); } if (SobekCM_Library_Settings.Ghostscript_Executable.Length == 0) { Console.WriteLine("WARNING: Could not find GhostScript installed. Some PDF processing will be unavailable."); preloader_logger.AddNonError("WARNING: Could not find GhostScript installed. Some PDF processing will be unavailable."); } // Set the time for the next feed building event to 10 minutes from now feedNextBuildTime = DateTime.Now.Add(new TimeSpan(0, 10, 0)); // First, step through each active configuration and see if building is currently aborted // while doing very minimal processes aborted = false; Console.WriteLine("Checking for initial abort condition"); preloader_logger.AddNonError("Checking for initial abort condition"); string abort_message = String.Empty; Builder_Operation_Flag_Enum abort_flag = Builder_Operation_Flag_Enum.STANDARD_OPERATION; foreach (Database_Instance_Configuration dbConfig in SobekCM_Library_Settings.Database_Connections) { if ((!aborted) && (dbConfig.Is_Active) && (dbConfig.Can_Abort)) { SobekCM_Database.Connection_String = dbConfig.Connection_String; Library.Database.SobekCM_Database.Connection_String = dbConfig.Connection_String; // Check that this should not be skipped or aborted Builder_Operation_Flag_Enum operationFlag = Abort_Database_Mechanism.Builder_Operation_Flag; switch (operationFlag) { case Builder_Operation_Flag_Enum.ABORT_REQUESTED: case Builder_Operation_Flag_Enum.ABORTING: abort_message = "PREVIOUS ABORT flag found in " + dbConfig.Name; abort_flag = Builder_Operation_Flag_Enum.LAST_EXECUTION_ABORTED; Console.WriteLine(abort_message); preloader_logger.AddNonError(abort_message); aborted = true; Abort_Database_Mechanism.Builder_Operation_Flag = Builder_Operation_Flag_Enum.LAST_EXECUTION_ABORTED; break; case Builder_Operation_Flag_Enum.NO_BUILDING_REQUESTED: abort_message = "PREVIOUS NO BUILDING flag found in " + dbConfig.Name; Console.WriteLine(abort_message); preloader_logger.AddNonError(abort_message); aborted = true; break; } } } // If initially aborted, step through each instance and set a message if (aborted) { // Add messages in each active instance foreach (Database_Instance_Configuration dbConfig in SobekCM_Library_Settings.Database_Connections) { if (dbConfig.Is_Active) { Console.WriteLine("Setting previous abort flag message in " + dbConfig.Name); preloader_logger.AddNonError("Setting previous abort flag message in " + dbConfig.Name); SobekCM_Database.Connection_String = dbConfig.Connection_String; Library.Database.SobekCM_Database.Connection_String = dbConfig.Connection_String; Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", abort_message, String.Empty); // Save information about this last run Library.Database.SobekCM_Database.Set_Setting("Builder Version", SobekCM_Library_Settings.CURRENT_BUILDER_VERSION); Library.Database.SobekCM_Database.Set_Setting("Builder Last Run Finished", DateTime.Now.ToString()); Library.Database.SobekCM_Database.Set_Setting("Builder Last Message", abort_message); // Finally, set the builder flag appropriately if (abort_flag != Builder_Operation_Flag_Enum.STANDARD_OPERATION) { Abort_Database_Mechanism.Builder_Operation_Flag = abort_flag; } } } // Do nothing else return; } // Build all the bulk loader objects List <Worker_BulkLoader> loaders = new List <Worker_BulkLoader>(); bool activeInstanceFound = false; foreach (Database_Instance_Configuration dbConfig in SobekCM_Library_Settings.Database_Connections) { if (!dbConfig.Is_Active) { loaders.Add(null); Console.WriteLine(dbConfig.Name + " is set to INACTIVE"); preloader_logger.AddNonError(dbConfig.Name + " is set to INACTIVE"); } else { activeInstanceFound = true; SobekCM_Database.Connection_String = dbConfig.Connection_String; Library.Database.SobekCM_Database.Connection_String = dbConfig.Connection_String; // At this point warn on mossing the Ghostscript and ImageMagick if (SobekCM_Library_Settings.ImageMagick_Executable.Length == 0) { Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", "WARNING: Could not find ImageMagick installed. Some image processing will be unavailable.", String.Empty); } if (SobekCM_Library_Settings.Ghostscript_Executable.Length == 0) { Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", "WARNING: Could not find GhostScript installed. Some PDF processing will be unavailable.", String.Empty); } Console.WriteLine(dbConfig.Name + " - Preparing to begin polling"); preloader_logger.AddNonError(dbConfig.Name + " - Preparing to begin polling"); Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", "Preparing to begin polling", String.Empty); Worker_BulkLoader newLoader = new Worker_BulkLoader(preloader_logger, verbose, dbConfig.Name, dbConfig.Can_Abort); loaders.Add(newLoader); } } // If no active instances, just exit if (!activeInstanceFound) { Console.WriteLine("No active databases in the config file"); preloader_logger.AddError("No active databases in config file... Aborting"); return; } bool firstRun = true; // Loop continually until the end hour is achieved do { // Is it time to build any RSS/XML feeds? bool rebuildRssFeeds = false; if (DateTime.Compare(DateTime.Now, feedNextBuildTime) >= 0) { rebuildRssFeeds = true; feedNextBuildTime = DateTime.Now.Add(new TimeSpan(0, 10, 0)); } // Step through each instance for (int i = 0; i < SobekCM_Library_Settings.Database_Connections.Count; i++) { if (loaders[i] != null) { // Get the instance Database_Instance_Configuration dbInstance = SobekCM_Library_Settings.Database_Connections[i]; // Set the database connection strings SobekCM_Database.Connection_String = dbInstance.Connection_String; Library.Database.SobekCM_Database.Connection_String = dbInstance.Connection_String; // Look for abort if ((dbInstance.Can_Abort) && (CheckForAbort())) { aborted = true; if (Abort_Database_Mechanism.Builder_Operation_Flag != Builder_Operation_Flag_Enum.NO_BUILDING_REQUESTED) { abort_flag = Builder_Operation_Flag_Enum.LAST_EXECUTION_ABORTED; Abort_Database_Mechanism.Builder_Operation_Flag = Builder_Operation_Flag_Enum.ABORTING; } break; } // Refresh all settings, etc.. loaders[i].Refresh_Settings_And_Item_List(); // Pull the abort/pause flag Builder_Operation_Flag_Enum currentPauseFlag = Abort_Database_Mechanism.Builder_Operation_Flag; // If not paused, run the prebuilder if (currentPauseFlag != Builder_Operation_Flag_Enum.PAUSE_REQUESTED) { if (firstRun) { // // Always build an endeca feed first (so it occurs once a day) // if (SobekCM_Library_Settings.Build_MARC_Feed_By_Default) // { // Create_Complete_MarcXML_Feed(false); // } //} // CLear the old logs Console.WriteLine(dbInstance.Name + " - Expiring old log entries"); preloader_logger.AddNonError(dbInstance.Name + " - Expiring old log entries"); Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", "Expiring old log entries", String.Empty); Library.Database.SobekCM_Database.Builder_Expire_Log_Entries(SobekCM_Library_Settings.Builder_Log_Expiration_Days); // Rebuild all the static pages Console.WriteLine(dbInstance.Name + " - Rebuilding all static pages"); preloader_logger.AddNonError(dbInstance.Name + " - Rebuilding all static pages"); long staticRebuildLogId = Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", "Rebuilding all static pages", String.Empty); Static_Pages_Builder builder = new Static_Pages_Builder(SobekCM_Library_Settings.Application_Server_URL, SobekCM_Library_Settings.Static_Pages_Location, SobekCM_Library_Settings.Application_Server_Network); builder.Rebuild_All_Static_Pages(preloader_logger, false, SobekCM_Library_Settings.Local_Log_Directory, dbInstance.Name, staticRebuildLogId); // Process any pending FDA reports from the FDA Report DropBox Process_Any_Pending_FDA_Reports(loaders[i]); } Run_BulkLoader(loaders[i], verbose); // Look for abort if ((!aborted) && (dbInstance.Can_Abort) && (CheckForAbort())) { aborted = true; if (Abort_Database_Mechanism.Builder_Operation_Flag != Builder_Operation_Flag_Enum.NO_BUILDING_REQUESTED) { abort_flag = Builder_Operation_Flag_Enum.LAST_EXECUTION_ABORTED; Abort_Database_Mechanism.Builder_Operation_Flag = Builder_Operation_Flag_Enum.ABORTING; } break; } if (rebuildRssFeeds) { loaders[i].Build_Feeds(); } // Clear memory from this loader loaders[i].Clear_Item_List(); } else { preloader_logger.AddNonError(dbInstance.Name + " - Building paused"); Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", "Building temporarily PAUSED", String.Empty); } } } if (aborted) { break; } // No longer the first run firstRun = false; // Publish the log publish_log_file(local_log_name); // Sleep for correct number of milliseconds Thread.Sleep(1000 * time_between_polls); } while (DateTime.Now.Hour < BULK_LOADER_END_HOUR); // Do the final work for all of the different dbInstances if (!aborted) { for (int i = 0; i < SobekCM_Library_Settings.Database_Connections.Count; i++) { if (loaders[i] != null) { // Get the instance Database_Instance_Configuration dbInstance = SobekCM_Library_Settings.Database_Connections[i]; // Set the database flag SobekCM_Database.Connection_String = dbInstance.Connection_String; // Pull the abort/pause flag Builder_Operation_Flag_Enum currentPauseFlag2 = Abort_Database_Mechanism.Builder_Operation_Flag; // If not paused, run the prebuilder if (currentPauseFlag2 != Builder_Operation_Flag_Enum.PAUSE_REQUESTED) { // Refresh all settings, etc.. loaders[i].Refresh_Settings_And_Item_List(); // Initiate the recreation of the links between metadata and collections Library.Database.SobekCM_Database.Admin_Update_Cached_Aggregation_Metadata_Links(); } // Clear the memory loaders[i].Clear_Item_List(); } } } else { // Mark the aborted in each instance foreach (Database_Instance_Configuration dbConfig in SobekCM_Library_Settings.Database_Connections) { if (dbConfig.Is_Active) { Console.WriteLine("Setting abort flag message in " + dbConfig.Name); preloader_logger.AddNonError("Setting abort flag message in " + dbConfig.Name); SobekCM_Database.Connection_String = dbConfig.Connection_String; Library.Database.SobekCM_Database.Connection_String = dbConfig.Connection_String; Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", "Building ABORTED per request from database key", String.Empty); // Save information about this last run Library.Database.SobekCM_Database.Set_Setting("Builder Version", SobekCM_Library_Settings.CURRENT_BUILDER_VERSION); Library.Database.SobekCM_Database.Set_Setting("Builder Last Run Finished", DateTime.Now.ToString()); Library.Database.SobekCM_Database.Set_Setting("Builder Last Message", "Building ABORTED per request"); // Finally, set the builder flag appropriately if (abort_flag == Builder_Operation_Flag_Enum.LAST_EXECUTION_ABORTED) { Abort_Database_Mechanism.Builder_Operation_Flag = Builder_Operation_Flag_Enum.LAST_EXECUTION_ABORTED; } } } } // Publish the log publish_log_file(local_log_name); //// Initiate a solr/lucene index optimization since we are done loading for a while //if (DateTime.Now.Day % 2 == 0) //{ // if (SobekCM_Library_Settings.Document_Solr_Index_URL.Length > 0) // { // Console.WriteLine("Initiating Solr/Lucene document index optimization"); // Solr_Controller.Optimize_Document_Index(SobekCM_Library_Settings.Document_Solr_Index_URL); // } //} //else //{ // if (SobekCM_Library_Settings.Page_Solr_Index_URL.Length > 0) // { // Console.WriteLine("Initiating Solr/Lucene page index optimization"); // Solr_Controller.Optimize_Page_Index(SobekCM_Library_Settings.Page_Solr_Index_URL); // } //} //// Sleep for twenty minutes to end this (the index rebuild might take some time) //Thread.Sleep(1000 * 20 * 60); }