PageRenderTime 169ms CodeModel.GetById 117ms RepoModel.GetById 2ms app.codeStats 1ms

/Main/DependencyAnalyzer2008/Program.cs

#
C# | 409 lines | 340 code | 51 blank | 18 comment | 33 complexity | ef0a87c796328624438d10b2bc203f50 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. ///
  2. /// Microsoft SQL Server 2008 Business Intelligence Metadata Reporting Samples
  3. /// Dependency Analyzer Sample
  4. ///
  5. /// Copyright (c) Microsoft Corporation. All rights reserved.
  6. ///
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Text;
  10. using CommandLine;
  11. namespace Microsoft.Samples.DependencyAnalyzer
  12. {
  13. class DependencyArguments
  14. {
  15. [Argument(ArgumentType.AtMostOnce
  16. , HelpText = "ADO.Net SqlConnection compatible connection string to dependency database location."
  17. , DefaultValue="Server=localhost;database=SSIS_Meta;Integrated Security=SSPI;"
  18. , LongName="depDb"
  19. , ShortName="d")]
  20. public string depDb = "Server=localhost;database=SSIS_Meta;Integrated Security=SSPI;";
  21. [Argument(ArgumentType.MultipleUnique
  22. , HelpText = "Root folders of file system packages."
  23. , LongName="folders"
  24. , ShortName = "f")]
  25. public string[] folders = null;
  26. [Argument(ArgumentType.MultipleUnique
  27. , HelpText = "Root folders of SSIS datbase system packages."
  28. , LongName="ssisFolders"
  29. , ShortName = "sf")]
  30. public string[] ssisFolders = null;
  31. [Argument(ArgumentType.MultipleUnique
  32. , HelpText = "SQL Servers where SSIS packages are stored. If you need to use different passwords per server, use \"Server=servername;User=username;Password=pwd\""
  33. , DefaultValue = new string[] { "localhost" }
  34. , LongName = "isDbServer"
  35. , ShortName = "i")]
  36. public string[] isDbServer = null;
  37. [Argument(ArgumentType.AtMostOnce
  38. , HelpText = "SQL Server user that has access to stored SSIS packages"
  39. , DefaultValue = null
  40. , LongName = "isDbUser"
  41. , ShortName = "iu")]
  42. public string isDbUser = null;
  43. [Argument(ArgumentType.AtMostOnce
  44. , HelpText = "SQL Server password for getting access to stored SSIS packages"
  45. , DefaultValue = null
  46. , LongName = "isDbPwd"
  47. , ShortName = "ip")]
  48. public string isDbPwd = null;
  49. [Argument(ArgumentType.MultipleUnique
  50. , HelpText = "Passwords to access SSIS Packages."
  51. , DefaultValue = null
  52. , LongName = "isPkgPwd"
  53. , ShortName = "pp")]
  54. public string[] isPkgPwd = null;
  55. [Argument(ArgumentType.MultipleUnique
  56. , HelpText = "AMO compatible connection string to Analysis Services."
  57. , DefaultValue = new string[] { "Provider=msolap;Data Source=localhost;" }
  58. , LongName = "asCon"
  59. , ShortName = "a")]
  60. public string[] asCon = null;
  61. [Argument(ArgumentType.AtMostOnce
  62. , HelpText = "Whether to recurse file system sub folders when enumerating objects."
  63. , DefaultValue = true
  64. , LongName = "recurse"
  65. , ShortName = "r")]
  66. public bool recurse = true;
  67. [Argument(ArgumentType.AtMostOnce
  68. , HelpText= "Whether to start execution without asking the user to continue."
  69. , DefaultValue=false
  70. , LongName = "batchMode"
  71. , ShortName = "b")]
  72. public bool batchMode = false;
  73. [Argument(ArgumentType.AtMostOnce
  74. , HelpText = "Whether to skip enumerating packages in SQL Server."
  75. , DefaultValue = false
  76. , LongName = "skipSQL"
  77. , ShortName = "s")]
  78. public bool skipSQL = false;
  79. [Argument(ArgumentType.AtMostOnce
  80. , HelpText = "Whether to skip enumerating packages completely."
  81. , DefaultValue = true
  82. , LongName = "skipSSIS"
  83. , ShortName = "ss")]
  84. public bool skipSSIS = true;
  85. [Argument(ArgumentType.AtMostOnce
  86. , HelpText = "Whether to skip enumerating Analysis Services objects."
  87. , DefaultValue = true
  88. , LongName = "skipAS"
  89. , ShortName = "sa")]
  90. public bool skipAS = true;
  91. [Argument(ArgumentType.AtMostOnce
  92. , HelpText = "Whether to match on database name only for connection strings."
  93. , DefaultValue = false
  94. , LongName = "matchDBOnly"
  95. , ShortName = "m")]
  96. public bool matchDBOnly = false;
  97. [Argument(ArgumentType.MultipleUnique
  98. , HelpText = "Database Prefixes to exclude when matching on database names."
  99. , LongName = "dbPrefix"
  100. , ShortName = "dp")]
  101. public string[] dbPrefix = null;
  102. [Argument(ArgumentType.AtMostOnce
  103. , HelpText = "Remove all records from the database on execution."
  104. , DefaultValue = false
  105. , LongName = "clearDatabase"
  106. , ShortName = "clearDB")]
  107. public bool clearDatabase = false;
  108. [Argument(ArgumentType.MultipleUnique
  109. , HelpText = "SqlClient SqlConnection compatible connection string to SQL Server databases to analyse.\r\nServer=(local);Database=\"AdventureWorks\";Integrated Security=SSPI"
  110. , LongName = "dbToScan"
  111. , ShortName = "d2s")]
  112. public string[] databasesToScan = null;
  113. [Argument(ArgumentType.AtMostOnce
  114. , HelpText = "Whether to skip enumerating Reporting Services."
  115. , DefaultValue = true
  116. , LongName = "skipRS"
  117. , ShortName = "sr")]
  118. public bool skipReportingServices = true;
  119. [Argument(ArgumentType.MultipleUnique
  120. , HelpText = "Reporting Services URL with ? and Path to Enumerate\r\neg. http://localhost/reportserver?/"
  121. , LongName = "ReportUrl"
  122. , ShortName = "rpt")]
  123. public string[] reportURLs = null;
  124. [Argument(ArgumentType.AtMostOnce
  125. , HelpText = "Whether to store object names as three part names [dbname].[schema].[object]"
  126. , LongName = "threePartNames"
  127. , ShortName = "tpn"
  128. , DefaultValue = false)]
  129. public bool storeThreePartNames = false;
  130. }
  131. class Program
  132. {
  133. static void Main(string[] args)
  134. {
  135. string commandLineArguments = "";
  136. foreach (string tmpString in args)
  137. {
  138. commandLineArguments += tmpString + " ";
  139. }
  140. // parse the command line
  141. DependencyArguments dependencyArguments = new DependencyArguments();
  142. if (CommandLine.Parser.ParseArgumentsWithUsage(args, dependencyArguments))
  143. {
  144. try
  145. {
  146. if (dependencyArguments.batchMode == false && dependencyArguments.clearDatabase == true)
  147. {
  148. Console.WriteLine("This tool will delete existing information in the dependency database!");
  149. Console.Write("Press any key to begin...");
  150. Console.ReadKey(true);
  151. Console.WriteLine("started");
  152. }
  153. // open a connection to the repository
  154. Repository repository = InitializeRepository(dependencyArguments, commandLineArguments);
  155. if (repository == null)
  156. {
  157. Console.WriteLine(String.Format("Unable to open database on connection string '{0}'. Exiting...", dependencyArguments.depDb));
  158. return;
  159. }
  160. EnumerateRelational(dependencyArguments, repository);
  161. EnumerateFile(dependencyArguments, repository);
  162. EnumerateColumn(dependencyArguments, repository);
  163. EnumerateReport(dependencyArguments, repository);
  164. if (dependencyArguments.databasesToScan != null)
  165. {
  166. EnumerateDatabase(dependencyArguments, repository);
  167. }
  168. if (dependencyArguments.skipSSIS == false)
  169. {
  170. EnumerateSSIS(dependencyArguments, repository);
  171. }
  172. if (dependencyArguments.skipAS == false)
  173. {
  174. EnumerateSSAS(dependencyArguments, repository);
  175. }
  176. if (dependencyArguments.skipReportingServices == false)
  177. {
  178. EnumerateSSRS(dependencyArguments, repository);
  179. }
  180. Commit(repository);
  181. }
  182. catch (System.Exception ex)
  183. {
  184. Console.Write(string.Format("Unexpected error occurred: {0}\r\nStack Trace:\r\n{1}", ex.Message, ex.StackTrace));
  185. }
  186. if (dependencyArguments.batchMode == false)
  187. {
  188. Console.Write("Press any key to continue...");
  189. Console.ReadKey(true);
  190. Console.WriteLine("done");
  191. }
  192. }
  193. }
  194. private static void EnumerateReport(DependencyArguments dependencyArguments, Repository repository)
  195. {
  196. ReportEnumerator enumerator = new ReportEnumerator();
  197. if (enumerator.Initialize(repository))
  198. {
  199. // nothing to enumerate right now, initialize call should have created the relational types
  200. // in the repository
  201. }
  202. }
  203. public static void Commit(Repository repository)
  204. {
  205. Console.Write("Committing analysis information to database...");
  206. repository.Commit();
  207. Console.WriteLine("Completed.");
  208. }
  209. private static void EnumerateRelational(DependencyArguments dependencyArguments, Repository repository)
  210. {
  211. RelationalEnumerator enumerator = new RelationalEnumerator();
  212. if (enumerator.Initialize(repository))
  213. {
  214. // nothing to enumerate right now, initialize call should have created the relational types
  215. // in the repository
  216. }
  217. }
  218. private static void EnumerateFile(DependencyArguments dependencyArguments, Repository repository)
  219. {
  220. FileEnumerator enumerator = new FileEnumerator();
  221. if (enumerator.Initialize(repository))
  222. {
  223. // nothing to enumerate right now, initialize call should have created the relational types
  224. // in the repository
  225. }
  226. }
  227. private static void EnumerateColumn(DependencyArguments dependencyArguments, Repository repository)
  228. {
  229. ColumnEnumerator enumerator = new ColumnEnumerator();
  230. if (enumerator.Initialize(repository))
  231. {
  232. // nothing to enumerate right now, initialize call should have created the relational types
  233. // in the repository
  234. }
  235. }
  236. private static void EnumerateDatabase(DependencyArguments dependencyArguments, Repository repository)
  237. {
  238. // ToDo: Code the call to DatabaseEnumerator()...
  239. SQLDBEnumerator enumerator = new SQLDBEnumerator();
  240. if (enumerator.Initialize(repository))
  241. {
  242. foreach (string dbConnection in dependencyArguments.databasesToScan)
  243. {
  244. Console.WriteLine("Enumerating Database metadata for {0}.", dbConnection);
  245. enumerator.EnumerateDatabase(dbConnection, dependencyArguments.storeThreePartNames);
  246. }
  247. }
  248. }
  249. private static void EnumerateSSIS(DependencyArguments dependencyArguments, Repository repository)
  250. {
  251. SSISEnumerator enumerator = new SSISEnumerator();
  252. if (enumerator.Initialize(repository))
  253. {
  254. Console.WriteLine("Enumerating File System Integration Services metadata.");
  255. enumerator.EnumerateFileSystemPackages(dependencyArguments.folders, dependencyArguments.recurse, dependencyArguments.storeThreePartNames, dependencyArguments.isPkgPwd);
  256. if (dependencyArguments.skipSQL == false)
  257. {
  258. Console.WriteLine("Enumerating Integration Services metadata.");
  259. foreach (string dbServer in dependencyArguments.isDbServer)
  260. {
  261. if (dbServer.Contains(";"))
  262. {
  263. String dbUser = null;
  264. String dbPass = null;
  265. String ssisServer = string.Empty;
  266. int posServer = dbServer.IndexOf("server=", 0, StringComparison.InvariantCultureIgnoreCase) + "server=".Length;
  267. int posUser = dbServer.IndexOf("user=", 0, StringComparison.InvariantCultureIgnoreCase);
  268. int posPass = dbServer.IndexOf("password=", 0, StringComparison.InvariantCultureIgnoreCase);
  269. ssisServer = dbServer.Substring(posServer, posUser - posServer - 1);
  270. posUser += "user=".Length;
  271. dbUser = dbServer.Substring(posUser, posPass - posUser - 1);
  272. posPass += "password=".Length;
  273. dbPass = dbServer.Substring(posPass, dbServer.Length - posPass);
  274. if (String.IsNullOrEmpty(dbUser))
  275. {
  276. dbUser = null;
  277. dbPass = null;
  278. }
  279. enumerator.EnumerateSqlPackages(ssisServer, dbUser, dbPass, dependencyArguments.ssisFolders, dependencyArguments.storeThreePartNames, dependencyArguments.isPkgPwd);
  280. }
  281. else
  282. enumerator.EnumerateSqlPackages(dbServer, dependencyArguments.isDbUser, dependencyArguments.isDbPwd, dependencyArguments.ssisFolders, dependencyArguments.storeThreePartNames, dependencyArguments.isPkgPwd);
  283. }
  284. }
  285. }
  286. }
  287. private static void EnumerateSSAS(DependencyArguments dependencyArguments, Repository repository)
  288. {
  289. Console.WriteLine("Enumerating Analysis Services metadata.");
  290. try
  291. {
  292. SSASEnumerator enumerator = new SSASEnumerator();
  293. if (enumerator.Initialize(repository))
  294. {
  295. foreach(string connStr in dependencyArguments.asCon)
  296. enumerator.EnumerateServer(connStr, dependencyArguments.storeThreePartNames);
  297. }
  298. }
  299. catch (System.Exception ex)
  300. {
  301. Console.WriteLine(string.Format("Error occurred: {0}", ex.Message));
  302. }
  303. }
  304. private static void EnumerateSSRS(DependencyArguments dependencyArguments, Repository repository)
  305. {
  306. Console.WriteLine("Enumerating Reporting Services metadata.");
  307. try
  308. {
  309. SSRSEnumerator enumerator = new SSRSEnumerator();
  310. if (enumerator.Initialize(repository))
  311. {
  312. foreach (string connStr in dependencyArguments.reportURLs)
  313. enumerator.EnumerateReportingServer(connStr, dependencyArguments.recurse, dependencyArguments.storeThreePartNames);
  314. }
  315. }
  316. catch (System.Exception ex)
  317. {
  318. Console.WriteLine(string.Format("Error occurred: {0}", ex.Message));
  319. }
  320. }
  321. private static Repository InitializeRepository(DependencyArguments dependencyArguments, string commandLineArguments)
  322. {
  323. Repository repository = new Repository(dependencyArguments.depDb);
  324. try
  325. {
  326. repository.Open();
  327. // check if this is a valid repository database
  328. if (repository.IsValidRepository() == false)
  329. {
  330. repository.CreateRepository();
  331. }
  332. if (dependencyArguments.clearDatabase)
  333. {
  334. repository.DeleteExistingRepository();
  335. }
  336. else
  337. {
  338. repository.LoadExisingRepository();
  339. }
  340. if (commandLineArguments.Length > 512)
  341. repository.InitialiseRepository(commandLineArguments.Substring(0, 512));
  342. else
  343. repository.InitialiseRepository(commandLineArguments);
  344. repository.DatabaseNameOnlyCompare = dependencyArguments.matchDBOnly;
  345. foreach (string dbPrefix in dependencyArguments.dbPrefix)
  346. {
  347. repository.DatabasePrefixExclusions.Add(dbPrefix);
  348. }
  349. return repository;
  350. }
  351. catch (Exception ex)
  352. {
  353. Console.WriteLine(string.Format("Unable to connect to Dependency Database: {0}\r\nMessage:\r\n{1}", dependencyArguments.depDb, ex.Message));
  354. return null;
  355. }
  356. }
  357. }
  358. }