fix: skip dud files on signature import

This commit is contained in:
Michael Green
2023-07-05 22:41:22 +10:00
parent 97e8ffa386
commit 6f954f8d4a

View File

@@ -36,300 +36,316 @@ namespace gaseous_server.SignatureIngestors.TOSEC
{ {
string tosecXMLFile = tosecPathContents[i]; string tosecXMLFile = tosecPathContents[i];
// check tosec file md5 string[] SkippableFiles = {
Common.hashObject hashObject = new Common.hashObject(tosecXMLFile); ".DS_STORE",
sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5"; "desktop.ini"
dbDict = new Dictionary<string, object>(); };
dbDict.Add("sourcemd5", hashObject.md5hash);
sigDB = db.ExecuteCMD(sql, dbDict);
if (sigDB.Rows.Count == 0) if (!SkippableFiles.Contains<string>(Path.GetFileName(tosecXMLFile), StringComparer.OrdinalIgnoreCase))
{ {
Logging.Log(Logging.LogType.Information, "Signature Ingestor - TOSEC", "Importing file: " + tosecXMLFile);
// start parsing file // check tosec file md5
TosecParser tosecParser = new TosecParser(); Common.hashObject hashObject = new Common.hashObject(tosecXMLFile);
RomSignatureObject tosecObject = tosecParser.Parse(tosecXMLFile); sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5";
dbDict = new Dictionary<string, object>();
dbDict.Add("sourcemd5", hashObject.md5hash);
sigDB = db.ExecuteCMD(sql, dbDict);
// store in database if (sigDB.Rows.Count == 0)
// store source object
bool processGames = false;
if (tosecObject.SourceMd5 != null)
{ {
sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5"; try
dbDict = new Dictionary<string, object>();
dbDict.Add("name", Common.ReturnValueIfNull(tosecObject.Name, ""));
dbDict.Add("description", Common.ReturnValueIfNull(tosecObject.Description, ""));
dbDict.Add("category", Common.ReturnValueIfNull(tosecObject.Category, ""));
dbDict.Add("version", Common.ReturnValueIfNull(tosecObject.Version, ""));
dbDict.Add("author", Common.ReturnValueIfNull(tosecObject.Author, ""));
dbDict.Add("email", Common.ReturnValueIfNull(tosecObject.Email, ""));
dbDict.Add("homepage", Common.ReturnValueIfNull(tosecObject.Homepage, ""));
dbDict.Add("uri", Common.ReturnValueIfNull(tosecObject.Url, ""));
dbDict.Add("sourcetype", Common.ReturnValueIfNull(tosecObject.SourceType, ""));
dbDict.Add("sourcemd5", tosecObject.SourceMd5);
dbDict.Add("sourcesha1", tosecObject.SourceSHA1);
sigDB = db.ExecuteCMD(sql, dbDict);
if (sigDB.Rows.Count == 0)
{ {
// entry not present, insert it Logging.Log(Logging.LogType.Information, "Signature Ingestor - TOSEC", "Importing file: " + tosecXMLFile);
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); // start parsing file
TosecParser tosecParser = new TosecParser();
RomSignatureObject tosecObject = tosecParser.Parse(tosecXMLFile);
processGames = true; // store in database
}
if (processGames == true) // store source object
{ bool processGames = false;
for (int x = 0; x < tosecObject.Games.Count; ++x) if (tosecObject.SourceMd5 != null)
{ {
RomSignatureObject.Game gameObject = tosecObject.Games[x]; sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5";
// set up game dictionary
dbDict = new Dictionary<string, object>(); dbDict = new Dictionary<string, object>();
dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Name, "")); dbDict.Add("name", Common.ReturnValueIfNull(tosecObject.Name, ""));
dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Description, "")); dbDict.Add("description", Common.ReturnValueIfNull(tosecObject.Description, ""));
dbDict.Add("year", Common.ReturnValueIfNull(gameObject.Year, "")); dbDict.Add("category", Common.ReturnValueIfNull(tosecObject.Category, ""));
dbDict.Add("publisher", Common.ReturnValueIfNull(gameObject.Publisher, "")); dbDict.Add("version", Common.ReturnValueIfNull(tosecObject.Version, ""));
dbDict.Add("demo", (int)gameObject.Demo); dbDict.Add("author", Common.ReturnValueIfNull(tosecObject.Author, ""));
dbDict.Add("system", Common.ReturnValueIfNull(gameObject.System, "")); dbDict.Add("email", Common.ReturnValueIfNull(tosecObject.Email, ""));
dbDict.Add("platform", Common.ReturnValueIfNull(gameObject.System, "")); dbDict.Add("homepage", Common.ReturnValueIfNull(tosecObject.Homepage, ""));
dbDict.Add("systemvariant", Common.ReturnValueIfNull(gameObject.SystemVariant, "")); dbDict.Add("uri", Common.ReturnValueIfNull(tosecObject.Url, ""));
dbDict.Add("video", Common.ReturnValueIfNull(gameObject.Video, "")); dbDict.Add("sourcetype", Common.ReturnValueIfNull(tosecObject.SourceType, ""));
dbDict.Add("country", Common.ReturnValueIfNull(gameObject.Country, "")); dbDict.Add("sourcemd5", tosecObject.SourceMd5);
dbDict.Add("language", Common.ReturnValueIfNull(gameObject.Language, "")); dbDict.Add("sourcesha1", tosecObject.SourceSHA1);
dbDict.Add("copyright", Common.ReturnValueIfNull(gameObject.Copyright, ""));
// store platform sigDB = db.ExecuteCMD(sql, dbDict);
int gameSystem = 0; if (sigDB.Rows.Count == 0)
if (gameObject.System != null)
{ {
bool foundPlatform = false; // entry not present, insert it
string platformName = (string)dbDict["platform"]; 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)";
foreach (Dictionary<string, object> ImportedPlatform in ImportedPlatforms)
{
string importedPlatformName = (string)ImportedPlatform["Name"];
if (importedPlatformName == platformName)
{
foundPlatform = true;
gameSystem = (int)ImportedPlatform["Id"];
break;
}
}
if (foundPlatform == false) db.ExecuteCMD(sql, dbDict);
{
sql = "SELECT Id FROM Signatures_Platforms WHERE Platform=@platform";
sigDB = db.ExecuteCMD(sql, dbDict); processGames = true;
if (sigDB.Rows.Count == 0)
{
// entry not present, insert it
sql = "INSERT INTO Signatures_Platforms (Platform) VALUES (@platform); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
sigDB = db.ExecuteCMD(sql, dbDict);
gameSystem = Convert.ToInt32(sigDB.Rows[0][0]);
}
else
{
gameSystem = (int)sigDB.Rows[0][0];
}
Dictionary<string, object> platformDetails = new Dictionary<string, object>();
platformDetails.Add("Id", gameSystem);
platformDetails.Add("Name", dbDict["platform"]);
ImportedPlatforms.Add(platformDetails);
}
}
dbDict.Add("systemid", gameSystem);
// store publisher
int gamePublisher = 0;
if (gameObject.Publisher != null)
{
bool foundPublisher = false;
string publisherName = (string)dbDict["publisher"];
foreach (Dictionary<string, object> ImportedPublisher in ImportedPublishers)
{
string importedPublisherName = (string)ImportedPublisher["Name"];
if (importedPublisherName == publisherName)
{
foundPublisher = true;
gamePublisher = (int)ImportedPublisher["Id"];
break;
}
}
if (foundPublisher == false)
{
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];
}
Dictionary<string, object> publisherDetails = new Dictionary<string, object>();
publisherDetails.Add("Id", gamePublisher);
publisherDetails.Add("Name", dbDict["publisher"]);
ImportedPublishers.Add(publisherDetails);
}
}
dbDict.Add("publisherid", gamePublisher);
// store game
int gameId = 0;
bool foundGame = false;
foreach (Dictionary<string, object> ImportedGame in ImportedGames)
{
if (((string)ImportedGame["Name"] == (string)dbDict["name"]) &&
((string)ImportedGame["Year"] == (string)dbDict["year"]) &&
((int)ImportedGame["PublisherId"] == (int)dbDict["publisherid"]) &&
((int)ImportedGame["SystemId"] == (int)dbDict["systemid"]) &&
((string)ImportedGame["Country"] == (string)dbDict["country"]) &&
((string)ImportedGame["Language"] == (string)dbDict["language"]))
{
foundGame = true;
gameId = (int)ImportedGame["Id"];
break;
}
} }
if (foundGame == false) if (processGames == true)
{ {
sql = "SELECT * FROM Signatures_Games WHERE Name=@name AND Year=@year AND Publisherid=@publisher AND Systemid=@systemid AND Country=@country AND Language=@language"; for (int x = 0; x < tosecObject.Games.Count; ++x)
sigDB = db.ExecuteCMD(sql, dbDict);
if (sigDB.Rows.Count == 0)
{ {
// entry not present, insert it RomSignatureObject.Game gameObject = tosecObject.Games[x];
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]); // set up game dictionary
}
else
{
gameId = (int)sigDB.Rows[0][0];
}
Dictionary<string, object> gameDetails = new Dictionary<string, object>();
gameDetails.Add("Id", gameId);
gameDetails.Add("Name", dbDict["name"]);
gameDetails.Add("Year", dbDict["year"]);
gameDetails.Add("PublisherId", dbDict["publisherid"]);
gameDetails.Add("SystemId", dbDict["systemid"]);
gameDetails.Add("Country", dbDict["country"]);
gameDetails.Add("Language", dbDict["language"]);
ImportedGames.Add(gameDetails);
}
// store rom
int transactionCounterMax = 1000;
List<SQLTransactionItem> sQLTransactionItems = new List<SQLTransactionItem>();
foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms)
{
if (romObject.Md5 != null)
{
int romId = 0;
sql = "SELECT * FROM Signatures_Roms WHERE GameId=@gameid AND MD5=@md5";
dbDict = new Dictionary<string, object>(); dbDict = new Dictionary<string, object>();
dbDict.Add("gameid", gameId); dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Name, ""));
dbDict.Add("name", Common.ReturnValueIfNull(romObject.Name, "")); dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Description, ""));
dbDict.Add("size", Common.ReturnValueIfNull(romObject.Size, "")); dbDict.Add("year", Common.ReturnValueIfNull(gameObject.Year, ""));
dbDict.Add("crc", Common.ReturnValueIfNull(romObject.Crc, "")); dbDict.Add("publisher", Common.ReturnValueIfNull(gameObject.Publisher, ""));
dbDict.Add("md5", romObject.Md5); dbDict.Add("demo", (int)gameObject.Demo);
dbDict.Add("sha1", Common.ReturnValueIfNull(romObject.Sha1, "")); dbDict.Add("system", Common.ReturnValueIfNull(gameObject.System, ""));
dbDict.Add("developmentstatus", Common.ReturnValueIfNull(romObject.DevelopmentStatus, "")); 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, ""));
if (romObject.flags != null) // store platform
int gameSystem = 0;
if (gameObject.System != null)
{ {
if (romObject.flags.Count > 0) bool foundPlatform = false;
string platformName = (string)dbDict["platform"];
foreach (Dictionary<string, object> ImportedPlatform in ImportedPlatforms)
{ {
dbDict.Add("flags", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.flags)); string importedPlatformName = (string)ImportedPlatform["Name"];
if (importedPlatformName == platformName)
{
foundPlatform = true;
gameSystem = (int)ImportedPlatform["Id"];
break;
}
} }
else
if (foundPlatform == false)
{ {
dbDict.Add("flags", "[ ]"); sql = "SELECT Id FROM Signatures_Platforms WHERE Platform=@platform";
sigDB = db.ExecuteCMD(sql, dbDict);
if (sigDB.Rows.Count == 0)
{
// entry not present, insert it
sql = "INSERT INTO Signatures_Platforms (Platform) VALUES (@platform); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
sigDB = db.ExecuteCMD(sql, dbDict);
gameSystem = Convert.ToInt32(sigDB.Rows[0][0]);
}
else
{
gameSystem = (int)sigDB.Rows[0][0];
}
Dictionary<string, object> platformDetails = new Dictionary<string, object>();
platformDetails.Add("Id", gameSystem);
platformDetails.Add("Name", dbDict["platform"]);
ImportedPlatforms.Add(platformDetails);
} }
} }
else dbDict.Add("systemid", gameSystem);
{
dbDict.Add("flags", "[ ]");
}
dbDict.Add("romtype", (int)romObject.RomType);
dbDict.Add("romtypemedia", Common.ReturnValueIfNull(romObject.RomTypeMedia, ""));
dbDict.Add("medialabel", Common.ReturnValueIfNull(romObject.MediaLabel, ""));
dbDict.Add("metadatasource", Classes.Roms.GameRomItem.SourceType.TOSEC);
bool ImportedRomFound = false; // store publisher
foreach (Dictionary<string, object> ImportedRom in ImportedRoms) int gamePublisher = 0;
if (gameObject.Publisher != null)
{ {
if (((int)ImportedRom["gameid"] == gameId) && ((string)ImportedRom["md5"] == romObject.Md5)) bool foundPublisher = false;
string publisherName = (string)dbDict["publisher"];
foreach (Dictionary<string, object> ImportedPublisher in ImportedPublishers)
{ {
ImportedRomFound = true; string importedPublisherName = (string)ImportedPublisher["Name"];
if (importedPublisherName == publisherName)
{
foundPublisher = true;
gamePublisher = (int)ImportedPublisher["Id"];
break;
}
}
if (foundPublisher == false)
{
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];
}
Dictionary<string, object> publisherDetails = new Dictionary<string, object>();
publisherDetails.Add("Id", gamePublisher);
publisherDetails.Add("Name", dbDict["publisher"]);
ImportedPublishers.Add(publisherDetails);
}
}
dbDict.Add("publisherid", gamePublisher);
// store game
int gameId = 0;
bool foundGame = false;
foreach (Dictionary<string, object> ImportedGame in ImportedGames)
{
if (((string)ImportedGame["Name"] == (string)dbDict["name"]) &&
((string)ImportedGame["Year"] == (string)dbDict["year"]) &&
((int)ImportedGame["PublisherId"] == (int)dbDict["publisherid"]) &&
((int)ImportedGame["SystemId"] == (int)dbDict["systemid"]) &&
((string)ImportedGame["Country"] == (string)dbDict["country"]) &&
((string)ImportedGame["Language"] == (string)dbDict["language"]))
{
foundGame = true;
gameId = (int)ImportedGame["Id"];
break; break;
} }
} }
if (ImportedRomFound == false) if (foundGame == false)
{ {
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); sigDB = db.ExecuteCMD(sql, dbDict);
if (sigDB.Rows.Count == 0) if (sigDB.Rows.Count == 0)
{ {
if (sQLTransactionItems.Count == transactionCounterMax)
{
db.ExecuteTransactionCMD(sQLTransactionItems);
}
// entry not present, insert it // entry not present, insert it
sql = "INSERT INTO Signatures_Roms (GameId, Name, Size, CRC, MD5, SHA1, DevelopmentStatus, Flags, RomType, RomTypeMedia, MediaLabel, MetadataSource) VALUES (@gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @flags, @romtype, @romtypemedia, @medialabel, @metadatasource); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; 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);
SQLTransactionItem sQLTransactionItem = new SQLTransactionItem( gameId = Convert.ToInt32(sigDB.Rows[0][0]);
SQLCommand: sql,
Parameters: dbDict
);
sQLTransactionItems.Add(sQLTransactionItem);
} }
else else
{ {
romId = (int)sigDB.Rows[0][0]; gameId = (int)sigDB.Rows[0][0];
} }
Dictionary<string, object> romDetails = new Dictionary<string, object>(); Dictionary<string, object> gameDetails = new Dictionary<string, object>();
romDetails.Add("gameid", dbDict["gameid"]); gameDetails.Add("Id", gameId);
romDetails.Add("md5", dbDict["md5"]); gameDetails.Add("Name", dbDict["name"]);
romDetails.Add("name", dbDict["name"]); gameDetails.Add("Year", dbDict["year"]);
ImportedRoms.Add(romDetails); gameDetails.Add("PublisherId", dbDict["publisherid"]);
gameDetails.Add("SystemId", dbDict["systemid"]);
gameDetails.Add("Country", dbDict["country"]);
gameDetails.Add("Language", dbDict["language"]);
ImportedGames.Add(gameDetails);
}
// store rom
int transactionCounterMax = 1000;
List<SQLTransactionItem> sQLTransactionItems = new List<SQLTransactionItem>();
foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms)
{
if (romObject.Md5 != 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, ""));
dbDict.Add("md5", romObject.Md5);
dbDict.Add("sha1", Common.ReturnValueIfNull(romObject.Sha1, ""));
dbDict.Add("developmentstatus", Common.ReturnValueIfNull(romObject.DevelopmentStatus, ""));
if (romObject.flags != null)
{
if (romObject.flags.Count > 0)
{
dbDict.Add("flags", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.flags));
}
else
{
dbDict.Add("flags", "[ ]");
}
}
else
{
dbDict.Add("flags", "[ ]");
}
dbDict.Add("romtype", (int)romObject.RomType);
dbDict.Add("romtypemedia", Common.ReturnValueIfNull(romObject.RomTypeMedia, ""));
dbDict.Add("medialabel", Common.ReturnValueIfNull(romObject.MediaLabel, ""));
dbDict.Add("metadatasource", Classes.Roms.GameRomItem.SourceType.TOSEC);
bool ImportedRomFound = false;
foreach (Dictionary<string, object> ImportedRom in ImportedRoms)
{
if (((int)ImportedRom["gameid"] == gameId) && ((string)ImportedRom["md5"] == romObject.Md5))
{
ImportedRomFound = true;
break;
}
}
if (ImportedRomFound == false)
{
sigDB = db.ExecuteCMD(sql, dbDict);
if (sigDB.Rows.Count == 0)
{
if (sQLTransactionItems.Count == transactionCounterMax)
{
db.ExecuteTransactionCMD(sQLTransactionItems);
}
// entry not present, insert it
sql = "INSERT INTO Signatures_Roms (GameId, Name, Size, CRC, MD5, SHA1, DevelopmentStatus, Flags, RomType, RomTypeMedia, MediaLabel, MetadataSource) VALUES (@gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @flags, @romtype, @romtypemedia, @medialabel, @metadatasource); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
SQLTransactionItem sQLTransactionItem = new SQLTransactionItem(
SQLCommand: sql,
Parameters: dbDict
);
sQLTransactionItems.Add(sQLTransactionItem);
}
else
{
romId = (int)sigDB.Rows[0][0];
}
Dictionary<string, object> romDetails = new Dictionary<string, object>();
romDetails.Add("gameid", dbDict["gameid"]);
romDetails.Add("md5", dbDict["md5"]);
romDetails.Add("name", dbDict["name"]);
ImportedRoms.Add(romDetails);
}
}
}
if (sQLTransactionItems.Count > 0)
{
db.ExecuteTransactionCMD(sQLTransactionItems);
} }
} }
} }
if (sQLTransactionItems.Count > 0)
{
db.ExecuteTransactionCMD(sQLTransactionItems);
}
} }
} }
catch (Exception ex)
{
Logging.Log(Logging.LogType.Warning, "Signature Ingestor - TOSEC", "Failed to import file " + tosecXMLFile, ex);
}
}
else
{
Logging.Log(Logging.LogType.Debug, "Signature Ingestor - TOSEC", "Rejecting already imported file: " + tosecXMLFile);
} }
}
else
{
Logging.Log(Logging.LogType.Debug, "Signature Ingestor - TOSEC", "Rejecting already imported file: " + tosecXMLFile);
} }
} }
} }