diff --git a/gaseous-server/Classes/Common.cs b/gaseous-server/Classes/Common.cs index bd6cf8e..05946f7 100644 --- a/gaseous-server/Classes/Common.cs +++ b/gaseous-server/Classes/Common.cs @@ -159,6 +159,50 @@ namespace gaseous_server.Classes return defaultValue; } } + + public static int GetLookupByCode(LookupTypes LookupType, string Code) + { + Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string sql = "SELECT Id FROM " + LookupType.ToString() + " WHERE Code = @code"; + Dictionary dbDict = new Dictionary{ + { "code", Code } + }; + + DataTable data = db.ExecuteCMD(sql, dbDict); + if (data.Rows.Count == 0) + { + return -1; + } + else + { + return (int)data.Rows[0]["Id"]; + } + } + + public static int GetLookupByValue(LookupTypes LookupType, string Value) + { + Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string sql = "SELECT Id FROM " + LookupType.ToString() + " WHERE Value = @value"; + Dictionary dbDict = new Dictionary{ + { "value", Value } + }; + + DataTable data = db.ExecuteCMD(sql, dbDict); + if (data.Rows.Count == 0) + { + return -1; + } + else + { + return (int)data.Rows[0]["Id"]; + } + } + + public enum LookupTypes + { + Country, + Language + } } /// diff --git a/gaseous-server/Classes/DatabaseMigration.cs b/gaseous-server/Classes/DatabaseMigration.cs index b901b28..b739195 100644 --- a/gaseous-server/Classes/DatabaseMigration.cs +++ b/gaseous-server/Classes/DatabaseMigration.cs @@ -64,6 +64,8 @@ namespace gaseous_server.Classes public static void PostUpgradeScript(int TargetSchemaVersion, Database.databaseType? DatabaseType) { + var assembly = Assembly.GetExecutingAssembly(); + Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); string sql = ""; Dictionary dbDict = new Dictionary(); @@ -103,6 +105,48 @@ namespace gaseous_server.Classes sql = "DELETE FROM Settings WHERE Setting LIKE 'LastRun_%';"; db.ExecuteNonQuery(sql); break; + + case 1023: + // load country list + Logging.Log(Logging.LogType.Information, "Database Upgrade", "Adding country look up table contents"); + + string countryResourceName = "gaseous_server.Support.Country.txt"; + using (Stream stream = assembly.GetManifestResourceStream(countryResourceName)) + using (StreamReader reader = new StreamReader(stream)) + { + do + { + string[] line = reader.ReadLine().Split("|"); + + sql = "INSERT INTO Country (Code, Value) VALUES (@code, @value);"; + dbDict = new Dictionary{ + { "code", line[0] }, + { "value", line[1] } + }; + db.ExecuteNonQuery(sql, dbDict); + } while (reader.EndOfStream == false); + } + + // load language list + Logging.Log(Logging.LogType.Information, "Database Upgrade", "Adding language look up table contents"); + + string languageResourceName = "gaseous_server.Support.Language.txt"; + using (Stream stream = assembly.GetManifestResourceStream(languageResourceName)) + using (StreamReader reader = new StreamReader(stream)) + { + do + { + string[] line = reader.ReadLine().Split("|"); + + sql = "INSERT INTO Language (Code, Value) VALUES (@code, @value);"; + dbDict = new Dictionary{ + { "code", line[0] }, + { "value", line[1] } + }; + db.ExecuteNonQuery(sql, dbDict); + } while (reader.EndOfStream == false); + } + break; } break; } diff --git a/gaseous-server/Classes/ImportGames.cs b/gaseous-server/Classes/ImportGames.cs index 01c5759..69dd005 100644 --- a/gaseous-server/Classes/ImportGames.cs +++ b/gaseous-server/Classes/ImportGames.cs @@ -429,23 +429,20 @@ namespace gaseous_server.Classes Logging.Log(Logging.LogType.Information, "Move Game ROM", "Moving " + romPath + " to " + DestinationPath); if (File.Exists(DestinationPath)) { - Logging.Log(Logging.LogType.Information, "Move Game ROM", "A file with the same name exists at the destination - aborting"); - return false; + Logging.Log(Logging.LogType.Information, "Move Game ROM", "A file with the same name exists at the destination - overwriting"); } - else - { - File.Move(romPath, DestinationPath); - // update the db - Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); - string sql = "UPDATE Games_Roms SET Path=@path WHERE Id=@id"; - Dictionary dbDict = new Dictionary(); - dbDict.Add("id", RomId); - dbDict.Add("path", DestinationPath); - db.ExecuteCMD(sql, dbDict); + File.Move(romPath, DestinationPath, true); - return true; - } + // update the db + Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string sql = "UPDATE Games_Roms SET Path=@path WHERE Id=@id"; + Dictionary dbDict = new Dictionary(); + dbDict.Add("id", RomId); + dbDict.Add("path", DestinationPath); + db.ExecuteCMD(sql, dbDict); + + return true; } } else diff --git a/gaseous-server/Classes/SignatureIngestors/XML.cs b/gaseous-server/Classes/SignatureIngestors/XML.cs index 75eb02f..ff5ee6f 100644 --- a/gaseous-server/Classes/SignatureIngestors/XML.cs +++ b/gaseous-server/Classes/SignatureIngestors/XML.cs @@ -8,21 +8,49 @@ namespace gaseous_server.SignatureIngestors.XML { public class XMLIngestor : QueueItemStatus { - public void Import(string SearchPath, gaseous_signature_parser.parser.SignatureParser XMLType) + public void Import(string SearchPath, string ProcessedDirectory, gaseous_signature_parser.parser.SignatureParser XMLType) { // connect to database Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string? XMLDBSearchPath = null; + string? XMLDBProcessedDirectory = null; + if (XMLType == gaseous_signature_parser.parser.SignatureParser.NoIntro) + { + XMLDBSearchPath = Path.Combine(SearchPath, "DB"); + XMLDBProcessedDirectory = Path.Combine(ProcessedDirectory, "DB"); + SearchPath = Path.Combine(SearchPath, "DAT"); + ProcessedDirectory = Path.Combine(ProcessedDirectory, "DAT"); + } + // process provided files - Logging.Log(Logging.LogType.Information, "Signature Ingestor - XML", "Importing from " + SearchPath); if (!Directory.Exists(SearchPath)) { Directory.CreateDirectory(SearchPath); } + if (!Directory.Exists(ProcessedDirectory)) + { + Directory.CreateDirectory(ProcessedDirectory); + } string[] PathContents = Directory.GetFiles(SearchPath); Array.Sort(PathContents); + string[]? DBPathContents = null; + if (XMLDBSearchPath != null) + { + if (!Directory.Exists(XMLDBSearchPath)) + { + Directory.CreateDirectory(XMLDBSearchPath); + } + if (!Directory.Exists(XMLDBProcessedDirectory)) + { + Directory.CreateDirectory(XMLDBProcessedDirectory); + } + + DBPathContents = Directory.GetFiles(XMLDBSearchPath); + } + string sql = ""; Dictionary dbDict = new Dictionary(); System.Data.DataTable sigDB; @@ -33,226 +61,380 @@ namespace gaseous_server.SignatureIngestors.XML SetStatus(i + 1, PathContents.Length, "Processing signature file: " + XMLFile); - if (Common.SkippableFiles.Contains(Path.GetFileName(XMLFile), StringComparer.OrdinalIgnoreCase)) - { - 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(); - dbDict.Add("sourcemd5", hashObject.md5hash); - sigDB = db.ExecuteCMD(sql, dbDict); + Logging.Log(Logging.LogType.Information, "Signature Ingest", "(" + (i + 1) + " / " + PathContents.Length + ") Processing " + XMLType.ToString() + " DAT file: " + XMLFile); - if (sigDB.Rows.Count == 0) + string? DBFile = null; + if (XMLDBSearchPath != null) + { + switch (XMLType) { - try - { - Logging.Log(Logging.LogType.Information, "Signature Ingestor - XML", "Importing file: " + XMLFile); - - // 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) + case gaseous_signature_parser.parser.SignatureParser.NoIntro: + for (UInt16 x = 0; x < DBPathContents.Length; x++) { - sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5"; - dbDict = new Dictionary(); - string sourceUriStr = ""; - if (Object.Url != null) + string tempDBFileName = Path.GetFileNameWithoutExtension(DBPathContents[x].Replace(" (DB Export)", "")); + if (tempDBFileName == Path.GetFileNameWithoutExtension(XMLFile)) { - sourceUriStr = Object.Url.ToString(); + DBFile = DBPathContents[x]; + Logging.Log(Logging.LogType.Information, "Signature Ingest", "Using DB file: " + DBFile); + break; } - 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); + } + break; + } + } + + // check xml file md5 + Common.hashObject hashObject = new Common.hashObject(XMLFile); + sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5"; + dbDict = new Dictionary(); + dbDict.Add("sourcemd5", hashObject.md5hash); + sigDB = db.ExecuteCMD(sql, dbDict); + + if (sigDB.Rows.Count == 0) + { + try + { + // start parsing file + gaseous_signature_parser.parser Parser = new gaseous_signature_parser.parser(); + RomSignatureObject Object = Parser.ParseSignatureDAT(XMLFile, DBFile, XMLType); + + // store in database + string[] flipNameAndDescription = { + "MAMEArcade", + "MAMEMess" + }; + + // store source object + bool processGames = false; + if (Object.SourceMd5 != null) + { + int sourceId = 0; + + sql = "SELECT * FROM Signatures_Sources WHERE `SourceMD5`=@sourcemd5"; + dbDict = new Dictionary + { + { "name", Common.ReturnValueIfNull(Object.Name, "") }, + { "description", Common.ReturnValueIfNull(Object.Description, "") }, + { "category", Common.ReturnValueIfNull(Object.Category, "") }, + { "version", Common.ReturnValueIfNull(Object.Version, "") }, + { "author", Common.ReturnValueIfNull(Object.Author, "") }, + { "email", Common.ReturnValueIfNull(Object.Email, "") }, + { "homepage", Common.ReturnValueIfNull(Object.Homepage, "") } + }; + if (Object.Url == null) + { + dbDict.Add("uri", ""); + } + else + { + dbDict.Add("uri", Common.ReturnValueIfNull(Object.Url.ToString(), "")); + } + 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); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; sigDB = db.ExecuteCMD(sql, dbDict); - if (sigDB.Rows.Count == 0) + + sourceId = Convert.ToInt32(sigDB.Rows[0][0]); + + processGames = true; + } + + if (processGames == true) + { + for (int x = 0; x < Object.Games.Count; ++x) { - // 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)"; + RomSignatureObject.Game gameObject = Object.Games[x]; - db.ExecuteCMD(sql, dbDict); - - processGames = true; - } - - if (processGames == true) - { - for (int x = 0; x < Object.Games.Count; ++x) + // set up game dictionary + dbDict = new Dictionary(); + if (flipNameAndDescription.Contains(Object.SourceType)) { - RomSignatureObject.Game gameObject = Object.Games[x]; + dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Description, "")); + 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, "")); - // set up game dictionary - dbDict = new Dictionary(); - if (flipNameAndDescription.Contains(Object.SourceType)) + List gameCountries = new List(); + if ( + gameObject.Country != null && + gameObject.Country != "Unknown" + ) + { + string[] countries = gameObject.Country.Split(","); + foreach (string country in countries) { - dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Description, "")); - 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 - int gameSystem = 0; - if (gameObject.System != null) - { - sql = "SELECT Id FROM Signatures_Platforms WHERE Platform=@platform"; - - sigDB = db.ExecuteCMD(sql, dbDict); - if (sigDB.Rows.Count == 0) + int countryId = -1; + countryId = Common.GetLookupByCode(Common.LookupTypes.Country, (string)Common.ReturnValueIfNull(country.Trim(), "")); + if (countryId == -1) { - // 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); + countryId = Common.GetLookupByValue(Common.LookupTypes.Country, (string)Common.ReturnValueIfNull(country.Trim(), "")); - gameSystem = Convert.ToInt32(sigDB.Rows[0][0]); + if (countryId == -1) + { + Logging.Log(Logging.LogType.Warning, "Signature Ingest", "Unable to locate country id for " + country.Trim()); + sql = "INSERT INTO Country (`Code`, `Value`) VALUES (@code, @name); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; + Dictionary countryDict = new Dictionary{ + { "code", country.Trim() }, + { "name", country.Trim() } + }; + countryId = int.Parse(db.ExecuteCMD(sql, countryDict).Rows[0][0].ToString()); + } } - else + + if (countryId > 0) { - gameSystem = (int)sigDB.Rows[0][0]; + gameCountries.Add(countryId); } } - dbDict.Add("systemid", gameSystem); + } - // store publisher - int gamePublisher = 0; - if (gameObject.Publisher != null) + List gameLanguages = new List(); + if ( + gameObject.Language != null && + gameObject.Language != "nolang" + ) + { + string[] languages = gameObject.Language.Split(","); + foreach (string language in languages) { - sql = "SELECT * FROM Signatures_Publishers WHERE Publisher=@publisher"; + int languageId = -1; + languageId = Common.GetLookupByCode(Common.LookupTypes.Language, (string)Common.ReturnValueIfNull(language.Trim(), "")); + if (languageId == -1) + { + languageId = Common.GetLookupByValue(Common.LookupTypes.Language, (string)Common.ReturnValueIfNull(language.Trim(), "")); - 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]); + if (languageId == -1) + { + Logging.Log(Logging.LogType.Warning, "Signature Ingest", "Unable to locate language id for " + language.Trim()); + sql = "INSERT INTO Language (`Code`, `Value`) VALUES (@code, @name); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; + Dictionary langDict = new Dictionary{ + { "code", language.Trim() }, + { "name", language.Trim() } + }; + languageId = int.Parse(db.ExecuteCMD(sql, langDict).Rows[0][0].ToString()); + } } - else + + if (languageId > 0) { - gamePublisher = (int)sigDB.Rows[0][0]; + gameLanguages.Add(languageId); } } - 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"; + dbDict.Add("copyright", Common.ReturnValueIfNull(gameObject.Copyright, "")); + + // store platform + int gameSystem = 0; + if (gameObject.System != null) + { + 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_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);"; + sql = "INSERT INTO Signatures_Platforms (`Platform`) VALUES (@platform); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; sigDB = db.ExecuteCMD(sql, dbDict); - gameId = Convert.ToInt32(sigDB.Rows[0][0]); + gameSystem = Convert.ToInt32(sigDB.Rows[0][0]); } else { - gameId = (int)sigDB.Rows[0][0]; + gameSystem = (int)sigDB.Rows[0][0]; } + } + dbDict.Add("systemid", gameSystem); - // store rom - foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms) + // 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) { - if (romObject.Md5 != null || romObject.Sha1 != null) + // 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 + long gameId = 0; + sql = "SELECT * FROM Signatures_Games WHERE `Name`=@name AND `Year`=@year AND `PublisherId`=@publisherid AND `SystemId`=@systemid"; + + 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`, `Copyright`) VALUES " + + "(@name, @description, @year, @publisherid, @demo, @systemid, @systemvariant, @video, @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]; + } + + // insert countries + foreach (int gameCountry in gameCountries) + { + try + { + sql = "SELECT * FROM Signatures_Games_Countries WHERE GameId = @gameid AND CountryId = @Countryid"; + Dictionary countryDict = new Dictionary{ + { "gameid", gameId }, + { "Countryid", gameCountry } + }; + if (db.ExecuteCMD(sql, countryDict).Rows.Count == 0) { - int romId = 0; - sql = "SELECT * FROM Signatures_Roms WHERE `GameId`=@gameid AND (`MD5`=@md5 AND `SHA1`=@sha1)"; - dbDict = new Dictionary(); - 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, "")); + sql = "INSERT INTO Signatures_Games_Countries (GameId, CountryId) VALUES (@gameid, @Countryid)"; + db.ExecuteCMD(sql, countryDict); + } + } + catch + { + Console.WriteLine("Game id: " + gameId + " with Country " + gameCountry); + } + } - if (romObject.Attributes != null) + // insert languages + foreach (int gameLanguage in gameLanguages) + { + try + { + sql = "SELECT * FROM Signatures_Games_Languages WHERE GameId = @gameid AND LanguageId = @languageid"; + Dictionary langDict = new Dictionary{ + { "gameid", gameId }, + { "languageid", gameLanguage } + }; + if (db.ExecuteCMD(sql, langDict).Rows.Count == 0) + { + sql = "INSERT INTO Signatures_Games_Languages (GameId, LanguageId) VALUES (@gameid, @languageid)"; + db.ExecuteCMD(sql, langDict); + } + } + catch + { + Console.WriteLine("Game id: " + gameId + " with language " + gameLanguage); + } + } + + // store rom + foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms) + { + if (romObject.Md5 != null || romObject.Sha1 != null) + { + long romId = 0; + sql = "SELECT * FROM Signatures_Roms WHERE `GameId`=@gameid AND (`MD5`=@md5 OR `SHA1`=@sha1)"; + dbDict = new Dictionary(); + 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) { - if (romObject.Attributes.Count > 0) - { - dbDict.Add("attributes", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.Attributes)); - } - else - { - dbDict.Add("attributes", "[ ]"); - } + dbDict.Add("attributes", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.Attributes)); } else { - dbDict.Add("attributes", "[ ]"); + 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); + } + 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); - 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]; + } - romId = Convert.ToInt32(sigDB.Rows[0][0]); - } - else - { - romId = (int)sigDB.Rows[0][0]; - } + // map the rom to the source + sql = "SELECT * FROM Signatures_RomToSource WHERE SourceId=@sourceid AND RomId=@romid;"; + dbDict.Add("romid", romId); + dbDict.Add("sourceId", sourceId); + + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + sql = "INSERT INTO Signatures_RomToSource (`SourceId`, `RomId`) VALUES (@sourceid, @romid);"; + db.ExecuteCMD(sql, dbDict); } } } } } } - catch (Exception ex) + + File.Move(XMLFile, Path.Combine(ProcessedDirectory, Path.GetFileName(XMLFile))); + if (DBFile != null) { - Logging.Log(Logging.LogType.Warning, "Signature Ingestor - XML", "Invalid import file: " + XMLFile, ex); + File.Move(DBFile, Path.Combine(XMLDBProcessedDirectory, Path.GetFileName(DBFile))); } } - else + catch (Exception ex) { - Logging.Log(Logging.LogType.Debug, "Signature Ingestor - XML", "Rejecting already imported file: " + XMLFile); + Logging.Log(Logging.LogType.Warning, "Signature Ingest", "Error ingesting " + XMLType.ToString() + " file: " + XMLFile, ex); + } + } + else + { + Logging.Log(Logging.LogType.Information, "Signature Ingest", "Rejecting already imported " + XMLType.ToString() + " file: " + XMLFile); + File.Move(XMLFile, Path.Combine(ProcessedDirectory, Path.GetFileName(XMLFile))); + if (DBFile != null) + { + File.Move(DBFile, Path.Combine(XMLDBProcessedDirectory, Path.GetFileName(DBFile))); } } } diff --git a/gaseous-server/Classes/SignatureManagement.cs b/gaseous-server/Classes/SignatureManagement.cs index f56792f..f87e561 100644 --- a/gaseous-server/Classes/SignatureManagement.cs +++ b/gaseous-server/Classes/SignatureManagement.cs @@ -56,8 +56,8 @@ namespace gaseous_server.Classes System = (string)sigDbRow["Platform"], SystemVariant = (string)sigDbRow["SystemVariant"], Video = (string)sigDbRow["Video"], - Country = (string)sigDbRow["Country"], - Language = (string)sigDbRow["Language"], + Country = "", + Language = "", Copyright = (string)sigDbRow["Copyright"] }, Rom = new gaseous_server.Models.Signatures_Games.RomItem @@ -69,13 +69,22 @@ namespace gaseous_server.Classes Md5 = ((string)sigDbRow["MD5"]).ToLower(), Sha1 = ((string)sigDbRow["SHA1"]).ToLower(), DevelopmentStatus = (string)sigDbRow["DevelopmentStatus"], - Attributes = Newtonsoft.Json.JsonConvert.DeserializeObject>>((string)Common.ReturnValueIfNull(sigDbRow["Attributes"], "[]")), RomType = (gaseous_server.Models.Signatures_Games.RomItem.RomTypes)(int)sigDbRow["RomType"], RomTypeMedia = (string)sigDbRow["RomTypeMedia"], MediaLabel = (string)sigDbRow["MediaLabel"], SignatureSource = (gaseous_server.Models.Signatures_Games.RomItem.SignatureSourceType)(Int32)sigDbRow["MetadataSource"] } }; + string attributeValues = (string)Common.ReturnValueIfNull(sigDbRow["Attributes"], "[]"); + Dictionary attributesDict = Newtonsoft.Json.JsonConvert.DeserializeObject>(attributeValues); + if (attributesDict != null) + { + gameItem.Rom.Attributes = [.. attributesDict]; + } + else + { + gameItem.Rom.Attributes = new List>(); + } GamesList.Add(gameItem); } return GamesList; diff --git a/gaseous-server/ProcessQueue.cs b/gaseous-server/ProcessQueue.cs index bd90002..83883d7 100644 --- a/gaseous-server/ProcessQueue.cs +++ b/gaseous-server/ProcessQueue.cs @@ -245,14 +245,32 @@ namespace gaseous_server CallingQueueItem = this }; - Logging.Log(Logging.LogType.Debug, "Signature Import", "Processing TOSEC files"); - tIngest.Import(Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, "TOSEC"), gaseous_signature_parser.parser.SignatureParser.TOSEC); + foreach (int i in Enum.GetValues(typeof(gaseous_signature_parser.parser.SignatureParser))) + { + gaseous_signature_parser.parser.SignatureParser parserType = (gaseous_signature_parser.parser.SignatureParser)i; + if ( + parserType != gaseous_signature_parser.parser.SignatureParser.Auto && + parserType != gaseous_signature_parser.parser.SignatureParser.Unknown + ) + { + Logging.Log(Logging.LogType.Debug, "Signature Import", "Processing " + parserType + " files"); - Logging.Log(Logging.LogType.Debug, "Signature Import", "Processing MAME Arcade files"); - tIngest.Import(Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, "MAME Arcade"), gaseous_signature_parser.parser.SignatureParser.MAMEArcade); + string SignaturePath = Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, parserType.ToString()); + string SignatureProcessedPath = Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, parserType.ToString()); - Logging.Log(Logging.LogType.Debug, "Signature Import", "Processing MAME MESS files"); - tIngest.Import(Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, "MAME MESS"), gaseous_signature_parser.parser.SignatureParser.MAMEMess); + if (!Directory.Exists(SignaturePath)) + { + Directory.CreateDirectory(SignaturePath); + } + + if (!Directory.Exists(SignatureProcessedPath)) + { + Directory.CreateDirectory(SignatureProcessedPath); + } + + tIngest.Import(SignaturePath, SignatureProcessedPath, parserType); + } + } _SaveLastRunTime = true; diff --git a/gaseous-server/Support/Country.txt b/gaseous-server/Support/Country.txt new file mode 100644 index 0000000..d9878d8 --- /dev/null +++ b/gaseous-server/Support/Country.txt @@ -0,0 +1,73 @@ +AE|United Arab Emirates +AL|Albania +AS|Asia +AT|Austria +AU|Australia +BA|Bosnia and Herzegovina +BE|Belgium +BG|Bulgaria +BR|Brazil +CA|Canada +CH|Switzerland +CL|Chile +CN|China +CS|Serbia and Montenegro +CY|Cyprus +CZ|Czech Republic +DE|Germany +DK|Denmark +EE|Estonia +EG|Egypt +ES|Spain +EU|Europe +FI|Finland +FR|France +GB|United Kingdom +GR|Greece +HK|Hong Kong +HR|Croatia +HU|Hungary +ID|Indonesia +IE|Ireland +IL|Israel +IN|India +IR|Iran +IS|Iceland +IT|Italy +JO|Jordan +JP|Japan +KR|Korea +KR|South Korea +LT|Lithuania +LU|Luxembourg +LV|Latvia +MN|Mongolia +MX|Mexico +MY|Malaysia +NL|Netherlands +NO|Norway +NP|Nepal +NZ|New Zealand +OM|Oman +PE|Peru +PH|Philippines +PL|Poland +PT|Portugal +QA|Qatar +RO|Romania +RU|Russia +SE|Sweden +SG|Singapore +SI|Slovenia +SK|Slovakia +TH|Thailand +TR|Turkey +TW|Taiwan +US|United States +USA|United States +VN|Vietnam +YU|Yugoslavia +ZA|South Africa +World|World +Europe|Europe +Asia|Asia \ No newline at end of file diff --git a/gaseous-server/Support/Database/MySQL/gaseous-1023.sql b/gaseous-server/Support/Database/MySQL/gaseous-1023.sql new file mode 100644 index 0000000..fb0228a --- /dev/null +++ b/gaseous-server/Support/Database/MySQL/gaseous-1023.sql @@ -0,0 +1,37 @@ +CREATE TABLE `Country` ( + `Id` INT NOT NULL AUTO_INCREMENT, + `Code` VARCHAR(20) NULL, + `Value` VARCHAR(255) NULL, + PRIMARY KEY (`Id`), + INDEX `id_Code` (`Code` ASC) VISIBLE, + INDEX `id_Value` (`Value` ASC) VISIBLE +); + +CREATE TABLE `Language` ( + `Id` INT NOT NULL AUTO_INCREMENT, + `Code` VARCHAR(20) NULL, + `Value` VARCHAR(255) NULL, + PRIMARY KEY (`Id`), + INDEX `id_Code` (`Code` ASC) VISIBLE, + INDEX `id_Value` (`Value` ASC) VISIBLE +); + +CREATE TABLE `Signatures_RomToSource` ( + `SourceId` int NOT NULL, + `RomId` int NOT NULL, + PRIMARY KEY (`SourceId`, `RomId`) +); + +CREATE TABLE `Signatures_Games_Countries` ( + `GameId` INT NOT NULL, + `CountryId` INT NOT NULL, + PRIMARY KEY (`GameId`, `CountryId`), + CONSTRAINT `GameCountry` FOREIGN KEY (`GameId`) REFERENCES `Signatures_Games` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION +); + +CREATE TABLE `Signatures_Games_Languages` ( + `GameId` INT NOT NULL, + `LanguageId` INT NOT NULL, + PRIMARY KEY (`GameId`, `LanguageId`), + CONSTRAINT `GameLanguage` FOREIGN KEY (`GameId`) REFERENCES `Signatures_Games` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION +); \ No newline at end of file diff --git a/gaseous-server/Support/Language.txt b/gaseous-server/Support/Language.txt new file mode 100644 index 0000000..eafb948 --- /dev/null +++ b/gaseous-server/Support/Language.txt @@ -0,0 +1,47 @@ +ar|Arabic +bg|Bulgarian +bs|Bosnian +cs|Czech +cy|Welsh +da|Danish +de|German +el|Greek +en|English +eo|Esperanto +es|Spanish +et|Estonian +fa|Persian +fi|Finnish +fr|French +fr-ca|French Canadian +ga|Irish +gd|Gaelic +gu|Gujarati +he|Hebrew +hi|Hindi +hr|Croatian +hu|Hungarian +is|Icelandic +it|Italian +ja|Japanese +ko|Korean +lt|Lithuanian +lv|Latvian +ms|Malay +nl|Dutch +no|Norwegian +pl|Polish +pt|Portuguese +ro|Romanian +ru|Russian +sk|Slovakian +sl|Slovenian +sq|Albanian +sr|Serbian +sv|Swedish +th|Thai +tr|Turkish +ur|Urdu +vi|Vietnamese +yi|Yiddish +zh|Chinese \ No newline at end of file diff --git a/gaseous-server/gaseous-server.csproj b/gaseous-server/gaseous-server.csproj index d2e2038..0a2760a 100644 --- a/gaseous-server/gaseous-server.csproj +++ b/gaseous-server/gaseous-server.csproj @@ -18,7 +18,7 @@ - + @@ -65,6 +65,7 @@ + @@ -86,6 +87,8 @@ true PreserveNewest + + @@ -110,5 +113,6 @@ + \ No newline at end of file diff --git a/gaseous-server/wwwroot/images/NoIntro-logo.svg b/gaseous-server/wwwroot/images/NoIntro-logo.svg new file mode 100644 index 0000000..adbd546 --- /dev/null +++ b/gaseous-server/wwwroot/images/NoIntro-logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/gaseous-server/wwwroot/images/redump.png b/gaseous-server/wwwroot/images/redump.png new file mode 100644 index 0000000..4c2dd84 Binary files /dev/null and b/gaseous-server/wwwroot/images/redump.png differ diff --git a/gaseous-server/wwwroot/pages/settings/about.html b/gaseous-server/wwwroot/pages/settings/about.html index 83dde1b..6ac6c9d 100644 --- a/gaseous-server/wwwroot/pages/settings/about.html +++ b/gaseous-server/wwwroot/pages/settings/about.html @@ -85,6 +85,27 @@ class="romlink">https://www.progettosnaps.net/index.php + + + + + + No-Intro
+ https://no-intro.org + + + + + + + + Redump
+ http://redump.org + +