diff --git a/source/ChanSort.Api/Controller/CsvRefListSerializer.cs b/source/ChanSort.Api/Controller/CsvRefListSerializer.cs index 0e2f444..0ad21e1 100644 --- a/source/ChanSort.Api/Controller/CsvRefListSerializer.cs +++ b/source/ChanSort.Api/Controller/CsvRefListSerializer.cs @@ -46,27 +46,25 @@ namespace ChanSort.Api public override void Load() { - using (var stream = new StreamReader(this.FileName)) - { - var lineNr = 0; + using var stream = new StreamReader(this.FileName); + var lineNr = 0; - var line = stream.ReadLine(); - if (line != null && line.StartsWith("--------") && line.Contains(" Program Data!--------")) - throw LoaderException.TryNext("ignoring .csv file with Sharp/Dyon/Blaupunkt/Hisense header line"); + var line = stream.ReadLine(); + if (line != null && line.StartsWith("--------") && line.Contains(" Program Data!--------")) + throw LoaderException.TryNext("ignoring .csv file with Sharp/Dyon/Blaupunkt/Hisense header line"); - try + try + { + while (line != null) { - while (line != null) - { - this.ReadChannel(line, ++lineNr); - line = stream.ReadLine(); - } - } - catch (Exception ex) - { - throw LoaderException.TryNext($"Error in reference file line #{lineNr}: {line}", ex); + this.ReadChannel(line, ++lineNr); + line = stream.ReadLine(); } } + catch (Exception ex) + { + throw LoaderException.TryNext($"Error in reference file line #{lineNr}: {line}", ex); + } } #endregion @@ -314,18 +312,15 @@ namespace ChanSort.Api #region Save() - public override void Save(string tvDataFile) + public override void Save() { - Save(tvDataFile, this.DataRoot); - this.FileName = tvDataFile; + Save(this.FileName, this.DataRoot); } public static void Save(string tvDataFile, DataRoot dataRoot) { - using (var stream = new StreamWriter(tvDataFile)) - { - Save(stream, dataRoot); - } + using var stream = new StreamWriter(tvDataFile); + Save(stream, dataRoot); } public static void Save(TextWriter stream, DataRoot dataRoot, bool includeDeletedChannels = true) diff --git a/source/ChanSort.Api/Controller/SerializerBase.cs b/source/ChanSort.Api/Controller/SerializerBase.cs index 332abf0..7ea5819 100644 --- a/source/ChanSort.Api/Controller/SerializerBase.cs +++ b/source/ChanSort.Api/Controller/SerializerBase.cs @@ -84,7 +84,7 @@ namespace ChanSort.Api } public abstract void Load(); - public abstract void Save(string tvOutputFile); + public abstract void Save(); public virtual Encoding DefaultEncoding { @@ -165,11 +165,10 @@ namespace ChanSort.Api ZipFile.ExtractToDirectory(this.FileName, this.TempPath); } - protected void ZipToOutputFile(string tvOutputFile, bool compress = true) + protected void ZipToOutputFile(bool compress = true) { - File.Delete(tvOutputFile); - ZipFile.CreateFromDirectory(this.TempPath, tvOutputFile, compress ? CompressionLevel.Optimal : CompressionLevel.NoCompression, false); - this.FileName = tvOutputFile; + File.Delete(this.FileName); + ZipFile.CreateFromDirectory(this.TempPath, this.FileName, compress ? CompressionLevel.Optimal : CompressionLevel.NoCompression, false); } #endregion @@ -199,6 +198,7 @@ namespace ChanSort.Api var path = this.TempPath; if (string.IsNullOrEmpty(path)) return; + try { if (Directory.Exists(path)) diff --git a/source/ChanSort.Api/Controller/TxtRefListSerializer.cs b/source/ChanSort.Api/Controller/TxtRefListSerializer.cs index 304a9e7..13df9fc 100644 --- a/source/ChanSort.Api/Controller/TxtRefListSerializer.cs +++ b/source/ChanSort.Api/Controller/TxtRefListSerializer.cs @@ -52,37 +52,35 @@ namespace ChanSort.Api { var lineNr = 0; - using (var file = new StreamReader(this.FileName)) + using var file = new StreamReader(this.FileName); + string line; + while ((line = file.ReadLine()) != null) { - string line; - while ((line = file.ReadLine()) != null) - { - ++lineNr; - var parts = line.Split(Separators); - if (parts.Length < 2) - continue; - int progNr; - if (!int.TryParse(parts[0], out progNr)) - continue; + ++lineNr; + var parts = line.Split(Separators); + if (parts.Length < 2) + continue; + int progNr; + if (!int.TryParse(parts[0], out progNr)) + continue; - var channel = new ChannelInfo(SignalSource.All, lineNr, progNr, parts[1]); - if (parts.Length >= 3) + var channel = new ChannelInfo(SignalSource.All, lineNr, progNr, parts[1]); + if (parts.Length >= 3) + { + var subParts = parts[2].Split('-'); + if (subParts.Length >= 3) { - var subParts = parts[2].Split('-'); - if (subParts.Length >= 3) - { - int val; - if (int.TryParse(subParts[0], out val)) - channel.OriginalNetworkId = val; - if (int.TryParse(subParts[1], out val)) - channel.TransportStreamId = val; - if (int.TryParse(subParts[2], out val)) - channel.ServiceId = val; - } + int val; + if (int.TryParse(subParts[0], out val)) + channel.OriginalNetworkId = val; + if (int.TryParse(subParts[1], out val)) + channel.TransportStreamId = val; + if (int.TryParse(subParts[2], out val)) + channel.ServiceId = val; } - this.DataRoot.AddChannel(this.allChannels, channel); - lineNr++; } + this.DataRoot.AddChannel(this.allChannels, channel); + lineNr++; } } @@ -102,36 +100,33 @@ namespace ChanSort.Api #region Save() - public override void Save(string tvOutputFile) + public override void Save() { - Save(tvOutputFile, this.allChannels); - this.FileName = tvOutputFile; + Save(this.FileName, this.allChannels); } public static void Save(string fileName, ChannelList list) { var samToolBoxMode = (Path.GetExtension(fileName) ?? "").ToLowerInvariant() == ".chl"; - using (var writer = new StreamWriter(fileName, false, Encoding.UTF8)) + using var writer = new StreamWriter(fileName, false, Encoding.UTF8); + foreach (var channel in list.GetChannelsByNewOrder()) { - foreach (var channel in list.GetChannelsByNewOrder()) - { - if (channel.NewProgramNr == -1) continue; + if (channel.NewProgramNr == -1) continue; - writer.Write(channel.NewProgramNr); + writer.Write(channel.NewProgramNr); + writer.Write(Separators[0]); + writer.Write(channel.Name); + if (!samToolBoxMode) + { writer.Write(Separators[0]); - writer.Write(channel.Name); - if (!samToolBoxMode) - { - writer.Write(Separators[0]); - writer.Write(channel.OriginalNetworkId); - writer.Write("-"); - writer.Write(channel.TransportStreamId); - writer.Write("-"); - writer.Write(channel.ServiceId); - } - writer.WriteLine(); + writer.Write(channel.OriginalNetworkId); + writer.Write("-"); + writer.Write(channel.TransportStreamId); + writer.Write("-"); + writer.Write(channel.ServiceId); } + writer.WriteLine(); } } #endregion diff --git a/source/ChanSort.Api/Model/LookupData.cs b/source/ChanSort.Api/Model/LookupData.cs index d6bf5a2..9d6a0cc 100644 --- a/source/ChanSort.Api/Model/LookupData.cs +++ b/source/ChanSort.Api/Model/LookupData.cs @@ -65,21 +65,19 @@ namespace ChanSort.Api string file = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? "", "lookup.csv"); if (!File.Exists(file)) return; - using (var reader = new StreamReader(file, System.Text.Encoding.UTF8)) + using var reader = new StreamReader(file, System.Text.Encoding.UTF8); + string line; + while ((line = reader.ReadLine()) != null) { - string line; - while ((line = reader.ReadLine()) != null) + var fields = CsvFile.Parse(line, ';'); + if (fields.Count == 0) + continue; + switch (fields[0].ToLowerInvariant()) { - var fields = CsvFile.Parse(line, ';'); - if (fields.Count == 0) - continue; - switch (fields[0].ToLowerInvariant()) - { - case "onid": this.ParseNetwork(fields); break; - case "transp": this.ParseTransponder(fields); break; - case "dvbc": this.ParseDvbcChannel(fields); break; - case "servicetype": this.ParseServiceType(fields); break; - } + case "onid": this.ParseNetwork(fields); break; + case "transp": this.ParseTransponder(fields); break; + case "dvbc": this.ParseDvbcChannel(fields); break; + case "servicetype": this.ParseServiceType(fields); break; } } } diff --git a/source/ChanSort.Api/Utils/FileAssociation.cs b/source/ChanSort.Api/Utils/FileAssociation.cs index 8631198..a584332 100644 --- a/source/ChanSort.Api/Utils/FileAssociation.cs +++ b/source/ChanSort.Api/Utils/FileAssociation.cs @@ -90,19 +90,17 @@ namespace ChanSort.Api private static bool SetValue(string keyPath, string name, string value, bool force = false) { - using (var key = Registry.CurrentUser.CreateSubKey(keyPath)) + using var key = Registry.CurrentUser.CreateSubKey(keyPath); + var currentValue = key.GetValue(name) as string; + var nameExists = currentValue != null; + if (nameExists) { - var currentValue = key.GetValue(name) as string; - var nameExists = currentValue != null; - if (nameExists) - { - if (currentValue == value || !force) - return false; - } - - key.SetValue(name, value); - return true; + if (currentValue == value || !force) + return false; } + + key.SetValue(name, value); + return true; } public static void DeleteAssociations(IEnumerable extensions) @@ -117,15 +115,13 @@ namespace ChanSort.Api void DeleteValue(string keyPath, string name) { - using (var key = Registry.CurrentUser.OpenSubKey(keyPath, true)) + using var key = Registry.CurrentUser.OpenSubKey(keyPath, true); + if (key != null) { - if (key != null) - { - if (name == null) - key.SetValue(null, ""); - else - key.DeleteValue(name, false); - } + if (name == null) + key.SetValue(null, ""); + else + key.DeleteValue(name, false); } } } diff --git a/source/ChanSort.Loader.Android/AldenSerializer.cs b/source/ChanSort.Loader.Android/AldenSerializer.cs index 2c3dc2f..2fe982f 100644 --- a/source/ChanSort.Loader.Android/AldenSerializer.cs +++ b/source/ChanSort.Loader.Android/AldenSerializer.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Text; using Microsoft.Data.Sqlite; @@ -88,7 +87,7 @@ namespace ChanSort.Loader.Android #region Load() public override void Load() { - using var conn = new SqliteConnection($"Data Source={this.FileName}"); + using var conn = new SqliteConnection($"Data Source={this.FileName};Pooling=False"); conn.Open(); using var cmd = conn.CreateCommand(); @@ -161,11 +160,9 @@ namespace ChanSort.Loader.Android /// /// The "tv.db" file was reported to exist as early as in ChannelMap_25 format and has been seen in formats 30 and 45 too /// - public override void Save(string outputFile) + public override void Save() { - this.FileName = outputFile; - - using var conn = new SqliteConnection($"Data Source={outputFile}"); + using var conn = new SqliteConnection($"Data Source={this.FileName};Pooling=False"); conn.Open(); using var trans = conn.BeginTransaction(); using var cmd = conn.CreateCommand(); diff --git a/source/ChanSort.Loader.CmdbBin/CmdbFileSerializer.cs b/source/ChanSort.Loader.CmdbBin/CmdbFileSerializer.cs index ec761dc..2d4ba34 100644 --- a/source/ChanSort.Loader.CmdbBin/CmdbFileSerializer.cs +++ b/source/ChanSort.Loader.CmdbBin/CmdbFileSerializer.cs @@ -273,10 +273,8 @@ namespace ChanSort.Loader.CmdbBin #region Save() - public override void Save(string tvOutputFile) + public override void Save() { - // save-as is not supported, the tvOutputFile is ignored - foreach (var path in this.files) { var name = Path.GetFileName(path).ToLowerInvariant(); @@ -331,7 +329,7 @@ namespace ChanSort.Loader.CmdbBin } } - File.WriteAllBytes(this.FileName, data); + File.WriteAllBytes(path, data); } #endregion diff --git a/source/ChanSort.Loader.Enigma2/Serializer.cs b/source/ChanSort.Loader.Enigma2/Serializer.cs index df22d96..c87edb5 100644 --- a/source/ChanSort.Loader.Enigma2/Serializer.cs +++ b/source/ChanSort.Loader.Enigma2/Serializer.cs @@ -358,7 +358,7 @@ namespace ChanSort.Loader.Enigma2 #region Save() - public override void Save(string tvOutputFile) + public override void Save() { for (int favIndex = 0; favIndex < this.favListFileNames.Count; favIndex++) { diff --git a/source/ChanSort.Loader.Grundig/Serializer.cs b/source/ChanSort.Loader.Grundig/Serializer.cs index e6c3576..5ad88c7 100644 --- a/source/ChanSort.Loader.Grundig/Serializer.cs +++ b/source/ChanSort.Loader.Grundig/Serializer.cs @@ -300,10 +300,8 @@ namespace ChanSort.Loader.Grundig #region Save() - public override void Save(string tvOutputFile) + public override void Save() { - // "Save As..." is not supported by this loader - foreach (var list in this.DataRoot.ChannelLists) this.UpdateChannelList(list); diff --git a/source/ChanSort.Loader.Hisense/ChannelDb/ChannelDbSerializer.cs b/source/ChanSort.Loader.Hisense/ChannelDb/ChannelDbSerializer.cs index e8e8b5a..8443507 100644 --- a/source/ChanSort.Loader.Hisense/ChannelDb/ChannelDbSerializer.cs +++ b/source/ChanSort.Loader.Hisense/ChannelDb/ChannelDbSerializer.cs @@ -1,9 +1,7 @@ //#define LOCK_LCN_LISTS using System; -using System.CodeDom; using System.Collections.Generic; -using System.IO; using System.Text.RegularExpressions; using Microsoft.Data.Sqlite; using ChanSort.Api; @@ -143,7 +141,7 @@ namespace ChanSort.Loader.Hisense.ChannelDb public override void Load() { - using (var conn = new SqliteConnection("Data Source=" + this.FileName)) + using (var conn = new SqliteConnection($"Data Source={this.FileName};Pooling=False")) { conn.Open(); using var cmd = conn.CreateCommand(); @@ -466,60 +464,46 @@ namespace ChanSort.Loader.Hisense.ChannelDb #region Save() - public override void Save(string tvOutputFile) + public override void Save() { Editor.SequentializeFavPos(this.channelLists[6], 4); - if (tvOutputFile != this.FileName) - File.Copy(this.FileName, tvOutputFile, true); - + using var conn = new SqliteConnection($"Data Source={this.FileName};Pooling=False"); + conn.Open(); + using var trans = conn.BeginTransaction(); + using var cmd = conn.CreateCommand(); + cmd.Transaction = trans; try { - using var conn = new SqliteConnection("Data Source=" + tvOutputFile); - conn.Open(); - using var trans = conn.BeginTransaction(); - using var cmd = conn.CreateCommand(); - cmd.Transaction = trans; - try - { - this.CreateFavTables(cmd); + this.CreateFavTables(cmd); - // must truncate and re-fill this table because there is a unique primary key constraint on a data column that needs to be edited - if (this.hasCamelCaseFavSchema) + // must truncate and re-fill this table because there is a unique primary key constraint on a data column that needs to be edited + if (this.hasCamelCaseFavSchema) + { + for (int i = 1; i <= 4; i++) { - for (int i = 1; i <= 4; i++) - { - cmd.CommandText = $"delete from fav_{i}"; - cmd.ExecuteNonQuery(); - } + cmd.CommandText = $"delete from fav_{i}"; + cmd.ExecuteNonQuery(); } + } #if !LOCK_LCN_LISTS - this.ResetLcn(cmd); + this.ResetLcn(cmd); #endif - foreach (var list in this.DataRoot.ChannelLists) - { - if (list.ReadOnly || list.IsMixedSourceFavoritesList) - continue; - foreach (var ci in list.Channels) - this.UpdateChannel(cmd, ci as Channel); - } - - trans.Commit(); - this.FileName = tvOutputFile; - } - catch + foreach (var list in this.DataRoot.ChannelLists) { - trans.Rollback(); - throw; + if (list.ReadOnly || list.IsMixedSourceFavoritesList) + continue; + foreach (var ci in list.Channels) + this.UpdateChannel(cmd, ci as Channel); } + + trans.Commit(); } - finally + catch { - // force closing the file and releasing the locks - SqliteConnection.ClearAllPools(); - GC.Collect(); - GC.WaitForPendingFinalizers(); + trans.Rollback(); + throw; } } #endregion diff --git a/source/ChanSort.Loader.Hisense/ServicelistDb/ServicelistDbSerializer.cs b/source/ChanSort.Loader.Hisense/ServicelistDb/ServicelistDbSerializer.cs index 66db625..3fb59dc 100644 --- a/source/ChanSort.Loader.Hisense/ServicelistDb/ServicelistDbSerializer.cs +++ b/source/ChanSort.Loader.Hisense/ServicelistDb/ServicelistDbSerializer.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; -using System.IO; using ChanSort.Api; using Microsoft.Data.Sqlite; @@ -115,7 +114,7 @@ namespace ChanSort.Loader.Hisense.ServicelistDb public override void Load() { - using (var conn = new SqliteConnection("Data Source=" + FileName)) + using (var conn = new SqliteConnection($"Data Source={this.FileName};Pooling=False")) { conn.Open(); using (var cmd = conn.CreateCommand()) @@ -444,41 +443,27 @@ left outer join {dbSchema.DvbServiceTable} digs on digs.ServiceId=s.Pid #region Save() - public override void Save(string tvOutputFile) + public override void Save() { - if (tvOutputFile != FileName) - File.Copy(FileName, tvOutputFile, true); - + using var conn = new SqliteConnection($"Data Source={this.FileName};Pooling=False"); + conn.Open(); + using var trans = conn.BeginTransaction(); + using var cmd = conn.CreateCommand(); try { - using var conn = new SqliteConnection("Data Source=" + tvOutputFile); - conn.Open(); - using var trans = conn.BeginTransaction(); - using var cmd = conn.CreateCommand(); - try - { #if !LOCK_LCN_LISTS - ResetLcn(cmd); + ResetLcn(cmd); #endif - UpdateServices(cmd); - UpdatePhysicalChannelLists(cmd); - UpdateUserFavoriteLists(cmd); + UpdateServices(cmd); + UpdatePhysicalChannelLists(cmd); + UpdateUserFavoriteLists(cmd); - trans.Commit(); - FileName = tvOutputFile; - } - catch - { - trans.Rollback(); - throw; - } + trans.Commit(); } - finally + catch { - // force closing the file and releasing the locks - SqliteConnection.ClearAllPools(); - GC.Collect(); - GC.WaitForPendingFinalizers(); + trans.Rollback(); + throw; } } diff --git a/source/ChanSort.Loader.LG/Binary/TllFileSerializer.cs b/source/ChanSort.Loader.LG/Binary/TllFileSerializer.cs index 3a13499..098de29 100644 --- a/source/ChanSort.Loader.LG/Binary/TllFileSerializer.cs +++ b/source/ChanSort.Loader.LG/Binary/TllFileSerializer.cs @@ -904,7 +904,7 @@ Due to issues with most recent LG firmwares such lists can no longer be modified // Saving ==================================== #region Save() - public override void Save(string tvOutputFile) + public override void Save() { int newAnalogChannelCount; int newDvbctChannelCount; @@ -928,36 +928,34 @@ Due to issues with most recent LG firmwares such lists can no longer be modified if (this.dvbsSubblockCrcOffset != null) this.UpdateDvbsChecksums(); - using (var file = new BinaryWriter(new FileStream(tvOutputFile, FileMode.Create, FileAccess.Write))) - { - // header - file.Write(this.fileContent, 0, this.analogBlockOffset); + using var file = new BinaryWriter(new FileStream(this.FileName, FileMode.Create, FileAccess.Write)); + // header + file.Write(this.fileContent, 0, this.analogBlockOffset); - // analog - file.Write(newAnalogChannelCount*this.actChannelSize + 4); - file.Write(newAnalogChannelCount); - file.Write(fileContent, this.analogBlockOffset + 8, newAnalogChannelCount*this.actChannelSize); + // analog + file.Write(newAnalogChannelCount*this.actChannelSize + 4); + file.Write(newAnalogChannelCount); + file.Write(fileContent, this.analogBlockOffset + 8, newAnalogChannelCount*this.actChannelSize); - // firmware - file.Write(fileContent, this.firmwareBlockOffset, this.firmwareBlockSize + 4); + // firmware + file.Write(fileContent, this.firmwareBlockOffset, this.firmwareBlockSize + 4); - // hospitality models extra block - if (hospitalityBlockOffset != 0) - file.Write(fileContent, this.hospitalityBlockOffset, this.hospitalityBlockSize + 4); + // hospitality models extra block + if (hospitalityBlockOffset != 0) + file.Write(fileContent, this.hospitalityBlockOffset, this.hospitalityBlockSize + 4); - // DVB-CT - file.Write(newDvbctChannelCount*this.actChannelSize + 4); - file.Write(newDvbctChannelCount); - file.Write(fileContent, this.dvbctBlockOffset + 8, newDvbctChannelCount * this.actChannelSize); + // DVB-CT + file.Write(newDvbctChannelCount*this.actChannelSize + 4); + file.Write(newDvbctChannelCount); + file.Write(fileContent, this.dvbctBlockOffset + 8, newDvbctChannelCount * this.actChannelSize); - // DVB-S - if (this.dvbsBlockOffset != 0) - file.Write(fileContent, this.dvbsBlockOffset, this.dvbsBlockSize + 4); + // DVB-S + if (this.dvbsBlockOffset != 0) + file.Write(fileContent, this.dvbsBlockOffset, this.dvbsBlockSize + 4); - // rest (including settings) - if (this.settingsBlockOffset != 0) - file.Write(fileContent, this.settingsBlockOffset, fileContent.Length - this.settingsBlockOffset); - } + // rest (including settings) + if (this.settingsBlockOffset != 0) + file.Write(fileContent, this.settingsBlockOffset, fileContent.Length - this.settingsBlockOffset); } #endregion diff --git a/source/ChanSort.Loader.LG/Binary/TllFileSerializer.sql.cs b/source/ChanSort.Loader.LG/Binary/TllFileSerializer.sql.cs index 3bd1e91..2b4beeb 100644 --- a/source/ChanSort.Loader.LG/Binary/TllFileSerializer.sql.cs +++ b/source/ChanSort.Loader.LG/Binary/TllFileSerializer.sql.cs @@ -67,19 +67,15 @@ from channel c inner join chanseq s on s.listid=c.listid and s.slot=c.slot if (list == null || list.Count == 0) return; - using (var conn = SqlClientFactory.Instance.CreateConnection()) - { - conn.ConnectionString = "server=(local);database=ChanSort;Integrated Security=true"; - conn.Open(); + using var conn = SqlClientFactory.Instance.CreateConnection(); + conn.ConnectionString = "server=(local);database=ChanSort;Integrated Security=true"; + conn.Open(); - using (var cmd = conn.CreateCommand()) - { - var listId = InsertListData(cmd); + using var cmd = conn.CreateCommand(); + var listId = InsertListData(cmd); - InsertChannelLinkedList(cmd, listId); - InsertChannelData(cmd, listId); - } - } + InsertChannelLinkedList(cmd, listId); + InsertChannelData(cmd, listId); } #endregion diff --git a/source/ChanSort.Loader.LG/GlobalClone/GcJsonSerializer.cs b/source/ChanSort.Loader.LG/GlobalClone/GcJsonSerializer.cs index e8cb784..824e1e1 100644 --- a/source/ChanSort.Loader.LG/GlobalClone/GcJsonSerializer.cs +++ b/source/ChanSort.Loader.LG/GlobalClone/GcJsonSerializer.cs @@ -292,7 +292,7 @@ namespace ChanSort.Loader.GlobalClone // saving #region Save() - public override void Save(string tvOutputFile) + public override void Save() { this.UpdateJsonDoc(); @@ -307,8 +307,7 @@ namespace ChanSort.Loader.GlobalClone var json = EscapeXml(sw.ToString()); sb.Append(json); sb.Append(xmlSuffix); - File.WriteAllText(tvOutputFile, sb.ToString()); - this.FileName = tvOutputFile; + File.WriteAllText(this.FileName, sb.ToString()); } #endregion diff --git a/source/ChanSort.Loader.LG/GlobalClone/GcXmlSerializer.cs b/source/ChanSort.Loader.LG/GlobalClone/GcXmlSerializer.cs index 83c58b7..2ee9a5a 100644 --- a/source/ChanSort.Loader.LG/GlobalClone/GcXmlSerializer.cs +++ b/source/ChanSort.Loader.LG/GlobalClone/GcXmlSerializer.cs @@ -52,10 +52,8 @@ namespace ChanSort.Loader.GlobalClone throw LoaderException.Fail("Invalid GlobalClone/XML file format. Maybe a binary xx*.TLL file?"); textContent = ReplaceInvalidXmlCharacters(textContent); var settings = new XmlReaderSettings { CheckCharacters = false }; - using (var reader = XmlReader.Create(new StringReader(textContent), settings)) - { - doc.Load(reader); - } + using var reader = XmlReader.Create(new StringReader(textContent), settings); + doc.Load(reader); } catch { @@ -354,41 +352,39 @@ namespace ChanSort.Loader.GlobalClone // A 3 byte UTF-8 envelope is used to encode 2 input bytes: 1110aaaa 10bbbbcc 10ccdddd represents the 16bit little endian integer aaaabbbbccccdddd, which represents bytes ccccdddd, aaaabbbb // If a remaining byte is >= 0x80, it is encoded in a 2 byte UTF-8 envelope: 110000aa 10aabbbb represents the byte aaaabbbb // If a remaining byte is < 0x80, it is encoded directly into a 1 byte UTF-8 char. (This can cause invalid XML files for values < 0x20.) - using (MemoryStream ms = new MemoryStream(40)) + using MemoryStream ms = new MemoryStream(40); + for (int i = 0, c = bytes.Length; i < c; i++) { - for (int i = 0, c = bytes.Length; i < c; i++) + int b0 = bytes[i + 0]; + if (b0 >= 0xE0) // 3-byte UTF envelope for 2 input bytes { - int b0 = bytes[i + 0]; - if (b0 >= 0xE0) // 3-byte UTF envelope for 2 input bytes - { - int b1 = bytes[i + 1]; - int b2 = bytes[i + 2]; - int ch1 = ((b1 & 0x03) << 6) | (b2 & 0x3F); - int ch2 = ((b0 & 0x0F) << 4) | ((b1 & 0x3C) >> 2); - ms.WriteByte((byte) ch1); - ms.WriteByte((byte) ch2); - i += 2; - } - else if (b0 >= 0xC0) // 2-byte UTF envelope for 1 input byte >= 0x80 - { - int b1 = bytes[i + 1]; - int ch = ((b0 & 0x03) << 6) | (b1 & 0x3F); - ms.WriteByte((byte)ch); - i++; - } - else if (b0 < 0x80) // 1-byte UTF envelope for 1 input byte < 0x80 - ms.WriteByte(bytes[i]); + int b1 = bytes[i + 1]; + int b2 = bytes[i + 2]; + int ch1 = ((b1 & 0x03) << 6) | (b2 & 0x3F); + int ch2 = ((b0 & 0x0F) << 4) | ((b1 & 0x3C) >> 2); + ms.WriteByte((byte) ch1); + ms.WriteByte((byte) ch2); + i += 2; } + else if (b0 >= 0xC0) // 2-byte UTF envelope for 1 input byte >= 0x80 + { + int b1 = bytes[i + 1]; + int ch = ((b0 & 0x03) << 6) | (b1 & 0x3F); + ms.WriteByte((byte)ch); + i++; + } + else if (b0 < 0x80) // 1-byte UTF envelope for 1 input byte < 0x80 + ms.WriteByte(bytes[i]); + } - string longName, shortName; - this.dvbStringDecoder.GetChannelNames(ms.GetBuffer(), 0, (int)ms.Length, out longName, out shortName); - return longName; - } + string longName, shortName; + this.dvbStringDecoder.GetChannelNames(ms.GetBuffer(), 0, (int)ms.Length, out longName, out shortName); + return longName; } #endregion #region Save() - public override void Save(string tvOutputFile) + public override void Save() { foreach (var list in this.DataRoot.ChannelLists) { @@ -485,22 +481,20 @@ namespace ChanSort.Loader.GlobalClone settings.OmitXmlDeclaration = true; settings.IndentChars = ""; settings.CheckCharacters = false; - using (StringWriter sw = new StringWriter()) - using (XmlWriter xw = XmlWriter.Create(sw, settings)) - { - doc.Save(xw); - xw.Flush(); - string xml = RestoreInvalidXmlCharacters(sw.ToString()); - xml = "\r\n\r\n" + xml; - xml = xml.Replace("\r\n", "\r\n\r\n"); - xml = xml.Replace("\r\n", "\r\n\r\n"); - xml = xml.Replace("", " "); - xml = xml.Replace("", " "); + using StringWriter sw = new StringWriter(); + using XmlWriter xw = XmlWriter.Create(sw, settings); + doc.Save(xw); + xw.Flush(); + string xml = RestoreInvalidXmlCharacters(sw.ToString()); + xml = "\r\n\r\n" + xml; + xml = xml.Replace("\r\n", "\r\n\r\n"); + xml = xml.Replace("\r\n", "\r\n\r\n"); + xml = xml.Replace("", " "); + xml = xml.Replace("", " "); - if (!xml.EndsWith("\r\n")) - xml += "\r\n"; - File.WriteAllText(tvOutputFile, xml, settings.Encoding); - } + if (!xml.EndsWith("\r\n")) + xml += "\r\n"; + File.WriteAllText(this.FileName, xml, settings.Encoding); } #endregion diff --git a/source/ChanSort.Loader.Loewe/Serializer.cs b/source/ChanSort.Loader.Loewe/Serializer.cs index ce09b1b..7ee28c0 100644 --- a/source/ChanSort.Loader.Loewe/Serializer.cs +++ b/source/ChanSort.Loader.Loewe/Serializer.cs @@ -391,7 +391,7 @@ class Serializer : SerializerBase #region Save() - public override void Save(string tvOutputFile) + public override void Save() { var fav = this.doc["servicelist"]["favorites"]; var elements = fav.GetElementsByTagName("favorite-item"); @@ -456,8 +456,7 @@ class Serializer : SerializerBase foreach (XmlNode item in lcn) fav.AppendChild(item); - doc.Save(tvOutputFile); - this.FileName = tvOutputFile; + doc.Save(this.FileName); } #endregion diff --git a/source/ChanSort.Loader.M3u/Serializer.cs b/source/ChanSort.Loader.M3u/Serializer.cs index 7d6a7ba..4297f2d 100644 --- a/source/ChanSort.Loader.M3u/Serializer.cs +++ b/source/ChanSort.Loader.M3u/Serializer.cs @@ -274,9 +274,9 @@ namespace ChanSort.Loader.M3u #endregion #region Save() - public override void Save(string tvOutputFile) + public override void Save() { - using var file = new StreamWriter(new FileStream(tvOutputFile, FileMode.Create), this.overrideEncoding ?? this.DefaultEncoding); + using var file = new StreamWriter(new FileStream(this.FileName, FileMode.Create), this.overrideEncoding ?? this.DefaultEncoding); file.NewLine = this.newLine; foreach(var line in this.headerLines) @@ -303,8 +303,6 @@ namespace ChanSort.Loader.M3u foreach(var line in this.trailingLines) file.WriteLine(line); - - this.FileName = tvOutputFile; } #endregion diff --git a/source/ChanSort.Loader.Panasonic/IdtvChannelSerializer.cs b/source/ChanSort.Loader.Panasonic/IdtvChannelSerializer.cs index c88f0b6..5a484a5 100644 --- a/source/ChanSort.Loader.Panasonic/IdtvChannelSerializer.cs +++ b/source/ChanSort.Loader.Panasonic/IdtvChannelSerializer.cs @@ -183,7 +183,7 @@ internal class IdtvChannelSerializer : SerializerBase if (!File.Exists(binFile)) throw LoaderException.Fail("expected file not found: " + binFile); - string connString = "Data Source=" + this.dbFile; + string connString = $"Data Source={this.dbFile};Pooling=False"; using var db = new SqliteConnection(connString); db.Open(); using var cmd = db.CreateCommand(); @@ -409,7 +409,7 @@ internal class IdtvChannelSerializer : SerializerBase #region Save() - public override void Save(string tvOutputFile) + public override void Save() { // saving the list requires to: // - update fields inside the .bin file data records and physically reorder the records @@ -593,66 +593,56 @@ internal class IdtvChannelSerializer : SerializerBase #region SaveTvDb() private void SaveTvDb(IDictionary newChannelIndexMap) { - try + string connString = $"Data Source={this.dbFile};Pooling=False"; + using var db = new SqliteConnection(connString); + db.Open(); + + using var trans = db.BeginTransaction(); + + using var upd = db.CreateCommand(); + upd.CommandText = "update channels set display_number=@progNr, browsable=@browseable, locked=@locked, favorite=@fav, channel_index=@recIdx where _id=@id"; // searchable=@searchable, + upd.Parameters.Add("@id", SqliteType.Integer); + upd.Parameters.Add("@progNr", SqliteType.Text); + upd.Parameters.Add("@browseable", SqliteType.Integer); + //upd.Parameters.Add("@searchable", SqliteType.Integer); + upd.Parameters.Add("@locked", SqliteType.Integer); + upd.Parameters.Add("@fav", SqliteType.Integer); + upd.Parameters.Add("@recIdx", SqliteType.Integer); + //upd.Parameters.Add("@ipf2", SqliteType.Integer); + upd.Prepare(); + + using var del = db.CreateCommand(); + del.CommandText = "delete from channels where _id=@id"; + del.Parameters.Add("@id", SqliteType.Integer); + del.Prepare(); + + foreach (var list in this.DataRoot.ChannelLists) { - string connString = "Data Source=" + this.dbFile; - using var db = new SqliteConnection(connString); - db.Open(); - - using var trans = db.BeginTransaction(); - - using var upd = db.CreateCommand(); - upd.CommandText = "update channels set display_number=@progNr, browsable=@browseable, locked=@locked, favorite=@fav, channel_index=@recIdx where _id=@id"; // searchable=@searchable, - upd.Parameters.Add("@id", SqliteType.Integer); - upd.Parameters.Add("@progNr", SqliteType.Text); - upd.Parameters.Add("@browseable", SqliteType.Integer); - //upd.Parameters.Add("@searchable", SqliteType.Integer); - upd.Parameters.Add("@locked", SqliteType.Integer); - upd.Parameters.Add("@fav", SqliteType.Integer); - upd.Parameters.Add("@recIdx", SqliteType.Integer); - //upd.Parameters.Add("@ipf2", SqliteType.Integer); - upd.Prepare(); - - using var del = db.CreateCommand(); - del.CommandText = "delete from channels where _id=@id"; - del.Parameters.Add("@id", SqliteType.Integer); - del.Prepare(); - - foreach (var list in this.DataRoot.ChannelLists) + foreach (var ch in list.Channels) { - foreach (var ch in list.Channels) + if (ch is not DbChannel dbc) + continue; + if (ch.NewProgramNr < 0 || ch.IsDeleted) { - if (ch is not DbChannel dbc) - continue; - if (ch.NewProgramNr < 0 || ch.IsDeleted) - { - del.Parameters["@id"].Value = ch.RecordIndex; - del.ExecuteNonQuery(); - } - else - { - upd.Parameters["@id"].Value = ch.RecordIndex; - upd.Parameters["@progNr"].Value = ch.NewProgramNr; - upd.Parameters["@browseable"].Value = !ch.Skip; - //upd.Parameters["@searchable"].Value = !ch.Hidden; - upd.Parameters["@locked"].Value = ch.Lock; - upd.Parameters["@fav"].Value = (int)ch.Favorites; - upd.Parameters["@recIdx"].Value = newChannelIndexMap[(ushort)dbc.InternalProviderFlag2]; - //upd.Parameters["@ipf2"].Value = (int)(ushort)dbc.InternalProviderFlag2; // fix broken short/ushort/int sign extension - upd.ExecuteNonQuery(); - } + del.Parameters["@id"].Value = ch.RecordIndex; + del.ExecuteNonQuery(); + } + else + { + upd.Parameters["@id"].Value = ch.RecordIndex; + upd.Parameters["@progNr"].Value = ch.NewProgramNr; + upd.Parameters["@browseable"].Value = !ch.Skip; + //upd.Parameters["@searchable"].Value = !ch.Hidden; + upd.Parameters["@locked"].Value = ch.Lock; + upd.Parameters["@fav"].Value = (int)ch.Favorites; + upd.Parameters["@recIdx"].Value = newChannelIndexMap[(ushort)dbc.InternalProviderFlag2]; + //upd.Parameters["@ipf2"].Value = (int)(ushort)dbc.InternalProviderFlag2; // fix broken short/ushort/int sign extension + upd.ExecuteNonQuery(); } } + } - trans.Commit(); - } - finally - { - // force closing the file and releasing the locks - SqliteConnection.ClearAllPools(); - GC.Collect(); - GC.WaitForPendingFinalizers(); - } + trans.Commit(); } #endregion diff --git a/source/ChanSort.Loader.Panasonic/SvlSerializer.cs b/source/ChanSort.Loader.Panasonic/SvlSerializer.cs index ab02fd8..3149055 100644 --- a/source/ChanSort.Loader.Panasonic/SvlSerializer.cs +++ b/source/ChanSort.Loader.Panasonic/SvlSerializer.cs @@ -74,7 +74,7 @@ namespace ChanSort.Loader.Panasonic this.CreateDummySatellites(); - string channelConnString = "Data Source=" + this.workFile; + string channelConnString = $"Data Source={this.workFile};Pooling=False"; using var conn = new SqliteConnection(channelConnString); conn.Open(); using var cmd = conn.CreateCommand(); @@ -112,15 +112,13 @@ namespace ChanSort.Loader.Panasonic #region GetCypherMode() private CypherMode GetCypherMode(string file) { - using (var stream = File.OpenRead(file)) - using (var rdr = new BinaryReader(stream)) - { - uint value = (uint)rdr.ReadInt32(); - if (value == 0x694C5153) return CypherMode.None; // "SQLi" - if (value == 0x42445350) return CypherMode.HeaderAndChecksum; // "PSDB" - if (value == 0xA07DCB50) return CypherMode.Encryption; - return CypherMode.Unknown; - } + using var stream = File.OpenRead(file); + using var rdr = new BinaryReader(stream); + uint value = (uint)rdr.ReadInt32(); + if (value == 0x694C5153) return CypherMode.None; // "SQLi" + if (value == 0x42445350) return CypherMode.HeaderAndChecksum; // "PSDB" + if (value == 0xA07DCB50) return CypherMode.Encryption; + return CypherMode.Unknown; } #endregion @@ -297,15 +295,11 @@ order by s.ntype,major_channel #region Save() - public override void Save(string tvOutputFile) + public override void Save() { - this.FileName = tvOutputFile; - - try + string channelConnString = $"Data Source={this.workFile};Pooling=False"; + using (var conn = new SqliteConnection(channelConnString)) { - string channelConnString = "Data Source=" + this.workFile; - using var conn = new SqliteConnection(channelConnString); - conn.Open(); using var trans = conn.BeginTransaction(); using var cmd = conn.CreateCommand(); @@ -322,13 +316,6 @@ order by s.ntype,major_channel cmd.Transaction = null; this.RepairCorruptedDatabaseImage(cmd); } - finally - { - // force closing the file and releasing the locks - SqliteConnection.ClearAllPools(); - GC.Collect(); - GC.WaitForPendingFinalizers(); - } this.WriteCypheredFile(); } diff --git a/source/ChanSort.Loader.Panasonic/XmlSerializer.cs b/source/ChanSort.Loader.Panasonic/XmlSerializer.cs index 1ba754c..9d08c5e 100644 --- a/source/ChanSort.Loader.Panasonic/XmlSerializer.cs +++ b/source/ChanSort.Loader.Panasonic/XmlSerializer.cs @@ -149,7 +149,7 @@ namespace ChanSort.Loader.Panasonic #region Save() - public override void Save(string tvOutputFile) + public override void Save() { var sec = ini.GetSection("channel_list.xml"); var reorder = sec?.GetBool("reorderRecordsByChannelNumber", true) ?? true; @@ -194,8 +194,7 @@ namespace ChanSort.Loader.Panasonic var xml = stringWriter.ToString(); xml = UnescapeXmlChars(xml); // create same broken XML as the original export with unescaped entities xml = xml.Replace(" />", "/>"); // original file has no space before the element end - File.WriteAllText(tvOutputFile, xml, xmlSettings.Encoding); - this.FileName = tvOutputFile; + File.WriteAllText(this.FileName, xml, xmlSettings.Encoding); } #endregion diff --git a/source/ChanSort.Loader.Philips/BinarySerializer.cs b/source/ChanSort.Loader.Philips/BinarySerializer.cs index 5330f7c..62ce36f 100644 --- a/source/ChanSort.Loader.Philips/BinarySerializer.cs +++ b/source/ChanSort.Loader.Philips/BinarySerializer.cs @@ -597,7 +597,7 @@ namespace ChanSort.Loader.Philips return; this.dataFilePaths.Add(dbPath); - using var conn = new SqliteConnection($"Data Source={dbPath}"); + using var conn = new SqliteConnection($"Data Source={dbPath};Pooling=False"); conn.Open(); using var cmd = conn.CreateCommand(); @@ -669,7 +669,7 @@ namespace ChanSort.Loader.Philips } } - using var conn = new SqliteConnection($"Data Source={tvDb}"); + using var conn = new SqliteConnection($"Data Source={tvDb};Pooling=False"); conn.Open(); using var cmd = conn.CreateCommand(); cmd.CommandText = "select _id, display_number, display_name, original_network_id, transport_stream_id, service_id, service_type from channels"; @@ -729,7 +729,7 @@ namespace ChanSort.Loader.Philips this.Features.FavoritesMode = FavoritesMode.OrderedPerSource; this.Features.MaxFavoriteLists = 4; - using var conn = new SqliteConnection($"Data Source={listDb}"); + using var conn = new SqliteConnection($"Data Source={listDb};Pooling=False"); conn.Open(); using var cmd = conn.CreateCommand(); @@ -787,7 +787,7 @@ namespace ChanSort.Loader.Philips this.Features.MaxFavoriteLists = 8; this.Features.AllowGapsInFavNumbers = false; - using var conn = new SqliteConnection($"Data Source={listDb}"); + using var conn = new SqliteConnection($"Data Source={listDb};Pooling=False"); conn.Open(); // older versions of ChanSort wrote invalid "list_id" values starting at 0 instead of 1 and going past 8. @@ -842,7 +842,7 @@ namespace ChanSort.Loader.Philips // saving #region Save() - public override void Save(string tvOutputFile) + public override void Save() { var dir = Path.GetDirectoryName(this.FileName) ?? ""; var channellib = Path.Combine(dir, "channellib"); @@ -1095,7 +1095,7 @@ namespace ChanSort.Loader.Philips if (!File.Exists(dbPath)) return; - using var conn = new SqliteConnection($"Data Source={dbPath}"); + using var conn = new SqliteConnection($"Data Source={dbPath};Pooling=False"); conn.Open(); using var trans = conn.BeginTransaction(); using var cmd = conn.CreateCommand(); @@ -1134,7 +1134,7 @@ namespace ChanSort.Loader.Philips if (!File.Exists(tvDb)) return; - using var conn = new SqliteConnection($"Data Source={tvDb}"); + using var conn = new SqliteConnection($"Data Source={tvDb};Pooling=False"); conn.Open(); using var trans = conn.BeginTransaction(); using var cmd = conn.CreateCommand(); @@ -1175,7 +1175,7 @@ namespace ChanSort.Loader.Philips if (!File.Exists(listDb) || this.channelsById.Count == 0) return; - using var conn = new SqliteConnection($"Data Source={listDb}"); + using var conn = new SqliteConnection($"Data Source={listDb};Pooling=False"); conn.Open(); using var trans = conn.BeginTransaction(); using var cmd = conn.CreateCommand(); @@ -1238,7 +1238,7 @@ namespace ChanSort.Loader.Philips if (!File.Exists(listDb)) return; - using var conn = new SqliteConnection($"Data Source={listDb}"); + using var conn = new SqliteConnection($"Data Source={listDb};Pooling=False"); conn.Open(); using var trans = conn.BeginTransaction(); using var cmd = conn.CreateCommand(); diff --git a/source/ChanSort.Loader.Philips/DbSerializer.cs b/source/ChanSort.Loader.Philips/DbSerializer.cs index 7de200b..30359c4 100644 --- a/source/ChanSort.Loader.Philips/DbSerializer.cs +++ b/source/ChanSort.Loader.Philips/DbSerializer.cs @@ -471,7 +471,7 @@ namespace ChanSort.Loader.Philips public override IEnumerable GetDataFilePaths() => this.dbFileByList.Values.Union(this.flashFileByList.Values).Select(tup => tup.Item1); #region Save() - public override void Save(string tvOutputFile) + public override void Save() { // update *.db files foreach (var listAndFile in this.dbFileByList) diff --git a/source/ChanSort.Loader.Philips/XmlSerializer.cs b/source/ChanSort.Loader.Philips/XmlSerializer.cs index 03786ff..4de25ef 100644 --- a/source/ChanSort.Loader.Philips/XmlSerializer.cs +++ b/source/ChanSort.Loader.Philips/XmlSerializer.cs @@ -268,10 +268,8 @@ namespace ChanSort.Loader.Philips var xml = fileData.textContent; if (fileData.formatVersion == FormatVersion.RepairXml) xml = xml.Replace("&", "&"); // Philips exports broken XML with unescaped & instead of & - using (var reader = XmlReader.Create(new StringReader(xml), settings)) - { - fileData.doc.Load(reader); - } + using var reader = XmlReader.Create(new StringReader(xml), settings); + fileData.doc.Load(reader); } catch { @@ -580,10 +578,8 @@ namespace ChanSort.Loader.Philips #region Save() - public override void Save(string tvOutputFile) + public override void Save() { - // "Save As..." is not supported by this loader - foreach (var list in this.DataRoot.ChannelLists) { if (list.IsMixedSourceFavoritesList) diff --git a/source/ChanSort.Loader.Samsung/Scm/ScmSerializer.cs b/source/ChanSort.Loader.Samsung/Scm/ScmSerializer.cs index 44e8718..5d1dfcd 100644 --- a/source/ChanSort.Loader.Samsung/Scm/ScmSerializer.cs +++ b/source/ChanSort.Loader.Samsung/Scm/ScmSerializer.cs @@ -267,19 +267,17 @@ namespace ChanSort.Loader.Samsung.Scm series = validCandidates[0]; else { - using (var dlg = Api.View.Default?.CreateActionBox("")) - { - if (dlg == null) // during unit testing - return false; - dlg.Message = "File type could not be detected automatically.\nPlease choose the model series of your TV:"; - foreach(var cand in validCandidates) - dlg.AddAction("Series " + cand, cand); - dlg.AddAction("Cancel", 0); - dlg.ShowDialog(); - if (dlg.SelectedAction == 0) - return false; - series = (char)dlg.SelectedAction; - } + using var dlg = Api.View.Default?.CreateActionBox(""); + if (dlg == null) // during unit testing + return false; + dlg.Message = "File type could not be detected automatically.\nPlease choose the model series of your TV:"; + foreach(var cand in validCandidates) + dlg.AddAction("Series " + cand, cand); + dlg.AddAction("Cancel", 0); + dlg.ShowDialog(); + if (dlg.SelectedAction == 0) + return false; + series = (char)dlg.SelectedAction; } this.modelConstants.TryGetValue("Series:" + series, out this.c); @@ -653,7 +651,7 @@ namespace ChanSort.Loader.Samsung.Scm #endregion #region Save() - public override void Save(string tvOutputFile) + public override void Save() { var zip = Path.Combine(this.TempPath, this.baseFolder); this.SaveChannels(zip, "map-AirA", this.avbtChannels, this.avbtFileContent); @@ -670,7 +668,7 @@ namespace ChanSort.Loader.Samsung.Scm this.SaveChannels(zip, "map-CanalDigitalSatD", this.canalDigitalChannels, this.canalDigitalFileContent); this.SaveChannels(zip, "map-DigitalPlusD", this.digitalPlusChannels, this.digitalPlusFileContent); this.SaveChannels(zip, "map-CyfraPlusD", this.cyfraPlusChannels, this.cyfraPlusFileContent); - this.ZipToOutputFile(tvOutputFile, true); + this.ZipToOutputFile(true); } #endregion @@ -681,10 +679,8 @@ namespace ChanSort.Loader.Samsung.Scm return; string tempFilePath = Path.Combine(zip, fileName); - using (var stream = new FileStream(tempFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) - { - this.WriteChannels(channels, fileContent, stream); - } + using var stream = new FileStream(tempFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); + this.WriteChannels(channels, fileContent, stream); } #endregion diff --git a/source/ChanSort.Loader.Samsung/Zip/DbSerializer.cs b/source/ChanSort.Loader.Samsung/Zip/DbSerializer.cs index d6e70d9..796bdd3 100644 --- a/source/ChanSort.Loader.Samsung/Zip/DbSerializer.cs +++ b/source/ChanSort.Loader.Samsung/Zip/DbSerializer.cs @@ -45,7 +45,7 @@ namespace ChanSort.Loader.Samsung.Zip { try { - using var conn = new SqliteConnection("Data Source=" + this.TempPath + "\\sat"); + using var conn = new SqliteConnection($"Data Source={(this.TempPath + "\\sat")};Pooling=False"); conn.Open(); this.ReadSatDatabase(conn); } @@ -62,13 +62,13 @@ namespace ChanSort.Loader.Samsung.Zip foreach (var filePath in files) { var filename = Path.GetFileName(filePath) ?? ""; - if (filename.StartsWith("vconf_")) + if (filename.StartsWith("vconf_") || filename.EndsWith("-shm")) continue; FileType type; try { - using var conn = new SqliteConnection("Data Source=" + filePath); + using var conn = new SqliteConnection($"Data Source={filePath};Pooling=False"); conn.Open(); using (var cmd = conn.CreateCommand()) { @@ -131,12 +131,10 @@ namespace ChanSort.Loader.Samsung.Zip #region ReadSatDatabase() private void ReadSatDatabase(SqliteConnection conn) { - using (var cmd = conn.CreateCommand()) - { - this.RepairCorruptedDatabaseImage(cmd); - this.ReadSatellites(cmd); - this.ReadTransponders(cmd); - } + using var cmd = conn.CreateCommand(); + this.RepairCorruptedDatabaseImage(cmd); + this.ReadSatellites(cmd); + this.ReadTransponders(cmd); } #endregion @@ -144,19 +142,17 @@ namespace ChanSort.Loader.Samsung.Zip private void ReadSatellites(IDbCommand cmd) { cmd.CommandText = "select distinct satId, cast(satName as blob), satPos, satDir from SAT"; - using (var r = cmd.ExecuteReader()) + using var r = cmd.ExecuteReader(); + while (r.Read()) { - while (r.Read()) - { - Satellite sat = new Satellite(r.GetInt32(0)); - int pos = Math.Abs(r.GetInt32(2)); - // 171027 - ohuseyinoglu: For user-defined satellites, the direction may be -1 - // (and not just 1 for "E", 0 for "W") - int dir = r.GetInt32(3); - sat.OrbitalPosition = $"{pos / 10}.{pos % 10}{(dir == 1 ? "E" : dir == 0 ? "W" : "")}"; - sat.Name = ReadUtf16(r, 1); - this.DataRoot.AddSatellite(sat); - } + Satellite sat = new Satellite(r.GetInt32(0)); + int pos = Math.Abs(r.GetInt32(2)); + // 171027 - ohuseyinoglu: For user-defined satellites, the direction may be -1 + // (and not just 1 for "E", 0 for "W") + int dir = r.GetInt32(3); + sat.OrbitalPosition = $"{pos / 10}.{pos % 10}{(dir == 1 ? "E" : dir == 0 ? "W" : "")}"; + sat.Name = ReadUtf16(r, 1); + this.DataRoot.AddSatellite(sat); } } #endregion @@ -165,21 +161,19 @@ namespace ChanSort.Loader.Samsung.Zip private void ReadTransponders(IDbCommand cmd) { cmd.CommandText = "select satId, tpFreq, tpPol, tpSr, tpId from SAT_TP"; - using (var r = cmd.ExecuteReader()) + using var r = cmd.ExecuteReader(); + while (r.Read()) { - while (r.Read()) - { - // 171027 - ohuseyinoglu: tpId is the primary key of this table, we should be able to use it as "id/dict. index" - // It will also be our lookup value for the CHNL table - int id = r.GetInt32(4); - Transponder tp = new Transponder(id); - tp.FrequencyInMhz = (decimal)r.GetInt32(1) / 1000; - tp.Number = id; - tp.Polarity = r.GetInt32(2) == 0 ? 'H' : 'V'; - tp.Satellite = this.DataRoot.Satellites.TryGet(r.GetInt32(0)); - tp.SymbolRate = r.GetInt32(3); - this.DataRoot.AddTransponder(tp.Satellite, tp); - } + // 171027 - ohuseyinoglu: tpId is the primary key of this table, we should be able to use it as "id/dict. index" + // It will also be our lookup value for the CHNL table + int id = r.GetInt32(4); + Transponder tp = new Transponder(id); + tp.FrequencyInMhz = (decimal)r.GetInt32(1) / 1000; + tp.Number = id; + tp.Polarity = r.GetInt32(2) == 0 ? 'H' : 'V'; + tp.Satellite = this.DataRoot.Satellites.TryGet(r.GetInt32(0)); + tp.SymbolRate = r.GetInt32(3); + this.DataRoot.AddTransponder(tp.Satellite, tp); } } #endregion @@ -189,13 +183,11 @@ namespace ChanSort.Loader.Samsung.Zip private void ReadChannelDatabase(SqliteConnection conn, string dbPath, FileType fileType) { this.channelById.Clear(); - using (var cmd = conn.CreateCommand()) - { - var providers = fileType == FileType.ChannelDbDvb ? this.ReadProviders(cmd) : null; - var channelList = this.ReadChannels(cmd, dbPath, providers, fileType); - this.ReadFavorites(cmd); - this.dbPathByChannelList.Add(channelList, dbPath); - } + using var cmd = conn.CreateCommand(); + var providers = fileType == FileType.ChannelDbDvb ? this.ReadProviders(cmd) : null; + var channelList = this.ReadChannels(cmd, dbPath, providers, fileType); + this.ReadFavorites(cmd); + this.dbPathByChannelList.Add(channelList, dbPath); } #endregion @@ -293,15 +285,14 @@ namespace ChanSort.Loader.Samsung.Zip return SignalSource.IP|SignalSource.Digital; var signalSource = fileType == FileType.ChannelDbAnalog ? SignalSource.Analog : SignalSource.Digital; cmd.CommandText = "select distinct chType from CHNL"; - using (var r = cmd.ExecuteReader()) + using var r = cmd.ExecuteReader(); + if (r.Read()) { - if (r.Read()) - { - var ss = ChTypeToSignalSource(r.GetInt32(0)); - if (ss != 0) - signalSource = ss; - } + var ss = ChTypeToSignalSource(r.GetInt32(0)); + if (ss != 0) + signalSource = ss; } + return signalSource; } @@ -476,7 +467,7 @@ namespace ChanSort.Loader.Samsung.Zip #region Save() - public override void Save(string tvOutputFile) + public override void Save() { foreach (var channelList in this.DataRoot.ChannelLists) { @@ -484,40 +475,29 @@ namespace ChanSort.Loader.Samsung.Zip SaveChannelList(channelList, dbPath); } - // force closing the file and releasing the locks - GC.Collect(); - GC.WaitForPendingFinalizers(); - - this.ZipToOutputFile(tvOutputFile); + this.ZipToOutputFile(); } #endregion #region SaveChannelList() private void SaveChannelList(ChannelList channelList, string dbPath) { - try + using var conn = new SqliteConnection($"Data Source={dbPath};Pooling=False"); + conn.Open(); + using (var trans = conn.BeginTransaction()) { - using var conn = new SqliteConnection("Data Source=" + dbPath); - conn.Open(); - using (var trans = conn.BeginTransaction()) - { - using var cmdUpdateSrv = PrepareUpdateCommand(conn); - using var cmdDeleteSrv = PrepareDeleteCommand(conn, (channelList.SignalSource & SignalSource.Digital) != 0); - using var cmdInsertFav = PrepareInsertFavCommand(conn); - using var cmdUpdateFav = PrepareUpdateFavCommand(conn); - using var cmdDeleteFav = PrepareDeleteFavCommand(conn); - Editor.SequentializeFavPos(channelList, 5); - this.WriteChannels(cmdUpdateSrv, cmdDeleteSrv, cmdInsertFav, cmdUpdateFav, cmdDeleteFav, channelList); - trans.Commit(); - } + using var cmdUpdateSrv = PrepareUpdateCommand(conn); + using var cmdDeleteSrv = PrepareDeleteCommand(conn, (channelList.SignalSource & SignalSource.Digital) != 0); + using var cmdInsertFav = PrepareInsertFavCommand(conn); + using var cmdUpdateFav = PrepareUpdateFavCommand(conn); + using var cmdDeleteFav = PrepareDeleteFavCommand(conn); + Editor.SequentializeFavPos(channelList, 5); + this.WriteChannels(cmdUpdateSrv, cmdDeleteSrv, cmdInsertFav, cmdUpdateFav, cmdDeleteFav, channelList); + trans.Commit(); + } - using var cmd = conn.CreateCommand(); - this.RepairCorruptedDatabaseImage(cmd); - } - finally - { - SqliteConnection.ClearAllPools(); - } + using var cmd = conn.CreateCommand(); + this.RepairCorruptedDatabaseImage(cmd); } #endregion diff --git a/source/ChanSort.Loader.SatcoDX/Serializer.cs b/source/ChanSort.Loader.SatcoDX/Serializer.cs index d3c5227..bcb16ce 100644 --- a/source/ChanSort.Loader.SatcoDX/Serializer.cs +++ b/source/ChanSort.Loader.SatcoDX/Serializer.cs @@ -71,15 +71,9 @@ namespace ChanSort.Loader.SatcoDX #region Save() - public override void Save(string tvOutputFile) + public override void Save() { - if (tvOutputFile != this.FileName) - { - File.Copy(this.FileName, tvOutputFile); - this.FileName = tvOutputFile; - } - - using var file = new FileStream(tvOutputFile, FileMode.Create); + using var file = new FileStream(this.FileName, FileMode.Create); byte[] buffer = null; foreach (var channel in this.allChannels.GetChannelsByNewOrder()) { diff --git a/source/ChanSort.Loader.Sharp/SharpSerializer.cs b/source/ChanSort.Loader.Sharp/SharpSerializer.cs index 1b98d25..6ae6200 100644 --- a/source/ChanSort.Loader.Sharp/SharpSerializer.cs +++ b/source/ChanSort.Loader.Sharp/SharpSerializer.cs @@ -300,11 +300,9 @@ namespace ChanSort.Loader.Sharp #region Save() - public override void Save(string tvOutputFile) + public override void Save() { - this.FileName = tvOutputFile; - - using var file = new StreamWriter(new FileStream(tvOutputFile, FileMode.Create), this.encoding); + using var file = new StreamWriter(new FileStream(this.FileName, FileMode.Create), this.encoding); // write original header for (int i=0; i<3; i++) diff --git a/source/ChanSort.Loader.Sony/Serializer.cs b/source/ChanSort.Loader.Sony/Serializer.cs index 6b7f359..57bf604 100644 --- a/source/ChanSort.Loader.Sony/Serializer.cs +++ b/source/ChanSort.Loader.Sony/Serializer.cs @@ -594,7 +594,7 @@ namespace ChanSort.Loader.Sony #region Save() - public override void Save(string tvOutputFile) + public override void Save() { // sdbT if (this.channeListNodes.TryGetValue(SignalSource.DvbT, out var nodes)) @@ -659,7 +659,7 @@ namespace ChanSort.Loader.Sony xml = xml.Substring(0, i0 + 1) + hexCrc + xml.Substring(i1); var enc = new UTF8Encoding(false, false); - File.WriteAllText(tvOutputFile, xml, enc); + File.WriteAllText(this.FileName, xml, enc); } #endregion diff --git a/source/ChanSort.Loader.Toshiba/ChmgtDbSerializer.cs b/source/ChanSort.Loader.Toshiba/ChmgtDbSerializer.cs index 417b0c1..fa14893 100644 --- a/source/ChanSort.Loader.Toshiba/ChmgtDbSerializer.cs +++ b/source/ChanSort.Loader.Toshiba/ChmgtDbSerializer.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; using ChanSort.Api; using Microsoft.Data.Sqlite; @@ -54,7 +53,7 @@ namespace ChanSort.Loader.Toshiba else workingDir = Path.GetDirectoryName(this.FileName); - var sysDataConnString = "Data Source=" + this.workingDir + FILE_dvbSysData_db; + var sysDataConnString = $"Data Source={this.workingDir + FILE_dvbSysData_db};Pooling=false"; using (var conn = new SqliteConnection(sysDataConnString)) { conn.Open(); @@ -64,7 +63,7 @@ namespace ChanSort.Loader.Toshiba ReadTransponders(cmd); } - var mainDataConnString = "Data Source=" + this.workingDir + FILE_dvbMainData_db; + var mainDataConnString = $"Data Source={this.workingDir + FILE_dvbMainData_db};Pooling=False"; using (var conn = new SqliteConnection(mainDataConnString)) { conn.Open(); @@ -72,7 +71,7 @@ namespace ChanSort.Loader.Toshiba ReadCryptInfo(cmd); } - var channelConnString = "Data Source=" + this.workingDir + FILE_chmgt_db; + var channelConnString = $"Data Source={this.workingDir + FILE_chmgt_db};Pooling=False"; using (var conn = new SqliteConnection(channelConnString)) { conn.Open(); @@ -259,13 +258,11 @@ namespace ChanSort.Loader.Toshiba #region Save() - public override void Save(string tvOutputFile) + public override void Save() { - try + var channelConnString = $"Data Source={this.workingDir + FILE_chmgt_db};Pooling=False"; + using (var conn = new SqliteConnection(channelConnString)) { - var channelConnString = "Data Source=" + this.workingDir + FILE_chmgt_db; - using var conn = new SqliteConnection(channelConnString); - conn.Open(); using var trans = conn.BeginTransaction(); using var cmd = conn.CreateCommand(); @@ -280,16 +277,9 @@ namespace ChanSort.Loader.Toshiba cmd.Transaction = null; RepairCorruptedDatabaseImage(cmd); } - finally - { - // force closing the file and releasing the locks - SqliteConnection.ClearAllPools(); - GC.Collect(); - GC.WaitForPendingFinalizers(); - } if (Path.GetExtension(this.FileName).ToLowerInvariant() == ".zip") - ZipToOutputFile(tvOutputFile); + ZipToOutputFile(); } #endregion diff --git a/source/ChanSort.Loader.Toshiba/SettingsDbSerializer.cs b/source/ChanSort.Loader.Toshiba/SettingsDbSerializer.cs index 227cf0c..ad5b327 100644 --- a/source/ChanSort.Loader.Toshiba/SettingsDbSerializer.cs +++ b/source/ChanSort.Loader.Toshiba/SettingsDbSerializer.cs @@ -67,7 +67,7 @@ namespace ChanSort.Loader.Toshiba #region Load() public override void Load() { - string sysDataConnString = "Data Source=" + this.FileName; + string sysDataConnString = $"Data Source={this.FileName};Pooling=False"; using var conn = new SqliteConnection(sysDataConnString); conn.Open(); @@ -206,28 +206,23 @@ left outer join ChanDataTable ac on ac.handle=a.m_channel_no #region Save() - public override void Save(string tvOutputFile) + public override void Save() { - if (tvOutputFile != this.FileName) + string channelConnString = $"Data Source={this.FileName};Pooling=False"; + using (var conn = new SqliteConnection(channelConnString)) { - File.Copy(this.FileName, tvOutputFile, true); - this.FileName = tvOutputFile; + conn.Open(); + using var trans = conn.BeginTransaction(); + using var cmd = conn.CreateCommand(); + using var cmd2 = conn.CreateCommand(); + + this.WriteChannels(cmd, cmd2, this.channels); + trans.Commit(); + + cmd.Transaction = null; + this.RepairCorruptedDatabaseImage(cmd); } - string channelConnString = "Data Source=" + this.FileName; - using var conn = new SqliteConnection(channelConnString); - conn.Open(); - using var trans = conn.BeginTransaction(); - using var cmd = conn.CreateCommand(); - using var cmd2 = conn.CreateCommand(); - - this.WriteChannels(cmd, cmd2, this.channels); - trans.Commit(); - - cmd.Transaction = null; - this.RepairCorruptedDatabaseImage(cmd); - conn.Close(); - // copy settingsDB.db to settingsDBBackup.db var backupFile = GetBackupFilePath(); File.Copy(this.FileName, backupFile, true); diff --git a/source/ChanSort.Loader.VDR/Serializer.cs b/source/ChanSort.Loader.VDR/Serializer.cs index 868bd72..af60570 100644 --- a/source/ChanSort.Loader.VDR/Serializer.cs +++ b/source/ChanSort.Loader.VDR/Serializer.cs @@ -42,15 +42,9 @@ namespace ChanSort.Loader.VDR #endregion #region Save() - public override void Save(string tvOutputFile) + public override void Save() { - if (tvOutputFile != FileName) - { - File.Copy(FileName, tvOutputFile); - FileName = tvOutputFile; - } - - using var file = new StreamWriter(tvOutputFile); + using var file = new StreamWriter(this.FileName); foreach (var channel in allChannels.GetChannelsByNewOrder()) { // when a reference list was applied, the list may contain proxy entries for deleted channels, which must be ignored diff --git a/source/ChanSort/ChanSort.csproj b/source/ChanSort/ChanSort.csproj index 7a00385..22fc654 100644 --- a/source/ChanSort/ChanSort.csproj +++ b/source/ChanSort/ChanSort.csproj @@ -661,6 +661,10 @@ + + $(ProjectDir)..\deployLibs.cmd $(TargetDir) + +