PageRenderTime 59ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/Main/DependencyAnalyzer2008/Repository.cs

#
C# | 2072 lines | 1696 code | 152 blank | 224 comment | 132 complexity | 0d205d71d847239c0165eb30d1bc8448 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. ///
  2. /// Microsoft SQL Server 2005 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 System.Data.SqlClient;
  11. using System.Data;
  12. using System.Data.Common;
  13. using System.Data.OleDb;
  14. using System.Diagnostics;
  15. namespace Microsoft.Samples.DependencyAnalyzer
  16. {
  17. class Repository : IDisposable
  18. {
  19. #if SQL2005
  20. public const string OLEDBGuid = "{9B5D63AB-A629-4A56-9F3E-B1044134B649}";
  21. #else
  22. public const string OLEDBGuid = "{3BA51769-6C3C-46B2-85A1-81E58DB7DAE1}";
  23. #endif
  24. internal class Domains
  25. {
  26. internal const string SSIS = "SSIS";
  27. internal const string SSAS = "SSAS";
  28. internal const string SSRS = "SSRS";
  29. internal const string Relational = "RDBMS";
  30. internal const string File = "FILE";
  31. internal const string Other = "Other";
  32. internal const string Column = "COLUMN";
  33. }
  34. /// <summary>
  35. /// Stores the current Database Version
  36. /// </summary>
  37. const int _dbVersion = 6;
  38. /// <summary>
  39. /// repository tables
  40. /// </summary>
  41. DataTable objectTable = new DataTable("Objects");
  42. DataTable objectDependenciesTable = new DataTable("ObjectDependencies");
  43. DataTable objectAttributesTable = new DataTable("ObjectAttributes");
  44. DataTable objectTypesTable = new DataTable("ObjectTypes");
  45. DataTable runScanTable = new DataTable("RunScan");
  46. internal class DependencyTypes
  47. {
  48. internal const string Containment = "Containment";
  49. internal const string Lineage = "Map";
  50. internal const string Use = "Use";
  51. }
  52. internal class ConnectionStringProperties
  53. {
  54. internal const string DataSource = "Data Source";
  55. internal const string Server = "Server";
  56. internal const string Location = "Location";
  57. internal const string Provider = "Provider";
  58. internal const string Database = "Database";
  59. internal const string InitialCatalog = "Initial Catalog";
  60. }
  61. internal class Attributes
  62. {
  63. internal const string ConnectionString = "ConnectionString";
  64. internal const string ConnectionServer = "Server";
  65. internal const string ConnectionDatabase = "Database";
  66. internal const string QueryDefinition = "QueryDefinition";
  67. }
  68. private SqlConnection repositoryConnection;
  69. /// <summary>
  70. /// the root of the containments
  71. /// </summary>
  72. private int rootRepositoryObjectID = 0;
  73. public int RootRepositoryObjectID
  74. {
  75. get
  76. {
  77. return rootRepositoryObjectID;
  78. }
  79. set
  80. {
  81. rootRepositoryObjectID = value;
  82. }
  83. }
  84. public Repository(string connectionString)
  85. {
  86. repositoryConnection = new SqlConnection();
  87. repositoryConnection.ConnectionString = connectionString;
  88. databasePrefixExclusions = new List<string>();
  89. }
  90. private int runKeyValue = 0;
  91. public int RunKeyValue
  92. {
  93. get
  94. {
  95. return this.runKeyValue;
  96. }
  97. set
  98. {
  99. this.runKeyValue = value;
  100. }
  101. }
  102. private bool databaseNameOnlyCompare = false;
  103. public bool DatabaseNameOnlyCompare
  104. {
  105. get
  106. {
  107. return databaseNameOnlyCompare;
  108. }
  109. set
  110. {
  111. databaseNameOnlyCompare = value;
  112. }
  113. }
  114. private List<string> databasePrefixExclusions;
  115. public List<string> DatabasePrefixExclusions
  116. {
  117. get
  118. {
  119. return databasePrefixExclusions;
  120. }
  121. }
  122. public void Open()
  123. {
  124. repositoryConnection.Open();
  125. // TODO:
  126. // Reset the rootRepositoryObjectID to the maximum ObjectID + 1 (if > 0 records)...
  127. DataColumn column = objectTable.Columns.Add("RunKey");
  128. column.DataType = typeof(int);
  129. column = objectTable.Columns.Add("ObjectKey");
  130. column.AutoIncrement = true;
  131. column.AutoIncrementSeed = 0; // ToDo: reset this to correct value...
  132. column.DataType = typeof(int);
  133. objectTable.Columns.Add("ObjectName");
  134. objectTable.Columns.Add("ObjectTypeString");
  135. objectTable.Columns.Add("ObjectDesc");
  136. column = objectDependenciesTable.Columns.Add("RunKey");
  137. column.DataType = typeof(int);
  138. column = objectDependenciesTable.Columns.Add("SrcObjectKey");
  139. column.DataType = typeof(int);
  140. column = objectDependenciesTable.Columns.Add("TgtObjectKey");
  141. column.DataType = typeof(int);
  142. column = objectDependenciesTable.Columns.Add("DependencyType");
  143. column = objectAttributesTable.Columns.Add("RunKey");
  144. column.DataType = typeof(int);
  145. column = objectAttributesTable.Columns.Add("ObjectKey");
  146. column.DataType = typeof(int);
  147. objectAttributesTable.Columns.Add("ObjectAttrName");
  148. objectAttributesTable.Columns.Add("ObjectAttrValue");
  149. objectTypesTable.Columns.Add("ObjectTypeID");
  150. objectTypesTable.Columns.Add("ObjectTypeName");
  151. objectTypesTable.Columns.Add("ObjectTypeDesc");
  152. objectTypesTable.Columns.Add("ObjectMetaType"); // todo: populate this column
  153. objectTypesTable.Columns.Add("Domain");
  154. column = runScanTable.Columns.Add("RunKey");
  155. column.AutoIncrement = true;
  156. column.AutoIncrementSeed = 0; // ToDo: reset this to correct value...
  157. column.DataType = typeof(int);
  158. column = runScanTable.Columns.Add("RunDate");
  159. column.DataType = typeof(DateTime);
  160. column = runScanTable.Columns.Add("RunCommand");
  161. }
  162. public void Close()
  163. {
  164. repositoryConnection.Close();
  165. }
  166. public void Dispose()
  167. {
  168. repositoryConnection.Dispose();
  169. }
  170. public bool IsValidRepository()
  171. {
  172. DataTable schemaInfo = repositoryConnection.GetSchema("Tables");
  173. DataRow[] rows = schemaInfo.Select(string.Format("TABLE_NAME = 'RunScan'"));
  174. if (rows.Length == 0)
  175. {
  176. return false;
  177. }
  178. rows = schemaInfo.Select(string.Format("TABLE_NAME = 'LookupConnectionID'"));
  179. if (rows.Length == 0)
  180. {
  181. return false;
  182. }
  183. rows = schemaInfo.Select(string.Format("TABLE_NAME = 'Version'"));
  184. if (rows.Length == 0)
  185. {
  186. return false;
  187. }
  188. rows = schemaInfo.Select(string.Format("TABLE_NAME = 'ObjectTypes'"));
  189. if (rows.Length == 0)
  190. {
  191. return false;
  192. }
  193. rows = schemaInfo.Select(string.Format("TABLE_NAME = 'Objects'"));
  194. if (rows.Length == 0)
  195. {
  196. return false;
  197. }
  198. rows = schemaInfo.Select(string.Format("TABLE_NAME = 'ObjectDependencies'"));
  199. if (rows.Length == 0)
  200. {
  201. return false;
  202. }
  203. rows = schemaInfo.Select(string.Format("TABLE_NAME = 'ObjectAttributes'"));
  204. if (rows.Length == 0)
  205. {
  206. return false;
  207. }
  208. using (SqlCommand sqlCommand = new SqlCommand("SELECT MAX(VersionID) FROM [dbo].[Version]", repositoryConnection))
  209. {
  210. using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
  211. {
  212. sqlReader.Read();
  213. if (System.Convert.ToInt32(sqlReader[0]) != _dbVersion)
  214. {
  215. return false;
  216. }
  217. }
  218. }
  219. return true;
  220. }
  221. public void Commit()
  222. {
  223. // write each data table to the database
  224. SqlBulkCopy bulkCopy = new SqlBulkCopy(repositoryConnection);
  225. bulkCopy.DestinationTableName = "RunScan";
  226. bulkCopy.WriteToServer(runScanTable);
  227. bulkCopy.DestinationTableName = "Objects";
  228. bulkCopy.WriteToServer(objectTable);
  229. bulkCopy.DestinationTableName = "ObjectDependencies";
  230. bulkCopy.WriteToServer(objectDependenciesTable);
  231. bulkCopy.DestinationTableName = "ObjectAttributes";
  232. bulkCopy.WriteToServer(objectAttributesTable);
  233. bulkCopy.DestinationTableName = "ObjectTypes";
  234. bulkCopy.WriteToServer(objectTypesTable);
  235. bulkCopy.Close();
  236. }
  237. public void CreateRepository()
  238. {
  239. int dbVersion = 0;
  240. int sqlVersion = 9;
  241. DataTable schemaInfo = repositoryConnection.GetSchema("Tables");
  242. DataRow[] rows = schemaInfo.Select(string.Format("TABLE_NAME = 'Version'"));
  243. if (rows.Length != 0)
  244. {
  245. using (SqlCommand sqlCommand = new SqlCommand("SELECT MAX(VersionID) FROM [dbo].[Version]", repositoryConnection))
  246. {
  247. using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
  248. {
  249. sqlReader.Read();
  250. dbVersion = System.Convert.ToInt32(sqlReader[0]);
  251. }
  252. }
  253. }
  254. using (SqlCommand sqlCommand = new SqlCommand("select left(cast(serverproperty('productversion') as nvarchar(128)), charindex(cast(serverproperty('productversion') as nvarchar(128)), '.') + 1)", repositoryConnection))
  255. {
  256. using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
  257. {
  258. sqlReader.Read();
  259. sqlVersion = System.Convert.ToInt32(sqlReader[0]);
  260. }
  261. }
  262. if (dbVersion == 0)
  263. {
  264. #region dbVersion 0
  265. // The following database create will create a Version 4 database.
  266. // If the database is prior to Version 4 (No Version Table) then it will be dropped.
  267. // This is OK, as the previous version didn't support history!
  268. using (SqlCommand sqlCommand = repositoryConnection.CreateCommand())
  269. {
  270. sqlCommand.CommandText = "SET ANSI_NULLS ON";
  271. sqlCommand.ExecuteNonQuery();
  272. sqlCommand.CommandText = "SET QUOTED_IDENTIFIER ON";
  273. sqlCommand.ExecuteNonQuery();
  274. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Version]') AND type in (N'U'))\r\n" +
  275. "BEGIN\r\n" +
  276. " IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectAttributes_Objects]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectAttributes]'))\r\n" +
  277. " ALTER TABLE [dbo].[ObjectAttributes] DROP CONSTRAINT [FK_ObjectAttributes_Objects]\r\n" +
  278. " IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectDependencies_Objects]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]'))\r\n" +
  279. " ALTER TABLE [dbo].[ObjectDependencies] DROP CONSTRAINT [FK_ObjectDependencies_Objects]\r\n" +
  280. " IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectDependencies_Objects1]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]'))\r\n" +
  281. " ALTER TABLE [dbo].[ObjectDependencies] DROP CONSTRAINT [FK_ObjectDependencies_Objects1]\r\n" +
  282. " IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Objects_RunScan]') AND parent_object_id = OBJECT_ID(N'[dbo].[Objects]'))\r\n" +
  283. " ALTER TABLE [dbo].[Objects] DROP CONSTRAINT [FK_Objects_RunScan]\r\n" +
  284. " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ObjectAttributes]') AND type in (N'U'))\r\n" +
  285. " DROP TABLE [dbo].[ObjectAttributes]\r\n" +
  286. " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]') AND type in (N'U'))\r\n" +
  287. " DROP TABLE [dbo].[ObjectDependencies]\r\n" +
  288. " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Objects]') AND type in (N'U'))\r\n" +
  289. " DROP TABLE [dbo].[Objects]\r\n" +
  290. " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ObjectTypes]') AND type in (N'U'))\r\n" +
  291. "\r\n" +
  292. "DROP TABLE [dbo].[ObjectTypes]\r\n" +
  293. " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[RunScan]') AND type in (N'U'))\r\n" +
  294. " DROP TABLE [dbo].[RunScan]\r\n" +
  295. " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Audit]') AND type in (N'U'))\r\n" +
  296. " DROP TABLE [dbo].[Audit]\r\n" +
  297. " IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[LookupConnectionID]') AND type in (N'U'))\r\n" +
  298. " DROP TABLE [dbo].[LookupConnectionID]\r\n" +
  299. "END";
  300. sqlCommand.ExecuteNonQuery();
  301. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[LookupConnectionID]') AND type in (N'U'))\r\n" +
  302. "BEGIN\r\n" +
  303. "CREATE TABLE [dbo].[LookupConnectionID](\r\n" +
  304. " [ConnectionGUID] [nvarchar](1000) NOT NULL,\r\n" +
  305. " [ConnectionDescription] [nvarchar](1000) NOT NULL\r\n" +
  306. ") ON [PRIMARY]\r\n" +
  307. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{5F2826BC-648B-4f3e-B930-587F4EF331D4}', N'ODBC 2005')\r\n" +
  308. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{9B5D63AB-A629-4A56-9F3E-B1044134B649}', N'OLEDB 2005')\r\n" +
  309. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{72692A11-F5CC-42b8-869D-84E7C8E48B14}', N'ADO.NET 2005')\r\n" +
  310. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{4CF60474-BA87-4ac2-B9F3-B7B9179D4183}', N'ADO 2005')\r\n" +
  311. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'RelationalDataSource', N'olap relational data source')\r\n" +
  312. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{09AD884B-0248-42C1-90E6-897D1CD16D37}', N'ODBC 2008')\r\n" +
  313. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{3BA51769-6C3C-46B2-85A1-81E58DB7DAE1}', N'OLEDB 2008')\r\n" +
  314. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{A1100566-934E-470C-9ECE-0D5EB920947D}', N'ADO 2008')\r\n" +
  315. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{894CAE21-539F-46EB-B36D-9381163B6C4E}', N'ADO.Net 2008')\r\n" +
  316. "END\r\n";
  317. sqlCommand.ExecuteNonQuery();
  318. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Audit]') AND type in (N'U'))\r\n" +
  319. "BEGIN\r\n" +
  320. "CREATE TABLE [dbo].[Audit](\r\n" +
  321. " [PackageGUID] [varchar](50) NOT NULL,\r\n" +
  322. " [DataFlowTaskID] [int] NOT NULL,\r\n" +
  323. " [SourceReadRows] [int] NULL,\r\n" +
  324. " [SourceReadErrorRows] [int] NULL,\r\n" +
  325. " [CleansedRows] [int] NULL,\r\n" +
  326. " [TargetWriteRows] [int] NULL,\r\n" +
  327. " [TargetWriteErrorRows] [int] NULL,\r\n" +
  328. " [Comment] [nvarchar](255) NULL\r\n" +
  329. ") ON [PRIMARY]\r\n" +
  330. "END\r\n";
  331. sqlCommand.ExecuteNonQuery();
  332. if (sqlVersion > 9)
  333. {
  334. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Version]') AND type in (N'U'))\r\n" +
  335. "BEGIN\r\n" +
  336. "CREATE TABLE [dbo].[Version](\r\n" +
  337. " [VersionID] [int] NOT NULL,\r\n" +
  338. " [InstallDate] [date] NOT NULL,\r\n" +
  339. " CONSTRAINT [PK_Version] PRIMARY KEY CLUSTERED \r\n" +
  340. "(\r\n" +
  341. " [VersionID] ASC\r\n" +
  342. ")WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]\r\n" +
  343. ") ON [PRIMARY]\r\n" +
  344. "END\r\n";
  345. sqlCommand.ExecuteNonQuery();
  346. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[RunScan]') AND type in (N'U'))\r\n" +
  347. "BEGIN\r\n" +
  348. "CREATE TABLE [dbo].[RunScan](\r\n" +
  349. " [RunKey] [int] NOT NULL,\r\n" +
  350. " [RunDate] [datetime2](7) NOT NULL,\r\n" +
  351. " [RunCommand] [nvarchar](512) NOT NULL,\r\n" +
  352. " CONSTRAINT [PK_RunScan] PRIMARY KEY CLUSTERED \r\n" +
  353. "(\r\n" +
  354. " [RunKey] ASC\r\n" +
  355. ")WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]\r\n" +
  356. ") ON [PRIMARY]\r\n" +
  357. "END\r\n" +
  358. "IF NOT EXISTS (SELECT * FROM ::fn_listextendedproperty(N'MS_Description' , N'SCHEMA',N'dbo', N'TABLE',N'RunScan', NULL,NULL))\r\n" +
  359. "EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Stores a row for each execution of the DependancyAnalyzer program' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'RunScan'\r\n" +
  360. "";
  361. }
  362. else
  363. {
  364. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Version]') AND type in (N'U'))\r\n" +
  365. "BEGIN\r\n" +
  366. "CREATE TABLE [dbo].[Version](\r\n" +
  367. " [VersionID] [int] NOT NULL,\r\n" +
  368. " [InstallDate] [datetime] NOT NULL,\r\n" +
  369. " CONSTRAINT [PK_Version] PRIMARY KEY CLUSTERED \r\n" +
  370. "(\r\n" +
  371. " [VersionID] ASC\r\n" +
  372. ")WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]\r\n" +
  373. ") ON [PRIMARY]\r\n" +
  374. "END\r\n";
  375. sqlCommand.ExecuteNonQuery();
  376. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[RunScan]') AND type in (N'U'))\r\n" +
  377. "BEGIN\r\n" +
  378. "CREATE TABLE [dbo].[RunScan](\r\n" +
  379. " [RunKey] [int] NOT NULL,\r\n" +
  380. " [RunDate] [datetime] NOT NULL,\r\n" +
  381. " [RunCommand] [nvarchar](512) NOT NULL,\r\n" +
  382. " CONSTRAINT [PK_RunScan] PRIMARY KEY CLUSTERED \r\n" +
  383. "(\r\n" +
  384. " [RunKey] ASC\r\n" +
  385. ")WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]\r\n" +
  386. ") ON [PRIMARY]\r\n" +
  387. "END\r\n" +
  388. "IF NOT EXISTS (SELECT * FROM ::fn_listextendedproperty(N'MS_Description' , N'SCHEMA',N'dbo', N'TABLE',N'RunScan', NULL,NULL))\r\n" +
  389. "EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Stores a row for each execution of the DependancyAnalyzer program' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'RunScan'\r\n" +
  390. "";
  391. }
  392. sqlCommand.ExecuteNonQuery();
  393. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ObjectTypes]') AND type in (N'U'))\r\n" +
  394. "BEGIN\r\n" +
  395. "CREATE TABLE [dbo].[ObjectTypes](\r\n" +
  396. " [ObjectTypeKey] [nvarchar](255) NOT NULL,\r\n" +
  397. " [ObjectTypeName] [nvarchar](255) NULL,\r\n" +
  398. " [ObjectTypeDesc] [nvarchar](2000) NULL,\r\n" +
  399. " [ObjectMetaType] [nvarchar](255) NULL,\r\n" +
  400. " [Domain] [nvarchar](50) NULL\r\n" +
  401. ") ON [PRIMARY]\r\n" +
  402. "END\r\n" +
  403. "";
  404. sqlCommand.ExecuteNonQuery();
  405. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Objects]') AND type in (N'U'))\r\n" +
  406. "BEGIN\r\n" +
  407. "CREATE TABLE [dbo].[Objects](\r\n" +
  408. " [RunKey] [int] NOT NULL,\r\n" +
  409. " [ObjectKey] [int] NOT NULL,\r\n" +
  410. " [ObjectName] [nvarchar](1000) NULL,\r\n" +
  411. " [ObjectTypeString] [nvarchar](1000) NOT NULL,\r\n" +
  412. " [ObjectDesc] [nvarchar](1000) NULL,\r\n" +
  413. " CONSTRAINT [PK_Objects] PRIMARY KEY CLUSTERED \r\n" +
  414. "(\r\n" +
  415. " [RunKey] ASC,\r\n" +
  416. " [ObjectKey] ASC\r\n" +
  417. ")WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]\r\n" +
  418. ") ON [PRIMARY]\r\n" +
  419. "END\r\n" +
  420. "";
  421. sqlCommand.ExecuteNonQuery();
  422. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]') AND type in (N'U'))\r\n" +
  423. "BEGIN\r\n" +
  424. "CREATE TABLE [dbo].[ObjectDependencies](\r\n" +
  425. " [RunKey] [int] NOT NULL,\r\n" +
  426. " [SrcObjectKey] [int] NOT NULL,\r\n" +
  427. " [TgtObjectKey] [int] NOT NULL,\r\n" +
  428. " [DependencyType] [nvarchar](50) NOT NULL,\r\n" +
  429. " CONSTRAINT [PK_ObjectDependencies] PRIMARY KEY CLUSTERED \r\n" +
  430. "(\r\n" +
  431. " [RunKey] ASC,\r\n" +
  432. " [SrcObjectKey] ASC,\r\n" +
  433. " [TgtObjectKey] ASC,\r\n" +
  434. " [DependencyType] ASC\r\n" +
  435. ")WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]\r\n" +
  436. ") ON [PRIMARY]\r\n" +
  437. "END\r\n" +
  438. "";
  439. sqlCommand.ExecuteNonQuery();
  440. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ObjectAttributes]') AND type in (N'U'))\r\n" +
  441. "BEGIN\r\n" +
  442. "CREATE TABLE [dbo].[ObjectAttributes](\r\n" +
  443. " [RunKey] [int] NOT NULL,\r\n" +
  444. " [ObjectKey] [int] NOT NULL,\r\n" +
  445. " [ObjectAttrName] [nvarchar](1000) NOT NULL,\r\n" +
  446. " [ObjectAttrValue] [nvarchar](max) NOT NULL\r\n" +
  447. ") ON [PRIMARY]\r\n" +
  448. "END\r\n" +
  449. "";
  450. sqlCommand.ExecuteNonQuery();
  451. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectAttributes_Objects]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectAttributes]'))\r\n" +
  452. "ALTER TABLE [dbo].[ObjectAttributes] WITH CHECK ADD CONSTRAINT [FK_ObjectAttributes_Objects] FOREIGN KEY([RunKey], [ObjectKey])\r\n" +
  453. "REFERENCES [dbo].[Objects] ([RunKey], [ObjectKey])\r\n" +
  454. "IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectAttributes_Objects]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectAttributes]'))\r\n" +
  455. "ALTER TABLE [dbo].[ObjectAttributes] CHECK CONSTRAINT [FK_ObjectAttributes_Objects]\r\n" +
  456. "IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectDependencies_Objects]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]'))\r\n" +
  457. "ALTER TABLE [dbo].[ObjectDependencies] WITH CHECK ADD CONSTRAINT [FK_ObjectDependencies_Objects] FOREIGN KEY([RunKey], [SrcObjectKey])\r\n" +
  458. "REFERENCES [dbo].[Objects] ([RunKey], [ObjectKey])\r\n" +
  459. "IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectDependencies_Objects]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]'))\r\n" +
  460. "ALTER TABLE [dbo].[ObjectDependencies] CHECK CONSTRAINT [FK_ObjectDependencies_Objects]\r\n" +
  461. "IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectDependencies_Objects1]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]'))\r\n" +
  462. "ALTER TABLE [dbo].[ObjectDependencies] WITH CHECK ADD CONSTRAINT [FK_ObjectDependencies_Objects1] FOREIGN KEY([RunKey], [TgtObjectKey])\r\n" +
  463. "REFERENCES [dbo].[Objects] ([RunKey], [ObjectKey])\r\n" +
  464. "IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjectDependencies_Objects1]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjectDependencies]'))\r\n" +
  465. "ALTER TABLE [dbo].[ObjectDependencies] CHECK CONSTRAINT [FK_ObjectDependencies_Objects1]\r\n" +
  466. "IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Objects_RunScan]') AND parent_object_id = OBJECT_ID(N'[dbo].[Objects]'))\r\n" +
  467. "ALTER TABLE [dbo].[Objects] WITH CHECK ADD CONSTRAINT [FK_Objects_RunScan] FOREIGN KEY([RunKey])\r\n" +
  468. "REFERENCES [dbo].[RunScan] ([RunKey])\r\n" +
  469. "IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Objects_RunScan]') AND parent_object_id = OBJECT_ID(N'[dbo].[Objects]'))\r\n" +
  470. "ALTER TABLE [dbo].[Objects] CHECK CONSTRAINT [FK_Objects_RunScan]\r\n" +
  471. "";
  472. sqlCommand.ExecuteNonQuery();
  473. sqlCommand.CommandText = "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[Connections]'))\r\n" +
  474. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[Connections]\r\n" +
  475. "AS SELECT 1 AS Column1' \r\n" +
  476. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[SourceTables]'))\r\n" +
  477. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[SourceTables]\r\n" +
  478. "AS SELECT 1 AS Column1' \r\n" +
  479. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[ObjectRelationships]'))\r\n" +
  480. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[ObjectRelationships]\r\n" +
  481. "AS\r\n" +
  482. "SELECT 1 AS Column1' \r\n" +
  483. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[LineageMap]'))\r\n" +
  484. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[LineageMap]\r\n" +
  485. "AS\r\n" +
  486. "SELECT 1 AS Column1' \r\n" +
  487. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[TargetTables]'))\r\n" +
  488. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[TargetTables]\r\n" +
  489. "AS\r\n" +
  490. "SELECT 1 AS Column1' \r\n" +
  491. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[DataFlows]'))\r\n" +
  492. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[DataFlows]\r\n" +
  493. "AS\r\n" +
  494. "SELECT 1 AS Column1' \r\n" +
  495. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[WalkSources]'))\r\n" +
  496. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[WalkSources]\r\n" +
  497. "AS\r\n" +
  498. "SELECT 1 AS Column1' \r\n" +
  499. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[Packages]'))\r\n" +
  500. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[Packages]\r\n" +
  501. "AS\r\n" +
  502. "SELECT 1 AS Column1' \r\n" +
  503. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vAudit]'))\r\n" +
  504. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[vAudit]\r\n" +
  505. "AS\r\n" +
  506. "SELECT 1 AS Column1' \r\n" +
  507. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[TableLineageMap]'))\r\n" +
  508. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[TableLineageMap]\r\n" +
  509. "AS\r\n" +
  510. "SELECT 1 AS Column1' \r\n" +
  511. "IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[ConnectionsMapping]'))\r\n" +
  512. "EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[ConnectionsMapping]\r\n" +
  513. "AS\r\n" +
  514. "SELECT 1 AS Column1' \r\n";
  515. sqlCommand.ExecuteNonQuery();
  516. sqlCommand.CommandText = "ALTER VIEW [dbo].[TargetTables]\r\n" +
  517. "AS\r\n" +
  518. "SELECT\r\n" +
  519. " Objects.RunKey,\r\n" +
  520. " ObjectDependencies.DependencyType,\r\n" +
  521. " Objects.ObjectKey,\r\n" +
  522. " Objects.ObjectName,\r\n" +
  523. " Objects.ObjectDesc,\r\n" +
  524. " ObjectDependencies.SrcObjectKey AS TgtComponentKey,\r\n" +
  525. " TargetObjects.ObjectName AS TargetComponentName,\r\n" +
  526. " TargetObjects.ObjectDesc AS TargetComponentDesc,\r\n" +
  527. " OD_DataFlow.SrcObjectKey AS DataFlowID,\r\n" +
  528. " OD_DestConnection.SrcObjectKey AS DestinationConnectionID\r\n" +
  529. "FROM dbo.Objects\r\n" +
  530. "INNER JOIN dbo.ObjectDependencies AS ObjectDependencies\r\n" +
  531. " ON Objects.ObjectKey = ObjectDependencies.TgtObjectKey\r\n" +
  532. " AND Objects.RunKey = ObjectDependencies.RunKey\r\n" +
  533. "INNER JOIN dbo.Objects AS TargetObjects\r\n" +
  534. " ON ObjectDependencies.SrcObjectKey = TargetObjects.ObjectKey\r\n" +
  535. " AND Objects.RunKey = TargetObjects.RunKey\r\n" +
  536. " AND ObjectDependencies.RunKey = TargetObjects.RunKey\r\n" +
  537. "INNER JOIN dbo.ObjectDependencies AS OD_DataFlow\r\n" +
  538. " ON ObjectDependencies.SrcObjectKey = OD_DataFlow.TgtObjectKey\r\n" +
  539. " AND ObjectDependencies.RunKey = OD_DataFlow.RunKey\r\n" +
  540. "INNER JOIN dbo.ObjectDependencies AS OD_DestConnection\r\n" +
  541. " ON Objects.ObjectKey = OD_DestConnection.TgtObjectKey\r\n" +
  542. " AND Objects.RunKey = OD_DestConnection.RunKey\r\n" +
  543. "WHERE ObjectDependencies.DependencyType = N'Map'\r\n" +
  544. " AND Objects.ObjectTypeString = N'Table'\r\n" +
  545. " AND OD_DataFlow.DependencyType = N'Containment'\r\n" +
  546. " AND OD_DestConnection.DependencyType = N'Containment'\r\n";
  547. sqlCommand.ExecuteNonQuery();
  548. sqlCommand.CommandText = "ALTER VIEW [dbo].[SourceTables]\r\n" +
  549. "AS\r\n" +
  550. "SELECT\r\n" +
  551. " dbo.Objects.RunKey,\r\n" +
  552. " dbo.Objects.ObjectKey,\r\n" +
  553. " dbo.Objects.ObjectName,\r\n" +
  554. " dbo.Objects.ObjectTypeString,\r\n" +
  555. " dbo.Objects.ObjectDesc,\r\n" +
  556. " dbo.ObjectDependencies.TgtObjectKey AS SrcComponentKey,\r\n" +
  557. " SourceObjects.ObjectName AS SourceObjectsName,\r\n" +
  558. " SourceObjects.ObjectDesc AS SourceObjectsDesc,\r\n" +
  559. " OD_DataFlow.SrcObjectKey AS DataFlowID,\r\n" +
  560. " OD_DestConnection.SrcObjectKey AS SourceConnectionID\r\n" +
  561. "FROM dbo.Objects\r\n" +
  562. "INNER JOIN dbo.ObjectDependencies\r\n" +
  563. " ON dbo.Objects.ObjectKey = dbo.ObjectDependencies.SrcObjectKey\r\n" +
  564. " AND dbo.Objects.RunKey = dbo.ObjectDependencies.RunKey\r\n" +
  565. "INNER JOIN dbo.ObjectDependencies AS OD_DataFlow\r\n" +
  566. " ON dbo.ObjectDependencies.TgtObjectKey = OD_DataFlow.TgtObjectKey\r\n" +
  567. " AND dbo.ObjectDependencies.RunKey = OD_DataFlow.RunKey\r\n" +
  568. "INNER JOIN dbo.Objects AS SourceObjects\r\n" +
  569. " ON dbo.ObjectDependencies.TgtObjectKey = SourceObjects.ObjectKey\r\n" +
  570. " AND dbo.ObjectDependencies.RunKey = SourceObjects.RunKey\r\n" +
  571. "INNER JOIN dbo.ObjectDependencies AS OD_DestConnection\r\n" +
  572. " ON dbo.Objects.ObjectKey = OD_DestConnection.TgtObjectKey\r\n" +
  573. " AND dbo.Objects.RunKey = OD_DestConnection.RunKey\r\n" +
  574. "WHERE dbo.ObjectDependencies.DependencyType = N'Map'\r\n" +
  575. " AND dbo.Objects.ObjectTypeString = N'Table'\r\n" +
  576. " AND OD_DataFlow.DependencyType = N'Containment'\r\n" +
  577. " AND OD_DataFlow.DependencyType = OD_DestConnection.DependencyType";
  578. sqlCommand.ExecuteNonQuery();
  579. sqlCommand.CommandText = "ALTER VIEW [dbo].[LineageMap]\r\n" +
  580. "AS\r\n" +
  581. "SELECT\r\n" +
  582. " RunKey,\r\n" +
  583. " SrcObjectKey,\r\n" +
  584. " TgtObjectKey\r\n" +
  585. "FROM dbo.ObjectDependencies\r\n" +
  586. "WHERE DependencyType = N'Map'";
  587. sqlCommand.ExecuteNonQuery();
  588. sqlCommand.CommandText = "ALTER VIEW [dbo].[WalkSources]\r\n" +
  589. "AS\r\n" +
  590. "WITH f(RunKey, osrc, tgt, lvl, objecttype) \r\n" +
  591. "AS \r\n" +
  592. "(SELECT Objects.RunKey, dbo.SourceTables.ObjectKey\r\n" +
  593. " , dbo.SourceTables.SrcComponentKey\r\n" +
  594. " , 0 AS Expr1\r\n" +
  595. " , dbo.Objects.ObjectTypeString\r\n" +
  596. "FROM dbo.SourceTables \r\n" +
  597. "INNER JOIN dbo.Objects \r\n" +
  598. " ON dbo.SourceTables.ObjectKey = dbo.Objects.ObjectKey\r\n" +
  599. " AND SourceTables.RunKey = Objects.RunKey\r\n" +
  600. "UNION ALL\r\n" +
  601. "SELECT Objects_1.RunKey, f_2.osrc\r\n" +
  602. " , dbo.LineageMap.TgtObjectKey\r\n" +
  603. " , f_2.lvl + 1 AS Expr1\r\n" +
  604. " , Objects_1.ObjectTypeString\r\n" +
  605. "FROM f AS f_2 \r\n" +
  606. "INNER JOIN dbo.LineageMap \r\n" +
  607. " ON f_2.tgt = dbo.LineageMap.SrcObjectKey \r\n" +
  608. "INNER JOIN dbo.Objects AS Objects_1 \r\n" +
  609. " ON dbo.LineageMap.TgtObjectKey = Objects_1.ObjectKey\r\n" +
  610. " AND LineageMap.RunKey = Objects_1.RunKey\r\n" +
  611. "WHERE (NOT (f_2.osrc = f_2.tgt)))\r\n" +
  612. "SELECT RunKey, osrc, tgt, lvl, objecttype\r\n" +
  613. "FROM f AS f_1";
  614. sqlCommand.ExecuteNonQuery();
  615. sqlCommand.CommandText = "ALTER VIEW [dbo].[ObjectRelationships]\r\n" +
  616. "AS\r\n" +
  617. "SELECT\r\n" +
  618. " RunKey,\r\n" +
  619. " SrcObjectKey AS ParentObjectKey,\r\n" +
  620. " TgtObjectKey AS ChildObjectKey\r\n" +
  621. "FROM dbo.ObjectDependencies\r\n" +
  622. "WHERE DependencyType = N'Containment'";
  623. sqlCommand.ExecuteNonQuery();
  624. sqlCommand.CommandText = "ALTER VIEW [dbo].[Packages]\r\n" +
  625. "AS\r\n" +
  626. "SELECT \r\n" +
  627. " Objects.RunKey,\r\n" +
  628. " Objects.ObjectKey AS PackageID, \r\n" +
  629. " Objects.ObjectName AS PackageName,\r\n" +
  630. " Objects.ObjectDesc AS PackageDesc,\r\n" +
  631. " PackageProperties.PackageLocation,\r\n" +
  632. " PackageProperties.PackageGUID\r\n" +
  633. "FROM [dbo].[Objects],\r\n" +
  634. " (SELECT \r\n" +
  635. " RunKey,\r\n" +
  636. " PackageProperties.ObjectKey,\r\n" +
  637. " [PackageLocation],\r\n" +
  638. " [PackageGUID]\r\n" +
  639. " FROM dbo.ObjectAttributes \r\n" +
  640. " PIVOT (\r\n" +
  641. " MIN (ObjectAttrValue) \r\n" +
  642. " FOR ObjectAttrName \r\n" +
  643. " IN ([PackageLocation], [PackageGUID])\r\n" +
  644. " ) AS PackageProperties\r\n" +
  645. " ) AS PackageProperties\r\n" +
  646. "WHERE [Objects].ObjectKey = PackageProperties.ObjectKey \r\n" +
  647. "AND [Objects].RunKey = PackageProperties.RunKey\r\n" +
  648. "AND [Objects].ObjectTypeString = N'SSIS Package'";
  649. sqlCommand.ExecuteNonQuery();
  650. sqlCommand.CommandText = "ALTER VIEW [dbo].[Connections]\r\n" +
  651. "AS\r\n" +
  652. "SELECT \r\n" +
  653. " [Objects].[RunKey],\r\n" +
  654. " [Objects].ObjectKey AS ConnectionID,\r\n" +
  655. " [Objects].ObjectName AS ConnectionName,\r\n" +
  656. " [Objects].ObjectDesc AS ConnectionDesc,\r\n" +
  657. " ConnectionString,\r\n" +
  658. " ConnectionProperties.[Server],\r\n" +
  659. " ConnectionProperties.[Database]\r\n" +
  660. "FROM [dbo].[Objects] \r\n" +
  661. "INNER JOIN\r\n" +
  662. " (SELECT\r\n" +
  663. " RunKey,\r\n" +
  664. " ConnectionProperties.ObjectKey,\r\n" +
  665. " ConnectionString,\r\n" +
  666. " [Server],\r\n" +
  667. " [Database]\r\n" +
  668. " FROM [dbo].[ObjectAttributes] \r\n" +
  669. " PIVOT \r\n" +
  670. " (\r\n" +
  671. " MIN(ObjectAttrValue) FOR ObjectAttrName \r\n" +
  672. " IN (ConnectionString, [Server], [Database])\r\n" +
  673. " ) AS ConnectionProperties\r\n" +
  674. " ) AS ConnectionProperties\r\n" +
  675. " ON [Objects].ObjectKey = ConnectionProperties.ObjectKey\r\n" +
  676. " AND [Objects].RunKey = ConnectionProperties.RunKey\r\n" +
  677. "INNER JOIN dbo.LookupConnectionID\r\n" +
  678. " ON ConnectionGUID = [Objects].ObjectTypeString";
  679. sqlCommand.ExecuteNonQuery();
  680. sqlCommand.CommandText = "ALTER VIEW [dbo].[TableLineageMap]\r\n" +
  681. "AS\r\n" +
  682. "SELECT\r\n" +
  683. " dbo.WalkSources.RunKey,\r\n" +
  684. " dbo.SourceTables.ObjectKey AS SourceTableObjectKey,\r\n" +
  685. " dbo.SourceTables.ObjectName AS SourceTable,\r\n" +
  686. " srel.ParentObjectKey AS SourceConnectionKey,\r\n" +
  687. " sconn.ConnectionName AS SourceConnectionName,\r\n" +
  688. " sconn.ConnectionString AS SourceConnectionString,\r\n" +
  689. " sconn.[Server] AS SourceServer,\r\n" +
  690. " sconn.[Database] AS SourceDatabase,\r\n" +
  691. " dbo.SourceTables.SrcComponentKey AS SourceComponentKey,\r\n" +
  692. " dbo.TargetTables.ObjectName AS TargetTable,\r\n" +
  693. " dbo.TargetTables.TgtComponentKey AS TargetComponentKey,\r\n" +
  694. " trel.ParentObjectKey AS TargetConnectionKey,\r\n" +
  695. " tconn.ConnectionName AS TargetConnectionName,\r\n" +
  696. " tconn.ConnectionString AS TargetConnectionString,\r\n" +
  697. " tconn.[Server] AS TargetServer,\r\n" +
  698. " tconn.[Database] AS TargetDatabase,\r\n" +
  699. " dfrel.ParentObjectKey AS DataFlowKey,\r\n" +
  700. " dbo.Packages.PackageName,\r\n" +
  701. " dbo.Packages.PackageDesc,\r\n" +
  702. " dbo.Packages.PackageLocation,\r\n" +
  703. " dbo.Packages.PackageGUID\r\n" +
  704. "FROM dbo.WalkSources\r\n" +
  705. "INNER JOIN dbo.SourceTables\r\n" +
  706. " ON dbo.WalkSources.osrc = dbo.SourceTables.ObjectKey\r\n" +
  707. " AND dbo.WalkSources.RunKey = dbo.SourceTables.RunKey\r\n" +
  708. "INNER JOIN dbo.TargetTables\r\n" +
  709. " ON dbo.WalkSources.tgt = dbo.TargetTables.ObjectKey\r\n" +
  710. " AND dbo.WalkSources.RunKey = dbo.TargetTables.RunKey\r\n" +
  711. "INNER JOIN dbo.ObjectRelationships AS srel\r\n" +
  712. " ON dbo.SourceTables.ObjectKey = srel.ChildObjectKey\r\n" +
  713. " AND dbo.SourceTables.RunKey = srel.RunKey\r\n" +
  714. "INNER JOIN dbo.ObjectRelationships AS trel\r\n" +
  715. "\r\n" +
  716. " ON dbo.TargetTables.ObjectKey = trel.ChildObjectKey\r\n" +
  717. " AND dbo.TargetTables.RunKey = trel.RunKey\r\n" +
  718. "INNER JOIN dbo.ObjectRelationships AS dfrel\r\n" +
  719. " ON dbo.TargetTables.TgtComponentKey = dfrel.ChildObjectKey\r\n" +
  720. " AND dbo.TargetTables.RunKey = dfrel.RunKey\r\n" +
  721. "INNER JOIN dbo.ObjectRelationships AS pkgrel\r\n" +
  722. " ON dfrel.ParentObjectKey = pkgrel.ChildObjectKey\r\n" +
  723. " AND dfrel.RunKey = pkgrel.RunKey\r\n" +
  724. "INNER JOIN dbo.Packages\r\n" +
  725. " ON pkgrel.ParentObjectKey = dbo.Packages.PackageID\r\n" +
  726. " AND pkgrel.RunKey = dbo.Packages.RunKey\r\n" +
  727. "INNER JOIN dbo.Connections AS sconn\r\n" +
  728. " ON srel.ParentObjectKey = sconn.ConnectionID\r\n" +
  729. " AND srel.RunKey = sconn.RunKey\r\n" +
  730. "INNER JOIN dbo.Connections AS tconn\r\n" +
  731. " ON trel.ParentObjectKey = tconn.ConnectionID\r\n" +
  732. " AND trel.RunKey = tconn.RunKey";
  733. sqlCommand.ExecuteNonQuery();
  734. sqlCommand.CommandText = "ALTER VIEW [dbo].[DataFlows]\r\n" +
  735. "AS\r\n" +
  736. "SELECT\r\n" +
  737. " dbo.Objects.RunKey,\r\n" +
  738. " dbo.Objects.ObjectKey,\r\n" +
  739. " dbo.Objects.ObjectName,\r\n" +
  740. " dbo.Objects.ObjectDesc,\r\n" +
  741. " dbo.ObjectDependencies.SrcObjectKey AS PackageID\r\n" +
  742. "FROM dbo.Objects\r\n" +
  743. "INNER JOIN dbo.ObjectDependencies\r\n" +
  744. " ON dbo.Objects.ObjectKey = dbo.ObjectDependencies.TgtObjectKey\r\n" +
  745. " AND dbo.Objects.RunKey = dbo.ObjectDependencies.RunKey\r\n" +
  746. "WHERE dbo.Objects.ObjectTypeString IN (\r\n" +
  747. " N'{C3BF9DC1-4715-4694-936F-D3CFDA9E42C5}', \r\n" +
  748. " N'{E3CFBEA8-1F48-40D8-91E1-2DEDC1EDDD56}'\r\n" +
  749. ")\r\n" +
  750. " AND dbo.ObjectDependencies.DependencyType = N'Containment'";
  751. sqlCommand.ExecuteNonQuery();
  752. sqlCommand.CommandText = "ALTER VIEW [dbo].[ConnectionsMapping]\r\n" +
  753. "AS\r\n" +
  754. "SELECT DISTINCT \r\n" +
  755. " srel.ParentObjectKey AS SourceConnectionID,\r\n" +
  756. " trel.ParentObjectKey AS TargetConnectionID\r\n" +
  757. "FROM dbo.WalkSources\r\n" +
  758. "INNER JOIN dbo.SourceTables\r\n" +
  759. " ON dbo.WalkSources.osrc = dbo.SourceTables.ObjectKey\r\n" +
  760. " AND dbo.WalkSources.RunKey = dbo.SourceTables.RunKey\r\n" +
  761. "INNER JOIN dbo.TargetTables\r\n" +
  762. " ON dbo.WalkSources.tgt = dbo.TargetTables.ObjectKey\r\n" +
  763. " AND dbo.WalkSources.RunKey = dbo.TargetTables.RunKey\r\n" +
  764. "INNER JOIN dbo.ObjectRelationships AS srel\r\n" +
  765. " ON dbo.SourceTables.ObjectKey = srel.ChildObjectKey\r\n" +
  766. " AND srel.RunKey = dbo.SourceTables.RunKey\r\n" +
  767. "INNER JOIN dbo.ObjectRelationships AS trel\r\n" +
  768. " ON dbo.TargetTables.ObjectKey = trel.ChildObjectKey\r\n" +
  769. " AND dbo.TargetTables.RunKey = trel.RunKey";
  770. sqlCommand.ExecuteNonQuery();
  771. sqlCommand.CommandText = "INSERT INTO dbo.Version\r\n" +
  772. "(VersionID, InstallDate)\r\n" +
  773. "VALUES\r\n" +
  774. "(4, GETDATE())";
  775. sqlCommand.ExecuteNonQuery();
  776. //// sqlCommand.CommandText = "";
  777. //// sqlCommand.ExecuteNonQuery();
  778. }
  779. #endregion
  780. dbVersion = 4;
  781. }
  782. if (dbVersion == 4)
  783. {
  784. #region dbVersion 4
  785. // Apply corrected WalkSources View
  786. using (SqlCommand sqlAlterCommand = repositoryConnection.CreateCommand())
  787. {
  788. sqlAlterCommand.CommandText = "SET ANSI_NULLS ON";
  789. sqlAlterCommand.ExecuteNonQuery();
  790. sqlAlterCommand.CommandText = "SET QUOTED_IDENTIFIER ON";
  791. sqlAlterCommand.ExecuteNonQuery();
  792. sqlAlterCommand.CommandText = "ALTER VIEW [dbo].[WalkSources]\r\n" +
  793. "AS\r\n" +
  794. "WITH WalkSourceCTE(RunKey, osrc, tgt, lvl, objecttype, ParentString) \r\n" +
  795. "AS \r\n" +
  796. "(\r\n" +
  797. " SELECT Objects.RunKey\r\n" +
  798. " , dbo.SourceTables.ObjectKey\r\n" +
  799. " , dbo.SourceTables.SrcComponentKey\r\n" +
  800. " , 0 AS Expr1\r\n" +
  801. " , dbo.Objects.ObjectTypeString\r\n" +
  802. " , CAST(',' + CAST(dbo.SourceTables.ObjectKey as varchar(14)) + ',' AS VARCHAR(2000)) AS ParentString\r\n" +
  803. " FROM dbo.SourceTables \r\n" +
  804. " INNER JOIN dbo.Objects \r\n" +
  805. " ON dbo.SourceTables.ObjectKey = dbo.Objects.ObjectKey\r\n" +
  806. " AND SourceTables.RunKey = Objects.RunKey\r\n" +
  807. " UNION ALL\r\n" +
  808. " SELECT Objects.RunKey\r\n" +
  809. " , WalkSourceCTE.osrc\r\n" +
  810. " , dbo.LineageMap.TgtObjectKey\r\n" +
  811. " , WalkSourceCTE.lvl + 1 AS Expr1\r\n" +
  812. " , Objects.ObjectTypeString\r\n" +
  813. " , CAST(WalkSourceCTE.ParentString + CAST(WalkSourceCTE.tgt as varchar(14)) + ',' AS VARCHAR(2000)) AS ParentString\r\n" +
  814. " FROM WalkSourceCTE\r\n" +
  815. " INNER JOIN dbo.LineageMap \r\n" +
  816. " ON WalkSourceCTE.tgt = dbo.LineageMap.SrcObjectKey \r\n" +
  817. " AND WalkSourceCTE.RunKey = dbo.LineageMap.RunKey\r\n" +
  818. " INNER JOIN dbo.Objects\r\n" +
  819. " ON dbo.LineageMap.TgtObjectKey = Objects.ObjectKey\r\n" +
  820. " AND LineageMap.RunKey = Objects.RunKey\r\n" +
  821. " WHERE NOT ((WalkSourceCTE.osrc = WalkSourceCTE.tgt)\r\n" +
  822. " OR CHARINDEX(',' + CAST(WalkSourceCTE.tgt AS VARCHAR(40)) + ',', WalkSourceCTE.ParentString) > 0)\r\n" +
  823. ")\r\n" +
  824. " \r\n" +
  825. "SELECT RunKey, osrc, tgt, lvl, objecttype\r\n" +
  826. "FROM WalkSourceCTE\r\n";
  827. sqlAlterCommand.ExecuteNonQuery();
  828. sqlAlterCommand.CommandText = "INSERT INTO dbo.Version\r\n" +
  829. "(VersionID, InstallDate)\r\n" +
  830. "VALUES\r\n" +
  831. "(5, GETDATE())";
  832. sqlAlterCommand.ExecuteNonQuery();
  833. }
  834. #endregion
  835. dbVersion = 5;
  836. }
  837. if (dbVersion == 5)
  838. {
  839. #region dbVersion 5
  840. // New Procedures
  841. using (SqlCommand sqlAlterCommand = repositoryConnection.CreateCommand())
  842. {
  843. sqlAlterCommand.CommandText = "SET ANSI_NULLS ON";
  844. sqlAlterCommand.ExecuteNonQuery();
  845. sqlAlterCommand.CommandText = "SET QUOTED_IDENTIFIER ON";
  846. sqlAlterCommand.ExecuteNonQuery();
  847. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveRunIDs]') AND type in (N'P', N'PC'))\r\n";
  848. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveRunIDs] AS SELECT 1')";
  849. sqlAlterCommand.ExecuteNonQuery();
  850. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  851. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  852. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  853. sqlAlterCommand.CommandText += "-- Description: Retrieves the list of Run's\r\n";
  854. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  855. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveRunIDs]\r\n";
  856. sqlAlterCommand.CommandText += "AS\r\n";
  857. sqlAlterCommand.CommandText += "BEGIN\r\n";
  858. sqlAlterCommand.CommandText += "SET NOCOUNT ON;\r\n";
  859. sqlAlterCommand.CommandText += "SELECT [RunKey] ,CONVERT(NVARCHAR(40), [RunDate], 120) + CHAR(9) + [RunCommand] FROM [dbo].[RunScan]\r\n";
  860. sqlAlterCommand.CommandText += "END\r\n";
  861. sqlAlterCommand.ExecuteNonQuery();
  862. sqlAlterCommand.CommandText = "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_IntCSVSplit]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))\r\n";
  863. sqlAlterCommand.CommandText += "DROP FUNCTION [dbo].[fn_IntCSVSplit]";
  864. sqlAlterCommand.ExecuteNonQuery();
  865. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  866. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  867. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  868. sqlAlterCommand.CommandText += "-- Description: Retrieves a table of integers from a csv string\r\n";
  869. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  870. sqlAlterCommand.CommandText = "CREATE FUNCTION [dbo].[fn_IntCSVSplit]\r\n";
  871. sqlAlterCommand.CommandText += "( @RowData NVARCHAR(MAX) )\r\n";
  872. sqlAlterCommand.CommandText += "RETURNS @RtnValue TABLE \r\n";
  873. sqlAlterCommand.CommandText += "( Data INT ) \r\n";
  874. sqlAlterCommand.CommandText += "AS\r\n";
  875. sqlAlterCommand.CommandText += "BEGIN \r\n";
  876. sqlAlterCommand.CommandText += " DECLARE @Iterator INT\r\n";
  877. sqlAlterCommand.CommandText += " DECLARE @WorkString NVARCHAR(MAX)\r\n";
  878. sqlAlterCommand.CommandText += " SET @Iterator = 1\r\n";
  879. sqlAlterCommand.CommandText += " DECLARE @FoundIndex INT\r\n";
  880. sqlAlterCommand.CommandText += " SET @FoundIndex = CHARINDEX(',',@RowData)\r\n";
  881. sqlAlterCommand.CommandText += " WHILE (@FoundIndex>0)\r\n";
  882. sqlAlterCommand.CommandText += " BEGIN\r\n";
  883. sqlAlterCommand.CommandText += " SET @WorkString = LTRIM(RTRIM(SUBSTRING(@RowData, 1, @FoundIndex - 1)))\r\n";
  884. sqlAlterCommand.CommandText += " IF ISNUMERIC(@WorkString) = 1\r\n";
  885. sqlAlterCommand.CommandText += " BEGIN\r\n";
  886. sqlAlterCommand.CommandText += " INSERT INTO @RtnValue (data) VALUES (@WorkString)\r\n";
  887. sqlAlterCommand.CommandText += " END\r\n";
  888. sqlAlterCommand.CommandText += " ELSE\r\n";
  889. sqlAlterCommand.CommandText += " BEGIN\r\n";
  890. sqlAlterCommand.CommandText += " INSERT INTO @RtnValue (data) VALUES(NULL)\r\n";
  891. sqlAlterCommand.CommandText += " END\r\n";
  892. sqlAlterCommand.CommandText += " SET @RowData = SUBSTRING(@RowData, @FoundIndex + 1,LEN(@RowData))\r\n";
  893. sqlAlterCommand.CommandText += " SET @Iterator = @Iterator + 1\r\n";
  894. sqlAlterCommand.CommandText += " SET @FoundIndex = CHARINDEX(',', @RowData)\r\n";
  895. sqlAlterCommand.CommandText += " END\r\n";
  896. sqlAlterCommand.CommandText += " IF ISNUMERIC(LTRIM(RTRIM(@RowData))) = 1\r\n";
  897. sqlAlterCommand.CommandText += " BEGIN\r\n";
  898. sqlAlterCommand.CommandText += " INSERT INTO @RtnValue (Data) SELECT LTRIM(RTRIM(@RowData))\r\n";
  899. sqlAlterCommand.CommandText += " END\r\n";
  900. sqlAlterCommand.CommandText += " RETURN\r\n";
  901. sqlAlterCommand.CommandText += "END\r\n";
  902. sqlAlterCommand.ExecuteNonQuery();
  903. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveObjects]') AND type in (N'P', N'PC'))\r\n";
  904. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveObjects] AS SELECT 1')";
  905. sqlAlterCommand.ExecuteNonQuery();
  906. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  907. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  908. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  909. sqlAlterCommand.CommandText += "-- Description: Retrieves the list of Objects\r\n";
  910. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  911. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveObjects]\r\n";
  912. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  913. sqlAlterCommand.CommandText += "AS\r\n";
  914. sqlAlterCommand.CommandText += "BEGIN\r\n";
  915. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  916. sqlAlterCommand.CommandText += " SELECT [ObjectKey], [ObjectName], [Objects].[ObjectTypeString], [ObjectTypes].[ObjectTypeName], [RunKey]\r\n";
  917. sqlAlterCommand.CommandText += " FROM [dbo].[Objects] \r\n";
  918. sqlAlterCommand.CommandText += " LEFT OUTER JOIN [dbo].[ObjectTypes]\r\n";
  919. sqlAlterCommand.CommandText += " ON [Objects].[ObjectTypeString] = [ObjectTypes].[ObjectTypeKey]\r\n";
  920. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  921. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  922. sqlAlterCommand.CommandText += "END\r\n";
  923. sqlAlterCommand.ExecuteNonQuery();
  924. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveLineageMap]') AND type in (N'P', N'PC'))\r\n";
  925. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveLineageMap] AS SELECT 1')";
  926. sqlAlterCommand.ExecuteNonQuery();
  927. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  928. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  929. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  930. sqlAlterCommand.CommandText += "-- Description: Retrieves the list of LineageMap\r\n";
  931. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  932. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveLineageMap]\r\n";
  933. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  934. sqlAlterCommand.CommandText += "AS\r\n";
  935. sqlAlterCommand.CommandText += "BEGIN\r\n";
  936. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  937. sqlAlterCommand.CommandText += " SELECT [SrcObjectKey], [TgtObjectKey], [DependencyType] \r\n";
  938. sqlAlterCommand.CommandText += " FROM [dbo].[ObjectDependencies]\r\n";
  939. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  940. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  941. sqlAlterCommand.CommandText += "END\r\n";
  942. sqlAlterCommand.ExecuteNonQuery();
  943. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveObjectDetails]') AND type in (N'P', N'PC'))\r\n";
  944. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveObjectDetails] AS SELECT 1')";
  945. sqlAlterCommand.ExecuteNonQuery();
  946. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  947. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  948. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  949. sqlAlterCommand.CommandText += "-- Description: Retrieves the ObjectDetails\r\n";
  950. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  951. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveObjectDetails]\r\n";
  952. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  953. sqlAlterCommand.CommandText += ", @ObjectKey INT\r\n";
  954. sqlAlterCommand.CommandText += "AS\r\n";
  955. sqlAlterCommand.CommandText += "BEGIN\r\n";
  956. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  957. sqlAlterCommand.CommandText += " SELECT [ObjectTypeString], [ObjectDesc] \r\n";
  958. sqlAlterCommand.CommandText += " FROM [dbo].[Objects]\r\n";
  959. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  960. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  961. sqlAlterCommand.CommandText += " AND ObjectKey = @ObjectKey\r\n";
  962. sqlAlterCommand.CommandText += "END\r\n";
  963. sqlAlterCommand.ExecuteNonQuery();
  964. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveObjectTypes]') AND type in (N'P', N'PC'))\r\n";
  965. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveObjectTypes] AS SELECT 1')";
  966. sqlAlterCommand.ExecuteNonQuery();
  967. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  968. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  969. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  970. sqlAlterCommand.CommandText += "-- Description: Retrieves the ObjectTypes\r\n";
  971. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  972. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveObjectTypes]\r\n";
  973. sqlAlterCommand.CommandText += " @ObjectTypeKey NVARCHAR(255)\r\n";
  974. sqlAlterCommand.CommandText += "AS\r\n";
  975. sqlAlterCommand.CommandText += "BEGIN\r\n";
  976. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  977. sqlAlterCommand.CommandText += " SELECT [ObjectTypeName]\r\n";
  978. sqlAlterCommand.CommandText += " FROM [dbo].[ObjectTypes] \r\n";
  979. sqlAlterCommand.CommandText += " WHERE ObjectTypeKey = @ObjectTypeKey\r\n";
  980. sqlAlterCommand.CommandText += "END\r\n";
  981. sqlAlterCommand.ExecuteNonQuery();
  982. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveObjectAttributes]') AND type in (N'P', N'PC'))\r\n";
  983. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveObjectAttributes] AS SELECT 1')";
  984. sqlAlterCommand.ExecuteNonQuery();
  985. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  986. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  987. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  988. sqlAlterCommand.CommandText += "-- Description: Retrieves the ObjectAttributes\r\n";
  989. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  990. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveObjectAttributes]\r\n";
  991. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  992. sqlAlterCommand.CommandText += ", @ObjectKey INT\r\n";
  993. sqlAlterCommand.CommandText += "AS\r\n";
  994. sqlAlterCommand.CommandText += "BEGIN\r\n";
  995. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  996. sqlAlterCommand.CommandText += " SELECT [ObjectAttrName], [ObjectAttrValue]\r\n";
  997. sqlAlterCommand.CommandText += " FROM [dbo].[ObjectAttributes] \r\n";
  998. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  999. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  1000. sqlAlterCommand.CommandText += " AND ObjectKey = @ObjectKey\r\n";
  1001. sqlAlterCommand.CommandText += " ORDER BY [ObjectAttrName];\r\n";
  1002. sqlAlterCommand.CommandText += "END\r\n";
  1003. sqlAlterCommand.ExecuteNonQuery();
  1004. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveContainedTargetDependencies]') AND type in (N'P', N'PC'))\r\n";
  1005. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveContainedTargetDependencies] AS SELECT 1')";
  1006. sqlAlterCommand.ExecuteNonQuery();
  1007. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  1008. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  1009. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  1010. sqlAlterCommand.CommandText += "-- Description: Retrieves the Contained Target Dependencies\r\n";
  1011. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  1012. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveContainedTargetDependencies]\r\n";
  1013. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  1014. sqlAlterCommand.CommandText += ", @TgtObjectKey INT\r\n";
  1015. sqlAlterCommand.CommandText += "AS\r\n";
  1016. sqlAlterCommand.CommandText += "BEGIN\r\n";
  1017. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  1018. sqlAlterCommand.CommandText += " SELECT [SrcObjectKey] \r\n";
  1019. sqlAlterCommand.CommandText += " FROM [dbo].[ObjectDependencies] \r\n";
  1020. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  1021. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  1022. sqlAlterCommand.CommandText += " AND [DependencyType] = 'Containment' \r\n";
  1023. sqlAlterCommand.CommandText += " AND [TgtObjectKey] = @TgtObjectKey\r\n";
  1024. sqlAlterCommand.CommandText += "END\r\n";
  1025. sqlAlterCommand.ExecuteNonQuery();
  1026. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveSSASObjects]') AND type in (N'P', N'PC'))\r\n";
  1027. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveSSASObjects] AS SELECT 1')";
  1028. sqlAlterCommand.ExecuteNonQuery();
  1029. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  1030. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  1031. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  1032. sqlAlterCommand.CommandText += "-- Description: Retrieves the SSAS Objects\r\n";
  1033. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  1034. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveSSASObjects]\r\n";
  1035. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  1036. sqlAlterCommand.CommandText += "AS\r\n";
  1037. sqlAlterCommand.CommandText += "BEGIN\r\n";
  1038. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  1039. sqlAlterCommand.CommandText += " SELECT [ObjectKey], [ObjectName]\r\n";
  1040. sqlAlterCommand.CommandText += " FROM [dbo].[Objects]\r\n";
  1041. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  1042. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  1043. sqlAlterCommand.CommandText += " AND [ObjectTypeString] = 'Ssas.Analysis Server'\r\n";
  1044. sqlAlterCommand.CommandText += " ORDER BY [ObjectName]\r\n";
  1045. sqlAlterCommand.CommandText += "END\r\n";
  1046. sqlAlterCommand.ExecuteNonQuery();
  1047. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveSQLSObjects]') AND type in (N'P', N'PC'))\r\n";
  1048. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveSQLSObjects] AS SELECT 1')";
  1049. sqlAlterCommand.ExecuteNonQuery();
  1050. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  1051. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  1052. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  1053. sqlAlterCommand.CommandText += "-- Description: Retrieves the SQL Server Objects\r\n";
  1054. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  1055. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveSQLSObjects]\r\n";
  1056. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  1057. sqlAlterCommand.CommandText += "AS\r\n";
  1058. sqlAlterCommand.CommandText += "BEGIN\r\n";
  1059. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  1060. sqlAlterCommand.CommandText += " SELECT ConnectionID, ISNULL([Server], ConnectionName) + ISNULL('.' + [Database], '') as DisplayName\r\n";
  1061. sqlAlterCommand.CommandText += " FROM [dbo].[Connections]\r\n";
  1062. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  1063. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  1064. sqlAlterCommand.CommandText += " ORDER BY DisplayName\r\n";
  1065. sqlAlterCommand.CommandText += "END\r\n";
  1066. sqlAlterCommand.ExecuteNonQuery();
  1067. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveSSRSObjects]') AND type in (N'P', N'PC'))\r\n";
  1068. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveSSRSObjects] AS SELECT 1')";
  1069. sqlAlterCommand.ExecuteNonQuery();
  1070. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  1071. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  1072. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  1073. sqlAlterCommand.CommandText += "-- Description: Retrieves the SSRS Objects\r\n";
  1074. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  1075. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveSSRSObjects]\r\n";
  1076. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  1077. sqlAlterCommand.CommandText += "AS\r\n";
  1078. sqlAlterCommand.CommandText += "BEGIN\r\n";
  1079. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  1080. sqlAlterCommand.CommandText += " SELECT [ObjectKey], [ObjectName]\r\n";
  1081. sqlAlterCommand.CommandText += " FROM [dbo].[Objects]\r\n";
  1082. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  1083. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  1084. sqlAlterCommand.CommandText += " AND [ObjectTypeString] = 'ReportServer'\r\n";
  1085. sqlAlterCommand.CommandText += " ORDER BY [ObjectName]\r\n";
  1086. sqlAlterCommand.CommandText += "END\r\n";
  1087. sqlAlterCommand.ExecuteNonQuery();
  1088. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveFileObjects]') AND type in (N'P', N'PC'))\r\n";
  1089. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveFileObjects] AS SELECT 1')";
  1090. sqlAlterCommand.ExecuteNonQuery();
  1091. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  1092. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  1093. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  1094. sqlAlterCommand.CommandText += "-- Description: Retrieves the File Server Objects\r\n";
  1095. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  1096. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveFileObjects]\r\n";
  1097. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  1098. sqlAlterCommand.CommandText += "AS\r\n";
  1099. sqlAlterCommand.CommandText += "BEGIN\r\n";
  1100. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  1101. sqlAlterCommand.CommandText += " SELECT [ObjectKey], [ObjectName]\r\n";
  1102. sqlAlterCommand.CommandText += " FROM [dbo].[Objects]\r\n";
  1103. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  1104. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  1105. sqlAlterCommand.CommandText += " AND [ObjectTypeString] = 'Machine'\r\n";
  1106. sqlAlterCommand.CommandText += " ORDER BY [ObjectName]\r\n";
  1107. sqlAlterCommand.CommandText += "END\r\n";
  1108. sqlAlterCommand.ExecuteNonQuery();
  1109. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveSSISObjects]') AND type in (N'P', N'PC'))\r\n";
  1110. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveSSISObjects] AS SELECT 1')";
  1111. sqlAlterCommand.ExecuteNonQuery();
  1112. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  1113. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  1114. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  1115. sqlAlterCommand.CommandText += "-- Description: Retrieves the SSIS Objects\r\n";
  1116. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  1117. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveSSISObjects]\r\n";
  1118. sqlAlterCommand.CommandText += " @RunList nvarchar(max)\r\n";
  1119. sqlAlterCommand.CommandText += "AS\r\n";
  1120. sqlAlterCommand.CommandText += "BEGIN\r\n";
  1121. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  1122. sqlAlterCommand.CommandText += " SELECT [PackageID], [PackageLocation] \r\n";
  1123. sqlAlterCommand.CommandText += " FROM [dbo].[Packages]\r\n";
  1124. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[fn_IntCSVSplit](@RunList) AS Filter\r\n";
  1125. sqlAlterCommand.CommandText += " ON Filter.Data = [RunKey]\r\n";
  1126. sqlAlterCommand.CommandText += " ORDER BY [PackageID]\r\n";
  1127. sqlAlterCommand.CommandText += "END\r\n";
  1128. sqlAlterCommand.ExecuteNonQuery();
  1129. sqlAlterCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_RetrieveContained]') AND type in (N'P', N'PC'))\r\n";
  1130. sqlAlterCommand.CommandText += "EXEC ('CREATE PROCEDURE [dbo].[usp_RetrieveContained] AS SELECT 1')";
  1131. sqlAlterCommand.ExecuteNonQuery();
  1132. sqlAlterCommand.CommandText = "-- =============================================\r\n";
  1133. sqlAlterCommand.CommandText += "-- Author: Keith Martin\r\n";
  1134. sqlAlterCommand.CommandText += "-- Create date: 2011-11-16\r\n";
  1135. sqlAlterCommand.CommandText += "-- Description: Retrieves the Children of this Containment Object\r\n";
  1136. sqlAlterCommand.CommandText += "-- =============================================\r\n";
  1137. sqlAlterCommand.CommandText += "ALTER PROCEDURE [dbo].[usp_RetrieveContained]\r\n";
  1138. sqlAlterCommand.CommandText += " @SrcObjectKey INT\r\n";
  1139. sqlAlterCommand.CommandText += "AS\r\n";
  1140. sqlAlterCommand.CommandText += "BEGIN\r\n";
  1141. sqlAlterCommand.CommandText += " SET NOCOUNT ON;\r\n";
  1142. sqlAlterCommand.CommandText += " SELECT DISTINCT TgtObjectKey, ObjectName, ISNULL(ObjectTypes.ObjectTypeName, ObjectTypeString) as ObjectTypeString \r\n";
  1143. sqlAlterCommand.CommandText += " FROM [dbo].[ObjectDependencies]\r\n";
  1144. sqlAlterCommand.CommandText += " INNER JOIN [dbo].[Objects] \r\n";
  1145. sqlAlterCommand.CommandText += " ON ObjectKey = TgtObjectKey\r\n";
  1146. sqlAlterCommand.CommandText += " AND [DependencyType] = 'Containment' \r\n";
  1147. sqlAlterCommand.CommandText += " AND SrcObjectKey = @SrcObjectKey\r\n";
  1148. sqlAlterCommand.CommandText += " LEFT OUTER JOIN [dbo].[ObjectTypes] \r\n";
  1149. sqlAlterCommand.CommandText += " ON ObjectTypes.ObjectTypeKey = ObjectTypeString \r\n";
  1150. sqlAlterCommand.CommandText += " ORDER BY ObjectTypeString, ObjectName\r\n";
  1151. sqlAlterCommand.CommandText += "END\r\n";
  1152. sqlAlterCommand.ExecuteNonQuery();
  1153. sqlAlterCommand.CommandText = "INSERT INTO dbo.Version\r\n" +
  1154. "(VersionID, InstallDate)\r\n" +
  1155. "VALUES\r\n" +
  1156. "(6, GETDATE())";
  1157. sqlAlterCommand.ExecuteNonQuery();
  1158. }
  1159. #endregion
  1160. dbVersion = 6;
  1161. }
  1162. if (dbVersion == 6)
  1163. {
  1164. // Add SQL 2012 entries to allow display of relational sources.
  1165. #region dbVersion 6
  1166. using (SqlCommand sqlCommand = repositoryConnection.CreateCommand())
  1167. {
  1168. sqlCommand.CommandText = "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{32808317-2AFC-4E1C-A03A-9F8477A3BDBA}', N'ODBC 2012')\r\n" +
  1169. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{3269FBD7-897B-4CDF-8988-2E1A24B10FBB}', N'OLEDB 2012')\r\n" +
  1170. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{68FFA586-FFA5-41DC-8EDE-13102087EF33}', N'ADO 2012')\r\n" +
  1171. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{39CAF1E8-6582-4C31-A5C6-405A8661EEC1}', N'ADO.Net 2012')\r\n"+
  1172. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{E3D5D606-997B-4EF6-90AD-43483A788CC3}', N'MSOLAP 2012')\r\n";
  1173. sqlCommand.ExecuteNonQuery();
  1174. }
  1175. #endregion
  1176. dbVersion = 7;
  1177. }
  1178. if (dbVersion == 7)
  1179. {
  1180. // Add SQL 2014 entries to allow display of relational sources.
  1181. #region dbVersion 7
  1182. using (SqlCommand sqlCommand = repositoryConnection.CreateCommand())
  1183. {
  1184. sqlCommand.CommandText = "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{1818FF09-AF4D-4EA8-8C9D-0AB43B5775E5}', N'ODBC 2014')\r\n" +
  1185. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{F3F3005C-C3CB-4C61-B2A9-056035E4D8F2}', N'OLEDB 2014')\r\n" +
  1186. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{FFEDAAC9-D6BD-4E6B-90AB-D4D296B5096A}', N'ADO 2014')\r\n" +
  1187. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{D5353B56-34DA-4C97-AC94-722B91013E89}', N'ADO.Net 2014')\r\n" +
  1188. "INSERT [dbo].[LookupConnectionID] ([ConnectionGUID], [ConnectionDescription]) VALUES (N'{05B2302B-4C20-43FD-92B3-3A067A037436}', N'MSOLAP 2014')\r\n";
  1189. sqlCommand.ExecuteNonQuery();
  1190. }
  1191. #endregion
  1192. dbVersion = 8;
  1193. }
  1194. }
  1195. public void LoadExisingRepository()
  1196. {
  1197. using (SqlCommand sqlCommand = new SqlCommand("SELECT COALESCE(MAX(ObjectKey), 0) + 1 FROM [dbo].[Objects]", repositoryConnection))
  1198. {
  1199. using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
  1200. {
  1201. sqlReader.Read();
  1202. objectTable.Columns["ObjectKey"].AutoIncrementSeed = System.Convert.ToInt32(sqlReader[0]);
  1203. }
  1204. }
  1205. using (SqlCommand sqlCommand = new SqlCommand("SELECT COALESCE(MAX(RunKey), 0) + 1 FROM [dbo].[RunScan]", repositoryConnection))
  1206. {
  1207. using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
  1208. {
  1209. sqlReader.Read();
  1210. RunKeyValue = System.Convert.ToInt32(sqlReader[0]);
  1211. runScanTable.Columns["RunKey"].AutoIncrementSeed = System.Convert.ToInt32(sqlReader[0]);
  1212. }
  1213. }
  1214. using (SqlCommand sqlCommand = new SqlCommand("SELECT [ObjectTypeKey], [ObjectTypeName], [ObjectTypeDesc], [ObjectMetaType], [Domain] FROM [dbo].[ObjectTypes]", repositoryConnection))
  1215. {
  1216. using (SqlDataReader sqlReader = sqlCommand.ExecuteReader())
  1217. {
  1218. while (sqlReader.Read())
  1219. {
  1220. this.AddObjectType(sqlReader[4].ToString(), sqlReader[0].ToString(), sqlReader[1].ToString(), sqlReader[2].ToString());
  1221. }
  1222. }
  1223. }
  1224. using (SqlCommand sqlCommand = new SqlCommand("truncate table ObjectTypes", repositoryConnection))
  1225. {
  1226. sqlCommand.ExecuteNonQuery();
  1227. }
  1228. }
  1229. public void DeleteExistingRepository()
  1230. {
  1231. using (SqlCommand sqlCommand = repositoryConnection.CreateCommand())
  1232. {
  1233. sqlCommand.CommandText = "truncate table dbo.ObjectAttributes";
  1234. sqlCommand.ExecuteNonQuery();
  1235. sqlCommand.CommandText = "truncate table dbo.ObjectDependencies";
  1236. sqlCommand.ExecuteNonQuery();
  1237. sqlCommand.CommandText = "delete from dbo.Objects";
  1238. sqlCommand.ExecuteNonQuery();
  1239. sqlCommand.CommandText = "delete from dbo.RunScan";
  1240. sqlCommand.ExecuteNonQuery();
  1241. sqlCommand.CommandText = "truncate table ObjectTypes";
  1242. sqlCommand.ExecuteNonQuery();
  1243. }
  1244. }
  1245. public void InitialiseRepository(string commandLine)
  1246. {
  1247. // adds an object and returns the ID
  1248. DataRow row = runScanTable.NewRow();
  1249. row["RunDate"] = DateTime.Now;
  1250. row["RunCommand"] = commandLine;
  1251. runScanTable.Rows.Add(row);
  1252. }
  1253. /// <summary>
  1254. /// Add a new object to the repository
  1255. /// </summary>
  1256. /// <param name="name"></param>
  1257. /// <param name="description"></param>
  1258. /// <param name="objectType"></param>
  1259. /// <param name="parentObjectID"></param>
  1260. /// <returns></returns>
  1261. public int AddObject(string name, string description, string objectType, int parentObjectID)
  1262. {
  1263. // adds an object and returns the ID
  1264. DataRow row = objectTable.NewRow();
  1265. row["RunKey"] = this.runKeyValue;
  1266. row["ObjectName"] = name;
  1267. row["ObjectTypeString"] = objectType;
  1268. row["ObjectDesc"] = description;
  1269. objectTable.Rows.Add(row);
  1270. // the ObjectKey is an identity column and should be incremented automatically.
  1271. int objectID = (int)row["ObjectKey"];
  1272. // add containment
  1273. AddObjectContainment(parentObjectID, objectID);
  1274. return objectID;
  1275. }
  1276. /// <summary>
  1277. /// adds the type of object to the repository
  1278. /// </summary>
  1279. /// <param name="objectType"></param>
  1280. public void AddObjectType(string domain, string objectType)
  1281. {
  1282. AddObjectType(domain, objectType, objectType, string.Empty);
  1283. }
  1284. /// <summary>
  1285. /// adds the type of object to the repository
  1286. /// </summary>
  1287. /// <param name="objectType"></param>
  1288. public void AddObjectType(string domain, string objectTypeKey, string objectTypeName)
  1289. {
  1290. AddObjectType(domain, objectTypeKey, objectTypeName, string.Empty);
  1291. }
  1292. /// <summary>
  1293. /// Adds the type of object to the repository
  1294. /// </summary>
  1295. /// <param name="objectType"></param>
  1296. /// <param name="name"></param>
  1297. /// <param name="description"></param>
  1298. public void AddObjectType(string domain, string objectType, string name, string description)
  1299. {
  1300. if (!IsTypeDefined(objectType))
  1301. {
  1302. DataRow row = objectTypesTable.NewRow();
  1303. row["ObjectTypeID"] = objectType;
  1304. row["ObjectTypeName"] = name;
  1305. row["ObjectTypeDesc"] = description;
  1306. row["Domain"] = domain;
  1307. objectTypesTable.Rows.Add(row);
  1308. }
  1309. }
  1310. public bool IsTypeDefined(string typeID)
  1311. {
  1312. DataRow[] rows = this.objectTypesTable.Select(string.Format("ObjectTypeID = '{0}'", typeID));
  1313. Debug.Assert(rows.Length == 0 || rows.Length == 1);
  1314. return (rows.Length > 0);
  1315. }
  1316. /// <summary>
  1317. /// adds a relationship between objects that's not containment or lineage map
  1318. /// </summary>
  1319. /// <param name="from"></param>
  1320. /// <param name="to"></param>
  1321. public void AddUseDependency(int from, int to)
  1322. {
  1323. AddDependency(from, to, DependencyTypes.Use);
  1324. }
  1325. /// <summary>
  1326. /// Adds a containment relationship between specified objects
  1327. /// </summary>
  1328. /// <param name="parent"></param>
  1329. /// <param name="child"></param>
  1330. private void AddObjectContainment(int parent, int child)
  1331. {
  1332. AddDependency(parent, child, DependencyTypes.Containment);
  1333. }
  1334. /// <summary>
  1335. /// Adds a data mapping between objects
  1336. /// </summary>
  1337. /// <param name="from"></param>
  1338. /// <param name="to"></param>
  1339. public void AddMapping(int from, int to)
  1340. {
  1341. AddDependency(from, to, DependencyTypes.Lineage);
  1342. }
  1343. /// <summary>
  1344. /// adds a row to the dependencies table
  1345. /// </summary>
  1346. /// <param name="from"></param>
  1347. /// <param name="to"></param>
  1348. /// <param name="type"></param>
  1349. private void AddDependency(int from, int to, string type)
  1350. {
  1351. DataRow row = objectDependenciesTable.NewRow();
  1352. row["RunKey"] = this.runKeyValue;
  1353. row["SrcObjectKey"] = from;
  1354. row["TgtObjectKey"] = to;
  1355. row["DependencyType"] = type;
  1356. if (!DoesDependencyExist(from, to, type))
  1357. {
  1358. objectDependenciesTable.Rows.Add(row);
  1359. }
  1360. }
  1361. /// <summary>
  1362. /// returns whether there's a mapping between the source and target objects
  1363. /// todo: perf hit?
  1364. /// </summary>
  1365. /// <param name="from"></param>
  1366. /// <param name="to"></param>
  1367. /// <returns></returns>
  1368. public bool DoesMappingExist(int from, int to)
  1369. {
  1370. return DoesDependencyExist(from, to, DependencyTypes.Lineage);
  1371. }
  1372. /// <summary>
  1373. /// returns whether there's a mapping between the source and target objects
  1374. /// todo: perf hit?
  1375. /// </summary>
  1376. /// <param name="from"></param>
  1377. /// <param name="to"></param>
  1378. /// <returns></returns>
  1379. public bool DoesDependencyExist(int from, int to, string dependencyType)
  1380. {
  1381. DataRow[] rows = objectDependenciesTable.Select(string.Format("RunKey = '{0}' AND SrcObjectKey = '{1}' AND TgtObjectKey = '{2}' AND DependencyType = '{3}'", this.RunKeyValue, from, to, dependencyType));
  1382. return (rows.Length > 0);
  1383. }
  1384. /// <summary>
  1385. /// Adds attributes for an object.
  1386. /// </summary>
  1387. /// <param name="objectID"></param>
  1388. /// <param name="attributeName"></param>
  1389. /// <param name="attributeValue"></param>
  1390. public void AddAttribute(int objectID, string attributeName, string attributeValue)
  1391. {
  1392. if (!string.IsNullOrEmpty(attributeName) && !string.IsNullOrEmpty(attributeValue))
  1393. {
  1394. DataRow row = objectAttributesTable.NewRow();
  1395. row["RunKey"] = this.runKeyValue;
  1396. row["ObjectKey"] = objectID;
  1397. row["ObjectAttrName"] = attributeName;
  1398. row["ObjectAttrValue"] = attributeValue;
  1399. objectAttributesTable.Rows.Add(row);
  1400. }
  1401. }
  1402. /// <summary>
  1403. /// Return IDs of objects that have specified name and type
  1404. /// </summary>
  1405. /// <param name="name">name</param>
  1406. /// <param name="type">type</param>
  1407. /// <returns>Array of object IDs that satisfy the condition</returns>
  1408. private int[] GetNamedObjects(string name, string type)
  1409. {
  1410. DataRow[] rows = objectTable.Select(string.Format("ObjectTypeString = '{0}' AND ObjectName = '{1}'", type, name.Replace("'", "''")));
  1411. int[] ids = new int[rows.Length];
  1412. for (int i = 0; i < ids.Length; ++i)
  1413. {
  1414. ids[i] = (int)rows[i]["ObjectKey"];
  1415. }
  1416. return ids;
  1417. }
  1418. /// <summary>
  1419. /// Return ID of objects that have specified name and type
  1420. /// </summary>
  1421. /// <param name="name">name</param>
  1422. /// <param name="type">type</param>
  1423. /// <returns>Object ID or -1</returns>
  1424. private int GetNamedObject(string name, string type)
  1425. {
  1426. int[] ids = GetNamedObjects(name, type);
  1427. if (ids.Length > 0)
  1428. {
  1429. Debug.Assert(ids.Length == 1);
  1430. return ids[0];
  1431. }
  1432. else
  1433. {
  1434. return -1;
  1435. }
  1436. }
  1437. /// <summary>
  1438. /// Returns the connection string that is associated with a particular Connection ID
  1439. /// </summary>
  1440. /// <param name="connectionID">The ID for the connection that you want a string about.</param>
  1441. /// <returns></returns>
  1442. public string RetrieveConnectionString(int connectionID)
  1443. {
  1444. DataRow[] rows = objectAttributesTable.Select(string.Format("ObjectAttrName = 'ConnectionString' AND ObjectKey = '{0}' ", connectionID));
  1445. if (rows.Length > 0)
  1446. {
  1447. Debug.Assert(rows.Length == 1); // should be only one because we're keeping them unique.
  1448. return (string)rows[0]["ObjectAttrValue"];
  1449. }
  1450. else
  1451. {
  1452. return null;
  1453. }
  1454. }
  1455. /// <summary>
  1456. /// Attempts to return the database name from the connection string that the connectionID points at..
  1457. /// </summary>
  1458. /// <param name="connectionID"></param>
  1459. /// <returns>the database name, or an empty string.</returns>
  1460. public string RetrieveDatabaseNameFromConnectionID(int connectionID)
  1461. {
  1462. object existing;
  1463. string dbName = string.Empty;
  1464. String connectionString = RetrieveConnectionString(connectionID);
  1465. OleDbConnectionStringBuilder csBuilder = (OleDbConnectionStringBuilder)GetConnectionStringBuilder(connectionString);
  1466. if (csBuilder == null)
  1467. {
  1468. csBuilder = (OleDbConnectionStringBuilder)GetConnectionStringBuilder(string.Empty);
  1469. }
  1470. if (csBuilder.TryGetValue(Repository.ConnectionStringProperties.InitialCatalog, out existing))
  1471. dbName = (String)existing;
  1472. else if (csBuilder.TryGetValue(Repository.ConnectionStringProperties.Database, out existing))
  1473. dbName = (String)existing;
  1474. return dbName;
  1475. }
  1476. /// <summary>
  1477. /// returns ID of the connection with specified connection string. -1 if there's no connection with
  1478. /// specificed connection string.
  1479. /// </summary>
  1480. /// <param name="connectionString"></param>
  1481. /// <returns></returns>
  1482. public int GetConnection(string connectionString)
  1483. {
  1484. int connectionID = -1; // assume no connection will be found
  1485. // if a connection with the same string exists, return it.
  1486. DataRow[] rows = objectAttributesTable.Select(string.Format("ObjectAttrName = 'ConnectionString' AND ObjectAttrValue = '{0}' ", connectionString.Replace("'", "''")));
  1487. if (rows.Length > 0)
  1488. {
  1489. Debug.Assert(rows.Length == 1); // should be only one because we're keeping them unique.
  1490. connectionID = (int)rows[0]["ObjectKey"];
  1491. }
  1492. else
  1493. {
  1494. connectionID = GetOleDbCanonicalConnection(connectionString);
  1495. }
  1496. return connectionID;
  1497. }
  1498. private int GetOleDbCanonicalConnection(string connectionString)
  1499. {
  1500. int connectionID = -1;
  1501. try
  1502. {
  1503. DbConnectionStringBuilder targetConnectionStringBuilder = GetConnectionStringBuilder(connectionString);
  1504. if (targetConnectionStringBuilder != null)
  1505. {
  1506. // get a list of existing connection strings
  1507. DataRow[] rows = objectAttributesTable.Select(string.Format("ObjectAttrName = 'ConnectionString'"));
  1508. foreach (DataRow row in rows)
  1509. {
  1510. try
  1511. {
  1512. DbConnectionStringBuilder currentConnectionStringBuilder = GetConnectionStringBuilder(row["ObjectAttrValue"].ToString());
  1513. if (currentConnectionStringBuilder != null)
  1514. {
  1515. if (databaseNameOnlyCompare)
  1516. {
  1517. // todo: does username matter for the relational database?
  1518. //if (CompareProviders(targetConnectionStringBuilder, currentConnectionStringBuilder)
  1519. // && CompareDatabases(targetConnectionStringBuilder, currentConnectionStringBuilder)
  1520. // )
  1521. // And drop the Provider name, as this isn't there for the SQLDBEnumerator...
  1522. if (CompareDatabases(targetConnectionStringBuilder, currentConnectionStringBuilder))
  1523. {
  1524. connectionID = (int)row["ObjectKey"];
  1525. break;
  1526. }
  1527. }
  1528. else
  1529. {
  1530. // todo: does username matter for the relational database?
  1531. if (CompareProviders(targetConnectionStringBuilder, currentConnectionStringBuilder)
  1532. && CompareServers(targetConnectionStringBuilder, currentConnectionStringBuilder)
  1533. && CompareDatabases(targetConnectionStringBuilder, currentConnectionStringBuilder)
  1534. )
  1535. {
  1536. connectionID = (int)row["ObjectKey"];
  1537. break;
  1538. }
  1539. }
  1540. }
  1541. }
  1542. catch (System.Exception)
  1543. {
  1544. }
  1545. }
  1546. }
  1547. }
  1548. catch (System.Exception)
  1549. {
  1550. // ignore
  1551. }
  1552. return connectionID;
  1553. }
  1554. private bool CompareDatabases(DbConnectionStringBuilder builder1, DbConnectionStringBuilder builder2)
  1555. {
  1556. string db1 = GetDatabase(builder1);
  1557. string db2 = GetDatabase(builder2);
  1558. if (db1 == null)
  1559. return false;
  1560. if (db2 == null)
  1561. return false;
  1562. if (databasePrefixExclusions.Count > 0)
  1563. {
  1564. foreach (string dbPrefix in databasePrefixExclusions)
  1565. {
  1566. if (db1.StartsWith(dbPrefix))
  1567. {
  1568. db1 = db1.Substring(dbPrefix.Length);
  1569. }
  1570. if (db2.StartsWith(dbPrefix))
  1571. {
  1572. db2 = db2.Substring(dbPrefix.Length);
  1573. }
  1574. }
  1575. }
  1576. return (db1.ToLower() == db2.ToLower());
  1577. }
  1578. /// <summary>
  1579. /// parses the database out of connection string by understanding the different ways providers store
  1580. /// this information.
  1581. /// </summary>
  1582. /// <param name="builder"></param>
  1583. /// <returns></returns>
  1584. public string GetDatabase(DbConnectionStringBuilder builder)
  1585. {
  1586. object ob = null;
  1587. builder.TryGetValue(ConnectionStringProperties.InitialCatalog, out ob);
  1588. if ((ob == null) || (string.IsNullOrEmpty(ob.ToString())))
  1589. {
  1590. builder.TryGetValue(ConnectionStringProperties.Database, out ob);
  1591. }
  1592. string database = null;
  1593. if (ob != null)
  1594. database = ob.ToString();
  1595. return database;
  1596. }
  1597. public DbConnectionStringBuilder GetConnectionStringBuilder(string connectionString)
  1598. {
  1599. DbConnectionStringBuilder builder = null;
  1600. // try to create an OledbConnectionString
  1601. try
  1602. {
  1603. builder = new OleDbConnectionStringBuilder(connectionString);
  1604. // if we reach here, we were able to parse it
  1605. }
  1606. catch (System.Exception)
  1607. {
  1608. }
  1609. return builder;
  1610. }
  1611. /// <summary>
  1612. /// returns True if the providers in both connection strings match
  1613. /// </summary>
  1614. /// <param name="builder1"></param>
  1615. /// <param name="builder2"></param>
  1616. /// <returns></returns>
  1617. private bool CompareProviders(DbConnectionStringBuilder builder1, DbConnectionStringBuilder builder2)
  1618. {
  1619. bool providersMatch = false;
  1620. object ob = null;
  1621. if (builder1.TryGetValue(ConnectionStringProperties.Provider, out ob))
  1622. {
  1623. string provider1 = ob.ToString();
  1624. if (builder2.TryGetValue(ConnectionStringProperties.Provider, out ob))
  1625. {
  1626. string provider2 = ob.ToString();
  1627. if (provider1.ToLower() == provider2.ToLower())
  1628. {
  1629. providersMatch = true;
  1630. }
  1631. else
  1632. {
  1633. if ((provider1.StartsWith("SQLNCLI") || (provider1.StartsWith("SQLOLEDB")))
  1634. && (provider2.StartsWith("SQLNCLI") || provider2.StartsWith("SQLOLEDB")))
  1635. {
  1636. providersMatch = true;
  1637. }
  1638. }
  1639. }
  1640. }
  1641. return providersMatch;
  1642. }
  1643. /// <summary>
  1644. /// compares if the servers in the two connection strings are the same.
  1645. /// </summary>
  1646. /// <param name="builder1"></param>
  1647. /// <param name="builder2"></param>
  1648. /// <returns></returns>
  1649. private bool CompareServers(DbConnectionStringBuilder builder1, DbConnectionStringBuilder builder2)
  1650. {
  1651. bool matched = false;
  1652. string dataSource1 = GetServer(builder1);
  1653. string dataSource2 = GetServer(builder2);
  1654. if (dataSource1.ToLower() == dataSource2.ToLower())
  1655. {
  1656. matched = true;
  1657. }
  1658. else
  1659. {
  1660. if (dataSource1 == "." || (string.Compare(dataSource1, "localhost", true) == 0) || (string.Compare(dataSource1, "(local)", true) == 0))
  1661. {
  1662. if (dataSource2 == "." || (string.Compare(dataSource2, "localhost", true) == 0) || (string.Compare(dataSource2, "(local)", true) == 0))
  1663. {
  1664. matched = true;
  1665. }
  1666. }
  1667. }
  1668. return matched;
  1669. }
  1670. /// <summary>
  1671. /// Tries to get the server out of the connection strings by looking for common ways of specifying them.
  1672. /// </summary>
  1673. /// <param name="builder1"></param>
  1674. /// <returns></returns>
  1675. public string GetServer(DbConnectionStringBuilder builder1)
  1676. {
  1677. object ob = null;
  1678. string dataSource = null;
  1679. builder1.TryGetValue(ConnectionStringProperties.DataSource, out ob);
  1680. if ((ob == null) || (string.IsNullOrEmpty(ob.ToString())))
  1681. builder1.TryGetValue(ConnectionStringProperties.Server, out ob);
  1682. if ((ob == null) || (string.IsNullOrEmpty(ob.ToString())))
  1683. builder1.TryGetValue(ConnectionStringProperties.Location, out ob);
  1684. if (ob != null)
  1685. {
  1686. dataSource = ob.ToString();
  1687. }
  1688. return dataSource;
  1689. }
  1690. /// <summary>
  1691. /// Gets the ID for a table, and creates it if it doesn't exist. Also sets the description on the table.
  1692. /// </summary>
  1693. /// <param name="connectionID"></param>
  1694. /// <param name="tableName"></param>
  1695. /// <param name="Description"></param>
  1696. /// <returns></returns>
  1697. public int GetTable(int connectionID, string tableName, string Description)
  1698. {
  1699. int tableID = -1; // assume no table will be found
  1700. // get the tables that correspond to this connection
  1701. DataRow[] connectionChildren = objectDependenciesTable.Select(string.Format("SrcObjectKey = '{0}' AND DependencyType = '{1}'", connectionID, DependencyTypes.Containment));
  1702. // see if any table has our name
  1703. foreach (DataRow row in connectionChildren)
  1704. {
  1705. DataRow[] relationalTableRows = objectTable.Select(string.Format("ObjectKey = '{0}' AND ObjectTypeString = '{1}' AND ObjectName = '{2}'", row["TgtObjectKey"], RelationalEnumerator.ObjectTypes.Table, tableName.Replace("'","''")));
  1706. if (relationalTableRows.Length > 0)
  1707. {
  1708. Debug.Assert(relationalTableRows.Length == 1); // should be only one table in a connection with the same name
  1709. tableID = (int)relationalTableRows[0]["ObjectKey"];
  1710. // Attempt to update the description, if there is one provided, and it's different to what's already there.
  1711. if (!string.IsNullOrEmpty(Description))
  1712. {
  1713. String strCurrentDescription = (string)relationalTableRows[0]["ObjectDesc"];
  1714. if (Description.ToLower() != strCurrentDescription.ToLower())
  1715. {
  1716. relationalTableRows[0]["ObjectDesc"] = Description;
  1717. }
  1718. }
  1719. break;
  1720. }
  1721. }
  1722. if (tableID == -1)
  1723. {
  1724. tableID = AddObject(tableName, Description, RelationalEnumerator.ObjectTypes.Table, connectionID);
  1725. }
  1726. return tableID;
  1727. }
  1728. /// <summary>
  1729. /// Gets the id for the table, and creates it if it doesn't exist.
  1730. /// </summary>
  1731. /// <param name="connectionID"></param>
  1732. /// <param name="tableName"></param>
  1733. /// <returns></returns>
  1734. public int GetTable(int connectionID, string tableName)
  1735. {
  1736. return GetTable(connectionID, tableName, string.Empty);
  1737. }
  1738. /// <summary>
  1739. /// Searches for an existing ID for a Procedure, and if not found, adds a new entry.
  1740. /// </summary>
  1741. /// <param name="connectionID">The connection that this procedure should be found in</param>
  1742. /// <param name="procName">The name of the procedure</param>
  1743. /// <returns>the ID that belongs to the procedure</returns>
  1744. public int GetProcedure(int connectionID, string procName)
  1745. {
  1746. int procID = -1; // assume no procedure will be found
  1747. // get the procedures that correspond to this connection
  1748. DataRow[] connectionChildren = objectDependenciesTable.Select(string.Format("SrcObjectKey = '{0}' AND DependencyType = '{1}'", connectionID, DependencyTypes.Containment));
  1749. // see if any procedure has our name
  1750. foreach (DataRow row in connectionChildren)
  1751. {
  1752. DataRow[] relationalProcedureRows = objectTable.Select(string.Format("ObjectKey = '{0}' AND ObjectTypeString = '{1}' AND ObjectName = '{2}'", row["TgtObjectKey"], RelationalEnumerator.ObjectTypes.Procedure, procName.Replace("'","''")));
  1753. if (relationalProcedureRows.Length > 0)
  1754. {
  1755. Debug.Assert(relationalProcedureRows.Length == 1); // should be only one procedure in a connection with the same name
  1756. procID = (int)relationalProcedureRows[0]["ObjectKey"];
  1757. break;
  1758. }
  1759. }
  1760. if (procID == -1)
  1761. {
  1762. procID = AddObject(procName, string.Empty, RelationalEnumerator.ObjectTypes.Procedure, connectionID);
  1763. }
  1764. return procID;
  1765. }
  1766. /// <summary>
  1767. /// Searches for an existing ID for a Function, and if not found, adds a new entry, with a description.
  1768. /// </summary>
  1769. /// <param name="connectionID"></param>
  1770. /// <param name="funcName"></param>
  1771. /// <param name="Description"></param>
  1772. /// <returns></returns>
  1773. public int GetFunction(int connectionID, string funcName, string Description)
  1774. {
  1775. int funcID = -1; // assume no Function will be found
  1776. // get the Functions that correspond to this connection
  1777. DataRow[] connectionChildren = objectDependenciesTable.Select(string.Format("SrcObjectKey = '{0}' AND DependencyType = '{1}'", connectionID, DependencyTypes.Containment));
  1778. // see if any Function has our name
  1779. foreach (DataRow row in connectionChildren)
  1780. {
  1781. DataRow[] relationalFunctionRows = objectTable.Select(string.Format("ObjectKey = '{0}' AND ObjectTypeString = '{1}' AND ObjectName = '{2}'", row["TgtObjectKey"], RelationalEnumerator.ObjectTypes.Function, funcName.Replace("'", "''")));
  1782. if (relationalFunctionRows.Length > 0)
  1783. {
  1784. Debug.Assert(relationalFunctionRows.Length == 1); // should be only one Function in a connection with the same name
  1785. funcID = (int)relationalFunctionRows[0]["ObjectKey"];
  1786. break;
  1787. }
  1788. }
  1789. if (funcID == -1)
  1790. {
  1791. funcID = AddObject(funcName, Description, RelationalEnumerator.ObjectTypes.Function, connectionID);
  1792. }
  1793. return funcID;
  1794. }
  1795. /// <summary>
  1796. /// Searches for an existing ID for a Function, and if not found, adds a new entry.
  1797. /// </summary>
  1798. /// <param name="connectionID">The connection that this Function should be found in</param>
  1799. /// <param name="funcName">The name of the Function</param>
  1800. /// <returns>the ID that belongs to the Function</returns>
  1801. public int GetFunction(int connectionID, string funcName)
  1802. {
  1803. return GetFunction(connectionID, funcName, string.Empty);
  1804. }
  1805. /// <summary>
  1806. /// Returns the column id for column which belongs to something.
  1807. /// </summary>
  1808. /// <param name="parentID">The RepositoryID for the parent of this column</param>
  1809. /// <param name="columnName">The name of the column as known by this parent</param>
  1810. /// <returns>The ID of the column in the Repository</returns>
  1811. public int GetColumn(int parentID, string columnName)
  1812. {
  1813. int columnID = -1; // assume that the column hasn't been added yet
  1814. // get the columns that correspond to the table
  1815. DataRow[] connectionChildren = objectDependenciesTable.Select(string.Format("SrcObjectKey = '{0}' AND DependencyType = '{1}'", parentID, DependencyTypes.Containment));
  1816. // see if any table has our name
  1817. foreach (DataRow row in connectionChildren)
  1818. {
  1819. DataRow[] relationalTableRows = objectTable.Select(string.Format("ObjectKey = '{0}' AND ObjectTypeString = '{1}' AND ObjectName = '{2}'", row["TgtObjectKey"], ColumnEnumerator.ObjectTypes.Column, columnName.Replace("'", "''")));
  1820. if (relationalTableRows.Length > 0)
  1821. {
  1822. Debug.Assert(relationalTableRows.Length == 1); // should be only one table in a connection with the same name
  1823. columnID = (int)relationalTableRows[0]["ObjectKey"];
  1824. break;
  1825. }
  1826. }
  1827. if (columnID == -1)
  1828. {
  1829. columnID = AddObject(columnName, string.Empty, ColumnEnumerator.ObjectTypes.Column, parentID);
  1830. }
  1831. return columnID;
  1832. }
  1833. /// <summary>
  1834. /// Get object corresponding to the specified Report Name
  1835. /// </summary>
  1836. /// <param name="reportName">The name of the report</param>
  1837. /// <param name="description">The description of the report</param>
  1838. /// <param name="reportServerID">The ID of the reporting server</param>
  1839. /// <returns></returns>
  1840. public int GetReport(string reportName, string description, int reportServerID)
  1841. {
  1842. int reportID = -1;
  1843. // get the objects that correspond to this reportServer
  1844. DataRow[] reportChildren = objectDependenciesTable.Select(string.Format("SrcObjectKey = '{0}' AND DependencyType = '{1}'", reportServerID, DependencyTypes.Containment));
  1845. // see if any report has our name
  1846. foreach (DataRow row in reportChildren)
  1847. {
  1848. DataRow[] reportRows = objectTable.Select(string.Format("ObjectKey = '{0}' AND ObjectTypeString = '{1}' AND ObjectName = '{2}'", row["TgtObjectKey"], ReportEnumerator.ObjectTypes.Report, reportName.Replace("'", "''")));
  1849. if (reportRows.Length > 0)
  1850. {
  1851. Debug.Assert(reportRows.Length == 1); // should be only one Report in a Server with the same name
  1852. reportID = (int)reportRows[0]["ObjectKey"];
  1853. break;
  1854. }
  1855. }
  1856. if (reportID == -1)
  1857. {
  1858. reportID = AddObject(reportName, description, ReportEnumerator.ObjectTypes.Report, reportServerID);
  1859. }
  1860. return reportID;
  1861. }
  1862. /// <summary>
  1863. /// Get object corresponding to specified file.
  1864. /// </summary>
  1865. /// <param name="fileName">File Name</param>
  1866. /// <param name="hostMachineName">Host where the File Name points to the file</param>
  1867. /// <returns></returns>
  1868. public int GetFile(string fileName, string hostMachineName)
  1869. {
  1870. string fileMachineName = hostMachineName;
  1871. if (fileName.StartsWith(@"\\"))
  1872. {
  1873. fileMachineName = fileName.Substring(2);
  1874. if (fileMachineName.IndexOf('\\') > 0)
  1875. fileMachineName = fileMachineName.Substring(0, fileMachineName.IndexOf('\\'));
  1876. }
  1877. fileMachineName = fileMachineName.ToUpper(System.Globalization.CultureInfo.InvariantCulture);
  1878. // find machine object
  1879. int machineID = GetNamedObject(fileMachineName, FileEnumerator.ObjectTypes.Machine);
  1880. if (machineID < 0)
  1881. {
  1882. // create if does not exist
  1883. machineID = AddObject(fileMachineName, "Computer", FileEnumerator.ObjectTypes.Machine, 0);
  1884. }
  1885. // get all the files and check machine ownership
  1886. int[] files = GetNamedObjects(fileName, FileEnumerator.ObjectTypes.File);
  1887. foreach (int fileCandidate in files)
  1888. {
  1889. if (DoesDependencyExist(machineID, fileCandidate, DependencyTypes.Containment))
  1890. return fileCandidate;
  1891. }
  1892. // Create the file record
  1893. int fileID = AddObject(fileName, "File", FileEnumerator.ObjectTypes.File, machineID);
  1894. Debug.Assert(DoesDependencyExist(machineID, fileID, DependencyTypes.Containment));
  1895. return fileID;
  1896. }
  1897. internal int GetDataSet(string sdsName, int reportServerID)
  1898. {
  1899. int dataSetID = -1;
  1900. // get the objects that correspond to this reportServer
  1901. DataRow[] reportChildren = objectDependenciesTable.Select(string.Format("SrcObjectKey = '{0}' AND DependencyType = '{1}'", reportServerID, DependencyTypes.Containment));
  1902. // see if any report has our name
  1903. foreach (DataRow row in reportChildren)
  1904. {
  1905. DataRow[] dataSetRows = objectTable.Select(string.Format("ObjectKey = '{0}' AND ObjectTypeString = '{1}' AND ObjectName = '{2}'", row["TgtObjectKey"], ReportEnumerator.ObjectTypes.DataSet, sdsName.Replace("'", "''")));
  1906. if (dataSetRows.Length > 0)
  1907. {
  1908. Debug.Assert(dataSetRows.Length == 1); // should be only one Shared Data Set in a Server with the same name
  1909. dataSetID = (int)dataSetRows[0]["ObjectKey"];
  1910. break;
  1911. }
  1912. }
  1913. if (dataSetID == -1)
  1914. {
  1915. dataSetID = AddObject(sdsName, string.Empty, ReportEnumerator.ObjectTypes.DataSet, reportServerID);
  1916. }
  1917. return dataSetID;
  1918. }
  1919. }
  1920. }