/[xmltv_parser]/trunk/GBPVRProgramDatabaseFixer/SQLLITE.cs
ViewVC logotype

Diff of /trunk/GBPVRProgramDatabaseFixer/SQLLITE.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 179 by william, Sat Mar 16 17:13:23 2013 UTC revision 201 by william, Sat Mar 16 22:34:30 2013 UTC
# Line 11  using libxmltv.Interfaces; Line 11  using libxmltv.Interfaces;
11  using libxmltv.Core;  using libxmltv.Core;
12  namespace GBPVRProgramDatabaseFixer  namespace GBPVRProgramDatabaseFixer
13  {  {
14        public interface IOldNewProgram
15        {
16            SQLLITE.IPROGRAMME OldProgram { get; }
17            SQLLITE.IPROGRAMME NewProgram { get; }
18        }
19      public interface ISQLLITE      public interface ISQLLITE
20      {      {
21          List<SQLLITE.IPROGRAMME> Programs { get; }          List<SQLLITE.IPROGRAMME> Programs { get; }
# Line 19  namespace GBPVRProgramDatabaseFixer Line 24  namespace GBPVRProgramDatabaseFixer
24          IDateTimeRange GetProgramsDateRange(List<SQLLITE.IPROGRAMME> programs);          IDateTimeRange GetProgramsDateRange(List<SQLLITE.IPROGRAMME> programs);
25          List<SQLLITE.IPROGRAMME> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> removed_programs);          List<SQLLITE.IPROGRAMME> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> removed_programs);
26    
27            void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs);
28            void UpdateGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs);
29    
30      }      }
31      public class SQLLITE : ISQLLITE      public class SQLLITE : ISQLLITE
32      {      {
33          private struct OldNewProgram          private class OldNewProgram : IOldNewProgram
34          {          {
35              public IPROGRAMME OldProgram;              public OldNewProgram() : this(new PROGRAMME(), new PROGRAMME()) { }
36              public IPROGRAMME NewProgram;              public OldNewProgram(IPROGRAMME _old, IPROGRAMME _new) { OldProgram = _old; NewProgram = _new; }
37    
38                public IPROGRAMME OldProgram { get; private set; }
39                public IPROGRAMME NewProgram { get; private set; }
40          }          }
41          public static ISQLLITE Create(string database, EventHandler<EventArgs> OnInstanceCreated)          public static ISQLLITE Create(string database, EventHandler<EventArgs> OnInstanceCreated)
42          {          {
# Line 45  namespace GBPVRProgramDatabaseFixer Line 56  namespace GBPVRProgramDatabaseFixer
56          }          }
57          private class CHANNEL : ICHANNEL          private class CHANNEL : ICHANNEL
58          {          {
59              public CHANNEL()              public CHANNEL()
60              {              {
61                  BaseDatabaseDefinition<CHANNEL>.CreateDefault(this);                  BaseDatabaseDefinition<CHANNEL>.CreateDefault(this);
62              }              }
63              //public RECORDING_SCHEDULE(SQLiteDataReader r, int index) { BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(this, r, index); }              //public RECORDING_SCHEDULE(SQLiteDataReader r, int index) { BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(this, r, index); }
64    
# Line 78  namespace GBPVRProgramDatabaseFixer Line 89  namespace GBPVRProgramDatabaseFixer
89              Int64 manual_channel_oid { get; }              Int64 manual_channel_oid { get; }
90              Int64 quality_level { get; }              Int64 quality_level { get; }
91              Int64 pre_pad_minutes { get; }              Int64 pre_pad_minutes { get; }
92              Int64 post_pad_minutes { get;}              Int64 post_pad_minutes { get; }
93              Int32 priority { get; }              Int32 priority { get; }
94              String conversion_profile { get; }              String conversion_profile { get; }
95          }          }
# Line 119  namespace GBPVRProgramDatabaseFixer Line 130  namespace GBPVRProgramDatabaseFixer
130                  }                  }
131              }              }
132              public static void Create(ref T instance, SQLiteDataReader r, int index)              public static void Create(ref T instance, SQLiteDataReader r, int index)
133              {                              {
134                  string field_name = r.GetName(index);                  string field_name = r.GetName(index);
135                  Type field_type = r.GetFieldType(index);                  Type field_type = r.GetFieldType(index);
136                  object field_value = r.GetValue(index);                  object field_value = r.GetValue(index);
# Line 144  namespace GBPVRProgramDatabaseFixer Line 155  namespace GBPVRProgramDatabaseFixer
155                                  {                                  {
156                                      prop.SetValue(instance, field_value, null);                                      prop.SetValue(instance, field_value, null);
157                                  }                                  }
158                                    
159                              }                              }
160                              catch (Exception ex)                              catch (Exception ex)
161                              {                              {
162                                  throw ex;                                  throw ex;
163                              }                              }
# Line 164  namespace GBPVRProgramDatabaseFixer Line 175  namespace GBPVRProgramDatabaseFixer
175    
176          private class RECORDING_SCHEDULE : IRECORDING_SCHEDULE          private class RECORDING_SCHEDULE : IRECORDING_SCHEDULE
177          {          {
178              public RECORDING_SCHEDULE()              public RECORDING_SCHEDULE()
179              {              {
180                  BaseDatabaseDefinition<RECORDING_SCHEDULE>.CreateDefault(this);                  BaseDatabaseDefinition<RECORDING_SCHEDULE>.CreateDefault(this);
181              }              }
182              //public RECORDING_SCHEDULE(SQLiteDataReader r, int index) { BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(this, r, index); }              //public RECORDING_SCHEDULE(SQLiteDataReader r, int index) { BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(this, r, index); }
183    
184              public static void Create(ref RECORDING_SCHEDULE instance, SQLiteDataReader r, int index)              public static void Create(ref RECORDING_SCHEDULE instance, SQLiteDataReader r, int index)
185              {              {
186                  BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(ref instance, r, index);                  BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(ref instance, r, index);
187              }              }
188    
189              #region IRECORDING_SCHEDULE members              #region IRECORDING_SCHEDULE members
190              public Int64 oid { get; set;}              public Int64 oid { get; set; }
191              public Int64 programme_oid { get; set;}              public Int64 programme_oid { get; set; }
192              public Int64 capture_source_oid { get; set;}              public Int64 capture_source_oid { get; set; }
193              public Int16 status { get; set; }              public Int16 status { get; set; }
194              public String filename { get; set; }              public String filename { get; set; }
195              public Int64 recording_type { get;set; }              public Int64 recording_type { get; set; }
196              public Int64 recording_group { get; set;}              public Int64 recording_group { get; set; }
197              public DateTime manual_start_time { get; set;}              public DateTime manual_start_time { get; set; }
198              public DateTime manual_end_time { get; set; }              public DateTime manual_end_time { get; set; }
199              public Int64 manual_channel_oid { get; set; }              public Int64 manual_channel_oid { get; set; }
200              public Int64 quality_level { get; set; }              public Int64 quality_level { get; set; }
# Line 194  namespace GBPVRProgramDatabaseFixer Line 205  namespace GBPVRProgramDatabaseFixer
205              #endregion              #endregion
206          }          }
207    
208          public interface IPROGRAMME          public interface IPROGRAMME : IEquatable<IPROGRAMME>
209          {          {
210              Int64 oid { get; set; }              Int64 oid { get; set; }
211              String name { get; set; }              String name { get; set; }
# Line 206  namespace GBPVRProgramDatabaseFixer Line 217  namespace GBPVRProgramDatabaseFixer
217              String unique_identifier { get; set; }              String unique_identifier { get; set; }
218              String rating { get; set; }              String rating { get; set; }
219    
220                string ToString();
221              IProgramDefinition AsXMLTVProgramDefinition(ISQLLITE sqllite);              IProgramDefinition AsXMLTVProgramDefinition(ISQLLITE sqllite);
222          }          }
223          private class PROGRAMME : IPROGRAMME          private class PROGRAMME : IPROGRAMME
224          {          {
225              public PROGRAMME()              public PROGRAMME()
226              {              {
227                  BaseDatabaseDefinition<PROGRAMME>.CreateDefault(this);                  BaseDatabaseDefinition<PROGRAMME>.CreateDefault(this);
228              }              }
229              //public PROGRAMME(SQLiteDataReader r, int index) : base(r, index) { }              //public PROGRAMME(SQLiteDataReader r, int index) : base(r, index) { }
230              public static void Create(ref PROGRAMME instance, SQLiteDataReader r, int index)              public static void Create(ref PROGRAMME instance, SQLiteDataReader r, int index)
# Line 232  namespace GBPVRProgramDatabaseFixer Line 244  namespace GBPVRProgramDatabaseFixer
244              public IProgramDefinition AsXMLTVProgramDefinition(ISQLLITE sqllite)              public IProgramDefinition AsXMLTVProgramDefinition(ISQLLITE sqllite)
245              {              {
246                  ProgramList.ProgramDefintion definition = new ProgramList.ProgramDefintion();                  ProgramList.ProgramDefintion definition = new ProgramList.ProgramDefintion();
247    
248                  var channel = sqllite.Channels.Find(s => s.oid == this.channel_oid);                  var channel = sqllite.Channels.Find(s => s.oid == this.channel_oid);
249                  definition.ChannelName = channel.display_name;                  var channelname = channel.display_name;
250                  definition.ChannelNumber = (int)channel.channel_number;                  var split = channelname.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
251                    definition.ChannelNumber = Convert.ToInt32(split.First());
252                    definition.ChannelName = string.IsNullOrEmpty(split.Last()) ? string.Empty : split.Last().ToString();
253                  definition.Description = this.description;                  definition.Description = this.description;
254                  definition.Start = this.start_time.ToDateTimeString();                  definition.Start = this.start_time.ToDateTimeString();
255                  definition.Stop = this.end_time.ToDateTimeString();                  definition.Stop = this.end_time.ToDateTimeString();
# Line 243  namespace GBPVRProgramDatabaseFixer Line 258  namespace GBPVRProgramDatabaseFixer
258                  return definition;                  return definition;
259              }              }
260              #endregion              #endregion
261    
262                public bool Equals(IPROGRAMME other)
263                {
264                    return this.ToString() == other.ToString();
265                }
266                public override string ToString()
267                {
268                    StringBuilder builder = new StringBuilder();
269    
270                    builder.AppendFormat("oid: '{0}' ", oid);
271                    builder.AppendFormat("name: '{0}' ", name);
272                    builder.AppendFormat("sub_title: '{0}' ", sub_title);
273                    builder.AppendFormat("description: '{0}' ", description);
274                    builder.AppendFormat("start_time: '{0}' ", start_time.ToDateTimeString());
275                    builder.AppendFormat("end_time: '{0}' ", end_time.ToDateTimeString());
276                    builder.AppendFormat("channel_oid: '{0}' ", channel_oid);
277                    builder.AppendFormat("unique_identifier: '{0}' ", unique_identifier);
278                    builder.AppendFormat("rating: '{0}'", rating);
279    
280                    return builder.ToString();
281                }
282                public override bool Equals(object obj)
283                {
284                    if (obj == null) { throw new ArgumentNullException("obj", "Object to compare cannot be null"); }
285                    if (obj.GetType().IsAssignableFrom(typeof(IPROGRAMME)))
286                    {
287                        return this.Equals((IPROGRAMME)obj);
288                    }
289                    return base.Equals(obj);
290                }
291                public override int GetHashCode()
292                {
293                    return this.ToString().GetHashCode();
294                }
295          }          }
296          #endregion          #endregion
297          private static class TABLES          private static class TABLES
# Line 253  namespace GBPVRProgramDatabaseFixer Line 302  namespace GBPVRProgramDatabaseFixer
302          }          }
303    
304          //public SQLLite() { }          //public SQLLite() { }
305          protected SQLLITE(string database, EventHandler<EventArgs> OnInstanceCreated)          protected SQLLITE(string database, EventHandler<EventArgs> OnInstanceCreated)
306          {          {
307              this.OnInstanceCreated = OnInstanceCreated;              this.OnInstanceCreated = OnInstanceCreated;
308              //CreateConnection(database);              //CreateConnection(database);
# Line 273  namespace GBPVRProgramDatabaseFixer Line 322  namespace GBPVRProgramDatabaseFixer
322          [NonSerialized]          [NonSerialized]
323          private EventHandler<EventArgs> _OnInstanceCreated;          private EventHandler<EventArgs> _OnInstanceCreated;
324          private EventHandler<EventArgs> OnInstanceCreated { get { return _OnInstanceCreated; } set { _OnInstanceCreated = value; } }          private EventHandler<EventArgs> OnInstanceCreated { get { return _OnInstanceCreated; } set { _OnInstanceCreated = value; } }
325            
326          private void OnCreatedInstance(object sender, EventArgs e)          private void OnCreatedInstance(object sender, EventArgs e)
327          {          {
328              if (OnInstanceCreated != null) { OnInstanceCreated.Invoke(sender, e); }              if (OnInstanceCreated != null) { OnInstanceCreated.Invoke(sender, e); }
329          }          }
330    
331          private string Database;          private string Database;
332          #region ISQLLITE members                  #region ISQLLITE members
333          public List<IPROGRAMME> Programs { get; private set; }          public List<IPROGRAMME> Programs { get; private set; }
334          public List<IRECORDING_SCHEDULE> Recordings { get; private set; }          public List<IRECORDING_SCHEDULE> Recordings { get; private set; }
335          public List<ICHANNEL> Channels { get; private set; }          public List<ICHANNEL> Channels { get; private set; }
# Line 290  namespace GBPVRProgramDatabaseFixer Line 339  namespace GBPVRProgramDatabaseFixer
339              var list = new List<IPROGRAMME>(programs.ToArray());              var list = new List<IPROGRAMME>(programs.ToArray());
340              DateTime first = new DateTime();              DateTime first = new DateTime();
341              DateTime last = new DateTime();              DateTime last = new DateTime();
342              first = list.OrderBy(s => s.start_time).ToList().First().start_time;                          first = list.OrderBy(s => s.start_time).ToList().First().start_time;
343              last = list.OrderBy(s => s.start_time).ToList().Last().start_time;              last = list.OrderBy(s => s.start_time).ToList().Last().start_time;
344              gLog.Verbose.Debug.WriteLine("\tFirst: {0} = ({1})", first.ToString("yyyy/MM/dd HH:mm:ss.fffffff"), first.ToDateTimeString());              gLog.Verbose.Debug.WriteLine("\tFirst: {0} = ({1})", first.ToString("yyyy/MM/dd HH:mm:ss.fffffff"), first.ToDateTimeString());
345              gLog.Verbose.Debug.WriteLine("\tLast: {0} = ({1})", last.ToString("yyyy/MM/dd HH:mm:ss.fffffff"), last.ToDateTimeString());              gLog.Verbose.Debug.WriteLine("\tLast: {0} = ({1})", last.ToString("yyyy/MM/dd HH:mm:ss.fffffff"), last.ToDateTimeString());
# Line 301  namespace GBPVRProgramDatabaseFixer Line 350  namespace GBPVRProgramDatabaseFixer
350          public List<SQLLITE.IPROGRAMME> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> source_invalid)          public List<SQLLITE.IPROGRAMME> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> source_invalid)
351          {          {
352              source_invalid = new List<IPROGRAMME>();              source_invalid = new List<IPROGRAMME>();
353              gbpvr_programs = gbpvr_programs.OrderBy(s => s.start_time).ToList();                          List<IPROGRAMME> source_valid = new List<IPROGRAMME>();
354              List<SQLLITE.IPROGRAMME> source_valid = new List<IPROGRAMME>();              gbpvr_programs = gbpvr_programs.OrderBy(s => s.start_time).ToList();
355                xmltv_programs = xmltv_programs.OrderBy(s => DateTime.Parse(s.Start)).ToList();
356                gbpvr_programs.TrimExcess();
357                xmltv_programs.TrimExcess();
358    
             List<OldNewProgram> source_update = new List<OldNewProgram>();  
             //if (range == null)  
             //{  
             //    gLog.Warn.WriteLine("The DateTimeRange passed in is null...returning the original program list");  
             //    return list;  
             //}  
             //gLog.Warn.WriteLine("FilterProgramsByDateRange has not been implemented");  
               
359              double total = gbpvr_programs.Count;              double total = gbpvr_programs.Count;
360              double index = 0;              double index = 0;
361              double progress = 0;              double progress = 0;
362              foreach (var program in gbpvr_programs)              foreach (var program in gbpvr_programs)
363              {                {
364                  progress = 100.0 * (index / total);                  progress = 100.0 * (index / total);
365                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Filtering GBPVR Programs: {0:00}%", (int)progress)));                                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Filtering GBPVR Programs: {0:00}%", (int)progress)));
366                  var channel_oid = program.channel_oid;                  // find an entry in xmltv_programs by Channel Number & StartDate                
367                  var channel = this.Channels.Find(s => s.oid == channel_oid);                  var program_xmltv_entry = program.AsXMLTVProgramDefinition(this);
368                  var start_date = program.start_time;                  var xmltv_entry = xmltv_programs.Find(s => s.ChannelNumber == program_xmltv_entry.ChannelNumber && s.Start == program_xmltv_entry.Start);
                 //var xmltv_entry_list = xmltv_programs.FindAll(s => s.ChannelNumber == channel.channel_number && s.Start == start_date.ToDateTimeString());  
                 var query = from c in xmltv_programs  
                             where  
                             c.ChannelNumber == channel.channel_number &&  
                             c.Start == start_date.ToDateTimeString()  
                             select c;  
   
                 IProgramDefinition xmltv_entry = null;  
                 if (query.Count()-1 > 0)  
                 {  
                     gLog.Verbose.Error.WriteLine("Found more than one entry: Matching channel='{0}' and start='{1}'", channel.channel_number, start_date.ToDateTimeString());  
                     gLog.Verbose.Error.WriteLine("    GB-PVR Program Data: oid='{0}' channel_oid='{1}' name='{2}' sub_title='{3}' description='{4}'", program.oid, program.channel_oid, program.name, program.sub_title, program.description);  
                     if (Debugger.IsAttached)  
                     {                        
                         gLog.Error.WriteLine("    Found: {0} matching entries", query.Count());  
                         int k_index = 0;  
                         foreach (var k in query)  
                         {  
                             gLog.Verbose.Error.WriteLine("    query[{0}]: channel='{1}' start='{2}' ('{3}') title='{4}' subtitle='{5}' description='{6}'", k_index, k.ChannelNumber, k.Start, DateTime.Parse(k.Start).ToString("yyyy/MM/dd HH:mm:ss.fffffff"), k.Title, k.SubTitle, k.Description);  
                             k_index++;  
                         }  
                         Debugger.Break();  
                     }  
                 }  
                 else  
                 {  
                     xmltv_entry = query.FirstOrDefault();  
                 }  
   
369                  if (xmltv_entry == null)                  if (xmltv_entry == null)
370                  {                  {
371                      //gLog.Verbose.Warn.WriteLine("Invalidating GB-PVR Program: oid='{0}' channel_oid='{1}' title='{2}' start='{3}'", program.oid, program.channel_oid, program.name, program.start_time.ToDateTimeString());                      // xmltv entry was not found
372                      source_invalid.Add(program);                                        source_invalid.Add(program);
373                  }                  }
374                  else                  else
375                  {                  {
376                      //gLog.Verbose.Warn.WriteLine("Updating GB-PVR Program (if needed): oid='{0}' channel_oid='{1}' title='{2}' subtitle='{3}' start='{4}'", program.oid, program.channel_oid, program.name, program.sub_title, program.start_time.ToDateTimeString());                      // check if the xmltv entry has different data from the current program
377                      var updated_program = program;                      if (!xmltv_entry.Equals(program_xmltv_entry))
                     bool needsupdate = false;  
                     if (xmltv_entry.Title != program.name)  
                     {  
                         //gLog.Verbose.Warn.WriteLine("    Updating:");  
                         //gLog.Verbose.Warn.WriteLine("        Old Title: {0}", program.name);  
                         //gLog.Verbose.Warn.WriteLine("        New Title: {0}", xmltv_entry.Title);  
                         updated_program.name = xmltv_entry.Title;  
                         needsupdate = true;  
                     }  
                     if (xmltv_entry.SubTitle != program.sub_title)  
                     {  
                         //gLog.Verbose.Warn.WriteLine("    Updating:");  
                         //gLog.Verbose.Warn.WriteLine("        Old SubTile: {0}", program.sub_title);  
                         //gLog.Verbose.Warn.WriteLine("        New SubTile: {0}", xmltv_entry.SubTitle);  
                         updated_program.sub_title = xmltv_entry.SubTitle;  
                         needsupdate = true;  
                     }  
                     if (xmltv_entry.Description != program.description)  
                     {  
                         //gLog.Verbose.Warn.WriteLine("    Updating:");  
                         //gLog.Verbose.Warn.WriteLine("        Old Descption: {0}", program.description);  
                         //gLog.Verbose.Warn.WriteLine("        New Descption: {0}", xmltv_entry.Description);  
                         updated_program.description = xmltv_entry.Description;  
                         needsupdate = true;  
                     }  
                     if (DateTime.Parse(xmltv_entry.Start) != program.start_time)  
                     {  
                         //gLog.Verbose.Warn.WriteLine("    Updating:");  
                         //gLog.Verbose.Warn.WriteLine("        Old StartTime: {0}", program.start_time.ToDateTimeString());  
                         //gLog.Verbose.Warn.WriteLine("        New StartTime: {0}", DateTime.Parse(xmltv_entry.Start).ToDateTimeString());  
                         updated_program.start_time = DateTime.Parse(xmltv_entry.Start);  
                         needsupdate = true;  
                     }  
                     if (DateTime.Parse(xmltv_entry.Stop) != program.end_time)  
                     {  
                         //gLog.Verbose.Warn.WriteLine("    Updating:");  
                         //gLog.Verbose.Warn.WriteLine("        Old EndTime: {0}", program.end_time.ToDateTimeString());  
                         //gLog.Verbose.Warn.WriteLine("        New EndTime: {0}", DateTime.Parse(xmltv_entry.Stop).ToDateTimeString());  
                         updated_program.end_time = DateTime.Parse(xmltv_entry.Stop);  
                         needsupdate = true;  
                     }  
                       
                     if (needsupdate)  
                     {  
                         OldNewProgram p = new OldNewProgram();  
                         p.OldProgram = program;  
                         p.NewProgram = updated_program;  
                         source_update.Add(p);  
                     }  
                     source_valid.Add(updated_program);  
                 }  
                 index++;  
             }  
   
   
             source_valid = source_valid.OrderBy(s => s.channel_oid).ThenBy(s => s.start_time).ToList();  
             source_invalid = source_invalid.OrderBy(s => s.channel_oid).ThenBy(s => s.start_time).ToList();  
   
             if (source_invalid.Count > 0)  
             {  
                 double source_invalid_count = source_valid.Count;  
                 double source_invalid_index = 0;  
                 double source_invalid_progress = 0;  
                 foreach (var old_program in source_invalid)  
                 {  
                     source_invalid_progress = 100.0 * (source_invalid_index / source_invalid_count);  
                     gLog.ReportProgress(this, new ReportProgressEventArgs((int)source_invalid_progress, string.Format("Removing old GBPVR Programs: {0:00}%", (int)source_invalid_progress)));      
                     // remove database entry  
                     if (!RemoveProgramDatabaseEntry(old_program))  
378                      {                      {
379                          gLog.Error.WriteLine("Failed to remove program with oid: '{0}'", old_program.oid);                          // data is different
380                      }                          var updated_program = program;
                     else  
                     {  
                         gLog.Verbose.Info.WriteLine("Removed program with oid: '{0}'", old_program.oid);  
                     }  
                     source_invalid_index++;  
                 }  
             }  
             else  
             {  
                 gLog.Info.WriteLine("No old GB-PVR Programs needed to be removed.");  
             }  
381    
382              if (source_update.Count > 0)                          if (program_xmltv_entry.Title != xmltv_entry.Title)
383              {                          {
384                  double source_update_count = source_valid.Count;                              gLog.Verbose.Warn.WriteLine("    Program oid: '{0}' - replacing title", updated_program.oid);
385                  double source_update_index = 0;                              updated_program.name = xmltv_entry.Title;
386                  double source_update_progress = 0;                          }
387                  foreach (var p in source_update)                          if (program_xmltv_entry.SubTitle != xmltv_entry.SubTitle)
388                  {                          {
389                      source_update_progress = 100.0 * (source_update_index / source_update_count);                              gLog.Verbose.Warn.WriteLine("    Program oid: '{0}' - replacing sub_title", updated_program.oid);
390                      gLog.ReportProgress(this, new ReportProgressEventArgs((int)source_update_progress, string.Format("Updating GBPVR Programs: {0:00}%", (int)source_update_progress)));                                  updated_program.sub_title = xmltv_entry.SubTitle;
391                      // remove database entry                          }
392                      if (!UpdateProgramDatabaseEntry(p.OldProgram,p.NewProgram))                          if (program_xmltv_entry.Stop != xmltv_entry.Stop)
393                      {                          {
394                          gLog.Error.WriteLine("Failed to update program with oid: '{0}'", p.OldProgram.oid);                              gLog.Verbose.Warn.WriteLine("    Program oid: '{0}' - replacing end_time", updated_program.oid);
395                                updated_program.end_time = DateTime.Parse(xmltv_entry.Stop);
396                            }
397                            if (program_xmltv_entry.Start != xmltv_entry.Start)
398                            {
399                                gLog.Verbose.Warn.WriteLine("    Program oid: '{0}' - replacing start_time", updated_program.oid);
400                                updated_program.start_time = DateTime.Parse(xmltv_entry.Start);
401                            }
402                            if (program_xmltv_entry.Description != xmltv_entry.Description)
403                            {
404                                gLog.Verbose.Warn.WriteLine("    Program oid: '{0}' - replacing description", updated_program.oid);
405                                updated_program.description = xmltv_entry.Description;
406                            }
407    
408                            var updated_xmltv_entry = updated_program.AsXMLTVProgramDefinition(this);
409                            if (!xmltv_entry.Equals(updated_xmltv_entry))
410                            {
411                                throw new Exception(string.Format("Program oid '{0}' was not properly updated.", updated_program.oid));
412                            }
413                            //source_valid.Add(new OldNewProgram(program, updated_program));
414                            source_valid.Add(updated_program);
415                      }                      }
416                      else                      else
417                      {                      {
418                          gLog.Verbose.Info.WriteLine("Upated program with oid: '{0}'", p.OldProgram.oid);                          // data is the same
419                            //source_valid.Add(new OldNewProgram(program, program));
420                            source_valid.Add(program);
421                      }                      }
                     source_update_index++;  
422                  }                  }
423                    index++;
424              }              }
             else  
             {  
                 gLog.Info.WriteLine("No GB-PVR Programs needed to be updated.");  
             }  
   
425              gLog.Info.WriteLine("Total XMLTV Programs: 0x{0:x8}", xmltv_programs.Count);              gLog.Info.WriteLine("Total XMLTV Programs: 0x{0:x8}", xmltv_programs.Count);
426              gLog.Info.WriteLine("Updated: 0x{0:x8} GB-PVR Programs", source_valid.Count);              gLog.Info.WriteLine("Total Valid GB-PVR Programs: 0x{0:x8}", source_valid.Count);
427              gLog.Info.WriteLine("Removed: 0x{0:x8} GB-PVR Programs", source_invalid.Count);              gLog.Info.WriteLine("Total Invalid GB-PVR Programs: 0x{0:x8}", source_invalid.Count);
428              gLog.Info.WriteLine("Total GB-PVR Programs (Updated & Removed): 0x{0:x8}", source_valid.Count + source_invalid.Count);              gLog.Info.WriteLine("Total GB-PVR Programs (Valid+Invalid): 0x{0:x8} == 0x{1:x8}", source_valid.Count + source_invalid.Count, gbpvr_programs.Count);
429                #region old-code
430                //List<OldNewProgram> source_update = new List<OldNewProgram>();
431                ////if (range == null)
432                ////{
433                ////    gLog.Warn.WriteLine("The DateTimeRange passed in is null...returning the original program list");
434                ////    return list;
435                ////}
436                ////gLog.Warn.WriteLine("FilterProgramsByDateRange has not been implemented");            
437                //double total = gbpvr_programs.Count;
438                //double index = 0;
439                //double progress = 0;
440                //foreach (var program in gbpvr_programs)
441                //{  
442                //    progress = 100.0 * (index / total);
443                //    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Filtering GBPVR Programs: {0:00}%", (int)progress)));                
444                //    var channel_oid = program.channel_oid;
445                //    var channel = this.Channels.Find(s => s.oid == channel_oid);
446                //    var start_date = program.start_time;
447                //    //var xmltv_entry_list = xmltv_programs.FindAll(s => s.ChannelNumber == channel.channel_number && s.Start == start_date.ToDateTimeString());
448                //    var query = from c in xmltv_programs
449                //                where
450                //                c.ChannelNumber == channel.channel_number &&
451                //                c.Start == start_date.ToDateTimeString()
452                //                select c;
453                //    IProgramDefinition xmltv_entry = null;
454                //    if (query.Count()-1 > 0)
455                //    {
456                //        gLog.Verbose.Error.WriteLine("Found more than one entry: Matching channel='{0}' and start='{1}'", channel.channel_number, start_date.ToDateTimeString());
457                //        gLog.Verbose.Error.WriteLine("    GB-PVR Program Data: oid='{0}' channel_oid='{1}' name='{2}' sub_title='{3}' description='{4}'", program.oid, program.channel_oid, program.name, program.sub_title, program.description);
458                //        if (Debugger.IsAttached)
459                //        {                      
460                //            gLog.Error.WriteLine("    Found: {0} matching entries", query.Count());
461                //            int k_index = 0;
462                //            foreach (var k in query)
463                //            {
464                //                gLog.Verbose.Error.WriteLine("    query[{0}]: channel='{1}' start='{2}' ('{3}') title='{4}' subtitle='{5}' description='{6}'", k_index, k.ChannelNumber, k.Start, DateTime.Parse(k.Start).ToString("yyyy/MM/dd HH:mm:ss.fffffff"), k.Title, k.SubTitle, k.Description);
465                //                k_index++;
466                //            }
467                //            Debugger.Break();
468                //        }
469                //    }
470                //    else
471                //    {
472                //        xmltv_entry = query.FirstOrDefault();
473                //    }
474                //    if (xmltv_entry == null)
475                //    {
476                //        //gLog.Verbose.Warn.WriteLine("Invalidating GB-PVR Program: oid='{0}' channel_oid='{1}' title='{2}' start='{3}'", program.oid, program.channel_oid, program.name, program.start_time.ToDateTimeString());
477                //        source_invalid.Add(program);                  
478                //    }
479                //    else
480                //    {
481                //        //gLog.Verbose.Warn.WriteLine("Updating GB-PVR Program (if needed): oid='{0}' channel_oid='{1}' title='{2}' subtitle='{3}' start='{4}'", program.oid, program.channel_oid, program.name, program.sub_title, program.start_time.ToDateTimeString());
482                //        var updated_program = program;
483                //        bool needsupdate = false;
484                //        if (xmltv_entry.Title != program.name)
485                //        {
486                //            //gLog.Verbose.Warn.WriteLine("    Updating:");
487                //            //gLog.Verbose.Warn.WriteLine("        Old Title: {0}", program.name);
488                //            //gLog.Verbose.Warn.WriteLine("        New Title: {0}", xmltv_entry.Title);
489                //            updated_program.name = xmltv_entry.Title;
490                //            needsupdate = true;
491                //        }
492                //        if (xmltv_entry.SubTitle != program.sub_title)
493                //        {
494                //            //gLog.Verbose.Warn.WriteLine("    Updating:");
495                //            //gLog.Verbose.Warn.WriteLine("        Old SubTile: {0}", program.sub_title);
496                //            //gLog.Verbose.Warn.WriteLine("        New SubTile: {0}", xmltv_entry.SubTitle);
497                //            updated_program.sub_title = xmltv_entry.SubTitle;
498                //            needsupdate = true;
499                //        }
500                //        if (xmltv_entry.Description != program.description)
501                //        {
502                //            //gLog.Verbose.Warn.WriteLine("    Updating:");
503                //            //gLog.Verbose.Warn.WriteLine("        Old Descption: {0}", program.description);
504                //            //gLog.Verbose.Warn.WriteLine("        New Descption: {0}", xmltv_entry.Description);
505                //            updated_program.description = xmltv_entry.Description;
506                //            needsupdate = true;
507                //        }
508                //        if (DateTime.Parse(xmltv_entry.Start) != program.start_time)
509                //        {
510                //            //gLog.Verbose.Warn.WriteLine("    Updating:");
511                //            //gLog.Verbose.Warn.WriteLine("        Old StartTime: {0}", program.start_time.ToDateTimeString());
512                //            //gLog.Verbose.Warn.WriteLine("        New StartTime: {0}", DateTime.Parse(xmltv_entry.Start).ToDateTimeString());
513                //            updated_program.start_time = DateTime.Parse(xmltv_entry.Start);
514                //            needsupdate = true;
515                //        }
516                //        if (DateTime.Parse(xmltv_entry.Stop) != program.end_time)
517                //        {
518                //            //gLog.Verbose.Warn.WriteLine("    Updating:");
519                //            //gLog.Verbose.Warn.WriteLine("        Old EndTime: {0}", program.end_time.ToDateTimeString());
520                //            //gLog.Verbose.Warn.WriteLine("        New EndTime: {0}", DateTime.Parse(xmltv_entry.Stop).ToDateTimeString());
521                //            updated_program.end_time = DateTime.Parse(xmltv_entry.Stop);
522                //            needsupdate = true;
523                //        }                    
524                //        if (needsupdate)
525                //        {
526                //            OldNewProgram p = new OldNewProgram();
527                //            p.OldProgram = program;
528                //            p.NewProgram = updated_program;
529                //            source_update.Add(p);
530                //        }
531                //        source_valid.Add(updated_program);
532                //    }
533                //    index++;
534                //}
535                //source_valid = source_valid.OrderBy(s => s.channel_oid).ThenBy(s => s.start_time).ToList();
536                //source_invalid = source_invalid.OrderBy(s => s.channel_oid).ThenBy(s => s.start_time).ToList();
537                //if (source_invalid.Count > 0)
538                //{
539                //    double source_invalid_count = source_valid.Count;
540                //    double source_invalid_index = 0;
541                //    double source_invalid_progress = 0;
542                //    foreach (var old_program in source_invalid)
543                //    {
544                //        source_invalid_progress = 100.0 * (source_invalid_index / source_invalid_count);
545                //        gLog.ReportProgress(this, new ReportProgressEventArgs((int)source_invalid_progress, string.Format("Removing old GBPVR Programs: {0:00}%", (int)source_invalid_progress)));    
546                //        // remove database entry
547                //        if (!RemoveProgramDatabaseEntry(old_program))
548                //        {
549                //            gLog.Error.WriteLine("Failed to remove program with oid: '{0}'", old_program.oid);
550                //        }
551                //        else
552                //        {
553                //            gLog.Verbose.Info.WriteLine("Removed program with oid: '{0}'", old_program.oid);
554                //        }
555                //        source_invalid_index++;
556                //    }
557                //}
558                //else
559                //{
560                //    gLog.Info.WriteLine("No old GB-PVR Programs needed to be removed.");
561                //}
562                //if (source_update.Count > 0)
563                //{
564                //    double source_update_count = source_valid.Count;
565                //    double source_update_index = 0;
566                //    double source_update_progress = 0;
567                //    foreach (var p in source_update)
568                //    {
569                //        source_update_progress = 100.0 * (source_update_index / source_update_count);
570                //        gLog.ReportProgress(this, new ReportProgressEventArgs((int)source_update_progress, string.Format("Updating GBPVR Programs: {0:00}%", (int)source_update_progress)));    
571                //        // remove database entry
572                //        if (!UpdateProgramDatabaseEntry(p.OldProgram,p.NewProgram))
573                //        {
574                //            gLog.Error.WriteLine("Failed to update program with oid: '{0}'", p.OldProgram.oid);
575                //        }
576                //        else
577                //        {
578                //            gLog.Verbose.Info.WriteLine("Upated program with oid: '{0}'", p.OldProgram.oid);
579                //        }
580                //        source_update_index++;
581                //    }
582                //}
583                //else
584                //{
585                //    gLog.Info.WriteLine("No GB-PVR Programs needed to be updated.");
586                //}
587                //gLog.Info.WriteLine("Total XMLTV Programs: 0x{0:x8}", xmltv_programs.Count);
588                //gLog.Info.WriteLine("Updated: 0x{0:x8} GB-PVR Programs", source_valid.Count);
589                //gLog.Info.WriteLine("Removed: 0x{0:x8} GB-PVR Programs", source_invalid.Count);
590                //gLog.Info.WriteLine("Total GB-PVR Programs (Updated & Removed): 0x{0:x8}", source_valid.Count + source_invalid.Count);
591                #endregion
592    
593              return source_valid;              return source_valid;
594          }          }
# Line 558  namespace GBPVRProgramDatabaseFixer Line 673  namespace GBPVRProgramDatabaseFixer
673                  List<ICHANNEL> channels = new List<ICHANNEL>();                  List<ICHANNEL> channels = new List<ICHANNEL>();
674                  using (SQLiteConnection con = CreateConnection())                  using (SQLiteConnection con = CreateConnection())
675                  {                  {
676                      con.Open();                      try
                     string command_text = string.Format("select * from {0};", TABLES.CHANNEL);  
                     gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);  
                     using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))  
677                      {                      {
678                          using (SQLiteDataReader r = cmd.ExecuteReader())                          con.Open();
679                            string command_text = string.Format("select * from {0};", TABLES.CHANNEL);
680                            gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
681                            using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
682                          {                          {
683                              if (!r.HasRows)                              using (SQLiteDataReader r = cmd.ExecuteReader())
684                              {                              {
685                                  gLog.Warn.WriteLine("Query: '{0}' returned no rows.", cmd.CommandText);                                  if (!r.HasRows)
                             }  
                             else  
                             {  
                                 while (r.Read())  
686                                  {                                  {
687                                      CHANNEL channel = new CHANNEL();                                      gLog.Warn.WriteLine("Query: '{0}' returned no rows.", cmd.CommandText);
688                                      for (int i = 0; i < r.FieldCount; i++)                                  }
689                                    else
690                                    {
691                                        while (r.Read())
692                                      {                                      {
693                                          CHANNEL.Create(ref channel, r, i);                                          CHANNEL channel = new CHANNEL();
694                                            for (int i = 0; i < r.FieldCount; i++)
695                                            {
696                                                CHANNEL.Create(ref channel, r, i);
697                                            }
698                                            channels.Add(channel);
699                                      }                                      }
                                     channels.Add(channel);  
700                                  }                                  }
701                              }                              }
702                          }                          }
703                      }                      }
704                      con.Clone();                      catch (SQLiteException ex)
705                        {
706                            gLog.Error.WriteLine(ex.ToString());
707                        }
708                        finally
709                        {
710                            con.Close();
711                        }
712                  }                  }
713                  this.Channels = channels;                  this.Channels = channels;
714              }              }
# Line 599  namespace GBPVRProgramDatabaseFixer Line 724  namespace GBPVRProgramDatabaseFixer
724                  List<IPROGRAMME> programs = new List<IPROGRAMME>();                  List<IPROGRAMME> programs = new List<IPROGRAMME>();
725                  using (SQLiteConnection con = CreateConnection())                  using (SQLiteConnection con = CreateConnection())
726                  {                  {
727                      con.Open();                      try
                     string command_text = string.Format("select * from {0};", TABLES.PROGRAMME);  
                     gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);  
                     using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))  
728                      {                      {
729                          using (SQLiteDataReader r = cmd.ExecuteReader())                          con.Open();
730                            string command_text = string.Format("select * from {0};", TABLES.PROGRAMME);
731                            gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
732                            using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
733                          {                          {
734                              if (!r.HasRows)                              using (SQLiteDataReader r = cmd.ExecuteReader())
                             {  
                                 gLog.Warn.WriteLine("Query: '{0}' returned no rows.", cmd.CommandText);  
                             }  
                             else  
735                              {                              {
736                                  while (r.Read())                                  if (!r.HasRows)
737                                  {                                  {
738                                      PROGRAMME program = new PROGRAMME();                                      gLog.Warn.WriteLine("Query: '{0}' returned no rows.", cmd.CommandText);
739                                      for (int i = 0; i < r.FieldCount; i++)                                  }
740                                    else
741                                    {
742                                        while (r.Read())
743                                      {                                      {
744                                          PROGRAMME.Create(ref program, r, i);                                          PROGRAMME program = new PROGRAMME();
745                                            for (int i = 0; i < r.FieldCount; i++)
746                                            {
747                                                PROGRAMME.Create(ref program, r, i);
748                                            }
749                                            programs.Add(program);
750                                      }                                      }
                                     programs.Add(program);  
751                                  }                                  }
752                              }                              }
753                          }                          }
754                      }                      }
755                      con.Clone();                      catch (SQLiteException ex)
756                        {
757                            gLog.Error.WriteLine(ex.ToString());
758                        }
759                        finally
760                        {
761                            con.Close();
762                        }
763                  }                  }
764                  this.Programs = programs;                  this.Programs = programs;
765              }              }
# Line 640  namespace GBPVRProgramDatabaseFixer Line 775  namespace GBPVRProgramDatabaseFixer
775                  List<IRECORDING_SCHEDULE> recordings = new List<IRECORDING_SCHEDULE>();                  List<IRECORDING_SCHEDULE> recordings = new List<IRECORDING_SCHEDULE>();
776                  using (SQLiteConnection con = CreateConnection())                  using (SQLiteConnection con = CreateConnection())
777                  {                  {
778                      con.Open();                      try
                     string command_text = string.Format("select * from {0};", TABLES.RECORDING_SCHEDULE);  
                     gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);  
                     using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))  
779                      {                      {
780                          using (SQLiteDataReader r = cmd.ExecuteReader())                          con.Open();
781                            string command_text = string.Format("select * from {0};", TABLES.RECORDING_SCHEDULE);
782                            gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
783                            using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
784                          {                          {
785                              if (!r.HasRows)                              using (SQLiteDataReader r = cmd.ExecuteReader())
                             {  
                                 gLog.Warn.WriteLine("Query: '{0}' returned no rows.", cmd.CommandText);  
                             }  
                             else  
786                              {                              {
787                                  while (r.Read())                                  if (!r.HasRows)
788                                  {                                  {
789                                      RECORDING_SCHEDULE recording = new RECORDING_SCHEDULE();                                      gLog.Warn.WriteLine("Query: '{0}' returned no rows.", cmd.CommandText);
790                                      for (int i = 0; i < r.FieldCount; i++)                                  }
791                                    else
792                                    {
793                                        while (r.Read())
794                                      {                                      {
795                                          RECORDING_SCHEDULE.Create(ref recording, r, i);                                          RECORDING_SCHEDULE recording = new RECORDING_SCHEDULE();
796                                            for (int i = 0; i < r.FieldCount; i++)
797                                            {
798                                                RECORDING_SCHEDULE.Create(ref recording, r, i);
799                                            }
800                                            recordings.Add(recording);
801                                      }                                      }
                                     recordings.Add(recording);  
802                                  }                                  }
803                              }                              }
804                          }                          }
805                      }                      }
806                      con.Clone();                      catch (SQLiteException ex)
807                        {
808                            gLog.Error.WriteLine(ex.ToString());
809                        }
810                        finally
811                        {
812                            con.Close();
813                        }
814                  }                  }
815                  this.Recordings = recordings;                  this.Recordings = recordings;
816              }              }
# Line 675  namespace GBPVRProgramDatabaseFixer Line 820  namespace GBPVRProgramDatabaseFixer
820              }              }
821          }          }
822    
823            public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)
824            {            
825                gLog.Info.WriteLine("Removing all gbpvr programs.");
826                //double total = programs.Count;
827                //double index = 0;
828                //double progress = 0;
829                //foreach (var program in programs)
830                //{
831                //    progress = 100.0 * (index / total);
832                //    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing GBPVR Programs: {0:00}%", (int)progress)));
833                //    if (!RemoveProgramDatabaseEntry(program))
834                //    {
835                //        gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);
836                //    }
837                //    index++;
838                //}
839                Stopwatch st = new Stopwatch();
840                st.Start();
841                if (!RemoveAllProgramDatabaseEntries())
842                {
843                    gLog.Error.WriteLine("Failed to remove one or more program(s)");
844                }
845                st.Stop();
846                gLog.Warn.WriteLine("    operation took: {0:0.00000} minutes", st.Elapsed.TotalMinutes);
847            }
848            public void UpdateGBPVRPrograms(List<IPROGRAMME> programs)
849            {
850                int ChunkSize = 500;
851                var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
852    
853                double total = programs.Count;
854                double index = 0;
855                double progress = 0;
856                Stopwatch st1 = new Stopwatch();
857                st1.Start();
858                foreach (var p in ChunkList)
859                {
860                    //Stopwatch st2 = new Stopwatch();
861                    //st2.Start();
862                    progress = 100.0 * (index / total);
863                    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Inserting GBPVR Programs: {0:00}%", (int)progress)));
864                    //gLog.Warn.WriteLine("Inserting {0} gbpvr programs.", p.Count());  
865                    if (!InsertProgramEntryDatabase(p))
866                    {
867                        gLog.Error.WriteLine("Failed to insert one or more program(s)");
868                    }
869                    //st2.Stop();
870                    //gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds", st2.Elapsed.TotalSeconds);
871                    //gLog.Warn.WriteLine(System.Environment.NewLine);
872                    
873                    index += (double)p.Count();                
874                }
875                st1.Stop();
876                gLog.Warn.WriteLine("    operation took: {0:0.00000} minutes overall", st1.Elapsed.TotalMinutes);
877            }
878    
879            private bool RemoveAllProgramDatabaseEntries()
880            {
881                bool result = false;
882                try
883                {
884                    using (SQLiteConnection con = CreateConnection())
885                    {
886                        try
887                        {
888                            //gLog.Verbose.Info.WriteLine("Removing old program with oid: '{0}'", old_program.oid);
889                            con.Open();
890                            string command_text = string.Format(@"DELETE FROM [{0}];", TABLES.PROGRAMME);
891                            //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
892                            using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
893                            {
894                                //cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));
895                                int rowsupdated = cmd.ExecuteNonQuery();
896                                //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
897                            }
898                            result = true;
899                        }
900                        catch (SQLiteException ex)
901                        {
902                            gLog.Error.WriteLine(ex.ToString());
903                            result = false;
904                        }
905                        finally
906                        {
907                            con.Close();
908                        }
909                    }
910                }
911                catch (Exception ex)
912                {
913                    gLog.Error.WriteLine(ex.ToString());
914                    result = false;
915                }
916                return result;
917            }
918          private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)          private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)
919          {          {
920              bool result = false;              bool result = false;
921              try              try
922              {                              {
923                  using (SQLiteConnection con = CreateConnection())                  using (SQLiteConnection con = CreateConnection())
924                  {                  {
925                      try                      try
926                      {                      {
927                          gLog.Verbose.Info.WriteLine("Removing old program with oid: '{0}'", old_program.oid);                          //gLog.Verbose.Info.WriteLine("Removing old program with oid: '{0}'", old_program.oid);
928                          con.Open();                          con.Open();
929                          string command_text = string.Format(@"DELETE FROM [{0}] WHERE [oid] = @oid;", TABLES.PROGRAMME);                          string command_text = string.Format(@"DELETE FROM [{0}] WHERE [oid] = @oid;", TABLES.PROGRAMME);
930                          gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
931                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
932                          {                          {
933                              cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));                              cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));
934                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
935                              gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
936                          }                          }
                         con.Clone();  
937                          result = true;                          result = true;
938                      }                      }
939                      catch (SQLiteException ex)                      catch (SQLiteException ex)
# Line 704  namespace GBPVRProgramDatabaseFixer Line 941  namespace GBPVRProgramDatabaseFixer
941                          gLog.Error.WriteLine(ex.ToString());                          gLog.Error.WriteLine(ex.ToString());
942                          result = false;                          result = false;
943                      }                      }
944                        finally
945                        {
946                            con.Close();
947                        }
948                  }                  }
949              }              }
950              catch (Exception ex)              catch (Exception ex)
# Line 713  namespace GBPVRProgramDatabaseFixer Line 954  namespace GBPVRProgramDatabaseFixer
954              }              }
955              return result;              return result;
956          }          }
957          private bool UpdateProgramDatabaseEntry(IPROGRAMME old_program, IPROGRAMME new_program)          private bool InsertProgramEntryDatabase(IEnumerable<IPROGRAMME> list)
958          {          {
959              bool result = false;              bool result = false;
960              try              try
# Line 722  namespace GBPVRProgramDatabaseFixer Line 963  namespace GBPVRProgramDatabaseFixer
963                  {                  {
964                      try                      try
965                      {                      {
966                          gLog.Verbose.Info.WriteLine("Updating old program with oid: '{0}'", old_program.oid);                          //gLog.Verbose.Info.WriteLine("Updating old program with oid: '{0}'", new_program.oid);
967                          con.Open();                          con.Open();
968                          //string command_text = string.Format(@"UPDATE [{0}] SET [name]=@name,[sub_title]=@subtitle, WHERE [OID] = @oid", TABLES.PROGRAMME);                          //string command_text = string.Format(@"UPDATE [{0}] SET [name]=@name,[sub_title]=@subtitle, WHERE [OID] = @oid", TABLES.PROGRAMME);
969                          string command_text = string.Empty;                          string command_text = string.Empty;
970                          StringBuilder builder = new StringBuilder();                          command_text = BuildGBPVRMultiInsertCommand(list);
971                            //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
                         builder.AppendLine(string.Format("UPDATE [{0}]", TABLES.PROGRAMME));  
                         builder.Append("SET ");  
                         builder.AppendFormat("[name]=@name,");  
                         builder.AppendFormat("[sub_title]=@sub_title,");  
                         builder.AppendFormat("[description]=@description,");  
                         builder.AppendFormat("[start_time]=@start_time,");  
                         builder.AppendFormat("[end_time]=@end_time,");  
                         builder.AppendFormat("[channel_oid]=@channel_oid,");  
                         builder.AppendFormat("[unique_identifier]=@unique_identifier,");  
                         builder.AppendFormat("[rating]=@rating");  
                         builder.AppendLine(" WHERE [oid] = @oid");  
   
                         command_text = builder.ToString();  
                         gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);  
972                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
973                          {                          {                          
                             cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));  
                             cmd.Parameters.Add(new SQLiteParameter("name", new_program.name));  
                             cmd.Parameters.Add(new SQLiteParameter("sub_title", new_program.sub_title));  
                             cmd.Parameters.Add(new SQLiteParameter("description", new_program.description));  
                             cmd.Parameters.Add(new SQLiteParameter("start_time", new_program.start_time));  
                             cmd.Parameters.Add(new SQLiteParameter("end_time", new_program.end_time));  
                             cmd.Parameters.Add(new SQLiteParameter("channel_oid", new_program.channel_oid));  
                             cmd.Parameters.Add(new SQLiteParameter("unique_identifier", new_program.unique_identifier));  
                             cmd.Parameters.Add(new SQLiteParameter("rating", new_program.rating));  
974                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
975                              gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
976                          }                          }
977                          con.Clone();  
978                          result = true;                          result = true;
979                      }                      }
980                      catch (SQLiteException ex)                      catch (SQLiteException ex)
# Line 764  namespace GBPVRProgramDatabaseFixer Line 982  namespace GBPVRProgramDatabaseFixer
982                          gLog.Error.WriteLine(ex.ToString());                          gLog.Error.WriteLine(ex.ToString());
983                          result = false;                          result = false;
984                      }                      }
985                        finally
986                        {
987                            con.Close();
988                        }
989                  }                  }
990              }              }
991              catch (Exception ex)              catch (Exception ex)
# Line 773  namespace GBPVRProgramDatabaseFixer Line 995  namespace GBPVRProgramDatabaseFixer
995              }              }
996              return result;              return result;
997          }          }
998    
999            private string BuildGBPVRMultiInsertCommand(IEnumerable<IPROGRAMME> list)
1000            {
1001                StringBuilder builder = new StringBuilder();
1002                /*
1003                    insert into table1 (field1,field2) values (value1,value2);
1004                    insert into table1 (field1,field2) values (value1,value2);
1005                    insert into table1 (field1,field2) values (value1,value2);
1006                    insert into table1 (field1,field2) values (value1,value2)
1007                 */
1008                builder.AppendLine("begin transaction;");
1009                foreach (var t in list)
1010                {
1011                    builder.AppendLine(BuildGBPVRSingleInsertCommand(t));
1012                }
1013                builder.AppendLine("end transaction;");
1014                return builder.ToString();
1015            }
1016    
1017            private string BuildGBPVRSingleInsertCommand(IPROGRAMME program)
1018            {
1019                StringBuilder builder = new StringBuilder();
1020                builder.AppendFormat("insert into {0} (oid,name,sub_title,description,start_time,end_time,channel_oid,unique_identifier,rating) values (", TABLES.PROGRAMME);
1021                builder.AppendFormat("{0},",program.oid);
1022                builder.AppendFormat("\"{0}\",", program.name);
1023                builder.AppendFormat("\"{0}\",", program.sub_title);
1024                builder.AppendFormat("\"{0}\",", program.description);
1025                builder.AppendFormat("'{0}',", program.start_time);
1026                builder.AppendFormat("'{0}',", program.end_time);
1027                builder.AppendFormat("{0},", program.channel_oid);
1028                builder.AppendFormat("\"{0}\",", program.unique_identifier);
1029                builder.AppendFormat("\"{0}\");", program.rating);
1030                return builder.ToString();
1031            }
1032          
1033      }      }
1034  }  }

Legend:
Removed from v.179  
changed lines
  Added in v.201

  ViewVC Help
Powered by ViewVC 1.1.22