using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using SubSonic; using System.Diagnostics; namespace SubSonicAuditor { public enum Action { Fetch, LoadFromCache, Execute } public class Entry { public DateTime CreatedOn { get; set; } public string Description { get; set; } public Action Action { get; set; } public int ResultCount { get; set; } public TimeSpan ExecutionLength { get; set; } public Dictionary Parameters { get; set; } public string DescriptionHtml { get { return Description.Replace(Environment.NewLine, "
"); } } public Entry(string description, Action action, int resultCount, Dictionary prms, TimeSpan time) { CreatedOn = DateTime.Now; Description = description; Action = action; ResultCount = resultCount; Parameters = prms; ExecutionLength = time; } } public static class Auditor { private static Stopwatch watch = new Stopwatch(); public static void StartTiming() { #if DEBUG if (watch.IsRunning) { watch.Stop(); } watch.Reset(); watch.Start(); #endif } public static TimeSpan StopTiming() { #if DEBUG if (watch.IsRunning) { watch.Stop(); return watch.Elapsed; } #endif return TimeSpan.Zero; } public static List Entries { get { #if DEBUG List entries = HttpContext.Current.Items["_auditor"] as List; if (entries == null) { entries = new List(); HttpContext.Current.Items["_auditor"] = entries; } #endif return entries; } } public static void CreateEntry(string description, Action action, int resultCount, Dictionary parameters, TimeSpan time) { #if DEBUG Entries.Add(new Entry(description, action, resultCount, parameters, time)); #endif } public static void CreateEntry(Query q, Action action, int resultCount, TimeSpan time) { #if DEBUG Dictionary parameters = new Dictionary(); foreach (var p in q.BuildSelectCommand().Parameters) { if (p.ParameterValue != null) parameters.Add(Clean(p.ParameterName), p.ParameterValue); } CreateEntry(q.GetSql(), action, resultCount, parameters, time); #endif } public static void CreateEntry(SqlQuery q, Action action, int resultCount, TimeSpan time) { #if DEBUG Dictionary parameters = new Dictionary(); foreach (var p in q.Constraints) { if (p.ParameterValue != null) parameters.Add(Clean(p.ParameterName), p.ParameterValue); } CreateEntry(q.BuildSqlStatement(), action, resultCount, parameters, time); #endif } public static void CreateEntry(StoredProcedure sproc, Action action, int resultCount, TimeSpan time) { #if DEBUG Dictionary parameters = new Dictionary(); foreach (var p in sproc.Command.Parameters) { if (p.ParameterValue != null) parameters.Add(Clean(p.ParameterName), p.ParameterValue); } CreateEntry(sproc.Name, action, resultCount, parameters, time); #endif } private static string Clean(string p) { return p.Replace("@", string.Empty); } } }