/[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 218 by william, Sun Mar 17 01:31:28 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                int ChunkSize = 1;
829                var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
830              double total = programs.Count;              double total = programs.Count;
831              double index = 0;              double index = 0;
832              double progress = 0;              double progress = 0;
833              foreach (var program in programs)              Stopwatch st1 = new Stopwatch();
834                st1.Start();
835                foreach (var p in ChunkList)
836              {              {
837                  progress = 100.0 * (index / total);                  progress = 100.0 * (index / total);
838                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing GBPVR Programs: {0:00}%", (int)progress)));                  if (!RemoveProgramDatabaseEntry(p))
                 if (!RemoveProgramDatabaseEntry(program))  
839                  {                  {
840                      gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);                      gLog.Error.WriteLine("Failed to remove one or more program(s)");
841                  }                  }
842                  index++;                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing old gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
843                    index += (double)p.Count();
844              }              }
845                st1.Stop();
846                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
847          }          }
848          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)
849          {          {
850              gLog.Info.WriteLine("Updating {0} gbpvr programs.", programs.Count);              gLog.Info.WriteLine("Updating {0} gbpvr programs.", programs.Count);
851                int ChunkSize = 1;
852                var ChunkList = programs.Chunk<IOldNewProgram>(ChunkSize);
853    
854              double total = programs.Count;              double total = programs.Count;
855              double index = 0;              double index = 0;
856              double progress = 0;              double progress = 0;
857              foreach (var program in programs)              Stopwatch st1 = new Stopwatch();
858                st1.Start();
859                foreach (var p in ChunkList)
860              {              {
861                  progress = 100.0 * (index / total);                  progress = 100.0 * (index / total);
862                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating GBPVR Programs: {0:00}%", (int)progress)));                  if (!UpdateProgramEntryDatabase(p))
                 if (program.NewProgram.Equals(program.OldProgram))  
863                  {                  {
864                      // program does not need to be updated                      gLog.Error.WriteLine("Failed to update one or more program(s)");
                     continue;  
865                  }                  }
866                  else                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
867                    index += (double)p.Count();                
868                }
869                st1.Stop();
870                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
871            }
872    
873            private bool RemoveAllProgramDatabaseEntries()
874            {
875                bool result = false;
876                try
877                {
878                    using (SQLiteConnection con = CreateConnection())
879                  {                  {
880                      if (!UpdateProgramDatabaseEntry(program.NewProgram))                      try
881                      {                      {
882                          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);
883                            con.Open();
884                            string command_text = string.Format(@"DELETE FROM [{0}];", TABLES.PROGRAMME);
885                            //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
886                            using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
887                            {
888                                //cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));
889                                int rowsupdated = cmd.ExecuteNonQuery();
890                                //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
891                            }
892                            result = true;
893                        }
894                        catch (SQLiteException ex)
895                        {
896                            gLog.Error.WriteLine(ex.ToString());
897                            result = false;
898                        }
899                        finally
900                        {
901                            con.Close();
902                      }                      }
903                  }                  }
                 index++;  
904              }              }
905                catch (Exception ex)
906                {
907                    gLog.Error.WriteLine(ex.ToString());
908                    result = false;
909                }
910                return result;
911          }          }
912            private bool RemoveProgramDatabaseEntry(IEnumerable<IPROGRAMME> list)
         private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)  
913          {          {
914              bool result = false;              bool result = false;
915              try              try
# Line 867  namespace GBPVRProgramDatabaseFixer Line 918  namespace GBPVRProgramDatabaseFixer
918                  {                  {
919                      try                      try
920                      {                      {
921                          //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);
922                          con.Open();                          con.Open();
923                          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);
924                            string command_text = string.Empty;
925                            command_text = BuildGBPVRMultiDeleteCommand(list);
926                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
927                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
928                          {                          {
                             cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));  
929                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
930                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
931                          }                          }
932    
933                          result = true;                          result = true;
934                      }                      }
935                      catch (SQLiteException ex)                      catch (SQLiteException ex)
# Line 897  namespace GBPVRProgramDatabaseFixer Line 950  namespace GBPVRProgramDatabaseFixer
950              }              }
951              return result;              return result;
952          }          }
953          private bool UpdateProgramDatabaseEntry(IPROGRAMME new_program)          private bool UpdateProgramEntryDatabase(IEnumerable<IOldNewProgram> list)
954          {          {
955              bool result = false;              bool result = false;
956              try              try
# Line 910  namespace GBPVRProgramDatabaseFixer Line 963  namespace GBPVRProgramDatabaseFixer
963                          con.Open();                          con.Open();
964                          //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);
965                          string command_text = string.Empty;                          string command_text = string.Empty;
966                          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();  
967                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
968                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
969                          {                          {
                             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));  
970                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
971                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
972                          }                          }
# Line 959  namespace GBPVRProgramDatabaseFixer Line 991  namespace GBPVRProgramDatabaseFixer
991              }              }
992              return result;              return result;
993          }          }
994            private bool InsertProgramEntryDatabase(IEnumerable<IPROGRAMME> list)
995            {
996                bool result = false;
997                try
998                {
999                    using (SQLiteConnection con = CreateConnection())
1000                    {
1001                        try
1002                        {
1003                            //gLog.Verbose.Info.WriteLine("Updating old program with oid: '{0}'", new_program.oid);
1004                            con.Open();
1005                            //string command_text = string.Format(@"UPDATE [{0}] SET [name]=@name,[sub_title]=@subtitle, WHERE [OID] = @oid", TABLES.PROGRAMME);
1006                            string command_text = string.Empty;
1007                            command_text = BuildGBPVRMultiInsertCommand(list);
1008                            //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
1009                            using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
1010                            {                          
1011                                int rowsupdated = cmd.ExecuteNonQuery();
1012                                //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1013                            }
1014    
1015                            result = true;
1016                        }
1017                        catch (SQLiteException ex)
1018                        {
1019                            gLog.Error.WriteLine(ex.ToString());
1020                            result = false;
1021                        }
1022                        finally
1023                        {
1024                            con.Close();
1025                        }
1026                    }
1027                }
1028                catch (Exception ex)
1029                {
1030                    gLog.Error.WriteLine(ex.ToString());
1031                    result = false;
1032                }
1033                return result;
1034            }
1035    
1036            #region Multi-Delete Command Support
1037            private string BuildGBPVRMultiDeleteCommand(IEnumerable<IPROGRAMME> list)
1038            {
1039                StringBuilder builder = new StringBuilder();
1040                /*
1041                    insert into table1 (field1,field2) values (value1,value2);
1042                    insert into table1 (field1,field2) values (value1,value2);
1043                    insert into table1 (field1,field2) values (value1,value2);
1044                    insert into table1 (field1,field2) values (value1,value2)
1045                 */
1046                builder.AppendLine("begin transaction;");
1047                foreach (var t in list)
1048                {
1049                    builder.AppendLine(BuildGBPVRSingleDeleteCommand(t));
1050                }
1051                builder.AppendLine("end transaction;");
1052                return builder.ToString();
1053            }
1054            private string BuildGBPVRSingleDeleteCommand(IPROGRAMME program)
1055            {
1056                StringBuilder builder = new StringBuilder();
1057                builder.AppendFormat("delete from {0} where oid={1};", TABLES.PROGRAMME, program.oid);
1058                return builder.ToString();
1059            }
1060            #endregion
1061            #region Multi-Update Command Support
1062            private string BuildGBPVRMultiUpdateCommand(IEnumerable<IOldNewProgram> list)
1063            {
1064                StringBuilder builder = new StringBuilder();
1065                /*
1066                    insert into table1 (field1,field2) values (value1,value2);
1067                    insert into table1 (field1,field2) values (value1,value2);
1068                    insert into table1 (field1,field2) values (value1,value2);
1069                    insert into table1 (field1,field2) values (value1,value2)
1070                 */
1071                builder.AppendLine("begin transaction;");
1072                foreach (var t in list)
1073                {
1074                    if (!t.OldProgram.Equals(t.NewProgram))
1075                    {
1076                        // only update the entry if it is different
1077                        builder.AppendLine(BuildGBPVRSingleUpdateCommand(t.NewProgram));
1078                    }                
1079                }
1080                builder.AppendLine("end transaction;");
1081                return builder.ToString();
1082            }
1083            private string BuildGBPVRSingleUpdateCommand(IPROGRAMME program)
1084            {
1085                StringBuilder builder = new StringBuilder();
1086                builder.AppendFormat("update {0} SET ", TABLES.PROGRAMME);
1087                builder.AppendFormat("name=\"{0}\", ", program.name);
1088                builder.AppendFormat("sub_title=\"{0}\", ", program.sub_title);
1089                builder.AppendFormat("description=\"{0}\", ", program.description);
1090                builder.AppendFormat("start_time='{0}', ", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1091                builder.AppendFormat("end_time='{0}', ", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1092                builder.AppendFormat("channel_oid={0}, ", program.channel_oid);
1093                builder.AppendFormat("unique_identifier=\"{0}\", ", program.unique_identifier);
1094                builder.AppendFormat("rating=\"{0}\" ", program.rating);
1095                builder.AppendFormat("where oid={0};", program.oid);
1096                return builder.ToString();
1097            }
1098            #endregion
1099            #region Multi-Insert Command Support
1100            private string BuildGBPVRMultiInsertCommand(IEnumerable<IPROGRAMME> list)
1101            {
1102                StringBuilder builder = new StringBuilder();
1103                /*
1104                    insert into table1 (field1,field2) values (value1,value2);
1105                    insert into table1 (field1,field2) values (value1,value2);
1106                    insert into table1 (field1,field2) values (value1,value2);
1107                    insert into table1 (field1,field2) values (value1,value2)
1108                 */
1109                builder.AppendLine("begin transaction;");
1110                foreach (var t in list)
1111                {
1112                    builder.AppendLine(BuildGBPVRSingleInsertCommand(t));
1113                }
1114                builder.AppendLine("end transaction;");
1115                return builder.ToString();
1116            }
1117            
1118            private string BuildGBPVRSingleInsertCommand(IPROGRAMME program)
1119            {
1120                StringBuilder builder = new StringBuilder();
1121                builder.AppendFormat("insert into {0} (oid,name,sub_title,description,start_time,end_time,channel_oid,unique_identifier,rating) values (", TABLES.PROGRAMME);
1122                builder.AppendFormat("{0},",program.oid);
1123                builder.AppendFormat("\"{0}\",", program.name);
1124                builder.AppendFormat("\"{0}\",", program.sub_title);
1125                builder.AppendFormat("\"{0}\",", program.description);
1126                builder.AppendFormat("'{0}',", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1127                builder.AppendFormat("'{0}',", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1128                builder.AppendFormat("{0},", program.channel_oid);
1129                builder.AppendFormat("\"{0}\",", program.unique_identifier);
1130                builder.AppendFormat("\"{0}\");", program.rating);
1131                return builder.ToString();
1132            }
1133            #endregion
1134    
1135      }      }
1136  }  }

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

  ViewVC Help
Powered by ViewVC 1.1.22