/[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 219 by william, Sun Mar 17 01:43:24 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 = 100;
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 old gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
843                    gLog.Error.WriteLine("Failed to remove one or more program entries");                  index += (double)p.Count();
844                }              }
845                gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Removing old gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
846                st1.Stop();
847                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
848          }          }
849          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)          public void UpdateGBPVRPrograms(List<IOldNewProgram> programs)
850          {          {
851              gLog.Info.WriteLine("Inserting {0} gbpvr programs.", programs.Count);              gLog.Info.WriteLine("Updating {0} gbpvr programs.", programs.Count);
852                int ChunkSize = 1;
853                var ChunkList = programs.Chunk<IOldNewProgram>(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("Updating/Inserting GBPVR Programs: {0:00}%", (int)progress)));                  if (!UpdateProgramEntryDatabase(p))
                 if (program.NewProgram.Equals(program.OldProgram))  
864                  {                  {
865                      // program does not need to be updated                      gLog.Error.WriteLine("Failed to update one or more program(s)");
                     continue;  
866                  }                  }
867                  else                  gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
868                  {                  index += (double)p.Count();                
                     if (!InsertProgramDatabaseEntry(program.NewProgram))  
                     {  
                         gLog.Error.WriteLine("Failed to insert program with oid: {0}", program.NewProgram.oid);  
                     }  
                 }  
                 index++;  
869              }              }
870                gLog.ReportProgress(this, new ReportProgressEventArgs((int)progress, string.Format("Updating gbpvr programs ({0} of {1}) {2:00}%", index, total, (int)progress)));
871                st1.Stop();
872                gLog.Warn.WriteLine("    operation took: {0:0.00000} seconds overall", st1.Elapsed.TotalSeconds);
873          }          }
874    
875          private bool RemoveAllProgramDatabaseEntries()          private bool RemoveAllProgramDatabaseEntries()
# Line 901  namespace GBPVRProgramDatabaseFixer Line 911  namespace GBPVRProgramDatabaseFixer
911              }              }
912              return result;              return result;
913          }          }
914          private bool RemoveProgramDatabaseEntry(IPROGRAMME old_program)          private bool RemoveProgramDatabaseEntry(IEnumerable<IPROGRAMME> list)
915          {          {
916              bool result = false;              bool result = false;
917              try              try
# Line 910  namespace GBPVRProgramDatabaseFixer Line 920  namespace GBPVRProgramDatabaseFixer
920                  {                  {
921                      try                      try
922                      {                      {
923                          //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);
924                          con.Open();                          con.Open();
925                          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);
926                            string command_text = string.Empty;
927                            command_text = BuildGBPVRMultiDeleteCommand(list);
928                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
929                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
930                          {                          {
                             cmd.Parameters.Add(new SQLiteParameter("oid", old_program.oid));  
931                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
932                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
933                          }                          }
934    
935                          result = true;                          result = true;
936                      }                      }
937                      catch (SQLiteException ex)                      catch (SQLiteException ex)
# Line 940  namespace GBPVRProgramDatabaseFixer Line 952  namespace GBPVRProgramDatabaseFixer
952              }              }
953              return result;              return result;
954          }          }
955          private bool InsertProgramDatabaseEntry(IPROGRAMME new_program)          private bool UpdateProgramEntryDatabase(IEnumerable<IOldNewProgram> list)
956          {          {
957              bool result = false;              bool result = false;
958              try              try
# Line 953  namespace GBPVRProgramDatabaseFixer Line 965  namespace GBPVRProgramDatabaseFixer
965                          con.Open();                          con.Open();
966                          //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);
967                          string command_text = string.Empty;                          string command_text = string.Empty;
968                          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();  
969                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
970                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
971                          {                          {
                             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));  
972                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
973                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
974                          }                          }
# Line 1004  namespace GBPVRProgramDatabaseFixer Line 993  namespace GBPVRProgramDatabaseFixer
993              }              }
994              return result;              return result;
995          }          }
996          private bool UpdateProgramDatabaseEntry(IPROGRAMME new_program)          private bool InsertProgramEntryDatabase(IEnumerable<IPROGRAMME> list)
997          {          {
998              bool result = false;              bool result = false;
999              try              try
# Line 1017  namespace GBPVRProgramDatabaseFixer Line 1006  namespace GBPVRProgramDatabaseFixer
1006                          con.Open();                          con.Open();
1007                          //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);
1008                          string command_text = string.Empty;                          string command_text = string.Empty;
1009                          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();  
1010                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);                          //gLog.Verbose.Debug.WriteLine("Executing Command: '{0}'", command_text);
1011                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))                          using (SQLiteCommand cmd = new SQLiteCommand(command_text, con))
1012                          {                          {                          
                             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));  
1013                              int rowsupdated = cmd.ExecuteNonQuery();                              int rowsupdated = cmd.ExecuteNonQuery();
1014                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);                              //gLog.Verbose.Info.WriteLine("Updated '{0}' rows", rowsupdated);
1015                          }                          }
# Line 1066  namespace GBPVRProgramDatabaseFixer Line 1034  namespace GBPVRProgramDatabaseFixer
1034              }              }
1035              return result;              return result;
1036          }          }
1037    
1038            #region Multi-Delete Command Support
1039            private string BuildGBPVRMultiDeleteCommand(IEnumerable<IPROGRAMME> list)
1040            {
1041                StringBuilder builder = new StringBuilder();
1042                /*
1043                    insert into table1 (field1,field2) values (value1,value2);
1044                    insert into table1 (field1,field2) values (value1,value2);
1045                    insert into table1 (field1,field2) values (value1,value2);
1046                    insert into table1 (field1,field2) values (value1,value2)
1047                 */
1048                builder.AppendLine("begin transaction;");
1049                foreach (var t in list)
1050                {
1051                    builder.AppendLine(BuildGBPVRSingleDeleteCommand(t));
1052                }
1053                builder.AppendLine("end transaction;");
1054                return builder.ToString();
1055            }
1056            private string BuildGBPVRSingleDeleteCommand(IPROGRAMME program)
1057            {
1058                StringBuilder builder = new StringBuilder();
1059                builder.AppendFormat("delete from {0} where oid={1};", TABLES.PROGRAMME, program.oid);
1060                return builder.ToString();
1061            }
1062            #endregion
1063            #region Multi-Update Command Support
1064            private string BuildGBPVRMultiUpdateCommand(IEnumerable<IOldNewProgram> list)
1065            {
1066                StringBuilder builder = new StringBuilder();
1067                /*
1068                    insert into table1 (field1,field2) values (value1,value2);
1069                    insert into table1 (field1,field2) values (value1,value2);
1070                    insert into table1 (field1,field2) values (value1,value2);
1071                    insert into table1 (field1,field2) values (value1,value2)
1072                 */
1073                builder.AppendLine("begin transaction;");
1074                foreach (var t in list)
1075                {
1076                    if (!t.OldProgram.Equals(t.NewProgram))
1077                    {
1078                        // only update the entry if it is different
1079                        builder.AppendLine(BuildGBPVRSingleUpdateCommand(t.NewProgram));
1080                    }                
1081                }
1082                builder.AppendLine("end transaction;");
1083                return builder.ToString();
1084            }
1085            private string BuildGBPVRSingleUpdateCommand(IPROGRAMME program)
1086            {
1087                StringBuilder builder = new StringBuilder();
1088                builder.AppendFormat("update {0} SET ", TABLES.PROGRAMME);
1089                builder.AppendFormat("name=\"{0}\", ", program.name);
1090                builder.AppendFormat("sub_title=\"{0}\", ", program.sub_title);
1091                builder.AppendFormat("description=\"{0}\", ", program.description);
1092                builder.AppendFormat("start_time='{0}', ", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1093                builder.AppendFormat("end_time='{0}', ", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1094                builder.AppendFormat("channel_oid={0}, ", program.channel_oid);
1095                builder.AppendFormat("unique_identifier=\"{0}\", ", program.unique_identifier);
1096                builder.AppendFormat("rating=\"{0}\" ", program.rating);
1097                builder.AppendFormat("where oid={0};", program.oid);
1098                return builder.ToString();
1099            }
1100            #endregion
1101            #region Multi-Insert Command Support
1102            private string BuildGBPVRMultiInsertCommand(IEnumerable<IPROGRAMME> list)
1103            {
1104                StringBuilder builder = new StringBuilder();
1105                /*
1106                    insert into table1 (field1,field2) values (value1,value2);
1107                    insert into table1 (field1,field2) values (value1,value2);
1108                    insert into table1 (field1,field2) values (value1,value2);
1109                    insert into table1 (field1,field2) values (value1,value2)
1110                 */
1111                builder.AppendLine("begin transaction;");
1112                foreach (var t in list)
1113                {
1114                    builder.AppendLine(BuildGBPVRSingleInsertCommand(t));
1115                }
1116                builder.AppendLine("end transaction;");
1117                return builder.ToString();
1118            }
1119            
1120            private string BuildGBPVRSingleInsertCommand(IPROGRAMME program)
1121            {
1122                StringBuilder builder = new StringBuilder();
1123                builder.AppendFormat("insert into {0} (oid,name,sub_title,description,start_time,end_time,channel_oid,unique_identifier,rating) values (", TABLES.PROGRAMME);
1124                builder.AppendFormat("{0},",program.oid);
1125                builder.AppendFormat("\"{0}\",", program.name);
1126                builder.AppendFormat("\"{0}\",", program.sub_title);
1127                builder.AppendFormat("\"{0}\",", program.description);
1128                builder.AppendFormat("'{0}',", program.start_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1129                builder.AppendFormat("'{0}',", program.end_time.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
1130                builder.AppendFormat("{0},", program.channel_oid);
1131                builder.AppendFormat("\"{0}\",", program.unique_identifier);
1132                builder.AppendFormat("\"{0}\");", program.rating);
1133                return builder.ToString();
1134            }
1135            #endregion
1136    
1137      }      }
1138  }  }

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

  ViewVC Help
Powered by ViewVC 1.1.22