Updates referencesource to .NET 4.7
[mono.git] / mcs / class / referencesource / System.Data.Entity / System / Data / Mapping / ViewGeneration / ConfigViewGenerator.cs
1 //---------------------------------------------------------------------
2 // <copyright file="ConfigViewGenerator.cs" company="Microsoft">
3 //      Copyright (c) Microsoft Corporation.  All rights reserved.
4 // </copyright>
5 //
6 // @owner Microsoft
7 // @backupOwner Microsoft
8 //---------------------------------------------------------------------
9
10 using System.Data.Common.Utils;
11 using System.Text;
12 using System.Diagnostics;
13
14 namespace System.Data.Mapping.ViewGeneration
15 {
16     internal enum ViewGenMode
17     {
18         GenerateAllViews = 0,
19         OfTypeViews,
20         OfTypeOnlyViews
21     }
22
23     internal enum ViewGenTraceLevel
24     {
25         None = 0,
26         ViewsOnly,
27         Normal,
28         Verbose
29     }
30
31     internal enum PerfType
32     {
33         InitialSetup = 0,
34         CellCreation,
35         KeyConstraint,
36         ViewgenContext,
37         UpdateViews,
38         DisjointConstraint,
39         PartitionConstraint,
40         DomainConstraint,
41         ForeignConstraint,
42         QueryViews,
43         BoolResolution,
44         Unsatisfiability,
45         ViewParsing,
46     }
47
48     /// <summary>
49     /// This class holds some configuration information for the view generation code.
50     /// </summary>
51     internal sealed class ConfigViewGenerator : InternalBase
52     {
53         #region Constructors
54         internal ConfigViewGenerator()
55         {
56             m_watch = new Stopwatch();
57             m_singleWatch = new Stopwatch();
58             int numEnums = Enum.GetNames(typeof(PerfType)).Length;
59             m_breakdownTimes = new TimeSpan[numEnums];
60             m_traceLevel = ViewGenTraceLevel.None;
61             m_generateUpdateViews = false;
62             StartWatch();
63         }
64         #endregion
65
66         #region Fields
67         private bool m_generateViewsForEachType;
68         private ViewGenTraceLevel m_traceLevel;
69         private readonly TimeSpan[] m_breakdownTimes;
70         private Stopwatch m_watch;
71         /// <summary>
72         /// To measure a single thing at a time.
73         /// </summary>
74         private Stopwatch m_singleWatch;
75         /// <summary>
76         /// Perf op being measured.
77         /// </summary>
78         private PerfType m_singlePerfOp;
79         private bool m_enableValidation = true;
80         private bool m_generateUpdateViews = true;
81         private bool m_generateEsql = false;
82         #endregion
83
84         #region Properties
85         /// <summary>
86         /// If true then view generation will produce eSQL, otherwise CQTs only.
87         /// </summary>
88         internal bool GenerateEsql
89         {
90             get { return m_generateEsql; }
91             set { m_generateEsql = value; }
92         }
93
94         /// <summary>
95         /// Callers can set elements in this list.
96         /// </summary>
97         internal TimeSpan[] BreakdownTimes
98         {
99             get { return m_breakdownTimes; }
100         }
101
102         internal ViewGenTraceLevel TraceLevel
103         {
104             get { return m_traceLevel; }
105             set { m_traceLevel = value; }
106         }
107
108         [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
109         internal bool IsValidationEnabled
110         {
111             get { return m_enableValidation; }
112             set { m_enableValidation = value; }
113         }
114
115         internal bool GenerateUpdateViews
116         {
117             get { return m_generateUpdateViews; }
118             set { m_generateUpdateViews = value; }
119         }
120
121         internal bool GenerateViewsForEachType
122         {
123             get { return m_generateViewsForEachType; }
124             set { m_generateViewsForEachType = value; }
125         }
126
127         internal bool IsViewTracing
128         {
129             get { return IsTraceAllowed(ViewGenTraceLevel.ViewsOnly); }
130         }
131
132         internal bool IsNormalTracing
133         {
134             get { return IsTraceAllowed(ViewGenTraceLevel.Normal); }
135         }
136
137         internal bool IsVerboseTracing
138         {
139             get { return IsTraceAllowed(ViewGenTraceLevel.Verbose); }
140         }
141         #endregion
142
143         #region Methods
144         private void StartWatch()
145         {
146             m_watch.Start();
147         }
148
149         internal void StartSingleWatch(PerfType perfType)
150         {
151             m_singleWatch.Start();
152             m_singlePerfOp = perfType;
153         }
154
155         /// <summary>
156         /// Sets time for <paramref name="perfType"/> for the individual timer.
157         /// </summary>
158         internal void StopSingleWatch(PerfType perfType)
159         {
160             Debug.Assert(m_singlePerfOp == perfType, "Started op for different activity " + m_singlePerfOp + " -- not " + perfType);
161             TimeSpan timeElapsed = m_singleWatch.Elapsed;
162             int index = (int)perfType;
163             m_singleWatch.Stop();
164             m_singleWatch.Reset();
165             BreakdownTimes[index] = BreakdownTimes[index].Add(timeElapsed);
166         }
167
168         /// <summary>
169         /// Sets time for <paramref name="perfType"/> since the last call to <see cref="SetTimeForFinishedActivity"/>.
170         /// </summary>
171         /// <param name="perfType"></param>
172         internal void SetTimeForFinishedActivity(PerfType perfType)
173         {
174             TimeSpan timeElapsed = m_watch.Elapsed;
175             int index = (int)perfType;
176             BreakdownTimes[index] = BreakdownTimes[index].Add(timeElapsed);
177             m_watch.Reset();
178             m_watch.Start();
179         }
180
181         internal bool IsTraceAllowed(ViewGenTraceLevel traceLevel)
182         {
183             return TraceLevel >= traceLevel;
184         }
185
186         internal override void ToCompactString(StringBuilder builder)
187         {
188             StringUtil.FormatStringBuilder(builder, "Trace Switch: {0}", m_traceLevel);
189         }
190         #endregion
191     }
192 }