/[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 216 by william, Sun Mar 17 01:15:17 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 {0} old gbpvr programs.", programs.Count);              //gLog.Info.WriteLine("Removing {0} gbpvr programs.", programs.Count);
828                //double total = programs.Count;
829                //double index = 0;
830                //double progress = 0;
831                //Stopwatch st = new Stopwatch();
832                //st.Start();
833                //foreach (var program in programs)
834                //{
835                //    progress = 100.0 * (index / total);
836                //    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing GBPVR Program ({0:00}%) oid='{1}'", (int)progress, program.oid)));
837                //    if (!RemoveProgramDatabaseEntry(program))
838                //    {
839                //        gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);
840                //    }
841                //    index++;
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                int ChunkSize = 1024;
853                var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
854    
855              double total = programs.Count;              double total = programs.Count;
856              double index = 0;              double index = 0;
857              double progress = 0;              double progress = 0;
858              foreach (var program in programs)              Stopwatch st1 = new Stopwatch();
859                st1.Start();
860                foreach (var p in ChunkList)
861              {              {
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)));                  if (!RemoveProgramDatabaseEntry(p))
                 if (!RemoveProgramDatabaseEntry(program))  
864                  {                  {
865                      gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);                      gLog.Error.WriteLine("Failed to remove one or more program(s)");
866                  }                  }
867                  index++;                  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("Updating {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 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                    //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                    index += (double)p.Count();                
898                }
899                st1.Stop();
900                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
901            }
902    
903            private bool RemoveAllProgramDatabaseEntries()
904            {
905                bool result = false;
906                try
907                {
908                    using (SQLiteConnection con = CreateConnection())
909                  {                  {
910                      if (!UpdateProgramDatabaseEntry(program.NewProgram))                      try
911                      {                      {
912                          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);
913                            con.Open();
914                            string command_text = string.Format(@"DELETE FROM [{0}];", TABLES.PROGRAMME);
915                            //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
916                            using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
917                            {
918                                //cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));
919                                int rowsupdated = cmd.ExecuteNonQuery();
920                                //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
921                            }
922                            result = true;
923                        }
924                        catch (SQLiteException ex)
925                        {
926                            gLog.Error.WriteLine(ex.ToString());
927                            result = false;
928                        }
929                        finally
930                        {
931                            con.Close();
932                      }                      }
933                  }                  }
                 index++;  
934              }              }
935                catch (Exception ex)
936                {
937                    gLog.Error.WriteLine(ex.ToString());
938                    result = false;
939                }
940                return result;
941          }          }
942            private bool RemoveProgramDatabaseEntry(IEnumerable<IPROGRAMME> list)
         private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)  
943          {          {
944              bool result = false;              bool result = false;
945              try              try
# Line 867  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 897  namespace GBPVRProgramDatabaseFixer Line 980  namespace GBPVRProgramDatabaseFixer
980              }              }
981              return result;              return result;
982          }          }
983          private bool UpdateProgramDatabaseEntry(IPROGRAMME new_program)          private bool UpdateProgramEntryDatabase(IEnumerable<IOldNewProgram> list)
984          {          {
985              bool result = false;              bool result = false;
986              try              try
# Line 910  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("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();  
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 959  namespace GBPVRProgramDatabaseFixer Line 1021  namespace GBPVRProgramDatabaseFixer
1021              }              }
1022              return result;              return result;
1023          }          }
1024            private bool InsertProgramEntryDatabase(IEnumerable<IPROGRAMME> list)
1025            {
1026                bool result = false;
1027                try
1028                {
1029                    using (SQLiteConnection con = CreateConnection())
1030                    {
1031                        try
1032                        {
1033                            //gLog.Verbose.Info.WriteLine("Updating old program with oid: '{0}'", new_program.oid);
1034                            con.Open();
1035                            //string command_text = string.Format(@"UPDATE [{0}] SET [name]=@name,[sub_title]=@subtitle, WHERE [OID] = @oid", TABLES.PROGRAMME);
1036                            string command_text = string.Empty;
1037                            command_text = BuildGBPVRMultiInsertCommand(list);
1038                            //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
1039                            using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
1040                            {                          
1041                                int rowsupdated = cmd.ExecuteNonQuery();
1042                                //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1043                            }
1044    
1045                            result = true;
1046                        }
1047                        catch (SQLiteException ex)
1048                        {
1049                            gLog.Error.WriteLine(ex.ToString());
1050                            result = false;
1051                        }
1052                        finally
1053                        {
1054                            con.Close();
1055                        }
1056                    }
1057                }
1058                catch (Exception ex)
1059                {
1060                    gLog.Error.WriteLine(ex.ToString());
1061                    result = false;
1062                }
1063                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.Equals(t.NewProgram))
1105                    {
1106                        // only update the entry if it is different
1107                        builder.AppendLine(BuildGBPVRSingleUpdateCommand(t.NewProgram));
1108                    }                
1109                }
1110                builder.AppendLine("end transaction;");
1111                return builder.ToString();
1112            }
1113            private string BuildGBPVRSingleUpdateCommand(IPROGRAMME program)
1114            {
1115                StringBuilder builder = new StringBuilder();
1116                builder.AppendFormat("update {0} SET ", TABLES.PROGRAMME);
1117                builder.AppendFormat("name=\"{0}\", ", program.name);
1118                builder.AppendFormat("sub_title=\"{0}\", ", program.sub_title);
1119                builder.AppendFormat("description=\"{0}\", ", program.description);
1120                builder.AppendFormat("start_time='{0}', ", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1121                builder.AppendFormat("end_time='{0}', ", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1122                builder.AppendFormat("channel_oid={0}, ", program.channel_oid);
1123                builder.AppendFormat("unique_identifier=\"{0}\", ", program.unique_identifier);
1124                builder.AppendFormat("rating=\"{0}\" ", program.rating);
1125                builder.AppendFormat("where oid={0};", program.oid);
1126                return builder.ToString();
1127            }
1128            #endregion
1129            #region Multi-Insert Command Support
1130            private string BuildGBPVRMultiInsertCommand(IEnumerable<IPROGRAMME> list)
1131            {
1132                StringBuilder builder = new StringBuilder();
1133                /*
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                    insert into table1 (field1,field2) values (value1,value2)
1138                 */
1139                builder.AppendLine("begin transaction;");
1140                foreach (var t in list)
1141                {
1142                    builder.AppendLine(BuildGBPVRSingleInsertCommand(t));
1143                }
1144                builder.AppendLine("end transaction;");
1145                return builder.ToString();
1146            }
1147            
1148            private string BuildGBPVRSingleInsertCommand(IPROGRAMME program)
1149            {
1150                StringBuilder builder = new StringBuilder();
1151                builder.AppendFormat("insert into {0} (oid,name,sub_title,description,start_time,end_time,channel_oid,unique_identifier,rating) values (", TABLES.PROGRAMME);
1152                builder.AppendFormat("{0},",program.oid);
1153                builder.AppendFormat("\"{0}\",", program.name);
1154                builder.AppendFormat("\"{0}\",", program.sub_title);
1155                builder.AppendFormat("\"{0}\",", program.description);
1156                builder.AppendFormat("'{0}',", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1157                builder.AppendFormat("'{0}',", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1158                builder.AppendFormat("{0},", program.channel_oid);
1159                builder.AppendFormat("\"{0}\",", program.unique_identifier);
1160                builder.AppendFormat("\"{0}\");", program.rating);
1161                return builder.ToString();
1162            }
1163            #endregion
1164    
1165      }      }
1166  }  }

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

  ViewVC Help
Powered by ViewVC 1.1.22