/[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 213 by william, Sun Mar 17 01:01:10 2013 UTC revision 225 by william, Sun Mar 17 02:58:07 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 ICloneable<T>
15        {
16            T Clone();
17        }
18      public interface IOldNewProgram      public interface IOldNewProgram
19      {      {
20          SQLLITE.IPROGRAMME OldProgram { get; }          SQLLITE.IPROGRAMME OldProgram { get; }
# Line 22  namespace GBPVRProgramDatabaseFixer Line 26  namespace GBPVRProgramDatabaseFixer
26          List<SQLLITE.IRECORDING_SCHEDULE> Recordings { get; }          List<SQLLITE.IRECORDING_SCHEDULE> Recordings { get; }
27          List<SQLLITE.ICHANNEL> Channels { get; }          List<SQLLITE.ICHANNEL> Channels { get; }
28          IDateTimeRange GetProgramsDateRange(List<SQLLITE.IPROGRAMME> programs);          IDateTimeRange GetProgramsDateRange(List<SQLLITE.IPROGRAMME> programs);
29          List<SQLLITE.IPROGRAMME> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> removed_programs);          List<IOldNewProgram> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> removed_programs);
30    
31          void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs);          void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs);
32          void UpdateGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs);          void UpdateGBPVRPrograms(List<IOldNewProgram> programs);
33    
34      }      }
35      public class SQLLITE : ISQLLITE      public class SQLLITE : ISQLLITE
36      {      {
37          private class OldNewProgram : IOldNewProgram          private class OldNewProgram : IOldNewProgram
38          {          {
39              public OldNewProgram() : this(new PROGRAMME(), new PROGRAMME()) { }              public OldNewProgram() : this(new PROGRAMME()) { }
40                public OldNewProgram(IPROGRAMME _old) : this(_old,_old) {  }
41              public OldNewProgram(IPROGRAMME _old, IPROGRAMME _new) { OldProgram = _old; NewProgram = _new; }              public OldNewProgram(IPROGRAMME _old, IPROGRAMME _new) { OldProgram = _old; NewProgram = _new; }
42    
43              public IPROGRAMME OldProgram { get; private set; }              public IPROGRAMME OldProgram { get; private set; }
# Line 44  namespace GBPVRProgramDatabaseFixer Line 49  namespace GBPVRProgramDatabaseFixer
49          }          }
50    
51          #region DATABASE DEFINITIONS          #region DATABASE DEFINITIONS
52            #region BaseDatabaseDefinition
         public interface ICHANNEL  
         {  
             Int64 oid { get; }  
             String name { get; }  
             String channelID { get; }  
             Int64 channel_number { get; }  
             String favourite_channel { get; }  
             String display_name { get; }  
         }  
         private class CHANNEL : ICHANNEL  
         {  
             public CHANNEL()  
             {  
                 BaseDatabaseDefinition<CHANNEL>.CreateDefault(this);  
             }  
             //public RECORDING_SCHEDULE(SQLiteDataReader r, int index) { BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(this, r, index); }  
   
             public static void Create(ref CHANNEL instance, SQLiteDataReader r, int index)  
             {  
                 BaseDatabaseDefinition<CHANNEL>.Create(ref instance, r, index);  
             }  
             #region ICHANNEL members  
             public Int64 oid { get; set; }  
             public String name { get; set; }  
             public String channelID { get; set; }  
             public Int64 channel_number { get; set; }  
             public String favourite_channel { get; set; }  
             public String display_name { get; set; }  
             #endregion  
         }  
         public interface IRECORDING_SCHEDULE  
         {  
             Int64 oid { get; }  
             Int64 programme_oid { get; }  
             Int64 capture_source_oid { get; }  
             Int16 status { get; }  
             String filename { get; }  
             Int64 recording_type { get; }  
             Int64 recording_group { get; }  
             DateTime manual_start_time { get; }  
             DateTime manual_end_time { get; }  
             Int64 manual_channel_oid { get; }  
             Int64 quality_level { get; }  
             Int64 pre_pad_minutes { get; }  
             Int64 post_pad_minutes { get; }  
             Int32 priority { get; }  
             String conversion_profile { get; }  
         }  
   
53          private static class BaseDatabaseDefinition<T>          private static class BaseDatabaseDefinition<T>
54          {          {
55              public static void CreateDefault(T instance)              public static void CreateDefault(T instance)
# Line 129  namespace GBPVRProgramDatabaseFixer Line 85  namespace GBPVRProgramDatabaseFixer
85                      throw ex;                      throw ex;
86                  }                  }
87              }              }
88                public static void Create(T source, ref T destination)
89                {
90                    Type t = source.GetType();
91                    var props = t.GetProperties();
92                    foreach (var prop in props)
93                    {
94                        try
95                        {
96                            object value = prop.GetValue(source, null);
97                            prop.SetValue(destination, value, null);
98                        }
99                        catch (Exception ex)
100                        {
101                            throw ex;
102                        }
103                    }
104                }
105              public static void Create(ref T instance, SQLiteDataReader r, int index)              public static void Create(ref T instance, SQLiteDataReader r, int index)
106              {              {
107                  string field_name = r.GetName(index);                  string field_name = r.GetName(index);
# Line 172  namespace GBPVRProgramDatabaseFixer Line 145  namespace GBPVRProgramDatabaseFixer
145    
146              }              }
147          }          }
148            #endregion
149            public interface ICHANNEL : ICloneable<ICHANNEL>
150            {
151                Int64 oid { get; }
152                String name { get; }
153                String channelID { get; }
154                Int64 channel_number { get; }
155                String favourite_channel { get; }
156                String display_name { get; }
157            }
158            private class CHANNEL : ICHANNEL, ICloneable<CHANNEL>
159            {
160                public CHANNEL()
161                {
162                    BaseDatabaseDefinition<CHANNEL>.CreateDefault(this);
163                }
164                //public RECORDING_SCHEDULE(SQLiteDataReader r, int index) { BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(this, r, index); }
165    
166                public static void Create(ref CHANNEL instance, SQLiteDataReader r, int index)
167                {
168                    BaseDatabaseDefinition<CHANNEL>.Create(ref instance, r, index);
169                }
170                #region ICHANNEL members
171                public Int64 oid { get; set; }
172                public String name { get; set; }
173                public String channelID { get; set; }
174                public Int64 channel_number { get; set; }
175                public String favourite_channel { get; set; }
176                public String display_name { get; set; }
177                #endregion
178    
179                ICHANNEL ICloneable<ICHANNEL>.Clone()
180                {
181                    return Clone();
182                }
183                public CHANNEL Clone()
184                {
185                    CHANNEL p = new CHANNEL();
186                    BaseDatabaseDefinition<CHANNEL>.Create(this, ref p);
187                    return p;
188                }
189            }
190            public interface IRECORDING_SCHEDULE : ICloneable<IRECORDING_SCHEDULE>
191            {
192                Int64 oid { get; }
193                Int64 programme_oid { get; }
194                Int64 capture_source_oid { get; }
195                Int16 status { get; }
196                String filename { get; }
197                Int64 recording_type { get; }
198                Int64 recording_group { get; }
199                DateTime manual_start_time { get; }
200                DateTime manual_end_time { get; }
201                Int64 manual_channel_oid { get; }
202                Int64 quality_level { get; }
203                Int64 pre_pad_minutes { get; }
204                Int64 post_pad_minutes { get; }
205                Int32 priority { get; }
206                String conversion_profile { get; }
207            }
208    
209    
210          private class RECORDING_SCHEDULE : IRECORDING_SCHEDULE  
211            private class RECORDING_SCHEDULE : IRECORDING_SCHEDULE, ICloneable<RECORDING_SCHEDULE>
212          {          {
213              public RECORDING_SCHEDULE()              public RECORDING_SCHEDULE()
214              {              {
# Line 185  namespace GBPVRProgramDatabaseFixer Line 220  namespace GBPVRProgramDatabaseFixer
220              {              {
221                  BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(ref instance, r, index);                  BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(ref instance, r, index);
222              }              }
223                IRECORDING_SCHEDULE ICloneable<IRECORDING_SCHEDULE>.Clone()
224                {
225                    return Clone();
226                }
227                public RECORDING_SCHEDULE Clone()
228                {
229                    RECORDING_SCHEDULE p = new RECORDING_SCHEDULE();
230                    BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(this, ref p);
231                    return p;
232                }
233              #region IRECORDING_SCHEDULE members              #region IRECORDING_SCHEDULE members
234              public Int64 oid { get; set; }              public Int64 oid { get; set; }
235              public Int64 programme_oid { get; set; }              public Int64 programme_oid { get; set; }
# Line 203  namespace GBPVRProgramDatabaseFixer Line 247  namespace GBPVRProgramDatabaseFixer
247              public Int32 priority { get; set; }              public Int32 priority { get; set; }
248              public String conversion_profile { get; set; }              public String conversion_profile { get; set; }
249              #endregion              #endregion
250    
251                
252          }          }
253    
254          public interface IPROGRAMME : IEquatable<IPROGRAMME>          public interface IPROGRAMME : IEquatable<IPROGRAMME>, ICloneable<IPROGRAMME>
255          {          {
256              Int64 oid { get; set; }              Int64 oid { get; set; }
257              String name { get; set; }              String name { get; set; }
# Line 220  namespace GBPVRProgramDatabaseFixer Line 266  namespace GBPVRProgramDatabaseFixer
266              string ToString();              string ToString();
267              IProgramDefinition AsXMLTVProgramDefinition(ISQLLITE sqllite);              IProgramDefinition AsXMLTVProgramDefinition(ISQLLITE sqllite);
268          }          }
269          private class PROGRAMME : IPROGRAMME          private class PROGRAMME : IPROGRAMME, ICloneable<PROGRAMME>
270          {          {
271              
272                IPROGRAMME ICloneable<IPROGRAMME>.Clone()
273                {
274                    return Clone();
275                }
276                public PROGRAMME Clone()
277                {
278                    PROGRAMME p = new PROGRAMME();
279                    BaseDatabaseDefinition<PROGRAMME>.Create(this, ref p);
280                    return p;
281                }
282              public PROGRAMME()              public PROGRAMME()
283              {              {
284                  BaseDatabaseDefinition<PROGRAMME>.CreateDefault(this);                  BaseDatabaseDefinition<PROGRAMME>.CreateDefault(this);
# Line 292  namespace GBPVRProgramDatabaseFixer Line 349  namespace GBPVRProgramDatabaseFixer
349              {              {
350                  return this.ToString().GetHashCode();                  return this.ToString().GetHashCode();
351              }              }
352    
353    
354    
355    
356    
357    
358    
359              
360          }          }
361          #endregion          #endregion
362          private static class TABLES          private static class TABLES
# Line 347  namespace GBPVRProgramDatabaseFixer Line 412  namespace GBPVRProgramDatabaseFixer
412              return range;              return range;
413          }          }
414    
415          public List<SQLLITE.IPROGRAMME> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> source_invalid)          public List<IOldNewProgram> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> source_invalid)
416          {          {
417              source_invalid = new List<IPROGRAMME>();              source_invalid = new List<IPROGRAMME>();
418              List<IPROGRAMME> source_valid = new List<IPROGRAMME>();              List<IOldNewProgram> source_valid = new List<IOldNewProgram>();
419              gbpvr_programs = gbpvr_programs.OrderBy(s => s.start_time).ToList();              gbpvr_programs = gbpvr_programs.OrderBy(s => s.start_time).ToList();
420              xmltv_programs = xmltv_programs.OrderBy(s => DateTime.Parse(s.Start)).ToList();              xmltv_programs = xmltv_programs.OrderBy(s => DateTime.Parse(s.Start)).ToList();
421              gbpvr_programs.TrimExcess();              gbpvr_programs.TrimExcess();
# Line 377  namespace GBPVRProgramDatabaseFixer Line 442  namespace GBPVRProgramDatabaseFixer
442                      if (!xmltv_entry.Equals(program_xmltv_entry))                      if (!xmltv_entry.Equals(program_xmltv_entry))
443                      {                      {
444                          // data is different                          // data is different
445                          var updated_program = program;                          var updated_program = program.Clone();
446    
447                          if (program_xmltv_entry.Title != xmltv_entry.Title)                          if (program_xmltv_entry.Title != xmltv_entry.Title)
448                          {                          {
# Line 411  namespace GBPVRProgramDatabaseFixer Line 476  namespace GBPVRProgramDatabaseFixer
476                              throw new Exception(string.Format("Program oid '{0}' was not properly updated.", updated_program.oid));                              throw new Exception(string.Format("Program oid '{0}' was not properly updated.", updated_program.oid));
477                          }                          }
478                          //source_valid.Add(new OldNewProgram(program, updated_program));                          //source_valid.Add(new OldNewProgram(program, updated_program));
479                          source_valid.Add(updated_program);                          source_valid.Add(new OldNewProgram(program, updated_program));
480                      }                      }
481                      else                      else
482                      {                      {
483                          // data is the same                          // data is the same
484                          //source_valid.Add(new OldNewProgram(program, program));                          //source_valid.Add(new OldNewProgram(program, program));
485                          source_valid.Add(program);                          source_valid.Add(new OldNewProgram(program));
486                      }                      }
487                  }                  }
488                  index++;                  index++;
# Line 823  namespace GBPVRProgramDatabaseFixer Line 888  namespace GBPVRProgramDatabaseFixer
888    
889          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)
890          {                      {            
891              //gLog.Info.WriteLine("Removing {0} gbpvr programs.", programs.Count);              gLog.Info.WriteLine("Removing {0} gbpvr programs.", programs.Count);
             //double total = programs.Count;  
             //double index = 0;  
             //double progress = 0;  
             //Stopwatch st = new Stopwatch();  
             //st.Start();  
             //foreach (var program in programs)  
             //{  
             //    progress = 100.0 * (index / total);  
             //    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing GBPVR Program ({0:00}%) oid='{1}'", (int)progress, program.oid)));  
             //    if (!RemoveProgramDatabaseEntry(program))  
             //    {  
             //        gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);  
             //    }  
             //    index++;  
             //}  
             ////Stopwatch st = new Stopwatch();  
             ////st.Start();  
             ////if (!RemoveAllProgramDatabaseEntries())  
             ////{  
             ////    gLog.Error.WriteLine("Failed to remove one or more program(s)");  
             ////}  
             //st.Stop();  
             //gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds", st.Elapsed.TotalSeconds);  
   
892              int ChunkSize = 1024;              int ChunkSize = 1024;
893              var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);              var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
   
894              double total = programs.Count;              double total = programs.Count;
895              double index = 0;              double index = 0;
896              double progress = 0;              double progress = 0;
# Line 863  namespace GBPVRProgramDatabaseFixer Line 903  namespace GBPVRProgramDatabaseFixer
903                  {                  {
904                      gLog.Error.WriteLine("Failed to remove one or more program(s)");                      gLog.Error.WriteLine("Failed to remove one or more program(s)");
905                  }                  }
906                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing {0} gbpvr programs ({1} of {2}) {3:00}%", p.Count(), index, total, (int)progress)));                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing old gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
907                  index += (double)p.Count();                  index += (double)p.Count();
908              }              }
909                gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing old gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
910              st1.Stop();              st1.Stop();
911              gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);              gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
912          }          }
913          public void UpdateGBPVRPrograms(List<IPROGRAMME> programs)          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)
914          {          {
915              int ChunkSize = 1024;              gLog.Info.WriteLine("Updating {0} gbpvr programs.", programs.Count);
916              var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);              int ChunkSize = 4096;
917                var ChunkList = programs.Chunk<IOldNewProgram>(ChunkSize);
918    
919              double total = programs.Count;              double total = programs.Count;
920              double index = 0;              double index = 0;
# Line 881  namespace GBPVRProgramDatabaseFixer Line 923  namespace GBPVRProgramDatabaseFixer
923              st1.Start();              st1.Start();
924              foreach (var p in ChunkList)              foreach (var p in ChunkList)
925              {              {
                 //Stopwatch st2 = new Stopwatch();  
                 //st2.Start();  
926                  progress = 100.0 * (index / total);                  progress = 100.0 * (index / total);
                 //gLog.Warn.WriteLine("Inserting {0} gbpvr programs ({1} of {2})", p.Count(), index, total);    
927                  if (!UpdateProgramEntryDatabase(p))                  if (!UpdateProgramEntryDatabase(p))
928                  {                  {
929                      gLog.Error.WriteLine("Failed to update one or more program(s)");                      gLog.Error.WriteLine("Failed to update one or more program(s)");
930                  }                  }
931                  //st2.Stop();                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
                 //gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds", st2.Elapsed.TotalSeconds);  
                 //gLog.Warn.WriteLine(System.Environment.NewLine);  
                 gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating {0} gbpvr programs ({1} of {2}) {3:00}%", p.Count(), index, total, (int)progress)));  
932                  index += (double)p.Count();                                  index += (double)p.Count();                
933              }              }
934                gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
935              st1.Stop();              st1.Stop();
936              gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);              gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
937          }          }
# Line 979  namespace GBPVRProgramDatabaseFixer Line 1016  namespace GBPVRProgramDatabaseFixer
1016              }              }
1017              return result;              return result;
1018          }          }
1019          private bool UpdateProgramEntryDatabase(IEnumerable<IPROGRAMME> list)          private bool UpdateProgramEntryDatabase(IEnumerable<IOldNewProgram> list)
1020          {          {
1021              bool result = false;              bool result = false;
1022              try              try
# Line 1088  namespace GBPVRProgramDatabaseFixer Line 1125  namespace GBPVRProgramDatabaseFixer
1125          }          }
1126          #endregion          #endregion
1127          #region Multi-Update Command Support          #region Multi-Update Command Support
1128          private string BuildGBPVRMultiUpdateCommand(IEnumerable<IPROGRAMME> list)          private string BuildGBPVRMultiUpdateCommand(IEnumerable<IOldNewProgram> list)
1129          {          {
1130              StringBuilder builder = new StringBuilder();              StringBuilder builder = new StringBuilder();
1131              /*              /*
# Line 1100  namespace GBPVRProgramDatabaseFixer Line 1137  namespace GBPVRProgramDatabaseFixer
1137              builder.AppendLine("begin transaction;");              builder.AppendLine("begin transaction;");
1138              foreach (var t in list)              foreach (var t in list)
1139              {              {
1140                  builder.AppendLine(BuildGBPVRSingleInsertCommand(t));                  if (!t.OldProgram.Equals(t.NewProgram))
1141                    {
1142                        // only update the entry if it is different
1143                        builder.AppendLine(BuildGBPVRSingleUpdateCommand(t.NewProgram));
1144                    }                
1145              }              }
1146              builder.AppendLine("end transaction;");              builder.AppendLine("end transaction;");
1147              return builder.ToString();              return builder.ToString();

Legend:
Removed from v.213  
changed lines
  Added in v.225

  ViewVC Help
Powered by ViewVC 1.1.22