Пример #1
0
        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);
            }
        }
Пример #2
0
        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();
            }
        }
Пример #3
0
        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"));
            }
        }
Пример #4
0
 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"));
     }
 }
Пример #5
0
        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 + ";";
        }
Пример #6
0
        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;
            }
        }
Пример #7
0
 /// <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);
 }
Пример #8
0
        /// <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);
        }
Пример #9
0
        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();
        }
Пример #10
0
 /// <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();