/[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 187 by william, Sat Mar 16 19:13:18 2013 UTC revision 229 by william, Sun Mar 17 04:13:59 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 32  namespace GBPVRProgramDatabaseFixer Line 36  namespace GBPVRProgramDatabaseFixer
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          private class RECORDING_SCHEDULE : IRECORDING_SCHEDULE              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            private class RECORDING_SCHEDULE : IRECORDING_SCHEDULE, ICloneable<RECORDING_SCHEDULE>
209          {          {
210              public RECORDING_SCHEDULE()              public RECORDING_SCHEDULE()
211              {              {
# Line 185  namespace GBPVRProgramDatabaseFixer Line 217  namespace GBPVRProgramDatabaseFixer
217              {              {
218                  BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(ref instance, r, index);                  BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(ref instance, r, index);
219              }              }
220                IRECORDING_SCHEDULE ICloneable<IRECORDING_SCHEDULE>.Clone()
221                {
222                    return Clone();
223                }
224                public RECORDING_SCHEDULE Clone()
225                {
226                    RECORDING_SCHEDULE p = new RECORDING_SCHEDULE();
227                    BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(this, ref p);
228                    return p;
229                }
230              #region IRECORDING_SCHEDULE members              #region IRECORDING_SCHEDULE members
231              public Int64 oid { get; set; }              public Int64 oid { get; set; }
232              public Int64 programme_oid { get; set; }              public Int64 programme_oid { get; set; }
# Line 203  namespace GBPVRProgramDatabaseFixer Line 244  namespace GBPVRProgramDatabaseFixer
244              public Int32 priority { get; set; }              public Int32 priority { get; set; }
245              public String conversion_profile { get; set; }              public String conversion_profile { get; set; }
246              #endregion              #endregion
         }  
247    
248          public interface IPROGRAMME : IEquatable<IPROGRAMME>              
249            }
250            public interface IPROGRAMME : IEquatable<IPROGRAMME>, ICloneable<IPROGRAMME>
251          {          {
252              Int64 oid { get; set; }              Int64 oid { get; set; }
253              String name { get; set; }              String name { get; set; }
# Line 220  namespace GBPVRProgramDatabaseFixer Line 262  namespace GBPVRProgramDatabaseFixer
262              string ToString();              string ToString();
263              IProgramDefinition AsXMLTVProgramDefinition(ISQLLITE sqllite);              IProgramDefinition AsXMLTVProgramDefinition(ISQLLITE sqllite);
264          }          }
265          private class PROGRAMME : IPROGRAMME          private class PROGRAMME : IPROGRAMME, ICloneable<PROGRAMME>
266          {          {
267              
268                IPROGRAMME ICloneable<IPROGRAMME>.Clone()
269                {
270                    return Clone();
271                }
272                public PROGRAMME Clone()
273                {
274                    PROGRAMME p = new PROGRAMME();
275                    BaseDatabaseDefinition<PROGRAMME>.Create(this, ref p);
276                    return p;
277                }
278              public PROGRAMME()              public PROGRAMME()
279              {              {
280                  BaseDatabaseDefinition<PROGRAMME>.CreateDefault(this);                  BaseDatabaseDefinition<PROGRAMME>.CreateDefault(this);
# Line 255  namespace GBPVRProgramDatabaseFixer Line 308  namespace GBPVRProgramDatabaseFixer
308                  definition.Stop = this.end_time.ToDateTimeString();                  definition.Stop = this.end_time.ToDateTimeString();
309                  definition.SubTitle = this.sub_title;                  definition.SubTitle = this.sub_title;
310                  definition.Title = this.name;                  definition.Title = this.name;
311                    definition.Rating = this.rating;
312                  return definition;                  return definition;
313              }              }
314              #endregion              #endregion
# Line 292  namespace GBPVRProgramDatabaseFixer Line 346  namespace GBPVRProgramDatabaseFixer
346              {              {
347                  return this.ToString().GetHashCode();                  return this.ToString().GetHashCode();
348              }              }
349    
350    
351    
352    
353    
354    
355    
356              
357          }          }
358          #endregion          #endregion
359          private static class TABLES          private static class TABLES
# Line 300  namespace GBPVRProgramDatabaseFixer Line 362  namespace GBPVRProgramDatabaseFixer
362              public const string PROGRAMME = "PROGRAMME";              public const string PROGRAMME = "PROGRAMME";
363              public const string CHANNEL = "CHANNEL";              public const string CHANNEL = "CHANNEL";
364          }          }
365            private string DATABASE_BACKUP_FILE = string.Empty;
366          //public SQLLite() { }          //public SQLLite() { }
367          protected SQLLITE(string database, EventHandler<EventArgs> OnInstanceCreated)          protected SQLLITE(string database, EventHandler<EventArgs> OnInstanceCreated)
368          {          {
# Line 356  namespace GBPVRProgramDatabaseFixer Line 418  namespace GBPVRProgramDatabaseFixer
418              gbpvr_programs.TrimExcess();              gbpvr_programs.TrimExcess();
419              xmltv_programs.TrimExcess();              xmltv_programs.TrimExcess();
420    
421                int updated_program_count = 0;
422              double total = gbpvr_programs.Count;              double total = gbpvr_programs.Count;
423              double index = 0;              double index = 0;
424              double progress = 0;              double progress = 0;
# Line 377  namespace GBPVRProgramDatabaseFixer Line 440  namespace GBPVRProgramDatabaseFixer
440                      if (!xmltv_entry.Equals(program_xmltv_entry))                      if (!xmltv_entry.Equals(program_xmltv_entry))
441                      {                      {
442                          // data is different                          // data is different
443                          var updated_program = program;                          var updated_program = program.Clone();
444    
445                          if (program_xmltv_entry.Title != xmltv_entry.Title)                          if (program_xmltv_entry.Title != xmltv_entry.Title)
446                          {                          {
# Line 405  namespace GBPVRProgramDatabaseFixer Line 468  namespace GBPVRProgramDatabaseFixer
468                              updated_program.description = xmltv_entry.Description;                              updated_program.description = xmltv_entry.Description;
469                          }                          }
470    
471                            if(program_xmltv_entry.Rating != xmltv_entry.Rating)
472                            {
473                                gLog.Verbose.Warn.WriteLine("    Program oid: '{0}' - replacing rating", updated_program.oid);
474                                updated_program.rating = xmltv_entry.Rating;
475                            }
476    
477                          var updated_xmltv_entry = updated_program.AsXMLTVProgramDefinition(this);                          var updated_xmltv_entry = updated_program.AsXMLTVProgramDefinition(this);
478                          if (!xmltv_entry.Equals(updated_xmltv_entry))                          if (!xmltv_entry.Equals(updated_xmltv_entry))
479                          {                          {
480                              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));
481                          }                          }
482                            //source_valid.Add(new OldNewProgram(program, updated_program));
483                          source_valid.Add(new OldNewProgram(program, updated_program));                          source_valid.Add(new OldNewProgram(program, updated_program));
484                            updated_program_count++;
485                      }                      }
486                      else                      else
487                      {                      {
488                          // data is the same                          // data is the same
489                          source_valid.Add(new OldNewProgram(program, program));                          //source_valid.Add(new OldNewProgram(program, program));
490                            source_valid.Add(new OldNewProgram(program));
491                      }                      }
492                  }                  }
493                  index++;                  index++;
494              }              }
495                gLog.Info.WriteLine("Total XMLTV Programs: 0x{0:x8}", xmltv_programs.Count);
496                gLog.Info.WriteLine("Total Valid GB-PVR Programs: 0x{0:x8}", source_valid.Count);
497                gLog.Info.WriteLine("Total Invalid GB-PVR Programs: 0x{0:x8}", source_invalid.Count);
498                gLog.Info.WriteLine("Total GB-PVR Programs (Valid+Invalid): 0x{0:x8} == 0x{1:x8}", source_valid.Count + source_invalid.Count, gbpvr_programs.Count);
499                gLog.Info.WriteLine("GB-PVR Programs needing an update: 0x{0:x8}", updated_program_count);
500              #region old-code              #region old-code
501              //List<OldNewProgram> source_update = new List<OldNewProgram>();              //List<OldNewProgram> source_update = new List<OldNewProgram>();
502              ////if (range == null)              ////if (range == null)
# Line 653  namespace GBPVRProgramDatabaseFixer Line 729  namespace GBPVRProgramDatabaseFixer
729                  gLog.Info.WriteLine("\tDestination: {0}", backup_file);                  gLog.Info.WriteLine("\tDestination: {0}", backup_file);
730    
731                  System.IO.File.Copy(this.Database, backup_file);                  System.IO.File.Copy(this.Database, backup_file);
732                    DATABASE_BACKUP_FILE = backup_file;
733                  return true;                  return true;
734              }              }
735              catch (Exception ex)              catch (Exception ex)
# Line 816  namespace GBPVRProgramDatabaseFixer Line 893  namespace GBPVRProgramDatabaseFixer
893          }          }
894    
895          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)
896          {          {            
897              gLog.Info.WriteLine("Removing all gbpvr programs.");              gLog.Info.WriteLine("Removing {0} gbpvr programs.", programs.Count);
898              //double total = programs.Count;              int ChunkSize = 1024;
899              //double index = 0;              var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
900              //double progress = 0;              double total = programs.Count;
901              //foreach (var program in programs)              double index = 0;
902              //{              double progress = 0;
903              //    progress = 100.0 * (index / total);              Stopwatch st1 = new Stopwatch();
904              //    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing GBPVR Programs: {0:00}%", (int)progress)));              st1.Start();
905              //    if (!RemoveProgramDatabaseEntry(program))              foreach (var p in ChunkList)
906              //    {              {
907              //        gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);                  progress = 100.0 * (index / total);
908              //    }                  if (!RemoveProgramDatabaseEntry(p))
909              //    index++;                  {
910              //}                      gLog.Error.WriteLine("Failed to remove one or more program(s)");
911                if (!RemoveAllProgramDatabaseEntries())                  }
912                {                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing old gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
913                    gLog.Error.WriteLine("Failed to remove one or more program entries");                  index += (double)p.Count();
914                }              }
915                gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing old gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
916                st1.Stop();
917                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
918          }          }
919          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)
920          {          {
921              gLog.Info.WriteLine("Inserting {0} gbpvr programs.", programs.Count);              gLog.Info.WriteLine("Updating {0} gbpvr programs.", programs.Count);
922                int ChunkSize = 4096;
923                var ChunkList = programs.Chunk<IOldNewProgram>(ChunkSize);
924    
925              double total = programs.Count;              double total = programs.Count;
926              double index = 0;              double index = 0;
927              double progress = 0;              double progress = 0;
928              foreach (var program in programs)              Stopwatch st1 = new Stopwatch();
929                st1.Start();
930                foreach (var p in ChunkList)
931              {              {
932                  progress = 100.0 * (index / total);                  progress = 100.0 * (index / total);
933                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating/Inserting GBPVR Programs: {0:00}%", (int)progress)));                  if (!UpdateProgramEntryDatabase(p))
                 if (program.NewProgram.Equals(program.OldProgram))  
                 {  
                     // program does not need to be updated  
                     continue;  
                 }  
                 else  
934                  {                  {
935                      if (!InsertProgramDatabaseEntry(program.NewProgram))                      gLog.Error.WriteLine("Failed to update one or more program(s)");
                     {  
                         gLog.Error.WriteLine("Failed to insert program with oid: {0}", program.NewProgram.oid);  
                     }  
936                  }                  }
937                  index++;                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
938                    index += (double)p.Count();                
939              }              }
940                gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
941                st1.Stop();
942                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
943          }          }
944    
945          private bool RemoveAllProgramDatabaseEntries()          private bool RemoveAllProgramDatabaseEntries()
# Line 901  namespace GBPVRProgramDatabaseFixer Line 981  namespace GBPVRProgramDatabaseFixer
981              }              }
982              return result;              return result;
983          }          }
984          private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)          private bool RemoveProgramDatabaseEntry(IEnumerable<IPROGRAMME> list)
985          {          {
986              bool result = false;              bool result = false;
987              try              try
# Line 910  namespace GBPVRProgramDatabaseFixer Line 990  namespace GBPVRProgramDatabaseFixer
990                  {                  {
991                      try                      try
992                      {                      {
993                          //gLog.Verbose.Info.WriteLine("Removing old program with oid: '{0}'", old_program.oid);                          //gLog.Verbose.Info.WriteLine("Updating old program with oid: '{0}'", new_program.oid);
994                          con.Open();                          con.Open();
995                          string command_text = string.Format(@"DELETE FROM [{0}] WHERE [oid] = @oid;", TABLES.PROGRAMME);                          //string command_text = string.Format(@"UPDATE [{0}] SET [name]=@name,[sub_title]=@subtitle, WHERE [OID] = @oid", TABLES.PROGRAMME);
996                            string command_text = string.Empty;
997                            command_text = BuildGBPVRMultiDeleteCommand(list);
998                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
999                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
1000                          {                          {
                             cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));  
1001                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
1002                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1003                          }                          }
1004    
1005                          result = true;                          result = true;
1006                      }                      }
1007                      catch (SQLiteException ex)                      catch (SQLiteException ex)
# Line 940  namespace GBPVRProgramDatabaseFixer Line 1022  namespace GBPVRProgramDatabaseFixer
1022              }              }
1023              return result;              return result;
1024          }          }
1025          private bool InsertProgramDatabaseEntry(IPROGRAMME new_program)          private bool UpdateProgramEntryDatabase(IEnumerable<IOldNewProgram> list)
1026          {          {
1027              bool result = false;              bool result = false;
1028              try              try
# Line 953  namespace GBPVRProgramDatabaseFixer Line 1035  namespace GBPVRProgramDatabaseFixer
1035                          con.Open();                          con.Open();
1036                          //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);
1037                          string command_text = string.Empty;                          string command_text = string.Empty;
1038                          StringBuilder builder = new StringBuilder();                          command_text = BuildGBPVRMultiUpdateCommand(list);
                         builder.AppendLine(string.Format("INSERT INTO [{0}]", TABLES.PROGRAMME));  
                         builder.Append("VALUES (");  
                         builder.AppendFormat("[oid]=@oid,");  
                         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");  
                         builder.AppendFormat(");");  
                         command_text = builder.ToString();  
1039                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
1040                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
1041                          {                          {
                             cmd.Parameters.Add(new SQLiteParameter("oid", new_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));  
1042                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
1043                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1044                          }                          }
# Line 1004  namespace GBPVRProgramDatabaseFixer Line 1063  namespace GBPVRProgramDatabaseFixer
1063              }              }
1064              return result;              return result;
1065          }          }
1066          private bool UpdateProgramDatabaseEntry(IPROGRAMME new_program)          private bool InsertProgramEntryDatabase(IEnumerable<IPROGRAMME> list)
1067          {          {
1068              bool result = false;              bool result = false;
1069              try              try
# Line 1017  namespace GBPVRProgramDatabaseFixer Line 1076  namespace GBPVRProgramDatabaseFixer
1076                          con.Open();                          con.Open();
1077                          //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);
1078                          string command_text = string.Empty;                          string command_text = string.Empty;
1079                          StringBuilder builder = new StringBuilder();                          command_text = BuildGBPVRMultiInsertCommand(list);
                         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();  
1080                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
1081                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
1082                          {                          {                          
                             cmd.Parameters.Add(new SQLiteParameter("oid", new_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));  
1083                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
1084                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1085                          }                          }
# Line 1066  namespace GBPVRProgramDatabaseFixer Line 1104  namespace GBPVRProgramDatabaseFixer
1104              }              }
1105              return result;              return result;
1106          }          }
1107    
1108            #region Multi-Delete Command Support
1109            private string BuildGBPVRMultiDeleteCommand(IEnumerable<IPROGRAMME> list)
1110            {
1111                StringBuilder builder = new StringBuilder();
1112                /*
1113                    insert into table1 (field1,field2) values (value1,value2);
1114                    insert into table1 (field1,field2) values (value1,value2);
1115                    insert into table1 (field1,field2) values (value1,value2);
1116                    insert into table1 (field1,field2) values (value1,value2)
1117                 */
1118                builder.AppendLine("begin transaction;");
1119                foreach (var t in list)
1120                {
1121                    builder.AppendLine(BuildGBPVRSingleDeleteCommand(t));
1122                }
1123                builder.AppendLine("end transaction;");
1124                return builder.ToString();
1125            }
1126            private string BuildGBPVRSingleDeleteCommand(IPROGRAMME program)
1127            {
1128                StringBuilder builder = new StringBuilder();
1129                builder.AppendFormat("delete from {0} where oid={1};", TABLES.PROGRAMME, program.oid);
1130                return builder.ToString();
1131            }
1132            #endregion
1133            #region Multi-Update Command Support
1134            private string BuildGBPVRMultiUpdateCommand(IEnumerable<IOldNewProgram> list)
1135            {
1136                StringBuilder builder = new StringBuilder();
1137                /*
1138                    insert into table1 (field1,field2) values (value1,value2);
1139                    insert into table1 (field1,field2) values (value1,value2);
1140                    insert into table1 (field1,field2) values (value1,value2);
1141                    insert into table1 (field1,field2) values (value1,value2)
1142                 */
1143                builder.AppendLine("begin transaction;");
1144                foreach (var t in list)
1145                {
1146                    if (!t.OldProgram.Equals(t.NewProgram))
1147                    {
1148                        // only update the entry if it is different
1149                        builder.AppendLine(BuildGBPVRSingleUpdateCommand(t.NewProgram));
1150                    }                
1151                }
1152                builder.AppendLine("end transaction;");
1153                return builder.ToString();
1154            }
1155            private string BuildGBPVRSingleUpdateCommand(IPROGRAMME program)
1156            {
1157                StringBuilder builder = new StringBuilder();
1158                builder.AppendFormat("update {0} SET ", TABLES.PROGRAMME);
1159                builder.AppendFormat("name=\"{0}\", ", program.name);
1160                builder.AppendFormat("sub_title=\"{0}\", ", program.sub_title);
1161                builder.AppendFormat("description=\"{0}\", ", program.description);
1162                builder.AppendFormat("start_time='{0}', ", program.start_time.ToString("yyyy-MM-dd HH:mm:ss.fffffff"));
1163                builder.AppendFormat("end_time='{0}', ", program.end_time.ToString("yyyy-MM-dd HH:mm:ss.fffffff"));
1164                builder.AppendFormat("channel_oid={0}, ", program.channel_oid);
1165                builder.AppendFormat("unique_identifier=\"{0}\", ", program.unique_identifier);
1166                builder.AppendFormat("rating=\"{0}\" ", program.rating);
1167                builder.AppendFormat("where oid={0};", program.oid);
1168                return builder.ToString();
1169            }
1170            #endregion
1171            #region Multi-Insert Command Support
1172            private string BuildGBPVRMultiInsertCommand(IEnumerable<IPROGRAMME> list)
1173            {
1174                StringBuilder builder = new StringBuilder();
1175                /*
1176                    insert into table1 (field1,field2) values (value1,value2);
1177                    insert into table1 (field1,field2) values (value1,value2);
1178                    insert into table1 (field1,field2) values (value1,value2);
1179                    insert into table1 (field1,field2) values (value1,value2)
1180                 */
1181                builder.AppendLine("begin transaction;");
1182                foreach (var t in list)
1183                {
1184                    builder.AppendLine(BuildGBPVRSingleInsertCommand(t));
1185                }
1186                builder.AppendLine("end transaction;");
1187                return builder.ToString();
1188            }
1189            
1190            private string BuildGBPVRSingleInsertCommand(IPROGRAMME program)
1191            {
1192                StringBuilder builder = new StringBuilder();
1193                builder.AppendFormat("insert into {0} (oid,name,sub_title,description,start_time,end_time,channel_oid,unique_identifier,rating) values (", TABLES.PROGRAMME);
1194                builder.AppendFormat("{0},",program.oid);
1195                builder.AppendFormat("\"{0}\",", program.name);
1196                builder.AppendFormat("\"{0}\",", program.sub_title);
1197                builder.AppendFormat("\"{0}\",", program.description);
1198                builder.AppendFormat("'{0}',", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1199                builder.AppendFormat("'{0}',", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1200                builder.AppendFormat("{0},", program.channel_oid);
1201                builder.AppendFormat("\"{0}\",", program.unique_identifier);
1202                builder.AppendFormat("\"{0}\");", program.rating);
1203                return builder.ToString();
1204            }
1205            #endregion
1206    
1207      }      }
1208  }  }

Legend:
Removed from v.187  
changed lines
  Added in v.229

  ViewVC Help
Powered by ViewVC 1.1.22