private ValueHolder LoadDirectories(AdapterMySql DbAdapter, long FolderId) { Message request = new Message("Command", System.Data.CommandType.StoredProcedure.ToString()); request.AddData(new ValueHolder("Directories", string.Format("uspGetBackupJobDirectories({0})", FolderId))); request.AddSender("LoadDirectories", typeof(Job).ToString()); DbAdapter.Send(request); IRecordSet reply = (IRecordSet)DbAdapter.Receive(); foreach (ValueHolder directory in reply.Data.Annotations) { if (directory != null) { long directoryId = (long)directory.GetAnnotation("Id").Value; ValueHolder files = LoadFiles(DbAdapter, directoryId); if (files != null) { directory.AddAnnotation(files); } } } return(reply.Data); }
private ValueHolder GetAllBackupJobs() { AdapterMySql DbAdapter = new AdapterMySql("localhost", "backup", "root", "yala"); ValueHolder jobs = new ValueHolder("Tasks"); Message request = new Message("Command", System.Data.CommandType.Text.ToString()); request.AddData(new ValueHolder("Jobs", "select job.Name from tblbackupjobs job left outer join tblbackupjobexecution exec on job.JobId = exec.JobId where exec.JobId is null or (exec.Status is not null and exec.Status <> 'INPROGRESS');")); request.AddSender("GetAllBackupJobs", typeof(Job).ToString()); DbAdapter.Send(request); IRecordSet reply = (IRecordSet)DbAdapter.Receive(); if (reply.Data != null && reply.Data.GetAnnotation("Record") != null) { foreach (ValueHolder record in reply.Data.Annotations) { string name = (string)record.GetAnnotation("Name").Value; ValueHolder definition = new ValueHolder(name); definition.AddAnnotation("DbAdapter", DbAdapter); Job job = new Job(definition, _logger); jobs.AddAnnotation(record.Value.ToString(), job.Task); } } return(jobs); }
private void AddBackupFolders(AdapterMySql DbAdapter, long JobId, string BaseFolder) { DirectoryInfo root = new DirectoryInfo(BaseFolder); try { DirectoryInfo[] directories = root.GetDirectories(); string name = ExpressionEvaluator.EncodeToken(root.Name); string path = ExpressionEvaluator.EncodeToken(root.FullName); Message request = new Message("Command", System.Data.CommandType.StoredProcedure.ToString()); request.AddData(new ValueHolder("Folder", string.Format("uspAddFolder({0},'{1}','{2}')", JobId, name, path))); request.AddSender("AddBackupFolders", typeof(Job).ToString()); DbAdapter.Send(request); _logger.Send(string.Format("Adding folder '{0}'.", root.Name)); foreach (DirectoryInfo directory in directories) { AddBackupFolders(DbAdapter, JobId, directory.FullName); } } catch (UnauthorizedAccessException e) { //Cannot rea d folder so skip it _logger.Send(string.Format("Exception: {0}", e.Message)); } }
private void StatusHandler(Object sender, TaskEventArgs e) { AdapterMySql DbAdapter = (AdapterMySql)e.Parameters.GetAnnotation("DbAdapter").Value; long jobId = (long)((IRecordSet)e.Parameters.GetAnnotation("Job").Value).Data.GetAnnotationByValue(1).GetAnnotation("Id").Value; UpdateJobStatus(DbAdapter, jobId, e.Status.ToString(), DateTime.Now); }
public void UpdateJobStatus(AdapterMySql DbAdapter, long JobId, string Status, DateTime EventDtm) { Message request = new Message("Command", System.Data.CommandType.StoredProcedure.ToString()); request.AddData(new ValueHolder("Job", string.Format("uspAddBackupEvent({0},'{1}','{2}')", JobId, Status, EventDtm))); request.AddSender("UpdateJobStatus", typeof(Job).ToString()); DbAdapter.Send(request); }
private ValueHolder LoadFiles(AdapterMySql DbAdapter, long FolderId) { Message request = new Message("Command", System.Data.CommandType.StoredProcedure.ToString()); request.AddData(new ValueHolder("Files", string.Format("uspGetBackupJobFiles({0})", FolderId))); request.AddSender("LoadFiles", typeof(Job).ToString()); DbAdapter.Send(request); IRecordSet reply = (IRecordSet)DbAdapter.Receive(); return(reply.Data); }
private long AddBackupJob(AdapterMySql DbAdapter, string Name) { Message request = new Message("Command", System.Data.CommandType.StoredProcedure.ToString()); request.AddData(new ValueHolder("Job", string.Format("uspAddBackupJob('{0}','{1}')", Name, @"C:\Temp"))); request.AddSender("AddBackupJob", typeof(Job).ToString()); DbAdapter.Send(request); IRecordSet reply = (IRecordSet)DbAdapter.Receive(); var Id = (long)reply.Data.GetAnnotationByValue(1).GetAnnotation("id").Value; return(Id); }
private void Configure(string config_file) { var settings = LoadBackupSettings(config_file); string baseFolder = settings.BaseFolder; AdapterMySql dbAdapter = new AdapterMySql("localhost", "backup", "root", "yala"); string[] names = settings.Folders.ToArray(); //{ "Documents", "Downloads" }; foreach (string name in names) { AddBackupFolders(dbAdapter, AddBackupJob(dbAdapter, name), Path.Combine(baseFolder, name)); } }
private IRecordSet Load(ValueHolder Definition) { AdapterMySql DbAdapter = (AdapterMySql)Definition.GetAnnotation("DbAdapter").Value; string name = Definition.Name; Message request = new Message("Command", System.Data.CommandType.StoredProcedure.ToString()); request.AddData(new ValueHolder("Job", string.Format("uspGetBackupJob('{0}')", name))); request.AddSender("Load", typeof(Job).ToString()); DbAdapter.Send(request); IRecordSet reply = (IRecordSet)DbAdapter.Receive(); long jobId = (long)reply.Data.GetAnnotationByValue(1).GetAnnotation("Id").Value; ValueHolder definition = LoadDirectories(DbAdapter, jobId); if (definition != null) { reply.Data.AddAnnotation(definition); } return(reply); }
public void Execute(ValueHolder Parameters) { IRecordSet job = (IRecordSet)Parameters.GetAnnotation("Job").Value; AdapterMySql dbAdapter = (AdapterMySql)Parameters.GetAnnotation("DbAdapter").Value; long jobId = (long)job.Data.GetAnnotationByValue(1).GetAnnotation("Id").Value; string baseTargetDirectory = (string)job.Data.GetAnnotationByValue(1).GetAnnotation("Target").Value; if (jobId == -1) { throw new Exception(string.Format("No job was found with name '{0}'.", Parameters.Name)); } _logger.Send(string.Format("Backup '{0}' starting...", Parameters.Name)); foreach (ValueHolder directory in job.Data.GetAnnotation("Directories").Annotations) { string path = (string)directory.GetAnnotation("Path").Value; long directoryId = (long)directory.GetAnnotation("Id").Value; if (Directory.Exists(path)) { _logger.Send(string.Format("Processing directory '{0}'", path)); String[] files = Directory.GetFiles(path); if (directory.GetAnnotation("Files") != null) { foreach (ValueHolder file in directory.GetAnnotation("Files").Annotations) { long fileId = (long)file.GetAnnotation("Id").Value; string name = (string)file.GetAnnotation("Name").Value; long size = (long)file.GetAnnotation("Size").Value; DateTime modifiedDtm = (DateTime)file.GetAnnotation("Modified").Value; //Backup the file String pathName = Path.Combine(path, name); if (File.Exists(pathName)) { //Remove file from folder's files because is not a new file files.Remove(pathName); FileInfo info = new FileInfo(pathName); //Workaround because milliseconds are not persisted by the AdapterMySql DateTime fileDtm = DateTime.Parse(info.LastWriteTime.ToString("MM/dd/yyyy HH:mm:ss tt")); //Get target file name and location string targetDirectory = Path.Combine(baseTargetDirectory, Path.GetDirectoryName(pathName).Substring(3)); string newName = Path.Combine(targetDirectory, name); //If the file exists in database but not in backup location or if size of original //file and backup file are different or updated timestamps are different then re-copy it if (!File.Exists(newName) || size == 0 || info.Length != size || fileDtm != modifiedDtm) { //Create target path if it does not exist Directory.CreateDirectory(targetDirectory); //Do backup _logger.Send(string.Format("Refreshing file {0}", name)); File.Copy(pathName, newName, true); //Update file info in the database Message request = new Message("Command", System.Data.CommandType.StoredProcedure.ToString()); request.AddData(new ValueHolder("File", string.Format("uspUpdateBackupJobFile({0},{1},{2},'{3}')", jobId, fileId, info.Length, fileDtm))); request.AddSender("UpdateFile", typeof(Job).ToString()); dbAdapter.Send(request); } } } } //Now add to backup definitions any new files foreach (String pathName in files) { //Backup the file String name = Path.GetFileName(pathName); if (File.Exists(pathName)) { FileInfo info = new FileInfo(pathName); //Create target path if it does not exist string targetDirectory = Path.Combine(baseTargetDirectory, Path.GetDirectoryName(pathName).Substring(3)); Directory.CreateDirectory(targetDirectory); //Do backup _logger.Send(string.Format("Copying file {0}", name)); string newName = Path.Combine(targetDirectory, name); File.Copy(pathName, newName, true); //Add file info in the database Message request = new Message("Command", System.Data.CommandType.StoredProcedure.ToString()); //Encode file name because sproc calls in mysql adapter use the evaluator to parse the sql command request.AddData(new ValueHolder("File", string.Format("uspAddBackupJobFile({0},{1},'{2}',{3},'{4}')", jobId, directoryId, ExpressionEvaluator.EncodeToken(name), info.Length, info.LastWriteTime))); request.AddSender("UpdateJob", typeof(Job).ToString()); dbAdapter.Send(request); } } } } _logger.Send(string.Format("Backup '{0}' complete.", Parameters.Name)); }