2015-04-17 21:59:44 +02:00
using System ;
using System.Collections.Generic ;
using System.Data ;
using System.Data.SQLite ;
using System.IO ;
2015-04-22 09:51:21 +02:00
using System.Text ;
2015-04-17 21:59:44 +02:00
using System.Windows.Forms ;
using ChanSort.Api ;
using ICSharpCode.SharpZipLib.Zip ;
2015-06-05 06:08:40 +02:00
namespace ChanSort.Loader.SamsungJ
2015-04-17 21:59:44 +02:00
{
class DbSerializer : SerializerBase
{
private readonly Dictionary < long , DbChannel > channelById = new Dictionary < long , DbChannel > ( ) ;
2015-04-22 09:51:21 +02:00
private readonly Dictionary < ChannelList , string > dbPathByChannelList = new Dictionary < ChannelList , string > ( ) ;
2015-04-17 21:59:44 +02:00
private string tempDir ;
2015-06-05 06:08:40 +02:00
private Dictionary < int , Transponder > transponderByFreq ;
2015-04-17 21:59:44 +02:00
2015-06-05 06:08:40 +02:00
private enum FileType { Unknown , SatDb , ChannelDbDvb , ChannelDbAnalog }
2015-04-22 09:51:21 +02:00
2015-04-17 21:59:44 +02:00
#region ctor ( )
public DbSerializer ( string inputFile ) : base ( inputFile )
{
DepencencyChecker . AssertVc2010RedistPackageX86Installed ( ) ;
2015-06-13 18:37:59 +02:00
this . Features . ChannelNameEdit = ChannelNameEditMode . All ;
2015-11-29 20:36:56 +01:00
this . Features . CanDeleteChannels = true ;
2015-06-13 18:37:59 +02:00
this . DataRoot . SupportedFavorites = Favorites . A | Favorites . B | Favorites . C | Favorites . D | Favorites . E ;
2015-11-29 20:36:56 +01:00
this . DataRoot . SortedFavorites = true ;
2016-04-16 20:01:51 +02:00
this . DataRoot . AllowGapsInFavNumbers = false ;
2015-04-17 21:59:44 +02:00
}
#endregion
#region DisplayName
2015-11-21 19:34:30 +01:00
public override string DisplayName = > "Samsung J-Series .zip Loader" ;
2015-04-17 21:59:44 +02:00
#endregion
#region Load ( )
public override void Load ( )
{
this . UnzipDataFile ( ) ;
2015-06-05 06:08:40 +02:00
if ( File . Exists ( tempDir + "\\sat" ) )
{
try
{
using ( var conn = new SQLiteConnection ( "Data Source=" + tempDir + "\\sat" ) )
{
conn . Open ( ) ;
this . ReadSatDatabase ( conn ) ;
}
}
catch { }
}
2017-06-08 20:01:42 +02:00
var files = Directory . GetFiles ( tempDir , "*." ) ;
if ( files . Length = = 0 )
throw new FileLoadException ( "The Samsung .zip channel list archive does not contain any supported files." ) ;
foreach ( var filePath in files )
2015-04-17 21:59:44 +02:00
{
2015-11-27 01:51:08 +01:00
var filename = Path . GetFileName ( filePath ) ? ? "" ;
if ( filename . StartsWith ( "vconf_" ) )
continue ;
2015-04-22 09:51:21 +02:00
try
2015-04-17 21:59:44 +02:00
{
2015-04-22 09:51:21 +02:00
using ( var conn = new SQLiteConnection ( "Data Source=" + filePath ) )
{
FileType type ;
conn . Open ( ) ;
using ( var cmd = conn . CreateCommand ( ) )
{
this . RepairCorruptedDatabaseImage ( cmd ) ;
type = this . DetectFileType ( cmd ) ;
}
switch ( type )
{
2015-06-05 06:08:40 +02:00
case FileType . SatDb : break ;
case FileType . ChannelDbAnalog :
ReadChannelDatabase ( conn , filePath , false ) ;
2015-04-22 09:51:21 +02:00
break ;
2015-06-05 06:08:40 +02:00
case FileType . ChannelDbDvb :
ReadChannelDatabase ( conn , filePath , true ) ;
2015-04-22 09:51:21 +02:00
break ;
}
}
2015-04-17 21:59:44 +02:00
}
2015-04-22 09:51:21 +02:00
catch
2015-04-17 21:59:44 +02:00
{
}
}
}
#endregion
#region UnzipDataFile ( )
private void UnzipDataFile ( )
{
this . tempDir = Path . Combine ( Path . GetTempPath ( ) , Path . GetRandomFileName ( ) ) + "\\" ;
Directory . CreateDirectory ( tempDir ) ;
Application . ApplicationExit + = this . CleanTempFolder ;
using ( ZipFile zip = new ZipFile ( this . FileName ) )
{
foreach ( ZipEntry entry in zip )
this . Expand ( zip , entry . Name ) ;
}
}
#endregion
#region CleanTempFolder ( )
private void CleanTempFolder ( object sender , EventArgs e )
{
try
{
foreach ( var file in Directory . GetFiles ( this . tempDir ) )
File . Delete ( file ) ;
Directory . Delete ( this . tempDir ) ;
}
catch { }
}
#endregion
#region Expand ( )
private void Expand ( ZipFile zip , string path )
{
var entry = zip . GetEntry ( path ) ;
if ( entry = = null )
throw new FileLoadException ( "File not found inside .zip: " + path ) ;
byte [ ] buffer = new byte [ 65536 ] ;
using ( var input = zip . GetInputStream ( entry ) )
using ( var output = new FileStream ( this . tempDir + Path . GetFileName ( path ) , FileMode . Create ) )
{
int len ;
while ( ( len = input . Read ( buffer , 0 , buffer . Length ) ) ! = 0 )
output . Write ( buffer , 0 , len ) ;
}
}
#endregion
#region RepairCorruptedDatabaseImage ( )
private void RepairCorruptedDatabaseImage ( SQLiteCommand cmd )
{
cmd . CommandText = "REINDEX" ;
cmd . ExecuteNonQuery ( ) ;
}
#endregion
2015-04-22 09:51:21 +02:00
#region DetectFileType ( )
private FileType DetectFileType ( SQLiteCommand cmd )
{
cmd . CommandText = "select count(1) from sqlite_master where type='table' and name in ('SAT','SAT_TP')" ;
if ( ( long ) cmd . ExecuteScalar ( ) = = 2 )
return FileType . SatDb ;
cmd . CommandText = "select count(1) from sqlite_master where type='table' and name in ('CHNL','SRV','SRV_DVB')" ;
2015-06-05 06:08:40 +02:00
if ( ( long ) cmd . ExecuteScalar ( ) = = 3 )
return FileType . ChannelDbDvb ;
cmd . CommandText = "select count(1) from sqlite_master where type='table' and name in ('CHNL','SRV','SRV_ANL')" ;
if ( ( long ) cmd . ExecuteScalar ( ) = = 3 )
return FileType . ChannelDbAnalog ;
2015-04-22 09:51:21 +02:00
return FileType . Unknown ;
}
#endregion
#region ReadSatDatabase ( )
private void ReadSatDatabase ( SQLiteConnection conn )
{
using ( var cmd = conn . CreateCommand ( ) )
{
this . RepairCorruptedDatabaseImage ( cmd ) ;
this . ReadSatellites ( cmd ) ;
this . ReadTransponders ( cmd ) ;
}
}
#endregion
2015-04-17 21:59:44 +02:00
#region ReadSatellites ( )
private void ReadSatellites ( SQLiteCommand cmd )
{
2015-06-05 06:08:40 +02:00
cmd . CommandText = "select distinct satId, cast(satName as blob), satPos, satDir from SAT" ;
2015-04-17 21:59:44 +02:00
using ( var r = cmd . ExecuteReader ( ) )
{
while ( r . Read ( ) )
{
Satellite sat = new Satellite ( r . GetInt32 ( 0 ) ) ;
int pos = Math . Abs ( r . GetInt32 ( 2 ) ) ;
2015-11-21 19:34:30 +01:00
sat . OrbitalPosition = $"{pos/10}.{pos%10}{(r.GetInt32(3) == 1 ? " E " : " W ")}" ;
2015-06-05 06:08:40 +02:00
sat . Name = ReadUtf16 ( r , 1 ) ;
2015-04-17 21:59:44 +02:00
this . DataRoot . AddSatellite ( sat ) ;
}
}
}
#endregion
#region ReadTransponders ( )
private void ReadTransponders ( SQLiteCommand cmd )
{
cmd . CommandText = "select satId, tpFreq, tpPol, tpSr, tpId from SAT_TP" ;
using ( var r = cmd . ExecuteReader ( ) )
{
while ( r . Read ( ) )
{
int satId = r . GetInt32 ( 0 ) ;
int freq = r . GetInt32 ( 1 ) ;
int id = satId * 1000000 + freq / 1000 ;
if ( this . DataRoot . Transponder . TryGet ( id ) ! = null )
continue ;
Transponder tp = new Transponder ( id ) ;
tp . FrequencyInMhz = ( decimal ) freq / 1000 ;
tp . Number = r . GetInt32 ( 4 ) ;
tp . Polarity = r . GetInt32 ( 2 ) = = 0 ? 'H' : 'V' ;
tp . Satellite = this . DataRoot . Satellites . TryGet ( satId ) ;
2015-06-05 06:08:40 +02:00
tp . SymbolRate = r . GetInt32 ( 3 ) ;
2015-04-17 21:59:44 +02:00
this . DataRoot . AddTransponder ( tp . Satellite , tp ) ;
}
}
}
#endregion
2015-04-22 09:51:21 +02:00
#region ReadChannelDatabase ( )
2015-06-05 06:08:40 +02:00
private void ReadChannelDatabase ( SQLiteConnection conn , string dbPath , bool digital )
2015-04-17 21:59:44 +02:00
{
2015-04-22 09:51:21 +02:00
this . channelById . Clear ( ) ;
using ( var cmd = conn . CreateCommand ( ) )
2015-04-17 21:59:44 +02:00
{
2015-04-22 09:51:21 +02:00
this . RepairCorruptedDatabaseImage ( cmd ) ;
2015-06-05 06:08:40 +02:00
var providers = digital ? this . ReadProviders ( cmd ) : null ;
var channelList = this . ReadChannels ( cmd , dbPath , providers , digital ) ;
2015-04-22 09:51:21 +02:00
this . ReadFavorites ( cmd ) ;
this . dbPathByChannelList . Add ( channelList , dbPath ) ;
2015-04-17 21:59:44 +02:00
}
}
#endregion
2015-04-22 09:51:21 +02:00
#region ReadProviders ( )
private Dictionary < long , string > ReadProviders ( SQLiteCommand cmd )
2015-04-17 21:59:44 +02:00
{
2015-04-22 09:51:21 +02:00
var dict = new Dictionary < long , string > ( ) ;
try
2015-04-17 21:59:44 +02:00
{
2015-04-22 09:51:21 +02:00
cmd . CommandText = "select provId, cast(provName as blob) from PROV" ;
using ( var r = cmd . ExecuteReader ( ) )
2015-04-17 21:59:44 +02:00
{
2015-04-22 09:51:21 +02:00
while ( r . Read ( ) )
dict . Add ( r . GetInt64 ( 0 ) , ReadUtf16 ( r , 1 ) ) ;
2015-04-17 21:59:44 +02:00
}
}
2015-04-22 09:51:21 +02:00
catch
{
}
return dict ;
2015-04-17 21:59:44 +02:00
}
#endregion
2015-06-05 06:08:40 +02:00
#region ReadChannels ( )
private ChannelList ReadChannels ( SQLiteCommand cmd , string dbPath , Dictionary < long , string > providers , bool digital )
2015-04-17 21:59:44 +02:00
{
2015-06-05 06:08:40 +02:00
var signalSource = DetectSignalSource ( cmd , digital ) ;
var sat = ( signalSource & SignalSource . Sat ) = = 0 ? null : this . DetectSatellite ( cmd ) ;
2015-04-17 21:59:44 +02:00
2015-04-22 09:51:21 +02:00
string name = Path . GetFileName ( dbPath ) ;
2015-06-05 06:08:40 +02:00
ChannelList channelList = new ChannelList ( signalSource , name ) ;
string table = digital ? "SRV_DVB" : "SRV_ANL" ;
List < string > fieldNames = new List < string > {
"chType" , "chNum" , "freq" , // CHNL
"SRV.srvId" , "major" , "progNum" , "cast(srvName as blob)" , "srvType" , "hidden" , "scrambled" , "lockMode" , "numSel" , // SRV
} ;
if ( digital )
2015-11-27 01:51:08 +01:00
fieldNames . AddRange ( new [ ] { "onid" , "tsid" , "vidPid" , "provId" , "cast(shrtSrvName as blob)" , "lcn" } ) ; // SRV_DVB
2015-06-05 06:08:40 +02:00
var sql = this . BuildQuery ( table , fieldNames ) ;
2015-04-17 21:59:44 +02:00
var fields = this . GetFieldMap ( fieldNames ) ;
cmd . CommandText = sql ;
using ( var r = cmd . ExecuteReader ( ) )
{
while ( r . Read ( ) )
{
2015-11-21 19:34:30 +01:00
var tp = this . transponderByFreq ? . TryGet ( r . GetInt32 ( 2 ) ) ;
2015-06-05 06:08:40 +02:00
var channel = new DbChannel ( r , fields , this . DataRoot , providers , sat , tp ) ;
2015-04-17 21:59:44 +02:00
if ( ! channel . IsDeleted )
{
this . DataRoot . AddChannel ( channelList , channel ) ;
this . channelById . Add ( channel . RecordIndex , channel ) ;
}
}
}
2015-06-05 06:08:40 +02:00
this . DataRoot . AddChannelList ( channelList ) ;
return channelList ;
}
#endregion
#region DetectSignalSource ( )
private static SignalSource DetectSignalSource ( SQLiteCommand cmd , bool digital )
{
var signalSource = digital ? SignalSource . Digital : SignalSource . Analog ;
cmd . CommandText = "select distinct chType from CHNL" ;
using ( var r = cmd . ExecuteReader ( ) )
{
if ( r . Read ( ) )
{
var ss = ChTypeToSignalSource ( r . GetInt32 ( 0 ) ) ;
if ( ss ! = 0 )
signalSource = ss ;
}
}
return signalSource | SignalSource . TvAndRadio ;
}
#endregion
#region ChTypeToSignalSource ( )
internal static SignalSource ChTypeToSignalSource ( int chType )
{
switch ( chType )
{
case 1 : return SignalSource . AnalogT ;
case 2 : return SignalSource . DvbT ;
case 3 : return SignalSource . AnalogC ;
case 4 : return SignalSource . DvbC ;
case 7 : return SignalSource . DvbS ;
default : return 0 ;
}
}
#endregion
#region DetectSatellite ( )
/// <summary>
/// I haven't found a direct way to link a dvbs database file or its channels to a satId.
/// This workaround compares the transponder frequencies in the channel list with the transponder frequencies of each satellite to find a match.
/// </summary>
private Satellite DetectSatellite ( SQLiteCommand cmd )
{
List < int > tpFreq = new List < int > ( ) ;
cmd . CommandText = "select freq from CHNL where chType=7" ;
using ( var r = cmd . ExecuteReader ( ) )
{
while ( r . Read ( ) )
tpFreq . Add ( r . GetInt32 ( 0 ) ) ;
}
this . transponderByFreq = null ;
foreach ( var sat in DataRoot . Satellites . Values )
{
Dictionary < int , Transponder > satFreq = new Dictionary < int , Transponder > ( ) ;
foreach ( var tp in sat . Transponder . Values )
satFreq . Add ( ( int ) ( tp . FrequencyInMhz * 1000 ) , tp ) ;
int mismatch = 0 ;
foreach ( int freq in tpFreq )
{
if ( satFreq . ContainsKey ( freq ) | | satFreq . ContainsKey ( freq - 1000 ) | | satFreq . ContainsKey ( freq + 1000 ) )
continue ;
+ + mismatch ;
}
if ( mismatch < 10 )
{
this . transponderByFreq = satFreq ;
return sat ;
}
}
return null ;
2015-04-17 21:59:44 +02:00
}
#endregion
2015-06-05 06:08:40 +02:00
#region BuildQuery ( )
private string BuildQuery ( string table , IList < string > fieldNames )
2015-04-17 21:59:44 +02:00
{
string sql = "select " ;
2015-06-05 06:08:40 +02:00
for ( int i = 0 ; i < fieldNames . Count ; i + + )
2015-04-17 21:59:44 +02:00
{
if ( i > 0 )
sql + = "," ;
sql + = fieldNames [ i ] ;
}
sql + = " from " + table + " inner join SRV on SRV.srvId=" + table + ".srvId inner join CHNL on CHNL.chId=SRV.chId" ;
return sql ;
}
#endregion
#region GetFieldMap ( )
2015-06-05 06:08:40 +02:00
private IDictionary < string , int > GetFieldMap ( IList < string > fieldNames )
2015-04-17 21:59:44 +02:00
{
Dictionary < string , int > field = new Dictionary < string , int > ( ) ;
2015-06-05 06:08:40 +02:00
for ( int i = 0 ; i < fieldNames . Count ; i + + )
2015-04-17 21:59:44 +02:00
field [ fieldNames [ i ] ] = i ;
return field ;
}
#endregion
#region ReadFavorites ( )
private void ReadFavorites ( SQLiteCommand cmd )
{
cmd . CommandText = "select srvId, fav, pos from SRV_FAV" ;
var r = cmd . ExecuteReader ( ) ;
while ( r . Read ( ) )
{
var channel = this . channelById . TryGet ( r . GetInt64 ( 0 ) ) ;
if ( channel = = null )
continue ;
2015-11-29 20:36:56 +01:00
int fav = r . GetInt32 ( 1 ) - 1 ; // fav values start with 1 in the table
int pos = r . GetInt32 ( 2 ) ; // pos values start with 0
2015-04-22 09:51:21 +02:00
if ( pos > = 0 )
2015-11-29 20:36:56 +01:00
{
2015-04-17 21:59:44 +02:00
channel . Favorites | = ( Favorites ) ( 1 < < fav ) ;
2015-11-29 20:36:56 +01:00
channel . OriginalFavs = channel . Favorites ;
channel . FavIndex [ fav ] = channel . OriginalFavIndex [ fav ] = pos + 1 ;
}
2015-04-17 21:59:44 +02:00
}
}
#endregion
2015-04-22 09:51:21 +02:00
#region ReadUtf16 ( )
internal static string ReadUtf16 ( SQLiteDataReader r , int fieldIndex )
{
if ( r . IsDBNull ( fieldIndex ) )
return null ;
byte [ ] nameBytes = new byte [ 200 ] ;
int nameLen = ( int ) r . GetBytes ( fieldIndex , 0 , nameBytes , 0 , nameBytes . Length ) ;
return Encoding . BigEndianUnicode . GetString ( nameBytes , 0 , nameLen ) ;
}
#endregion
2015-04-17 21:59:44 +02:00
#region Save ( )
public override void Save ( string tvOutputFile )
{
if ( tvOutputFile ! = this . FileName )
{
File . Copy ( this . FileName , tvOutputFile ) ;
this . FileName = tvOutputFile ;
}
2015-04-22 09:51:21 +02:00
using ( var zip = new ZipFile ( this . FileName ) )
{
zip . BeginUpdate ( ) ;
foreach ( var channelList in this . DataRoot . ChannelLists )
{
var dbPath = this . dbPathByChannelList [ channelList ] ;
SaveChannelList ( channelList , dbPath ) ;
var entryName = Path . GetFileName ( dbPath ) ;
zip . Delete ( entryName ) ;
zip . Add ( dbPath , entryName ) ;
}
zip . CommitUpdate ( ) ;
}
}
#endregion
#region SaveChannelList ( )
private void SaveChannelList ( ChannelList channelList , string dbPath )
{
using ( var conn = new SQLiteConnection ( "Data Source=" + dbPath ) )
2015-04-17 21:59:44 +02:00
{
conn . Open ( ) ;
2015-09-19 23:24:31 +02:00
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 ) )
2015-04-17 21:59:44 +02:00
{
using ( var trans = conn . BeginTransaction ( ) )
{
2015-11-29 20:36:56 +01:00
Editor . SequentializeFavPos ( channelList , 5 ) ;
2015-06-13 18:37:59 +02:00
this . WriteChannels ( cmdUpdateSrv , cmdDeleteSrv , cmdInsertFav , cmdUpdateFav , cmdDeleteFav , channelList ) ;
2015-04-17 21:59:44 +02:00
trans . Commit ( ) ;
}
2015-06-13 18:37:59 +02:00
this . RepairCorruptedDatabaseImage ( cmdUpdateSrv ) ;
2015-04-17 21:59:44 +02:00
}
}
}
2015-04-22 09:51:21 +02:00
2015-04-17 21:59:44 +02:00
#endregion
2015-09-19 23:24:31 +02:00
#region Prepare * Command ( )
private static SQLiteCommand PrepareUpdateCommand ( SQLiteConnection conn )
2015-04-17 21:59:44 +02:00
{
2015-09-19 23:24:31 +02:00
var cmd = conn . CreateCommand ( ) ;
2015-11-29 20:36:56 +01:00
cmd . CommandText = "update SRV set major=@nr, lockMode=@lock, hideGuide=@hidden, hidden=@hidden, numSel=@numsel, srvName=cast(@srvname as varchar) where srvId=@id" ;
2015-09-19 23:24:31 +02:00
cmd . Parameters . Add ( new SQLiteParameter ( "@id" , DbType . Int64 ) ) ;
cmd . Parameters . Add ( new SQLiteParameter ( "@nr" , DbType . Int32 ) ) ;
cmd . Parameters . Add ( new SQLiteParameter ( "@lock" , DbType . Boolean ) ) ;
cmd . Parameters . Add ( new SQLiteParameter ( "@hidden" , DbType . Boolean ) ) ;
cmd . Parameters . Add ( new SQLiteParameter ( "@numsel" , DbType . Boolean ) ) ;
cmd . Parameters . Add ( new SQLiteParameter ( "@srvname" , DbType . Binary ) ) ;
cmd . Prepare ( ) ;
return cmd ;
2015-04-17 21:59:44 +02:00
}
2015-09-19 23:24:31 +02:00
private static SQLiteCommand PrepareDeleteCommand ( SQLiteConnection conn , bool digital )
{
var cmd = conn . CreateCommand ( ) ;
2015-11-27 01:51:08 +01:00
var sql = new StringBuilder ( ) ;
cmd . CommandText = "select name from sqlite_master where sql like '%srvId integer%' order by name desc" ;
using ( var r = cmd . ExecuteReader ( ) )
2015-11-21 19:34:30 +01:00
{
2015-11-27 01:51:08 +01:00
while ( r . Read ( ) )
sql . AppendLine ( $"; delete from {r.GetString(0)} where srvId=@id" ) ;
2015-11-21 19:34:30 +01:00
}
2015-11-27 01:51:08 +01:00
cmd . CommandText = sql . ToString ( ) ;
2015-09-19 23:24:31 +02:00
cmd . Parameters . Add ( new SQLiteParameter ( "@id" , DbType . Int64 ) ) ;
cmd . Prepare ( ) ;
return cmd ;
}
private static SQLiteCommand PrepareInsertFavCommand ( SQLiteConnection conn )
{
var cmd = conn . CreateCommand ( ) ;
cmd . CommandText = "insert into SRV_FAV (srvId, fav, pos) values (@id, @fav, @pos)" ;
cmd . Parameters . Add ( new SQLiteParameter ( "@id" , DbType . Int64 ) ) ;
cmd . Parameters . Add ( new SQLiteParameter ( "@fav" , DbType . Int32 ) ) ;
cmd . Parameters . Add ( new SQLiteParameter ( "@pos" , DbType . Int32 ) ) ;
cmd . Prepare ( ) ;
return cmd ;
}
private static SQLiteCommand PrepareUpdateFavCommand ( SQLiteConnection conn )
{
var cmd = conn . CreateCommand ( ) ;
cmd . CommandText = "update SRV_FAV set pos=@pos where srvId=@id and fav=@fav" ;
cmd . Parameters . Add ( new SQLiteParameter ( "@id" , DbType . Int64 ) ) ;
cmd . Parameters . Add ( new SQLiteParameter ( "@fav" , DbType . Int32 ) ) ;
cmd . Parameters . Add ( new SQLiteParameter ( "@pos" , DbType . Int32 ) ) ;
cmd . Prepare ( ) ;
return cmd ;
}
private static SQLiteCommand PrepareDeleteFavCommand ( SQLiteConnection conn )
{
var cmd = conn . CreateCommand ( ) ;
cmd . CommandText = "delete from SRV_FAV where srvId=@id and fav=@fav" ;
cmd . Parameters . Add ( new SQLiteParameter ( "@id" , DbType . Int64 ) ) ;
cmd . Parameters . Add ( new SQLiteParameter ( "@fav" , DbType . Int32 ) ) ;
cmd . Prepare ( ) ;
return cmd ;
}
2015-04-17 21:59:44 +02:00
#endregion
#region WriteChannels ( )
2015-06-13 18:37:59 +02:00
private void WriteChannels ( SQLiteCommand cmdUpdateSrv , SQLiteCommand cmdDeleteSrv , SQLiteCommand cmdInsertFav , SQLiteCommand cmdUpdateFav , SQLiteCommand cmdDeleteFav ,
ChannelList channelList , bool analog = false )
2015-11-29 20:36:56 +01:00
{
2015-04-17 21:59:44 +02:00
foreach ( ChannelInfo channelInfo in channelList . Channels )
{
var channel = channelInfo as DbChannel ;
if ( channel = = null ) // ignore reference list proxy channels
continue ;
2015-11-27 01:51:08 +01:00
2015-06-13 18:37:59 +02:00
if ( channel . NewProgramNr < 0 )
{
2015-11-29 20:36:56 +01:00
// delete channel from all tables that have a reference to srvId
2015-06-13 18:37:59 +02:00
cmdDeleteSrv . Parameters [ "@id" ] . Value = channel . RecordIndex ;
cmdDeleteSrv . ExecuteNonQuery ( ) ;
2015-11-29 20:36:56 +01:00
continue ;
2015-06-13 18:37:59 +02:00
}
2015-11-29 20:36:56 +01:00
// update channel record
cmdUpdateSrv . Parameters [ "@id" ] . Value = channel . RecordIndex ;
cmdUpdateSrv . Parameters [ "@nr" ] . Value = channel . NewProgramNr ;
cmdUpdateSrv . Parameters [ "@lock" ] . Value = channel . Lock ;
cmdUpdateSrv . Parameters [ "@hidden" ] . Value = channel . Hidden ;
cmdUpdateSrv . Parameters [ "@numsel" ] . Value = ! channel . Skip ;
cmdUpdateSrv . Parameters [ "@srvname" ] . Value = channel . Name = = null ? ( object ) DBNull . Value : Encoding . BigEndianUnicode . GetBytes ( channel . Name ) ;
cmdUpdateSrv . ExecuteNonQuery ( ) ;
// update favorites
2015-06-13 18:37:59 +02:00
for ( int i = 0 , mask = 1 ; i < 5 ; i + + , mask < < = 1 )
2015-04-17 21:59:44 +02:00
{
2015-11-29 20:36:56 +01:00
int oldPos = channel . OriginalFavIndex [ i ] ;
int newPos = ( ( int ) channel . Favorites & mask ) ! = 0 ? channel . FavIndex [ i ] : - 1 ;
if ( newPos > = 0 )
2015-04-17 21:59:44 +02:00
{
2015-06-13 18:37:59 +02:00
var c = oldPos < 0 ? cmdInsertFav : cmdUpdateFav ;
2015-04-17 21:59:44 +02:00
c . Parameters [ "@id" ] . Value = channel . RecordIndex ;
2015-04-22 09:51:21 +02:00
c . Parameters [ "@fav" ] . Value = i + 1 ;
2015-11-29 20:36:56 +01:00
c . Parameters [ "@pos" ] . Value = newPos - 1 ;
2015-04-17 21:59:44 +02:00
c . ExecuteNonQuery ( ) ;
}
else
{
2015-06-13 18:37:59 +02:00
cmdDeleteFav . Parameters [ "@id" ] . Value = channel . RecordIndex ;
cmdDeleteFav . Parameters [ "@fav" ] . Value = i + 1 ;
cmdDeleteFav . ExecuteNonQuery ( ) ;
2015-04-17 21:59:44 +02:00
}
2015-11-29 20:36:56 +01:00
channel . OriginalFavIndex [ i ] = channel . FavIndex [ i ] = newPos ;
2015-04-17 21:59:44 +02:00
}
2015-06-13 18:37:59 +02:00
channel . OriginalFavs = channel . Favorites ;
2015-04-17 21:59:44 +02:00
}
}
#endregion
2015-11-29 20:36:56 +01:00
2015-04-17 21:59:44 +02:00
}
}