// 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
{
///
/// 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.
///
internal class SqlObjectIdentifierResolver : DataObjectIdentifierResolver
{
#region Public Methods
///
/// 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.
///
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
}
}