// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. // using System; using System.Threading; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.SmoMetadataProvider; using Microsoft.SqlServer.Management.SqlParser.Binder; using Microsoft.SqlServer.Management.SqlParser.Common; using Microsoft.SqlServer.Management.SqlParser.MetadataProvider; using Microsoft.SqlServer.Management.SqlParser.Parser; namespace Microsoft.SqlTools.ServiceLayer.LanguageServices { /// /// Class for the binding context for connected sessions /// public class ConnectedBindingContext : IBindingContext { private ParseOptions parseOptions; private ManualResetEvent bindingLock; private ServerConnection serverConnection; /// /// Connected binding context constructor /// public ConnectedBindingContext() { this.bindingLock = new ManualResetEvent(initialState: true); this.BindingTimeout = ConnectedBindingQueue.DefaultBindingTimeout; this.MetadataDisplayInfoProvider = new MetadataDisplayInfoProvider(); } /// /// Gets or sets a flag indicating if the binder is connected /// public bool IsConnected { get; set; } /// /// Gets or sets the binding server connection /// public ServerConnection ServerConnection { get { return this.serverConnection; } set { this.serverConnection = value; // reset the parse options so the get recreated for the current connection this.parseOptions = null; } } /// /// Gets or sets the metadata display info provider /// public MetadataDisplayInfoProvider MetadataDisplayInfoProvider { get; set; } /// /// Gets or sets the SMO metadata provider /// public SmoMetadataProvider SmoMetadataProvider { get; set; } /// /// Gets or sets the binder /// public IBinder Binder { get; set; } /// /// Gets the binding lock object /// public ManualResetEvent BindingLock { get { return this.bindingLock; } } /// /// Gets or sets the binding operation timeout in milliseconds /// public int BindingTimeout { get; set; } /// /// Gets the Language Service ServerVersion /// public ServerVersion ServerVersion { get { return this.ServerConnection != null ? this.ServerConnection.ServerVersion : null; } } /// /// Gets the current DataEngineType /// public DatabaseEngineType DatabaseEngineType { get { return this.ServerConnection != null ? this.ServerConnection.DatabaseEngineType : DatabaseEngineType.Standalone; } } /// /// Gets the current connections TransactSqlVersion /// public TransactSqlVersion TransactSqlVersion { get { return this.IsConnected ? GetTransactSqlVersion(this.ServerVersion) : TransactSqlVersion.Current; } } /// /// Gets the current DatabaseCompatibilityLevel /// public DatabaseCompatibilityLevel DatabaseCompatibilityLevel { get { return this.IsConnected ? GetDatabaseCompatibilityLevel(this.ServerVersion) : DatabaseCompatibilityLevel.Current; } } /// /// Gets the current ParseOptions /// public ParseOptions ParseOptions { get { if (this.parseOptions == null) { this.parseOptions = new ParseOptions( batchSeparator: LanguageService.DefaultBatchSeperator, isQuotedIdentifierSet: true, compatibilityLevel: DatabaseCompatibilityLevel, transactSqlVersion: TransactSqlVersion); } return this.parseOptions; } } /// /// Gets the database compatibility level from a server version /// /// private static DatabaseCompatibilityLevel GetDatabaseCompatibilityLevel(ServerVersion serverVersion) { int versionMajor = Math.Max(serverVersion.Major, 8); switch (versionMajor) { case 8: return DatabaseCompatibilityLevel.Version80; case 9: return DatabaseCompatibilityLevel.Version90; case 10: return DatabaseCompatibilityLevel.Version100; case 11: return DatabaseCompatibilityLevel.Version110; case 12: return DatabaseCompatibilityLevel.Version120; case 13: return DatabaseCompatibilityLevel.Version130; default: return DatabaseCompatibilityLevel.Current; } } /// /// Gets the transaction sql version from a server version /// /// private static TransactSqlVersion GetTransactSqlVersion(ServerVersion serverVersion) { int versionMajor = Math.Max(serverVersion.Major, 9); switch (versionMajor) { case 9: case 10: // In case of 10.0 we still use Version 10.5 as it is the closest available. return TransactSqlVersion.Version105; case 11: return TransactSqlVersion.Version110; case 12: return TransactSqlVersion.Version120; case 13: return TransactSqlVersion.Version130; default: return TransactSqlVersion.Current; } } } }