/[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 199 by william, Sat Mar 16 22:25:44 2013 UTC
# Line 22  namespace GBPVRProgramDatabaseFixer Line 22  namespace GBPVRProgramDatabaseFixer
22          List<SQLLITE.IRECORDING_SCHEDULE> Recordings { get; }          List<SQLLITE.IRECORDING_SCHEDULE> Recordings { get; }
23          List<SQLLITE.ICHANNEL> Channels { get; }          List<SQLLITE.ICHANNEL> Channels { get; }
24          IDateTimeRange GetProgramsDateRange(List<SQLLITE.IPROGRAMME> programs);          IDateTimeRange GetProgramsDateRange(List<SQLLITE.IPROGRAMME> programs);
25          List<IOldNewProgram> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> removed_programs);          List<SQLLITE.IPROGRAMME> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> removed_programs);
26    
27          void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs);          void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs);
28          void UpdateGBPVRPrograms(List<IOldNewProgram> programs);          void UpdateGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs);
29    
30      }      }
31      public class SQLLITE : ISQLLITE      public class SQLLITE : ISQLLITE
# Line 347  namespace GBPVRProgramDatabaseFixer Line 347  namespace GBPVRProgramDatabaseFixer
347              return range;              return range;
348          }          }
349    
350          public List<IOldNewProgram> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> source_invalid)          public List<SQLLITE.IPROGRAMME> FixGBPVRProgramsDatabase(List<SQLLITE.IPROGRAMME> gbpvr_programs, List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs, out List<SQLLITE.IPROGRAMME> source_invalid)
351          {          {
352              source_invalid = new List<IPROGRAMME>();              source_invalid = new List<IPROGRAMME>();
353              List<IOldNewProgram> source_valid = new List<IOldNewProgram>();              List<IPROGRAMME> source_valid = new List<IPROGRAMME>();
354              gbpvr_programs = gbpvr_programs.OrderBy(s => s.start_time).ToList();              gbpvr_programs = gbpvr_programs.OrderBy(s => s.start_time).ToList();
355              xmltv_programs = xmltv_programs.OrderBy(s => DateTime.Parse(s.Start)).ToList();              xmltv_programs = xmltv_programs.OrderBy(s => DateTime.Parse(s.Start)).ToList();
356              gbpvr_programs.TrimExcess();              gbpvr_programs.TrimExcess();
# Line 410  namespace GBPVRProgramDatabaseFixer Line 410  namespace GBPVRProgramDatabaseFixer
410                          {                          {
411                              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));
412                          }                          }
413                          source_valid.Add(new OldNewProgram(program, updated_program));                          //source_valid.Add(new OldNewProgram(program, updated_program));
414                            source_valid.Add(updated_program);
415                      }                      }
416                      else                      else
417                      {                      {
418                          // data is the same                          // data is the same
419                          source_valid.Add(new OldNewProgram(program, program));                          //source_valid.Add(new OldNewProgram(program, program));
420                            source_valid.Add(program);
421                      }                      }
422                  }                  }
423                  index++;                  index++;
424              }              }
425                gLog.Info.WriteLine("Total XMLTV Programs: 0x{0:x8}", xmltv_programs.Count);
426                gLog.Info.WriteLine("Total Valid GB-PVR Programs: 0x{0:x8}", source_valid.Count);
427                gLog.Info.WriteLine("Total Invalid GB-PVR Programs: 0x{0:x8}", source_invalid.Count);
428                gLog.Info.WriteLine("Total GB-PVR Programs (Valid+Invalid): 0x{0:x8} == 0x{1:x8}", source_valid.Count + source_invalid.Count, gbpvr_programs.Count);
429              #region old-code              #region old-code
430              //List<OldNewProgram> source_update = new List<OldNewProgram>();              //List<OldNewProgram> source_update = new List<OldNewProgram>();
431              ////if (range == null)              ////if (range == null)
# Line 816  namespace GBPVRProgramDatabaseFixer Line 821  namespace GBPVRProgramDatabaseFixer
821          }          }
822    
823          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)
824            {            
825                gLog.Info.WriteLine("Removing all gbpvr programs.");
826                //double total = programs.Count;
827                //double index = 0;
828                //double progress = 0;
829                //foreach (var program in programs)
830                //{
831                //    progress = 100.0 * (index / total);
832                //    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing GBPVR Programs: {0:00}%", (int)progress)));
833                //    if (!RemoveProgramDatabaseEntry(program))
834                //    {
835                //        gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);
836                //    }
837                //    index++;
838                //}
839                Stopwatch st = new Stopwatch();
840                st.Start();
841                if (!RemoveAllProgramDatabaseEntries())
842                {
843                    gLog.Error.WriteLine("Failed to remove one or more program(s)");
844                }
845                st.Stop();
846                gLog.Warn.WriteLine("    operation took: {0:0.00000} minutes", st.Elapsed.TotalMinutes);
847            }
848            public void UpdateGBPVRPrograms(List<IPROGRAMME> programs)
849          {          {
850              gLog.Info.WriteLine("Removing {0} old gbpvr programs.", programs.Count);              int ChunkSize = 500;
851                var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
852    
853              double total = programs.Count;              double total = programs.Count;
854              double index = 0;              double index = 0;
855              double progress = 0;              double progress = 0;
856              foreach (var program in programs)              Stopwatch st1 = new Stopwatch();
857                st1.Start();
858                foreach (var p in ChunkList)
859              {              {
860                    Stopwatch st2 = new Stopwatch();
861                    st2.Start();
862                  progress = 100.0 * (index / total);                  progress = 100.0 * (index / total);
863                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing GBPVR Programs: {0:00}%", (int)progress)));                  //gLog.Info.WriteLine("Inserting {0} gbpvr programs.", p.Count);  
864                  if (!RemoveProgramDatabaseEntry(program))                  if (!InsertProgramEntryDatabase(p.ToList()))
865                  {                  {
866                      gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);                      gLog.Error.WriteLine("Failed to insert one or more program(s)");
867                  }                  }
868                  index++;                  st2.Stop();
869                    gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds", st2.Elapsed.TotalSeconds);
870                    gLog.Warn.WriteLine(System.Environment.NewLine);
871                    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Inserting GBPVR Programs: {0:00}%", (int)progress)));
872                    index += (double)p.Count();
873                    
874              }              }
875                st1.Stop();
876                gLog.Warn.WriteLine("    operation took: {0:0.00000} minutes overall", st1.Elapsed.TotalMinutes);
877          }          }
878          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)  
879            private bool RemoveAllProgramDatabaseEntries()
880          {          {
881              gLog.Info.WriteLine("Updating {0} gbpvr programs.", programs.Count);              bool result = false;
882              double total = programs.Count;              try
             double index = 0;  
             double progress = 0;  
             foreach (var program in programs)  
883              {              {
884                  progress = 100.0 * (index / total);                  using (SQLiteConnection con = CreateConnection())
                 gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating GBPVR Programs: {0:00}%", (int)progress)));  
                 if (program.NewProgram.Equals(program.OldProgram))  
                 {  
                     // program does not need to be updated  
                     continue;  
                 }  
                 else  
885                  {                  {
886                      if (!UpdateProgramDatabaseEntry(program.NewProgram))                      try
887                        {
888                            //gLog.Verbose.Info.WriteLine("Removing old program with oid: '{0}'", old_program.oid);
889                            con.Open();
890                            string command_text = string.Format(@"DELETE FROM [{0}];", TABLES.PROGRAMME);
891                            //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
892                            using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
893                            {
894                                //cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));
895                                int rowsupdated = cmd.ExecuteNonQuery();
896                                //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
897                            }
898                            result = true;
899                        }
900                        catch (SQLiteException ex)
901                        {
902                            gLog.Error.WriteLine(ex.ToString());
903                            result = false;
904                        }
905                        finally
906                      {                      {
907                          gLog.Error.WriteLine("Failed to update program with oid: {0}", program.NewProgram.oid);                          con.Close();
908                      }                      }
909                  }                  }
                 index++;  
910              }              }
911                catch (Exception ex)
912                {
913                    gLog.Error.WriteLine(ex.ToString());
914                    result = false;
915                }
916                return result;
917          }          }
   
918          private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)          private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)
919          {          {
920              bool result = false;              bool result = false;
# Line 897  namespace GBPVRProgramDatabaseFixer Line 954  namespace GBPVRProgramDatabaseFixer
954              }              }
955              return result;              return result;
956          }          }
957          private bool UpdateProgramDatabaseEntry(IPROGRAMME new_program)          private bool InsertProgramEntryDatabase(List<IPROGRAMME> list)
958          {          {
959              bool result = false;              bool result = false;
960              try              try
# Line 910  namespace GBPVRProgramDatabaseFixer Line 967  namespace GBPVRProgramDatabaseFixer
967                          con.Open();                          con.Open();
968                          //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);
969                          string command_text = string.Empty;                          string command_text = string.Empty;
970                          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();  
971                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
972                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
973                          {                          {                          
                             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));  
974                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
975                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
976                          }                          }
# Line 959  namespace GBPVRProgramDatabaseFixer Line 995  namespace GBPVRProgramDatabaseFixer
995              }              }
996              return result;              return result;
997          }          }
998    
999            private string BuildGBPVRMultiInsertCommand(List<IPROGRAMME> list)
1000            {
1001                StringBuilder builder = new StringBuilder();
1002                /*
1003                    insert into table1 (field1,field2) values (value1,value2);
1004                    insert into table1 (field1,field2) values (value1,value2);
1005                    insert into table1 (field1,field2) values (value1,value2);
1006                    insert into table1 (field1,field2) values (value1,value2)
1007                 */
1008                builder.AppendLine("begin transaction;");
1009                foreach (var t in list)
1010                {
1011                    builder.AppendLine(BuildGBPVRSingleInsertCommand(t));
1012                }
1013                builder.AppendLine("end transaction;");
1014                return builder.ToString();
1015            }
1016    
1017            private string BuildGBPVRSingleInsertCommand(IPROGRAMME program)
1018            {
1019                StringBuilder builder = new StringBuilder();
1020                builder.AppendFormat("insert into {0} (oid,name,sub_title,description,start_time,end_time,channel_oid,unique_identifier,rating) values (", TABLES.PROGRAMME);
1021                builder.AppendFormat("{0},",program.oid);
1022                builder.AppendFormat("\"{0}\",", program.name);
1023                builder.AppendFormat("\"{0}\",", program.sub_title);
1024                builder.AppendFormat("\"{0}\",", program.description);
1025                builder.AppendFormat("'{0}',", program.start_time);
1026                builder.AppendFormat("'{0}',", program.end_time);
1027                builder.AppendFormat("{0},", program.channel_oid);
1028                builder.AppendFormat("\"{0}\",", program.unique_identifier);
1029                builder.AppendFormat("\"{0}\");", program.rating);
1030                return builder.ToString();
1031            }
1032          
1033      }      }
1034  }  }

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

  ViewVC Help
Powered by ViewVC 1.1.22