/[xmltv_parser]/trunk/GBPVRProgramDatabaseFixer/SQLLITE.cs
ViewVC logotype

Diff of /trunk/GBPVRProgramDatabaseFixer/SQLLITE.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 213 by william, Sun Mar 17 01:01:10 2013 UTC revision 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 22  namespace GBPVRProgramDatabaseFixer Line 26  namespace GBPVRProgramDatabaseFixer
26          List<SQLLITE.IRECORDING_SCHEDULE> Recordings { get; }          List<SQLLITE.IRECORDING_SCHEDULE> Recordings { get; }
27          List<SQLLITE.ICHANNEL> Channels { get; }          List<SQLLITE.ICHANNEL> Channels { get; }
28          IDateTimeRange GetProgramsDateRange(List<SQLLITE.IPROGRAMME> programs);          IDateTimeRange GetProgramsDateRange(List<SQLLITE.IPROGRAMME> programs);
29          List<SQLLITE.IPROGRAMME> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> removed_programs);          List<IOldNewProgram> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> removed_programs);
30    
31          void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs);          void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs);
32          void UpdateGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs);          void UpdateGBPVRPrograms(List<IOldNewProgram> programs);
33    
34      }      }
35      public class SQLLITE : ISQLLITE      public class SQLLITE : ISQLLITE
36      {      {
37          private class OldNewProgram : IOldNewProgram          private class OldNewProgram : IOldNewProgram
38          {          {
39              public OldNewProgram() : this(new PROGRAMME(), new PROGRAMME()) { }              public OldNewProgram() : this(new PROGRAMME()) { }
40                public OldNewProgram(IPROGRAMME _old) : this(_old,_old) {  }
41              public OldNewProgram(IPROGRAMME _old, IPROGRAMME _new) { OldProgram = _old; NewProgram = _new; }              public OldNewProgram(IPROGRAMME _old, IPROGRAMME _new) { OldProgram = _old; NewProgram = _new; }
42    
43              public IPROGRAMME OldProgram { get; private set; }              public IPROGRAMME OldProgram { get; private set; }
# Line 44  namespace GBPVRProgramDatabaseFixer Line 49  namespace GBPVRProgramDatabaseFixer
49          }          }
50    
51          #region DATABASE DEFINITIONS          #region DATABASE DEFINITIONS
52            #region BaseDatabaseDefinition
         public interface ICHANNEL  
         {  
             Int64 oid { get; }  
             String name { get; }  
             String channelID { get; }  
             Int64 channel_number { get; }  
             String favourite_channel { get; }  
             String display_name { get; }  
         }  
         private class CHANNEL : ICHANNEL  
         {  
             public CHANNEL()  
             {  
                 BaseDatabaseDefinition<CHANNEL>.CreateDefault(this);  
             }  
             //public RECORDING_SCHEDULE(SQLiteDataReader r, int index) { BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(this, r, index); }  
   
             public static void Create(ref CHANNEL instance, SQLiteDataReader r, int index)  
             {  
                 BaseDatabaseDefinition<CHANNEL>.Create(ref instance, r, index);  
             }  
             #region ICHANNEL members  
             public Int64 oid { get; set; }  
             public String name { get; set; }  
             public String channelID { get; set; }  
             public Int64 channel_number { get; set; }  
             public String favourite_channel { get; set; }  
             public String display_name { get; set; }  
             #endregion  
         }  
         public interface IRECORDING_SCHEDULE  
         {  
             Int64 oid { get; }  
             Int64 programme_oid { get; }  
             Int64 capture_source_oid { get; }  
             Int16 status { get; }  
             String filename { get; }  
             Int64 recording_type { get; }  
             Int64 recording_group { get; }  
             DateTime manual_start_time { get; }  
             DateTime manual_end_time { get; }  
             Int64 manual_channel_oid { get; }  
             Int64 quality_level { get; }  
             Int64 pre_pad_minutes { get; }  
             Int64 post_pad_minutes { get; }  
             Int32 priority { get; }  
             String conversion_profile { get; }  
         }  
   
53          private static class BaseDatabaseDefinition<T>          private static class BaseDatabaseDefinition<T>
54          {          {
55              public static void CreateDefault(T instance)              public static void CreateDefault(T instance)
# Line 129  namespace GBPVRProgramDatabaseFixer Line 85  namespace GBPVRProgramDatabaseFixer
85                      throw ex;                      throw ex;
86                  }                  }
87              }              }
88                public static void Create(T source, ref T destination)
89                {
90                    Type t = source.GetType();
91                    var props = t.GetProperties();
92                    foreach (var prop in props)
93                    {
94                        try
95                        {
96                            object value = prop.GetValue(source, null);
97                            prop.SetValue(destination, value, null);
98                        }
99                        catch (Exception ex)
100                        {
101                            throw ex;
102                        }
103                    }
104                }
105              public static void Create(ref T instance, SQLiteDataReader r, int index)              public static void Create(ref T instance, SQLiteDataReader r, int index)
106              {              {
107                  string field_name = r.GetName(index);                  string field_name = r.GetName(index);
# Line 172  namespace GBPVRProgramDatabaseFixer Line 145  namespace GBPVRProgramDatabaseFixer
145    
146              }              }
147          }          }
148            #endregion
149            public interface ICHANNEL : ICloneable<ICHANNEL>
150            {
151                Int64 oid { get; }
152                String name { get; }
153                String channelID { get; }
154                Int64 channel_number { get; }
155                String favourite_channel { get; }
156                String display_name { get; }
157            }
158            private class CHANNEL : ICHANNEL, ICloneable<CHANNEL>
159            {
160                public CHANNEL()
161                {
162                    BaseDatabaseDefinition<CHANNEL>.CreateDefault(this);
163                }
164                //public RECORDING_SCHEDULE(SQLiteDataReader r, int index) { BaseDatabaseDefinition<RECORDING_SCHEDULE>.Create(this, r, index); }
165    
166          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            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 347  namespace GBPVRProgramDatabaseFixer Line 409  namespace GBPVRProgramDatabaseFixer
409              return range;              return range;
410          }          }
411    
412          public List<SQLLITE.IPROGRAMME> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> source_invalid)          public List<IOldNewProgram> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> source_invalid)
413          {          {
414              source_invalid = new List<IPROGRAMME>();              source_invalid = new List<IPROGRAMME>();
415              List<IPROGRAMME> source_valid = new List<IPROGRAMME>();              List<IOldNewProgram> source_valid = new List<IOldNewProgram>();
416              gbpvr_programs = gbpvr_programs.OrderBy(s => s.start_time).ToList();              gbpvr_programs = gbpvr_programs.OrderBy(s => s.start_time).ToList();
417              xmltv_programs = xmltv_programs.OrderBy(s => DateTime.Parse(s.Start)).ToList();              xmltv_programs = xmltv_programs.OrderBy(s => DateTime.Parse(s.Start)).ToList();
418              gbpvr_programs.TrimExcess();              gbpvr_programs.TrimExcess();
# 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));                          //source_valid.Add(new OldNewProgram(program, updated_program));
482                          source_valid.Add(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(program);                          source_valid.Add(new OldNewProgram(program));
489                      }                      }
490                  }                  }
491                  index++;                  index++;
# Line 823  namespace GBPVRProgramDatabaseFixer Line 891  namespace GBPVRProgramDatabaseFixer
891    
892          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)
893          {                      {            
894              //gLog.Info.WriteLine("Removing {0} gbpvr programs.", programs.Count);              gLog.Info.WriteLine("Removing {0} gbpvr programs.", programs.Count);
             //double total = programs.Count;  
             //double index = 0;  
             //double progress = 0;  
             //Stopwatch st = new Stopwatch();  
             //st.Start();  
             //foreach (var program in programs)  
             //{  
             //    progress = 100.0 * (index / total);  
             //    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing GBPVR Program ({0:00}%) oid='{1}'", (int)progress, program.oid)));  
             //    if (!RemoveProgramDatabaseEntry(program))  
             //    {  
             //        gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);  
             //    }  
             //    index++;  
             //}  
             ////Stopwatch st = new Stopwatch();  
             ////st.Start();  
             ////if (!RemoveAllProgramDatabaseEntries())  
             ////{  
             ////    gLog.Error.WriteLine("Failed to remove one or more program(s)");  
             ////}  
             //st.Stop();  
             //gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds", st.Elapsed.TotalSeconds);  
   
895              int ChunkSize = 1024;              int ChunkSize = 1024;
896              var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);              var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
   
897              double total = programs.Count;              double total = programs.Count;
898              double index = 0;              double index = 0;
899              double progress = 0;              double progress = 0;
# Line 863  namespace GBPVRProgramDatabaseFixer Line 906  namespace GBPVRProgramDatabaseFixer
906                  {                  {
907                      gLog.Error.WriteLine("Failed to remove one or more program(s)");                      gLog.Error.WriteLine("Failed to remove one or more program(s)");
908                  }                  }
909                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing {0} gbpvr programs ({1} of {2}) {3:00}%", p.Count(), index, total, (int)progress)));                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing old gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
910                  index += (double)p.Count();                  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();              st1.Stop();
914              gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);              gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
915          }          }
916          public void UpdateGBPVRPrograms(List<IPROGRAMME> programs)          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)
917          {          {
918              int ChunkSize = 1024;              gLog.Info.WriteLine("Updating {0} gbpvr programs.", programs.Count);
919              var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);              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;
# Line 881  namespace GBPVRProgramDatabaseFixer Line 926  namespace GBPVRProgramDatabaseFixer
926              st1.Start();              st1.Start();
927              foreach (var p in ChunkList)              foreach (var p in ChunkList)
928              {              {
                 //Stopwatch st2 = new Stopwatch();  
                 //st2.Start();  
929                  progress = 100.0 * (index / total);                  progress = 100.0 * (index / total);
                 //gLog.Warn.WriteLine("Inserting {0} gbpvr programs ({1} of {2})", p.Count(), index, total);    
930                  if (!UpdateProgramEntryDatabase(p))                  if (!UpdateProgramEntryDatabase(p))
931                  {                  {
932                      gLog.Error.WriteLine("Failed to update one or more program(s)");                      gLog.Error.WriteLine("Failed to update one or more program(s)");
933                  }                  }
934                  //st2.Stop();                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
                 //gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds", st2.Elapsed.TotalSeconds);  
                 //gLog.Warn.WriteLine(System.Environment.NewLine);  
                 gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating {0} gbpvr programs ({1} of {2}) {3:00}%", p.Count(), index, total, (int)progress)));  
935                  index += (double)p.Count();                                  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();              st1.Stop();
939              gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);              gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
940          }          }
# Line 979  namespace GBPVRProgramDatabaseFixer Line 1019  namespace GBPVRProgramDatabaseFixer
1019              }              }
1020              return result;              return result;
1021          }          }
1022          private bool UpdateProgramEntryDatabase(IEnumerable<IPROGRAMME> list)          private bool UpdateProgramEntryDatabase(IEnumerable<IOldNewProgram> list)
1023          {          {
1024              bool result = false;              bool result = false;
1025              try              try
# Line 1088  namespace GBPVRProgramDatabaseFixer Line 1128  namespace GBPVRProgramDatabaseFixer
1128          }          }
1129          #endregion          #endregion
1130          #region Multi-Update Command Support          #region Multi-Update Command Support
1131          private string BuildGBPVRMultiUpdateCommand(IEnumerable<IPROGRAMME> list)          private string BuildGBPVRMultiUpdateCommand(IEnumerable<IOldNewProgram> list)
1132          {          {
1133              StringBuilder builder = new StringBuilder();              StringBuilder builder = new StringBuilder();
1134              /*              /*
# Line 1100  namespace GBPVRProgramDatabaseFixer Line 1140  namespace GBPVRProgramDatabaseFixer
1140              builder.AppendLine("begin transaction;");              builder.AppendLine("begin transaction;");
1141              foreach (var t in list)              foreach (var t in list)
1142              {              {
1143                  builder.AppendLine(BuildGBPVRSingleInsertCommand(t));                  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;");              builder.AppendLine("end transaction;");
1150              return builder.ToString();              return builder.ToString();
# Line 1112  namespace GBPVRProgramDatabaseFixer Line 1156  namespace GBPVRProgramDatabaseFixer
1156              builder.AppendFormat("name=\"{0}\", ", program.name);              builder.AppendFormat("name=\"{0}\", ", program.name);
1157              builder.AppendFormat("sub_title=\"{0}\", ", program.sub_title);              builder.AppendFormat("sub_title=\"{0}\", ", program.sub_title);
1158              builder.AppendFormat("description=\"{0}\", ", program.description);              builder.AppendFormat("description=\"{0}\", ", program.description);
1159              builder.AppendFormat("start_time='{0}', ", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));              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"));              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);              builder.AppendFormat("channel_oid={0}, ", program.channel_oid);
1162              builder.AppendFormat("unique_identifier=\"{0}\", ", program.unique_identifier);              builder.AppendFormat("unique_identifier=\"{0}\", ", program.unique_identifier);
1163              builder.AppendFormat("rating=\"{0}\" ", program.rating);              builder.AppendFormat("rating=\"{0}\" ", program.rating);

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

  ViewVC Help
Powered by ViewVC 1.1.22