/[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 157 by william, Thu Mar 14 19:36:01 2013 UTC revision 173 by william, Sat Mar 16 15:33:25 2013 UTC
# Line 6  using System.Text; Line 6  using System.Text;
6  using System.Data.SQLite;  using System.Data.SQLite;
7  using System.Diagnostics;  using System.Diagnostics;
8  using Enterprise.Logging;  using Enterprise.Logging;
9    using libxmltv;
10    using libxmltv.Interfaces;
11    using libxmltv.Core;
12  namespace GBPVRProgramDatabaseFixer  namespace GBPVRProgramDatabaseFixer
13  {  {
14      internal class SQLLITE      public interface ISQLLITE
15        {
16            List<SQLLITE.IPROGRAMME> Programs { get; }
17            List<SQLLITE.IRECORDING_SCHEDULE> Recordings { get; }
18            List<SQLLITE.ICHANNEL> Channels { get; }
19            IDateTimeRange GetProgramsDateRange(List<SQLLITE.IPROGRAMME> programs);
20            List<SQLLITE.IPROGRAMME> CreateUpdatedProgramsList(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> removed_programs);
21    
22        }
23        public class SQLLITE : ISQLLITE
24      {      {
25            public static ISQLLITE Create(string database, EventHandler<EventArgs> OnInstanceCreated)
26            {
27                return new SQLLITE(database, OnInstanceCreated);
28            }
29    
30          #region DATABASE DEFINITIONS          #region DATABASE DEFINITIONS
31    
32            public interface ICHANNEL
33            {
34                Int64 oid { get; }
35                String name { get; }
36                String channelID { get; }
37                Int64 channel_number { get; }
38                String favourite_channel { get; }
39                String display_name { get; }
40            }
41            private class CHANNEL : ICHANNEL
42            {
43                public CHANNEL()
44                {
45                    BaseDatabaseDefinition<CHANNEL>.CreateDefault(this);
46                }
47                //public RECORDING_SCHEDULE(SQLiteDataReader r, int index) { BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(this, r, index); }
48    
49                public static void Create(ref CHANNEL instance, SQLiteDataReader r, int index)
50                {
51                    BaseDatabaseDefinition<CHANNEL>.Create(ref instance, r, index);
52                }
53                #region ICHANNEL members
54                public Int64 oid { get; set; }
55                public String name { get; set; }
56                public String channelID { get; set; }
57                public Int64 channel_number { get; set; }
58                public String favourite_channel { get; set; }
59                public String display_name { get; set; }
60                #endregion
61            }
62          public interface IRECORDING_SCHEDULE          public interface IRECORDING_SCHEDULE
63          {          {
64              Int64 oid { get; }              Int64 oid { get; }
# Line 144  namespace GBPVRProgramDatabaseFixer Line 191  namespace GBPVRProgramDatabaseFixer
191    
192          public interface IPROGRAMME          public interface IPROGRAMME
193          {          {
194              Int64 oid { get; }              Int64 oid { get; set; }
195              String name { get; }              String name { get; set; }
196              String sub_title { get; }              String sub_title { get; set; }
197              String description { get; }              String description { get; set; }
198              DateTime start_time { get; }              DateTime start_time { get; set; }
199              DateTime end_time { get; }              DateTime end_time { get; set; }
200              Int64 channel_oid { get; }              Int64 channel_oid { get; set; }
201              String unique_identifier { get; }              String unique_identifier { get; set; }
202              String rating { get; }              String rating { get; set; }
203    
204                IProgramDefinition AsXMLTVProgramDefinition(ISQLLITE sqllite);
205          }          }
206          private class PROGRAMME : IPROGRAMME          private class PROGRAMME : IPROGRAMME
207          {          {
# Line 175  namespace GBPVRProgramDatabaseFixer Line 224  namespace GBPVRProgramDatabaseFixer
224              public Int64 channel_oid { get; set; }              public Int64 channel_oid { get; set; }
225              public String unique_identifier { get; set; }              public String unique_identifier { get; set; }
226              public String rating { get; set; }              public String rating { get; set; }
227                public IProgramDefinition AsXMLTVProgramDefinition(ISQLLITE sqllite)
228                {
229                    ProgramList.ProgramDefintion definition = new ProgramList.ProgramDefintion();
230                    var channel = sqllite.Channels.Find(s => s.oid == this.channel_oid);
231                    definition.ChannelName = channel.display_name;
232                    definition.ChannelNumber = (int)channel.channel_number;
233                    definition.Description = this.description;
234                    definition.Start = this.start_time.ToDateTimeString();
235                    definition.Stop = this.end_time.ToDateTimeString();
236                    definition.SubTitle = this.sub_title;
237                    definition.Title = this.name;
238                    return definition;
239                }
240              #endregion              #endregion
241          }          }
242          #endregion          #endregion
# Line 182  namespace GBPVRProgramDatabaseFixer Line 244  namespace GBPVRProgramDatabaseFixer
244          {          {
245              public const string RECORDING_SCHEDULE = "RECORDING_SCHEDULE";              public const string RECORDING_SCHEDULE = "RECORDING_SCHEDULE";
246              public const string PROGRAMME = "PROGRAMME";              public const string PROGRAMME = "PROGRAMME";
247                public const string CHANNEL = "CHANNEL";
248          }          }
249    
250          //public SQLLite() { }          //public SQLLite() { }
251          public SQLLITE(string database, EventHandler<EventArgs> OnInstanceCreated)          protected SQLLITE(string database, EventHandler<EventArgs> OnInstanceCreated)
252          {          {
253              this.OnInstanceCreated = OnInstanceCreated;              this.OnInstanceCreated = OnInstanceCreated;
254              //CreateConnection(database);              //CreateConnection(database);
# Line 196  namespace GBPVRProgramDatabaseFixer Line 259  namespace GBPVRProgramDatabaseFixer
259                  return;                  return;
260              }              }
261              ConnectionTest();              ConnectionTest();
262                ReadChannelData();
263              ReadRecodringScheduleData();              ReadRecodringScheduleData();
264              ReadProgrammeData();              ReadProgrammeData();
265              OnCreatedInstance(this, new EventArgs());              OnCreatedInstance(this, new EventArgs());
# Line 210  namespace GBPVRProgramDatabaseFixer Line 274  namespace GBPVRProgramDatabaseFixer
274              if (OnInstanceCreated != null) { OnInstanceCreated.Invoke(sender, e); }              if (OnInstanceCreated != null) { OnInstanceCreated.Invoke(sender, e); }
275          }          }
276    
         #region SQLLite  
277          private string Database;          private string Database;
278            #region ISQLLITE members        
279          public List<IPROGRAMME> Programs { get; private set; }          public List<IPROGRAMME> Programs { get; private set; }
280          public List<IRECORDING_SCHEDULE> Recordings { get; private set; }          public List<IRECORDING_SCHEDULE> Recordings { get; private set; }
281            public List<ICHANNEL> Channels { get; private set; }
282    
283            public IDateTimeRange GetProgramsDateRange(List<SQLLITE.IPROGRAMME> programs)
284            {
285                var list = new List<IPROGRAMME>(programs.ToArray());
286                DateTime first = new DateTime();
287                DateTime last = new DateTime();
288                first = list.OrderBy(s => s.start_time).ToList().First().start_time;            
289                last = list.OrderBy(s => s.start_time).ToList().Last().start_time;
290                gLog.Verbose.Debug.WriteLine("\tFirst: {0} = ({1})", first.ToString("yyyy/MM/dd HH:mm:ss.fffffff"), first.ToDateTimeString());
291                gLog.Verbose.Debug.WriteLine("\tLast: {0} = ({1})", last.ToString("yyyy/MM/dd HH:mm:ss.fffffff"), last.ToDateTimeString());
292                var range = DateTimeRange.Create(first, last);
293                return range;
294            }
295    
296            public List<SQLLITE.IPROGRAMME> CreateUpdatedProgramsList(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> source_invalid)
297            {
298                source_invalid = new List<IPROGRAMME>();
299                gbpvr_programs = gbpvr_programs.OrderBy(s => s.start_time).ToList();            
300                List<SQLLITE.IPROGRAMME> source_valid = new List<IPROGRAMME>();
301                //if (range == null)
302                //{
303                //    gLog.Warn.WriteLine("The DateTimeRange passed in is null...returning the original program list");
304                //    return list;
305                //}
306                //gLog.Warn.WriteLine("FilterProgramsByDateRange has not been implemented");
307                
308                double total = gbpvr_programs.Count;
309                double index = 0;
310                double progress = 0;
311                foreach (var program in gbpvr_programs)
312                {  
313                    progress = 100.0 * (index / total);
314                    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Filtering GBPVR Programs: {0:00}%", (int)progress)));                
315                    var channel_oid = program.channel_oid;
316                    var channel = this.Channels.Find(s => s.oid == channel_oid);
317                    var start_date = program.start_time;
318                    //var xmltv_entry_list = xmltv_programs.FindAll(s => s.ChannelNumber == channel.channel_number && s.Start == start_date.ToDateTimeString());
319                    var query = from c in xmltv_programs
320                                where
321                                c.ChannelNumber == channel.channel_number &&
322                                c.Start == start_date.ToDateTimeString()
323                                select c;
324    
325                    IProgramDefinition xmltv_entry = null;
326                    if (query.Count()-1 > 0)
327                    {
328                        gLog.Error.WriteLine("Found more than one entry: Matching channel='{0}' and start='{1}'", channel.channel_number, start_date.ToDateTimeString());
329                        gLog.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);
330                        if (Debugger.IsAttached)
331                        {                      
332                            gLog.Error.WriteLine("    Found: {0} matching entries", query.Count());
333                            int k_index = 0;
334                            foreach (var k in query)
335                            {
336                                gLog.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);
337                                k_index++;
338                            }
339                            Debugger.Break();
340                        }
341                    }
342                    else
343                    {
344                        xmltv_entry = query.FirstOrDefault();
345                    }
346    
347                    if (xmltv_entry == null)
348                    {
349                        gLog.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());
350                        source_invalid.Add(program);
351                    }
352                    else
353                    {
354                        gLog.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());
355                        var updated_program = program;
356                        if (xmltv_entry.Title != program.name)
357                        {
358                            gLog.Warn.WriteLine("    Updating:");
359                            gLog.Warn.WriteLine("        Old Title: {0}", program.name);
360                            gLog.Warn.WriteLine("        New Title: {0}", xmltv_entry.Title);
361                            updated_program.name = xmltv_entry.Title;
362                        }
363                        if (xmltv_entry.SubTitle != program.sub_title)
364                        {
365                            gLog.Warn.WriteLine("    Updating:");
366                            gLog.Warn.WriteLine("        Old SubTile: {0}", program.sub_title);
367                            gLog.Warn.WriteLine("        New SubTile: {0}", xmltv_entry.SubTitle);
368                            updated_program.sub_title = xmltv_entry.SubTitle;
369                        }
370                        if (xmltv_entry.Description != program.description)
371                        {
372                            gLog.Warn.WriteLine("    Updating:");
373                            gLog.Warn.WriteLine("        Old Descption: {0}", program.description);
374                            gLog.Warn.WriteLine("        New Descption: {0}", xmltv_entry.Description);
375                            updated_program.description = xmltv_entry.Description;                        
376                        }
377                        if (DateTime.Parse(xmltv_entry.Start) != program.start_time)
378                        {
379                            gLog.Warn.WriteLine("    Updating:");
380                            gLog.Warn.WriteLine("        Old StartTime: {0}", program.start_time.ToDateTimeString());
381                            gLog.Warn.WriteLine("        New StartTime: {0}", DateTime.Parse(xmltv_entry.Start).ToDateTimeString());
382                            updated_program.start_time = DateTime.Parse(xmltv_entry.Start);
383                        }
384                        if (DateTime.Parse(xmltv_entry.Stop) != program.end_time)
385                        {
386                            gLog.Warn.WriteLine("    Updating:");
387                            gLog.Warn.WriteLine("        Old EndTime: {0}", program.end_time.ToDateTimeString());
388                            gLog.Warn.WriteLine("        New EndTime: {0}", DateTime.Parse(xmltv_entry.Stop).ToDateTimeString());
389                            updated_program.end_time = DateTime.Parse(xmltv_entry.Stop);
390                        }
391                        source_valid.Add(updated_program);
392                    }
393                    index++;
394                }
395    
396                //for (int i = 0; i < programs.Count(); i++)
397                //{
398                //    var gbpvr_entry = gbpvr[i];
399                //    var xmltv_entry = gbpvr_entry.AsXMLTVProgramDefinition(sqlite);
400                //    if (!xmltv[i].Equals(xmltv_entry))
401                //    {
402                //        gLog.Warn.WriteLine("Warning GBPVR Program oid: {0} might be invalid", gbpvr_entry.oid);
403                //    }
404                //}
405    
406                source_valid = source_valid.OrderBy(s => s.channel_oid).ThenBy(s => s.start_time).ToList();
407                source_invalid = source_invalid.OrderBy(s => s.channel_oid).ThenBy(s => s.start_time).ToList();
408    
409                gLog.Info.WriteLine("Total XMLTV Programs: 0x{0:x8}", xmltv_programs.Count);
410                gLog.Info.WriteLine("Updated: 0x{0:x8} GB-PVR Programs", source_valid.Count);
411                gLog.Info.WriteLine("Removed: 0x{0:x8} GB-PVR Programs", source_invalid.Count);
412                gLog.Info.WriteLine("Total GB-PVR Programs (Updated & Removed): 0x{0:x8}", source_valid.Count + source_invalid.Count);
413    
414                return source_valid;
415            }
416          #endregion          #endregion
417    
418    
# Line 233  namespace GBPVRProgramDatabaseFixer Line 432  namespace GBPVRProgramDatabaseFixer
432                  using (SQLiteConnection con = CreateConnection())                  using (SQLiteConnection con = CreateConnection())
433                  {                  {
434                      con.Open();                      con.Open();
435                      string command_text = string.Format("select * from {0};", TABLES.PROGRAMME);                      string command_text = string.Format("select * from {0};", TABLES.CHANNEL);
436                      gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                      gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
437                      using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                      using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
438                      {                      {
# Line 288  namespace GBPVRProgramDatabaseFixer Line 487  namespace GBPVRProgramDatabaseFixer
487                  return false;                  return false;
488              }              }
489          }          }
490            private void ReadChannelData()
491            {
492                try
493                {
494                    List<ICHANNEL> channels = new List<ICHANNEL>();
495                    using (SQLiteConnection con = CreateConnection())
496                    {
497                        con.Open();
498                        string command_text = string.Format("select * from {0};", TABLES.CHANNEL);
499                        gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
500                        using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
501                        {
502                            using (SQLiteDataReader r = cmd.ExecuteReader())
503                            {
504                                if (!r.HasRows)
505                                {
506                                    gLog.Warn.WriteLine("Query: '{0}' returned no rows.", cmd.CommandText);
507                                }
508                                else
509                                {
510                                    while (r.Read())
511                                    {
512                                        CHANNEL channel = new CHANNEL();
513                                        for (int i = 0; i < r.FieldCount; i++)
514                                        {
515                                            CHANNEL.Create(ref channel, r, i);
516                                        }
517                                        channels.Add(channel);
518                                    }
519                                }
520                            }
521                        }
522                        con.Clone();
523                    }
524                    this.Channels = channels;
525                }
526                catch (Exception ex)
527                {
528                    gLog.Error.WriteLine(ex.ToString());
529                }
530            }
531          private void ReadProgrammeData()          private void ReadProgrammeData()
532          {          {
533              try              try
# Line 357  namespace GBPVRProgramDatabaseFixer Line 596  namespace GBPVRProgramDatabaseFixer
596                                      {                                      {
597                                          RECORDING_SCHEDULE.Create(ref recording, r, i);                                          RECORDING_SCHEDULE.Create(ref recording, r, i);
598                                      }                                      }
   
599                                      recordings.Add(recording);                                      recordings.Add(recording);
600                                  }                                  }
601                              }                              }
# Line 372  namespace GBPVRProgramDatabaseFixer Line 610  namespace GBPVRProgramDatabaseFixer
610                  gLog.Error.WriteLine(ex.ToString());                  gLog.Error.WriteLine(ex.ToString());
611              }              }
612          }          }
613    
614      }      }
615  }  }

Legend:
Removed from v.157  
changed lines
  Added in v.173

  ViewVC Help
Powered by ViewVC 1.1.22