/// <summary> /// Set up the SQL connections for the table adapters when creating/opening /// a database. /// </summary> private void CreateConnections() { localDB = new KPDatabaseDataSet(); localTAManager = new TableAdapterManager(); localTAManager.CombatantsTableAdapter = new CombatantsTableAdapter(); localTAManager.BattlesTableAdapter = new BattlesTableAdapter(); localTAManager.InteractionsTableAdapter = new InteractionsTableAdapter(); localTAManager.ActionsTableAdapter = new ActionsTableAdapter(); localTAManager.LootTableAdapter = new LootTableAdapter(); localTAManager.ItemsTableAdapter = new ItemsTableAdapter(); localTAManager.RecordLogTableAdapter = new RecordLogTableAdapter(); localTAManager.VersionTableAdapter = new VersionTableAdapter(); localTAManager.ChatMessagesTableAdapter = new ChatMessagesTableAdapter(); localTAManager.ChatSpeakersTableAdapter = new ChatSpeakersTableAdapter(); System.Data.SqlServerCe.SqlCeConnection sqlConn = new System.Data.SqlServerCe.SqlCeConnection(databaseConnectionString); localTAManager.Connection = sqlConn; localTAManager.CombatantsTableAdapter.Connection = sqlConn; localTAManager.BattlesTableAdapter.Connection = sqlConn; localTAManager.InteractionsTableAdapter.Connection = sqlConn; localTAManager.ActionsTableAdapter.Connection = sqlConn; localTAManager.LootTableAdapter.Connection = sqlConn; localTAManager.ItemsTableAdapter.Connection = sqlConn; localTAManager.ChatMessagesTableAdapter.Connection = sqlConn; localTAManager.ChatSpeakersTableAdapter.Connection = sqlConn; localTAManager.RecordLogTableAdapter.Connection = sqlConn; localTAManager.VersionTableAdapter.Connection = sqlConn; // If opening an existing database, need to check version info before filling data localTAManager.CombatantsTableAdapter.Fill(localDB.Combatants); localTAManager.BattlesTableAdapter.Fill(localDB.Battles); localTAManager.InteractionsTableAdapter.Fill(localDB.Interactions); localTAManager.ActionsTableAdapter.Fill(localDB.Actions); localTAManager.LootTableAdapter.Fill(localDB.Loot); localTAManager.ItemsTableAdapter.Fill(localDB.Items); localTAManager.ChatMessagesTableAdapter.Fill(localDB.ChatMessages); localTAManager.ChatSpeakersTableAdapter.Fill(localDB.ChatSpeakers); localTAManager.RecordLogTableAdapter.Fill(localDB.RecordLog); localTAManager.VersionTableAdapter.Fill(localDB.Version); }
/// <summary> /// Close the current database. /// Saves any pending changes first. /// </summary> public void CloseDatabase() { databaseEntry.Reset(); UpdateDatabase(); if (localTAManager != null) { localTAManager.Dispose(); localTAManager = null; } if (localDB != null) { localDB.Dispose(); localDB = null; } }
/// <summary> /// Request that the database be purged of (possibly sensitive) chat information. /// </summary> public void PurgeChatInfo() { if (databaseAccessMutex.WaitOne()) { try { databaseEntry.PurgeChatInfo(localDB); if (localDB.HasChanges()) { KPDatabaseDataSet datasetChanges = (KPDatabaseDataSet)localDB.GetChanges(); if (datasetChanges != null) { try { // 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)); } finally { datasetChanges.Dispose(); } } } } finally { databaseAccessMutex.ReleaseMutex(); } } }
/// <summary> /// Constructor is internal; only created by the DatabaseManager. /// </summary> /// <param name="managedDataset">The dataset provided by the database manager.</param> internal DatabaseWatchEventArgs(KPDatabaseDataSet changedDataset) { DatasetChanges = changedDataset; }
/// <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(); } }