示例#1
0
        public void Execute()
        {
            if ((Directory.Exists(Path.Combine(backupLocation, "Indexes")) == false) ||
                (Directory.Exists(Path.Combine(backupLocation, "IndexDefinitions")) == false))
            {
                throw new InvalidOperationException(backupLocation + " doesn't look like a valid backup");
            }

            if (Directory.Exists(databaseLocation) && Directory.GetFileSystemEntries(databaseLocation).Length > 0)
            {
                throw new IOException("Database already exists, cannot restore to an existing database.");
            }

            if (Directory.Exists(databaseLocation) == false)
            {
                Directory.CreateDirectory(databaseLocation);
            }

            Directory.CreateDirectory(Path.Combine(databaseLocation, "logs"));
            Directory.CreateDirectory(Path.Combine(databaseLocation, "temp"));
            Directory.CreateDirectory(Path.Combine(databaseLocation, "system"));

            CopyAll(new DirectoryInfo(Path.Combine(backupLocation, "IndexDefinitions")),
                    new DirectoryInfo(Path.Combine(databaseLocation, "IndexDefinitions")));
            CopyAll(new DirectoryInfo(Path.Combine(backupLocation, "Indexes")),
                    new DirectoryInfo(Path.Combine(databaseLocation, "Indexes")));


            JET_INSTANCE instance;

            Api.JetCreateInstance(out instance, "restoring " + Guid.NewGuid());
            try
            {
                TransactionalStorage.ConfigureInstance(instance, databaseLocation);
                Api.JetRestoreInstance(instance, backupLocation, databaseLocation, StatusCallback);

                var fileThatGetsCreatedButDoesntSeemLikeItShould = new FileInfo(Path.Combine(new DirectoryInfo(databaseLocation).Parent.FullName, new DirectoryInfo(databaseLocation).Name + "Data"));
                if (fileThatGetsCreatedButDoesntSeemLikeItShould.Exists)
                {
                    fileThatGetsCreatedButDoesntSeemLikeItShould.MoveTo(Path.Combine(databaseLocation, "Data"));
                }
            }
            finally
            {
                Api.JetTerm(instance);
            }
        }