diff --git a/RombaSharp/Partials/RombaSharp.Helpers.cs b/RombaSharp/Partials/RombaSharp.Helpers.cs index a3f8b1d1..2bd84df1 100644 --- a/RombaSharp/Partials/RombaSharp.Helpers.cs +++ b/RombaSharp/Partials/RombaSharp.Helpers.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Xml; using Mono.Data.Sqlite; +using SabreTools.Library; using SabreTools.Library.Data; using SabreTools.Library.Dats; using SabreTools.Library.Tools; @@ -414,8 +415,7 @@ namespace RombaSharp dbc.Open(); // Populate the List from the database - Globals.Logger.User("Populating the list of existing DATs"); - DateTime start = DateTime.Now; + InternalStopwatch watch = new InternalStopwatch("Populating the list of existing DATs"); string query = "SELECT DISTINCT hash FROM dat"; SqliteCommand slc = new SqliteCommand(query, dbc); @@ -436,14 +436,13 @@ namespace RombaSharp } datroot.BucketBy(SortedBy.Game, DedupeType.None, norename: true); - Globals.Logger.User("Populating complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + watch.Stop(); slc.Dispose(); sldr.Dispose(); // Loop through the Dictionary and add all data - Globals.Logger.User("Adding new DAT information"); - start = DateTime.Now; + watch.Start("Adding new DAT information"); foreach (string key in datroot.Keys) { foreach (Rom value in datroot[key]) @@ -452,11 +451,10 @@ namespace RombaSharp } } - Globals.Logger.User("Adding complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + watch.Stop(); // Now loop through and remove all references to old Dats - Globals.Logger.User("Removing unmatched DAT information"); - start = DateTime.Now; + watch.Start("Removing unmatched DAT information"); foreach (string dathash in unneeded) { @@ -465,7 +463,8 @@ namespace RombaSharp slc.ExecuteNonQuery(); slc.Dispose(); } - Globals.Logger.User("Removing complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + + watch.Stop(); dbc.Dispose(); } diff --git a/SabreTools.Library/Dats/Partials/DatFile.ConvertUpdate.cs b/SabreTools.Library/Dats/Partials/DatFile.ConvertUpdate.cs index 84c2d4b7..6c4713bf 100644 --- a/SabreTools.Library/Dats/Partials/DatFile.ConvertUpdate.cs +++ b/SabreTools.Library/Dats/Partials/DatFile.ConvertUpdate.cs @@ -108,8 +108,7 @@ namespace SabreTools.Library.Dats string outDir, Filter filter, SplitType splitType, bool trim, bool single, string root) { DatFile[] datHeaders = new DatFile[inputs.Count]; - DateTime start = DateTime.Now; - Globals.Logger.User("Processing individual DATs"); + InternalStopwatch watch = new InternalStopwatch("Processing individual DATs"); // Parse all of the DATs into their own DatFiles in the array Parallel.For(0, inputs.Count, Globals.ParallelOptions, i => @@ -125,9 +124,9 @@ namespace SabreTools.Library.Dats datHeaders[i].Parse(input.Split('¬')[0], i, 0, splitType, keep: true, clean: clean, remUnicode: remUnicode, descAsName: descAsName); }); - Globals.Logger.User("Processing complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + watch.Stop(); - Globals.Logger.User("Populating internal DAT"); + watch.Start("Populating internal DAT"); Parallel.For(0, inputs.Count, Globals.ParallelOptions, i => { // Get the list of keys from the DAT @@ -148,7 +147,7 @@ namespace SabreTools.Library.Dats // Now that we have a merged DAT, filter it Filter(filter, single, trim, root); - Globals.Logger.User("Processing and populating complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + watch.Stop(); return datHeaders.ToList(); } @@ -172,8 +171,7 @@ namespace SabreTools.Library.Dats bool descAsName, Filter filter, SplitType splitType, bool trim, bool single, string root) { // First we want to parse all of the base DATs into the input - DateTime start = DateTime.Now; - Globals.Logger.User("Populating base DAT for comparison..."); + InternalStopwatch watch = new InternalStopwatch("Populating base DAT for comparison..."); List baseFileNames = FileTools.GetOnlyFilesFromInputs(basePaths); Parallel.ForEach(baseFileNames, Globals.ParallelOptions, path => @@ -181,7 +179,7 @@ namespace SabreTools.Library.Dats Parse(path, 0, 0, keep: true, clean: clean, remUnicode: remUnicode, descAsName: descAsName); }); - Globals.Logger.User("Populating base DAT complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + watch.Stop(); // For comparison's sake, we want to use CRC as the base ordering BucketBy(SortedBy.CRC, DedupeType.Full); @@ -260,8 +258,7 @@ namespace SabreTools.Library.Dats List outDats = new List(); // Loop through each of the inputs and get or create a new DatData object - DateTime start = DateTime.Now; - Globals.Logger.User("Initializing all output DATs"); + InternalStopwatch watch = new InternalStopwatch("Initializing all output DATs"); DatFile[] outDatsArray = new DatFile[inputs.Count]; @@ -288,11 +285,10 @@ namespace SabreTools.Library.Dats }); outDats = outDatsArray.ToList(); - Globals.Logger.User("Initializing complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + watch.Stop(); // Now, loop through the dictionary and populate the correct DATs - start = DateTime.Now; - Globals.Logger.User("Populating all output DATs"); + watch.Start("Populating all output DATs"); List keys = Keys.ToList(); Parallel.ForEach(keys, Globals.ParallelOptions, key => @@ -317,12 +313,11 @@ namespace SabreTools.Library.Dats outDats[item.SystemID].Add(key, item); } }); - - Globals.Logger.User("Populating complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + + watch.Stop(); // Finally, loop through and output each of the DATs - start = DateTime.Now; - Globals.Logger.User("Outputting all created DATs"); + watch.Start("Outputting all created DATs"); Parallel.For((skip ? 1 : 0), inputs.Count, Globals.ParallelOptions, j => { @@ -344,7 +339,7 @@ namespace SabreTools.Library.Dats outDats[j].WriteToFile(path); }); - Globals.Logger.User("Outputting complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + watch.Stop(); } /// @@ -355,8 +350,7 @@ namespace SabreTools.Library.Dats /// List of inputs to write out from public void DiffNoCascade(DiffMode diff, string outDir, List inputs) { - DateTime start = DateTime.Now; - Globals.Logger.User("Initializing all output DATs"); + InternalStopwatch watch = new InternalStopwatch("Initializing all output DATs"); // Default vars for use string post = ""; @@ -420,11 +414,11 @@ namespace SabreTools.Library.Dats outDats = outDatsArray.ToList(); } - Globals.Logger.User("Initializing complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + + watch.Stop(); // Now, loop through the dictionary and populate the correct DATs - start = DateTime.Now; - Globals.Logger.User("Populating all output DATs"); + watch.Start("Populating all output DATs"); List keys = Keys.ToList(); Parallel.ForEach(keys, Globals.ParallelOptions, key => @@ -476,11 +470,10 @@ namespace SabreTools.Library.Dats } }); - Globals.Logger.User("Populating complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + watch.Stop(); // Finally, loop through and output each of the DATs - start = DateTime.Now; - Globals.Logger.User("Outputting all created DATs"); + watch.Start("Outputting all created DATs"); // Output the difflist (a-b)+(b-a) diff if ((diff & DiffMode.NoDupes) != 0) @@ -510,7 +503,8 @@ namespace SabreTools.Library.Dats outDats[j].WriteToFile(path); }); } - Globals.Logger.User("Outputting complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + + watch.Stop(); } /// diff --git a/SabreTools.Library/Dats/Partials/DatFile.Manipulate.cs b/SabreTools.Library/Dats/Partials/DatFile.Manipulate.cs index 02a10d5c..1e68f91d 100644 --- a/SabreTools.Library/Dats/Partials/DatFile.Manipulate.cs +++ b/SabreTools.Library/Dats/Partials/DatFile.Manipulate.cs @@ -1038,7 +1038,7 @@ namespace SabreTools.Library.Dats } } -#endregion + #endregion #endregion // Instance Methods } diff --git a/SabreTools.Library/Dats/Partials/DatFile.Rebuild.cs b/SabreTools.Library/Dats/Partials/DatFile.Rebuild.cs index bcb1bb7b..25a52c57 100644 --- a/SabreTools.Library/Dats/Partials/DatFile.Rebuild.cs +++ b/SabreTools.Library/Dats/Partials/DatFile.Rebuild.cs @@ -97,34 +97,36 @@ namespace SabreTools.Library.Dats #region Rebuild from depots in order + string format = ""; switch (outputFormat) { case OutputFormat.Folder: - Globals.Logger.User("Rebuilding all files to directory"); + format = "directory"; break; case OutputFormat.TapeArchive: - Globals.Logger.User("Rebuilding all files to TAR"); + format = "TAR"; break; case OutputFormat.Torrent7Zip: - Globals.Logger.User("Rebuilding all files to Torrent7Z"); + format = "Torrent7Z"; break; case OutputFormat.TorrentGzip: - Globals.Logger.User("Rebuilding all files to TorrentGZ"); + format = "TorrentGZ"; break; case OutputFormat.TorrentLrzip: - Globals.Logger.User("Rebuilding all files to TorrentLRZ"); + format = "TorrentLRZ"; break; case OutputFormat.TorrentRar: - Globals.Logger.User("Rebuilding all files to TorrentRAR"); + format = "TorrentRAR"; break; case OutputFormat.TorrentXZ: - Globals.Logger.User("Rebuilding all files to TorrentXZ"); + format = "TorrentXZ"; break; case OutputFormat.TorrentZip: - Globals.Logger.User("Rebuilding all files to TorrentZip"); + format = "TorrentZip"; break; } - DateTime start = DateTime.Now; + + InternalStopwatch watch = new InternalStopwatch("Rebuilding all files to {0}", format); // Now loop through and get only directories from the input paths List directories = new List(); @@ -196,7 +198,7 @@ namespace SabreTools.Library.Dats updateDat, false /* isZip */, headerToCheckAgainst); } - Globals.Logger.User("Rebuilding complete in: {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + watch.Stop(); #endregion @@ -287,34 +289,36 @@ namespace SabreTools.Library.Dats #region Rebuild from sources in order + string format = ""; switch (outputFormat) { case OutputFormat.Folder: - Globals.Logger.User("Rebuilding all files to directory"); + format = "directory"; break; case OutputFormat.TapeArchive: - Globals.Logger.User("Rebuilding all files to TAR"); + format = "TAR"; break; case OutputFormat.Torrent7Zip: - Globals.Logger.User("Rebuilding all files to Torrent7Z"); + format = "Torrent7Z"; break; case OutputFormat.TorrentGzip: - Globals.Logger.User("Rebuilding all files to TorrentGZ"); + format = "TorrentGZ"; break; case OutputFormat.TorrentLrzip: - Globals.Logger.User("Rebuilding all files to TorrentLRZ"); + format = "TorrentLRZ"; break; case OutputFormat.TorrentRar: - Globals.Logger.User("Rebuilding all files to TorrentRAR"); + format = "TorrentRAR"; break; case OutputFormat.TorrentXZ: - Globals.Logger.User("Rebuilding all files to TorrentXZ"); + format = "TorrentXZ"; break; case OutputFormat.TorrentZip: - Globals.Logger.User("Rebuilding all files to TorrentZip"); + format = "TorrentZip"; break; } - DateTime start = DateTime.Now; + + InternalStopwatch watch = new InternalStopwatch("Rebuilding all files to {0}", format); // Now loop through all of the files in all of the inputs foreach (string input in inputs) @@ -340,7 +344,7 @@ namespace SabreTools.Library.Dats } } - Globals.Logger.User("Rebuilding complete in: {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + watch.Stop(); #endregion @@ -862,8 +866,7 @@ namespace SabreTools.Library.Dats bool success = true; - Globals.Logger.User("Verifying all from supplied depots"); - DateTime start = DateTime.Now; + InternalStopwatch watch = new InternalStopwatch("Verifying all from supplied depots"); // Now loop through and get only directories from the input paths List directories = new List(); @@ -931,7 +934,7 @@ namespace SabreTools.Library.Dats fileinfo.GetDuplicates(this, remove: true); } - Globals.Logger.User("Verifying complete in: {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + watch.Stop(); // If there are any entries in the DAT, output to the rebuild directory _fileName = "fixDAT_" + _fileName; diff --git a/SabreTools.Library/InternalStopwatch.cs b/SabreTools.Library/InternalStopwatch.cs new file mode 100644 index 00000000..3db78229 --- /dev/null +++ b/SabreTools.Library/InternalStopwatch.cs @@ -0,0 +1,82 @@ +using System; + +using SabreTools.Library.Data; + +namespace SabreTools.Library +{ + /// + /// Stopwatch class for keeping track of duration in the code + /// + public class InternalStopwatch + { + private string _subject; + private DateTime _startTime; + + /// + /// Constructor that initalizes the stopwatch + /// + public InternalStopwatch() + { + _subject = ""; + } + + /// + /// Constructor that initalizes the stopwatch with a subject and starts immediately + /// + /// Subject of the stopwatch + public InternalStopwatch(string subject) + { + _subject = subject; + Start(); + } + + /// + /// Constructor that initalizes the stopwatch with a subject and starts immediately + /// + /// Subject of the stopwatch + /// Parameters to format the string + public InternalStopwatch(string subject, params object[] more) + { + _subject = string.Format(subject, more); + Start(); + } + + /// + /// Start the stopwatch and display subject text + /// + public void Start() + { + _startTime = DateTime.Now; + Globals.Logger.User("{0}...", _subject); + } + + /// + /// Start the stopwatch and display subject text + /// + /// Text to show on stopwatch start + public void Start(string subject) + { + _subject = subject; + Start(); + } + + /// + /// Start the stopwatch and display subject text + /// + /// Text to show on stopwatch start + /// Parameters to format the string + public void Start(string subject, params object[] more) + { + _subject = string.Format(subject, more); + Start(); + } + + /// + /// End the stopwatch and display subject text + /// + public void Stop() + { + Globals.Logger.User("{0} completed in {1}", _subject, DateTime.Now.Subtract(_startTime).ToString(@"hh\:mm\:ss\.fffff")); + } + } +} diff --git a/SabreTools.Library/SabreTools.Library.csproj b/SabreTools.Library/SabreTools.Library.csproj index fc75f33f..daa8f468 100644 --- a/SabreTools.Library/SabreTools.Library.csproj +++ b/SabreTools.Library/SabreTools.Library.csproj @@ -159,6 +159,7 @@ + diff --git a/SabreTools/Partials/SabreTools.Inits.cs b/SabreTools/Partials/SabreTools.Inits.cs index e625beaf..055cf48c 100644 --- a/SabreTools/Partials/SabreTools.Inits.cs +++ b/SabreTools/Partials/SabreTools.Inits.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; +using SabreTools.Library; using SabreTools.Library.Data; using SabreTools.Library.Dats; using SabreTools.Library.Tools; @@ -340,8 +341,7 @@ namespace SabreTools // Get a list of files from the input datfiles datfiles = FileTools.GetOnlyFilesFromInputs(datfiles); - DateTime start = DateTime.Now; - Globals.Logger.User("Populating internal DAT..."); + InternalStopwatch watch = new InternalStopwatch("Populating internal DAT"); // Add all of the input DATs into one huge internal DAT DatFile datdata = new DatFile(); @@ -349,7 +349,8 @@ namespace SabreTools { datdata.Parse(datfile, 99, 99, splitType, keep: true, useTags: true); } - Globals.Logger.User("Populating complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + + watch.Stop(); datdata.RebuildGeneric(inputs, outDir, tempDir, quickScan, date, delete, inverse, outputFormat, romba, asl, updateDat, headerToCheckAgainst); @@ -373,8 +374,7 @@ namespace SabreTools private static void InitSortDepot(List datfiles, List inputs, string outDir, string tempDir, bool date, bool delete, bool inverse, OutputFormat outputFormat, bool romba, bool updateDat, string headerToCheckAgainst, SplitType splitType) { - DateTime start = DateTime.Now; - Globals.Logger.User("Populating internal DAT..."); + InternalStopwatch watch = new InternalStopwatch("Populating internal DAT"); // Get a list of files from the input datfiles datfiles = FileTools.GetOnlyFilesFromInputs(datfiles); @@ -385,7 +385,8 @@ namespace SabreTools { datdata.Parse(datfile, 99, 99, splitType, keep: true, useTags: true); } - Globals.Logger.User("Populating complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + + watch.Stop(); datdata.RebuildDepot(inputs, outDir, tempDir, date, delete, inverse, outputFormat, romba, updateDat, headerToCheckAgainst); @@ -749,8 +750,7 @@ namespace SabreTools // Get a list of files from the input datfiles datfiles = FileTools.GetOnlyFilesFromInputs(datfiles); - DateTime start = DateTime.Now; - Globals.Logger.User("Populating internal DAT..."); + InternalStopwatch watch = new InternalStopwatch("Populating internal DAT"); // Add all of the input DATs into one huge internal DAT DatFile datdata = new DatFile(); @@ -758,7 +758,8 @@ namespace SabreTools { datdata.Parse(datfile, 99, 99, splitType, keep: true, useTags: true); } - Globals.Logger.User("Populating complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + + watch.Stop(); datdata.VerifyGeneric(inputs, tempDir, hashOnly, quickScan, headerToCheckAgainst); } @@ -774,8 +775,7 @@ namespace SabreTools private static void InitVerifyDepot(List datfiles, List inputs, string tempDir, string headerToCheckAgainst, SplitType splitType) { - DateTime start = DateTime.Now; - Globals.Logger.User("Populating internal DAT..."); + InternalStopwatch watch = new InternalStopwatch("Populating internal DAT"); // Get a list of files from the input datfiles datfiles = FileTools.GetOnlyFilesFromInputs(datfiles); @@ -786,7 +786,8 @@ namespace SabreTools { datdata.Parse(datfile, 99, 99, splitType, keep: true, useTags: true); } - Globals.Logger.User("Populating complete in {0}", DateTime.Now.Subtract(start).ToString(@"hh\:mm\:ss\.fffff")); + + watch.Stop(); datdata.VerifyDepot(inputs, tempDir, headerToCheckAgainst); }