/[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 228 by william, Sun Mar 17 04:02:57 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 377  namespace GBPVRProgramDatabaseFixer Line 439  namespace GBPVRProgramDatabaseFixer
439                      if (!xmltv_entry.Equals(program_xmltv_entry))                      if (!xmltv_entry.Equals(program_xmltv_entry))
440                      {                      {
441                          // data is different                          // data is different
442                          var updated_program = program;                          var updated_program = program.Clone();
443    
444                          if (program_xmltv_entry.Title != xmltv_entry.Title)                          if (program_xmltv_entry.Title != xmltv_entry.Title)
445                          {                          {
# Line 405  namespace GBPVRProgramDatabaseFixer Line 467  namespace GBPVRProgramDatabaseFixer
467                              updated_program.description = xmltv_entry.Description;                              updated_program.description = xmltv_entry.Description;
468                          }                          }
469    
470                            if(program_xmltv_entry.Rating != xmltv_entry.Rating)
471                            {
472                                gLog.Verbose.Warn.WriteLine("    Program oid: '{0}' - replacing rating", updated_program.oid);
473                                updated_program.rating = xmltv_entry.Rating;
474                            }
475    
476                          var updated_xmltv_entry = updated_program.AsXMLTVProgramDefinition(this);                          var updated_xmltv_entry = updated_program.AsXMLTVProgramDefinition(this);
477                          if (!xmltv_entry.Equals(updated_xmltv_entry))                          if (!xmltv_entry.Equals(updated_xmltv_entry))
478                          {                          {
479                              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));
480                          }                          }
481                            //source_valid.Add(new OldNewProgram(program, updated_program));
482                          source_valid.Add(new OldNewProgram(program, updated_program));                          source_valid.Add(new OldNewProgram(program, updated_program));
483                      }                      }
484                      else                      else
485                      {                      {
486                          // data is the same                          // data is the same
487                          source_valid.Add(new OldNewProgram(program, program));                          //source_valid.Add(new OldNewProgram(program, program));
488                            source_valid.Add(new OldNewProgram(program));
489                      }                      }
490                  }                  }
491                  index++;                  index++;
492              }              }
493                gLog.Info.WriteLine("Total XMLTV Programs: 0x{0:x8}", xmltv_programs.Count);
494                gLog.Info.WriteLine("Total Valid GB-PVR Programs: 0x{0:x8}", source_valid.Count);
495                gLog.Info.WriteLine("Total Invalid GB-PVR Programs: 0x{0:x8}", source_invalid.Count);
496                gLog.Info.WriteLine("Total GB-PVR Programs (Valid+Invalid): 0x{0:x8} == 0x{1:x8}", source_valid.Count + source_invalid.Count, gbpvr_programs.Count);
497              #region old-code              #region old-code
498              //List<OldNewProgram> source_update = new List<OldNewProgram>();              //List<OldNewProgram> source_update = new List<OldNewProgram>();
499              ////if (range == null)              ////if (range == null)
# Line 653  namespace GBPVRProgramDatabaseFixer Line 726  namespace GBPVRProgramDatabaseFixer
726                  gLog.Info.WriteLine("\tDestination: {0}", backup_file);                  gLog.Info.WriteLine("\tDestination: {0}", backup_file);
727    
728                  System.IO.File.Copy(this.Database, backup_file);                  System.IO.File.Copy(this.Database, backup_file);
729                    DATABASE_BACKUP_FILE = backup_file;
730                  return true;                  return true;
731              }              }
732              catch (Exception ex)              catch (Exception ex)
# Line 816  namespace GBPVRProgramDatabaseFixer Line 890  namespace GBPVRProgramDatabaseFixer
890          }          }
891    
892          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)
893          {          {            
894              gLog.Info.WriteLine("Removing all gbpvr programs.");              gLog.Info.WriteLine("Removing {0} gbpvr programs.", programs.Count);
895              //double total = programs.Count;              int ChunkSize = 1024;
896              //double index = 0;              var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
897              //double progress = 0;              double total = programs.Count;
898              //foreach (var program in programs)              double index = 0;
899              //{              double progress = 0;
900              //    progress = 100.0 * (index / total);              Stopwatch st1 = new Stopwatch();
901              //    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing GBPVR Programs: {0:00}%", (int)progress)));              st1.Start();
902              //    if (!RemoveProgramDatabaseEntry(program))              foreach (var p in ChunkList)
903              //    {              {
904              //        gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);                  progress = 100.0 * (index / total);
905              //    }                  if (!RemoveProgramDatabaseEntry(p))
906              //    index++;                  {
907              //}                      gLog.Error.WriteLine("Failed to remove one or more program(s)");
908                if (!RemoveAllProgramDatabaseEntries())                  }
909                {                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing old gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
910                    gLog.Error.WriteLine("Failed to remove one or more program entries");                  index += (double)p.Count();
911                }              }
912                gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing old gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
913                st1.Stop();
914                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
915          }          }
916          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)
917          {          {
918              gLog.Info.WriteLine("Inserting {0} gbpvr programs.", programs.Count);              gLog.Info.WriteLine("Updating {0} gbpvr programs.", programs.Count);
919                int ChunkSize = 4096;
920                var ChunkList = programs.Chunk<IOldNewProgram>(ChunkSize);
921    
922              double total = programs.Count;              double total = programs.Count;
923              double index = 0;              double index = 0;
924              double progress = 0;              double progress = 0;
925              foreach (var program in programs)              Stopwatch st1 = new Stopwatch();
926                st1.Start();
927                foreach (var p in ChunkList)
928              {              {
929                  progress = 100.0 * (index / total);                  progress = 100.0 * (index / total);
930                  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  
931                  {                  {
932                      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);  
                     }  
933                  }                  }
934                  index++;                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
935                    index += (double)p.Count();                
936              }              }
937                gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
938                st1.Stop();
939                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
940          }          }
941    
942          private bool RemoveAllProgramDatabaseEntries()          private bool RemoveAllProgramDatabaseEntries()
# Line 901  namespace GBPVRProgramDatabaseFixer Line 978  namespace GBPVRProgramDatabaseFixer
978              }              }
979              return result;              return result;
980          }          }
981          private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)          private bool RemoveProgramDatabaseEntry(IEnumerable<IPROGRAMME> list)
982          {          {
983              bool result = false;              bool result = false;
984              try              try
# Line 910  namespace GBPVRProgramDatabaseFixer Line 987  namespace GBPVRProgramDatabaseFixer
987                  {                  {
988                      try                      try
989                      {                      {
990                          //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);
991                          con.Open();                          con.Open();
992                          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);
993                            string command_text = string.Empty;
994                            command_text = BuildGBPVRMultiDeleteCommand(list);
995                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
996                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
997                          {                          {
                             cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));  
998                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
999                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1000                          }                          }
1001    
1002                          result = true;                          result = true;
1003                      }                      }
1004                      catch (SQLiteException ex)                      catch (SQLiteException ex)
# Line 940  namespace GBPVRProgramDatabaseFixer Line 1019  namespace GBPVRProgramDatabaseFixer
1019              }              }
1020              return result;              return result;
1021          }          }
1022          private bool InsertProgramDatabaseEntry(IPROGRAMME new_program)          private bool UpdateProgramEntryDatabase(IEnumerable<IOldNewProgram> list)
1023          {          {
1024              bool result = false;              bool result = false;
1025              try              try
# Line 953  namespace GBPVRProgramDatabaseFixer Line 1032  namespace GBPVRProgramDatabaseFixer
1032                          con.Open();                          con.Open();
1033                          //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);
1034                          string command_text = string.Empty;                          string command_text = string.Empty;
1035                          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();  
1036                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
1037                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
1038                          {                          {
                             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));  
1039                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
1040                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1041                          }                          }
# Line 1004  namespace GBPVRProgramDatabaseFixer Line 1060  namespace GBPVRProgramDatabaseFixer
1060              }              }
1061              return result;              return result;
1062          }          }
1063          private bool UpdateProgramDatabaseEntry(IPROGRAMME new_program)          private bool InsertProgramEntryDatabase(IEnumerable<IPROGRAMME> list)
1064          {          {
1065              bool result = false;              bool result = false;
1066              try              try
# Line 1017  namespace GBPVRProgramDatabaseFixer Line 1073  namespace GBPVRProgramDatabaseFixer
1073                          con.Open();                          con.Open();
1074                          //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);
1075                          string command_text = string.Empty;                          string command_text = string.Empty;
1076                          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();  
1077                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
1078                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
1079                          {                          {                          
                             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));  
1080                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
1081                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1082                          }                          }
# Line 1066  namespace GBPVRProgramDatabaseFixer Line 1101  namespace GBPVRProgramDatabaseFixer
1101              }              }
1102              return result;              return result;
1103          }          }
1104    
1105            #region Multi-Delete Command Support
1106            private string BuildGBPVRMultiDeleteCommand(IEnumerable<IPROGRAMME> list)
1107            {
1108                StringBuilder builder = new StringBuilder();
1109                /*
1110                    insert into table1 (field1,field2) values (value1,value2);
1111                    insert into table1 (field1,field2) values (value1,value2);
1112                    insert into table1 (field1,field2) values (value1,value2);
1113                    insert into table1 (field1,field2) values (value1,value2)
1114                 */
1115                builder.AppendLine("begin transaction;");
1116                foreach (var t in list)
1117                {
1118                    builder.AppendLine(BuildGBPVRSingleDeleteCommand(t));
1119                }
1120                builder.AppendLine("end transaction;");
1121                return builder.ToString();
1122            }
1123            private string BuildGBPVRSingleDeleteCommand(IPROGRAMME program)
1124            {
1125                StringBuilder builder = new StringBuilder();
1126                builder.AppendFormat("delete from {0} where oid={1};", TABLES.PROGRAMME, program.oid);
1127                return builder.ToString();
1128            }
1129            #endregion
1130            #region Multi-Update Command Support
1131            private string BuildGBPVRMultiUpdateCommand(IEnumerable<IOldNewProgram> list)
1132            {
1133                StringBuilder builder = new StringBuilder();
1134                /*
1135                    insert into table1 (field1,field2) values (value1,value2);
1136                    insert into table1 (field1,field2) values (value1,value2);
1137                    insert into table1 (field1,field2) values (value1,value2);
1138                    insert into table1 (field1,field2) values (value1,value2)
1139                 */
1140                builder.AppendLine("begin transaction;");
1141                foreach (var t in list)
1142                {
1143                    if (!t.OldProgram.Equals(t.NewProgram))
1144                    {
1145                        // only update the entry if it is different
1146                        builder.AppendLine(BuildGBPVRSingleUpdateCommand(t.NewProgram));
1147                    }                
1148                }
1149                builder.AppendLine("end transaction;");
1150                return builder.ToString();
1151            }
1152            private string BuildGBPVRSingleUpdateCommand(IPROGRAMME program)
1153            {
1154                StringBuilder builder = new StringBuilder();
1155                builder.AppendFormat("update {0} SET ", TABLES.PROGRAMME);
1156                builder.AppendFormat("name=\"{0}\", ", program.name);
1157                builder.AppendFormat("sub_title=\"{0}\", ", program.sub_title);
1158                builder.AppendFormat("description=\"{0}\", ", program.description);
1159                builder.AppendFormat("start_time='{0}', ", program.start_time.ToString("yyyy-MM-dd HH:mm:ss.fffffff"));
1160                builder.AppendFormat("end_time='{0}', ", program.end_time.ToString("yyyy-MM-dd HH:mm:ss.fffffff"));
1161                builder.AppendFormat("channel_oid={0}, ", program.channel_oid);
1162                builder.AppendFormat("unique_identifier=\"{0}\", ", program.unique_identifier);
1163                builder.AppendFormat("rating=\"{0}\" ", program.rating);
1164                builder.AppendFormat("where oid={0};", program.oid);
1165                return builder.ToString();
1166            }
1167            #endregion
1168            #region Multi-Insert Command Support
1169            private string BuildGBPVRMultiInsertCommand(IEnumerable<IPROGRAMME> list)
1170            {
1171                StringBuilder builder = new StringBuilder();
1172                /*
1173                    insert into table1 (field1,field2) values (value1,value2);
1174                    insert into table1 (field1,field2) values (value1,value2);
1175                    insert into table1 (field1,field2) values (value1,value2);
1176                    insert into table1 (field1,field2) values (value1,value2)
1177                 */
1178                builder.AppendLine("begin transaction;");
1179                foreach (var t in list)
1180                {
1181                    builder.AppendLine(BuildGBPVRSingleInsertCommand(t));
1182                }
1183                builder.AppendLine("end transaction;");
1184                return builder.ToString();
1185            }
1186            
1187            private string BuildGBPVRSingleInsertCommand(IPROGRAMME program)
1188            {
1189                StringBuilder builder = new StringBuilder();
1190                builder.AppendFormat("insert into {0} (oid,name,sub_title,description,start_time,end_time,channel_oid,unique_identifier,rating) values (", TABLES.PROGRAMME);
1191                builder.AppendFormat("{0},",program.oid);
1192                builder.AppendFormat("\"{0}\",", program.name);
1193                builder.AppendFormat("\"{0}\",", program.sub_title);
1194                builder.AppendFormat("\"{0}\",", program.description);
1195                builder.AppendFormat("'{0}',", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1196                builder.AppendFormat("'{0}',", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1197                builder.AppendFormat("{0},", program.channel_oid);
1198                builder.AppendFormat("\"{0}\",", program.unique_identifier);
1199                builder.AppendFormat("\"{0}\");", program.rating);
1200                return builder.ToString();
1201            }
1202            #endregion
1203    
1204      }      }
1205  }  }

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

  ViewVC Help
Powered by ViewVC 1.1.22