diff --git a/src/PollinationSDK/Wrapper/JobInfo.cs b/src/PollinationSDK/Wrapper/JobInfo.cs index c45dce9b..4dcd4324 100644 --- a/src/PollinationSDK/Wrapper/JobInfo.cs +++ b/src/PollinationSDK/Wrapper/JobInfo.cs @@ -248,42 +248,57 @@ public async Task RunJobAsync(Action progressReporting private async Task RunJobOnLocalAsync() { - if (string.IsNullOrEmpty(this.LocalRunFolder) || !this.IsLocalJob) - throw new ArgumentException($"Please call SetLocalJob() before running a job"); - - var workDir = this.LocalRunOutputFolder; - var cpuNum = this.LocalCPUNumber; - var isSilentMode = this.LocalSilentMode; - var runner = new JobRunner(this); - var runout = await Task.Run(() => runner.RunOnLocalMachine(workDir, cpuNum, isSilentMode)).ConfigureAwait(false); - // check local job status - var status = JobRunner.CheckLocalJobStatus(runout); - this.LocalJobStatus = status.ToString(); - - var jobInfo = new ScheduledJobInfo(this, workDir); - - //save jobinfo to folder - var jobPath = Path.Combine(jobInfo.SavedLocalPath, "job.json"); - File.WriteAllText(jobPath, jobInfo.ToJson()); - - // add the record to local database - LocalDatabase.Instance.Add(jobInfo); - return jobInfo; + try + { + if (string.IsNullOrEmpty(this.LocalRunFolder) || !this.IsLocalJob) + throw new ArgumentException($"Please call SetLocalJob() before running a job"); + + var workDir = this.LocalRunOutputFolder; + var cpuNum = this.LocalCPUNumber; + var isSilentMode = this.LocalSilentMode; + var runner = new JobRunner(this); + var runout = await Task.Run(() => runner.RunOnLocalMachine(workDir, cpuNum, isSilentMode)).ConfigureAwait(false); + // check local job status + var status = JobRunner.CheckLocalJobStatus(runout); + this.LocalJobStatus = status.ToString(); + + var jobInfo = new ScheduledJobInfo(this, workDir); + + //save jobinfo to folder + var jobPath = Path.Combine(jobInfo.SavedLocalPath, "job.json"); + File.WriteAllText(jobPath, jobInfo.ToJson()); + + // add the record to local database + LocalDatabase.Instance.Add(jobInfo); + return jobInfo; + } + catch (Exception e) + { + throw LogHelper.LogReturnError(e); + } + } private async Task RunJobOnCloudAsync(Action progressReporting = default, System.Threading.CancellationToken token = default) { - if (string.IsNullOrEmpty(this.ProjectSlug) || this.IsLocalJob) - throw new ArgumentException($"Please call SetCloudJob() before running a job"); + try + { + if (string.IsNullOrEmpty(this.ProjectSlug) || this.IsLocalJob) + throw new ArgumentException($"Please call SetCloudJob() before running a job"); - var proj = Helper.GetWritableProject(this.ProjectSlug); - var runner = new JobRunner(this); - var cloudJob = await runner.RunOnCloudAsync(proj, progressReporting, token); - var jobInfo = new ScheduledJobInfo(proj, cloudJob); + var proj = Helper.GetWritableProject(this.ProjectSlug); + var runner = new JobRunner(this); + var cloudJob = await runner.RunOnCloudAsync(proj, progressReporting, token); + var jobInfo = new ScheduledJobInfo(proj, cloudJob); - // add the record to local database - //LocalDatabase.Instance.Add(jobInfo); - return jobInfo; + // add the record to local database + //LocalDatabase.Instance.Add(jobInfo); + return jobInfo; + } + catch (Exception e) + { + throw LogHelper.LogReturnError(e); + } } public async Task UploadJobAssetsAsync(Action progressReporting = default, System.Threading.CancellationToken token = default) diff --git a/src/PollinationSDK/Wrapper/LocalDatabase.cs b/src/PollinationSDK/Wrapper/LocalDatabase.cs index 4856f52c..d1d4e7be 100644 --- a/src/PollinationSDK/Wrapper/LocalDatabase.cs +++ b/src/PollinationSDK/Wrapper/LocalDatabase.cs @@ -10,16 +10,7 @@ public class LocalDatabase { public string DatabaseFile { get; set; } = "pollination.db"; private SqliteConnection _connection; - private SqliteConnection connection - { - get - { - _connection = _connection ?? CreateConnection(); - if (_connection.State == System.Data.ConnectionState.Closed) - _connection.Open(); - return _connection; - } - } + private SqliteConnection connection => GetConnection(); private static LocalDatabase _instance; public static LocalDatabase Instance @@ -31,17 +22,41 @@ public static LocalDatabase Instance } } + SqliteConnection GetConnection() + { + try + { + _connection = _connection ?? CreateConnection(); + if (_connection.State == System.Data.ConnectionState.Closed) + _connection.Open(); + return _connection; + } + catch (Exception e) + { + throw LogHelper.LogReturnError(e); + } + + } SqliteConnection CreateConnection() { - - SqliteConnection con; - var file = GetDatabaseFile(); - var fileExist = File.Exists(file); - con = new SqliteConnection($"Data Source={file}"); - con.Open(); - if (!fileExist) InitDatabase(con); - return con; + try + { + SqliteConnection con; + var file = GetDatabaseFile(); + var fileExist = File.Exists(file); + con = new SqliteConnection($"Data Source={file}"); + con.Open(); + if (!fileExist) + InitDatabase(con); + + return con; + } + catch (Exception e) + { + throw LogHelper.LogReturnError(e); + } + } public void DeleteDatabase() @@ -51,15 +66,25 @@ public void DeleteDatabase() File.Delete(file); } + public string GetDatabaseFile() { - var file = DatabaseFile; - //C:\Users\mingo\.pollination - var userDir = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); - var dir = Path.Combine(userDir, ".pollination"); - Directory.CreateDirectory(dir); - var filePath = Path.Combine(dir, file); - return filePath; + try + { + var file = DatabaseFile; + //C:\Users\mingo\.pollination + var userDir = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); + var dir = Path.Combine(userDir, ".pollination"); + Directory.CreateDirectory(dir); + var filePath = Path.Combine(dir, file); + LogHelper.LogInfo(filePath); + return filePath; + } + catch (Exception e) + { + throw LogHelper.LogReturnError(e); + } + } static void InitDatabase(SqliteConnection con) @@ -129,70 +154,97 @@ public bool Add(IEnumerable jobResults) static bool Add(SqliteConnection connection, ScheduledJobInfo schJob) { - using (var con = connection) + try { - var cmd = con.CreateCommand(); - cmd.CommandText = - @" + using (var con = connection) + { + var cmd = con.CreateCommand(); + cmd.CommandText = + @" INSERT INTO JobTable (ProjSlug, JobID, DateTime, JobInfo) VALUES ($ProjSlug, $JobID, $DateTime, $JobInfo) "; - cmd.Parameters.AddWithValue("$ProjSlug", SqliteType.Text).Value = schJob.ProjectSlug.ToLower(); - cmd.Parameters.AddWithValue("$JobID", SqliteType.Text).Value = schJob.JobID; - cmd.Parameters.AddWithValue("$DateTime", SqliteType.Text).Value = DateTime.Now; - cmd.Parameters.AddWithValue("$JobInfo", SqliteType.Blob).Value = schJob.Serialize_Binary(); - var done = cmd.ExecuteNonQuery(); - con.Close(); - return done == 1; + cmd.Parameters.AddWithValue("$ProjSlug", SqliteType.Text).Value = schJob.ProjectSlug.ToLower(); + cmd.Parameters.AddWithValue("$JobID", SqliteType.Text).Value = schJob.JobID; + cmd.Parameters.AddWithValue("$DateTime", SqliteType.Text).Value = DateTime.Now; + cmd.Parameters.AddWithValue("$JobInfo", SqliteType.Blob).Value = schJob.Serialize_Binary(); + LogHelper.LogInfo($"Adding {schJob.ProjectSlug}/{schJob.JobID}"); + var done = cmd.ExecuteNonQuery(); + con.Close(); + return done == 1; + } + + } + catch (Exception e) + { + throw LogHelper.LogReturnError(e, $"Failed to add job to local database:\n{schJob}"); } - + } static List Get(SqliteConnection connection, string condition) { - var res = new List(); - condition = string.IsNullOrEmpty(condition) ? "1=1" : condition; - using (var con = connection) + + try { - var cmd = con.CreateCommand(); - cmd.CommandText = -$@" + var res = new List(); + condition = string.IsNullOrEmpty(condition) ? "1=1" : condition; + using (var con = connection) + { + var cmd = con.CreateCommand(); + cmd.CommandText = + $@" SELECT JobInfo FROM JobTable WHERE {condition} "; - using (var reader = cmd.ExecuteReader()) - { - while (reader.Read()) + LogHelper.LogInfo($"Getting a job {condition}"); + using (var reader = cmd.ExecuteReader()) { - var package = (byte[])reader.GetValue(0); - var re = ScheduledJobInfo.Deserialize_Binary(package); - res.Add(re); + while (reader.Read()) + { + var package = (byte[])reader.GetValue(0); + var re = ScheduledJobInfo.Deserialize_Binary(package); + res.Add(re); + } } + con.Close(); } - con.Close(); + return res; } - return res; + catch (Exception e) + { + throw LogHelper.LogReturnError(e, $"Failed to get a job from local database:\n{condition}"); + } + } static bool Delete(SqliteConnection connection, string projID, string jobId) { - using (var con = connection) + try { - var cmd = con.CreateCommand(); - cmd.CommandText = -@" + using (var con = connection) + { + var cmd = con.CreateCommand(); + cmd.CommandText = + @" DELETE FROM JobTable WHERE ProjSlug = $ProjSlug AND JobID = $JobID "; - cmd.Parameters.AddWithValue("$ProjSlug", SqliteType.Blob).Value = projID; - cmd.Parameters.AddWithValue("$JobID", SqliteType.Text).Value = jobId; - - var done = cmd.ExecuteNonQuery(); - con.Close(); - return done >= 1; + cmd.Parameters.AddWithValue("$ProjSlug", SqliteType.Blob).Value = projID; + cmd.Parameters.AddWithValue("$JobID", SqliteType.Text).Value = jobId; + LogHelper.LogInfo($"Deleting a job:\nProjSlug={projID} AND JobID={jobId}"); + var done = cmd.ExecuteNonQuery(); + con.Close(); + return done >= 1; + } } + catch (Exception e) + { + throw LogHelper.LogReturnError(e, $"Failed to delete a job from local database:\nProjSlug={projID} AND JobID={jobId}"); + } + } } }