diff --git a/RombaSharp/Partials/RombaSharp_Helpers.cs b/RombaSharp/Partials/RombaSharp_Helpers.cs new file mode 100644 index 00000000..fcd07ec3 --- /dev/null +++ b/RombaSharp/Partials/RombaSharp_Helpers.cs @@ -0,0 +1,426 @@ +using Mono.Data.Sqlite; +using SabreTools.Helper; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Xml; + +namespace SabreTools +{ + public partial class RombaSharp + { + #region Helper methods + + /// + /// Initialize the Romba application from XML config + /// + private static void InitializeConfiguration() + { + // Get default values if they're not written + int workers = 4, + verbosity = 1, + cores = 4, + port = 4003; + string logdir = "logs", + tmpdir = "tmp", + webdir = "web", + baddir = "bad", + dats = "dats", + db = "db", + connectionString = ""; + Dictionary> depots = new Dictionary>(); + + // Get the XML text reader for the configuration file, if possible + XmlTextReader xtr = DatTools.GetXmlTextReader(_config, _logger); + + /* XML file structure + + + + 4 + logs + tmp + web + bad + 1 + 4 + + + dats + db + + + + depot + 40000 + true + + + + 4003 + + + + */ + + // Now parse the XML file for settings + if (xtr != null) + { + xtr.MoveToContent(); + while (!xtr.EOF) + { + // We only want elements + if (xtr.NodeType != XmlNodeType.Element) + { + xtr.Read(); + continue; + } + + switch (xtr.Name) + { + case "workers": + workers = xtr.ReadElementContentAsInt(); + break; + case "logdir": + logdir = xtr.ReadElementContentAsString(); + break; + case "tmpdir": + tmpdir = xtr.ReadElementContentAsString(); + break; + case "webdir": + webdir = xtr.ReadElementContentAsString(); + break; + case "baddir": + baddir = xtr.ReadElementContentAsString(); + break; + case "verbosity": + verbosity = xtr.ReadElementContentAsInt(); + break; + case "cores": + cores = xtr.ReadElementContentAsInt(); + break; + case "dats": + dats = xtr.ReadElementContentAsString(); + break; + case "db": + db = xtr.ReadElementContentAsString(); + break; + case "depot": + XmlReader subreader = xtr.ReadSubtree(); + if (subreader != null) + { + string root = ""; + long maxsize = -1; + bool online = true; + + while (!subreader.EOF) + { + // We only want elements + if (subreader.NodeType != XmlNodeType.Element) + { + subreader.Read(); + continue; + } + + switch (subreader.Name) + { + case "root": + root = subreader.ReadElementContentAsString(); + break; + case "maxsize": + maxsize = subreader.ReadElementContentAsLong(); + break; + case "online": + online = subreader.ReadElementContentAsBoolean(); + break; + default: + subreader.Read(); + break; + } + } + + try + { + depots.Add(root, new Tuple(maxsize, online)); + } + catch + { + // Ignore add errors + } + } + + xtr.Skip(); + break; + case "port": + port = xtr.ReadElementContentAsInt(); + break; + default: + xtr.Read(); + break; + } + } + } + + // Now validate the values given + if (workers < 1) + { + workers = 1; + } + if (workers > 8) + { + workers = 8; + } + if (!Directory.Exists(logdir)) + { + Directory.CreateDirectory(logdir); + } + if (!Directory.Exists(tmpdir)) + { + Directory.CreateDirectory(tmpdir); + } + if (!Directory.Exists(webdir)) + { + Directory.CreateDirectory(webdir); + } + if (!Directory.Exists(baddir)) + { + Directory.CreateDirectory(baddir); + } + if (verbosity < 0) + { + verbosity = 0; + } + if (verbosity > 3) + { + verbosity = 3; + } + if (cores < 1) + { + cores = 1; + } + if (cores > 16) + { + cores = 16; + } + if (!Directory.Exists(dats)) + { + Directory.CreateDirectory(dats); + } + db = Path.GetFileNameWithoutExtension(db) + ".sqlite"; + connectionString = "Data Source=" + _db + ";Version = 3;"; + foreach (string key in depots.Keys) + { + if (!Directory.Exists(key)) + { + Directory.CreateDirectory(key); + File.CreateText(Path.Combine(key, ".romba_size")); + File.CreateText(Path.Combine(key, ".romba_size.backup")); + } + else + { + if (!File.Exists(Path.Combine(key, ".romba_size"))) + { + File.CreateText(Path.Combine(key, ".romba_size")); + } + if (!File.Exists(Path.Combine(key, ".romba_size.backup"))) + { + File.CreateText(Path.Combine(key, ".romba_size.backup")); + } + } + } + if (port < 0) + { + port = 0; + } + if (port > 65535) + { + port = 65535; + } + + // Finally set all of the fields + _workers = workers; + _logdir = logdir; + _tmpdir = tmpdir; + _webdir = webdir; + _baddir = baddir; + _verbosity = verbosity; + _cores = cores; + _dats = dats; + _db = db; + _connectionString = connectionString; + _depots = depots; + _port = port; + } + + private static void DisplayDBStats() + { + _logger.User("This feature is not yet implemented: dbstats"); + } + + private static void DisplayMemoryStats() + { + _logger.User("This feature is not yet implemented: memstats"); + } + + /// + /// Populate or refresh the database information + /// + /// Each hash has the following attributes: size, crc, md5, sha-1, dathash, existss + private static void RefreshDatabase() + { + // Make sure the db is set + if (String.IsNullOrEmpty(_db)) + { + _db = "db.sqlite"; + _connectionString = "Data Source=" + _db + ";Version = 3;"; + } + + // Make sure the file exists + if (!File.Exists(_db)) + { + DBTools.EnsureDatabase(_dbSchema, _db, _connectionString); + } + + // Make sure the dats dir is set + if (String.IsNullOrEmpty(_dats)) + { + _dats = "dats"; + } + + // Make sure the folder exists + if (!Directory.Exists(_dats)) + { + Directory.CreateDirectory(_dats); + } + + // Create a List of dat hashes in the database (SHA-1) + List databaseDats = new List(); + + // Populate the List from the database + string query = "SELECT UNIQUE value FROM data WHERE key=\"dat\""; + using (SqliteConnection dbc = new SqliteConnection(_connectionString)) + { + using (SqliteCommand slc = new SqliteCommand(query, dbc)) + { + using (SqliteDataReader sldr = slc.ExecuteReader()) + { + if (sldr.HasRows) + { + sldr.Read(); + string hash = sldr.GetString(0); + if (!databaseDats.Contains(hash)) + { + databaseDats.Add(hash); + } + } + } + } + + // Now create a Dictionary of dats to parse from what's not in the database (SHA-1, Path) + Dictionary toscan = new Dictionary(); + + // Loop through the datroot and add only needed files + foreach (string file in Directory.EnumerateFiles(_dats, "*", SearchOption.AllDirectories)) + { + Rom dat = FileTools.GetSingleFileInfo(file); + + // If the Dat isn't in the database and isn't already accounted for in the DatRoot, add it + if (!databaseDats.Contains(dat.HashData.SHA1) && !toscan.ContainsKey(dat.HashData.SHA1)) + { + toscan.Add(dat.HashData.SHA1, Path.GetFullPath(file)); + } + + // If the Dat is in the database already, remove it to find stragglers + else if (databaseDats.Contains(dat.HashData.SHA1)) + { + databaseDats.Remove(dat.HashData.SHA1); + } + } + + // Loop through the Dictionary and add all data + foreach (string key in toscan.Keys) + { + // Parse the Dat if possible + Dat tempdat = new Dat(); + tempdat = DatTools.Parse(toscan[key], 0, 0, tempdat, _logger); + + // If the Dat wasn't empty, add the information + if (tempdat.Files.Count != 0) + { + // Loop through the parsed entries + foreach (string romkey in tempdat.Files.Keys) + { + foreach (Rom rom in tempdat.Files[romkey]) + { + query = "SELECT id FROM data WHERE key=\"size\" AND value=\"" + rom.HashData.Size + "\" AND (" + + "(key=\"crc\" AND (value=\"" + rom.HashData.CRC + "\" OR value=\"null\"))" + + "AND (key=\"md5\" AND value=\"" + rom.HashData.MD5 + "\" OR value=\"null\"))" + + "AND (key=\"sha1\" AND value=\"" + rom.HashData.SHA1 + "\" OR value=\"null\")))"; + using (SqliteCommand slc = new SqliteCommand(query, dbc)) + { + using (SqliteDataReader sldr = slc.ExecuteReader()) + { + // If the hash exists in the database, add the dat hash for that id + if (sldr.HasRows) + { + sldr.Read(); + string id = sldr.GetString(0); + + string squery = "INSERT INTO data (id, key, value) VALUES (\"" + id + "\", \"dat\", \"" + key + "\")"; + using (SqliteCommand sslc = new SqliteCommand(squery, dbc)) + { + sslc.ExecuteNonQuery(); + } + } + + // If it doesn't exist, add the hash and the dat hash for a new id + else + { + string squery = "INSERT INTO data (key, value) VALUES (\"size\", \"" + rom.HashData.Size + "\")"; + using (SqliteCommand sslc = new SqliteCommand(squery, dbc)) + { + sslc.ExecuteNonQuery(); + } + + long id = -1; + + squery = "SELECT last_insertConstants.Rowid()"; + using (SqliteCommand sslc = new SqliteCommand(squery, dbc)) + { + id = (long)sslc.ExecuteScalar(); + } + + squery = "INSERT INTO data (id, key, value) VALUES (\"" + id + "\", \"crc\", \"" + rom.HashData.CRC + "\")," + + " (\"" + id + "\", \"md5\", \"" + rom.HashData.MD5 + "\")," + + " (\"" + id + "\", \"sha1\", \"" + rom.HashData.SHA1 + "\")," + + " (\"" + id + "\", \"dat\", \"" + key + "\")," + + " (\"" + id + "\", \"exists\", \"false\")"; + using (SqliteCommand sslc = new SqliteCommand(squery, dbc)) + { + sslc.ExecuteNonQuery(); + } + } + } + } + } + } + } + } + + // Now loop through and remove all references to old Dats + // TODO: Remove orphaned files as well + foreach (string dathash in databaseDats) + { + query = "DELETE FROM data WHERE key=\"dat\" AND value=\"" + dathash + "\""; + using (SqliteCommand slc = new SqliteCommand(query, dbc)) + { + slc.ExecuteNonQuery(); + } + } + } + } + + #endregion + } +} diff --git a/RombaSharp/Partials/RombaSharp_Inits.cs b/RombaSharp/Partials/RombaSharp_Inits.cs new file mode 100644 index 00000000..8946cb3a --- /dev/null +++ b/RombaSharp/Partials/RombaSharp_Inits.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SabreTools +{ + public partial class RombaSharp + { + #region Init Methods + + private static void InitArchive(List inputs, bool onlyNeeded) + { + _logger.User("This feature is not yet implemented: archive"); + } + + private static void InitBuild(List inputs) + { + _logger.User("This feature is not yet implemented: build"); + } + + private static void InitDiffDat(string newdat) + { + _logger.User("This feature is not yet implemented: diffdat"); + } + + private static void InitDir2Dat(List inputs) + { + _logger.User("This feature is not yet implemented: dir2dat"); + } + + private static void InitFixdat(List inputs) + { + _logger.User("This feature is not yet implemented: fixdat"); + } + + private static void InitLookup(List inputs) + { + _logger.User("This feature is not yet implemented: lookup"); + } + + private static void InitMiss(List inputs) + { + _logger.User("This feature is not yet implemented: miss"); + } + + private static void InitPurgeBackup() + { + _logger.User("This feature is not yet implemented: purge-backup"); + } + + private static void InitPurgeDelete() + { + _logger.User("This feature is not yet implemented: purge-delete"); + } + + #endregion + } +} diff --git a/RombaSharp/RombaSharp.cs b/RombaSharp/RombaSharp.cs index 9b17d875..0c269e20 100644 --- a/RombaSharp/RombaSharp.cs +++ b/RombaSharp/RombaSharp.cs @@ -1,8 +1,6 @@ -using Mono.Data.Sqlite; -using System; +using System; using System.Collections.Generic; using System.IO; -using System.Xml; using SabreTools.Helper; namespace SabreTools @@ -10,50 +8,43 @@ namespace SabreTools /// /// Entry class for the RombaSharp application /// - public class RombaSharp + public partial class RombaSharp { // General settings - private int _workers; //Number of parallel threads - private string _logdir; //Log folder location - private string _tmpdir; //Temp folder location - private string _webdir; // Web frontend location - private string _baddir; // Fail-to-unpack file folder location - private int _verbosity; // Verbosity of the output - private int _cores; // Forced CPU cores + private static int _workers; //Number of parallel threads + private static string _logdir; //Log folder location + private static string _tmpdir; //Temp folder location + private static string _webdir; // Web frontend location + private static string _baddir; // Fail-to-unpack file folder location + private static int _verbosity; // Verbosity of the output + private static int _cores; // Forced CPU cores // DatRoot settings - private string _dats; // DatRoot folder location - private string _db; // Database name + private static string _dats; // DatRoot folder location + private static string _db; // Database name // Depot settings - private Dictionary> _depots; // Folder location, Max size + private static Dictionary> _depots; // Folder location, Max size // Server settings - private int _port; // Web server port + private static int _port; // Web server port // Other private variables - private string _config = "config.xml"; - private string _dbSchema = "rombasharp"; - private string _connectionString; - private Logger _logger; + private static string _config = "config.xml"; + private static string _dbSchema = "rombasharp"; + private static string _connectionString; + private static Logger _logger; /// - /// Create a new RombaSharp object + /// Entry class for the RombaSharp application /// - /// Logger object for file and console output - public RombaSharp(Logger logger) - { - _logger = logger; - - InitializeConfiguration(); - DBTools.EnsureDatabase(_dbSchema, _db, _connectionString); - } - public static void Main(string[] args) { // Perform initial setup and verification - Logger logger = new Logger(true, "romba.log"); - logger.Start(); + _logger = new Logger(true, "romba.log"); + _logger.Start(); + InitializeConfiguration(); + DBTools.EnsureDatabase(_dbSchema, _db, _connectionString); // If output is being redirected, don't allow clear screens if (!Console.IsOutputRedirected) @@ -65,7 +56,7 @@ namespace SabreTools if ((new List(args)).Contains("--credits")) { Build.Credits(); - logger.Close(); + _logger.Close(); return; } @@ -73,7 +64,7 @@ namespace SabreTools if (args.Length == 0) { Build.Help(); - logger.Close(); + _logger.Close(); return; } @@ -93,7 +84,6 @@ namespace SabreTools purgeBackup = false, purgeDelete = false, refreshDats = false, - rombaSharp = true, shutdown = false; string newdat ="", outdat = ""; @@ -170,12 +160,12 @@ namespace SabreTools onlyNeeded = false; break; default: - logger.Error("Invalid value detected: " + temp); + _logger.Error("Invalid value detected: " + temp); Console.WriteLine(); Build.Help(); Console.WriteLine(); - logger.Error("Invalid value detected: " + temp); - logger.Close(); + _logger.Error("Invalid value detected: " + temp); + _logger.Close(); return; } } @@ -189,12 +179,12 @@ namespace SabreTools } else { - logger.Error("Invalid input detected: " + arg); + _logger.Error("Invalid input detected: " + arg); Console.WriteLine(); Build.Help(); Console.WriteLine(); - logger.Error("Invalid input detected: " + arg); - logger.Close(); + _logger.Error("Invalid input detected: " + arg); + _logger.Close(); return; } break; @@ -205,7 +195,7 @@ namespace SabreTools if (help) { Build.Help(); - logger.Close(); + _logger.Close(); return; } @@ -213,18 +203,18 @@ namespace SabreTools if (!(archive ^ build ^ dbstats ^ diffdat ^ dir2dat ^ fixdat ^ lookup ^ memstats ^ miss ^ progress ^ purgeBackup ^ purgeDelete ^ refreshDats ^ shutdown)) { - logger.Error("Only one feature switch is allowed at a time"); + _logger.Error("Only one feature switch is allowed at a time"); Build.Help(); - logger.Close(); + _logger.Close(); return; } // If a switch that requires a filename is set and no file is, show the help screen if (inputs.Count == 0 && (archive || build || dir2dat || fixdat || lookup || miss)) { - logger.Error("This feature requires at least one input"); + _logger.Error("This feature requires at least one input"); Build.Help(); - logger.Close(); + _logger.Close(); return; } @@ -233,73 +223,73 @@ namespace SabreTools // Adds ROM files from the specified directories to the ROM archive if (archive) { - logger.User("This feature is not yet implemented!"); + InitArchive(inputs, onlyNeeded); } // For each specified DAT file it creates the torrentzip files else if (build) { - logger.User("This feature is not yet implemented!"); + InitBuild(inputs); } // Prints db stats else if (dbstats) { - logger.User("This feature is not yet implemented!"); + DisplayDBStats(); } // Creates a DAT file with those entries that are in new DAT else if (diffdat) { - logger.User("This feature is not yet implemented!"); + InitDiffDat(newdat); } // Creates a DAT file for the specified input directory else if (dir2dat) { - + InitDir2Dat(inputs); } // For each specified DAT file it creates a fix DAT else if (fixdat) { - logger.User("This feature is not yet implemented!"); + InitFixdat(inputs); } // For each specified hash it looks up any available information else if (lookup) { - logger.User("This feature is not yet implemented!"); + InitLookup(inputs); } // Prints memory stats else if (memstats) { - logger.User("This feature is not yet implemented!"); + DisplayMemoryStats(); } // For each specified DAT file it creates a miss file and a have file else if (miss) { - logger.User("This feature is not yet implemented!"); + InitMiss(inputs); } // Shows progress of the currently running command else if (progress) { - logger.User("This feature is not yet implemented!"); + _logger.User("This feature is not yet implemented!"); } // Moves DAT index entries for orphaned DATs else if (purgeBackup) { - logger.User("This feature is not yet implemented!"); + InitPurgeBackup(); } // Deletes DAT index entries for orphaned DATs else if (purgeDelete) { - logger.User("This feature is not yet implemented!"); + InitPurgeDelete(); } // Refreshes the DAT index from the files in the DAT master directory tree @@ -311,7 +301,7 @@ namespace SabreTools // Gracefully shuts down server else if (shutdown) { - logger.User("This feature is not yet implemented!"); + _logger.User("This feature is not yet implemented!"); } // If nothing is set, show the help @@ -320,407 +310,8 @@ namespace SabreTools Build.Help(); } - logger.Close(); + _logger.Close(); return; } - - /// - /// Initialize the Romba application from XML config - /// - private static void InitializeConfiguration() - { - // Get default values if they're not written - int workers = 4, - verbosity = 1, - cores = 4, - port = 4003; - string logdir = "logs", - tmpdir = "tmp", - webdir = "web", - baddir = "bad", - dats = "dats", - db = "db", - connectionString = ""; - Dictionary> depots = new Dictionary>(); - - // Get the XML text reader for the configuration file, if possible - XmlTextReader xtr = DatTools.GetXmlTextReader(_config, _logger); - - /* XML file structure - - - - 4 - logs - tmp - web - bad - 1 - 4 - - - dats - db - - - - depot - 40000 - true - - - - 4003 - - - - */ - - // Now parse the XML file for settings - if (xtr != null) - { - xtr.MoveToContent(); - while (!xtr.EOF) - { - // We only want elements - if (xtr.NodeType != XmlNodeType.Element) - { - xtr.Read(); - continue; - } - - switch (xtr.Name) - { - case "workers": - workers = xtr.ReadElementContentAsInt(); - break; - case "logdir": - logdir = xtr.ReadElementContentAsString(); - break; - case "tmpdir": - tmpdir = xtr.ReadElementContentAsString(); - break; - case "webdir": - webdir = xtr.ReadElementContentAsString(); - break; - case "baddir": - baddir = xtr.ReadElementContentAsString(); - break; - case "verbosity": - verbosity = xtr.ReadElementContentAsInt(); - break; - case "cores": - cores = xtr.ReadElementContentAsInt(); - break; - case "dats": - dats = xtr.ReadElementContentAsString(); - break; - case "db": - db = xtr.ReadElementContentAsString(); - break; - case "depot": - XmlReader subreader = xtr.ReadSubtree(); - if (subreader != null) - { - string root = ""; - long maxsize = -1; - bool online = true; - - while (!subreader.EOF) - { - // We only want elements - if (subreader.NodeType != XmlNodeType.Element) - { - subreader.Read(); - continue; - } - - switch (subreader.Name) - { - case "root": - root = subreader.ReadElementContentAsString(); - break; - case "maxsize": - maxsize = subreader.ReadElementContentAsLong(); - break; - case "online": - online = subreader.ReadElementContentAsBoolean(); - break; - default: - subreader.Read(); - break; - } - } - - try - { - depots.Add(root, new Tuple(maxsize, online)); - } - catch - { - // Ignore add errors - } - } - - xtr.Skip(); - break; - case "port": - port = xtr.ReadElementContentAsInt(); - break; - default: - xtr.Read(); - break; - } - } - } - - // Now validate the values given - if (workers < 1) - { - workers = 1; - } - if (workers > 8) - { - workers = 8; - } - if (!Directory.Exists(logdir)) - { - Directory.CreateDirectory(logdir); - } - if (!Directory.Exists(tmpdir)) - { - Directory.CreateDirectory(tmpdir); - } - if (!Directory.Exists(webdir)) - { - Directory.CreateDirectory(webdir); - } - if (!Directory.Exists(baddir)) - { - Directory.CreateDirectory(baddir); - } - if (verbosity < 0) - { - verbosity = 0; - } - if (verbosity > 3) - { - verbosity = 3; - } - if (cores < 1) - { - cores = 1; - } - if (cores > 16) - { - cores = 16; - } - if (!Directory.Exists(dats)) - { - Directory.CreateDirectory(dats); - } - db = Path.GetFileNameWithoutExtension(db) + ".sqlite"; - connectionString = "Data Source=" + _db + ";Version = 3;"; - foreach (string key in depots.Keys) - { - if (!Directory.Exists(key)) - { - Directory.CreateDirectory(key); - File.CreateText(Path.Combine(key, ".romba_size")); - File.CreateText(Path.Combine(key, ".romba_size.backup")); - } - else - { - if (!File.Exists(Path.Combine(key, ".romba_size"))) - { - File.CreateText(Path.Combine(key, ".romba_size")); - } - if (!File.Exists(Path.Combine(key, ".romba_size.backup"))) - { - File.CreateText(Path.Combine(key, ".romba_size.backup")); - } - } - } - if (port < 0) - { - port = 0; - } - if (port > 65535) - { - port = 65535; - } - - // Finally set all of the fields - _workers = workers; - _logdir = logdir; - _tmpdir = tmpdir; - _webdir = webdir; - _baddir = baddir; - _verbosity = verbosity; - _cores = cores; - _dats = dats; - _db = db; - _connectionString = connectionString; - _depots = depots; - _port = port; - } - - /// - /// Populate or refresh the database information - /// - /// Each hash has the following attributes: size, crc, md5, sha-1, dathash, existss - private static void RefreshDatabase() - { - // Make sure the db is set - if (String.IsNullOrEmpty(_db)) - { - _db = "db.sqlite"; - _connectionString = "Data Source=" + _db + ";Version = 3;"; - } - - // Make sure the file exists - if (!File.Exists(_db)) - { - DBTools.EnsureDatabase(_dbSchema, _db, _connectionString); - } - - // Make sure the dats dir is set - if (String.IsNullOrEmpty(_dats)) - { - _dats = "dats"; - } - - // Make sure the folder exists - if (!Directory.Exists(_dats)) - { - Directory.CreateDirectory(_dats); - } - - // Create a List of dat hashes in the database (SHA-1) - List databaseDats = new List(); - - // Populate the List from the database - string query = "SELECT UNIQUE value FROM data WHERE key=\"dat\""; - using (SqliteConnection dbc = new SqliteConnection(_connectionString)) - { - using (SqliteCommand slc = new SqliteCommand(query, dbc)) - { - using (SqliteDataReader sldr = slc.ExecuteReader()) - { - if (sldr.HasRows) - { - sldr.Read(); - string hash = sldr.GetString(0); - if (!databaseDats.Contains(hash)) - { - databaseDats.Add(hash); - } - } - } - } - - // Now create a Dictionary of dats to parse from what's not in the database (SHA-1, Path) - Dictionary toscan = new Dictionary(); - - // Loop through the datroot and add only needed files - foreach (string file in Directory.EnumerateFiles(_dats, "*", SearchOption.AllDirectories)) - { - Rom dat = FileTools.GetSingleFileInfo(file); - - // If the Dat isn't in the database and isn't already accounted for in the DatRoot, add it - if (!databaseDats.Contains(dat.HashData.SHA1) && !toscan.ContainsKey(dat.HashData.SHA1)) - { - toscan.Add(dat.HashData.SHA1, Path.GetFullPath(file)); - } - - // If the Dat is in the database already, remove it to find stragglers - else if (databaseDats.Contains(dat.HashData.SHA1)) - { - databaseDats.Remove(dat.HashData.SHA1); - } - } - - // Loop through the Dictionary and add all data - foreach (string key in toscan.Keys) - { - // Parse the Dat if possible - Dat tempdat = new Dat(); - tempdat = DatTools.Parse(toscan[key], 0, 0, tempdat, _logger); - - // If the Dat wasn't empty, add the information - if (tempdat.Files.Count != 0) - { - // Loop through the parsed entries - foreach (string romkey in tempdat.Files.Keys) - { - foreach (Rom rom in tempdat.Files[romkey]) - { - query = "SELECT id FROM data WHERE key=\"size\" AND value=\"" + rom.HashData.Size + "\" AND (" - + "(key=\"crc\" AND (value=\"" + rom.HashData.CRC + "\" OR value=\"null\"))" - + "AND (key=\"md5\" AND value=\"" + rom.HashData.MD5 + "\" OR value=\"null\"))" - + "AND (key=\"sha1\" AND value=\"" + rom.HashData.SHA1 + "\" OR value=\"null\")))"; - using (SqliteCommand slc = new SqliteCommand(query, dbc)) - { - using (SqliteDataReader sldr = slc.ExecuteReader()) - { - // If the hash exists in the database, add the dat hash for that id - if (sldr.HasRows) - { - sldr.Read(); - string id = sldr.GetString(0); - - string squery = "INSERT INTO data (id, key, value) VALUES (\"" + id + "\", \"dat\", \"" + key + "\")"; - using (SqliteCommand sslc = new SqliteCommand(squery, dbc)) - { - sslc.ExecuteNonQuery(); - } - } - - // If it doesn't exist, add the hash and the dat hash for a new id - else - { - string squery = "INSERT INTO data (key, value) VALUES (\"size\", \"" + rom.HashData.Size + "\")"; - using (SqliteCommand sslc = new SqliteCommand(squery, dbc)) - { - sslc.ExecuteNonQuery(); - } - - long id = -1; - - squery = "SELECT last_insertConstants.Rowid()"; - using (SqliteCommand sslc = new SqliteCommand(squery, dbc)) - { - id = (long)sslc.ExecuteScalar(); - } - - squery = "INSERT INTO data (id, key, value) VALUES (\"" + id + "\", \"crc\", \"" + rom.HashData.CRC + "\")," - + " (\"" + id + "\", \"md5\", \"" + rom.HashData.MD5 + "\")," - + " (\"" + id + "\", \"sha1\", \"" + rom.HashData.SHA1 + "\")," - + " (\"" + id + "\", \"dat\", \"" + key + "\")," - + " (\"" + id + "\", \"exists\", \"false\")"; - using (SqliteCommand sslc = new SqliteCommand(squery, dbc)) - { - sslc.ExecuteNonQuery(); - } - } - } - } - } - } - } - } - - // Now loop through and remove all references to old Dats - // TODO: Remove orphaned files as well - foreach (string dathash in databaseDats) - { - query = "DELETE FROM data WHERE key=\"dat\" AND value=\"" + dathash + "\""; - using (SqliteCommand slc = new SqliteCommand(query, dbc)) - { - slc.ExecuteNonQuery(); - } - } - } - } } } diff --git a/RombaSharp/RombaSharp.csproj b/RombaSharp/RombaSharp.csproj index 34c080e8..d79e9a28 100644 --- a/RombaSharp/RombaSharp.csproj +++ b/RombaSharp/RombaSharp.csproj @@ -76,6 +76,8 @@ + +