-
Notifications
You must be signed in to change notification settings - Fork 24
/
DeploymentSettings.cs
118 lines (104 loc) · 5.56 KB
/
DeploymentSettings.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System;
using System.Xml;
//using Extensibility;
using EnvDTE;
using EnvDTE80;
using System.IO;
// =========================================================================================
// Class : DeploymentSettings.cs
// Author : Darren Gosbell
// Date : 18 Dec 2006
// Description: This class determines the users currently deployment settings.
// This class is a bit of a hack, it reads the deployment server settings from
// private classes
// =========================================================================================
public class DeploymentSettings
{
//// The name of the target server is figured out in the following order
//// * defaults to "localhost"
//// * can be overridden at the user's registry level with a DefaultTargetServer
//// (set as an option in BIDS)
//// * can be overridden at the user's project level (set as a project option)
private string mTargetServer = "localhost";
//// The name of the target Database is figured out in the following order
//// * defaults to the name of the project
//// * can be overridden at the user's project level (set as a project option)
private string mTargetDatabase = "";
private string mTargetCubeName = null;
public DeploymentSettings(EnvDTE.ProjectItem projectItm)
{
PopulateDeploymentSettings(projectItm.ContainingProject);
}
public DeploymentSettings(EnvDTE.Project project)
{
PopulateDeploymentSettings(project);
}
void PopulateDeploymentSettings(Project project)
{
//// A default target deployment server can be set at the user level
//// under tools options in visual studio.
SetDefaultTargetServer();
//// The default database name is the project name if it is not overriden
//// by the user settings
SetDefaultDatabaseName(project);
System.Reflection.BindingFlags flags = System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.DeclaredOnly | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance;
object oService = null;
if (project is System.IServiceProvider) //Multidimensional
{
oService = typeof(System.IServiceProvider).InvokeMember("GetService", flags, null, project, new object[] { typeof(Microsoft.DataWarehouse.Interfaces.IConfigurationSettings) });
string sTargetServer = (string)oService.GetType().InvokeMember("GetSetting", flags, null, oService, new object[] { "TargetServer" });
if (!String.IsNullOrEmpty(sTargetServer)) mTargetServer = sTargetServer;
string sTargetDatabase = (string)oService.GetType().InvokeMember("GetSetting", flags, null, oService, new object[] { "TargetDatabase" });
if (!String.IsNullOrEmpty(sTargetDatabase)) mTargetDatabase = sTargetDatabase;
}
else if (project.Object is Microsoft.AnalysisServices.VSHost.Integration.ProjectNode) //Tabular
{
//during Visual Studio debug of BIDS Helper on my laptop, this throws an HRESULT: 0x80070057 (E_INVALIDARG) which I haven't been able to fix. But this works fine when not debugging BIDS Helper
Microsoft.AnalysisServices.VSHost.Integration.ProjectNode projectNode = ((Microsoft.AnalysisServices.VSHost.Integration.ProjectNode)project.Object);
string sTargetServer = projectNode.GetProjectProperty("DeploymentServerName");
if (!String.IsNullOrEmpty(sTargetServer)) mTargetServer = sTargetServer;
string sTargetDatabase = projectNode.GetProjectProperty("DeploymentServerDatabase");
if (!String.IsNullOrEmpty(sTargetDatabase)) mTargetDatabase = sTargetDatabase;
string sTargetCubeName = projectNode.GetProjectProperty("DeploymentServerCubeName");
if (!String.IsNullOrEmpty(sTargetCubeName)) mTargetCubeName = sTargetCubeName;
}
else
{
throw new Exception("Unable to find SSAS deployment settings. Unexpected project type.");
}
}
public string TargetServer {
get { return mTargetServer; }
}
public string TargetDatabase {
get { return mTargetDatabase; }
}
public string TargetCubeName
{
get { return mTargetCubeName; }
}
private void SetDefaultTargetServer()
{
Microsoft.Win32.RegistryKey regKey;
#if SQL2016 || SQL2017
regKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\VisualStudio\14.0\Packages\{4a0c6509-bf90-43da-abee-0aba3a8527f1}\Settings\Analysis Services Project");
#elif SQL2014
regKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\VisualStudio\12.0\Packages\{4a0c6509-bf90-43da-abee-0aba3a8527f1}\Settings\Analysis Services Project");
#elif DENALI //TODO: make this dynamic depending on the version of VS so that VS2010 and VS2012 both work
regKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\VisualStudio\10.0\Packages\{4a0c6509-bf90-43da-abee-0aba3a8527f1}\Settings\Analysis Services Project");
#else
Unknown SQL Sever version. Add a new clause for regKey value
#endif
if (regKey == null) return;
string targetSvr = (string)regKey.GetValue("DefaultTargetServer");
if (!String.IsNullOrEmpty(targetSvr))
{
mTargetServer = targetSvr;
}
regKey.Close();
}
private void SetDefaultDatabaseName(Project project)
{
mTargetDatabase = project.Name;
}
}