private void loadSubscriptionsFromRepository() { try { TableauRepository rep = new TableauRepository(Configurator.GetConfig("tableau_server"), Configurator.GetConfig("repository_pw"), "readonly"); rep.logger = this.logger; NpgsqlDataReader dr = rep.query_inactive_subscription_schedules(); Dictionary <string, int> input_box_schedules = new Dictionary <string, int>(); int rowCount = 0; availableSchedulesList.Items.Clear(); if (dr.HasRows == true) { while (dr.Read()) { availableSchedulesList.Items.Add(dr.GetString(1)); input_box_schedules[dr.GetString(1)] = rowCount; rowCount++; } } dr.Close(); // Check the selected schedules from the configs StringCollection checked_schedules = Configurator.GetConfigCollection("selected_schedule_names"); if (checked_schedules != null) { foreach (String sched_name in checked_schedules) { availableSchedulesList.SetItemChecked(input_box_schedules[sched_name], true); } } } catch (NpgsqlException ne) { this.logger.Log("Error with repository while loading the available schedules. Press reload button to try again. Going with existing checked schedules for now"); this.logger.Log(ne.Message); // Fill in the checkbox list based on the existing selected schedules StringCollection checked_schedules = Configurator.GetConfigCollection("selected_schedule_names"); if (checked_schedules != null) { var i = 0; Dictionary <string, int> input_box_schedules = new Dictionary <string, int>(); availableSchedulesList.Items.Clear(); foreach (String sched_name in checked_schedules) { availableSchedulesList.Items.Add(sched_name); input_box_schedules[sched_name] = i; availableSchedulesList.SetItemChecked(input_box_schedules[sched_name], true); i++; } } } catch (ConfigurationException ce) { this.logger.Log("Incorrect credentials for repository readonly user. Cannot connect to repository."); MessageBox.Show("Credentials were not correct for the Repository \"readonly\" user. Please fix"); } }
private void updateSchedulesQueue() { var activityId = this.nextActivityId; this.nextActivityId++; WriteToActivityGrid("Checking for schedules to run in the repository", activityId); this.Logger.Log("Schedule checks begin"); try { // Read the schedules that are currently in the repository, to update the active schedule queue TableauRepository rep = new TableauRepository(Configurator.GetConfig("tableau_server"), Configurator.GetConfig("repository_pw"), "readonly"); rep.logger = this.Logger; //this.Logger.Log("Starting to read from the repository"); NpgsqlDataReader dr = rep.QueryInactiveSubscriptionSchedulesForNextRunTime(); if (dr.HasRows == true) { //this.Logger.Log("Opening the active schedules queue file"); using (StreamWriter activeSchedulesQueueFileWriter = new StreamWriter(this.ActiveSchedulesQueueFilename, false, new UTF8Encoding())) { //this.Logger.Log("Reading from the result set "); while (dr.Read()) { // this.Logger.Log("Working inside the result set "); string scheduleName = dr.GetString(0); string scheduleNextRunTime = dr.GetDateTime(1).ToString(); //this.Logger.Log(String.Format("Schedule here {0} {1}", scheduleName, scheduleNextRunTime)); // Because the selections are stored instantly, load from the saved collectionr rather than the control // It is possible the control has not been redrawn at the time List <string> selectedScheduleNames = new List <string>() { }; StringCollection savedSchedules = Configurator.GetConfigCollection("selected_schedule_names"); if (savedSchedules != null) { foreach (String savedScheduleName in savedSchedules) { selectedScheduleNames.Add(savedScheduleName); } } string[] scheduleInfo = new string[2] { scheduleName, scheduleNextRunTime }; bool doesScheduleExistInQueue = false; // See if what is in the activeSchedulesQueue file is a checked schedule still foreach (string[] activeSchedule in this.ActiveSchedules) { if (activeSchedule[0] == scheduleName && activeSchedule[1] == scheduleNextRunTime) { this.Logger.Log(String.Format("Schedule {0} at {1} already in the schedules queue", scheduleName, scheduleNextRunTime)); doesScheduleExistInQueue = true; } } if (doesScheduleExistInQueue == false) { // Only add checked schedule names if (selectedScheduleNames.Any(scheduleInfo.Contains) == true) { this.ActiveSchedules.Add(scheduleInfo); WriteToActivityGrid(String.Format("Schedule {0} at {1} added to the schedules queue", scheduleName, scheduleNextRunTime), activityId); this.Logger.Log(String.Format("Schedule {0} at {1} added to the schedules queue", scheduleName, scheduleNextRunTime)); activeSchedulesQueueFileWriter.WriteLine(String.Format("{0}|{1}", scheduleName, scheduleNextRunTime)); } else { this.Logger.Log(String.Format("Schedule {0} at {1} not added to schedules queue because it is not selected", scheduleName, scheduleNextRunTime)); } } } } } else { this.Logger.Log("No rows found in the query for new schedules"); } dr.Close(); } catch (NpgsqlException ne) { this.Logger.Log("Connecting to repository to update the active queue failed. Ignoring for now, will update at next interval"); this.Logger.Log(ne.Message); } WriteToActivityGrid("Completed checking for new schedules", activityId); // Look at the Active Queue and determine if anything is past it's due date foreach (string[] queuedSchedule in this.ActiveSchedules.Reverse <string[]>()) { if (DateTime.Now.ToUniversalTime() > DateTime.Parse(queuedSchedule[1])) { activityId = this.nextActivityId; this.nextActivityId++; this.Logger.Log(String.Format("Schedule {0} at {1} is now eligible to be run.", queuedSchedule[0], queuedSchedule[1])); WriteToActivityGrid(String.Format("Schedule {0} at {1} is now eligible to be run. Queuing to run.", queuedSchedule[0], queuedSchedule[1]), activityId); // Add to the actionQueue at the top asyncActionQueue.Insert(0, () => { var queuedScheduleName = queuedSchedule[0]; var queuedScheduleRunTime = queuedSchedule[1]; WriteToActivityGrid(String.Format("Running Schedule {0} at {1}.", queuedSchedule[0], queuedSchedule[1]), activityId); bool result = SendEmail(queuedScheduleName); // Even if failure, remove from active schedules queue this.Logger.Log(String.Format("Removing {0} at {1} from active schedules queue", queuedSchedule[0], queuedSchedule[1])); this.ActiveSchedules.Remove(queuedSchedule); // Write the remaining queues. using (StreamWriter activeSchedulesQueueFileWriter = new StreamWriter(this.ActiveSchedulesQueueFilename, false, new UTF8Encoding())) { foreach (string[] currentlyQueuedSchedules in this.ActiveSchedules) { activeSchedulesQueueFileWriter.WriteLine(String.Format("{0}|{1}", currentlyQueuedSchedules[0], currentlyQueuedSchedules[1])); } } if (result) { WriteToActivityGrid(String.Format("Completed Schedule {0} at {1}.", queuedScheduleName, queuedScheduleRunTime), activityId); return(String.Format("Completed Schedule {0} at {1}.", queuedScheduleName, queuedScheduleRunTime)); } else { this.ActiveSchedules.Remove(queuedSchedule); WriteToActivityGrid(String.Format("Schedule {0} at {1} failed, see log.", queuedScheduleName, queuedScheduleRunTime), activityId); return(String.Format("Schedule {0} at {1} failed, see log.", queuedScheduleName, queuedScheduleRunTime)); } } ); // Launch the next action in the queue, if possible try { actionQueueBackgroundWorker.RunWorkerAsync(asyncActionQueue[0]); } // The queue response will launch the next action once it is finished catch (InvalidOperationException) { this.Logger.Log("Action queued but other action currently running"); } } } }