// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. // using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlTools.ServiceLayer.Admin.Contracts; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Xml; namespace Microsoft.SqlTools.ServiceLayer.Admin { public class DatabaseTaskHelper { private DatabasePrototype prototype; private XmlDocument document; public CDataContainer DataContainer { get; set; } /// /// Expose database prototype to internal classes /// public DatabasePrototype Prototype { get { return this.prototype; } set { this.prototype = value; } } public DatabaseTaskHelper(CDataContainer context) { Initialize(context); } internal void Initialize(CDataContainer context) { if (context != null) { this.DataContainer = context; this.document = context.Document; int majorVersionNumber = context.Server.Information.Version.Major; Version sql2000sp3 = new Version(8, 0, 760); Version sql2005sp2 = new Version(9, 0, 3000); if (context.Server.DatabaseEngineType == DatabaseEngineType.SqlAzureDatabase) { this.prototype = new DatabasePrototypeAzure(context); } else if (Utils.IsSql11OrLater(context.Server.Version.Major)) { this.prototype = new DatabasePrototype110(context); } else if (majorVersionNumber == 10) { this.prototype = new DatabasePrototype100(context); } else if ((sql2005sp2 <= context.Server.Information.Version) && (context.Server.Information.EngineEdition == Edition.EnterpriseOrDeveloper)) { this.prototype = new DatabasePrototype90EnterpriseSP2(context); } else if (8 < majorVersionNumber) { this.prototype = new DatabasePrototype90(context); } else if (sql2000sp3 <= context.Server.Information.Version) { this.prototype = new DatabasePrototype80SP3(context); } else if (7 < majorVersionNumber) { this.prototype = new DatabasePrototype80(context); } else { this.prototype = new DatabasePrototype(context); } this.prototype.Initialize(); } else { this.DataContainer = null; this.document = null; this.prototype = null; } } internal static DatabaseInfo DatabasePrototypeToDatabaseInfo(DatabasePrototype prototype) { var databaseInfo = new DatabaseInfo(); databaseInfo.Options.Add(AdminServicesProviderOptionsHelper.Name, prototype.Name); databaseInfo.Options.Add(AdminServicesProviderOptionsHelper.Owner, prototype.Owner); databaseInfo.Options.Add(AdminServicesProviderOptionsHelper.Collation, prototype.Collation); databaseInfo.Options.Add(AdminServicesProviderOptionsHelper.DatabaseState, prototype.DatabaseState.ToString()); databaseInfo.Options.Add(AdminServicesProviderOptionsHelper.RecoveryModel, prototype.RecoveryModel.ToString()); databaseInfo.Options.Add(AdminServicesProviderOptionsHelper.IsSystemDB, prototype.IsSystemDB.ToString()); databaseInfo.Options.Add(AdminServicesProviderOptionsHelper.AnsiNulls, prototype.AnsiNulls.ToString()); databaseInfo.Options.Add( AdminServicesProviderOptionsHelper.FileGroups + "Count", prototype.Filegroups.Count); for (int i = 0; i < prototype.Filegroups.Count; ++i) { var fileGroup = prototype.Filegroups[i]; string itemPrefix = AdminServicesProviderOptionsHelper.FileGroups + "." + i + "."; databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.Name, fileGroup.Name); databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.IsMemoryOptimized, fileGroup.IsMemoryOptimized); databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.IsReadOnly, fileGroup.IsReadOnly); databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.IsFileStream, fileGroup.IsFileStream); databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.IsDefault, fileGroup.IsDefault); databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.FileGroupType, fileGroup.FileGroupType.ToString()); } databaseInfo.Options.Add( AdminServicesProviderOptionsHelper.DatabaseFiles + "Count", prototype.Files.Count); for (int i = 0; i < prototype.Files.Count; ++i) { var file = prototype.Files[i]; string itemPrefix = AdminServicesProviderOptionsHelper.DatabaseFiles + "." + i + "."; databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.Name, file.Name); databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.PhysicalName, file.PhysicalName); databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.Autogrowth, (file.DefaultAutogrowth != null ? file.DefaultAutogrowth.ToString() : string.Empty)); databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.DatabaseFileType, file.DatabaseFileType.ToString()); databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.Folder, file.DefaultFolder); databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.Size, file.DefaultSize); databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.FileGroup, file.FileGroup != null ? file.FileGroup.Name : string.Empty); databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.InitialSize, file.InitialSize); databaseInfo.Options.Add(itemPrefix + AdminServicesProviderOptionsHelper.IsPrimaryFile, file.IsPrimaryFile); } return databaseInfo; } private static T GetValueOrDefault(string key, Dictionary map, T defaultValue) { if (map != null && map.ContainsKey(key)) { return map[key] != null ? (T)map[key] : default(T); } return defaultValue; } private static int logicalNameCount = 0; public static DatabasePrototype ApplyToPrototype(DatabaseInfo databaseInfo, DatabasePrototype prototype) { if (databaseInfo != null && prototype != null) { prototype.Name = GetValueOrDefault(AdminServicesProviderOptionsHelper.Name, databaseInfo.Options, prototype.Name); foreach (var file in prototype.Files) { if (string.IsNullOrWhiteSpace(file.Name)) { file.Name = prototype.Name + "_" + logicalNameCount; } else { file.Name += prototype.Name + file.Name + "_" + logicalNameCount; } ++logicalNameCount; } } return prototype; } } }