コード例 #1
0
        public void InsertNewDatabaseNodeToDatabasesXMLFileTest()
        {
            DatabasesXmlHandler dbHandler = new DatabasesXmlHandler();
            DatabaseInfo        dbInfo    = new DatabaseInfo();

            dbInfo.ID              = Guid.NewGuid();
            dbInfo.Host            = "localhost";
            dbInfo.User            = "******";
            dbInfo.Password        = "******";
            dbInfo.DatabaseName    = "test_database";
            dbInfo.StartTime       = new TimeSpan(4, 30, 0);
            dbInfo.AddUseDatabase  = false;
            dbInfo.IncludeRoutines = true;

            dbHandler.InsertDatabaseNode(dbInfo);

            XElement document     = XElement.Load(ConfigurationHandler.DB_CONFIG_FILE);
            var      databaseNode = document
                                    .Elements("Database")
                                    .FirstOrDefault(x => x.Attribute("ID").Value == dbInfo.ID.ToString());
            string databaseName = databaseNode.Element("Name").Value;

            Assert.AreEqual("test_database", databaseName);

            //remove the database node we just created
            dbHandler.RemoveDatabaseNode(dbInfo.ID);
        }
コード例 #2
0
        public void RetrieveAllDatabaseNodesTest()
        {
            DatabasesXmlHandler dbHandler = new DatabasesXmlHandler();
            DatabaseInfo        dbInfo    = new DatabaseInfo();
            Guid tmpGuid = Guid.NewGuid();

            dbInfo.ID              = tmpGuid;
            dbInfo.Host            = "localhost";
            dbInfo.User            = "******";
            dbInfo.Password        = "******";
            dbInfo.DatabaseName    = "TestDatabase";
            dbInfo.StartTime       = new TimeSpan(4, 30, 0);
            dbInfo.AddUseDatabase  = false;
            dbInfo.IncludeRoutines = true;

            dbHandler.InsertDatabaseNode(dbInfo);
            dbInfo.ID           = Guid.NewGuid();
            dbInfo.DatabaseName = "NewDatabase";
            dbHandler.InsertDatabaseNode(dbInfo);

            Assert.IsTrue(1 < dbHandler.GetAllDatabaseNodes().Count);

            dbHandler.RemoveDatabaseNode(dbInfo.ID);
            dbHandler.RemoveDatabaseNode(tmpGuid);
        }
コード例 #3
0
        public void UpdateSpecificDatabaseNodeTest()
        {
            DatabasesXmlHandler dbHandler = new DatabasesXmlHandler();
            DatabaseInfo        dbInfo    = new DatabaseInfo();

            dbInfo.ID              = Guid.NewGuid();
            dbInfo.Host            = "localhost";
            dbInfo.User            = "******";
            dbInfo.Password        = "******";
            dbInfo.DatabaseName    = "TestDatabase";
            dbInfo.StartTime       = new TimeSpan(4, 30, 0);
            dbInfo.AddUseDatabase  = false;
            dbInfo.IncludeRoutines = true;

            dbHandler.InsertDatabaseNode(dbInfo);

            //modify the dbInfo start time
            dbInfo.StartTime = new TimeSpan(22, 59, 0);

            dbHandler.UpdateDatabaseNode(dbInfo);

            dbInfo = dbHandler.GetDatabaseNode(dbInfo.ID)
            ;
            Assert.AreEqual("22:59:00", dbInfo.StartTime.ToString());

            dbHandler.RemoveDatabaseNode(dbInfo.ID);
        }
コード例 #4
0
        /// <summary>
        /// Schedules configured backups, and a daily cleanup task.
        /// </summary>
        public void ScheduleJobs()
        {
            LogHandler          logHandler = new LogHandler();
            List <DatabaseInfo> dbNodes    = new DatabasesXmlHandler().GetAllDatabaseNodes();

            if (0 == dbNodes.Count)
            {
                logHandler.LogMessage(LogHandler.MessageType.WARNING, "MySQL Backup Scheduler - No database nodes found. No backups will be scheduled.");
            }
            else
            {
                try
                {
                    scheduler = StdSchedulerFactory.GetDefaultScheduler();
                    scheduler.Start();
                    foreach (DatabaseInfo dbNode in dbNodes)
                    {
                        //Schedule backup job
                        IJobDetail backupJobDetail = JobBuilder.Create <CreateBackupJob>()
                                                     .WithIdentity(dbNode.ID.ToString() + "_Job", "Backup")
                                                     .UsingJobData(CreateBackupJob.Properties.DatabaseId.ToString(), dbNode.ID.ToString())
                                                     .Build();
                        ITrigger backupJobTrigger = TriggerBuilder.Create()
                                                    .WithIdentity(dbNode.ID.ToString() + "_Trigger", "Backup")
                                                    .StartAt(DateBuilder.TodayAt(dbNode.StartTime.Hours, dbNode.StartTime.Minutes, 0))
                                                    .WithSimpleSchedule(x => x.WithIntervalInHours(24).RepeatForever())
                                                    .Build();
                        scheduler.ScheduleJob(backupJobDetail, backupJobTrigger);
                        logHandler.LogMessage(LogHandler.MessageType.INFO, "Backup job scheduled for database: " + dbNode.DatabaseName + " @ " + dbNode.Host);
                    }
                    //Schedule cleanup job
                    IJobDetail cleanupJobDetail = JobBuilder.Create <DeleteOldBackupsJob>()
                                                  .WithIdentity("Delete_Old_Job", "Cleanup")
                                                  .Build();
                    ITrigger cleanupTrigger = TriggerBuilder.Create()
                                              .WithIdentity("Delete_Old_Trigger", "Cleanup")
                                              .StartAt(DateBuilder.TodayAt(1, 0, 0))
                                              .WithSimpleSchedule(x => x.WithIntervalInHours(24).RepeatForever())
                                              .Build();
                    scheduler.ScheduleJob(cleanupJobDetail, cleanupTrigger);
                    logHandler.LogMessage(LogHandler.MessageType.INFO, "Cleanup job scheduled.");
                }
                catch (Exception ex)
                {
                    logHandler.LogMessage(LogHandler.MessageType.ERROR, "Error scheduling backup jobs: " + ex.ToString());
                }
            }
        }
コード例 #5
0
        /// <summary>
        /// Restores the database.
        /// </summary>
        /// <param name="dumpFilePath">The dump file path.</param>
        /// <param name="dbInfo">The database information.</param>
        public void RestoreDatabase(string dumpFilePath, Guid databaseId)
        {
            Process          process = null;
            DatabaseInfo     dbInfo  = new DatabasesXmlHandler().GetDatabaseNode(databaseId);
            ProcessStartInfo psi     = new ProcessStartInfo();

            psi.FileName = "mysql";
            psi.RedirectStandardInput  = true;
            psi.RedirectStandardOutput = true;
            psi.RedirectStandardError  = true;
            psi.StandardOutputEncoding = Encoding.UTF8;
            psi.Arguments       = string.Format(@"-u {0} -p{1} -h {2} -P{3}", dbInfo.User, dbInfo.Password, dbInfo.HostNoPort, dbInfo.Port);
            psi.UseShellExecute = false;
            psi.CreateNoWindow  = true;

            process = Process.Start(psi);

            using (var stdin = new System.IO.StreamWriter(process.StandardInput.BaseStream, Encoding.UTF8))
                using (var reader = System.IO.File.OpenText(@dumpFilePath))
                {
                    string line;
                    while ((line = reader.ReadLine()) != null)
                    {
                        stdin.WriteLine(line);
                    }
                    stdin.Close();
                }

            string output       = process.StandardOutput.ReadToEnd();
            string error        = process.StandardError.ReadToEnd();
            bool   isServerDown = false;

            if (!ErrorHandler.HasErrorOccured(error, ref isServerDown))
            {
                new LogHandler().LogMessage(LogHandler.MessageType.INFO, "The database " + dbInfo.DatabaseName + ", has been restored, from this backup dump file '" + dumpFilePath + "'");
            }

            if (process != null)
            {
                process.WaitForExit();
            }
        }
コード例 #6
0
        public void RetrieveSpecificDatabaseNodeTest()
        {
            DatabasesXmlHandler dbHandler = new DatabasesXmlHandler();
            DatabaseInfo        dbInfo    = new DatabaseInfo();

            dbInfo.ID              = Guid.NewGuid();
            dbInfo.Host            = "localhost";
            dbInfo.User            = "******";
            dbInfo.Password        = "******";
            dbInfo.DatabaseName    = "TestDatabase";
            dbInfo.StartTime       = new TimeSpan(4, 30, 0);
            dbInfo.AddUseDatabase  = false;
            dbInfo.IncludeRoutines = true;

            dbHandler.InsertDatabaseNode(dbInfo);

            DatabaseInfo dbInfo2 = dbHandler.GetDatabaseNode(dbInfo.ID);

            Assert.AreEqual("TestDatabase", dbInfo2.DatabaseName);

            dbHandler.RemoveDatabaseNode(dbInfo.ID);
        }
コード例 #7
0
        public void RemoveSpecificDatabaseNodeTest()
        {
            DatabasesXmlHandler dbHandler = new DatabasesXmlHandler();
            DatabaseInfo        dbInfo    = new DatabaseInfo();

            dbInfo.ID              = Guid.NewGuid();
            dbInfo.Host            = "localhost";
            dbInfo.User            = "******";
            dbInfo.Password        = "******";
            dbInfo.DatabaseName    = "TestDatabase";
            dbInfo.StartTime       = new TimeSpan(4, 30, 0);
            dbInfo.AddUseDatabase  = false;
            dbInfo.IncludeRoutines = true;

            dbHandler.InsertDatabaseNode(dbInfo);
            dbHandler.RemoveDatabaseNode(dbInfo.ID);

            XElement document     = XElement.Load(ConfigurationHandler.DB_CONFIG_FILE);
            var      databaseNode = document
                                    .Elements("Database")
                                    .FirstOrDefault(x => x.Attribute("ID").Value == dbInfo.ID.ToString());

            Assert.IsNull(databaseNode);
        }
コード例 #8
0
        /// <summary>
        /// Processes MySQL dump for the given database.
        /// </summary>
        /// <param name="databaseName">Name of the database.</param>
        public bool ProcessMySqlDump(Guid databaseId)
        {
            Boolean      success = false;
            DatabaseInfo dbInfo  = new DatabasesXmlHandler().GetDatabaseNode(databaseId);

            if (dbInfo != null)
            {
                System.Threading.Thread.Sleep(1000);   //Let Application Sleep for 1 second, preventing multiple backup executions of the same database.
                Process process = null;
                if (!isServerDown)
                {
                    string dumpOptions = " ";
                    if (dbInfo.AddUseDatabase)
                    {
                        dumpOptions += "--databases ";
                    }
                    ;
                    dumpOptions += string.Format(@"""{0}"" -u{1} -p{2} -h{3} -P{4} --add-drop-database --add-drop-table --add-locks --comments --create-options --dump-date --lock-tables"
                                                 , dbInfo.DatabaseName
                                                 , dbInfo.User
                                                 , dbInfo.Password
                                                 , dbInfo.HostNoPort
                                                 , dbInfo.Port);
                    if (dbInfo.IncludeRoutines)
                    {
                        dumpOptions += " --routines";
                    }
                    ProcessStartInfo psi = new ProcessStartInfo();
                    psi.FileName = "mysqldump";
                    psi.RedirectStandardInput  = false;
                    psi.RedirectStandardOutput = true;
                    psi.RedirectStandardError  = true;
                    psi.StandardOutputEncoding = Encoding.UTF8;
                    psi.Arguments       = dumpOptions;
                    psi.UseShellExecute = false;
                    psi.CreateNoWindow  = true;

                    try
                    {
                        process = Process.Start(psi);
                        //string output = process.StandardOutput.ReadToEnd();
                        string error = process.StandardError.ReadToEnd();
                        if (!ErrorHandler.HasErrorOccured(error, ref this.isServerDown))
                        {
                            string backupLocation;
                            if (CreateBackupLocation(dbInfo.HostNoPort, dbInfo.DatabaseName, out backupLocation))
                            {
                                this.WriteBackupFile(backupLocation, dbInfo.DatabaseName, process.StandardOutput);
                                success = true;
                                new LogHandler().LogMessage(LogHandler.MessageType.INFO, "Backup created of the database " + dbInfo.DatabaseName);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        if (ex.Message.ToLower().Contains("cannot find the file"))
                        {
                            new LogHandler().LogMessage(LogHandler.MessageType.ERROR, @"The system could not find the MySQLDump.exe file. Please add the MySQL \bin path to your system's PATH variable.");
                        }
                        else
                        {
                            new LogHandler().LogMessage(LogHandler.MessageType.ERROR, @"Unknown exception occurred during backup: " + ex.ToString());
                        }
                    }
                }

                if (process != null)
                {
                    process.WaitForExit();
                }
            }
            return(success);
        }