Skip to content

Commit

Permalink
fix(LocalDatabase): log errors for LocalDatabase
Browse files Browse the repository at this point in the history
  • Loading branch information
MingboPeng committed Mar 12, 2024
1 parent 2a4d404 commit eed89fe
Show file tree
Hide file tree
Showing 2 changed files with 158 additions and 91 deletions.
75 changes: 45 additions & 30 deletions src/PollinationSDK/Wrapper/JobInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -248,42 +248,57 @@ public async Task<ScheduledJobInfo> RunJobAsync(Action<string> progressReporting

private async Task<ScheduledJobInfo> 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<ScheduledJobInfo> RunJobOnCloudAsync(Action<string> 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<Job> UploadJobAssetsAsync(Action<string> progressReporting = default, System.Threading.CancellationToken token = default)
Expand Down
174 changes: 113 additions & 61 deletions src/PollinationSDK/Wrapper/LocalDatabase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
Expand All @@ -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)
Expand Down Expand Up @@ -129,70 +154,97 @@ public bool Add(IEnumerable<ScheduledJobInfo> 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<ScheduledJobInfo> Get(SqliteConnection connection, string condition)
{
var res = new List<ScheduledJobInfo>();
condition = string.IsNullOrEmpty(condition) ? "1=1" : condition;
using (var con = connection)

try
{
var cmd = con.CreateCommand();
cmd.CommandText =
$@"
var res = new List<ScheduledJobInfo>();
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}");
}

}
}
}

0 comments on commit eed89fe

Please sign in to comment.