/// <summary> /// Join two KParser parses. They must have already had /// timestamps upgraded, if applicable. /// </summary> private void JoinKParserDB() { int rowCount = 0; int totalCount = 0; bool completed = false; try { KParserReadingManager db1 = dbReaderManager as KParserReadingManager; if (db1 == null) { throw new ArgumentNullException(); } if (db1.Database == null) { throw new ArgumentNullException(); } KParserReadingManager db2 = dbReaderManager2 as KParserReadingManager; if (db2 == null) { throw new ArgumentNullException(); } if (db2.Database == null) { throw new ArgumentNullException(); } var allLines = Enumerable.Concat (db1.Database.RecordLog.AsEnumerable(), db2.Database.RecordLog.AsEnumerable()); var orderedLines = from line in allLines orderby line.Timestamp, line.RecordLogID select line; List <ChatLine> chatLines = new List <ChatLine>(100); totalCount = allLines.Count(); // Read the (fixed) record log from the database, reconstruct // the chat line, and send it to the new database. foreach (var logLine in orderedLines) { rowCount++; if (IsRunning == false) { break; } chatLines.Add(new ChatLine(logLine.MessageText, logLine.Timestamp)); OnReaderStatusChanged(new ReaderStatusEventArgs(rowCount, totalCount, completed, false)); if (chatLines.Count > 99) { OnReaderDataChanged(new ReaderDataEventArgs(chatLines)); chatLines = new List <ChatLine>(100); } } if (chatLines.Count > 0) { OnReaderDataChanged(new ReaderDataEventArgs(chatLines)); } completed = IsRunning; List <PlayerInfo> playerInfoList = new List <PlayerInfo>(); foreach (var player in db1.Database.Combatants) { playerInfoList.Add(new PlayerInfo() { Name = player.CombatantName, CombatantType = (EntityType)player.CombatantType, Info = player.PlayerInfo }); } foreach (var player in db2.Database.Combatants) { playerInfoList.Add(new PlayerInfo() { Name = player.CombatantName, CombatantType = (EntityType)player.CombatantType, Info = player.PlayerInfo }); } WaywardGamers.KParser.Parsing.MsgManager.Instance.PlayerInfoList = playerInfoList; } catch (ThreadAbortException e) { Logger.Instance.Log(e); } catch (Exception e) { Logger.Instance.Log(e); } finally { IsRunning = false; OnReaderStatusChanged(new ReaderStatusEventArgs(rowCount, totalCount, completed, (completed == false))); dbReaderManager.CloseDatabase(); dbReaderManager2.CloseDatabase(); } }
/// <summary> /// Import data from another database (reparse, DVS, DirectParse, etc) /// </summary> /// <param name="inFilename1">The name of the first database file to import.</param> /// <param name="inFilename2">The name of the second database file to import.</param> /// <param name="outputFileName">The name of the new database.</param> /// <param name="importSource">The type of database to import.</param> public void JoinAll(List <string> inFilenames, string outputFileName, ImportSourceType importSource) { try { if (currentReader.IsRunning == true) { throw new InvalidOperationException(string.Format( "{0} is already running", currentReader.GetType().Name)); } if (inFilenames.Count < 2) { throw new ArgumentOutOfRangeException("inFilenames", "At least two files must be selected for joining."); } if (importSource != ImportSourceType.KParser) { throw new ArgumentOutOfRangeException("importSource", "Can only perform joins on KParser parses."); } currentReader = DatabaseReader.Instance; DatabaseManager.Instance.CreateDatabase(outputFileName); System.Threading.Thread.Sleep(100); IDBReader dbReader = KParserReadingManager.Instance; IDBReader dbReader2 = new KParserReadingManager(); var mainParse = inFilenames.First(); var otherParses = inFilenames.Skip(1); dbReader.OpenDatabase(mainParse); if (dbReader.DatabaseParseVersion.CompareTo("1.3") < 0) { throw new InvalidOperationException("Reparse to upgrade timestamps first."); } foreach (var parse in otherParses) { try { dbReader2.OpenDatabase(parse); try { MsgManager.Instance.StartNewSession(); currentReader.Join(importSource, dbReader, dbReader2); } catch (Exception) { MsgManager.Instance.EndSession(); throw; } } finally { dbReader2.CloseDatabase(); } } } catch (Exception) { ReaderStatusListener(currentReader, new ReaderStatusEventArgs(0, 0, false, true)); throw; } }
/// <summary> /// Import (reparse) KParser database files. /// </summary> private void ImportKParserDB() { int rowCount = 0; int totalCount = 0; bool completed = false; try { KParserReadingManager readingManager = dbReaderManager as KParserReadingManager; if (readingManager == null) { throw new ArgumentNullException(); } KPDatabaseReadOnly readDataSet = readingManager.Database; if (readDataSet != null) { List <ChatLine> chatLines = new List <ChatLine>(100); totalCount = readDataSet.RecordLog.Count; // Read the (fixed) record log from the database, reconstruct // the chat line, and send it to the new database. foreach (var logLine in readDataSet.RecordLog) { rowCount++; if (IsRunning == false) { break; } if (useTimeRange == true) { DateTime logLineTime = logLine.Timestamp; if (upgradeTimestamp == true) { logLineTime = logLine.Timestamp.ToUniversalTime(); } if ((logLineTime >= startOfTimeRange) && (logLineTime <= endOfTimeRange)) { chatLines.Add(new ChatLine(logLine.MessageText, logLineTime)); } } else { if (upgradeTimestamp == true) { chatLines.Add(new ChatLine(logLine.MessageText, logLine.Timestamp.ToUniversalTime())); } else { chatLines.Add(new ChatLine(logLine.MessageText, logLine.Timestamp)); } } OnReaderStatusChanged(new ReaderStatusEventArgs(rowCount, totalCount, completed, false)); if (chatLines.Count > 99) { OnReaderDataChanged(new ReaderDataEventArgs(chatLines)); chatLines = new List <ChatLine>(100); } } if (chatLines.Count > 0) { OnReaderDataChanged(new ReaderDataEventArgs(chatLines)); } completed = IsRunning; List <PlayerInfo> playerInfoList = new List <PlayerInfo>(); foreach (var player in readDataSet.Combatants) { playerInfoList.Add(new PlayerInfo() { Name = player.CombatantName, CombatantType = (EntityType)player.CombatantType, Info = player.PlayerInfo }); } WaywardGamers.KParser.Parsing.MsgManager.Instance.PlayerInfoList = playerInfoList; } else { throw new InvalidDataException("No database to parse."); } } catch (ThreadAbortException e) { Logger.Instance.Log(e); } catch (Exception e) { Logger.Instance.Log(e); } finally { IsRunning = false; OnReaderStatusChanged(new ReaderStatusEventArgs(rowCount, totalCount, completed, (completed == false))); dbReaderManager.CloseDatabase(); } }
/// <summary> /// Import data from another database (reparse, DVS, DirectParse, etc) /// </summary> /// <param name="inFilename1">The name of the first database file to import.</param> /// <param name="inFilename2">The name of the second database file to import.</param> /// <param name="outputFileName">The name of the new database.</param> /// <param name="importSource">The type of database to import.</param> public void Join(string inFilename1, string inFilename2, string outputFileName, ImportSourceType importSource) { try { if (currentReader.IsRunning == true) { throw new InvalidOperationException(string.Format( "{0} is already running", currentReader.GetType().Name)); } currentReader = DatabaseReader.Instance; DatabaseManager.Instance.CreateDatabase(outputFileName); System.Threading.Thread.Sleep(100); IDBReader dbReader; IDBReader dbReader2; switch (importSource) { case ImportSourceType.KParser: dbReader = KParserReadingManager.Instance; dbReader2 = new KParserReadingManager(); break; case ImportSourceType.DirectParse: case ImportSourceType.DVSParse: // Not supported default: throw new InvalidOperationException(); } dbReader.OpenDatabase(inFilename1); dbReader2.OpenDatabase(inFilename2); if (dbReader is KParserReadingManager) { // Auto-detect files needing timestamp upgrades. if (dbReader.DatabaseParseVersion.CompareTo("1.3") < 0) { throw new InvalidOperationException("Reparse to upgrade timestamps first."); } if (dbReader2.DatabaseParseVersion.CompareTo("1.3") < 0) { throw new InvalidOperationException("Reparse to upgrade timestamps first."); } } try { MsgManager.Instance.StartNewSession(); currentReader.Join(importSource, dbReader, dbReader2); } catch (Exception) { MsgManager.Instance.EndSession(); throw; } } catch (Exception) { ReaderStatusListener(currentReader, new ReaderStatusEventArgs(0, 0, false, true)); throw; } }