Added log correlation and revised background tasks layout (#230)
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
|
|
||||||
namespace gaseous_server.Classes
|
namespace gaseous_server.Classes
|
||||||
@@ -111,5 +112,30 @@ namespace gaseous_server.Classes
|
|||||||
.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
|
.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Provides a way to set contextual data that flows with the call and
|
||||||
|
/// async context of a test or invocation.
|
||||||
|
/// </summary>
|
||||||
|
public static class CallContext
|
||||||
|
{
|
||||||
|
static ConcurrentDictionary<string, AsyncLocal<object>> state = new ConcurrentDictionary<string, AsyncLocal<object>>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Stores a given object and associates it with the specified name.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name with which to associate the new item in the call context.</param>
|
||||||
|
/// <param name="data">The object to store in the call context.</param>
|
||||||
|
public static void SetData(string name, object data) =>
|
||||||
|
state.GetOrAdd(name, _ => new AsyncLocal<object>()).Value = data;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieves an object with the specified name from the <see cref="CallContext"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the item in the call context.</param>
|
||||||
|
/// <returns>The object in the call context associated with the specified name, or <see langword="null"/> if not found.</returns>
|
||||||
|
public static object GetData(string name) =>
|
||||||
|
state.TryGetValue(name, out AsyncLocal<object> data) ? data.Value : null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -75,8 +75,28 @@ namespace gaseous_server.Classes
|
|||||||
LogToDisk(logItem, TraceOutput, null);
|
LogToDisk(logItem, TraceOutput, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string correlationId;
|
||||||
|
if (CallContext.GetData("CorrelationId").ToString() == null)
|
||||||
|
{
|
||||||
|
correlationId = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
correlationId = CallContext.GetData("CorrelationId").ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
string callingProcess;
|
||||||
|
if (CallContext.GetData("CallingProcess").ToString() == null)
|
||||||
|
{
|
||||||
|
callingProcess = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
callingProcess = CallContext.GetData("CallingProcess").ToString();
|
||||||
|
}
|
||||||
|
|
||||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||||
string sql = "DELETE FROM ServerLogs WHERE EventTime < @EventRententionDate; INSERT INTO ServerLogs (EventTime, EventType, Process, Message, Exception) VALUES (@EventTime, @EventType, @Process, @Message, @Exception);";
|
string sql = "DELETE FROM ServerLogs WHERE EventTime < @EventRententionDate; INSERT INTO ServerLogs (EventTime, EventType, Process, Message, Exception, CorrelationId, CallingProcess) VALUES (@EventTime, @EventType, @Process, @Message, @Exception, @correlationid, @callingprocess);";
|
||||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||||
dbDict.Add("EventRententionDate", DateTime.UtcNow.AddDays(Config.LoggingConfiguration.LogRetention * -1));
|
dbDict.Add("EventRententionDate", DateTime.UtcNow.AddDays(Config.LoggingConfiguration.LogRetention * -1));
|
||||||
dbDict.Add("EventTime", logItem.EventTime);
|
dbDict.Add("EventTime", logItem.EventTime);
|
||||||
@@ -84,6 +104,8 @@ namespace gaseous_server.Classes
|
|||||||
dbDict.Add("Process", logItem.Process);
|
dbDict.Add("Process", logItem.Process);
|
||||||
dbDict.Add("Message", logItem.Message);
|
dbDict.Add("Message", logItem.Message);
|
||||||
dbDict.Add("Exception", Common.ReturnValueIfNull(logItem.ExceptionValue, "").ToString());
|
dbDict.Add("Exception", Common.ReturnValueIfNull(logItem.ExceptionValue, "").ToString());
|
||||||
|
dbDict.Add("correlationid", correlationId);
|
||||||
|
dbDict.Add("callingprocess", callingProcess);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -184,6 +206,24 @@ namespace gaseous_server.Classes
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (model.CorrelationId != null)
|
||||||
|
{
|
||||||
|
if (model.CorrelationId.Length > 0)
|
||||||
|
{
|
||||||
|
dbDict.Add("correlationId", model.CorrelationId);
|
||||||
|
whereClauses.Add("CorrelationId = @correlationId");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (model.CallingProcess != null)
|
||||||
|
{
|
||||||
|
if (model.CallingProcess.Length > 0)
|
||||||
|
{
|
||||||
|
dbDict.Add("callingProcess", model.CallingProcess);
|
||||||
|
whereClauses.Add("CallingProcess = @callingProcess");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// compile WHERE clause
|
// compile WHERE clause
|
||||||
string whereClause = "";
|
string whereClause = "";
|
||||||
if (whereClauses.Count > 0)
|
if (whereClauses.Count > 0)
|
||||||
@@ -220,7 +260,9 @@ namespace gaseous_server.Classes
|
|||||||
EventType = (LogType)row["EventType"],
|
EventType = (LogType)row["EventType"],
|
||||||
Process = (string)row["Process"],
|
Process = (string)row["Process"],
|
||||||
Message = (string)row["Message"],
|
Message = (string)row["Message"],
|
||||||
ExceptionValue = (string)row["Exception"]
|
ExceptionValue = (string)row["Exception"],
|
||||||
|
CorrelationId = (string)row["CorrelationId"],
|
||||||
|
CallingProcess = (string)row["CallingProcess"]
|
||||||
};
|
};
|
||||||
|
|
||||||
logs.Add(log);
|
logs.Add(log);
|
||||||
@@ -243,6 +285,8 @@ namespace gaseous_server.Classes
|
|||||||
public DateTime EventTime { get; set; }
|
public DateTime EventTime { get; set; }
|
||||||
public LogType? EventType { get; set; }
|
public LogType? EventType { get; set; }
|
||||||
public string Process { get; set; } = "";
|
public string Process { get; set; } = "";
|
||||||
|
public string CorrelationId { get; set; } = "";
|
||||||
|
public string? CallingProcess { get; set; } = "";
|
||||||
private string _Message = "";
|
private string _Message = "";
|
||||||
public string Message
|
public string Message
|
||||||
{
|
{
|
||||||
@@ -267,6 +311,8 @@ namespace gaseous_server.Classes
|
|||||||
public DateTime? StartDateTime { get; set; }
|
public DateTime? StartDateTime { get; set; }
|
||||||
public DateTime? EndDateTime { get; set; }
|
public DateTime? EndDateTime { get; set; }
|
||||||
public string? SearchText { get; set; }
|
public string? SearchText { get; set; }
|
||||||
|
public string? CorrelationId { get; set; }
|
||||||
|
public string? CallingProcess { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -33,221 +33,228 @@ namespace gaseous_server.SignatureIngestors.XML
|
|||||||
|
|
||||||
SetStatus(i + 1, PathContents.Length, "Processing signature file: " + XMLFile);
|
SetStatus(i + 1, PathContents.Length, "Processing signature file: " + XMLFile);
|
||||||
|
|
||||||
// check xml file md5
|
if (Common.SkippableFiles.Contains(Path.GetFileName(XMLFile), StringComparer.OrdinalIgnoreCase))
|
||||||
Common.hashObject hashObject = new Common.hashObject(XMLFile);
|
|
||||||
sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5";
|
|
||||||
dbDict = new Dictionary<string, object>();
|
|
||||||
dbDict.Add("sourcemd5", hashObject.md5hash);
|
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
|
||||||
|
|
||||||
if (sigDB.Rows.Count == 0)
|
|
||||||
{
|
{
|
||||||
try
|
Logging.Log(Logging.LogType.Information, "Signature Ingestor - XML", "Skipping file: " + XMLFile);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// check xml file md5
|
||||||
|
Common.hashObject hashObject = new Common.hashObject(XMLFile);
|
||||||
|
sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5";
|
||||||
|
dbDict = new Dictionary<string, object>();
|
||||||
|
dbDict.Add("sourcemd5", hashObject.md5hash);
|
||||||
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
|
|
||||||
|
if (sigDB.Rows.Count == 0)
|
||||||
{
|
{
|
||||||
Logging.Log(Logging.LogType.Information, "Signature Ingestor - XML", "Importing file: " + XMLFile);
|
try
|
||||||
|
|
||||||
// start parsing file
|
|
||||||
gaseous_signature_parser.parser Parser = new gaseous_signature_parser.parser();
|
|
||||||
RomSignatureObject Object = Parser.ParseSignatureDAT(XMLFile, XMLType);
|
|
||||||
|
|
||||||
// store in database
|
|
||||||
string[] flipNameAndDescription = {
|
|
||||||
"MAMEArcade",
|
|
||||||
"MAMEMess"
|
|
||||||
};
|
|
||||||
|
|
||||||
// store source object
|
|
||||||
bool processGames = false;
|
|
||||||
if (Object.SourceMd5 != null)
|
|
||||||
{
|
{
|
||||||
sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5";
|
Logging.Log(Logging.LogType.Information, "Signature Ingestor - XML", "Importing file: " + XMLFile);
|
||||||
dbDict = new Dictionary<string, object>();
|
|
||||||
string sourceUriStr = "";
|
// start parsing file
|
||||||
if (Object.Url != null)
|
gaseous_signature_parser.parser Parser = new gaseous_signature_parser.parser();
|
||||||
|
RomSignatureObject Object = Parser.ParseSignatureDAT(XMLFile, XMLType);
|
||||||
|
|
||||||
|
// store in database
|
||||||
|
string[] flipNameAndDescription = {
|
||||||
|
"MAMEArcade",
|
||||||
|
"MAMEMess"
|
||||||
|
};
|
||||||
|
|
||||||
|
// store source object
|
||||||
|
bool processGames = false;
|
||||||
|
if (Object.SourceMd5 != null)
|
||||||
{
|
{
|
||||||
sourceUriStr = Object.Url.ToString();
|
sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5";
|
||||||
}
|
dbDict = new Dictionary<string, object>();
|
||||||
dbDict.Add("name", Common.ReturnValueIfNull(Object.Name, ""));
|
string sourceUriStr = "";
|
||||||
dbDict.Add("description", Common.ReturnValueIfNull(Object.Description, ""));
|
if (Object.Url != null)
|
||||||
dbDict.Add("category", Common.ReturnValueIfNull(Object.Category, ""));
|
|
||||||
dbDict.Add("version", Common.ReturnValueIfNull(Object.Version, ""));
|
|
||||||
dbDict.Add("author", Common.ReturnValueIfNull(Object.Author, ""));
|
|
||||||
dbDict.Add("email", Common.ReturnValueIfNull(Object.Email, ""));
|
|
||||||
dbDict.Add("homepage", Common.ReturnValueIfNull(Object.Homepage, ""));
|
|
||||||
dbDict.Add("uri", sourceUriStr);
|
|
||||||
dbDict.Add("sourcetype", Common.ReturnValueIfNull(Object.SourceType, ""));
|
|
||||||
dbDict.Add("sourcemd5", Object.SourceMd5);
|
|
||||||
dbDict.Add("sourcesha1", Object.SourceSHA1);
|
|
||||||
|
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
|
||||||
if (sigDB.Rows.Count == 0)
|
|
||||||
{
|
|
||||||
// entry not present, insert it
|
|
||||||
sql = "INSERT INTO Signatures_Sources (Name, Description, Category, Version, Author, Email, Homepage, Url, SourceType, SourceMD5, SourceSHA1) VALUES (@name, @description, @category, @version, @author, @email, @homepage, @uri, @sourcetype, @sourcemd5, @sourcesha1)";
|
|
||||||
|
|
||||||
db.ExecuteCMD(sql, dbDict);
|
|
||||||
|
|
||||||
processGames = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (processGames == true)
|
|
||||||
{
|
|
||||||
for (int x = 0; x < Object.Games.Count; ++x)
|
|
||||||
{
|
{
|
||||||
RomSignatureObject.Game gameObject = Object.Games[x];
|
sourceUriStr = Object.Url.ToString();
|
||||||
|
}
|
||||||
|
dbDict.Add("name", Common.ReturnValueIfNull(Object.Name, ""));
|
||||||
|
dbDict.Add("description", Common.ReturnValueIfNull(Object.Description, ""));
|
||||||
|
dbDict.Add("category", Common.ReturnValueIfNull(Object.Category, ""));
|
||||||
|
dbDict.Add("version", Common.ReturnValueIfNull(Object.Version, ""));
|
||||||
|
dbDict.Add("author", Common.ReturnValueIfNull(Object.Author, ""));
|
||||||
|
dbDict.Add("email", Common.ReturnValueIfNull(Object.Email, ""));
|
||||||
|
dbDict.Add("homepage", Common.ReturnValueIfNull(Object.Homepage, ""));
|
||||||
|
dbDict.Add("uri", sourceUriStr);
|
||||||
|
dbDict.Add("sourcetype", Common.ReturnValueIfNull(Object.SourceType, ""));
|
||||||
|
dbDict.Add("sourcemd5", Object.SourceMd5);
|
||||||
|
dbDict.Add("sourcesha1", Object.SourceSHA1);
|
||||||
|
|
||||||
// set up game dictionary
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
dbDict = new Dictionary<string, object>();
|
if (sigDB.Rows.Count == 0)
|
||||||
if (flipNameAndDescription.Contains(Object.SourceType))
|
{
|
||||||
{
|
// entry not present, insert it
|
||||||
dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Description, ""));
|
sql = "INSERT INTO Signatures_Sources (Name, Description, Category, Version, Author, Email, Homepage, Url, SourceType, SourceMD5, SourceSHA1) VALUES (@name, @description, @category, @version, @author, @email, @homepage, @uri, @sourcetype, @sourcemd5, @sourcesha1)";
|
||||||
dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Name, ""));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Name, ""));
|
|
||||||
dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Description, ""));
|
|
||||||
}
|
|
||||||
dbDict.Add("year", Common.ReturnValueIfNull(gameObject.Year, ""));
|
|
||||||
dbDict.Add("publisher", Common.ReturnValueIfNull(gameObject.Publisher, ""));
|
|
||||||
dbDict.Add("demo", (int)gameObject.Demo);
|
|
||||||
dbDict.Add("system", Common.ReturnValueIfNull(gameObject.System, ""));
|
|
||||||
dbDict.Add("platform", Common.ReturnValueIfNull(gameObject.System, ""));
|
|
||||||
dbDict.Add("systemvariant", Common.ReturnValueIfNull(gameObject.SystemVariant, ""));
|
|
||||||
dbDict.Add("video", Common.ReturnValueIfNull(gameObject.Video, ""));
|
|
||||||
dbDict.Add("country", Common.ReturnValueIfNull(gameObject.Country, ""));
|
|
||||||
dbDict.Add("language", Common.ReturnValueIfNull(gameObject.Language, ""));
|
|
||||||
dbDict.Add("copyright", Common.ReturnValueIfNull(gameObject.Copyright, ""));
|
|
||||||
|
|
||||||
// store platform
|
db.ExecuteCMD(sql, dbDict);
|
||||||
int gameSystem = 0;
|
|
||||||
if (gameObject.System != null)
|
|
||||||
{
|
|
||||||
sql = "SELECT Id FROM Signatures_Platforms WHERE Platform=@platform";
|
|
||||||
|
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
processGames = true;
|
||||||
if (sigDB.Rows.Count == 0)
|
}
|
||||||
|
|
||||||
|
if (processGames == true)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < Object.Games.Count; ++x)
|
||||||
|
{
|
||||||
|
RomSignatureObject.Game gameObject = Object.Games[x];
|
||||||
|
|
||||||
|
// set up game dictionary
|
||||||
|
dbDict = new Dictionary<string, object>();
|
||||||
|
if (flipNameAndDescription.Contains(Object.SourceType))
|
||||||
{
|
{
|
||||||
// entry not present, insert it
|
dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Description, ""));
|
||||||
sql = "INSERT INTO Signatures_Platforms (Platform) VALUES (@platform); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Name, ""));
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
|
||||||
|
|
||||||
gameSystem = Convert.ToInt32(sigDB.Rows[0][0]);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gameSystem = (int)sigDB.Rows[0][0];
|
dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Name, ""));
|
||||||
|
dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Description, ""));
|
||||||
}
|
}
|
||||||
}
|
dbDict.Add("year", Common.ReturnValueIfNull(gameObject.Year, ""));
|
||||||
dbDict.Add("systemid", gameSystem);
|
dbDict.Add("publisher", Common.ReturnValueIfNull(gameObject.Publisher, ""));
|
||||||
|
dbDict.Add("demo", (int)gameObject.Demo);
|
||||||
|
dbDict.Add("system", Common.ReturnValueIfNull(gameObject.System, ""));
|
||||||
|
dbDict.Add("platform", Common.ReturnValueIfNull(gameObject.System, ""));
|
||||||
|
dbDict.Add("systemvariant", Common.ReturnValueIfNull(gameObject.SystemVariant, ""));
|
||||||
|
dbDict.Add("video", Common.ReturnValueIfNull(gameObject.Video, ""));
|
||||||
|
dbDict.Add("country", Common.ReturnValueIfNull(gameObject.Country, ""));
|
||||||
|
dbDict.Add("language", Common.ReturnValueIfNull(gameObject.Language, ""));
|
||||||
|
dbDict.Add("copyright", Common.ReturnValueIfNull(gameObject.Copyright, ""));
|
||||||
|
|
||||||
// store publisher
|
// store platform
|
||||||
int gamePublisher = 0;
|
int gameSystem = 0;
|
||||||
if (gameObject.Publisher != null)
|
if (gameObject.System != null)
|
||||||
{
|
|
||||||
sql = "SELECT * FROM Signatures_Publishers WHERE Publisher=@publisher";
|
|
||||||
|
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
|
||||||
if (sigDB.Rows.Count == 0)
|
|
||||||
{
|
{
|
||||||
// entry not present, insert it
|
sql = "SELECT Id FROM Signatures_Platforms WHERE Platform=@platform";
|
||||||
sql = "INSERT INTO Signatures_Publishers (Publisher) VALUES (@publisher); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
|
||||||
gamePublisher = Convert.ToInt32(sigDB.Rows[0][0]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gamePublisher = (int)sigDB.Rows[0][0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dbDict.Add("publisherid", gamePublisher);
|
|
||||||
|
|
||||||
// store game
|
|
||||||
int gameId = 0;
|
|
||||||
sql = "SELECT * FROM Signatures_Games WHERE Name=@name AND Year=@year AND Publisherid=@publisher AND Systemid=@systemid AND Country=@country AND Language=@language";
|
|
||||||
|
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
|
||||||
if (sigDB.Rows.Count == 0)
|
|
||||||
{
|
|
||||||
// entry not present, insert it
|
|
||||||
sql = "INSERT INTO Signatures_Games " +
|
|
||||||
"(Name, Description, Year, PublisherId, Demo, SystemId, SystemVariant, Video, Country, Language, Copyright) VALUES " +
|
|
||||||
"(@name, @description, @year, @publisherid, @demo, @systemid, @systemvariant, @video, @country, @language, @copyright); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
|
||||||
|
|
||||||
gameId = Convert.ToInt32(sigDB.Rows[0][0]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gameId = (int)sigDB.Rows[0][0];
|
|
||||||
}
|
|
||||||
|
|
||||||
// store rom
|
|
||||||
foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms)
|
|
||||||
{
|
|
||||||
if (romObject.Md5 != null || romObject.Sha1 != null)
|
|
||||||
{
|
|
||||||
int romId = 0;
|
|
||||||
sql = "SELECT * FROM Signatures_Roms WHERE GameId=@gameid AND MD5=@md5";
|
|
||||||
dbDict = new Dictionary<string, object>();
|
|
||||||
dbDict.Add("gameid", gameId);
|
|
||||||
dbDict.Add("name", Common.ReturnValueIfNull(romObject.Name, ""));
|
|
||||||
dbDict.Add("size", Common.ReturnValueIfNull(romObject.Size, ""));
|
|
||||||
dbDict.Add("crc", Common.ReturnValueIfNull(romObject.Crc, "").ToString().ToLower());
|
|
||||||
dbDict.Add("md5", Common.ReturnValueIfNull(romObject.Md5, "").ToString().ToLower());
|
|
||||||
dbDict.Add("sha1", Common.ReturnValueIfNull(romObject.Sha1, "").ToString().ToLower());
|
|
||||||
dbDict.Add("developmentstatus", Common.ReturnValueIfNull(romObject.DevelopmentStatus, ""));
|
|
||||||
|
|
||||||
if (romObject.Attributes != null)
|
|
||||||
{
|
|
||||||
if (romObject.Attributes.Count > 0)
|
|
||||||
{
|
|
||||||
dbDict.Add("attributes", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.Attributes));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dbDict.Add("attributes", "[ ]");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dbDict.Add("attributes", "[ ]");
|
|
||||||
}
|
|
||||||
dbDict.Add("romtype", (int)romObject.RomType);
|
|
||||||
dbDict.Add("romtypemedia", Common.ReturnValueIfNull(romObject.RomTypeMedia, ""));
|
|
||||||
dbDict.Add("medialabel", Common.ReturnValueIfNull(romObject.MediaLabel, ""));
|
|
||||||
dbDict.Add("metadatasource", romObject.SignatureSource);
|
|
||||||
dbDict.Add("ingestorversion", 2);
|
|
||||||
|
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
if (sigDB.Rows.Count == 0)
|
if (sigDB.Rows.Count == 0)
|
||||||
{
|
{
|
||||||
// entry not present, insert it
|
// entry not present, insert it
|
||||||
sql = "INSERT INTO Signatures_Roms (GameId, Name, Size, CRC, MD5, SHA1, DevelopmentStatus, Attributes, RomType, RomTypeMedia, MediaLabel, MetadataSource, IngestorVersion) VALUES (@gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @attributes, @romtype, @romtypemedia, @medialabel, @metadatasource, @ingestorversion); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
sql = "INSERT INTO Signatures_Platforms (Platform) VALUES (@platform); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
||||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
|
|
||||||
|
gameSystem = Convert.ToInt32(sigDB.Rows[0][0]);
|
||||||
romId = Convert.ToInt32(sigDB.Rows[0][0]);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
romId = (int)sigDB.Rows[0][0];
|
gameSystem = (int)sigDB.Rows[0][0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dbDict.Add("systemid", gameSystem);
|
||||||
|
|
||||||
|
// store publisher
|
||||||
|
int gamePublisher = 0;
|
||||||
|
if (gameObject.Publisher != null)
|
||||||
|
{
|
||||||
|
sql = "SELECT * FROM Signatures_Publishers WHERE Publisher=@publisher";
|
||||||
|
|
||||||
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
|
if (sigDB.Rows.Count == 0)
|
||||||
|
{
|
||||||
|
// entry not present, insert it
|
||||||
|
sql = "INSERT INTO Signatures_Publishers (Publisher) VALUES (@publisher); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
||||||
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
|
gamePublisher = Convert.ToInt32(sigDB.Rows[0][0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gamePublisher = (int)sigDB.Rows[0][0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dbDict.Add("publisherid", gamePublisher);
|
||||||
|
|
||||||
|
// store game
|
||||||
|
int gameId = 0;
|
||||||
|
sql = "SELECT * FROM Signatures_Games WHERE Name=@name AND Year=@year AND Publisherid=@publisher AND Systemid=@systemid AND Country=@country AND Language=@language";
|
||||||
|
|
||||||
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
|
if (sigDB.Rows.Count == 0)
|
||||||
|
{
|
||||||
|
// entry not present, insert it
|
||||||
|
sql = "INSERT INTO Signatures_Games " +
|
||||||
|
"(Name, Description, Year, PublisherId, Demo, SystemId, SystemVariant, Video, Country, Language, Copyright) VALUES " +
|
||||||
|
"(@name, @description, @year, @publisherid, @demo, @systemid, @systemvariant, @video, @country, @language, @copyright); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
||||||
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
|
|
||||||
|
gameId = Convert.ToInt32(sigDB.Rows[0][0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gameId = (int)sigDB.Rows[0][0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// store rom
|
||||||
|
foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms)
|
||||||
|
{
|
||||||
|
if (romObject.Md5 != null || romObject.Sha1 != null)
|
||||||
|
{
|
||||||
|
int romId = 0;
|
||||||
|
sql = "SELECT * FROM Signatures_Roms WHERE GameId=@gameid AND MD5=@md5";
|
||||||
|
dbDict = new Dictionary<string, object>();
|
||||||
|
dbDict.Add("gameid", gameId);
|
||||||
|
dbDict.Add("name", Common.ReturnValueIfNull(romObject.Name, ""));
|
||||||
|
dbDict.Add("size", Common.ReturnValueIfNull(romObject.Size, ""));
|
||||||
|
dbDict.Add("crc", Common.ReturnValueIfNull(romObject.Crc, "").ToString().ToLower());
|
||||||
|
dbDict.Add("md5", Common.ReturnValueIfNull(romObject.Md5, "").ToString().ToLower());
|
||||||
|
dbDict.Add("sha1", Common.ReturnValueIfNull(romObject.Sha1, "").ToString().ToLower());
|
||||||
|
dbDict.Add("developmentstatus", Common.ReturnValueIfNull(romObject.DevelopmentStatus, ""));
|
||||||
|
|
||||||
|
if (romObject.Attributes != null)
|
||||||
|
{
|
||||||
|
if (romObject.Attributes.Count > 0)
|
||||||
|
{
|
||||||
|
dbDict.Add("attributes", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.Attributes));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dbDict.Add("attributes", "[ ]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dbDict.Add("attributes", "[ ]");
|
||||||
|
}
|
||||||
|
dbDict.Add("romtype", (int)romObject.RomType);
|
||||||
|
dbDict.Add("romtypemedia", Common.ReturnValueIfNull(romObject.RomTypeMedia, ""));
|
||||||
|
dbDict.Add("medialabel", Common.ReturnValueIfNull(romObject.MediaLabel, ""));
|
||||||
|
dbDict.Add("metadatasource", romObject.SignatureSource);
|
||||||
|
dbDict.Add("ingestorversion", 2);
|
||||||
|
|
||||||
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
|
if (sigDB.Rows.Count == 0)
|
||||||
|
{
|
||||||
|
// entry not present, insert it
|
||||||
|
sql = "INSERT INTO Signatures_Roms (GameId, Name, Size, CRC, MD5, SHA1, DevelopmentStatus, Attributes, RomType, RomTypeMedia, MediaLabel, MetadataSource, IngestorVersion) VALUES (@gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @attributes, @romtype, @romtypemedia, @medialabel, @metadatasource, @ingestorversion); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
||||||
|
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||||
|
|
||||||
|
|
||||||
|
romId = Convert.ToInt32(sigDB.Rows[0][0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
romId = (int)sigDB.Rows[0][0];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logging.Log(Logging.LogType.Warning, "Signature Ingestor - XML", "Invalid import file: " + XMLFile, ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
else
|
||||||
{
|
{
|
||||||
Logging.Log(Logging.LogType.Warning, "Signature Ingestor - XML", "Invalid import file: " + XMLFile, ex);
|
Logging.Log(Logging.LogType.Debug, "Signature Ingestor - XML", "Rejecting already imported file: " + XMLFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
Logging.Log(Logging.LogType.Debug, "Signature Ingestor - XML", "Rejecting already imported file: " + XMLFile);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ClearStatus();
|
ClearStatus();
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.ComponentModel.Design.Serialization;
|
||||||
|
using System.Data;
|
||||||
using gaseous_server.Classes;
|
using gaseous_server.Classes;
|
||||||
|
|
||||||
namespace gaseous_server
|
namespace gaseous_server
|
||||||
@@ -56,6 +58,7 @@ namespace gaseous_server
|
|||||||
private bool _AllowManualStart = true;
|
private bool _AllowManualStart = true;
|
||||||
private bool _RemoveWhenStopped = false;
|
private bool _RemoveWhenStopped = false;
|
||||||
private bool _IsBlocked = false;
|
private bool _IsBlocked = false;
|
||||||
|
private string _CorrelationId = "";
|
||||||
private List<QueueItemType> _Blocks = new List<QueueItemType>();
|
private List<QueueItemType> _Blocks = new List<QueueItemType>();
|
||||||
|
|
||||||
public QueueItemType ItemType => _ItemType;
|
public QueueItemType ItemType => _ItemType;
|
||||||
@@ -90,6 +93,7 @@ namespace gaseous_server
|
|||||||
public object? Options { get; set; } = null;
|
public object? Options { get; set; } = null;
|
||||||
public string CurrentState { get; set; } = "";
|
public string CurrentState { get; set; } = "";
|
||||||
public string CurrentStateProgress { get; set; } = "";
|
public string CurrentStateProgress { get; set; } = "";
|
||||||
|
public string CorrelationId => _CorrelationId;
|
||||||
public List<QueueItemType> Blocks => _Blocks;
|
public List<QueueItemType> Blocks => _Blocks;
|
||||||
|
|
||||||
public void Execute()
|
public void Execute()
|
||||||
@@ -104,7 +108,14 @@ namespace gaseous_server
|
|||||||
_LastResult = "";
|
_LastResult = "";
|
||||||
_LastError = null;
|
_LastError = null;
|
||||||
|
|
||||||
Logging.Log(Logging.LogType.Debug, "Timered Event", "Executing " + _ItemType);
|
// set the correlation id
|
||||||
|
Guid correlationId = Guid.NewGuid();
|
||||||
|
_CorrelationId = correlationId.ToString();
|
||||||
|
CallContext.SetData("CorrelationId", correlationId);
|
||||||
|
CallContext.SetData("CallingProcess", _ItemType.ToString());
|
||||||
|
|
||||||
|
// log the start
|
||||||
|
Logging.Log(Logging.LogType.Debug, "Timered Event", "Executing " + _ItemType + " with correlation id " + _CorrelationId);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -238,6 +249,66 @@ namespace gaseous_server
|
|||||||
{
|
{
|
||||||
_IsBlocked = BlockState;
|
_IsBlocked = BlockState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public HasErrorsItem HasErrors
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new HasErrorsItem(_CorrelationId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class HasErrorsItem
|
||||||
|
{
|
||||||
|
public HasErrorsItem(string? CorrelationId)
|
||||||
|
{
|
||||||
|
if (CorrelationId != null)
|
||||||
|
{
|
||||||
|
if (CorrelationId.Length > 0)
|
||||||
|
{
|
||||||
|
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||||
|
string sql = "SELECT EventType, COUNT(EventType) AS EventTypes FROM gaseous.ServerLogs WHERE CorrelationId = @correlationid GROUP BY EventType ORDER BY EventType DESC LIMIT 1;";
|
||||||
|
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||||
|
dbDict.Add("correlationid", CorrelationId);
|
||||||
|
|
||||||
|
DataTable data = db.ExecuteCMD(sql, dbDict);
|
||||||
|
|
||||||
|
if (data.Rows.Count == 0)
|
||||||
|
{
|
||||||
|
ErrorType = null;
|
||||||
|
ErrorCount = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Logging.LogType errorType = (Logging.LogType)data.Rows[0]["EventType"];
|
||||||
|
if (errorType != Logging.LogType.Information)
|
||||||
|
{
|
||||||
|
ErrorType = errorType;
|
||||||
|
ErrorCount = (int)(long)data.Rows[0]["EventTypes"];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ErrorType = null;
|
||||||
|
ErrorCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ErrorType = null;
|
||||||
|
ErrorCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ErrorType = null;
|
||||||
|
ErrorCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Logging.LogType? ErrorType { get; set; }
|
||||||
|
public int ErrorCount { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum QueueItemType
|
public enum QueueItemType
|
||||||
|
@@ -18,3 +18,9 @@ ADD INDEX `idx_SecondaryColumn` (`PlayerPerspectivesId` ASC) VISIBLE;
|
|||||||
|
|
||||||
ALTER TABLE `Relation_Game_Themes`
|
ALTER TABLE `Relation_Game_Themes`
|
||||||
ADD INDEX `idx_SecondaryColumn` (`ThemesId` ASC) VISIBLE;
|
ADD INDEX `idx_SecondaryColumn` (`ThemesId` ASC) VISIBLE;
|
||||||
|
|
||||||
|
ALTER TABLE `ServerLogs`
|
||||||
|
ADD COLUMN `CorrelationId` VARCHAR(45) NULL AFTER `Exception`,
|
||||||
|
ADD COLUMN `CallingProcess` VARCHAR(45) NULL AFTER `CorrelationId`,
|
||||||
|
ADD INDEX `idx_CorrelationId` (`CorrelationId` ASC) VISIBLE,
|
||||||
|
ADD INDEX `idx_CallingProcess` (`CallingProcess` ASC) VISIBLE;
|
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<script src="/api/v1.1/System/VersionFile"></script>
|
<script src="/api/v1.1/System/VersionFile"></script>
|
||||||
<link type="text/css" rel="stylesheet" dat-href="/styles/style.css" />
|
<link type="text/css" rel="stylesheet" href="/styles/style.css" dat-href="/styles/style.css" />
|
||||||
<script src="/scripts/jquery-3.6.0.min.js"></script>
|
<script src="/scripts/jquery-3.6.0.min.js"></script>
|
||||||
<script src="/scripts/moment-with-locales.min.js"></script>
|
<script src="/scripts/moment-with-locales.min.js"></script>
|
||||||
<link href="/styles/select2.min.css" rel="stylesheet" />
|
<link href="/styles/select2.min.css" rel="stylesheet" />
|
||||||
|
@@ -47,6 +47,10 @@
|
|||||||
SelectTab(selectedTab);
|
SelectTab(selectedTab);
|
||||||
|
|
||||||
function SelectTab(TabName) {
|
function SelectTab(TabName) {
|
||||||
|
if (selectedTab != TabName) {
|
||||||
|
window.location.href = '/index.html?page=settings&sub=' + TabName;
|
||||||
|
}
|
||||||
|
|
||||||
var tocs = document.getElementsByName('properties_toc_item');
|
var tocs = document.getElementsByName('properties_toc_item');
|
||||||
for (var i = 0; i < tocs.length; i++) {
|
for (var i = 0; i < tocs.length; i++) {
|
||||||
if ((tocs[i].id) == ("properties_toc_" + TabName)) {
|
if ((tocs[i].id) == ("properties_toc_" + TabName)) {
|
||||||
|
@@ -5,10 +5,7 @@
|
|||||||
<table style="width: 960px; max-width: 960px;" cellspacing="0">
|
<table style="width: 960px; max-width: 960px;" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<input type="datetime-local" id="logs_startdate" />
|
<input type="datetime-local" id="logs_startdate" style="width: 30%;" /> <input type="datetime-local" id="logs_enddate" style="width: 30%;" />
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<input type="datetime-local" id="logs_enddate" />
|
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="checkbox" id="logs_type_info"><label for="logs_type_info">Information</label>
|
<input type="checkbox" id="logs_type_info"><label for="logs_type_info">Information</label>
|
||||||
@@ -19,10 +16,17 @@
|
|||||||
<td>
|
<td>
|
||||||
<input type="checkbox" id="logs_type_critical"><label for="logs_type_critical">Critical</label>
|
<input type="checkbox" id="logs_type_critical"><label for="logs_type_critical">Critical</label>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
</tr>
|
||||||
<input type="text" id="logs_textsearch" placeholder="Search" />
|
<tr>
|
||||||
|
<td colspan="1">
|
||||||
|
<input type="text" id="logs_textsearch" placeholder="Search" style="width: 75%;" />
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td colspan="3">
|
||||||
|
<input type="text" id="logs_correlationid" placeholder="Correlation Id" style="width: 75%;" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="4" style="text-align: right;">
|
||||||
<button onclick="loadLogs();">Search</button>
|
<button onclick="loadLogs();">Search</button>
|
||||||
<button onclick="resetFilters();">Reset</button>
|
<button onclick="resetFilters();">Reset</button>
|
||||||
</td>
|
</td>
|
||||||
@@ -43,6 +47,13 @@
|
|||||||
var currentPage = 1;
|
var currentPage = 1;
|
||||||
var searchModel = {};
|
var searchModel = {};
|
||||||
|
|
||||||
|
var correlationIdParam = getQueryString('correlationid', 'string');
|
||||||
|
if (correlationIdParam) {
|
||||||
|
if (correlationIdParam.length > 0) {
|
||||||
|
document.getElementById('logs_correlationid').value = correlationIdParam;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function resetFilters() {
|
function resetFilters() {
|
||||||
document.getElementById('logs_startdate').value = '';
|
document.getElementById('logs_startdate').value = '';
|
||||||
document.getElementById('logs_enddate').value = '';
|
document.getElementById('logs_enddate').value = '';
|
||||||
@@ -50,6 +61,7 @@
|
|||||||
document.getElementById('logs_type_warning').checked = false;
|
document.getElementById('logs_type_warning').checked = false;
|
||||||
document.getElementById('logs_type_critical').checked = false;
|
document.getElementById('logs_type_critical').checked = false;
|
||||||
document.getElementById('logs_textsearch').value = '';
|
document.getElementById('logs_textsearch').value = '';
|
||||||
|
document.getElementById('logs_correlationid').value = '';
|
||||||
|
|
||||||
loadLogs();
|
loadLogs();
|
||||||
}
|
}
|
||||||
@@ -81,6 +93,9 @@
|
|||||||
var searchText = null;
|
var searchText = null;
|
||||||
var searchTextObj = document.getElementById('logs_textsearch');
|
var searchTextObj = document.getElementById('logs_textsearch');
|
||||||
if (searchTextObj.value != null) { searchText = searchTextObj.value; }
|
if (searchTextObj.value != null) { searchText = searchTextObj.value; }
|
||||||
|
var correlationId = null;
|
||||||
|
var correlationIdTextObj = document.getElementById('logs_correlationid');
|
||||||
|
if (correlationIdTextObj.value != null) { correlationId = correlationIdTextObj.value; }
|
||||||
|
|
||||||
model = {
|
model = {
|
||||||
"StartIndex": StartIndex,
|
"StartIndex": StartIndex,
|
||||||
@@ -89,7 +104,8 @@
|
|||||||
"Status": statusList,
|
"Status": statusList,
|
||||||
"StartDateTime": startDate,
|
"StartDateTime": startDate,
|
||||||
"EndDateTime": endDate,
|
"EndDateTime": endDate,
|
||||||
"SearchText": searchText
|
"SearchText": searchText,
|
||||||
|
"CorrelationId": correlationId
|
||||||
}
|
}
|
||||||
searchModel = model;
|
searchModel = model;
|
||||||
}
|
}
|
||||||
@@ -131,7 +147,7 @@
|
|||||||
result[i].message
|
result[i].message
|
||||||
];
|
];
|
||||||
|
|
||||||
newTable.appendChild(createTableRow(false, newRow, 'romrow logs_table_row_' + result[i].eventType, 'romcell logs_table_cell'));
|
newTable.appendChild(createTableRow(false, newRow, 'logs_table_row_' + result[i].eventType, 'romcell logs_table_cell'));
|
||||||
|
|
||||||
if (result[i].exceptionValue) {
|
if (result[i].exceptionValue) {
|
||||||
var exceptionString = "<h3>Exception</h3><pre class='logs_table_exception' style='width: 795px; word-wrap: break-word; overflow-wrap: break-word; overflow-y: scroll;'>" + syntaxHighlight(JSON.stringify(result[i].exceptionValue, null, 2)).replace(/\\n/g, "<br /> ") + "</pre>";
|
var exceptionString = "<h3>Exception</h3><pre class='logs_table_exception' style='width: 795px; word-wrap: break-word; overflow-wrap: break-word; overflow-y: scroll;'>" + syntaxHighlight(JSON.stringify(result[i].exceptionValue, null, 2)).replace(/\\n/g, "<br /> ") + "</pre>";
|
||||||
|
@@ -31,66 +31,84 @@
|
|||||||
var newTable = document.createElement('table');
|
var newTable = document.createElement('table');
|
||||||
newTable.className = 'romtable';
|
newTable.className = 'romtable';
|
||||||
newTable.setAttribute('cellspacing', 0);
|
newTable.setAttribute('cellspacing', 0);
|
||||||
newTable.appendChild(createTableRow(true, ['Task', 'Status', 'Interval', 'Last Run Start', 'Last Run Duration (seconds)', 'Next Run Start', '']));
|
newTable.appendChild(createTableRow(true, ['Task', 'Status', 'Interval<br/>(minutes)', 'Last Run Duration<br />(hh:mm:ss)', '', 'Last Run Start', 'Next Run Start', '']));
|
||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
for (var i = 0; i < result.length; i++) {
|
for (var i = 0; i < result.length; i++) {
|
||||||
var itemTypeName = GetTaskFriendlyName(result[i].itemType, result[i].options);
|
if (result[i].itemState != "Disabled") {
|
||||||
|
var itemTypeName = GetTaskFriendlyName(result[i].itemType, result[i].options);
|
||||||
|
|
||||||
var itemStateName;
|
var itemStateName;
|
||||||
var itemLastStart;
|
var itemLastStart;
|
||||||
if (result[i].isBlocked == false) {
|
|
||||||
switch (result[i].itemState) {
|
var hasError = "";
|
||||||
case 'NeverStarted':
|
if (result[i].hasErrors) {
|
||||||
itemStateName = "Never started";
|
if (result[i].hasErrors.errorType != null) {
|
||||||
itemLastStart = '-';
|
hasError = " (" + result[i].hasErrors.errorType + ")";
|
||||||
break;
|
}
|
||||||
case 'Stopped':
|
|
||||||
itemStateName = "Stopped";
|
|
||||||
itemLastStart = moment(result[i].lastRunTime).format("YYYY-MM-DD h:mm:ss a");
|
|
||||||
break;
|
|
||||||
case 'Running':
|
|
||||||
var progressPercent = "";
|
|
||||||
if (result[i].currentStateProgress) {
|
|
||||||
progressPercent = " (" + result[i].currentStateProgress + ")";
|
|
||||||
}
|
|
||||||
itemStateName = "Running" + progressPercent;
|
|
||||||
itemLastStart = moment(result[i].lastRunTime).format("YYYY-MM-DD h:mm:ss a");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
itemStateName = "Unknown status";
|
|
||||||
itemLastStart = moment(result[i].lastRunTime).format("YYYY-MM-DD h:mm:ss a");
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
itemStateName = "Blocked";
|
|
||||||
itemLastStart = moment(result[i].lastRunTime).fromNow();
|
|
||||||
}
|
|
||||||
|
|
||||||
var itemInterval = result[i].interval;
|
if (result[i].isBlocked == false) {
|
||||||
var nextRunTime = moment(result[i].nextRunTime).format("YYYY-MM-DD h:mm:ss a");
|
switch (result[i].itemState) {
|
||||||
var startButton = '';
|
case 'NeverStarted':
|
||||||
if (userProfile.roles.includes("Admin")) {
|
itemStateName = "Never started";
|
||||||
if (result[i].allowManualStart == true && result[i].itemState != "Running") {
|
itemLastStart = '-';
|
||||||
startButton = "<span id='startProcess' class='romstart' onclick='StartProcess(\"" + result[i].itemType + "\");'>Start</span>";
|
break;
|
||||||
|
case 'Stopped':
|
||||||
|
itemStateName = "Stopped";
|
||||||
|
itemLastStart = moment(result[i].lastRunTime).format("YYYY-MM-DD h:mm:ss a");
|
||||||
|
break;
|
||||||
|
case 'Running':
|
||||||
|
var progressPercent = "";
|
||||||
|
if (result[i].currentStateProgress) {
|
||||||
|
progressPercent = " (" + result[i].currentStateProgress + ")";
|
||||||
|
}
|
||||||
|
itemStateName = "Running" + progressPercent;
|
||||||
|
itemLastStart = moment(result[i].lastRunTime).format("YYYY-MM-DD h:mm:ss a");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
itemStateName = "Unknown status";
|
||||||
|
itemLastStart = moment(result[i].lastRunTime).format("YYYY-MM-DD h:mm:ss a");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
itemStateName = "Blocked";
|
||||||
|
itemLastStart = moment(result[i].lastRunTime).format("YYYY-MM-DD h:mm:ss a");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (result[i].allowManualStart == false && result[i].removeWhenStopped == true) {
|
itemStateName += hasError;
|
||||||
itemInterval = '';
|
|
||||||
nextRunTime = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
var newRow = [
|
var itemInterval = result[i].interval;
|
||||||
itemTypeName,
|
var nextRunTime = moment(result[i].nextRunTime).format("YYYY-MM-DD h:mm:ss a");
|
||||||
itemStateName,
|
var startButton = '';
|
||||||
itemInterval,
|
if (userProfile.roles.includes("Admin")) {
|
||||||
itemLastStart,
|
if (result[i].allowManualStart == true && result[i].itemState != "Running") {
|
||||||
result[i].lastRunDuration,
|
startButton = "<span id='startProcess' class='romstart' onclick='StartProcess(\"" + result[i].itemType + "\");'>Start</span>";
|
||||||
nextRunTime,
|
}
|
||||||
startButton
|
}
|
||||||
];
|
|
||||||
newTable.appendChild(createTableRow(false, newRow, 'romrow', 'romcell'));
|
if (result[i].allowManualStart == false && result[i].removeWhenStopped == true) {
|
||||||
|
itemInterval = '';
|
||||||
|
nextRunTime = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
var logLink = '';
|
||||||
|
if (result[i].correlationId) {
|
||||||
|
logLink = '<a href="/index.html?page=settings&sub=logs&correlationid=' + result[i].correlationId + '" class="romlink">View Log</a>';
|
||||||
|
}
|
||||||
|
|
||||||
|
var newRow = [
|
||||||
|
itemTypeName,
|
||||||
|
itemStateName,
|
||||||
|
itemInterval,
|
||||||
|
new Date(result[i].lastRunDuration * 1000).toISOString().slice(11, 19),
|
||||||
|
logLink,
|
||||||
|
itemLastStart,
|
||||||
|
nextRunTime,
|
||||||
|
startButton
|
||||||
|
];
|
||||||
|
newTable.appendChild(createTableRow(false, newRow, 'romrow', 'romcell'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1060,22 +1060,38 @@ button:disabled {
|
|||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
|
|
||||||
.logs_table_row_Information:hover {
|
.logs_table_row_Information:nth-child(even) {
|
||||||
background: rgba(42, 41, 150, 0.3);
|
background: rgba(42, 41, 150, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
.logs_table_row_Warning:hover {
|
.logs_table_row_Information:nth-child(odd) {
|
||||||
|
background: rgba(10, 9, 83, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.logs_table_row_Warning:nth-child(even) {
|
||||||
background: rgba(139, 150, 41, 0.3);
|
background: rgba(139, 150, 41, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
.logs_table_row_Critical:hover {
|
.logs_table_row_Warning:nth-child(odd) {
|
||||||
|
background: rgba(49, 53, 14, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.logs_table_row_Critical:nth-child(even) {
|
||||||
background: rgba(150, 41, 41, 0.3);
|
background: rgba(150, 41, 41, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
.logs_table_row_Debug:hover {
|
.logs_table_row_Critical:nth-child(odd) {
|
||||||
|
background: rgba(58, 16, 16, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.logs_table_row_Debug:nth-child(even) {
|
||||||
background: rgba(150, 41, 135, 0.3);
|
background: rgba(150, 41, 135, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.logs_table_row_Debug:nth-child(odd) {
|
||||||
|
background: rgba(68, 18, 61, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
.logs_table_exception {
|
.logs_table_exception {
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
|
Reference in New Issue
Block a user