diff --git a/.idea/.idea.DiscImageChef/.idea/contentModel.xml b/.idea/.idea.DiscImageChef/.idea/contentModel.xml index 22d626bbe..2c9bb1e67 100644 --- a/.idea/.idea.DiscImageChef/.idea/contentModel.xml +++ b/.idea/.idea.DiscImageChef/.idea/contentModel.xml @@ -56,7 +56,6 @@ - @@ -1147,7 +1146,6 @@ - diff --git a/DiscImageChef.Core/Statistics.cs b/DiscImageChef.Core/Statistics.cs index 121e4599c..adb39ed2b 100644 --- a/DiscImageChef.Core/Statistics.cs +++ b/DiscImageChef.Core/Statistics.cs @@ -60,13 +60,13 @@ namespace DiscImageChef.Core /// static bool submitStatsLock; - static DicContext ctx = new DicContext(); - /// /// Loads saved statistics from disk /// public static void LoadStats() { + DicContext ctx = DicContext.Create(Settings.Settings.DbPath); + if(File.Exists(Path.Combine(Settings.Settings.StatsPath, "Statistics.xml"))) try { @@ -431,10 +431,12 @@ namespace DiscImageChef.Core Version = DetectOS.GetVersion(), Count = 1 }); + ctx.Versions.Add(new Version { Value = CommonTypes.Interop.Version.GetVersion(), Synchronized = false, Count = 1 }); + ctx.SaveChanges(); } /// @@ -442,6 +444,7 @@ namespace DiscImageChef.Core /// public static void SaveStats() { + DicContext ctx = DicContext.Create(Settings.Settings.DbPath); ctx.SaveChanges(); if(Settings.Settings.Current.Stats != null && Settings.Settings.Current.Stats.ShareStats) SubmitStats(); } @@ -453,384 +456,348 @@ namespace DiscImageChef.Core { Thread submitThread = new Thread(() => { - lock(ctx) - if(ctx.Commands.Any(c => !c.Synchronized) || ctx.Filesystems.Any(c => !c.Synchronized) || - ctx.Filters.Any(c => !c.Synchronized) || ctx.MediaFormats.Any(c => !c.Synchronized) || - ctx.Partitions.Any(c => !c.Synchronized) || ctx.Medias.Any(c => !c.Synchronized) || - ctx.SeenDevices.Any(c => !c.Synchronized) || ctx.OperatingSystems.Any(c => !c.Synchronized) || - ctx.Versions.Any(c => !c.Synchronized)) + DicContext ctx = DicContext.Create(Settings.Settings.DbPath); + + if(ctx.Commands.Any(c => !c.Synchronized) || ctx.Filesystems.Any(c => !c.Synchronized) || + ctx.Filters.Any(c => !c.Synchronized) || ctx.MediaFormats.Any(c => !c.Synchronized) || + ctx.Partitions.Any(c => !c.Synchronized) || ctx.Medias.Any(c => !c.Synchronized) || + ctx.SeenDevices.Any(c => !c.Synchronized) || ctx.OperatingSystems.Any(c => !c.Synchronized) || + ctx.Versions.Any(c => !c.Synchronized)) + { + StatsDto dto = new StatsDto(); + + if(ctx.Commands.Any(c => !c.Synchronized)) { - StatsDto dto = new StatsDto(); + dto.Commands = new List(); + foreach(string nvs in ctx.Commands.Where(c => !c.Synchronized).Select(c => c.Name).Distinct()) + dto.Commands.Add(new NameValueStats + { + name = nvs, + Value = ctx.Commands.LongCount(c => !c.Synchronized && + c.Name == nvs) + }); + } + + if(ctx.Filesystems.Any(c => !c.Synchronized)) + { + dto.Filesystems = new List(); + foreach(string nvs in ctx.Filesystems.Where(c => !c.Synchronized).Select(c => c.Name).Distinct() + ) + dto.Filesystems.Add(new NameValueStats + { + name = nvs, + Value = ctx.Filesystems.LongCount(c => !c.Synchronized && + c.Name == nvs) + }); + } + + if(ctx.Filters.Any(c => !c.Synchronized)) + { + dto.Filters = new List(); + foreach(string nvs in ctx.Filters.Where(c => !c.Synchronized).Select(c => c.Name).Distinct()) + dto.Filters.Add(new NameValueStats + { + name = nvs, + Value = ctx.Filters.LongCount(c => !c.Synchronized && c.Name == nvs) + }); + } + + if(ctx.MediaFormats.Any(c => !c.Synchronized)) + { + dto.MediaFormats = new List(); + foreach(string nvs in ctx.Commands.Where(c => !c.Synchronized).Select(c => c.Name).Distinct()) + dto.MediaFormats.Add(new NameValueStats + { + name = nvs, + Value = ctx.MediaFormats.LongCount(c => !c.Synchronized && + c.Name == nvs) + }); + } + + if(ctx.Partitions.Any(c => !c.Synchronized)) + { + dto.Partitions = new List(); + foreach(string nvs in ctx.Partitions.Where(c => !c.Synchronized).Select(c => c.Name).Distinct()) + dto.Partitions.Add(new NameValueStats + { + name = nvs, + Value = ctx.Partitions.LongCount(c => !c.Synchronized && + c.Name == nvs) + }); + } + + if(ctx.Versions.Any(c => !c.Synchronized)) + { + dto.Versions = new List(); + foreach(string nvs in ctx.Versions.Where(c => !c.Synchronized).Select(c => c.Value).Distinct()) + dto.Versions.Add(new NameValueStats + { + name = nvs, + Value = ctx.Versions.LongCount(c => !c.Synchronized && + c.Value == nvs) + }); + } + + if(ctx.Medias.Any(c => !c.Synchronized)) + { + dto.Medias = new List(); + foreach(string media in ctx.Medias.Where(c => !c.Synchronized).Select(c => c.Type).Distinct()) + { + if(ctx.Medias.Any(c => !c.Synchronized && c.Type == media && c.Real)) + dto.Medias.Add(new MediaStats + { + real = true, + type = media, + Value = ctx.Medias.LongCount(c => !c.Synchronized && + c.Type == media && c.Real) + }); + if(ctx.Medias.Any(c => !c.Synchronized && c.Type == media && !c.Real)) + dto.Medias.Add(new MediaStats + { + real = false, + type = media, + Value = ctx.Medias.LongCount(c => !c.Synchronized && + c.Type == media && !c.Real) + }); + } + } + + if(ctx.SeenDevices.Any(c => !c.Synchronized)) + { + dto.Devices = new List(); + foreach(DeviceStat device in ctx.SeenDevices.Where(c => !c.Synchronized)) + dto.Devices.Add(new DeviceStats + { + Bus = device.Bus, + Manufacturer = device.Manufacturer, + ManufacturerSpecified = !(device.Manufacturer is null), + Model = device.Model, + Revision = device.Revision + }); + } + + if(ctx.OperatingSystems.Any(c => !c.Synchronized)) + { + dto.OperatingSystems = new List(); + foreach(string osName in ctx.OperatingSystems.Where(c => !c.Synchronized).Select(c => c.Name) + .Distinct()) + { + foreach(string osVersion in + ctx.OperatingSystems.Where(c => !c.Synchronized && c.Name == osName) + .Select(c => c.Version).Distinct()) + dto.OperatingSystems.Add(new OsStats + { + name = osName, + version = osVersion, + Value = + ctx.OperatingSystems.LongCount(c => + !c + .Synchronized && + c.Name == + osName && + c.Version == + osVersion) + }); + } + } + + try + { + #if DEBUG + System.Console.WriteLine("Uploading statistics"); + #else + DiscImageChef.Console.DicConsole.DebugWriteLine("Submit stats", "Uploading statistics"); + #endif + + MemoryStream jsonStream = new MemoryStream(); + StreamWriter jsonSw = new StreamWriter(jsonStream); + + jsonSw.Write(JsonConvert.SerializeObject(dto, Formatting.Indented, + new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + })); + jsonStream.Seek(0, SeekOrigin.Begin); + WebRequest request = WebRequest.Create("http://discimagechef.claunia.com/api/uploadstatsv2"); + ((HttpWebRequest)request).UserAgent = + $"DiscImageChef {typeof(Version).Assembly.GetName().Version}"; + request.Method = "POST"; + request.ContentLength = jsonStream.Length; + request.ContentType = "application/json"; + Stream reqStream = request.GetRequestStream(); + jsonStream.CopyTo(reqStream); + reqStream.Close(); + WebResponse response = request.GetResponse(); + + if(((HttpWebResponse)response).StatusCode != HttpStatusCode.OK) return; + + Stream data = response.GetResponseStream(); + StreamReader reader = new StreamReader(data ?? throw new InvalidOperationException()); + + reader.ReadToEnd(); + data.Close(); + response.Close(); + jsonSw.Close(); + jsonStream.Close(); if(ctx.Commands.Any(c => !c.Synchronized)) - { - dto.Commands = new List(); - foreach(string nvs in - ctx.Commands.Where(c => !c.Synchronized).Select(c => c.Name).Distinct()) - dto.Commands.Add(new NameValueStats - { - name = nvs, - Value = ctx.Commands.LongCount(c => !c.Synchronized && - c.Name == nvs) - }); - } + foreach(string nvs in ctx.Commands.Where(c => !c.Synchronized).Select(c => c.Name) + .Distinct()) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Synchronized && c.Name == nvs) ?? + new Command {Name = nvs, Synchronized = true}; + + existing.Count += (ulong)ctx.Commands.LongCount(c => !c.Synchronized && c.Name == nvs); + ctx.Commands.Update(existing); + ctx.Commands.RemoveRange(ctx.Commands.Where(c => !c.Synchronized && c.Name == nvs)); + } if(ctx.Filesystems.Any(c => !c.Synchronized)) - { - dto.Filesystems = new List(); - foreach(string nvs in - ctx.Filesystems.Where(c => !c.Synchronized).Select(c => c.Name).Distinct()) - dto.Filesystems.Add(new NameValueStats - { - name = nvs, - Value = ctx.Filesystems.LongCount(c => !c.Synchronized && - c.Name == nvs) - }); - } + foreach(string nvs in ctx.Filesystems.Where(c => !c.Synchronized).Select(c => c.Name) + .Distinct()) + { + Filesystem existing = + ctx.Filesystems.FirstOrDefault(c => c.Synchronized && c.Name == nvs) ?? + new Filesystem {Name = nvs, Synchronized = true}; + + existing.Count += + (ulong)ctx.Filesystems.LongCount(c => !c.Synchronized && c.Name == nvs); + ctx.Filesystems.Update(existing); + ctx.Filesystems.RemoveRange(ctx.Filesystems.Where(c => !c.Synchronized && + c.Name == nvs)); + } if(ctx.Filters.Any(c => !c.Synchronized)) - { - dto.Filters = new List(); foreach(string nvs in ctx.Filters.Where(c => !c.Synchronized).Select(c => c.Name).Distinct() ) - dto.Filters.Add(new NameValueStats - { - name = nvs, - Value = ctx.Filters.LongCount(c => !c.Synchronized && - c.Name == nvs) - }); - } + { + Filter existing = ctx.Filters.FirstOrDefault(c => c.Synchronized && c.Name == nvs) ?? + new Filter {Name = nvs, Synchronized = true}; + + existing.Count += (ulong)ctx.Filters.LongCount(c => !c.Synchronized && c.Name == nvs); + ctx.Filters.Update(existing); + ctx.Filters.RemoveRange(ctx.Filters.Where(c => !c.Synchronized && c.Name == nvs)); + } if(ctx.MediaFormats.Any(c => !c.Synchronized)) - { - dto.MediaFormats = new List(); - foreach(string nvs in - ctx.Commands.Where(c => !c.Synchronized).Select(c => c.Name).Distinct()) - dto.MediaFormats.Add(new NameValueStats - { - name = nvs, - Value = ctx.MediaFormats.LongCount(c => !c.Synchronized && - c.Name == nvs) - }); - } + foreach(string nvs in ctx.MediaFormats.Where(c => !c.Synchronized).Select(c => c.Name) + .Distinct()) + { + MediaFormat existing = + ctx.MediaFormats.FirstOrDefault(c => c.Synchronized && c.Name == nvs) ?? + new MediaFormat {Name = nvs, Synchronized = true}; + + existing.Count += + (ulong)ctx.MediaFormats.LongCount(c => !c.Synchronized && c.Name == nvs); + ctx.MediaFormats.Update(existing); + ctx.MediaFormats.RemoveRange(ctx.MediaFormats.Where(c => !c.Synchronized && + c.Name == nvs)); + } if(ctx.Partitions.Any(c => !c.Synchronized)) - { - dto.Partitions = new List(); - foreach(string nvs in - ctx.Partitions.Where(c => !c.Synchronized).Select(c => c.Name).Distinct()) - dto.Partitions.Add(new NameValueStats - { - name = nvs, - Value = ctx.Partitions.LongCount(c => !c.Synchronized && - c.Name == nvs) - }); - } + foreach(string nvs in ctx.Partitions.Where(c => !c.Synchronized).Select(c => c.Name) + .Distinct()) + { + Partition existing = + ctx.Partitions.FirstOrDefault(c => c.Synchronized && c.Name == nvs) ?? + new Partition {Name = nvs, Synchronized = true}; + + existing.Count += + (ulong)ctx.Partitions.LongCount(c => !c.Synchronized && c.Name == nvs); + ctx.Partitions.Update(existing); + ctx.Partitions.RemoveRange(ctx.Partitions.Where(c => !c.Synchronized && c.Name == nvs)); + } if(ctx.Versions.Any(c => !c.Synchronized)) - { - dto.Versions = new List(); - foreach(string nvs in - ctx.Versions.Where(c => !c.Synchronized).Select(c => c.Value).Distinct()) - dto.Versions.Add(new NameValueStats - { - name = nvs, - Value = ctx.Versions.LongCount(c => !c.Synchronized && - c.Value == nvs) - }); - } + foreach(string nvs in ctx.Versions.Where(c => !c.Synchronized).Select(c => c.Value) + .Distinct()) + { + Version existing = ctx.Versions.FirstOrDefault(c => c.Synchronized && c.Value == nvs) ?? + new Version {Value = nvs, Synchronized = true}; + + existing.Count += (ulong)ctx.Versions.LongCount(c => !c.Synchronized && c.Value == nvs); + ctx.Versions.Update(existing); + ctx.Versions.RemoveRange(ctx.Versions.Where(c => !c.Synchronized && c.Value == nvs)); + } if(ctx.Medias.Any(c => !c.Synchronized)) - { - dto.Medias = new List(); foreach(string media in ctx.Medias.Where(c => !c.Synchronized).Select(c => c.Type) .Distinct()) { if(ctx.Medias.Any(c => !c.Synchronized && c.Type == media && c.Real)) - dto.Medias.Add(new MediaStats - { - real = true, - type = media, - Value = ctx.Medias.LongCount(c => !c.Synchronized && - c.Type == media && c.Real) - }); - if(ctx.Medias.Any(c => !c.Synchronized && c.Type == media && !c.Real)) - dto.Medias.Add(new MediaStats - { - real = false, - type = media, - Value = ctx.Medias.LongCount(c => !c.Synchronized && - c.Type == media && !c.Real) - }); + { + Database.Models.Media existing = + ctx.Medias.FirstOrDefault(c => c.Synchronized && c.Type == media && c.Real) ?? + new Database.Models.Media {Synchronized = true, Type = media, Real = true}; + + existing.Count += + (ulong)ctx.Medias.LongCount(c => !c.Synchronized && c.Type == media && c.Real); + ctx.Medias.Update(existing); + ctx.Medias.RemoveRange(ctx.Medias.Where(c => !c.Synchronized && c.Type == media && + c.Real)); + } + + if(!ctx.Medias.Any(c => !c.Synchronized && c.Type == media && !c.Real)) continue; + + { + Database.Models.Media existing = + ctx.Medias.FirstOrDefault(c => c.Synchronized && c.Type == media && !c.Real) ?? + new Database.Models.Media {Synchronized = true, Type = media, Real = false}; + + existing.Count += + (ulong)ctx.Medias.LongCount(c => !c.Synchronized && c.Type == media && !c.Real); + ctx.Medias.Update(existing); + ctx.Medias.RemoveRange(ctx.Medias.Where(c => !c.Synchronized && c.Type == media && + !c.Real)); + } } - } if(ctx.SeenDevices.Any(c => !c.Synchronized)) - { - dto.Devices = new List(); foreach(DeviceStat device in ctx.SeenDevices.Where(c => !c.Synchronized)) - dto.Devices.Add(new DeviceStats - { - Bus = device.Bus, - Manufacturer = device.Manufacturer, - ManufacturerSpecified = !(device.Manufacturer is null), - Model = device.Model, - Revision = device.Revision - }); - } + { + device.Synchronized = true; + ctx.Update(device); + } if(ctx.OperatingSystems.Any(c => !c.Synchronized)) - { - dto.OperatingSystems = new List(); foreach(string osName in ctx.OperatingSystems.Where(c => !c.Synchronized) .Select(c => c.Name).Distinct()) { - foreach(string osVersion in - ctx.OperatingSystems.Where(c => !c.Synchronized && c.Name == osName) - .Select(c => c.Version).Distinct()) - dto.OperatingSystems.Add(new OsStats - { - name = osName, - version = osVersion, - Value = - ctx.OperatingSystems.LongCount(c => - !c - .Synchronized && - c.Name == - osName && - c.Version == - osVersion) - }); + foreach(string osVersion in ctx + .OperatingSystems + .Where(c => !c.Synchronized && c.Name == osName) + .Select(c => c.Version).Distinct()) + { + OperatingSystem existing = + ctx.OperatingSystems.FirstOrDefault(c => c.Synchronized && c.Name == osName && + c.Version == + osVersion) ?? + new OperatingSystem {Synchronized = true, Version = osVersion, Name = osName}; + + existing.Count += + (ulong)ctx.OperatingSystems.LongCount(c => !c.Synchronized && + c.Name == osName && + c.Version == osVersion); + ctx.OperatingSystems.Update(existing); + ctx.OperatingSystems.RemoveRange(ctx.OperatingSystems.Where(c => !c.Synchronized && + c.Name == osName && + c.Version == + osVersion)); + } } - } - - try - { - #if DEBUG - System.Console.WriteLine("Uploading statistics"); - #else - DiscImageChef.Console.DicConsole.DebugWriteLine("Submit stats", "Uploading statistics"); - #endif - - MemoryStream jsonStream = new MemoryStream(); - StreamWriter jsonSw = new StreamWriter(jsonStream); - - jsonSw.Write(JsonConvert.SerializeObject(dto, Formatting.Indented, - new JsonSerializerSettings - { - NullValueHandling = - NullValueHandling.Ignore - })); - jsonStream.Seek(0, SeekOrigin.Begin); - WebRequest request = - WebRequest.Create("http://discimagechef.claunia.com/api/uploadstatsv2"); - ((HttpWebRequest)request).UserAgent = - $"DiscImageChef {typeof(Version).Assembly.GetName().Version}"; - request.Method = "POST"; - request.ContentLength = jsonStream.Length; - request.ContentType = "application/json"; - Stream reqStream = request.GetRequestStream(); - jsonStream.CopyTo(reqStream); - reqStream.Close(); - WebResponse response = request.GetResponse(); - - if(((HttpWebResponse)response).StatusCode != HttpStatusCode.OK) return; - - Stream data = response.GetResponseStream(); - StreamReader reader = new StreamReader(data ?? throw new InvalidOperationException()); - - reader.ReadToEnd(); - data.Close(); - response.Close(); - jsonSw.Close(); - jsonStream.Close(); - - if(ctx.Commands.Any(c => !c.Synchronized)) - foreach(string nvs in ctx - .Commands.Where(c => !c.Synchronized).Select(c => c.Name) - .Distinct()) - { - Command existing = - ctx.Commands.FirstOrDefault(c => c.Synchronized && c.Name == nvs) ?? - new Command {Name = nvs, Synchronized = true}; - - existing.Count += - (ulong)ctx.Commands.LongCount(c => !c.Synchronized && c.Name == nvs); - ctx.Commands.Update(existing); - ctx.Commands.RemoveRange(ctx.Commands.Where(c => !c.Synchronized && c.Name == nvs)); - } - - if(ctx.Filesystems.Any(c => !c.Synchronized)) - foreach(string nvs in ctx - .Filesystems.Where(c => !c.Synchronized).Select(c => c.Name) - .Distinct()) - { - Filesystem existing = - ctx.Filesystems.FirstOrDefault(c => c.Synchronized && c.Name == nvs) ?? - new Filesystem {Name = nvs, Synchronized = true}; - - existing.Count += - (ulong)ctx.Filesystems.LongCount(c => !c.Synchronized && c.Name == nvs); - ctx.Filesystems.Update(existing); - ctx.Filesystems.RemoveRange(ctx.Filesystems.Where(c => !c.Synchronized && - c.Name == nvs)); - } - - if(ctx.Filters.Any(c => !c.Synchronized)) - foreach(string nvs in ctx - .Filters.Where(c => !c.Synchronized).Select(c => c.Name) - .Distinct()) - { - Filter existing = - ctx.Filters.FirstOrDefault(c => c.Synchronized && c.Name == nvs) ?? - new Filter {Name = nvs, Synchronized = true}; - - existing.Count += - (ulong)ctx.Filters.LongCount(c => !c.Synchronized && c.Name == nvs); - ctx.Filters.Update(existing); - ctx.Filters.RemoveRange(ctx.Filters.Where(c => !c.Synchronized && c.Name == nvs)); - } - - if(ctx.MediaFormats.Any(c => !c.Synchronized)) - foreach(string nvs in ctx - .MediaFormats.Where(c => !c.Synchronized).Select(c => c.Name) - .Distinct()) - { - MediaFormat existing = - ctx.MediaFormats.FirstOrDefault(c => c.Synchronized && c.Name == nvs) ?? - new MediaFormat {Name = nvs, Synchronized = true}; - - existing.Count += - (ulong)ctx.MediaFormats.LongCount(c => !c.Synchronized && c.Name == nvs); - ctx.MediaFormats.Update(existing); - ctx.MediaFormats.RemoveRange(ctx.MediaFormats.Where(c => !c.Synchronized && - c.Name == nvs)); - } - - if(ctx.Partitions.Any(c => !c.Synchronized)) - foreach(string nvs in ctx - .Partitions.Where(c => !c.Synchronized).Select(c => c.Name) - .Distinct()) - { - Partition existing = - ctx.Partitions.FirstOrDefault(c => c.Synchronized && c.Name == nvs) ?? - new Partition {Name = nvs, Synchronized = true}; - - existing.Count += - (ulong)ctx.Partitions.LongCount(c => !c.Synchronized && c.Name == nvs); - ctx.Partitions.Update(existing); - ctx.Partitions.RemoveRange(ctx.Partitions.Where(c => !c.Synchronized && - c.Name == nvs)); - } - - if(ctx.Versions.Any(c => !c.Synchronized)) - foreach(string nvs in ctx - .Versions.Where(c => !c.Synchronized).Select(c => c.Value) - .Distinct()) - { - Version existing = - ctx.Versions.FirstOrDefault(c => c.Synchronized && c.Value == nvs) ?? - new Version {Value = nvs, Synchronized = true}; - - existing.Count += - (ulong)ctx.Versions.LongCount(c => !c.Synchronized && c.Value == nvs); - ctx.Versions.Update(existing); - ctx.Versions.RemoveRange(ctx.Versions.Where(c => !c.Synchronized && - c.Value == nvs)); - } - - if(ctx.Medias.Any(c => !c.Synchronized)) - foreach(string media in ctx.Medias.Where(c => !c.Synchronized).Select(c => c.Type) - .Distinct()) - { - if(ctx.Medias.Any(c => !c.Synchronized && c.Type == media && c.Real)) - { - Database.Models.Media existing = - ctx.Medias.FirstOrDefault(c => c.Synchronized && c.Type == media && - c.Real) ?? new Database.Models.Media - { - Synchronized = true, Type = media, Real = true - }; - - existing.Count += - (ulong)ctx.Medias.LongCount(c => !c.Synchronized && c.Type == media && - c.Real); - ctx.Medias.Update(existing); - ctx.Medias.RemoveRange(ctx.Medias.Where(c => !c.Synchronized && - c.Type == media && c.Real)); - } - - if(!ctx.Medias.Any(c => !c.Synchronized && c.Type == media && !c.Real)) continue; - - { - Database.Models.Media existing = - ctx.Medias.FirstOrDefault(c => c.Synchronized && c.Type == media && - !c.Real) ?? new Database.Models.Media - { - Synchronized = true, Type = media, Real = false - }; - - existing.Count += - (ulong)ctx.Medias.LongCount(c => !c.Synchronized && c.Type == media && - !c.Real); - ctx.Medias.Update(existing); - ctx.Medias.RemoveRange(ctx.Medias.Where(c => !c.Synchronized && - c.Type == media && !c.Real)); - } - } - - if(ctx.SeenDevices.Any(c => !c.Synchronized)) - foreach(DeviceStat device in ctx.SeenDevices.Where(c => !c.Synchronized)) - { - device.Synchronized = true; - ctx.Update(device); - } - - if(ctx.OperatingSystems.Any(c => !c.Synchronized)) - foreach(string osName in ctx.OperatingSystems.Where(c => !c.Synchronized) - .Select(c => c.Name).Distinct()) - { - foreach(string osVersion in ctx - .OperatingSystems - .Where(c => !c.Synchronized && c.Name == osName) - .Select(c => c.Version).Distinct()) - { - OperatingSystem existing = - ctx.OperatingSystems.FirstOrDefault(c => c.Synchronized && - c.Name == osName && - c.Version == osVersion) ?? - new OperatingSystem - { - Synchronized = true, Version = osVersion, Name = osName - }; - - existing.Count += - (ulong)ctx.OperatingSystems.LongCount(c => !c.Synchronized && - c.Name == osName && - c.Version == osVersion); - ctx.OperatingSystems.Update(existing); - ctx.OperatingSystems.RemoveRange(ctx.OperatingSystems.Where(c => - !c - .Synchronized && - c.Name == - osName && - c.Version == - osVersion)); - } - } - } - catch(WebException) - { - // Can't connect to the server, do nothing - } - // ReSharper disable once RedundantCatchClause - catch - { - #if DEBUG - if(Debugger.IsAttached) throw; - #endif - } } + catch(WebException) + { + // Can't connect to the server, do nothing + } + // ReSharper disable once RedundantCatchClause + catch + { + #if DEBUG + if(Debugger.IsAttached) throw; + #endif + } + } if(submitStatsLock) return; @@ -911,7 +878,9 @@ namespace DiscImageChef.Core if(Settings.Settings.Current.Stats == null || !Settings.Settings.Current.Stats.DeviceStats) return; + DicContext ctx = DicContext.Create(Settings.Settings.DbPath); ctx.Commands.Add(new Command {Name = command, Synchronized = false, Count = 1}); + ctx.SaveChanges(); } /// @@ -924,7 +893,9 @@ namespace DiscImageChef.Core if(Settings.Settings.Current.Stats == null || !Settings.Settings.Current.Stats.FilesystemStats) return; + DicContext ctx = DicContext.Create(Settings.Settings.DbPath); ctx.Filesystems.Add(new Filesystem {Name = filesystem, Synchronized = false, Count = 1}); + ctx.SaveChanges(); } /// @@ -937,7 +908,9 @@ namespace DiscImageChef.Core if(Settings.Settings.Current.Stats == null || !Settings.Settings.Current.Stats.PartitionStats) return; + DicContext ctx = DicContext.Create(Settings.Settings.DbPath); ctx.Partitions.Add(new Partition {Name = partition, Synchronized = false, Count = 1}); + ctx.SaveChanges(); } /// @@ -950,7 +923,9 @@ namespace DiscImageChef.Core if(Settings.Settings.Current.Stats == null || !Settings.Settings.Current.Stats.FilterStats) return; + DicContext ctx = DicContext.Create(Settings.Settings.DbPath); ctx.Filters.Add(new Filter {Name = filter, Synchronized = false, Count = 1}); + ctx.SaveChanges(); } /// @@ -963,7 +938,9 @@ namespace DiscImageChef.Core if(Settings.Settings.Current.Stats == null || !Settings.Settings.Current.Stats.MediaImageStats) return; + DicContext ctx = DicContext.Create(Settings.Settings.DbPath); ctx.MediaFormats.Add(new MediaFormat {Name = format, Synchronized = false, Count = 1}); + ctx.SaveChanges(); } /// @@ -979,6 +956,7 @@ namespace DiscImageChef.Core else if(dev.IsFireWire) deviceBus = "FireWire"; else deviceBus = dev.Type.ToString(); + DicContext ctx = DicContext.Create(Settings.Settings.DbPath); ctx.SeenDevices.Add(new DeviceStat { Bus = deviceBus, @@ -987,6 +965,7 @@ namespace DiscImageChef.Core Revision = dev.Revision, Synchronized = false }); + ctx.SaveChanges(); } /// @@ -998,10 +977,12 @@ namespace DiscImageChef.Core { if(Settings.Settings.Current.Stats == null || !Settings.Settings.Current.Stats.MediaStats) return; + DicContext ctx = DicContext.Create(Settings.Settings.DbPath); ctx.Medias.Add(new Database.Models.Media { Real = real, Synchronized = false, Type = type.ToString(), Count = 1 }); + ctx.SaveChanges(); } } } \ No newline at end of file diff --git a/DiscImageChef.Database/Context.cs b/DiscImageChef.Database/Context.cs index 641b77605..ac137fd2e 100644 --- a/DiscImageChef.Database/Context.cs +++ b/DiscImageChef.Database/Context.cs @@ -37,8 +37,7 @@ namespace DiscImageChef.Database { public sealed class DicContext : DbContext { - // Note: If table does not appear check that last migration has been REALLY added to the project - public DicContext() + public DicContext(DbContextOptions options) : base(options) { Database.Migrate(); } @@ -57,10 +56,13 @@ namespace DiscImageChef.Database public DbSet UsbVendors { get; set; } public DbSet UsbProducts { get; set; } public DbSet CdOffsets { get; set; } + // Note: If table does not appear check that last migration has been REALLY added to the project - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + public static DicContext Create(string dbPath) { - optionsBuilder.UseSqlite("Data Source=discimagechef.db"); + DbContextOptionsBuilder optionsBuilder = new DbContextOptionsBuilder(); + optionsBuilder.UseSqlite($"Data Source={dbPath}"); + return new DicContext(optionsBuilder.Options); } } } \ No newline at end of file diff --git a/DiscImageChef.Gui/Dialogs/dlgStatistics.xeto.cs b/DiscImageChef.Gui/Dialogs/dlgStatistics.xeto.cs index ccd7f2c37..3a6ba8c3a 100644 --- a/DiscImageChef.Gui/Dialogs/dlgStatistics.xeto.cs +++ b/DiscImageChef.Gui/Dialogs/dlgStatistics.xeto.cs @@ -41,13 +41,11 @@ namespace DiscImageChef.Gui.Dialogs { public class dlgStatistics : Dialog { - DicContext ctx; - public dlgStatistics() { XamlReader.Load(this); - ctx = new DicContext(); + DicContext ctx = DicContext.Create(Settings.Settings.DbPath); if(ctx.Commands.Any()) { diff --git a/DiscImageChef.Gui/Forms/frmMain.xeto.cs b/DiscImageChef.Gui/Forms/frmMain.xeto.cs index 6ff84c6b1..7d4b20908 100644 --- a/DiscImageChef.Gui/Forms/frmMain.xeto.cs +++ b/DiscImageChef.Gui/Forms/frmMain.xeto.cs @@ -597,7 +597,7 @@ namespace DiscImageChef.Gui.Forms protected void OnMenuStatistics(object sender, EventArgs e) { - DicContext ctx = new DicContext(); + DicContext ctx = DicContext.Create(Settings.Settings.DbPath); if(!ctx.Commands.Any() && !ctx.Filesystems.Any() && !ctx.Filters.Any() && !ctx.MediaFormats.Any() && !ctx.Medias.Any() && !ctx.Partitions.Any() && !ctx.SeenDevices.Any()) diff --git a/DiscImageChef.Settings/Settings.cs b/DiscImageChef.Settings/Settings.cs index 41f4676ee..a16177c80 100644 --- a/DiscImageChef.Settings/Settings.cs +++ b/DiscImageChef.Settings/Settings.cs @@ -155,6 +155,8 @@ namespace DiscImageChef.Settings /// public static string StatsPath { get; private set; } + public static string DbPath { get; private set; } + /// /// Loads settings /// @@ -163,6 +165,7 @@ namespace DiscImageChef.Settings Current = new DicSettings(); PlatformID ptId = DetectOS.GetRealPlatformID(); string homePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); + DbPath = "discimagechef.db"; try { @@ -180,6 +183,8 @@ namespace DiscImageChef.Settings string dicPath = Path.Combine(appSupportPath, "DiscImageChef"); if(!Directory.Exists(dicPath)) Directory.CreateDirectory(dicPath); + DbPath = Path.Combine(dicPath, DbPath); + ReportsPath = Path.Combine(dicPath, "Reports"); if(!Directory.Exists(ReportsPath)) Directory.CreateDirectory(ReportsPath); @@ -202,6 +207,8 @@ namespace DiscImageChef.Settings string dicPath = Path.Combine(appSupportPath, "DiscImageChef"); if(!Directory.Exists(dicPath)) Directory.CreateDirectory(dicPath); + DbPath = Path.Combine(dicPath, DbPath); + ReportsPath = Path.Combine(dicPath, "Reports"); if(!Directory.Exists(ReportsPath)) Directory.CreateDirectory(ReportsPath); @@ -227,6 +234,8 @@ namespace DiscImageChef.Settings if(!Directory.Exists(dicPath)) Directory.CreateDirectory(dicPath); + DbPath = Path.Combine(dicPath, DbPath); + ReportsPath = Path.Combine(dicPath, "Reports"); if(!Directory.Exists(ReportsPath)) Directory.CreateDirectory(ReportsPath); diff --git a/DiscImageChef/Commands/DeviceReport.cs b/DiscImageChef/Commands/DeviceReport.cs index a357ab407..db58d6420 100644 --- a/DiscImageChef/Commands/DeviceReport.cs +++ b/DiscImageChef/Commands/DeviceReport.cs @@ -924,7 +924,7 @@ namespace DiscImageChef.Commands Core.Statistics.AddCommand("device-report"); - using(DicContext ctx = new DicContext()) + using(DicContext ctx = DicContext.Create(Settings.Settings.DbPath)) { ctx.Reports.Add(new Report(report)); ctx.SaveChanges(); diff --git a/DiscImageChef/Commands/Statistics.cs b/DiscImageChef/Commands/Statistics.cs index 942e7ab4c..86a98754d 100644 --- a/DiscImageChef/Commands/Statistics.cs +++ b/DiscImageChef/Commands/Statistics.cs @@ -41,7 +41,7 @@ namespace DiscImageChef.Commands { internal static void ShowStats() { - DicContext ctx = new DicContext(); + DicContext ctx = DicContext.Create(Settings.Settings.DbPath); if(!ctx.Commands.Any() && !ctx.Filesystems.Any() && !ctx.Filters.Any() && !ctx.MediaFormats.Any() && !ctx.Medias.Any() && !ctx.Partitions.Any() && !ctx.SeenDevices.Any()) diff --git a/DiscImageChef/Main.cs b/DiscImageChef/Main.cs index 5add65787..2a6c10bef 100644 --- a/DiscImageChef/Main.cs +++ b/DiscImageChef/Main.cs @@ -55,11 +55,12 @@ namespace DiscImageChef DicConsole.WriteEvent += System.Console.Write; DicConsole.ErrorWriteLineEvent += System.Console.Error.WriteLine; - DicContext ctx = new DicContext(); + Settings.Settings.LoadSettings(); + + DicContext ctx = DicContext.Create(Settings.Settings.DbPath); ctx.Database.Migrate(); ctx.SaveChanges(); - Settings.Settings.LoadSettings(); if((args.Length < 1 || args[0].ToLowerInvariant() != "gui") && Settings.Settings.Current.GdprCompliance < DicSettings.GdprLevel) Configure.DoConfigure(true); Statistics.LoadStats();