/[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 192 by william, Sat Mar 16 20:14:46 2013 UTC revision 213 by william, Sun Mar 17 01:01:10 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++;
# Line 656  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 820  namespace GBPVRProgramDatabaseFixer Line 823  namespace GBPVRProgramDatabaseFixer
823    
824          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)
825          {                      {            
826              gLog.Info.WriteLine("Removing all gbpvr programs.");              //gLog.Info.WriteLine("Removing {0} gbpvr programs.", programs.Count);
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 ({0:00}%) oid='{1}'", (int)progress, program.oid)));
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              Stopwatch st = new Stopwatch();              ////Stopwatch st = new Stopwatch();
843              st.Start();              ////st.Start();
844              if (!RemoveAllProgramDatabaseEntries())              ////if (!RemoveAllProgramDatabaseEntries())
845                ////{
846                ////    gLog.Error.WriteLine("Failed to remove one or more program(s)");
847                ////}
848                //st.Stop();
849                //gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds", st.Elapsed.TotalSeconds);
850    
851                int ChunkSize = 1024;
852                var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
853    
854                double total = programs.Count;
855                double index = 0;
856                double progress = 0;
857                Stopwatch st1 = new Stopwatch();
858                st1.Start();
859                foreach (var p in ChunkList)
860              {              {
861                  gLog.Error.WriteLine("Failed to remove one or more program(s)");                  progress = 100.0 * (index / total);
862                    if (!RemoveProgramDatabaseEntry(p))
863                    {
864                        gLog.Error.WriteLine("Failed to remove one or more program(s)");
865                    }
866                    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing {0} gbpvr programs ({1} of {2}) {3:00}%", p.Count(), index, total, (int)progress)));
867                    index += (double)p.Count();
868              }              }
869              st.Stop();              st1.Stop();
870              gLog.Warn.WriteLine("    operation took: {0:0.00000} minutes", st.Elapsed.TotalMinutes);              gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
871          }          }
872          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)          public void UpdateGBPVRPrograms(List<IPROGRAMME> programs)
873          {          {
874                            int ChunkSize = 1024;
875              //double total = programs.Count;              var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
876              //double index = 0;  
877              //double progress = 0;              double total = programs.Count;
878              List<IPROGRAMME> new_program_list = new List<IPROGRAMME>();              double index = 0;
879              foreach (var program in programs)              double progress = 0;
880                Stopwatch st1 = new Stopwatch();
881                st1.Start();
882                foreach (var p in ChunkList)
883              {              {
884                  new_program_list.Add(program.NewProgram);                  //Stopwatch st2 = new Stopwatch();
885                    //st2.Start();
886                    progress = 100.0 * (index / total);
887                    //gLog.Warn.WriteLine("Inserting {0} gbpvr programs ({1} of {2})", p.Count(), index, total);  
888                    if (!UpdateProgramEntryDatabase(p))
889                    {
890                        gLog.Error.WriteLine("Failed to update one or more program(s)");
891                    }
892                    //st2.Stop();
893                    //gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds", st2.Elapsed.TotalSeconds);
894                    //gLog.Warn.WriteLine(System.Environment.NewLine);
895                    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating {0} gbpvr programs ({1} of {2}) {3:00}%", p.Count(), index, total, (int)progress)));
896                    index += (double)p.Count();                
897              }              }
898              //new_program_list.TrimExcess();              st1.Stop();
899              gLog.Info.WriteLine("Inserting {0} gbpvr programs.", new_program_list.Count);              gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
             Stopwatch st = new Stopwatch();  
             st.Start();  
             if (!InsertProgramEntryDatabase(new_program_list))  
             {  
                 gLog.Error.WriteLine("Failed to insert one or more program(s)");  
             }  
             //string command = BuildGBPVRMultiInsertCommand(new_program_list);  
             st.Stop();  
             gLog.Warn.WriteLine("    operation took: {0:0.00000} minutes", st.Elapsed.TotalMinutes);  
900          }          }
901    
902          private bool RemoveAllProgramDatabaseEntries()          private bool RemoveAllProgramDatabaseEntries()
# Line 906  namespace GBPVRProgramDatabaseFixer Line 938  namespace GBPVRProgramDatabaseFixer
938              }              }
939              return result;              return result;
940          }          }
941          private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)          private bool RemoveProgramDatabaseEntry(IEnumerable<IPROGRAMME> list)
942          {          {
943              bool result = false;              bool result = false;
944              try              try
# Line 915  namespace GBPVRProgramDatabaseFixer Line 947  namespace GBPVRProgramDatabaseFixer
947                  {                  {
948                      try                      try
949                      {                      {
950                          //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);
951                          con.Open();                          con.Open();
952                          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);
953                            string command_text = string.Empty;
954                            command_text = BuildGBPVRMultiDeleteCommand(list);
955                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
956                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
957                          {                          {
                             cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));  
958                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
959                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
960                          }                          }
961    
962                          result = true;                          result = true;
963                      }                      }
964                      catch (SQLiteException ex)                      catch (SQLiteException ex)
# Line 945  namespace GBPVRProgramDatabaseFixer Line 979  namespace GBPVRProgramDatabaseFixer
979              }              }
980              return result;              return result;
981          }          }
982          private bool InsertProgramEntryDatabase(List<IPROGRAMME> list)          private bool UpdateProgramEntryDatabase(IEnumerable<IPROGRAMME> list)
983            {
984                bool result = false;
985                try
986                {
987                    using (SQLiteConnection con = CreateConnection())
988                    {
989                        try
990                        {
991                            //gLog.Verbose.Info.WriteLine("Updating old program with oid: '{0}'", new_program.oid);
992                            con.Open();
993                            //string command_text = string.Format(@"UPDATE [{0}] SET [name]=@name,[sub_title]=@subtitle, WHERE [OID] = @oid", TABLES.PROGRAMME);
994                            string command_text = string.Empty;
995                            command_text = BuildGBPVRMultiUpdateCommand(list);
996                            //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
997                            using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
998                            {
999                                int rowsupdated = cmd.ExecuteNonQuery();
1000                                //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1001                            }
1002    
1003                            result = true;
1004                        }
1005                        catch (SQLiteException ex)
1006                        {
1007                            gLog.Error.WriteLine(ex.ToString());
1008                            result = false;
1009                        }
1010                        finally
1011                        {
1012                            con.Close();
1013                        }
1014                    }
1015                }
1016                catch (Exception ex)
1017                {
1018                    gLog.Error.WriteLine(ex.ToString());
1019                    result = false;
1020                }
1021                return result;
1022            }
1023            private bool InsertProgramEntryDatabase(IEnumerable<IPROGRAMME> list)
1024          {          {
1025              bool result = false;              bool result = false;
1026              try              try
# Line 987  namespace GBPVRProgramDatabaseFixer Line 1062  namespace GBPVRProgramDatabaseFixer
1062              return result;              return result;
1063          }          }
1064    
1065          private string BuildGBPVRMultiInsertCommand(List<IPROGRAMME> list)          #region Multi-Delete Command Support
1066            private string BuildGBPVRMultiDeleteCommand(IEnumerable<IPROGRAMME> list)
1067          {          {
1068              StringBuilder builder = new StringBuilder();              StringBuilder builder = new StringBuilder();
1069              /*              /*
# Line 996  namespace GBPVRProgramDatabaseFixer Line 1072  namespace GBPVRProgramDatabaseFixer
1072                  insert into table1 (field1,field2) values (value1,value2);                  insert into table1 (field1,field2) values (value1,value2);
1073                  insert into table1 (field1,field2) values (value1,value2)                  insert into table1 (field1,field2) values (value1,value2)
1074               */               */
1075                builder.AppendLine("begin transaction;");
1076                foreach (var t in list)
1077                {
1078                    builder.AppendLine(BuildGBPVRSingleDeleteCommand(t));
1079                }
1080                builder.AppendLine("end transaction;");
1081                return builder.ToString();
1082            }
1083            private string BuildGBPVRSingleDeleteCommand(IPROGRAMME program)
1084            {
1085                StringBuilder builder = new StringBuilder();
1086                builder.AppendFormat("delete from {0} where oid={1};", TABLES.PROGRAMME, program.oid);
1087                return builder.ToString();
1088            }
1089            #endregion
1090            #region Multi-Update Command Support
1091            private string BuildGBPVRMultiUpdateCommand(IEnumerable<IPROGRAMME> list)
1092            {
1093                StringBuilder builder = new StringBuilder();
1094                /*
1095                    insert into table1 (field1,field2) values (value1,value2);
1096                    insert into table1 (field1,field2) values (value1,value2);
1097                    insert into table1 (field1,field2) values (value1,value2);
1098                    insert into table1 (field1,field2) values (value1,value2)
1099                 */
1100                builder.AppendLine("begin transaction;");
1101              foreach (var t in list)              foreach (var t in list)
1102              {              {
1103                  builder.AppendLine(BuildGBPVRSingleInsertCommand(t));                  builder.AppendLine(BuildGBPVRSingleInsertCommand(t));
1104              }              }
1105                builder.AppendLine("end transaction;");
1106              return builder.ToString();              return builder.ToString();
1107          }          }
1108            private string BuildGBPVRSingleUpdateCommand(IPROGRAMME program)
1109            {
1110                StringBuilder builder = new StringBuilder();
1111                builder.AppendFormat("update {0} SET ", TABLES.PROGRAMME);
1112                builder.AppendFormat("name=\"{0}\", ", program.name);
1113                builder.AppendFormat("sub_title=\"{0}\", ", program.sub_title);
1114                builder.AppendFormat("description=\"{0}\", ", program.description);
1115                builder.AppendFormat("start_time='{0}', ", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1116                builder.AppendFormat("end_time='{0}', ", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1117                builder.AppendFormat("channel_oid={0}, ", program.channel_oid);
1118                builder.AppendFormat("unique_identifier=\"{0}\", ", program.unique_identifier);
1119                builder.AppendFormat("rating=\"{0}\" ", program.rating);
1120                builder.AppendFormat("where oid={0};", program.oid);
1121                return builder.ToString();
1122            }
1123            #endregion
1124            #region Multi-Insert Command Support
1125            private string BuildGBPVRMultiInsertCommand(IEnumerable<IPROGRAMME> list)
1126            {
1127                StringBuilder builder = new StringBuilder();
1128                /*
1129                    insert into table1 (field1,field2) values (value1,value2);
1130                    insert into table1 (field1,field2) values (value1,value2);
1131                    insert into table1 (field1,field2) values (value1,value2);
1132                    insert into table1 (field1,field2) values (value1,value2)
1133                 */
1134                builder.AppendLine("begin transaction;");
1135                foreach (var t in list)
1136                {
1137                    builder.AppendLine(BuildGBPVRSingleInsertCommand(t));
1138                }
1139                builder.AppendLine("end transaction;");
1140                return builder.ToString();
1141            }
1142            
1143          private string BuildGBPVRSingleInsertCommand(IPROGRAMME program)          private string BuildGBPVRSingleInsertCommand(IPROGRAMME program)
1144          {          {
1145              StringBuilder builder = new StringBuilder();              StringBuilder builder = new StringBuilder();
# Line 1011  namespace GBPVRProgramDatabaseFixer Line 1148  namespace GBPVRProgramDatabaseFixer
1148              builder.AppendFormat("\"{0}\",", program.name);              builder.AppendFormat("\"{0}\",", program.name);
1149              builder.AppendFormat("\"{0}\",", program.sub_title);              builder.AppendFormat("\"{0}\",", program.sub_title);
1150              builder.AppendFormat("\"{0}\",", program.description);              builder.AppendFormat("\"{0}\",", program.description);
1151              builder.AppendFormat("'{0}',", program.start_time);              builder.AppendFormat("'{0}',", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1152              builder.AppendFormat("'{0}',", program.end_time);              builder.AppendFormat("'{0}',", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1153              builder.AppendFormat("{0},", program.channel_oid);              builder.AppendFormat("{0},", program.channel_oid);
1154              builder.AppendFormat("\"{0}\",", program.unique_identifier);              builder.AppendFormat("\"{0}\",", program.unique_identifier);
1155              builder.AppendFormat("\"{0}\");", program.rating);              builder.AppendFormat("\"{0}\");", program.rating);
1156              return builder.ToString();              return builder.ToString();
1157          }          }
1158                  #endregion
1159    
1160      }      }
1161  }  }

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

  ViewVC Help
Powered by ViewVC 1.1.22