/[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 221 by william, Sun Mar 17 02:23:17 2013 UTC
# Line 22  namespace GBPVRProgramDatabaseFixer Line 22  namespace GBPVRProgramDatabaseFixer
22          List<SQLLITE.IRECORDING_SCHEDULE> Recordings { get; }          List<SQLLITE.IRECORDING_SCHEDULE> Recordings { get; }
23          List<SQLLITE.ICHANNEL> Channels { get; }          List<SQLLITE.ICHANNEL> Channels { get; }
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<IOldNewProgram> 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);          void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs);
28          void UpdateGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs);          void UpdateGBPVRPrograms(List<IOldNewProgram> programs);
29    
30      }      }
31      public class SQLLITE : ISQLLITE      public class SQLLITE : ISQLLITE
32      {      {
33          private class OldNewProgram : IOldNewProgram          private class OldNewProgram : IOldNewProgram
34          {          {
35              public OldNewProgram() : this(new PROGRAMME(), new PROGRAMME()) { }              public OldNewProgram() : this(new PROGRAMME()) { }
36                public OldNewProgram(IPROGRAMME _old) : this(_old,_old) {  }
37              public OldNewProgram(IPROGRAMME _old, IPROGRAMME _new) { OldProgram = _old; NewProgram = _new; }              public OldNewProgram(IPROGRAMME _old, IPROGRAMME _new) { OldProgram = _old; NewProgram = _new; }
38    
39              public IPROGRAMME OldProgram { get; private set; }              public IPROGRAMME OldProgram { get; private set; }
# Line 45  namespace GBPVRProgramDatabaseFixer Line 46  namespace GBPVRProgramDatabaseFixer
46    
47          #region DATABASE DEFINITIONS          #region DATABASE DEFINITIONS
48    
49          public interface ICHANNEL          public interface ICHANNEL : ICloneable
50          {          {
51              Int64 oid { get; }              Int64 oid { get; }
52              String name { get; }              String name { get; }
# Line 54  namespace GBPVRProgramDatabaseFixer Line 55  namespace GBPVRProgramDatabaseFixer
55              String favourite_channel { get; }              String favourite_channel { get; }
56              String display_name { get; }              String display_name { get; }
57          }          }
58          private class CHANNEL : ICHANNEL          private class CHANNEL : ICHANNEL, ICloneable
59          {          {
60              public CHANNEL()              public CHANNEL()
61              {              {
# Line 74  namespace GBPVRProgramDatabaseFixer Line 75  namespace GBPVRProgramDatabaseFixer
75              public String favourite_channel { get; set; }              public String favourite_channel { get; set; }
76              public String display_name { get; set; }              public String display_name { get; set; }
77              #endregion              #endregion
78    
79                public object Clone()
80                {
81                    CHANNEL p = new CHANNEL();
82                    BaseDatabaseDefinition<CHANNEL>.Create(this, ref p);
83                    return p;  
84                }
85          }          }
86          public interface IRECORDING_SCHEDULE          public interface IRECORDING_SCHEDULE : ICloneable
87          {          {
88              Int64 oid { get; }              Int64 oid { get; }
89              Int64 programme_oid { get; }              Int64 programme_oid { get; }
# Line 129  namespace GBPVRProgramDatabaseFixer Line 137  namespace GBPVRProgramDatabaseFixer
137                      throw ex;                      throw ex;
138                  }                  }
139              }              }
140                public static void Create(T source, ref T destination)
141                {
142                    Type t = source.GetType();
143                    var props = t.GetProperties();
144                    foreach (var prop in props)
145                    {
146                        try
147                        {
148                            object value = prop.GetValue(source, null);
149                            prop.SetValue(destination, value, null);
150                        }
151                        catch (Exception ex)
152                        {
153                            throw ex;
154                        }
155                    }
156                }
157              public static void Create(ref T instance, SQLiteDataReader r, int index)              public static void Create(ref T instance, SQLiteDataReader r, int index)
158              {              {
159                  string field_name = r.GetName(index);                  string field_name = r.GetName(index);
# Line 173  namespace GBPVRProgramDatabaseFixer Line 198  namespace GBPVRProgramDatabaseFixer
198              }              }
199          }          }
200    
201          private class RECORDING_SCHEDULE : IRECORDING_SCHEDULE          private class RECORDING_SCHEDULE : IRECORDING_SCHEDULE, ICloneable
202          {          {
203              public RECORDING_SCHEDULE()              public RECORDING_SCHEDULE()
204              {              {
# Line 185  namespace GBPVRProgramDatabaseFixer Line 210  namespace GBPVRProgramDatabaseFixer
210              {              {
211                  BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(ref instance, r, index);                  BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(ref instance, r, index);
212              }              }
213                public object Clone()
214                {
215                    RECORDING_SCHEDULE p = new RECORDING_SCHEDULE();
216                    BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(this, ref p);
217                    return p;  
218                }
219              #region IRECORDING_SCHEDULE members              #region IRECORDING_SCHEDULE members
220              public Int64 oid { get; set; }              public Int64 oid { get; set; }
221              public Int64 programme_oid { get; set; }              public Int64 programme_oid { get; set; }
# Line 203  namespace GBPVRProgramDatabaseFixer Line 233  namespace GBPVRProgramDatabaseFixer
233              public Int32 priority { get; set; }              public Int32 priority { get; set; }
234              public String conversion_profile { get; set; }              public String conversion_profile { get; set; }
235              #endregion              #endregion
236    
237                
238          }          }
239    
240          public interface IPROGRAMME : IEquatable<IPROGRAMME>          public interface IPROGRAMME : IEquatable<IPROGRAMME>, ICloneable
241          {          {
242              Int64 oid { get; set; }              Int64 oid { get; set; }
243              String name { get; set; }              String name { get; set; }
# Line 220  namespace GBPVRProgramDatabaseFixer Line 252  namespace GBPVRProgramDatabaseFixer
252              string ToString();              string ToString();
253              IProgramDefinition AsXMLTVProgramDefinition(ISQLLITE sqllite);              IProgramDefinition AsXMLTVProgramDefinition(ISQLLITE sqllite);
254          }          }
255          private class PROGRAMME : IPROGRAMME          private class PROGRAMME : IPROGRAMME, ICloneable
256          {          {
257    
258                public object Clone()
259                {
260                    PROGRAMME p = new PROGRAMME();
261                    BaseDatabaseDefinition<PROGRAMME>.Create(this, ref p);
262                    return p;  
263                }
264    
265              public PROGRAMME()              public PROGRAMME()
266              {              {
267                  BaseDatabaseDefinition<PROGRAMME>.CreateDefault(this);                  BaseDatabaseDefinition<PROGRAMME>.CreateDefault(this);
# Line 292  namespace GBPVRProgramDatabaseFixer Line 332  namespace GBPVRProgramDatabaseFixer
332              {              {
333                  return this.ToString().GetHashCode();                  return this.ToString().GetHashCode();
334              }              }
335    
336                
337          }          }
338          #endregion          #endregion
339          private static class TABLES          private static class TABLES
# Line 347  namespace GBPVRProgramDatabaseFixer Line 389  namespace GBPVRProgramDatabaseFixer
389              return range;              return range;
390          }          }
391    
392          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)
393          {          {
394              source_invalid = new List<IPROGRAMME>();              source_invalid = new List<IPROGRAMME>();
395              List<IPROGRAMME> source_valid = new List<IPROGRAMME>();              List<IOldNewProgram> source_valid = new List<IOldNewProgram>();
396              gbpvr_programs = gbpvr_programs.OrderBy(s => s.start_time).ToList();              gbpvr_programs = gbpvr_programs.OrderBy(s => s.start_time).ToList();
397              xmltv_programs = xmltv_programs.OrderBy(s => DateTime.Parse(s.Start)).ToList();              xmltv_programs = xmltv_programs.OrderBy(s => DateTime.Parse(s.Start)).ToList();
398              gbpvr_programs.TrimExcess();              gbpvr_programs.TrimExcess();
# Line 376  namespace GBPVRProgramDatabaseFixer Line 418  namespace GBPVRProgramDatabaseFixer
418                      // check if the xmltv entry has different data from the current program                      // check if the xmltv entry has different data from the current program
419                      if (!xmltv_entry.Equals(program_xmltv_entry))                      if (!xmltv_entry.Equals(program_xmltv_entry))
420                      {                      {
421                          // data is different                          // data is different                        
422                          var updated_program = program;                          var updated_program = (IPROGRAMME)program.Clone();
423    
424                          if (program_xmltv_entry.Title != xmltv_entry.Title)                          if (program_xmltv_entry.Title != xmltv_entry.Title)
425                          {                          {
# Line 411  namespace GBPVRProgramDatabaseFixer Line 453  namespace GBPVRProgramDatabaseFixer
453                              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));
454                          }                          }
455                          //source_valid.Add(new OldNewProgram(program, updated_program));                          //source_valid.Add(new OldNewProgram(program, updated_program));
456                          source_valid.Add(updated_program);                          source_valid.Add(new OldNewProgram(program, updated_program));
457                      }                      }
458                      else                      else
459                      {                      {
460                          // data is the same                          // data is the same
461                          //source_valid.Add(new OldNewProgram(program, program));                          //source_valid.Add(new OldNewProgram(program, program));
462                          source_valid.Add(program);                          source_valid.Add(new OldNewProgram(program));
463                      }                      }
464                  }                  }
465                  index++;                  index++;
# Line 823  namespace GBPVRProgramDatabaseFixer Line 865  namespace GBPVRProgramDatabaseFixer
865    
866          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)
867          {                      {            
868              //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);  
   
869              int ChunkSize = 1024;              int ChunkSize = 1024;
870              var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);              var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
   
871              double total = programs.Count;              double total = programs.Count;
872              double index = 0;              double index = 0;
873              double progress = 0;              double progress = 0;
# Line 863  namespace GBPVRProgramDatabaseFixer Line 880  namespace GBPVRProgramDatabaseFixer
880                  {                  {
881                      gLog.Error.WriteLine("Failed to remove one or more program(s)");                      gLog.Error.WriteLine("Failed to remove one or more program(s)");
882                  }                  }
883                  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)));
884                  index += (double)p.Count();                  index += (double)p.Count();
885              }              }
886                gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing old gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
887              st1.Stop();              st1.Stop();
888              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);
889          }          }
890          public void UpdateGBPVRPrograms(List<IPROGRAMME> programs)          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)
891          {          {
892              int ChunkSize = 1024;              gLog.Info.WriteLine("Updating {0} gbpvr programs.", programs.Count);
893              var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);              int ChunkSize = 1;
894                var ChunkList = programs.Chunk<IOldNewProgram>(ChunkSize);
895    
896              double total = programs.Count;              double total = programs.Count;
897              double index = 0;              double index = 0;
# Line 881  namespace GBPVRProgramDatabaseFixer Line 900  namespace GBPVRProgramDatabaseFixer
900              st1.Start();              st1.Start();
901              foreach (var p in ChunkList)              foreach (var p in ChunkList)
902              {              {
                 //Stopwatch st2 = new Stopwatch();  
                 //st2.Start();  
903                  progress = 100.0 * (index / total);                  progress = 100.0 * (index / total);
                 //gLog.Warn.WriteLine("Inserting {0} gbpvr programs ({1} of {2})", p.Count(), index, total);    
904                  if (!UpdateProgramEntryDatabase(p))                  if (!UpdateProgramEntryDatabase(p))
905                  {                  {
906                      gLog.Error.WriteLine("Failed to update one or more program(s)");                      gLog.Error.WriteLine("Failed to update one or more program(s)");
907                  }                  }
908                  //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)));  
909                  index += (double)p.Count();                                  index += (double)p.Count();                
910              }              }
911                gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
912              st1.Stop();              st1.Stop();
913              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);
914          }          }
# Line 979  namespace GBPVRProgramDatabaseFixer Line 993  namespace GBPVRProgramDatabaseFixer
993              }              }
994              return result;              return result;
995          }          }
996          private bool UpdateProgramEntryDatabase(IEnumerable<IPROGRAMME> list)          private bool UpdateProgramEntryDatabase(IEnumerable<IOldNewProgram> list)
997          {          {
998              bool result = false;              bool result = false;
999              try              try
# Line 1088  namespace GBPVRProgramDatabaseFixer Line 1102  namespace GBPVRProgramDatabaseFixer
1102          }          }
1103          #endregion          #endregion
1104          #region Multi-Update Command Support          #region Multi-Update Command Support
1105          private string BuildGBPVRMultiUpdateCommand(IEnumerable<IPROGRAMME> list)          private string BuildGBPVRMultiUpdateCommand(IEnumerable<IOldNewProgram> list)
1106          {          {
1107              StringBuilder builder = new StringBuilder();              StringBuilder builder = new StringBuilder();
1108              /*              /*
# Line 1100  namespace GBPVRProgramDatabaseFixer Line 1114  namespace GBPVRProgramDatabaseFixer
1114              builder.AppendLine("begin transaction;");              builder.AppendLine("begin transaction;");
1115              foreach (var t in list)              foreach (var t in list)
1116              {              {
1117                  builder.AppendLine(BuildGBPVRSingleInsertCommand(t));                  if (!t.OldProgram.Equals(t.NewProgram))
1118                    {
1119                        // only update the entry if it is different
1120                        builder.AppendLine(BuildGBPVRSingleUpdateCommand(t.NewProgram));
1121                    }                
1122              }              }
1123              builder.AppendLine("end transaction;");              builder.AppendLine("end transaction;");
1124              return builder.ToString();              return builder.ToString();

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

  ViewVC Help
Powered by ViewVC 1.1.22