File: SqlObjectIdentifierResolver.cs

package info (click to toggle)
mono-reference-assemblies 3.12.1%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 604,240 kB
  • ctags: 625,505
  • sloc: cs: 3,967,741; xml: 2,793,081; ansic: 418,042; java: 60,435; sh: 14,833; makefile: 11,576; sql: 7,956; perl: 1,467; cpp: 1,446; yacc: 1,203; python: 598; asm: 422; sed: 16; php: 1
file content (104 lines) | stat: -rw-r--r-- 3,486 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
using System;
using System.Diagnostics;
using Microsoft.VisualStudio.Data.Services;
using Microsoft.VisualStudio.Data.Framework;
using Microsoft.VisualStudio.Data.Services.SupportEntities;

namespace Microsoft.Samples.VisualStudio.Data.ExtendedProvider
{
	/// <summary>
	/// Represents a custom data object identifier resolver that correctly
	/// expands an identifier to its complete form.  This is required for
	/// certain built in data design scenarios that are initialized with only
	/// a partial identifier and then try to match this identifier with an
	/// object from the server.
	/// </summary>
	internal class SqlObjectIdentifierResolver : DataObjectIdentifierResolver
	{
		#region Public Methods

		/// <summary>
		/// SQL Server connections are always within the context of a current
		/// database and default schema.  This method expands identifiers
		/// that are missing database or schema parts by adding the defaults
		/// appropriately.
		/// </summary>
		public override object[] ExpandIdentifier(
			string typeName, object[] partialIdentifier)
		{
			if (typeName == null)
			{
				throw new ArgumentNullException("typeName");
			}

			// Find the type in the data object support model
			IVsDataObjectType type = null;
			IVsDataObjectSupportModel objectSupportModel = Site.GetService(
				typeof(IVsDataObjectSupportModel)) as IVsDataObjectSupportModel;
			Debug.Assert(objectSupportModel != null);
			if (objectSupportModel != null &&
				objectSupportModel.Types.ContainsKey(typeName))
			{
				type = objectSupportModel.Types[typeName];
			}
			if (type == null)
			{
				throw new ArgumentException("Invalid type " + typeName + ".");
			}

			// Create an identifier array of the correct full length
			object[] identifier = new object[type.Identifier.Count];

			// If the input identifier is not null, copy it to the full
			// identifier array.  If the input identifier's length is less
			// than the full length we assume the more specific parts are
			// specified and thus copy into the rightmost portion of the
			// full identifier array.
			if (partialIdentifier != null)
			{
				if (partialIdentifier.Length > type.Identifier.Count)
				{
					throw new ArgumentException("Invalid partial identifier.");
				}
				partialIdentifier.CopyTo(identifier,
					type.Identifier.Count - partialIdentifier.Length);
			}

			// Get the data source information service
			IVsDataSourceInformation sourceInformation =
				Site.GetService(typeof(IVsDataSourceInformation))
					as IVsDataSourceInformation;
			Debug.Assert(sourceInformation != null);
			if (sourceInformation == null)
			{
				// This should never occur
				return identifier;
			}

			// Now expand the identifier as required
			if (type.Identifier.Count > 0)
			{
				// Fill in the current database if not specified
				if (!(identifier[0] is string))
				{
					identifier[0] = sourceInformation[
						DataSourceInformation.DefaultCatalog] as string;
				}
			}
			if (type.Identifier.Count > 1)
			{
				// Fill in the default schema if not specified
				if (!(identifier[1] is string))
				{
					identifier[1] = sourceInformation[
						DataSourceInformation.DefaultSchema] as string;
				}
			}

			return identifier;
		}

		#endregion
	}
}