refactor: performance improvements in signature import

This commit is contained in:
Michael Green
2023-07-04 10:36:25 +10:00
parent 48e8682a55
commit 99062da10b

View File

@@ -15,6 +15,10 @@ namespace gaseous_server.SignatureIngestors.TOSEC
// connect to database // connect to database
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
List<Dictionary<string, object>> ImportedPlatforms = new List<Dictionary<string, object>>();
List<Dictionary<string, object>> ImportedPublishers = new List<Dictionary<string, object>>();
List<Dictionary<string, object>> ImportedGames = new List<Dictionary<string, object>>();
// process provided files // process provided files
Logging.Log(Logging.LogType.Information, "Signature Ingestor - TOSEC", "Importing from " + SearchPath); Logging.Log(Logging.LogType.Information, "Signature Ingestor - TOSEC", "Importing from " + SearchPath);
if (Directory.Exists(Config.LibraryConfiguration.LibrarySignatureImportDirectory_TOSEC)) if (Directory.Exists(Config.LibraryConfiguration.LibrarySignatureImportDirectory_TOSEC))
@@ -101,20 +105,41 @@ namespace gaseous_server.SignatureIngestors.TOSEC
int gameSystem = 0; int gameSystem = 0;
if (gameObject.System != null) if (gameObject.System != null)
{ {
sql = "SELECT Id FROM Signatures_Platforms WHERE Platform=@platform"; bool foundPlatform = false;
string platformName = (string)dbDict["platform"];
sigDB = db.ExecuteCMD(sql, dbDict); foreach (Dictionary<string, object> ImportedPlatform in ImportedPlatforms)
if (sigDB.Rows.Count == 0)
{ {
// entry not present, insert it string importedPlatformName = (string)ImportedPlatform["Name"];
sql = "INSERT INTO Signatures_Platforms (Platform) VALUES (@platform); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; if (importedPlatformName == platformName)
sigDB = db.ExecuteCMD(sql, dbDict); {
foundPlatform = true;
gameSystem = Convert.ToInt32(sigDB.Rows[0][0]); gameSystem = (int)ImportedPlatform["Id"];
break;
}
} }
else
if (foundPlatform == false)
{ {
gameSystem = (int)sigDB.Rows[0][0]; 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);
} }
} }
dbDict.Add("systemid", gameSystem); dbDict.Add("systemid", gameSystem);
@@ -123,41 +148,91 @@ namespace gaseous_server.SignatureIngestors.TOSEC
int gamePublisher = 0; int gamePublisher = 0;
if (gameObject.Publisher != null) if (gameObject.Publisher != null)
{ {
sql = "SELECT * FROM Signatures_Publishers WHERE Publisher=@publisher"; bool foundPublisher = false;
string publisherName = (string)dbDict["publisher"];
sigDB = db.ExecuteCMD(sql, dbDict); foreach (Dictionary<string, object> ImportedPublisher in ImportedPublishers)
if (sigDB.Rows.Count == 0)
{ {
// entry not present, insert it string importedPublisherName = (string)ImportedPublisher["Name"];
sql = "INSERT INTO Signatures_Publishers (Publisher) VALUES (@publisher); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; if (importedPublisherName == publisherName)
sigDB = db.ExecuteCMD(sql, dbDict); {
gamePublisher = Convert.ToInt32(sigDB.Rows[0][0]); foundPublisher = true;
gamePublisher = (int)ImportedPublisher["Id"];
break;
}
} }
else
if (foundPublisher == false)
{ {
gamePublisher = (int)sigDB.Rows[0][0]; 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); dbDict.Add("publisherid", gamePublisher);
// store game // store game
int gameId = 0; 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"; bool foundGame = false;
foreach (Dictionary<string, object> ImportedGame in ImportedGames)
sigDB = db.ExecuteCMD(sql, dbDict);
if (sigDB.Rows.Count == 0)
{ {
// entry not present, insert it if (((string)ImportedGame["Name"] == (string)dbDict["name"]) &&
sql = "INSERT INTO Signatures_Games " + ((string)ImportedGame["Year"] == (string)dbDict["year"]) &&
"(Name, Description, Year, PublisherId, Demo, SystemId, SystemVariant, Video, Country, Language, Copyright) VALUES " + ((int)ImportedGame["PublisherId"] == (int)dbDict["publisherid"]) &&
"(@name, @description, @year, @publisherid, @demo, @systemid, @systemvariant, @video, @country, @language, @copyright); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; ((int)ImportedGame["SystemId"] == (int)dbDict["systemid"]) &&
sigDB = db.ExecuteCMD(sql, dbDict); ((string)ImportedGame["Country"] == (string)dbDict["country"]) &&
((string)ImportedGame["Language"] == (string)dbDict["language"]))
gameId = Convert.ToInt32(sigDB.Rows[0][0]); {
foundGame = true;
gameId = (int)ImportedGame["Id"];
break;
}
} }
else
if (foundGame == false)
{ {
gameId = (int)sigDB.Rows[0][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];
}
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 // store rom