diff --git a/AsPartitionProcessing/AsPartitionProcessing.SampleClient/Program.cs b/AsPartitionProcessing/AsPartitionProcessing.SampleClient/Program.cs
index 9c4a0e4..702d619 100644
--- a/AsPartitionProcessing/AsPartitionProcessing.SampleClient/Program.cs
+++ b/AsPartitionProcessing/AsPartitionProcessing.SampleClient/Program.cs
@@ -7,7 +7,7 @@ namespace AsPartitionProcessing.SampleClient
{
class Program
{
- const bool UseDatabase = true;
+ const bool UseDatabase = false;
static void Main(string[] args)
{
diff --git a/AsPartitionProcessing/AsPartitionProcessing/ConfigDatabaseHelper.cs b/AsPartitionProcessing/AsPartitionProcessing/ConfigDatabaseHelper.cs
index 69cd1b9..5753125 100644
--- a/AsPartitionProcessing/AsPartitionProcessing/ConfigDatabaseHelper.cs
+++ b/AsPartitionProcessing/AsPartitionProcessing/ConfigDatabaseHelper.cs
@@ -43,6 +43,7 @@ namespace AsPartitionProcessing
,[SourceTableName]
,[SourcePartitionColumn]
FROM [dbo].[vPartitioningConfiguration]
+ WHERE [DoNotProcess] = 0
ORDER BY
[ModelConfigurationID],
[TableConfigurationID],
diff --git a/AsPartitionProcessing/AsPartitionProcessing/PartitioningConfiguration.cs b/AsPartitionProcessing/AsPartitionProcessing/PartitioningConfiguration.cs
index 0fdfaf6..213696c 100644
--- a/AsPartitionProcessing/AsPartitionProcessing/PartitioningConfiguration.cs
+++ b/AsPartitionProcessing/AsPartitionProcessing/PartitioningConfiguration.cs
@@ -28,10 +28,20 @@ namespace AsPartitionProcessing
public int NumberOfPartitionsForIncrementalProcess { get; set; }
///
- /// The maximum date that needs to be accounted for in the partitioned table. Represents the upper boundary of the rolling window.
+ /// The maximum date that needs to be accounted for in the partitioned table.
///
public DateTime MaxDate { get; set; }
+ ///
+ /// Lower boundary for date range covered by partitioning configuration.
+ ///
+ public DateTime LowerBoundary { get; }
+
+ ///
+ /// Upper boundary for date range covered by partitioning configuration.
+ ///
+ public DateTime UpperBoundary { get; }
+
///
/// Name of the source table in the relational database.
///
@@ -70,6 +80,28 @@ namespace AsPartitionProcessing
MaxDate = maxDate;
SourceTableName = sourceTableName;
SourcePartitionColumn = sourcePartitionColumn;
+
+ switch (granularity)
+ {
+ case Granularity.Daily:
+ LowerBoundary = maxDate.AddDays(-numberOfPartitionsFull + 1);
+ UpperBoundary = maxDate;
+ break;
+
+ case Granularity.Monthly:
+ LowerBoundary = Convert.ToDateTime(maxDate.AddMonths(-numberOfPartitionsFull + 1).ToString("yyyy-MMM-01"));
+ UpperBoundary = Convert.ToDateTime(maxDate.AddMonths(1).ToString("yyyy-MMM-01")).AddDays(-1);
+ break;
+
+ case Granularity.Yearly:
+ LowerBoundary = Convert.ToDateTime(maxDate.AddYears(-numberOfPartitionsFull + 1).ToString("yyyy-01-01"));
+ UpperBoundary = Convert.ToDateTime(maxDate.AddYears(1).ToString("yyyy-01-01")).AddDays(-1);
+ break;
+
+ default:
+ break;
+ }
+
}
}
diff --git a/AsPartitionProcessing/CreateDatabaseObjects.sql b/AsPartitionProcessing/CreateDatabaseObjects.sql
index 149c2cc..640a344 100644
--- a/AsPartitionProcessing/CreateDatabaseObjects.sql
+++ b/AsPartitionProcessing/CreateDatabaseObjects.sql
@@ -25,7 +25,6 @@ CREATE TABLE [dbo].[PartitioningConfiguration](
[NumberOfPartitionsFull] [int] NOT NULL,
[NumberOfPartitionsForIncrementalProcess] [int] NOT NULL,
[MaxDate] [date] NOT NULL,
- [MinDate] AS (case when [Granularity]=(0) then dateadd(day,( -[NumberOfPartitionsFull])+(1),[MaxDate]) when [Granularity]=(1) then CONVERT([date],format(dateadd(month,( -[NumberOfPartitionsFull])+(1),[MaxDate]),'yyyy-MMM-01')) when [Granularity]=(2) then CONVERT([date],format(dateadd(year,( -[NumberOfPartitionsFull])+(1),[MaxDate]),'yyyy-01-01')) else [MaxDate] end),
[SourceTableName] [varchar](255) NOT NULL,
[SourcePartitionColumn] [varchar](255) NOT NULL,
CONSTRAINT [PK_PartitioningConfiguration] PRIMARY KEY CLUSTERED
@@ -52,6 +51,7 @@ CREATE TABLE [dbo].[TableConfiguration](
[TableConfigurationID] [int] NOT NULL,
[ModelConfigurationID] [int] NOT NULL,
[AnalysisServicesTable] [varchar](255) NOT NULL,
+ [DoNotProcess] [bit] NOT NULL,
CONSTRAINT [PK_TableConfiguration] PRIMARY KEY CLUSTERED
(
[TableConfigurationID] ASC
@@ -73,6 +73,9 @@ GO
ALTER TABLE [dbo].[ProcessingLog] CHECK CONSTRAINT [FK_ProcessingLog_ModelConfiguration]
GO
+ALTER TABLE [dbo].[TableConfiguration] ADD CONSTRAINT [DF_TableConfiguration_DoNotProcess] DEFAULT ((0)) FOR [DoNotProcess]
+GO
+
ALTER TABLE [dbo].[TableConfiguration] WITH CHECK ADD CONSTRAINT [FK_TableConfiguration_ModelConfiguration] FOREIGN KEY([ModelConfigurationID])
REFERENCES [dbo].[ModelConfiguration] ([ModelConfigurationID])
GO
@@ -94,7 +97,6 @@ GO
-
CREATE VIEW [dbo].[vPartitioningConfiguration]
AS
SELECT m.[ModelConfigurationID]
@@ -106,6 +108,7 @@ SELECT m.[ModelConfigurationID]
,m.[IntegratedAuth]
,t.[TableConfigurationID]
,t.[AnalysisServicesTable]
+ ,t.[DoNotProcess]
,CASE
WHEN p.[TableConfigurationID] IS NULL THEN 0
ELSE 1
@@ -115,7 +118,6 @@ SELECT m.[ModelConfigurationID]
,p.[NumberOfPartitionsFull]
,p.[NumberOfPartitionsForIncrementalProcess]
,p.[MaxDate]
- ,p.[MinDate]
,p.[SourceTableName]
,p.[SourcePartitionColumn]
FROM [dbo].[ModelConfiguration] m
diff --git a/AsPartitionProcessing/SampleConfiguration.sql b/AsPartitionProcessing/SampleConfiguration.sql
index 0633804..9696a7b 100644
--- a/AsPartitionProcessing/SampleConfiguration.sql
+++ b/AsPartitionProcessing/SampleConfiguration.sql
@@ -14,11 +14,13 @@ VALUES(
1 --[TableConfigurationID]
,1 --[ModelConfigurationID]
,'Internet Sales' --[AnalysisServicesTable]
+ ,0 --[DoNotProcess]
),
(
2 --[TableConfigurationID]
,1 --[ModelConfigurationID]
,'Reseller Sales' --[AnalysisServicesTable]
+ ,0 --[DoNotProcess]
);
INSERT INTO [dbo].[PartitioningConfiguration]
diff --git a/AsPerfMon/ASPerfMon.sln b/AsPerfMon/ASPerfMon.sln
index 7894e48..33f9d7f 100644
--- a/AsPerfMon/ASPerfMon.sln
+++ b/AsPerfMon/ASPerfMon.sln
@@ -1,22 +1,22 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ASPerfMon", "ASPerfMon\ASPerfMon.csproj", "{B2442578-2C46-47D2-B5FB-57096C234552}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {B2442578-2C46-47D2-B5FB-57096C234552}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B2442578-2C46-47D2-B5FB-57096C234552}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B2442578-2C46-47D2-B5FB-57096C234552}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B2442578-2C46-47D2-B5FB-57096C234552}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ASPerfMon", "ASPerfMon\ASPerfMon.csproj", "{B2442578-2C46-47D2-B5FB-57096C234552}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {B2442578-2C46-47D2-B5FB-57096C234552}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B2442578-2C46-47D2-B5FB-57096C234552}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B2442578-2C46-47D2-B5FB-57096C234552}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B2442578-2C46-47D2-B5FB-57096C234552}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/AsPerfMon/AsPerfMon/ASPerfMon.Designer.cs b/AsPerfMon/AsPerfMon/ASPerfMon.Designer.cs
index daa17e8..5474bcc 100644
--- a/AsPerfMon/AsPerfMon/ASPerfMon.Designer.cs
+++ b/AsPerfMon/AsPerfMon/ASPerfMon.Designer.cs
@@ -1,94 +1,94 @@
-namespace ASPerfMon
-{
- partial class ASPerfMon
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
- System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
- System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ASPerfMon));
- this.chartControl = new System.Windows.Forms.DataVisualization.Charting.Chart();
- this.btnConnect = new System.Windows.Forms.Button();
- ((System.ComponentModel.ISupportInitialize)(this.chartControl)).BeginInit();
- this.SuspendLayout();
- //
- // chartControl
- //
- chartArea1.Name = "ChartArea1";
- this.chartControl.ChartAreas.Add(chartArea1);
- this.chartControl.Dock = System.Windows.Forms.DockStyle.Fill;
- legend1.Name = "Legend1";
- this.chartControl.Legends.Add(legend1);
- this.chartControl.Location = new System.Drawing.Point(0, 0);
- this.chartControl.Name = "chartControl";
- series1.ChartArea = "ChartArea1";
- series1.Legend = "Legend1";
- series1.Name = "Series1";
- this.chartControl.Series.Add(series1);
- this.chartControl.Size = new System.Drawing.Size(948, 645);
- this.chartControl.TabIndex = 0;
- this.chartControl.Text = "chart1";
- this.chartControl.GetToolTipText += new System.EventHandler(this.chartControl_GetToolTipText);
- //
- // btnConnect
- //
- this.btnConnect.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.btnConnect.Location = new System.Drawing.Point(788, 567);
- this.btnConnect.Name = "btnConnect";
- this.btnConnect.Size = new System.Drawing.Size(127, 44);
- this.btnConnect.TabIndex = 6;
- this.btnConnect.Text = "Connect";
- this.btnConnect.UseVisualStyleBackColor = true;
- this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click);
- //
- // ASPerfMon
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.BackColor = System.Drawing.Color.White;
- this.ClientSize = new System.Drawing.Size(948, 645);
- this.Controls.Add(this.btnConnect);
- this.Controls.Add(this.chartControl);
- this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.Name = "ASPerfMon";
- this.Text = "AS PerfMon";
- this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ASPerfMon_FormClosing);
- this.Load += new System.EventHandler(this.ASPerfMon_Load);
- this.Shown += new System.EventHandler(this.ASPerfMon_Shown);
- ((System.ComponentModel.ISupportInitialize)(this.chartControl)).EndInit();
- this.ResumeLayout(false);
-
- }
-
- #endregion
-
- private System.Windows.Forms.DataVisualization.Charting.Chart chartControl;
- private System.Windows.Forms.Button btnConnect;
- }
-}
-
+namespace ASPerfMon
+{
+ partial class ASPerfMon
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+ System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
+ System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ASPerfMon));
+ this.chartControl = new System.Windows.Forms.DataVisualization.Charting.Chart();
+ this.btnConnect = new System.Windows.Forms.Button();
+ ((System.ComponentModel.ISupportInitialize)(this.chartControl)).BeginInit();
+ this.SuspendLayout();
+ //
+ // chartControl
+ //
+ chartArea1.Name = "ChartArea1";
+ this.chartControl.ChartAreas.Add(chartArea1);
+ this.chartControl.Dock = System.Windows.Forms.DockStyle.Fill;
+ legend1.Name = "Legend1";
+ this.chartControl.Legends.Add(legend1);
+ this.chartControl.Location = new System.Drawing.Point(0, 0);
+ this.chartControl.Name = "chartControl";
+ series1.ChartArea = "ChartArea1";
+ series1.Legend = "Legend1";
+ series1.Name = "Series1";
+ this.chartControl.Series.Add(series1);
+ this.chartControl.Size = new System.Drawing.Size(948, 645);
+ this.chartControl.TabIndex = 0;
+ this.chartControl.Text = "chart1";
+ this.chartControl.GetToolTipText += new System.EventHandler(this.chartControl_GetToolTipText);
+ //
+ // btnConnect
+ //
+ this.btnConnect.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnConnect.Location = new System.Drawing.Point(788, 567);
+ this.btnConnect.Name = "btnConnect";
+ this.btnConnect.Size = new System.Drawing.Size(127, 44);
+ this.btnConnect.TabIndex = 6;
+ this.btnConnect.Text = "Connect";
+ this.btnConnect.UseVisualStyleBackColor = true;
+ this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click);
+ //
+ // ASPerfMon
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.White;
+ this.ClientSize = new System.Drawing.Size(948, 645);
+ this.Controls.Add(this.btnConnect);
+ this.Controls.Add(this.chartControl);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Name = "ASPerfMon";
+ this.Text = "AS PerfMon";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ASPerfMon_FormClosing);
+ this.Load += new System.EventHandler(this.ASPerfMon_Load);
+ this.Shown += new System.EventHandler(this.ASPerfMon_Shown);
+ ((System.ComponentModel.ISupportInitialize)(this.chartControl)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.DataVisualization.Charting.Chart chartControl;
+ private System.Windows.Forms.Button btnConnect;
+ }
+}
+
diff --git a/AsPerfMon/AsPerfMon/ASPerfMon.cs b/AsPerfMon/AsPerfMon/ASPerfMon.cs
index f92a8f3..a6b1fb5 100644
--- a/AsPerfMon/AsPerfMon/ASPerfMon.cs
+++ b/AsPerfMon/AsPerfMon/ASPerfMon.cs
@@ -1,394 +1,394 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Windows.Forms;
-using System.Windows.Forms.DataVisualization.Charting;
-using System.Timers;
-using Microsoft.AnalysisServices;
-using Tom = Microsoft.AnalysisServices.Tabular;
-using System.Xml;
-using System.Drawing;
-
-namespace ASPerfMon
-{
- public partial class ASPerfMon : Form
- {
- public ASPerfMon()
- {
- InitializeComponent();
- }
-
- private Tom.Server _server = new Tom.Server();
- private System.Timers.Timer _timer;
- private const int _smallestFont = 12;
- private string _serverConnectionString;
- private DateTime _connectionTime;
-
- //--------------------------------------------------
- //120 X axis markers, one for each array item.
- //Each item holds a dictionary with lookup key of series name (e.g. database name), which returns a SeriesPoint object.
- Dictionary[] _seriesData = new Dictionary[120];
-
- class SeriesPoint
- {
- public string XAxisLabel;
- public long MemoryUsedBytes;
- public long MemoryUsedMegabytes
- {
- get
- {
- return MemoryUsedBytes / 1024 / 1024;
- }
- }
-
- public SeriesPoint(string xAxisCategoryName)
- {
- this.XAxisLabel = xAxisCategoryName;
- this.MemoryUsedBytes = 0;
- }
- }
-
- private void ASPerfMon_Load(object sender, EventArgs e)
- {
- InitializeChart(false);
- }
-
- private void InitializeChart(bool withSampleSeries)
- {
- chartControl.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
- chartControl.ChartAreas[0].AxisX.Interval = 5;
- chartControl.ChartAreas[0].AxisY.IsMarksNextToAxis = true;
- chartControl.ChartAreas[0].AxisY.LabelStyle.Format = "{0:n0}";
- chartControl.ChartAreas[0].AxisY.Title = "Memory Usage MB";
- chartControl.Palette = ChartColorPalette.Pastel;
- chartControl.ChartAreas[0].AxisY.TitleFont = new Font(Font.FontFamily, _smallestFont + 2);
- chartControl.Legends[0].Font = new Font(Font.FontFamily, _smallestFont);
- chartControl.Legends[0].LegendItemOrder = LegendItemOrder.ReversedSeriesOrder;
-
- //initialize the chart with blanks
- Dictionary pointsSample;
- if (withSampleSeries)
- pointsSample = GetNewXAxisMarkerPointsFromAs();
- else
- {
- pointsSample = new Dictionary();
- }
-
- chartControl.Series.Clear();
- if (withSampleSeries)
- {
- for (int i = _seriesData.Length - 1; i >= 0; i--)
- {
- foreach (KeyValuePair entry in pointsSample)//to get series
- {
- entry.Value.XAxisLabel = " ";
- entry.Value.MemoryUsedBytes = 0;
-
- //add the series if not there yet
- if (chartControl.Series.FindByName(entry.Key) == null)
- {
- Series series = new Series(entry.Key);
- chartControl.Series.Add(series);
- }
- chartControl.Series[entry.Key].Points.AddXY(" ", 0);
- }
- _seriesData[i] = pointsSample;
- }
- PaintChart();
- }
- else
- {
- chartControl.Series.Add("");
- for (int i = 0; i < _seriesData.Length; i++)
- {
- chartControl.Series[0].Points.AddXY(" ", 0);
- }
- chartControl.Invalidate();
- }
-
- _timer = new System.Timers.Timer(Settings.Default.SampleInterval);
- _timer.Elapsed += OnTimedEvent;
- _timer.AutoReset = true;
- }
-
- private void PaintChart()
- {
- //set dynamic scale
- long maxValue = 0;
- for (int i = _seriesData.Length - 1; i >= 0; i--)
- {
- long pointsStack = 0;
- foreach (SeriesPoint point in _seriesData[i].Values)
- {
- pointsStack += Math.Abs(point.MemoryUsedMegabytes);
- }
-
- if (pointsStack > maxValue)
- maxValue = pointsStack;
- }
- chartControl.ChartAreas[0].AxisY.IsStartedFromZero = true;
- chartControl.ChartAreas[0].AxisY.Minimum = double.NaN;
- chartControl.ChartAreas[0].AxisY.Maximum = double.NaN;
- chartControl.ChartAreas[0].RecalculateAxesScale();
- chartControl.Invalidate();
- }
-
- delegate void SetTimerCallback(Object source, ElapsedEventArgs e);
- private void OnTimedEvent(Object source, ElapsedEventArgs e)
- {
- try
- {
- if (chartControl.InvokeRequired)
- {
- SetTimerCallback callback = new SetTimerCallback(OnTimedEvent);
- //todo safer invoke look up bism
- try
- {
- Invoke(callback, new object[] { source, e });
- }
- catch { }
- }
- else
- {
- //Todo delete this once http stability fix is done
- if ((DateTime.Now - _connectionTime).TotalMinutes > 8)
- {
- _server.Disconnect();
- _server.Connect(_serverConnectionString);
- _connectionTime = DateTime.Now;
- }
-
- _seriesData[0] = GetNewXAxisMarkerPointsFromAs();
-
- //rebind
- chartControl.Series.Clear();
-
- //for each X axis marker
- for (int i = _seriesData.Length - 1; i > 0; i--)
- {
- //push back one category
- _seriesData[i] = _seriesData[i - 1];
-
- //foreach series for the X axis marker we are populating: ...
- foreach (KeyValuePair entry in _seriesData[i])
- {
- //add the series if not there yet
- if (chartControl.Series.FindByName(entry.Key) == null)
- {
- Series series = new Series(entry.Key);
- series.ChartType = SeriesChartType.StackedColumn;
- chartControl.Series.Add(series);
- }
-
- //add the data point for the series
- DataPoint point = new DataPoint();
- point.SetValueXY(entry.Value.XAxisLabel, entry.Value.MemoryUsedMegabytes);
- point.ToolTip = string.Format($"{entry.Value.XAxisLabel} - {entry.Key}: {string.Format("{0:#,###0}", entry.Value.MemoryUsedMegabytes)} MB");
- chartControl.Series[entry.Key].Points.Add(point);
- }
- }
- PaintChart();
- }
- }
- catch (Exception exc)
- {
- //Workaround for timeout over HTTP. Try to reconnect - todo delete
- try
- {
- System.Diagnostics.Debug.WriteLine($"Exception occurred at {DateTime.Now}: {exc.Message}");
- _server.Disconnect();
- _server.Connect(_serverConnectionString);
- _connectionTime = DateTime.Now;
- }
- catch
- {
- _timer.Enabled = false;
- MessageBox.Show($"Error: {exc.Message}", "AS PerfMon", MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
- }
-
- private Dictionary GetNewXAxisMarkerPointsFromAs()
- {
- Dictionary points = new Dictionary();
- string xAxisLabel = DateTime.Now.ToString("hh:mm:ss tt");
- string commandStatement = String.Format("SELECT [OBJECT_PARENT_PATH], [OBJECT_MEMORY_NONSHRINKABLE] FROM $SYSTEM.DISCOVER_OBJECT_MEMORY_USAGE");
- XmlNodeList rows = ExecuteXmlaCommand(_server, commandStatement);
-
- foreach (XmlNode row in rows)
- {
- long result, label;
- if (long.TryParse(row.LastChild.InnerText, out result) && result > 0)
- {
- string objectName = "";
- string[] pathMembers = row.ChildNodes[0].InnerText.Split('.');
-
- if (pathMembers.Length > 2 && _server.Databases.ContainsName(pathMembers[2]))
- {
- //Database name identified
- objectName = pathMembers[2];
- }
- else
- {
- string firstMember = row.ChildNodes[0].InnerText;
-
- //Ignore if number or blank. Assuming this is a double counted, shared allocation.
- if (!long.TryParse(firstMember, out label) && firstMember != "")
- {
- objectName = firstMember;
- }
- }
-
- if (objectName != "" && objectName != "Global") //todo: delete global condition
- {
- if (!points.ContainsKey(objectName))
- points.Add(objectName, new SeriesPoint(xAxisLabel));
-
- points[objectName].MemoryUsedBytes += Math.Abs(result);
- }
- }
- else if (result > 0)
- {
- System.Diagnostics.Debug.WriteLine("We have a problem parsing");
- }
- }
- return points;
- }
-
- public static XmlNodeList ExecuteXmlaCommand(Microsoft.AnalysisServices.Core.Server amoServer, string commandStatement)
- {
- XmlWriter xmlWriter = amoServer.StartXmlaRequest(XmlaRequestType.Undefined);
- WriteSoapEnvelopeWithCommandStatement(xmlWriter, amoServer.SessionID, commandStatement);
- System.Xml.XmlReader xmlReader = amoServer.EndXmlaRequest();
- xmlReader.MoveToContent();
- string fullEnvelopeResponseFromServer = xmlReader.ReadOuterXml();
- xmlReader.Close();
-
- XmlDocument documentResponse = new XmlDocument();
- documentResponse.LoadXml(fullEnvelopeResponseFromServer);
- XmlNamespaceManager nsmgr = new XmlNamespaceManager(documentResponse.NameTable);
- nsmgr.AddNamespace("myns1", "urn:schemas-microsoft-com:xml-analysis");
- nsmgr.AddNamespace("myns2", "urn:schemas-microsoft-com:xml-analysis:rowset");
- XmlNodeList rows = documentResponse.SelectNodes("//myns1:ExecuteResponse/myns1:return/myns2:root/myns2:row", nsmgr);
- return rows;
- }
-
- public static void WriteSoapEnvelopeWithCommandStatement(XmlWriter xmlWriter, string sessionId, string commandStatement)
- {
- //--------------------------------------------------------------------------------
- // This is a sample of the XMLA request we'll write:
- //
- //
- //
- //
- //
- //
- //
- // ...
- //
- //
- //
- //
- //
- //
- //--------------------------------------------------------------------------------
- xmlWriter.WriteStartElement("Envelope", "http://schemas.xmlsoap.org/soap/envelope/");
- xmlWriter.WriteStartElement("Header");
- if (sessionId != null)
- {
- xmlWriter.WriteStartElement("Session", "urn:schemas-microsoft-com:xml-analysis");
- xmlWriter.WriteAttributeString("soap", "mustUnderstand", "http://schemas.xmlsoap.org/soap/envelope/", "1");
- xmlWriter.WriteAttributeString("SessionId", sessionId);
- xmlWriter.WriteEndElement(); //
- }
- xmlWriter.WriteEndElement(); //
- xmlWriter.WriteStartElement("Body");
- xmlWriter.WriteStartElement("Execute", "urn:schemas-microsoft-com:xml-analysis");
- xmlWriter.WriteStartElement("Command");
- xmlWriter.WriteElementString("Statement", commandStatement);
- xmlWriter.WriteEndElement(); //
- xmlWriter.WriteStartElement("Properties");
- xmlWriter.WriteEndElement(); //
- xmlWriter.WriteEndElement(); //
- xmlWriter.WriteEndElement(); //