/// <summary> /// Given a list of messages, add them to the database in the /// appropriate structure. /// </summary> /// <param name="messageList">The list of messages to add.</param> /// <param name="parseEnded">A flag to indicate whether the parsing /// has ended. If so, close out all waiting values.</param> internal void ProcessNewMessages(List <Message> messageList, bool parseEnded) { // Can't process messages if no db present. if (localDB == null) { return; } if ((messageList == null) || (messageList.Count == 0)) { databaseEntry.UpdatePlayerInfo(localDB, Parsing.MsgManager.Instance.PlayerInfoList); return; } int totalMessageCount = messageList.Count; int messageNumber = 0; // lock database while we're modifying it if (databaseAccessMutex.WaitOne()) { try { foreach (var message in messageList) { databaseEntry.AddMessageToDatabase(localDB, message); OnMessageProcessed(new ReaderStatusEventArgs(++messageNumber, totalMessageCount, false, false)); } databaseEntry.UpdatePlayerInfo(localDB, Parsing.MsgManager.Instance.PlayerInfoList); } catch (Exception e) { OnMessageProcessed(new ReaderStatusEventArgs(++messageNumber, totalMessageCount, false, true)); Logger.Instance.Log(e); } finally { databaseAccessMutex.ReleaseMutex(); OnMessageProcessed(new ReaderStatusEventArgs(++messageNumber, totalMessageCount, true, false)); } } databaseEntry.MessageBatchSent(); // Only push updates to disk every 5 seconds, unless parse is ending. if (parseEnded == false) { DateTime currentTime = DateTime.Now; if (lastUpdateTime + updateDelayWindow > currentTime) { return; } lastUpdateTime = currentTime; } KPDatabaseDataSet datasetChanges = null; try { if (localDB.HasChanges()) { datasetChanges = (KPDatabaseDataSet)localDB.GetChanges(); // Notify watchers so that they can view the database with // Row changed/inserted/deleted flags still visible OnDatabaseChanging(new DatabaseWatchEventArgs(datasetChanges)); UpdateDatabase(); // Notify watchers when database has been fully updated. OnDatabaseChanged(new DatabaseWatchEventArgs(null)); } } catch (Exception e) { Logger.Instance.Log(e); } finally { if (datasetChanges != null) { datasetChanges.Dispose(); } } if (parseEnded == true) { databaseEntry.Reset(); } }