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();