/// <summary> /// Loads the transactions. /// </summary> private void LoadTransactionsAsynchronous( ) { _dispatcher.Invoke(() => { ListViewEnabled = false; MouseCursor.Set(Cursors.Wait); PluginSettings.Channel.SendMessage(new StatusTextMessage(@"Loading transactions...").ToString( )); }); try { var databaseManager = new DatabaseManager(PluginSettings.DatabaseSettings); HashSet <long> selectedTransactions = null; if (SelectedTransactions != null) { selectedTransactions = new HashSet <long>( ); foreach (HistoricalTransaction transaction in SelectedTransactions) { selectedTransactions.Add(transaction.TransactionId); } } const string commandText = @"--ReadiMon - LoadTransactions SET NOCOUNT ON SELECT [TransactionId], [UserId], [TenantId], [Spid], [Timestamp], [HostName], [ProgramName], [Domain], [Username], [LoginName], [Context] FROM Hist_Transaction ORDER BY TransactionId DESC" ; HistoricalTransaction.TenantCache.Clear( ); HistoricalTransaction.UserCache.Clear( ); HashSet <string> users = new HashSet <string>( ); HashSet <string> tenants = new HashSet <string>( ); HashSet <string> spids = new HashSet <string>( ); HashSet <string> programs = new HashSet <string>( ); HashSet <string> logins = new HashSet <string>( ); var transactions = new List <HistoricalTransaction>( ); using (IDbCommand command = databaseManager.CreateCommand(commandText)) { using (IDataReader reader = command.ExecuteReader( )) { HistoricalTransaction previousTransaction = null; while (reader.Read( )) { var transaction = new HistoricalTransaction(reader, GetChangeCounts); transactions.Add(transaction); if (previousTransaction != null) { previousTransaction.NextTransaction = transaction; } previousTransaction = transaction; } } } const string tenantCommandText = @"-- ReadiMon - Select Tenant Names SELECT Id, name FROM _vTenant" ; using (IDbCommand command = databaseManager.CreateCommand(tenantCommandText)) { using (IDataReader reader = command.ExecuteReader( )) { while (reader.Read( )) { HistoricalTransaction.TenantCache[reader.GetInt64(0)] = reader.GetString(1); } } } HistoricalTransaction.TenantCache[0] = "Global"; const string userCommandText = @"-- ReadiMon - Select User Name SELECT dbo.fnName( @userId )" ; foreach (long userId in transactions.Select(t => t.UserId).Distinct( ).Where(t => t > 0)) { using (SqlCommand command = databaseManager.CreateCommand(userCommandText)) { databaseManager.AddParameter(command, "@userId", userId); object userName = command.ExecuteScalar( ); if (userName != null && userName != DBNull.Value) { HistoricalTransaction.UserCache[userId] = userName.ToString( ); } } } HistoricalTransaction.UserCache[0] = "Administrator"; Transactions = transactions; users.UnionWith(Transactions.Select(t => t.ActiveUserName.ToString( ))); tenants.UnionWith(Transactions.Select(t => t.TenantName.ToString( ))); spids.UnionWith(Transactions.Select(t => t.Spid.ToString( ))); programs.UnionWith(Transactions.Select(t => t.ProgramName)); logins.UnionWith(Transactions.Select(t => t.LoginName)); UserFilters = new List <FilterObject>( ); foreach (string user in users.OrderBy(k => k)) { UserFilters.Add(new FilterObject(user, string.IsNullOrEmpty(user) ? "<empty>" : user, true, UserFilterUpdate)); } OnPropertyChanged("UserFilters"); TenantFilters = new List <FilterObject>( ); foreach (string ten in tenants.OrderBy(k => k)) { TenantFilters.Add(new FilterObject(ten, string.IsNullOrEmpty(ten) ? "<empty>" : ten, true, TenantFilterUpdate)); } OnPropertyChanged("TenantFilters"); SpidFilters = new List <FilterObject>( ); foreach (string spid in spids.OrderBy(k => k)) { SpidFilters.Add(new FilterObject(spid, string.IsNullOrEmpty(spid) ? "<empty>" : spid, true, SpidFilterUpdate)); } OnPropertyChanged("SpidFilters"); ProgramFilters = new List <FilterObject>( ); foreach (string prog in programs.OrderBy(k => k)) { ProgramFilters.Add(new FilterObject(prog, string.IsNullOrEmpty(prog) ? "<empty>" : prog, true, ProgramFilterUpdate)); } OnPropertyChanged("ProgramFilters"); LoginFilters = new List <FilterObject>( ); foreach (string log in logins.OrderBy(k => k)) { LoginFilters.Add(new FilterObject(log, string.IsNullOrEmpty(log) ? "<empty>" : log, true, LoginFilterUpdate)); } OnPropertyChanged("LoginFilters"); FilteredTransactions = new List <HistoricalTransaction>(Transactions); if (selectedTransactions != null) { List <HistoricalTransaction> newlySelectedTransactions = FilteredTransactions.Where(t => selectedTransactions.Contains(t.TransactionId)).ToList( ); SelectedTransactions = newlySelectedTransactions; } } catch (Exception exc) { PluginSettings.EventLog.WriteException(exc); } finally { _dispatcher.Invoke(() => { ListViewEnabled = true; MouseCursor.Set(Cursors.Arrow); PluginSettings.Channel.SendMessage(new StatusTextMessage(@"Ready...").ToString( )); }); } }