public void LoadLogFiles(IEnumerable <string> logFiles, ProgressBroadcaster pb = null) { if (pb == null) { // Rather than check for null all over the place we will just // user a dummy broadcaster that has no listeners. pb = new ProgressBroadcaster(); } // Drop index and we will rebuild all at once after we have pulled in all the records pb.BroadcastStatus("Dropping indexes..."); Database.ExecuteNonQuery("DROP INDEX IF EXISTS IDX_EntryID;"); Database.ExecuteNonQuery("DROP INDEX IF EXISTS IDX_TimeStamp;"); Database.ExecuteNonQuery("DROP INDEX IF EXISTS IDX_LineNumber;"); Database.ExecuteNonQuery("DROP INDEX IF EXISTS IDX_FilenameID;"); Database.ExecuteNonQuery("DROP INDEX IF EXISTS IDX_ChannelID;"); Database.ExecuteNonQuery("DROP INDEX IF EXISTS IDX_LevelID;"); Database.ExecuteNonQuery("DROP INDEX IF EXISTS IDX_SourceID;"); long overallRecordCount = 0; // Open things up for writing to the index SearchIndex.BeginWrite(); foreach (var logFile in logFiles) { overallRecordCount = LoadLogFile(logFile, overallRecordCount, pb); } // Tell search index to close SearchIndex.EndWrite(); // SQLite is faster building whole index at once rather than on each insert, so earlier // we dropped the index and now we rebuild it pb.BroadcastStatus("Rebuilding indexes..."); Database.ExecuteNonQuery("CREATE INDEX IDX_EntryID ON LogEntry (ID);"); Database.ExecuteNonQuery("CREATE INDEX IDX_TimeStamp ON LogEntry (TimeStamp);"); Database.ExecuteNonQuery("CREATE INDEX IDX_LineNumber ON LogEntry (LineNumber);"); Database.ExecuteNonQuery("CREATE INDEX IDX_FilenameID ON FileName (ID);"); Database.ExecuteNonQuery("CREATE INDEX IDX_ChannelID ON Channel (ID);"); Database.ExecuteNonQuery("CREATE INDEX IDX_LevelID ON Level (ID);"); Database.ExecuteNonQuery("CREATE INDEX IDX_SourceID ON Level (ID);"); }