/[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 187 by william, Sat Mar 16 19:13:18 2013 UTC revision 215 by william, Sun Mar 17 01:14:21 2013 UTC
# Line 32  namespace GBPVRProgramDatabaseFixer Line 32  namespace GBPVRProgramDatabaseFixer
32      {      {
33          private class OldNewProgram : IOldNewProgram          private class OldNewProgram : IOldNewProgram
34          {          {
35              public OldNewProgram() : this(new PROGRAMME(), new PROGRAMME()) { }              public OldNewProgram() : this(new PROGRAMME()) { }
36                public OldNewProgram(IPROGRAMME _old) : this(_old,_old) {  }
37              public OldNewProgram(IPROGRAMME _old, IPROGRAMME _new) { OldProgram = _old; NewProgram = _new; }              public OldNewProgram(IPROGRAMME _old, IPROGRAMME _new) { OldProgram = _old; NewProgram = _new; }
38    
39              public IPROGRAMME OldProgram { get; private set; }              public IPROGRAMME OldProgram { get; private set; }
# Line 300  namespace GBPVRProgramDatabaseFixer Line 301  namespace GBPVRProgramDatabaseFixer
301              public const string PROGRAMME = "PROGRAMME";              public const string PROGRAMME = "PROGRAMME";
302              public const string CHANNEL = "CHANNEL";              public const string CHANNEL = "CHANNEL";
303          }          }
304            private string DATABASE_BACKUP_FILE = string.Empty;
305          //public SQLLite() { }          //public SQLLite() { }
306          protected SQLLITE(string database, EventHandler<EventArgs> OnInstanceCreated)          protected SQLLITE(string database, EventHandler<EventArgs> OnInstanceCreated)
307          {          {
# Line 410  namespace GBPVRProgramDatabaseFixer Line 411  namespace GBPVRProgramDatabaseFixer
411                          {                          {
412                              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));
413                          }                          }
414                            //source_valid.Add(new OldNewProgram(program, updated_program));
415                          source_valid.Add(new OldNewProgram(program, updated_program));                          source_valid.Add(new OldNewProgram(program, updated_program));
416                      }                      }
417                      else                      else
418                      {                      {
419                          // data is the same                          // data is the same
420                          source_valid.Add(new OldNewProgram(program, program));                          //source_valid.Add(new OldNewProgram(program, program));
421                            source_valid.Add(new OldNewProgram(program));
422                      }                      }
423                  }                  }
424                  index++;                  index++;
425              }              }
426                gLog.Info.WriteLine("Total XMLTV Programs: 0x{0:x8}", xmltv_programs.Count);
427                gLog.Info.WriteLine("Total Valid GB-PVR Programs: 0x{0:x8}", source_valid.Count);
428                gLog.Info.WriteLine("Total Invalid GB-PVR Programs: 0x{0:x8}", source_invalid.Count);
429                gLog.Info.WriteLine("Total GB-PVR Programs (Valid+Invalid): 0x{0:x8} == 0x{1:x8}", source_valid.Count + source_invalid.Count, gbpvr_programs.Count);
430              #region old-code              #region old-code
431              //List<OldNewProgram> source_update = new List<OldNewProgram>();              //List<OldNewProgram> source_update = new List<OldNewProgram>();
432              ////if (range == null)              ////if (range == null)
# Line 653  namespace GBPVRProgramDatabaseFixer Line 659  namespace GBPVRProgramDatabaseFixer
659                  gLog.Info.WriteLine("\tDestination: {0}", backup_file);                  gLog.Info.WriteLine("\tDestination: {0}", backup_file);
660    
661                  System.IO.File.Copy(this.Database, backup_file);                  System.IO.File.Copy(this.Database, backup_file);
662                    DATABASE_BACKUP_FILE = backup_file;
663                  return true;                  return true;
664              }              }
665              catch (Exception ex)              catch (Exception ex)
# Line 816  namespace GBPVRProgramDatabaseFixer Line 823  namespace GBPVRProgramDatabaseFixer
823          }          }
824    
825          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)          public void RemoveOldGBPVRPrograms(List<SQLLITE.IPROGRAMME> programs)
826          {          {            
827              gLog.Info.WriteLine("Removing all gbpvr programs.");              //gLog.Info.WriteLine("Removing {0} gbpvr programs.", programs.Count);
828              //double total = programs.Count;              //double total = programs.Count;
829              //double index = 0;              //double index = 0;
830              //double progress = 0;              //double progress = 0;
831                //Stopwatch st = new Stopwatch();
832                //st.Start();
833              //foreach (var program in programs)              //foreach (var program in programs)
834              //{              //{
835              //    progress = 100.0 * (index / total);              //    progress = 100.0 * (index / total);
836              //    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)));
837              //    if (!RemoveProgramDatabaseEntry(program))              //    if (!RemoveProgramDatabaseEntry(program))
838              //    {              //    {
839              //        gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);              //        gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);
840              //    }              //    }
841              //    index++;              //    index++;
842              //}              //}
843                if (!RemoveAllProgramDatabaseEntries())              ////Stopwatch st = new Stopwatch();
844                {              ////st.Start();
845                    gLog.Error.WriteLine("Failed to remove one or more program entries");              ////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                int ChunkSize = 1024;
853                var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
854    
855                double total = programs.Count;
856                double index = 0;
857                double progress = 0;
858                Stopwatch st1 = new Stopwatch();
859                st1.Start();
860                foreach (var p in ChunkList)
861                {
862                    progress = 100.0 * (index / total);
863                    if (!RemoveProgramDatabaseEntry(p))
864                    {
865                        gLog.Error.WriteLine("Failed to remove one or more program(s)");
866                    }
867                    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing {0} gbpvr programs ({1} of {2}) {3:00}%", p.Count(), index, total, (int)progress)));
868                    index += (double)p.Count();
869                }
870                st1.Stop();
871                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
872          }          }
873          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)
874          {          {
875              gLog.Info.WriteLine("Inserting {0} gbpvr programs.", programs.Count);              int ChunkSize = 1024;
876                var ChunkList = programs.Chunk<IOldNewProgram>(ChunkSize);
877    
878              double total = programs.Count;              double total = programs.Count;
879              double index = 0;              double index = 0;
880              double progress = 0;              double progress = 0;
881              foreach (var program in programs)              Stopwatch st1 = new Stopwatch();
882                st1.Start();
883                foreach (var p in ChunkList)
884              {              {
885                    //Stopwatch st2 = new Stopwatch();
886                    //st2.Start();
887                  progress = 100.0 * (index / total);                  progress = 100.0 * (index / total);
888                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating/Inserting GBPVR Programs: {0:00}%", (int)progress)));                  //gLog.Warn.WriteLine("Inserting {0} gbpvr programs ({1} of {2})", p.Count(), index, total);  
889                  if (program.NewProgram.Equals(program.OldProgram))                  if (!UpdateProgramEntryDatabase(p))
890                  {                  {
891                      // program does not need to be updated                      gLog.Error.WriteLine("Failed to update one or more program(s)");
                     continue;  
892                  }                  }
893                  else                  //st2.Stop();
894                  {                  //gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds", st2.Elapsed.TotalSeconds);
895                      if (!InsertProgramDatabaseEntry(program.NewProgram))                  //gLog.Warn.WriteLine(System.Environment.NewLine);
896                      {                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating {0} gbpvr programs ({1} of {2}) {3:00}%", p.Count(), index, total, (int)progress)));
897                          gLog.Error.WriteLine("Failed to insert program with oid: {0}", program.NewProgram.oid);                  index += (double)p.Count();                
                     }  
                 }  
                 index++;  
898              }              }
899                st1.Stop();
900                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
901          }          }
902    
903          private bool RemoveAllProgramDatabaseEntries()          private bool RemoveAllProgramDatabaseEntries()
# Line 901  namespace GBPVRProgramDatabaseFixer Line 939  namespace GBPVRProgramDatabaseFixer
939              }              }
940              return result;              return result;
941          }          }
942          private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)          private bool RemoveProgramDatabaseEntry(IEnumerable<IPROGRAMME> list)
943          {          {
944              bool result = false;              bool result = false;
945              try              try
# Line 910  namespace GBPVRProgramDatabaseFixer Line 948  namespace GBPVRProgramDatabaseFixer
948                  {                  {
949                      try                      try
950                      {                      {
951                          //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);
952                          con.Open();                          con.Open();
953                          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);
954                            string command_text = string.Empty;
955                            command_text = BuildGBPVRMultiDeleteCommand(list);
956                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
957                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
958                          {                          {
                             cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));  
959                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
960                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
961                          }                          }
962    
963                          result = true;                          result = true;
964                      }                      }
965                      catch (SQLiteException ex)                      catch (SQLiteException ex)
# Line 940  namespace GBPVRProgramDatabaseFixer Line 980  namespace GBPVRProgramDatabaseFixer
980              }              }
981              return result;              return result;
982          }          }
983          private bool InsertProgramDatabaseEntry(IPROGRAMME new_program)          private bool UpdateProgramEntryDatabase(IEnumerable<IOldNewProgram> list)
984          {          {
985              bool result = false;              bool result = false;
986              try              try
# Line 953  namespace GBPVRProgramDatabaseFixer Line 993  namespace GBPVRProgramDatabaseFixer
993                          con.Open();                          con.Open();
994                          //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);
995                          string command_text = string.Empty;                          string command_text = string.Empty;
996                          StringBuilder builder = new StringBuilder();                          command_text = BuildGBPVRMultiUpdateCommand(list);
                         builder.AppendLine(string.Format("INSERT INTO [{0}]", TABLES.PROGRAMME));  
                         builder.Append("VALUES (");  
                         builder.AppendFormat("[oid]=@oid,");  
                         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");  
                         builder.AppendFormat(");");  
                         command_text = builder.ToString();  
997                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
998                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
999                          {                          {
                             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));  
1000                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
1001                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1002                          }                          }
# Line 1004  namespace GBPVRProgramDatabaseFixer Line 1021  namespace GBPVRProgramDatabaseFixer
1021              }              }
1022              return result;              return result;
1023          }          }
1024          private bool UpdateProgramDatabaseEntry(IPROGRAMME new_program)          private bool InsertProgramEntryDatabase(IEnumerable<IPROGRAMME> list)
1025          {          {
1026              bool result = false;              bool result = false;
1027              try              try
# Line 1017  namespace GBPVRProgramDatabaseFixer Line 1034  namespace GBPVRProgramDatabaseFixer
1034                          con.Open();                          con.Open();
1035                          //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);
1036                          string command_text = string.Empty;                          string command_text = string.Empty;
1037                          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();  
1038                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
1039                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
1040                          {                          {                          
                             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));  
1041                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
1042                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1043                          }                          }
# Line 1066  namespace GBPVRProgramDatabaseFixer Line 1062  namespace GBPVRProgramDatabaseFixer
1062              }              }
1063              return result;              return result;
1064          }          }
1065    
1066            #region Multi-Delete Command Support
1067            private string BuildGBPVRMultiDeleteCommand(IEnumerable<IPROGRAMME> list)
1068            {
1069                StringBuilder builder = new StringBuilder();
1070                /*
1071                    insert into table1 (field1,field2) values (value1,value2);
1072                    insert into table1 (field1,field2) values (value1,value2);
1073                    insert into table1 (field1,field2) values (value1,value2);
1074                    insert into table1 (field1,field2) values (value1,value2)
1075                 */
1076                builder.AppendLine("begin transaction;");
1077                foreach (var t in list)
1078                {
1079                    builder.AppendLine(BuildGBPVRSingleDeleteCommand(t));
1080                }
1081                builder.AppendLine("end transaction;");
1082                return builder.ToString();
1083            }
1084            private string BuildGBPVRSingleDeleteCommand(IPROGRAMME program)
1085            {
1086                StringBuilder builder = new StringBuilder();
1087                builder.AppendFormat("delete from {0} where oid={1};", TABLES.PROGRAMME, program.oid);
1088                return builder.ToString();
1089            }
1090            #endregion
1091            #region Multi-Update Command Support
1092            private string BuildGBPVRMultiUpdateCommand(IEnumerable<IOldNewProgram> list)
1093            {
1094                StringBuilder builder = new StringBuilder();
1095                /*
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                    insert into table1 (field1,field2) values (value1,value2)
1100                 */
1101                builder.AppendLine("begin transaction;");
1102                foreach (var t in list)
1103                {
1104                    if (t.OldProgram != t.NewProgram)
1105                    {
1106                        builder.AppendLine(BuildGBPVRSingleUpdateCommand(t.NewProgram));
1107                    }                
1108                }
1109                builder.AppendLine("end transaction;");
1110                return builder.ToString();
1111            }
1112            private string BuildGBPVRSingleUpdateCommand(IPROGRAMME program)
1113            {
1114                StringBuilder builder = new StringBuilder();
1115                builder.AppendFormat("update {0} SET ", TABLES.PROGRAMME);
1116                builder.AppendFormat("name=\"{0}\", ", program.name);
1117                builder.AppendFormat("sub_title=\"{0}\", ", program.sub_title);
1118                builder.AppendFormat("description=\"{0}\", ", program.description);
1119                builder.AppendFormat("start_time='{0}', ", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1120                builder.AppendFormat("end_time='{0}', ", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1121                builder.AppendFormat("channel_oid={0}, ", program.channel_oid);
1122                builder.AppendFormat("unique_identifier=\"{0}\", ", program.unique_identifier);
1123                builder.AppendFormat("rating=\"{0}\" ", program.rating);
1124                builder.AppendFormat("where oid={0};", program.oid);
1125                return builder.ToString();
1126            }
1127            #endregion
1128            #region Multi-Insert Command Support
1129            private string BuildGBPVRMultiInsertCommand(IEnumerable<IPROGRAMME> list)
1130            {
1131                StringBuilder builder = new StringBuilder();
1132                /*
1133                    insert into table1 (field1,field2) values (value1,value2);
1134                    insert into table1 (field1,field2) values (value1,value2);
1135                    insert into table1 (field1,field2) values (value1,value2);
1136                    insert into table1 (field1,field2) values (value1,value2)
1137                 */
1138                builder.AppendLine("begin transaction;");
1139                foreach (var t in list)
1140                {
1141                    builder.AppendLine(BuildGBPVRSingleInsertCommand(t));
1142                }
1143                builder.AppendLine("end transaction;");
1144                return builder.ToString();
1145            }
1146            
1147            private string BuildGBPVRSingleInsertCommand(IPROGRAMME program)
1148            {
1149                StringBuilder builder = new StringBuilder();
1150                builder.AppendFormat("insert into {0} (oid,name,sub_title,description,start_time,end_time,channel_oid,unique_identifier,rating) values (", TABLES.PROGRAMME);
1151                builder.AppendFormat("{0},",program.oid);
1152                builder.AppendFormat("\"{0}\",", program.name);
1153                builder.AppendFormat("\"{0}\",", program.sub_title);
1154                builder.AppendFormat("\"{0}\",", program.description);
1155                builder.AppendFormat("'{0}',", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1156                builder.AppendFormat("'{0}',", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1157                builder.AppendFormat("{0},", program.channel_oid);
1158                builder.AppendFormat("\"{0}\",", program.unique_identifier);
1159                builder.AppendFormat("\"{0}\");", program.rating);
1160                return builder.ToString();
1161            }
1162            #endregion
1163    
1164      }      }
1165  }  }

Legend:
Removed from v.187  
changed lines
  Added in v.215

  ViewVC Help
Powered by ViewVC 1.1.22