Exemple #1
0
        protected RavenDbServer GetNewServer()
        {
        	var ravenConfiguration = new RavenConfiguration
        	{
        		Port = 8080,
        		RunInMemory = true,
        		DataDirectory = "Data",
        		AnonymousUserAccessMode = AnonymousUserAccessMode.All
        	};

        	ConfigureServer(ravenConfiguration);

			if(ravenConfiguration.RunInMemory == false)
				IOExtensions.DeleteDirectory(ravenConfiguration.DataDirectory);

        	var ravenDbServer = new RavenDbServer(ravenConfiguration);

			using (var documentStore = new DocumentStore
			{
				Url = "http://localhost:8080"
			}.Initialize())
			{
				new RavenDocumentsByEntityName().Execute(documentStore);
			}

        	return ravenDbServer;
        }
 public EsentExportOperation(string dataDirPath)
 {
     var dbFullPath = Path.Combine(dataDirPath, "Data");            
     try
     {
         Api.JetCreateInstance(out instance, "instance");
         var ravenConfiguration = new RavenConfiguration();
         ravenConfiguration.DataDirectory = dataDirPath;
         ravenConfiguration.Storage.PreventSchemaUpdate = true;
         ITransactionalStorage storage;
         var success = StorageExporter.TryToCreateTransactionalStorage(ravenConfiguration, out storage);
         if (!success) ConsoleUtils.PrintErrorAndFail("Failed to create transactional storage");
         var configurator = new TransactionalStorageConfigurator(ravenConfiguration, (TransactionalStorage)storage);
         configurator.ConfigureInstance(instance, dataDirPath);
         storage.Dispose();
         Api.JetInit(ref instance);
         Api.JetBeginSession(instance, out sesid, null, null);           
         Api.JetAttachDatabase(sesid, dbFullPath, AttachDatabaseGrbit.None);
         Api.JetOpenDatabase(sesid, dbFullPath, null, out dbid, OpenDatabaseGrbit.None);
     }
     catch (Exception e)
     {
         ConsoleUtils.PrintErrorAndFail(e.Message, e.StackTrace);
     }
 }
		public override void RespondToAdmin(IHttpContext context)
		{
			if (EnsureSystemDatabase(context) == false)
				return;

			var restoreRequest = context.ReadJsonObject<RestoreRequest>();

			var ravenConfiguration = new RavenConfiguration();
			if (File.Exists(Path.Combine(restoreRequest.RestoreLocation, "Raven.ravendb")))
			{
				ravenConfiguration.DefaultStorageTypeName = "Raven.Storage.Managed.TransactionalStorage, Raven.Storage.Managed";
			}
			else if (Directory.Exists(Path.Combine(restoreRequest.RestoreLocation, "new")))
			{
				ravenConfiguration.DefaultStorageTypeName = "Raven.Storage.Esent.TransactionalStorage, Raven.Storage.Esent";
			}
			var restoreDoc = new List<string>();

			// Commented out unfinished code to get it to compile
			//		    DocumentDatabase.Restore(ravenConfiguration, restoreRequest.RestoreLocation, restoreRequest.DatabaseLocation,
			//		                             msg =>
			//		                             {
			//
			//		                             });
			//            SystemDatabase.
		}
        public static void Restore(RavenConfiguration configuration, DatabaseRestoreRequest restoreRequest, Action<string> output)
        {
            var databaseDocumentPath = FindDatabaseDocument(restoreRequest.BackupLocation);
            if (File.Exists(databaseDocumentPath) == false)
            {
                throw new InvalidOperationException("Cannot restore when the Database.Document file is missing in the backup folder: " + restoreRequest.BackupLocation);
            }

            var databaseDocumentText = File.ReadAllText(databaseDocumentPath);
            var databaseDocument = RavenJObject.Parse(databaseDocumentText).JsonDeserialization<DatabaseDocument>();

            string storage;
            if (databaseDocument.Settings.TryGetValue("Raven/StorageTypeName", out storage) == false)
            {
                storage = "esent";
            }

            if (!string.IsNullOrWhiteSpace(restoreRequest.DatabaseLocation))
            {
                configuration.DataDirectory = restoreRequest.DatabaseLocation;
            }

            using (var transactionalStorage = configuration.CreateTransactionalStorage(storage, () => { }))
            {
                transactionalStorage.Restore(restoreRequest, output);
            }
        }
Exemple #5
0
        public RavenDB_1594()
        {
            path = NewDataPath();
            pathsToDelete.Add("~/Databases");
            Raven.Database.Extensions.IOExtensions.DeleteDirectory(path);
            var config = new Raven.Database.Config.RavenConfiguration
            {
                Port = 8079,
                RunInUnreliableYetFastModeThatIsNotSuitableForProduction = true,
                DataDirectory = path,
                Settings      = { { "Raven/ActiveBundles", "PeriodicBackup" } },
            };

            config.PostInit();
            ravenDbServer = new RavenDbServer(config)
            {
                UseEmbeddedHttpServer = true
            };
            ravenDbServer.Initialize();
            documentStore = new DocumentStore
            {
                Url = "http://localhost:8079"
            };
            documentStore.Initialize();
        }
Exemple #6
0
 public StorageExporter(string databaseBaseDirectory, string databaseOutputFile,int batchSize)
 {
     baseDirectory = databaseBaseDirectory;
     outputDirectory = databaseOutputFile;
     var ravenConfiguration = new RavenConfiguration();
     ravenConfiguration.DataDirectory = databaseBaseDirectory;
     ravenConfiguration.Storage.PreventSchemaUpdate = true;
     CreateTransactionalStorage(ravenConfiguration);
     BatchSize = batchSize;
 }
Exemple #7
0
 public StorageExporter(string databaseBaseDirectory, string databaseOutputFile,int batchSize,Etag documentsStartEtag)
 {
     baseDirectory = databaseBaseDirectory;
     outputDirectory = databaseOutputFile;
     var ravenConfiguration = new RavenConfiguration();
     ravenConfiguration.DataDirectory = databaseBaseDirectory;
     ravenConfiguration.Storage.PreventSchemaUpdate = true;
     ravenConfiguration.Storage.SkipConsistencyCheck = true;
     CreateTransactionalStorage(ravenConfiguration);
     BatchSize = batchSize;
     DocumentsStartEtag = documentsStartEtag;
 }
Exemple #8
0
		public TestServerFixture()
		{
			var configuration = new RavenConfiguration();
			configuration.Port = Port;
			configuration.ServerName = ServerName;
			configuration.RunInMemory = configuration.DefaultStorageTypeName == InMemoryRavenConfiguration.VoronTypeName;
			configuration.DataDirectory = Path.Combine(configuration.DataDirectory, "Tests");

			IOExtensions.DeleteDirectory(configuration.DataDirectory);

			Server = new RavenDbServer(configuration)
			{
				UseEmbeddedHttpServer = true
			}.Initialize();
		}
		public RavenConfiguration ConvertToRavenConfiguration()
		{
			var configuration = new RavenConfiguration
			                    {
				                    Port = Port,
				                    RunInMemory = RunInMemory,
				                    DefaultStorageTypeName = "esent"
			                    };

			foreach (var key in Settings.Keys)
			{
				configuration.Settings.Add(key, Settings[key]);
			}

			return configuration;
		}
Exemple #10
0
		public override void RespondToAdmin(IHttpContext context)
		{
			if (EnsureSystemDatabase(context) == false)
				return;

			var restoreRequest = context.ReadJsonObject<RestoreRequest>();

			var ravenConfiguration = new RavenConfiguration();
			if (File.Exists(Path.Combine(restoreRequest.RestoreLocation, "Raven.ravendb")))
			{
				ravenConfiguration.DefaultStorageTypeName = "Raven.Storage.Managed.TransactionalStorage, Raven.Storage.Managed";
			}
			else if (Directory.Exists(Path.Combine(restoreRequest.RestoreLocation, "new")))
			{
				ravenConfiguration.DefaultStorageTypeName = "Raven.Storage.Esent.TransactionalStorage, Raven.Storage.Esent";
			}

			var restoreStatus = new List<string>();

			DocumentDatabase.Restore(ravenConfiguration, restoreRequest.RestoreLocation, restoreRequest.DatabaseLocation,
			                         msg =>
			                         {
				                         restoreStatus.Add(msg);
				                         SystemDatabase.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null,
											 RavenJObject.FromObject(new {restoreStatus}), new RavenJObject(), null);
			                         });

			if (File.Exists(Path.Combine(restoreRequest.RestoreLocation, "Database.Document")))
			{
				var databaseDocumentText = File.ReadAllText(Path.Combine(restoreRequest.RestoreLocation, "Database.Document"));
				var databaseDocument = RavenJObject.Parse(databaseDocumentText).JsonDeserialization<DatabaseDocument>();
				if (databaseDocument == null)
					return;

				if (!string.IsNullOrWhiteSpace(restoreRequest.DatabaseLocation))
					databaseDocument.Settings[Constants.RavenDataDir] = restoreRequest.DatabaseLocation;
				if (!string.IsNullOrWhiteSpace(restoreRequest.DatabaseName))
					databaseDocument.Id = "Raven/Databases/" + restoreRequest.DatabaseName;
				SystemDatabase.Put(databaseDocument.Id, null, RavenJObject.FromObject(databaseDocument), new RavenJObject(), null);

				restoreStatus.Add("The new database was created");
				SystemDatabase.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null,
					RavenJObject.FromObject(new { restoreStatus }), new RavenJObject(), null);
			}
		}
Exemple #11
0
		protected RavenDbServer GetNewServer(int port)
		{
			var dataDirectory = Path.Combine(NewDataPath(), "System");
			var configuration = new RavenConfiguration
								{
									Port = port,
									DataDirectory = dataDirectory,
									AnonymousUserAccessMode = AnonymousUserAccessMode.Admin
								};
			configuration.RunInMemory = configuration.DefaultStorageTypeName == InMemoryRavenConfiguration.VoronTypeName;

			var ravenDbServer = new RavenDbServer(configuration)
			{
				UseEmbeddedHttpServer = true
			};

			ravenDbServer.Initialize();
			return ravenDbServer;
		}
		public TestServerFixture()
		{
			var configuration = new RavenConfiguration();
			configuration.Port = Port;
			configuration.ServerName = ServerName;
			configuration.RunInMemory = configuration.DefaultStorageTypeName == InMemoryRavenConfiguration.VoronTypeName;
			configuration.DataDirectory = Path.Combine(configuration.DataDirectory, "Tests");
			configuration.MaxSecondsForTaskToWaitForDatabaseToLoad = 10;

			IOExtensions.DeleteDirectory(configuration.DataDirectory);

			NonAdminHttp.EnsureCanListenToWhenInNonAdminContext(Port);

			Server = new RavenDbServer(configuration)
			{
				UseEmbeddedHttpServer = true,
				RunInMemory = true
			}.Initialize();
		}
Exemple #13
0
 public StorageExporter(string databaseBaseDirectory, string databaseOutputFile, 
     int batchSize, Etag documentsStartEtag, bool hasCompression, EncryptionConfiguration encryption)
 {
     HasCompression = hasCompression;
     Encryption = encryption;
     baseDirectory = databaseBaseDirectory;
     outputDirectory = databaseOutputFile;
     var ravenConfiguration = new RavenConfiguration
     {
         DataDirectory = databaseBaseDirectory,
         CacheDocumentsInMemory = false,
         Storage =
         {
             PreventSchemaUpdate = true,
             SkipConsistencyCheck = true,
         }
     };
     CreateTransactionalStorage(ravenConfiguration);
     this.batchSize = batchSize;
     DocumentsStartEtag = documentsStartEtag;
 }
Exemple #14
0
		public RavenDB_1594()
		{
		    path = NewDataPath();
			Raven.Database.Extensions.IOExtensions.DeleteDirectory(path);
			var config = new Raven.Database.Config.RavenConfiguration
			             	{
			             		Port = 8079,
			             		RunInUnreliableYetFastModeThatIsNotSuitableForProduction = true,
			             		DataDirectory = path,
								Settings = { { "Raven/ActiveBundles", "PeriodicBackup" } },
			             	};
			config.PostInit();
		    ravenDbServer = new RavenDbServer(config)
		    {
		        UseEmbeddedHttpServer = true
		    };
		    ravenDbServer.Initialize();
			documentStore = new DocumentStore
			{
				Url = "http://localhost:8079"
			};
			documentStore.Initialize();
		}
Exemple #15
0
		protected RavenDbServer GetNewServer(int port = 8079, string dataDirectory = "Data")
		{
			var ravenConfiguration = new RavenConfiguration
									 {
										 Port = port,
										 DataDirectory = dataDirectory,
										 RunInMemory = true,
										 AnonymousUserAccessMode = AnonymousUserAccessMode.All
									 };

			ModifyConfiguration(ravenConfiguration);

			if (ravenConfiguration.RunInMemory == false)
				IOExtensions.DeleteDirectory(ravenConfiguration.DataDirectory);

			NonAdminHttp.EnsureCanListenToWhenInNonAdminContext(ravenConfiguration.Port);
			var ravenDbServer = new RavenDbServer(ravenConfiguration);

			try
			{
				using (var documentStore = new DocumentStore
											{
												Conventions =
													{
														FailoverBehavior = FailoverBehavior.FailImmediately
													},
												Url = "http://localhost:" + port
											}.Initialize())
				{
					CreateDefaultIndexes(documentStore);
				}
			}
			catch
			{
				ravenDbServer.Dispose();
				throw;
			}
			return ravenDbServer;
		}
 /// <summary>
 /// Registers the ClockDocsBundle in the configuration of an embedded database.
 /// </summary>
 /// <param name="configuration"></param>
 public static void RegisterBundle(RavenConfiguration configuration)
 {
     configuration.Catalog.Catalogs.Add(new AssemblyCatalog(typeof(ClockDocsHelper).Assembly));
 }
		protected override void ModifyConfiguration(RavenConfiguration configuration)
		{
			configuration.Settings["Raven/Esent/CircularLog"] = "false";
			configuration.RunInUnreliableYetFastModeThatIsNotSuitableForProduction = false;
		}
Exemple #18
0
 protected override void ModifyConfiguration(RavenConfiguration configuration)
 {
     // Wire up the bundle to the embedded database
     configuration.Catalog.Catalogs.Add(new AssemblyCatalog(typeof(CreatedDateTrigger).Assembly));
 }
Exemple #19
0
		protected RavenDbServer GetNewServer(bool initializeDocumentsByEntitiyName = true)
		{
			var ravenConfiguration = new RavenConfiguration
			{
				Port = 8079,
				RunInMemory = true,
				DataDirectory = "Data",
				AnonymousUserAccessMode = AnonymousUserAccessMode.All
			};

			ConfigureServer(ravenConfiguration);

			if(ravenConfiguration.RunInMemory == false)
				IOExtensions.DeleteDirectory(ravenConfiguration.DataDirectory);

			NonAdminHttp.EnsureCanListenToWhenInNonAdminContext(ravenConfiguration.Port);
			var ravenDbServer = new RavenDbServer(ravenConfiguration);

			if (initializeDocumentsByEntitiyName)
			{
				try
				{
					using (var documentStore = new DocumentStore
					{
						Url = "http://localhost:8079"
					}.Initialize())
					{
						new RavenDocumentsByEntityName().Execute(documentStore);
					}
				}
				catch
				{
					ravenDbServer.Dispose();
					throw;
				}
			}

			return ravenDbServer;
		}
 protected override void ModifyConfiguration(RavenConfiguration configuration)
 {
     Bundles.ClockDocs.ClockDocsHelper.RegisterBundle(configuration);
 }
Exemple #21
0
		public async Task<HttpResponseMessage> Restore()
		{
			if (EnsureSystemDatabase() == false)
				return GetMessageWithString("Restore is only possible from the system database", HttpStatusCode.BadRequest);

            var restoreStatus = new RestoreStatus{Messages = new List<string>()};

			var restoreRequest = await ReadJsonObjectAsync<RestoreRequest>();

			DatabaseDocument databaseDocument = null;

			var databaseDocumentPath = Path.Combine(restoreRequest.BackupLocation, "Database.Document");
			if (File.Exists(databaseDocumentPath))
			{
				var databaseDocumentText = File.ReadAllText(databaseDocumentPath);
				databaseDocument = RavenJObject.Parse(databaseDocumentText).JsonDeserialization<DatabaseDocument>();
			}

			var databaseName = !string.IsNullOrWhiteSpace(restoreRequest.DatabaseName) ? restoreRequest.DatabaseName
								   : databaseDocument == null ? null : databaseDocument.Id;

			if (string.IsNullOrWhiteSpace(databaseName))
			{
				var errorMessage = (databaseDocument == null || String.IsNullOrWhiteSpace(databaseDocument.Id))
								? "Database.Document file is invalid - database name was not found and not supplied in the request (Id property is missing or null). This is probably a bug - should never happen."
								: "A database name must be supplied if the restore location does not contain a valid Database.Document file";

                restoreStatus.Messages.Add(errorMessage);
                DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null, RavenJObject.FromObject(new { restoreStatus }), new RavenJObject(), null);

				return GetMessageWithString(errorMessage,HttpStatusCode.BadRequest);
			}

			if (databaseName == Constants.SystemDatabase)
				return GetMessageWithString("Cannot do an online restore for the <system> database", HttpStatusCode.BadRequest);

			var ravenConfiguration = new RavenConfiguration
			{
				DatabaseName = databaseName,
				IsTenantDatabase = true
			};

			if (databaseDocument != null)
			{
				foreach (var setting in databaseDocument.Settings)
				{
					ravenConfiguration.Settings[setting.Key] = setting.Value;
				}
			}

            if (File.Exists(Path.Combine(restoreRequest.BackupLocation, Voron.Impl.Constants.DatabaseFilename)))
                ravenConfiguration.DefaultStorageTypeName = typeof(Raven.Storage.Voron.TransactionalStorage).AssemblyQualifiedName;
            else if (Directory.Exists(Path.Combine(restoreRequest.BackupLocation, "new")))
				ravenConfiguration.DefaultStorageTypeName = typeof (Raven.Storage.Esent.TransactionalStorage).AssemblyQualifiedName;

			ravenConfiguration.CustomizeValuesForTenant(databaseName);
			ravenConfiguration.Initialize();

			string documentDataDir;
			ravenConfiguration.DataDirectory = ResolveTenantDataDirectory(restoreRequest.DatabaseLocation, databaseName, out documentDataDir);
			restoreRequest.DatabaseLocation = ravenConfiguration.DataDirectory;
			DatabasesLandlord.SystemDatabase.Documents.Delete(RestoreStatus.RavenRestoreStatusDocumentKey, null, null);
		    
            bool defrag;
		    if (bool.TryParse(GetQueryStringValue("defrag"), out defrag))
		        restoreRequest.Defrag = defrag;

            await Task.Factory.StartNew(() =>
            {
                MaintenanceActions.Restore(ravenConfiguration,restoreRequest,
                    msg =>
                    {
                        restoreStatus.Messages.Add(msg);
                        DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null,
                            RavenJObject.FromObject(restoreStatus), new RavenJObject(), null);
                    });

                if (databaseDocument == null)
                    return;

                databaseDocument.Settings[Constants.RavenDataDir] = documentDataDir;
                if (restoreRequest.IndexesLocation != null)
                    databaseDocument.Settings[Constants.RavenIndexPath] = restoreRequest.IndexesLocation;
                if (restoreRequest.JournalsLocation != null)
                    databaseDocument.Settings[Constants.RavenTxJournalPath] = restoreRequest.JournalsLocation;
                databaseDocument.Id = databaseName;
                DatabasesLandlord.Protect(databaseDocument);
                DatabasesLandlord.SystemDatabase.Documents.Put("Raven/Databases/" + databaseName, null, RavenJObject.FromObject(databaseDocument),
                    new RavenJObject(), null);

                restoreStatus.Messages.Add("The new database was created");
                DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null,
                    RavenJObject.FromObject(restoreStatus), new RavenJObject(), null);
            }, TaskCreationOptions.LongRunning);

            return GetEmptyMessage();
		}
Exemple #22
0
		public override void RespondToAdmin(IHttpContext context)
		{
			if (EnsureSystemDatabase(context) == false)
				return;

			var restoreRequest = context.ReadJsonObject<RestoreRequest>();

			DatabaseDocument databaseDocument = null;

			if (File.Exists(Path.Combine(restoreRequest.RestoreLocation, "Database.Document")))
			{
				var databaseDocumentText = File.ReadAllText(Path.Combine(restoreRequest.RestoreLocation, "Database.Document"));
				databaseDocument = RavenJObject.Parse(databaseDocumentText).JsonDeserialization<DatabaseDocument>();
			}

			var databaseName = !string.IsNullOrWhiteSpace(restoreRequest.DatabaseName) ? restoreRequest.DatabaseName
								   : databaseDocument == null ? null : databaseDocument.Id;

			if (string.IsNullOrWhiteSpace(databaseName))
			{
				context.SetStatusToBadRequest();
				context.WriteJson(new
				{
					Error = "A database name must be supplied if the restore location does not contain a valid Database.Document file"
				});
				return;
			}

			var ravenConfiguration = new RavenConfiguration()
			{
				DatabaseName = databaseName,
				IsTenantDatabase = true
			};

			if(databaseDocument != null)
			{
				foreach (var setting in databaseDocument.Settings)
				{
					ravenConfiguration.Settings[setting.Key] = setting.Value;
				}
			}

			if (File.Exists(Path.Combine(restoreRequest.RestoreLocation, "Raven.ravendb")))
			{
				ravenConfiguration.DefaultStorageTypeName = typeof(Raven.Storage.Managed.TransactionalStorage).AssemblyQualifiedName;

			}
			else if (Directory.Exists(Path.Combine(restoreRequest.RestoreLocation, "new")))
			{
				ravenConfiguration.DefaultStorageTypeName = typeof(Raven.Storage.Esent.TransactionalStorage).AssemblyQualifiedName;
			}

			ravenConfiguration.CustomizeValuesForTenant(databaseName);
			ravenConfiguration.Initialize();

			string documentDataDir;
			ravenConfiguration.DataDirectory = ResolveTenantDataDirectory(restoreRequest.DatabaseLocation, databaseName, out documentDataDir);

			var restoreStatus = new List<string>();
			SystemDatabase.Delete(RestoreStatus.RavenRestoreStatusDocumentKey, null, new TransactionInformation());
			var defrag = "true".Equals(context.Request.QueryString["defrag"], StringComparison.InvariantCultureIgnoreCase);
			DocumentDatabase.Restore(ravenConfiguration, restoreRequest.RestoreLocation, null,
			                         msg =>
			                         {
				                         restoreStatus.Add(msg);
				                         SystemDatabase.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null,
											 RavenJObject.FromObject(new {restoreStatus}), new RavenJObject(), null);
			                         }, defrag);

			if (databaseDocument == null)
				return;

			databaseDocument.Settings[Constants.RavenDataDir] = documentDataDir;
			databaseDocument.Id = databaseName;
			SystemDatabase.Put("Raven/Databases/" + databaseName, null, RavenJObject.FromObject(databaseDocument), new RavenJObject(), null);

			restoreStatus.Add("The new database was created");
			SystemDatabase.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null,
				RavenJObject.FromObject(new { restoreStatus }), new RavenJObject(), null);

		}
		protected virtual void ModifyConfiguration(RavenConfiguration configuration)
		{
		}
		protected virtual void ConfigureServer(RavenConfiguration ravenConfiguration)
		{
		}
        public async Task<HttpResponseMessage> Restore()
        {
            HttpResponseMessage message = null;
            if (EnsureSystemDatabase() == false)
                return GetMessageWithString("Restore is only possible from the system database", HttpStatusCode.BadRequest);

            var restoreStatus = new RestoreStatus { State = RestoreStatusState.Running, Messages = new List<string>() };

            var restoreRequest = await ReadJsonObjectAsync<FilesystemRestoreRequest>();

            if (!HasPermissions(restoreRequest.BackupLocation, out message))
                return message;

            var fileSystemDocumentPath = FindFilesystemDocument(restoreRequest.BackupLocation);

            if (!File.Exists(fileSystemDocumentPath))
            {
                throw new InvalidOperationException("Cannot restore when the Filesystem.Document file is missing in the backup folder: " + restoreRequest.BackupLocation);
            }

            var filesystemDocumentText = File.ReadAllText(fileSystemDocumentPath);
            var filesystemDocument = RavenJObject.Parse(filesystemDocumentText).JsonDeserialization<FileSystemDocument>();

            var filesystemName = !string.IsNullOrWhiteSpace(restoreRequest.FilesystemName) ? restoreRequest.FilesystemName
                                   : filesystemDocument == null ? null : filesystemDocument.Id;

            if (string.IsNullOrWhiteSpace(filesystemName))
            {
                var errorMessage = (filesystemDocument == null || String.IsNullOrWhiteSpace(filesystemDocument.Id))
                                ? Constants.FilesystemDocumentFilename +  " file is invalid - filesystem name was not found and not supplied in the request (Id property is missing or null). This is probably a bug - should never happen."
                                : "A filesystem name must be supplied if the restore location does not contain a valid " + Constants.FilesystemDocumentFilename + " file";

                restoreStatus.Messages.Add(errorMessage);
                DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenFilesystemRestoreStatusDocumentKey(filesystemName), null, RavenJObject.FromObject(new { restoreStatus }), new RavenJObject(), null);

                return GetMessageWithString(errorMessage, HttpStatusCode.BadRequest);
            }

            var ravenConfiguration = new RavenConfiguration
            {
                FileSystemName = filesystemName,
            };

            if (restoreRequest.IndexesLocation != null && 
                !IsValidPath(restoreRequest.IndexesLocation, out message))
                return message;
            if (restoreRequest.JournalsLocation != null &&
                !IsValidPath(restoreRequest.JournalsLocation, out message))
                return message;

            if (filesystemDocument != null)
            {
                //no need to check for existence of specified data and index folders here,
                //since those would be simply created after restore
                //we need to check only that the drive letter exists, so the folder can actually be created

                string dataLocation;
                if (filesystemDocument.Settings.TryGetValue(Constants.FileSystem.DataDirectory, out dataLocation))
                {
                    dataLocation = filesystemDocument.Settings[Constants.FileSystem.DataDirectory];
                    if (!IsOnValidDrive(dataLocation, out message))
                        return message;

                    if (!HasPermissions(dataLocation, out message))
                        return message;
                }

                string indexesLocation;
                if (filesystemDocument.Settings.TryGetValue(Constants.FileSystem.IndexStorageDirectory, out indexesLocation))
                {
                    indexesLocation = filesystemDocument.Settings[Constants.FileSystem.IndexStorageDirectory];
                    if (!IsOnValidDrive(indexesLocation, out message))
                        return message;

                    if (!HasPermissions(indexesLocation, out message))
                        return message;
                }
                foreach (var setting in filesystemDocument.Settings)
                {
                    ravenConfiguration.Settings[setting.Key] = setting.Value;
                }
            }

            ravenConfiguration.FileSystem.DefaultStorageTypeName = Directory.Exists(Path.Combine(restoreRequest.BackupLocation, "new")) ? 
                InMemoryRavenConfiguration.EsentTypeName : InMemoryRavenConfiguration.VoronTypeName;

            ravenConfiguration.CustomizeValuesForFileSystemTenant(filesystemName);
            ravenConfiguration.Initialize();

            string documentDataDir;
            ravenConfiguration.FileSystem.DataDirectory = ResolveTenantDataDirectory(restoreRequest.FilesystemLocation, filesystemName, out documentDataDir);
            restoreRequest.FilesystemLocation = ravenConfiguration.FileSystem.DataDirectory;

            string anotherRestoreResourceName;
            if (IsAnotherRestoreInProgress(out anotherRestoreResourceName))
            {
                if (restoreRequest.RestoreStartTimeout.HasValue)
                {
                    try
                    {
                        using (var cts = new CancellationTokenSource())
                        {
                            cts.CancelAfter(TimeSpan.FromSeconds(restoreRequest.RestoreStartTimeout.Value));
                            var token = cts.Token;
                            do
                            {
                                await Task.Delay(500, token);
                            }
                            while (IsAnotherRestoreInProgress(out anotherRestoreResourceName));
                        }
                    }
                    catch (OperationCanceledException)
                    {
                        return GetMessageWithString(string.Format("Another restore is still in progress (resource name = {0}). Waited {1} seconds for other restore to complete.", anotherRestoreResourceName, restoreRequest.RestoreStartTimeout.Value), HttpStatusCode.ServiceUnavailable);
                    }
                }
                else
                {
                    return GetMessageWithString(string.Format("Another restore is in progress (resource name = {0})", anotherRestoreResourceName), HttpStatusCode.ServiceUnavailable);
                }
            }
            Database.Documents.Put(RestoreInProgress.RavenRestoreInProgressDocumentKey, null, RavenJObject.FromObject(new RestoreInProgress
            {
                Resource = filesystemName
            }), new RavenJObject(), null);

            DatabasesLandlord.SystemDatabase.Documents.Delete(RestoreStatus.RavenFilesystemRestoreStatusDocumentKey(filesystemName), null, null);
            
            bool defrag;
            if (bool.TryParse(GetQueryStringValue("defrag"), out defrag))
                restoreRequest.Defrag = defrag;

            var task = Task.Factory.StartNew(() =>
            {
                try
                {
                    if (!string.IsNullOrWhiteSpace(restoreRequest.FilesystemLocation))
                        ravenConfiguration.FileSystem.DataDirectory = restoreRequest.FilesystemLocation;

                    using (var transactionalStorage = RavenFileSystem.CreateTransactionalStorage(ravenConfiguration))
                    {
                        transactionalStorage.Restore(restoreRequest, msg =>
                        {
                            restoreStatus.Messages.Add(msg);
                            DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenFilesystemRestoreStatusDocumentKey(filesystemName), null,
                                                                           RavenJObject.FromObject(restoreStatus), new RavenJObject(), null);
                        });
                    }

                    if (filesystemDocument == null)
                        return;

                    filesystemDocument.Settings[Constants.FileSystem.DataDirectory] = documentDataDir;

                    if (restoreRequest.IndexesLocation != null)
                        filesystemDocument.Settings[Constants.RavenIndexPath] = restoreRequest.IndexesLocation;
                    if (restoreRequest.JournalsLocation != null)
                        filesystemDocument.Settings[Constants.RavenTxJournalPath] = restoreRequest.JournalsLocation;
                    filesystemDocument.Id = filesystemName;

                    FileSystemsLandlord.Protect(filesystemDocument);

                    DatabasesLandlord.SystemDatabase.Documents.Put(Constants.FileSystem.Prefix + filesystemName, null, RavenJObject.FromObject(filesystemDocument), new RavenJObject(), null);

                    restoreStatus.State = RestoreStatusState.Completed;
                    restoreStatus.Messages.Add("The new filesystem was created");
                    DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenFilesystemRestoreStatusDocumentKey(filesystemName), null, RavenJObject.FromObject(restoreStatus), new RavenJObject(), null);
                }
                catch (Exception e)
                {
                    restoreStatus.State = RestoreStatusState.Faulted;
                    restoreStatus.Messages.Add("Unable to restore filesystem " + e.Message);
                    DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenFilesystemRestoreStatusDocumentKey(filesystemName), null, RavenJObject.FromObject(restoreStatus), new RavenJObject(), null);
                    throw;
                }
                finally
                {
                    Database.Documents.Delete(RestoreInProgress.RavenRestoreInProgressDocumentKey, null, null);
                }
            }, TaskCreationOptions.LongRunning);

            long id;
            Database.Tasks.AddTask(task, new TaskBasedOperationState(task), new TaskActions.PendingTaskDescription
            {
                StartTime = SystemTime.UtcNow,
                TaskType = TaskActions.PendingTaskType.RestoreFilesystem,
                Payload = "Restoring filesystem " + filesystemName + " from " + restoreRequest.BackupLocation
            }, out id);

            return GetMessageWithObject(new
            {
                OperationId = id
            });
        }	   
		protected override void ConfigureServer(RavenConfiguration ravenConfiguration)
		{
			ravenConfiguration.AnonymousUserAccessMode = AnonymousUserAccessMode.None;
			ravenConfiguration.AuthenticationMode = "OAuth";
			ravenConfiguration.OAuthTokenCertificate = CertGenerator.GenerateNewCertificate("RavenDB.Test");
		}
		protected override void ConfigureServer(RavenConfiguration ravenConfiguration)
		{
			ravenConfiguration.RunInMemory = false;
			ravenConfiguration.DefaultStorageTypeName = "esent";
		}
		protected override void ModifyConfiguration(RavenConfiguration ravenConfiguration)
		{
			ravenConfiguration.AnonymousUserAccessMode = AnonymousUserAccessMode.None;
		}
 protected override void ModifyConfiguration(RavenConfiguration configuration)
 {
     // Wire up the bundle to the embedded database
     configuration.Catalog.Catalogs.Add(new AssemblyCatalog(typeof(PutAttachmentTrigger).Assembly));
     configuration.Settings[Constants.ActiveBundles] = "IndexedAttachments";
 }
Exemple #30
0
		public async Task<HttpResponseMessage> Restore()
		{
			if (EnsureSystemDatabase() == false)
				return GetMessageWithString("Restore is only possible from the system database", HttpStatusCode.BadRequest);

			var restoreStatus = new RestoreStatus { State = RestoreStatusState.Running, Messages = new List<string>() };

			var restoreRequest = await ReadJsonObjectAsync<DatabaseRestoreRequest>();

			DatabaseDocument databaseDocument = null;

			var databaseDocumentPath = MaintenanceActions.FindDatabaseDocument(restoreRequest.BackupLocation);
			if (File.Exists(databaseDocumentPath))
			{
				var databaseDocumentText = File.ReadAllText(databaseDocumentPath);
				databaseDocument = RavenJObject.Parse(databaseDocumentText).JsonDeserialization<DatabaseDocument>();
			}

			var databaseName = !string.IsNullOrWhiteSpace(restoreRequest.DatabaseName) ? restoreRequest.DatabaseName
								   : databaseDocument == null ? null : databaseDocument.Id;

			if (string.IsNullOrWhiteSpace(databaseName))
			{
				var errorMessage = (databaseDocument == null || String.IsNullOrWhiteSpace(databaseDocument.Id))
								? "Database.Document file is invalid - database name was not found and not supplied in the request (Id property is missing or null). This is probably a bug - should never happen."
								: "A database name must be supplied if the restore location does not contain a valid Database.Document file";

				restoreStatus.Messages.Add(errorMessage);
				DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null, RavenJObject.FromObject(new { restoreStatus }), new RavenJObject(), null);

				return GetMessageWithString(errorMessage, HttpStatusCode.BadRequest);
			}

			if (databaseName == Constants.SystemDatabase)
				return GetMessageWithString("Cannot do an online restore for the <system> database", HttpStatusCode.BadRequest);

			var existingDatabase = Database.Documents.GetDocumentMetadata("Raven/Databases/" + databaseName, null);
			if (existingDatabase != null)
				return GetMessageWithString("Cannot do an online restore for an existing database, delete the database " + databaseName + " and restore again.", HttpStatusCode.BadRequest);

			var ravenConfiguration = new RavenConfiguration
			{
				DatabaseName = databaseName,
				IsTenantDatabase = true
			};

			if (databaseDocument != null)
			{
				foreach (var setting in databaseDocument.Settings)
				{
					ravenConfiguration.Settings[setting.Key] = setting.Value;
				}
			}

			if (File.Exists(Path.Combine(restoreRequest.BackupLocation, BackupMethods.Filename)))
				ravenConfiguration.DefaultStorageTypeName = typeof(Raven.Storage.Voron.TransactionalStorage).AssemblyQualifiedName;
			else if (Directory.Exists(Path.Combine(restoreRequest.BackupLocation, "new")))
				ravenConfiguration.DefaultStorageTypeName = typeof(Raven.Storage.Esent.TransactionalStorage).AssemblyQualifiedName;

			ravenConfiguration.CustomizeValuesForDatabaseTenant(databaseName);
			ravenConfiguration.Initialize();

			string documentDataDir;
			ravenConfiguration.DataDirectory = ResolveTenantDataDirectory(restoreRequest.DatabaseLocation, databaseName, out documentDataDir);
			restoreRequest.DatabaseLocation = ravenConfiguration.DataDirectory;

			string anotherRestoreResourceName;
			if (IsAnotherRestoreInProgress(out anotherRestoreResourceName))
			{
				if (restoreRequest.RestoreStartTimeout.HasValue)
				{
					try
					{
						using (var cts = new CancellationTokenSource())
						{
							cts.CancelAfter(TimeSpan.FromSeconds(restoreRequest.RestoreStartTimeout.Value));
							var token = cts.Token;
							do
							{
								await Task.Delay(500, token);
							}
							while (IsAnotherRestoreInProgress(out anotherRestoreResourceName));
						}
					}
					catch (OperationCanceledException)
					{
						return GetMessageWithString(string.Format("Another restore is still in progress (resource name = {0}). Waited {1} seconds for other restore to complete.", anotherRestoreResourceName, restoreRequest.RestoreStartTimeout.Value), HttpStatusCode.ServiceUnavailable);
					}
				}
				else
				{
					return GetMessageWithString(string.Format("Another restore is in progress (resource name = {0})", anotherRestoreResourceName), HttpStatusCode.ServiceUnavailable);
				}
			}
			Database.Documents.Put(RestoreInProgress.RavenRestoreInProgressDocumentKey, null, RavenJObject.FromObject(new RestoreInProgress
																												{
																													Resource = databaseName
																												}), new RavenJObject(), null);

			DatabasesLandlord.SystemDatabase.Documents.Delete(RestoreStatus.RavenRestoreStatusDocumentKey, null, null);

			bool defrag;
			if (bool.TryParse(GetQueryStringValue("defrag"), out defrag))
				restoreRequest.Defrag = defrag;

			var task = Task.Factory.StartNew(() =>
			{
                try
                {
				    MaintenanceActions.Restore(ravenConfiguration, restoreRequest,
					    msg =>
					    {
						    restoreStatus.Messages.Add(msg);
						    DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null,
							    RavenJObject.FromObject(restoreStatus), new RavenJObject(), null);
					    });

				    if (databaseDocument == null)
					    return;

				    databaseDocument.Settings[Constants.RavenDataDir] = documentDataDir;
				    if (restoreRequest.IndexesLocation != null)
					    databaseDocument.Settings[Constants.RavenIndexPath] = restoreRequest.IndexesLocation;
				    if (restoreRequest.JournalsLocation != null)
					    databaseDocument.Settings[Constants.RavenTxJournalPath] = restoreRequest.JournalsLocation;

				    bool replicationBundleRemoved = false;
				    if (restoreRequest.DisableReplicationDestinations)
					    replicationBundleRemoved = TryRemoveReplicationBundle(databaseDocument);

				    databaseDocument.Id = databaseName;
				    DatabasesLandlord.Protect(databaseDocument);
				    DatabasesLandlord
					    .SystemDatabase
					    .Documents
					    .Put("Raven/Databases/" + databaseName, null, RavenJObject.FromObject(databaseDocument), new RavenJObject(), null);

				    restoreStatus.Messages.Add("The new database was created");
                    restoreStatus.State = RestoreStatusState.Completed;
				    DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null,
					    RavenJObject.FromObject(restoreStatus), new RavenJObject(), null);

				    if (restoreRequest.GenerateNewDatabaseId) 
					    GenerateNewDatabaseId(databaseName);

				    if (replicationBundleRemoved)
					    AddReplicationBundleAndDisableReplicationDestinations(databaseName);

                }
                catch (Exception e)
                {
                    restoreStatus.State = RestoreStatusState.Faulted;
                    restoreStatus.Messages.Add("Unable to restore database " + e.Message);
                    DatabasesLandlord.SystemDatabase.Documents.Put(RestoreStatus.RavenRestoreStatusDocumentKey, null,
                               RavenJObject.FromObject(restoreStatus), new RavenJObject(), null);
                    throw;
                }
                finally
                {
                    Database.Documents.Delete(RestoreInProgress.RavenRestoreInProgressDocumentKey, null, null);
                }
			}, TaskCreationOptions.LongRunning);

			long id;
			Database.Tasks.AddTask(task, new TaskBasedOperationState(task), new TaskActions.PendingTaskDescription
			{
				StartTime = SystemTime.UtcNow,
				TaskType = TaskActions.PendingTaskType.RestoreDatabase,
				Payload = "Restoring database " + databaseName + " from " + restoreRequest.BackupLocation
			}, out id);


			return GetMessageWithObject(new
			{
				OperationId = id
			});
		}
Exemple #31
0
 protected override void ConfigureServer(RavenConfiguration serverConfiguration)
 {
     serverConfiguration.Catalog.Catalogs.Add(new TypeCatalog(typeof(DeleteOnConflict)));
 }