- removed superfluous parameter from SerializerBase.Save()

- added "Pooling=False" parameter to all Sqlite connection strings to prevent open file locks after closing the connection and to avoid extreme delays when using CloseAllPools()
- C# code refactoring "using var" instead of "using ( ) { }" where possible
This commit is contained in:
Horst Beham
2022-11-29 22:00:16 +01:00
parent 6f3df7044e
commit d361d51b8b
57 changed files with 511 additions and 641 deletions

View File

@@ -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<ushort, int> 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

View File

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

View File

@@ -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