/[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 208 by william, Sat Mar 16 23:35:42 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 300  namespace GBPVRProgramDatabaseFixer Line 300  namespace GBPVRProgramDatabaseFixer
300              public const string PROGRAMME = "PROGRAMME";              public const string PROGRAMME = "PROGRAMME";
301              public const string CHANNEL = "CHANNEL";              public const string CHANNEL = "CHANNEL";
302          }          }
303            private string DATABASE_BACKUP_FILE = string.Empty;
304          //public SQLLite() { }          //public SQLLite() { }
305          protected SQLLITE(string database, EventHandler<EventArgs> OnInstanceCreated)          protected SQLLITE(string database, EventHandler<EventArgs> OnInstanceCreated)
306          {          {
# 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 653  namespace GBPVRProgramDatabaseFixer Line 658  namespace GBPVRProgramDatabaseFixer
658                  gLog.Info.WriteLine("\tDestination: {0}", backup_file);                  gLog.Info.WriteLine("\tDestination: {0}", backup_file);
659    
660                  System.IO.File.Copy(this.Database, backup_file);                  System.IO.File.Copy(this.Database, backup_file);
661                    DATABASE_BACKUP_FILE = backup_file;
662                  return true;                  return true;
663              }              }
664              catch (Exception ex)              catch (Exception ex)
# Line 816  namespace GBPVRProgramDatabaseFixer Line 822  namespace GBPVRProgramDatabaseFixer
822          }          }
823    
824          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)
825          {          {            
826              gLog.Info.WriteLine("Removing {0} old gbpvr programs.", programs.Count);              gLog.Info.WriteLine("Removing all gbpvr programs.");
827              double total = programs.Count;              double total = programs.Count;
828              double index = 0;              double index = 0;
829              double progress = 0;              double progress = 0;
830                Stopwatch st = new Stopwatch();
831                st.Start();
832              foreach (var program in programs)              foreach (var program in programs)
833              {              {
834                  progress = 100.0 * (index / total);                  progress = 100.0 * (index / total);
835                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing GBPVR Programs: {0:00}%", (int)progress)));                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing GBPVR Program oid='{0}' ({1:00}%)", program.oid, (int)progress)));
836                  if (!RemoveProgramDatabaseEntry(program))                  if (!RemoveProgramDatabaseEntry(program))
837                  {                  {
838                      gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);                      gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);
839                  }                  }
840                  index++;                  index++;
841              }              }
842    
843                //Stopwatch st = new Stopwatch();
844                //st.Start();
845                //if (!RemoveAllProgramDatabaseEntries())
846                //{
847                //    gLog.Error.WriteLine("Failed to remove one or more program(s)");
848                //}
849                st.Stop();
850                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds", st.Elapsed.TotalSeconds);
851          }          }
852          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)          public void UpdateGBPVRPrograms(List<IPROGRAMME> programs)
853          {          {
854              gLog.Info.WriteLine("Updating {0} gbpvr programs.", programs.Count);              int ChunkSize = 1024;
855                var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
856    
857              double total = programs.Count;              double total = programs.Count;
858              double index = 0;              double index = 0;
859              double progress = 0;              double progress = 0;
860              foreach (var program in programs)              Stopwatch st1 = new Stopwatch();
861                st1.Start();
862                foreach (var p in ChunkList)
863              {              {
864                    //Stopwatch st2 = new Stopwatch();
865                    //st2.Start();
866                  progress = 100.0 * (index / total);                  progress = 100.0 * (index / total);
867                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating GBPVR Programs: {0:00}%", (int)progress)));                  //gLog.Warn.WriteLine("Inserting {0} gbpvr programs ({1} of {2})", p.Count(), index, total);  
868                  if (program.NewProgram.Equals(program.OldProgram))                  if (!UpdateProgramEntryDatabase(p))
869                  {                  {
870                      // program does not need to be updated                      gLog.Error.WriteLine("Failed to update one or more program(s)");
                     continue;  
871                  }                  }
872                  else                  //st2.Stop();
873                    //gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds", st2.Elapsed.TotalSeconds);
874                    //gLog.Warn.WriteLine(System.Environment.NewLine);
875                    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating {0} gbpvr programs ({1} of {2}) {0:00}%", p.Count(), index, total, (int)progress)));
876                    index += (double)p.Count();                
877                }
878                st1.Stop();
879                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
880            }
881    
882            private bool RemoveAllProgramDatabaseEntries()
883            {
884                bool result = false;
885                try
886                {
887                    using (SQLiteConnection con = CreateConnection())
888                  {                  {
889                      if (!UpdateProgramDatabaseEntry(program.NewProgram))                      try
890                      {                      {
891                          gLog.Error.WriteLine("Failed to update program with oid: {0}", program.NewProgram.oid);                          //gLog.Verbose.Info.WriteLine("Removing old program with oid: '{0}'", old_program.oid);
892                            con.Open();
893                            string command_text = string.Format(@"DELETE FROM [{0}];", TABLES.PROGRAMME);
894                            //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
895                            using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
896                            {
897                                //cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));
898                                int rowsupdated = cmd.ExecuteNonQuery();
899                                //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
900                            }
901                            result = true;
902                        }
903                        catch (SQLiteException ex)
904                        {
905                            gLog.Error.WriteLine(ex.ToString());
906                            result = false;
907                        }
908                        finally
909                        {
910                            con.Close();
911                      }                      }
912                  }                  }
                 index++;  
913              }              }
914                catch (Exception ex)
915                {
916                    gLog.Error.WriteLine(ex.ToString());
917                    result = false;
918                }
919                return result;
920          }          }
   
921          private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)          private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)
922          {          {
923              bool result = false;              bool result = false;
# Line 897  namespace GBPVRProgramDatabaseFixer Line 957  namespace GBPVRProgramDatabaseFixer
957              }              }
958              return result;              return result;
959          }          }
960          private bool UpdateProgramDatabaseEntry(IPROGRAMME new_program)          private bool UpdateProgramEntryDatabase(IEnumerable<IPROGRAMME> list)
961          {          {
962              bool result = false;              bool result = false;
963              try              try
# Line 910  namespace GBPVRProgramDatabaseFixer Line 970  namespace GBPVRProgramDatabaseFixer
970                          con.Open();                          con.Open();
971                          //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);
972                          string command_text = string.Empty;                          string command_text = string.Empty;
973                          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();  
974                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
975                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
976                          {                          {
                             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));  
977                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
978                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
979                          }                          }
# Line 959  namespace GBPVRProgramDatabaseFixer Line 998  namespace GBPVRProgramDatabaseFixer
998              }              }
999              return result;              return result;
1000          }          }
1001            private bool InsertProgramEntryDatabase(IEnumerable<IPROGRAMME> list)
1002            {
1003                bool result = false;
1004                try
1005                {
1006                    using (SQLiteConnection con = CreateConnection())
1007                    {
1008                        try
1009                        {
1010                            //gLog.Verbose.Info.WriteLine("Updating old program with oid: '{0}'", new_program.oid);
1011                            con.Open();
1012                            //string command_text = string.Format(@"UPDATE [{0}] SET [name]=@name,[sub_title]=@subtitle, WHERE [OID] = @oid", TABLES.PROGRAMME);
1013                            string command_text = string.Empty;
1014                            command_text = BuildGBPVRMultiInsertCommand(list);
1015                            //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
1016                            using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
1017                            {                          
1018                                int rowsupdated = cmd.ExecuteNonQuery();
1019                                //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1020                            }
1021    
1022                            result = true;
1023                        }
1024                        catch (SQLiteException ex)
1025                        {
1026                            gLog.Error.WriteLine(ex.ToString());
1027                            result = false;
1028                        }
1029                        finally
1030                        {
1031                            con.Close();
1032                        }
1033                    }
1034                }
1035                catch (Exception ex)
1036                {
1037                    gLog.Error.WriteLine(ex.ToString());
1038                    result = false;
1039                }
1040                return result;
1041            }
1042            #region Multi-Update Command Support
1043            private string BuildGBPVRMultiUpdateCommand(IEnumerable<IPROGRAMME> list)
1044            {
1045                StringBuilder builder = new StringBuilder();
1046                /*
1047                    insert into table1 (field1,field2) values (value1,value2);
1048                    insert into table1 (field1,field2) values (value1,value2);
1049                    insert into table1 (field1,field2) values (value1,value2);
1050                    insert into table1 (field1,field2) values (value1,value2)
1051                 */
1052                builder.AppendLine("begin transaction;");
1053                foreach (var t in list)
1054                {
1055                    builder.AppendLine(BuildGBPVRSingleInsertCommand(t));
1056                }
1057                builder.AppendLine("end transaction;");
1058                return builder.ToString();
1059            }
1060            private string BuildGBPVRSingleUpdateCommand(IPROGRAMME program)
1061            {
1062                StringBuilder builder = new StringBuilder();
1063                builder.AppendFormat("update {0} SET ", TABLES.PROGRAMME);
1064                builder.AppendFormat("name=\"{0}\", ", program.name);
1065                builder.AppendFormat("sub_title=\"{0}\", ", program.sub_title);
1066                builder.AppendFormat("description=\"{0}\", ", program.description);
1067                builder.AppendFormat("start_time='{0}', ", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1068                builder.AppendFormat("end_time='{0}', ", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1069                builder.AppendFormat("channel_oid={0}, ", program.channel_oid);
1070                builder.AppendFormat("unique_identifier=\"{0}\", ", program.unique_identifier);
1071                builder.AppendFormat("rating=\"{0}\" ", program.rating);
1072                builder.AppendFormat("where oid={0}", program.oid);
1073                return builder.ToString();
1074            }
1075            #endregion
1076            #region Multi-Insert Command Support
1077            private string BuildGBPVRMultiInsertCommand(IEnumerable<IPROGRAMME> list)
1078            {
1079                StringBuilder builder = new StringBuilder();
1080                /*
1081                    insert into table1 (field1,field2) values (value1,value2);
1082                    insert into table1 (field1,field2) values (value1,value2);
1083                    insert into table1 (field1,field2) values (value1,value2);
1084                    insert into table1 (field1,field2) values (value1,value2)
1085                 */
1086                builder.AppendLine("begin transaction;");
1087                foreach (var t in list)
1088                {
1089                    builder.AppendLine(BuildGBPVRSingleInsertCommand(t));
1090                }
1091                builder.AppendLine("end transaction;");
1092                return builder.ToString();
1093            }
1094            
1095            private string BuildGBPVRSingleInsertCommand(IPROGRAMME program)
1096            {
1097                StringBuilder builder = new StringBuilder();
1098                builder.AppendFormat("insert into {0} (oid,name,sub_title,description,start_time,end_time,channel_oid,unique_identifier,rating) values (", TABLES.PROGRAMME);
1099                builder.AppendFormat("{0},",program.oid);
1100                builder.AppendFormat("\"{0}\",", program.name);
1101                builder.AppendFormat("\"{0}\",", program.sub_title);
1102                builder.AppendFormat("\"{0}\",", program.description);
1103                builder.AppendFormat("'{0}',", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1104                builder.AppendFormat("'{0}',", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1105                builder.AppendFormat("{0},", program.channel_oid);
1106                builder.AppendFormat("\"{0}\",", program.unique_identifier);
1107                builder.AppendFormat("\"{0}\");", program.rating);
1108                return builder.ToString();
1109            }
1110            #endregion
1111    
1112      }      }
1113  }  }

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

  ViewVC Help
Powered by ViewVC 1.1.22