/[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 185 by william, Sat Mar 16 18:55:49 2013 UTC revision 224 by william, Sun Mar 17 02:57:19 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          private class RECORDING_SCHEDULE : IRECORDING_SCHEDULE              public static void Create(ref CHANNEL instance, SQLiteDataReader r, int index)
167                {
168                    BaseDatabaseDefinition<CHANNEL>.Create(ref instance, r, index);
169                }
170                #region ICHANNEL members
171                public Int64 oid { get; set; }
172                public String name { get; set; }
173                public String channelID { get; set; }
174                public Int64 channel_number { get; set; }
175                public String favourite_channel { get; set; }
176                public String display_name { get; set; }
177                #endregion
178    
179                ICHANNEL ICloneable<ICHANNEL>.Clone()
180                {
181                    return Clone();
182                }
183                public CHANNEL Clone()
184                {
185                    CHANNEL p = new CHANNEL();
186                    BaseDatabaseDefinition<CHANNEL>.Create(this, ref p);
187                    return p;
188                }
189            }
190            public interface IRECORDING_SCHEDULE : ICloneable<IRECORDING_SCHEDULE>
191            {
192                Int64 oid { get; }
193                Int64 programme_oid { get; }
194                Int64 capture_source_oid { get; }
195                Int16 status { get; }
196                String filename { get; }
197                Int64 recording_type { get; }
198                Int64 recording_group { get; }
199                DateTime manual_start_time { get; }
200                DateTime manual_end_time { get; }
201                Int64 manual_channel_oid { get; }
202                Int64 quality_level { get; }
203                Int64 pre_pad_minutes { get; }
204                Int64 post_pad_minutes { get; }
205                Int32 priority { get; }
206                String conversion_profile { get; }
207            }
208    
209    
210    
211            private class RECORDING_SCHEDULE : IRECORDING_SCHEDULE, ICloneable<RECORDING_SCHEDULE>
212          {          {
213              public RECORDING_SCHEDULE()              public RECORDING_SCHEDULE()
214              {              {
# Line 185  namespace GBPVRProgramDatabaseFixer Line 220  namespace GBPVRProgramDatabaseFixer
220              {              {
221                  BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(ref instance, r, index);                  BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(ref instance, r, index);
222              }              }
223                IRECORDING_SCHEDULE ICloneable<IRECORDING_SCHEDULE>.Clone()
224                {
225                    return Clone();
226                }
227                public RECORDING_SCHEDULE Clone()
228                {
229                    RECORDING_SCHEDULE p = new RECORDING_SCHEDULE();
230                    BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(this, ref p);
231                    return p;
232                }
233              #region IRECORDING_SCHEDULE members              #region IRECORDING_SCHEDULE members
234              public Int64 oid { get; set; }              public Int64 oid { get; set; }
235              public Int64 programme_oid { get; set; }              public Int64 programme_oid { get; set; }
# Line 203  namespace GBPVRProgramDatabaseFixer Line 247  namespace GBPVRProgramDatabaseFixer
247              public Int32 priority { get; set; }              public Int32 priority { get; set; }
248              public String conversion_profile { get; set; }              public String conversion_profile { get; set; }
249              #endregion              #endregion
250    
251                
252          }          }
253    
254          public interface IPROGRAMME : IEquatable<IPROGRAMME>          public interface IPROGRAMME : IEquatable<IPROGRAMME>, ICloneable<IPROGRAMME>
255          {          {
256              Int64 oid { get; set; }              Int64 oid { get; set; }
257              String name { get; set; }              String name { get; set; }
# Line 220  namespace GBPVRProgramDatabaseFixer Line 266  namespace GBPVRProgramDatabaseFixer
266              string ToString();              string ToString();
267              IProgramDefinition AsXMLTVProgramDefinition(ISQLLITE sqllite);              IProgramDefinition AsXMLTVProgramDefinition(ISQLLITE sqllite);
268          }          }
269          private class PROGRAMME : IPROGRAMME          private class PROGRAMME : IPROGRAMME, ICloneable<PROGRAMME>
270          {          {
271              
272                IPROGRAMME ICloneable<IPROGRAMME>.Clone()
273                {
274                    return Clone();
275                }
276                public PROGRAMME Clone()
277                {
278                    PROGRAMME p = new PROGRAMME();
279                    BaseDatabaseDefinition<PROGRAMME>.Create(this, ref p);
280                    return p;
281                }
282              public PROGRAMME()              public PROGRAMME()
283              {              {
284                  BaseDatabaseDefinition<PROGRAMME>.CreateDefault(this);                  BaseDatabaseDefinition<PROGRAMME>.CreateDefault(this);
# Line 292  namespace GBPVRProgramDatabaseFixer Line 349  namespace GBPVRProgramDatabaseFixer
349              {              {
350                  return this.ToString().GetHashCode();                  return this.ToString().GetHashCode();
351              }              }
352    
353    
354    
355    
356    
357    
358    
359              
360          }          }
361          #endregion          #endregion
362          private static class TABLES          private static class TABLES
# Line 300  namespace GBPVRProgramDatabaseFixer Line 365  namespace GBPVRProgramDatabaseFixer
365              public const string PROGRAMME = "PROGRAMME";              public const string PROGRAMME = "PROGRAMME";
366              public const string CHANNEL = "CHANNEL";              public const string CHANNEL = "CHANNEL";
367          }          }
368            private string DATABASE_BACKUP_FILE = string.Empty;
369          //public SQLLite() { }          //public SQLLite() { }
370          protected SQLLITE(string database, EventHandler<EventArgs> OnInstanceCreated)          protected SQLLITE(string database, EventHandler<EventArgs> OnInstanceCreated)
371          {          {
# Line 376  namespace GBPVRProgramDatabaseFixer Line 441  namespace GBPVRProgramDatabaseFixer
441                      // check if the xmltv entry has different data from the current program                      // check if the xmltv entry has different data from the current program
442                      if (!xmltv_entry.Equals(program_xmltv_entry))                      if (!xmltv_entry.Equals(program_xmltv_entry))
443                      {                      {
444                          // data is different                          // data is different                        
445                          var updated_program = program;                          var updated_program = program.Clone();
446    
447                          if (program_xmltv_entry.Title != xmltv_entry.Title)                          if (program_xmltv_entry.Title != xmltv_entry.Title)
448                          {                          {
# Line 410  namespace GBPVRProgramDatabaseFixer Line 475  namespace GBPVRProgramDatabaseFixer
475                          {                          {
476                              throw new Exception(string.Format("Program oid '{0}' was not properly updated.", updated_program.oid));                              throw new Exception(string.Format("Program oid '{0}' was not properly updated.", updated_program.oid));
477                          }                          }
478                            //source_valid.Add(new OldNewProgram(program, updated_program));
479                          source_valid.Add(new OldNewProgram(program, updated_program));                          source_valid.Add(new OldNewProgram(program, updated_program));
480                      }                      }
481                      else                      else
482                      {                      {
483                          // data is the same                          // data is the same
484                          source_valid.Add(new OldNewProgram(program, program));                          //source_valid.Add(new OldNewProgram(program, program));
485                            source_valid.Add(new OldNewProgram(program));
486                      }                      }
487                  }                  }
488                  index++;                  index++;
489              }              }
490                gLog.Info.WriteLine("Total XMLTV Programs: 0x{0:x8}", xmltv_programs.Count);
491                gLog.Info.WriteLine("Total Valid GB-PVR Programs: 0x{0:x8}", source_valid.Count);
492                gLog.Info.WriteLine("Total Invalid GB-PVR Programs: 0x{0:x8}", source_invalid.Count);
493                gLog.Info.WriteLine("Total GB-PVR Programs (Valid+Invalid): 0x{0:x8} == 0x{1:x8}", source_valid.Count + source_invalid.Count, gbpvr_programs.Count);
494              #region old-code              #region old-code
495              //List<OldNewProgram> source_update = new List<OldNewProgram>();              //List<OldNewProgram> source_update = new List<OldNewProgram>();
496              ////if (range == null)              ////if (range == null)
# Line 653  namespace GBPVRProgramDatabaseFixer Line 723  namespace GBPVRProgramDatabaseFixer
723                  gLog.Info.WriteLine("\tDestination: {0}", backup_file);                  gLog.Info.WriteLine("\tDestination: {0}", backup_file);
724    
725                  System.IO.File.Copy(this.Database, backup_file);                  System.IO.File.Copy(this.Database, backup_file);
726                    DATABASE_BACKUP_FILE = backup_file;
727                  return true;                  return true;
728              }              }
729              catch (Exception ex)              catch (Exception ex)
# Line 816  namespace GBPVRProgramDatabaseFixer Line 887  namespace GBPVRProgramDatabaseFixer
887          }          }
888    
889          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)
890          {          {            
891              gLog.Info.WriteLine("Removing {0} old gbpvr programs.", programs.Count);              gLog.Info.WriteLine("Removing {0} gbpvr programs.", programs.Count);
892                int ChunkSize = 1024;
893                var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
894              double total = programs.Count;              double total = programs.Count;
895              double index = 0;              double index = 0;
896              double progress = 0;              double progress = 0;
897              foreach (var program in programs)              Stopwatch st1 = new Stopwatch();
898                st1.Start();
899                foreach (var p in ChunkList)
900              {              {
901                  progress = 100.0 * (index / total);                  progress = 100.0 * (index / total);
902                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing GBPVR Programs: {0:00}%", (int)progress)));                  if (!RemoveProgramDatabaseEntry(p))
                 if (!RemoveProgramDatabaseEntry(program))  
903                  {                  {
904                      gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);                      gLog.Error.WriteLine("Failed to remove one or more program(s)");
905                  }                  }
906                  index++;                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing old gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
907                    index += (double)p.Count();
908              }              }
909                gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing old gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
910                st1.Stop();
911                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
912          }          }
913          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)
914          {          {
915              gLog.Info.WriteLine("Updating {0} gbpvr programs.", programs.Count);              gLog.Info.WriteLine("Updating {0} gbpvr programs.", programs.Count);
916                int ChunkSize = 4096;
917                var ChunkList = programs.Chunk<IOldNewProgram>(ChunkSize);
918    
919              double total = programs.Count;              double total = programs.Count;
920              double index = 0;              double index = 0;
921              double progress = 0;              double progress = 0;
922              foreach (var program in programs)              Stopwatch st1 = new Stopwatch();
923                st1.Start();
924                foreach (var p in ChunkList)
925              {              {
926                  progress = 100.0 * (index / total);                  progress = 100.0 * (index / total);
927                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating GBPVR Programs: {0:00}%", (int)progress)));                  if (!UpdateProgramEntryDatabase(p))
                 if (program.NewProgram.Equals(program.OldProgram))  
928                  {                  {
929                      // program does not need to be updated                      gLog.Error.WriteLine("Failed to update one or more program(s)");
                     continue;  
930                  }                  }
931                  else                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
932                    index += (double)p.Count();                
933                }
934                gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
935                st1.Stop();
936                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
937            }
938    
939            private bool RemoveAllProgramDatabaseEntries()
940            {
941                bool result = false;
942                try
943                {
944                    using (SQLiteConnection con = CreateConnection())
945                  {                  {
946                      if (!UpdateProgramDatabaseEntry(program.NewProgram))                      try
947                        {
948                            //gLog.Verbose.Info.WriteLine("Removing old program with oid: '{0}'", old_program.oid);
949                            con.Open();
950                            string command_text = string.Format(@"DELETE FROM [{0}];", TABLES.PROGRAMME);
951                            //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
952                            using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
953                            {
954                                //cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));
955                                int rowsupdated = cmd.ExecuteNonQuery();
956                                //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
957                            }
958                            result = true;
959                        }
960                        catch (SQLiteException ex)
961                      {                      {
962                          gLog.Error.WriteLine("Failed to update program with oid: {0}", program.NewProgram.oid);                          gLog.Error.WriteLine(ex.ToString());
963                            result = false;
964                        }
965                        finally
966                        {
967                            con.Close();
968                      }                      }
969                  }                  }
                 index++;  
970              }              }
971                catch (Exception ex)
972                {
973                    gLog.Error.WriteLine(ex.ToString());
974                    result = false;
975                }
976                return result;
977          }          }
978            private bool RemoveProgramDatabaseEntry(IEnumerable<IPROGRAMME> list)
         private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)  
979          {          {
980              bool result = false;              bool result = false;
981              try              try
# Line 867  namespace GBPVRProgramDatabaseFixer Line 984  namespace GBPVRProgramDatabaseFixer
984                  {                  {
985                      try                      try
986                      {                      {
987                          //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);
988                          con.Open();                          con.Open();
989                          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);
990                            string command_text = string.Empty;
991                            command_text = BuildGBPVRMultiDeleteCommand(list);
992                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
993                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
994                          {                          {
                             cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));  
995                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
996                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
997                          }                          }
998    
999                          result = true;                          result = true;
1000                      }                      }
1001                      catch (SQLiteException ex)                      catch (SQLiteException ex)
# Line 897  namespace GBPVRProgramDatabaseFixer Line 1016  namespace GBPVRProgramDatabaseFixer
1016              }              }
1017              return result;              return result;
1018          }          }
1019          private bool UpdateProgramDatabaseEntry(IPROGRAMME new_program)          private bool UpdateProgramEntryDatabase(IEnumerable<IOldNewProgram> list)
1020          {          {
1021              bool result = false;              bool result = false;
1022              try              try
# Line 910  namespace GBPVRProgramDatabaseFixer Line 1029  namespace GBPVRProgramDatabaseFixer
1029                          con.Open();                          con.Open();
1030                          //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);
1031                          string command_text = string.Empty;                          string command_text = string.Empty;
1032                          StringBuilder builder = new StringBuilder();                          command_text = BuildGBPVRMultiUpdateCommand(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();  
1033                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
1034                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
1035                          {                          {
                             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));  
1036                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
1037                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1038                          }                          }
# Line 959  namespace GBPVRProgramDatabaseFixer Line 1057  namespace GBPVRProgramDatabaseFixer
1057              }              }
1058              return result;              return result;
1059          }          }
1060            private bool InsertProgramEntryDatabase(IEnumerable<IPROGRAMME> list)
1061            {
1062                bool result = false;
1063                try
1064                {
1065                    using (SQLiteConnection con = CreateConnection())
1066                    {
1067                        try
1068                        {
1069                            //gLog.Verbose.Info.WriteLine("Updating old program with oid: '{0}'", new_program.oid);
1070                            con.Open();
1071                            //string command_text = string.Format(@"UPDATE [{0}] SET [name]=@name,[sub_title]=@subtitle, WHERE [OID] = @oid", TABLES.PROGRAMME);
1072                            string command_text = string.Empty;
1073                            command_text = BuildGBPVRMultiInsertCommand(list);
1074                            //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
1075                            using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
1076                            {                          
1077                                int rowsupdated = cmd.ExecuteNonQuery();
1078                                //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1079                            }
1080    
1081                            result = true;
1082                        }
1083                        catch (SQLiteException ex)
1084                        {
1085                            gLog.Error.WriteLine(ex.ToString());
1086                            result = false;
1087                        }
1088                        finally
1089                        {
1090                            con.Close();
1091                        }
1092                    }
1093                }
1094                catch (Exception ex)
1095                {
1096                    gLog.Error.WriteLine(ex.ToString());
1097                    result = false;
1098                }
1099                return result;
1100            }
1101    
1102            #region Multi-Delete Command Support
1103            private string BuildGBPVRMultiDeleteCommand(IEnumerable<IPROGRAMME> list)
1104            {
1105                StringBuilder builder = new StringBuilder();
1106                /*
1107                    insert into table1 (field1,field2) values (value1,value2);
1108                    insert into table1 (field1,field2) values (value1,value2);
1109                    insert into table1 (field1,field2) values (value1,value2);
1110                    insert into table1 (field1,field2) values (value1,value2)
1111                 */
1112                builder.AppendLine("begin transaction;");
1113                foreach (var t in list)
1114                {
1115                    builder.AppendLine(BuildGBPVRSingleDeleteCommand(t));
1116                }
1117                builder.AppendLine("end transaction;");
1118                return builder.ToString();
1119            }
1120            private string BuildGBPVRSingleDeleteCommand(IPROGRAMME program)
1121            {
1122                StringBuilder builder = new StringBuilder();
1123                builder.AppendFormat("delete from {0} where oid={1};", TABLES.PROGRAMME, program.oid);
1124                return builder.ToString();
1125            }
1126            #endregion
1127            #region Multi-Update Command Support
1128            private string BuildGBPVRMultiUpdateCommand(IEnumerable<IOldNewProgram> list)
1129            {
1130                StringBuilder builder = new StringBuilder();
1131                /*
1132                    insert into table1 (field1,field2) values (value1,value2);
1133                    insert into table1 (field1,field2) values (value1,value2);
1134                    insert into table1 (field1,field2) values (value1,value2);
1135                    insert into table1 (field1,field2) values (value1,value2)
1136                 */
1137                builder.AppendLine("begin transaction;");
1138                foreach (var t in list)
1139                {
1140                    if (!t.OldProgram.Equals(t.NewProgram))
1141                    {
1142                        // only update the entry if it is different
1143                        builder.AppendLine(BuildGBPVRSingleUpdateCommand(t.NewProgram));
1144                    }                
1145                }
1146                builder.AppendLine("end transaction;");
1147                return builder.ToString();
1148            }
1149            private string BuildGBPVRSingleUpdateCommand(IPROGRAMME program)
1150            {
1151                StringBuilder builder = new StringBuilder();
1152                builder.AppendFormat("update {0} SET ", TABLES.PROGRAMME);
1153                builder.AppendFormat("name=\"{0}\", ", program.name);
1154                builder.AppendFormat("sub_title=\"{0}\", ", program.sub_title);
1155                builder.AppendFormat("description=\"{0}\", ", program.description);
1156                builder.AppendFormat("start_time='{0}', ", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1157                builder.AppendFormat("end_time='{0}', ", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1158                builder.AppendFormat("channel_oid={0}, ", program.channel_oid);
1159                builder.AppendFormat("unique_identifier=\"{0}\", ", program.unique_identifier);
1160                builder.AppendFormat("rating=\"{0}\" ", program.rating);
1161                builder.AppendFormat("where oid={0};", program.oid);
1162                return builder.ToString();
1163            }
1164            #endregion
1165            #region Multi-Insert Command Support
1166            private string BuildGBPVRMultiInsertCommand(IEnumerable<IPROGRAMME> list)
1167            {
1168                StringBuilder builder = new StringBuilder();
1169                /*
1170                    insert into table1 (field1,field2) values (value1,value2);
1171                    insert into table1 (field1,field2) values (value1,value2);
1172                    insert into table1 (field1,field2) values (value1,value2);
1173                    insert into table1 (field1,field2) values (value1,value2)
1174                 */
1175                builder.AppendLine("begin transaction;");
1176                foreach (var t in list)
1177                {
1178                    builder.AppendLine(BuildGBPVRSingleInsertCommand(t));
1179                }
1180                builder.AppendLine("end transaction;");
1181                return builder.ToString();
1182            }
1183            
1184            private string BuildGBPVRSingleInsertCommand(IPROGRAMME program)
1185            {
1186                StringBuilder builder = new StringBuilder();
1187                builder.AppendFormat("insert into {0} (oid,name,sub_title,description,start_time,end_time,channel_oid,unique_identifier,rating) values (", TABLES.PROGRAMME);
1188                builder.AppendFormat("{0},",program.oid);
1189                builder.AppendFormat("\"{0}\",", program.name);
1190                builder.AppendFormat("\"{0}\",", program.sub_title);
1191                builder.AppendFormat("\"{0}\",", program.description);
1192                builder.AppendFormat("'{0}',", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1193                builder.AppendFormat("'{0}',", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1194                builder.AppendFormat("{0},", program.channel_oid);
1195                builder.AppendFormat("\"{0}\",", program.unique_identifier);
1196                builder.AppendFormat("\"{0}\");", program.rating);
1197                return builder.ToString();
1198            }
1199            #endregion
1200    
1201      }      }
1202  }  }

Legend:
Removed from v.185  
changed lines
  Added in v.224

  ViewVC Help
Powered by ViewVC 1.1.22