/[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 217 by william, Sun Mar 17 01:23:45 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;              int ChunkSize = 1;
829              //double index = 0;              var ChunkList = programs.Chunk<IPROGRAMME>(ChunkSize);
830              //double progress = 0;              double total = programs.Count;
831              //foreach (var program in programs)              double index = 0;
832              //{              double progress = 0;
833              //    progress = 100.0 * (index / total);              Stopwatch st1 = new Stopwatch();
834              //    gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing GBPVR Programs: {0:00}%", (int)progress)));              st1.Start();
835              //    if (!RemoveProgramDatabaseEntry(program))              foreach (var p in ChunkList)
836              //    {              {
837              //        gLog.Error.WriteLine("Failed to remove program with oid: {0}", program.oid);                  progress = 100.0 * (index / total);
838              //    }                  if (!RemoveProgramDatabaseEntry(p))
839              //    index++;                  {
840              //}                      gLog.Error.WriteLine("Failed to remove one or more program(s)");
841                if (!RemoveAllProgramDatabaseEntries())                  }
842                {                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing {0} gbpvr programs ({1} of {2}) {3:00}%", p.Count(), index, total, (int)progress)));
843                    gLog.Error.WriteLine("Failed to remove one or more program entries");                  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("Inserting {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/Inserting 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 {0} gbpvr programs ({1} of {2}) {3:00}%", p.Count(), index, total, (int)progress)));
867                  {                  index += (double)p.Count();                
                     if (!InsertProgramDatabaseEntry(program.NewProgram))  
                     {  
                         gLog.Error.WriteLine("Failed to insert program with oid: {0}", program.NewProgram.oid);  
                     }  
                 }  
                 index++;  
868              }              }
869                st1.Stop();
870                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
871          }          }
872    
873          private bool RemoveAllProgramDatabaseEntries()          private bool RemoveAllProgramDatabaseEntries()
# Line 901  namespace GBPVRProgramDatabaseFixer Line 909  namespace GBPVRProgramDatabaseFixer
909              }              }
910              return result;              return result;
911          }          }
912          private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)          private bool RemoveProgramDatabaseEntry(IEnumerable<IPROGRAMME> list)
913          {          {
914              bool result = false;              bool result = false;
915              try              try
# Line 910  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 940  namespace GBPVRProgramDatabaseFixer Line 950  namespace GBPVRProgramDatabaseFixer
950              }              }
951              return result;              return result;
952          }          }
953          private bool InsertProgramDatabaseEntry(IPROGRAMME new_program)          private bool UpdateProgramEntryDatabase(IEnumerable<IOldNewProgram> list)
954          {          {
955              bool result = false;              bool result = false;
956              try              try
# Line 953  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("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();  
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 1004  namespace GBPVRProgramDatabaseFixer Line 991  namespace GBPVRProgramDatabaseFixer
991              }              }
992              return result;              return result;
993          }          }
994          private bool UpdateProgramDatabaseEntry(IPROGRAMME new_program)          private bool InsertProgramEntryDatabase(IEnumerable<IPROGRAMME> list)
995          {          {
996              bool result = false;              bool result = false;
997              try              try
# Line 1017  namespace GBPVRProgramDatabaseFixer Line 1004  namespace GBPVRProgramDatabaseFixer
1004                          con.Open();                          con.Open();
1005                          //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);
1006                          string command_text = string.Empty;                          string command_text = string.Empty;
1007                          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();  
1008                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
1009                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
1010                          {                          {                          
                             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));  
1011                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
1012                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1013                          }                          }
# Line 1066  namespace GBPVRProgramDatabaseFixer Line 1032  namespace GBPVRProgramDatabaseFixer
1032              }              }
1033              return result;              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.187  
changed lines
  Added in v.217

  ViewVC Help
Powered by ViewVC 1.1.22