Esempio n. 1
0
        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");
            }
        }
Esempio n. 2
0
        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");
                    }
                }
            }
        }