public void Can_Delete_User_Instances() { // Arrange using (var actual = new SqlLocalDbApi(_loggerFactory)) { actual.CreateInstance(Guid.NewGuid().ToString()); IReadOnlyList <string> namesBefore = actual.GetInstanceNames(); // Act int deleted = actual.DeleteUserInstances(deleteFiles: true); // Assert deleted.ShouldBeGreaterThanOrEqualTo(1); IReadOnlyList <string> namesAfter = actual.GetInstanceNames(); int instancesDeleted = 0; foreach (string name in namesBefore) { if (!namesAfter.Contains(name)) { instancesDeleted++; } } instancesDeleted.ShouldBeGreaterThanOrEqualTo(1); } }
public void Can_Get_Instances_From_Names() { // Arrange using (var api = new SqlLocalDbApi(_loggerFactory)) { IReadOnlyList <string> names = api.GetInstanceNames(); foreach (string name in names) { // Act ISqlLocalDbInstanceInfo info = api.GetInstanceInfo(name); // Assert info.ShouldNotBeNull(); } // Arrange string instanceName = Guid.NewGuid().ToString(); // Act bool actual = api.InstanceExists(instanceName); // Assert actual.ShouldBeFalse(); } }
public void Throws_InvalidOperationException_If_SQL_LocalDB_Not_Installed() { // Arrange var options = new SqlLocalDbOptions(); var registry = Mock.Of <Interop.IRegistry>(); using (var actual = new SqlLocalDbApi(options, registry, _loggerFactory)) { // Act and Assert Assert.Throws <InvalidOperationException>(() => actual.CreateInstance("name")); Assert.Throws <InvalidOperationException>(() => actual.DeleteInstance("name")); Assert.Throws <InvalidOperationException>(() => actual.DeleteUserInstances()); Assert.Throws <InvalidOperationException>(() => actual.GetDefaultInstance()); Assert.Throws <InvalidOperationException>(() => actual.GetInstanceInfo("name")); Assert.Throws <InvalidOperationException>(() => actual.GetInstanceNames()); Assert.Throws <InvalidOperationException>(() => actual.GetInstances()); Assert.Throws <InvalidOperationException>(() => actual.GetOrCreateInstance("name")); Assert.Throws <InvalidOperationException>(() => actual.GetVersionInfo("name")); Assert.Throws <InvalidOperationException>(() => actual.InstanceExists("name")); Assert.Throws <InvalidOperationException>(() => actual.LatestVersion); Assert.Throws <InvalidOperationException>(() => actual.ShareInstance("name", "sharedName")); Assert.Throws <InvalidOperationException>(() => actual.StartInstance("name")); Assert.Throws <InvalidOperationException>(() => actual.StartTracing()); Assert.Throws <InvalidOperationException>(() => actual.StopInstance("name")); Assert.Throws <InvalidOperationException>(() => actual.StopTracing()); Assert.Throws <InvalidOperationException>(() => actual.UnshareInstance("name")); } }
public void Throws_PlatformNotSupportedException() { // Arrange using (var actual = new SqlLocalDbApi(_loggerFactory)) { // Act and Assert Assert.Throws <PlatformNotSupportedException>(() => actual.CreateInstance("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.DeleteInstance("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.DeleteUserInstances()); Assert.Throws <PlatformNotSupportedException>(() => actual.GetDefaultInstance()); Assert.Throws <PlatformNotSupportedException>(() => actual.GetInstanceInfo("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.GetInstanceNames()); Assert.Throws <PlatformNotSupportedException>(() => actual.GetInstances()); Assert.Throws <PlatformNotSupportedException>(() => actual.GetOrCreateInstance("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.GetVersionInfo("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.InstanceExists("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.LatestVersion); Assert.Throws <PlatformNotSupportedException>(() => actual.ShareInstance("name", "sharedName")); Assert.Throws <PlatformNotSupportedException>(() => actual.ShareInstance("sid", "name", "sharedName")); Assert.Throws <PlatformNotSupportedException>(() => actual.StartInstance("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.StartTracing()); Assert.Throws <PlatformNotSupportedException>(() => actual.StopInstance("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.StopTracing()); Assert.Throws <PlatformNotSupportedException>(() => actual.UnshareInstance("name")); } }
public void RunStarted(object automationObject, Dictionary <string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams) { replacementsDictionary["$ext_safeprojectname$"] = RootWizard.GlobalDictionary["$ext_safeprojectname$"]; replacementsDictionary["$ext_projectname$"] = RootWizard.GlobalDictionary["$ext_projectname$"]; string localDBInstance = "v11.0"; var localDBInstances = SqlLocalDbApi.GetInstanceNames(); if (localDBInstances.IndexOf("MSSqlLocalDB") >= 0) { localDBInstance = "MSSqlLocalDB"; } else if (localDBInstances.IndexOf("v12.0") >= 0) { localDBInstance = "v12.0"; } else if (localDBInstances.IndexOf("v11.0") >= 0) { localDBInstance = "v11.0"; } else if (localDBInstances.Count > 0) { localDBInstance = localDBInstances[0]; } replacementsDictionary["connectionString=\"Data Source=(LocalDb)\\v11.0;"] = "connectionString=\"Data Source=(LocalDb)\\" + localDBInstance + ";"; }
public void RunStarted(object automationObject, Dictionary <string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams) { dteObject = (DTE)automationObject; serviceProvider = (Microsoft.VisualStudio.OLE.Interop.IServiceProvider) this.dteObject; IntPtr zero4 = IntPtr.Zero; Guid guid = typeof(SComponentModel).GUID; serviceProvider.QueryService(ref guid, ref IUnknownGuid, out zero4); componentModel = (IComponentModel)GetObjectFromNativeUnknown(zero4); replacementsDictionary["$ext_safeprojectname$"] = RootWizard.GlobalDictionary["$ext_safeprojectname$"]; replacementsDictionary["$ext_projectname$"] = RootWizard.GlobalDictionary["$ext_projectname$"]; try { string localDBInstance = "v11.0"; var localDBInstances = SqlLocalDbApi.GetInstanceNames(); if (localDBInstances.IndexOf("MSSqlLocalDB") >= 0) { localDBInstance = "MSSqlLocalDB"; } else if (localDBInstances.IndexOf("v12.0") >= 0) { localDBInstance = "v12.0"; } else if (localDBInstances.IndexOf("v11.0") >= 0) { localDBInstance = "v11.0"; } else if (localDBInstances.Count > 0) { localDBInstance = localDBInstances[0]; } replacementsDictionary["connectionString=\"Data Source=(LocalDb)\\v11.0;"] = "connectionString=\"Data Source=(LocalDb)\\" + localDBInstance + ";"; replacementsDictionary["connectionString=\"Data Source=(LocalDb)\\MsSqlLocalDB;"] = "connectionString=\"Data Source=(LocalDb)\\" + localDBInstance + ";"; } catch { } if (!replacementsDictionary.TryGetValue("$wizarddata$", out wizardData)) { wizardData = null; } }
/// <summary> /// Create an instance of SQL Server LocalDB /// </summary> /// <param name="instanceName">instance name</param> /// <param name="version">version of SQL Serer LocalDB</param> /// <param name="isRecreate">If an instance of the same name exists, destroy it before creating it</param> public static void CreateInstance(string instanceName, string version, bool isRecreate) { if (SqlLocalDbApi.GetInstanceNames().Contains(instanceName)) { if (isRecreate) { // For details of options, see API Reference : https://msdn.microsoft.com/ja-JP/library/hh234692.aspx SqlLocalDbApi.StopInstance(instanceName, StopInstanceOptions.KillProcess, new TimeSpan(0, 0, 30)); SqlLocalDbApi.DeleteInstance(instanceName, true); } else { return; } } SqlLocalDbApi.CreateInstance(instanceName, version); }
/// <summary> /// Create an instance of SQL Server LocalDB /// </summary> /// <param name="instanceName">instance name</param> /// <param name="version">version of SQL Serer LocalDB</param> /// <param name="isRecreate">If an instance of the same name exists, destroy it before creating it</param> public static void CreateInstance(string instanceName, string version, bool isRecreate) { var localDb = new SqlLocalDbApi(); if (localDb.GetInstanceNames().Contains(instanceName)) { if (isRecreate) { // For details of options, see API Reference : https://docs.microsoft.com/en-us/sql/relational-databases/express-localdb-instance-apis/sql-server-express-localdb-reference-instance-apis localDb.StopInstance(instanceName, StopInstanceOptions.KillProcess, new TimeSpan(0, 0, 30)); localDb.DeleteInstance(instanceName, true); } else { return; } } localDb.CreateInstance(instanceName, version); }
private void wizDatabaseCreate_Initialize(object sender, AeroWizard.WizardPageInitEventArgs e) { var createDatabaseTask = new Task(() => { try { using (var localDB = new SqlLocalDbApi()) { ReportStatus("Searching for Localdb instance", 1); ReportStatus("Checking default Instance", 2); var connected = false; string instance = localDB.DefaultInstanceName; List <string> instanceNames = new List <string>(localDB.GetInstanceNames()); instanceNames = instanceNames.Where(n => n != instance).ToList(); // only non-default instances SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); int iInstance = 0; while (!connected) { builder.DataSource = $"(LocalDb)\\{instance}"; builder.InitialCatalog = "Master"; builder.IntegratedSecurity = true; ReportStatus($"Connecting to {instance}", 2); var con = new SqlConnection(builder.ConnectionString); try { con.Open(); connected = true; } catch { connected = false; if (iInstance >= instanceNames.Count) { ReportStatus("Error: No LocalDb database instances could be connected to.", 0); return; } instance = instanceNames[iInstance]; iInstance++; } } ReportStatus($"Successfully connected to {instance}", 20); string databaseName = "Placeless"; int i = 0; var databaseNames = getDatabaseList(builder.ConnectionString); string mdf = System.IO.Path.Combine(txtDatabasePath.Text, $"{databaseName}.mdf"); string ldf = System.IO.Path.Combine(txtDatabasePath.Text, $"{databaseName}.ldf"); ReportStatus($"Selecting a unique database name", 30); while ( System.IO.File.Exists(mdf) || System.IO.File.Exists(ldf) || databaseNames.Contains(databaseName) ) { i++; databaseName = $"Placeless{i:D2}"; mdf = System.IO.Path.Combine(txtDatabasePath.Text, $"{databaseName}.mdf"); ldf = System.IO.Path.Combine(txtDatabasePath.Text, $"{databaseName}.ldf"); } ReportStatus($"Creating database {databaseName}.", 35); ReportStatus($"Data File: {mdf}", 35); ReportStatus($"Log File: {ldf}", 35); SqlMetadataStore.CreateDatabase(builder.ConnectionString, databaseName, mdf, ldf); builder.InitialCatalog = databaseName; ReportStatus($"Database Created, migrating", 80); var _dbContextOptions = SqlServerDbContextOptionsExtensions.UseSqlServer( new DbContextOptionsBuilder(), builder.ConnectionString, options => options.CommandTimeout(120) ).Options; using (var dbContext = new ApplicationDbContext(_dbContextOptions)) { dbContext.Database.Migrate(); } ReportStatus($"Migrations executed, updating config", 90); _config.SetValue(SqlMetadataStore.CONNECTION_STRING_SETTING, builder.ConnectionString); _config.SetValue(FileSystemBlobStore.BLOB_ROOT_PATH, System.IO.Path.Combine(txtDatabasePath.Text, $"{databaseName}_Files")); ReportStatus($"Configuration Updated", 100); this.Invoke((MethodInvoker) delegate { wizardControl1.NextPage(); }); } } catch (Exception ex) { this.Invoke((MethodInvoker) delegate { txtCreateDatabaseOutput.Text += ex.Message + "\r\n"; txtCreateDatabaseOutput.Text += ex.StackTrace + "\r\n"; }); } }, TaskCreationOptions.LongRunning); createDatabaseTask.Start(); }
/// <summary> /// Returns the names of all the SQL Server LocalDB instances for the current user. /// </summary> /// <returns> /// The names of the the SQL Server LocalDB instances for the current user. /// </returns> /// <exception cref="InvalidOperationException"> /// SQL Server LocalDB is not installed on the local machine. /// </exception> /// <exception cref="SqlLocalDbException"> /// The SQL Server LocalDB instance names could not be determined. /// </exception> public virtual IList <string> GetInstanceNames() => SqlLocalDbApi.GetInstanceNames();