public static void EnsureDatabaseDocumentExists(this IDatabaseCommands self, DatabaseDocument databaseDocument) { var serverClient = self.ForSystemDatabase() as ServerClient; if (serverClient == null) { throw new InvalidOperationException("Multiple databases are not supported in the embedded API currently"); } serverClient.ForceReadFromMaster(); if (serverClient.Get("Raven/Databases/" + Uri.EscapeDataString(databaseDocument.Id)) != null) { return; } if (databaseDocument.Settings.ContainsKey("Raven/DataDir") == false) { throw new InvalidOperationException("The Raven/DataDir setting is mandatory"); } var doc = RavenJObject.FromObject(databaseDocument); doc.Remove("Id"); var req = serverClient.CreateRequest("/admin/databases/" + Uri.EscapeDataString(databaseDocument.Id), "PUT"); req.WriteAsync(doc.ToString(Formatting.Indented)).Wait(); req.ExecuteRequest(); }
///<summary> /// Ensures that the database exists, creating it if needed ///</summary> /// <remarks> /// This operation happens _outside_ of any transaction /// </remarks> public static void EnsureDatabaseExists(this IDatabaseCommands self, string name, bool ignoreFailures = false) { var serverClient = self.ForSystemDatabase() as ServerClient; if (serverClient == null) { throw new InvalidOperationException("Multiple databases are not supported in the embedded API currently"); } serverClient.ForceReadFromMaster(); var doc = MultiDatabase.CreateDatabaseDocument(name); var docId = "Raven/Databases/" + name; try { if (serverClient.Get(docId) != null) { return; } var req = serverClient.CreateRequest("PUT", "/admin/databases/" + Uri.EscapeDataString(name)); req.Write(doc.ToString(Formatting.Indented)); req.ExecuteRequest(); new RavenDocumentsByEntityName().Execute(serverClient.ForDatabase(name), new DocumentConvention()); } catch (Exception) { if (ignoreFailures == false) { throw; } } }
public SetupDefaultDatabase() { #region default_database_1 // without specifying `DefaultDatabase` // created `DatabaseCommands` or opened `Sessions` // will work on `<system>` database by default // if no database is passed explicitly using (IDocumentStore store = new DocumentStore { Url = "http://localhost:8080/" }.Initialize()) { IDatabaseCommands commands = store.DatabaseCommands; using (IDocumentSession session = store.OpenSession()) { // ... } IDatabaseCommands northwindCommands = commands.ForDatabase("Northwind"); using (IDocumentSession northwindSession = store.OpenSession("Northwind")) { // ... } } #endregion #region default_database_2 // when `DefaultDatabase` is set to `Northwind` // created `DatabaseCommands` or opened `Sessions` // will work on `Northwind` database by default // if no database is passed explicitly using (IDocumentStore store = new DocumentStore { Url = "http://localhost:8080/", DefaultDatabase = "Northwind" }.Initialize()) { IDatabaseCommands northwindCommands = store.DatabaseCommands; using (IDocumentSession northwindSession = store.OpenSession()) { // ... } IDatabaseCommands adventureWorksCommands = northwindCommands.ForDatabase("AdventureWorks"); using (IDocumentSession adventureWorksSession = store.OpenSession("AdventureWorks")) { // ... } IDatabaseCommands systemCommands = northwindCommands.ForSystemDatabase(); using (IDocumentSession systemSession = store.OpenSession(Constants.SystemDatabase)) { // .. } } #endregion }
protected void WaitForRestore(IDatabaseCommands databaseCommands) { var systemDatabaseCommands = databaseCommands.ForSystemDatabase(); // need to be sure that we are checking system database var failureMessages = new[] { "Esent Restore: Failure! Could not restore database!", "Error: Restore Canceled", "Restore Operation: Failure! Could not restore database!" }; var restoreFinishMessages = new[] { "The new database was created", "Esent Restore: Restore Complete", "Restore ended but could not create the datebase document, in order to access the data create a database with the appropriate name", }; var done = SpinWait.SpinUntil(() => { // We expect to get the doc from the <system> database var doc = systemDatabaseCommands.Get(RestoreStatus.RavenRestoreStatusDocumentKey); if (doc == null) { return(false); } var status = doc.DataAsJson.Deserialize <RestoreStatus>(new DocumentConvention()); if (failureMessages.Any(status.Messages.Contains)) { throw new InvalidOperationException("Restore failure: " + status.Messages.Aggregate(string.Empty, (output, message) => output + (message + Environment.NewLine))); } return(restoreFinishMessages.Any(status.Messages.Contains)); }, TimeSpan.FromMinutes(5)); if (!done) { throw new Exception("WaitForRestore failed"); } }
public static void CreateDatabase(this IDatabaseCommands self, DatabaseDocument databaseDocument) { var serverClient = self.ForSystemDatabase() as ServerClient; if (serverClient == null) { throw new InvalidOperationException("Ensuring database existence requires a Server Client but got: " + self); } if (databaseDocument.Settings.ContainsKey("Raven/DataDir") == false) { throw new InvalidOperationException("The Raven/DataDir setting is mandatory"); } var doc = RavenJObject.FromObject(databaseDocument); doc.Remove("Id"); var req = serverClient.CreateRequest("PUT", "/admin/databases/" + Uri.EscapeDataString(databaseDocument.Id)); req.Write(doc.ToString(Formatting.Indented)); req.ExecuteRequest(); }
public void Execute(Guid myResourceManagerId, IDatabaseCommands commands) { var resourceManagersRequiringRecovery = new HashSet <Guid>(); var filesToDelete = new List <string>(); using (var ctx = documentStore.TransactionRecoveryStorage.Create()) { foreach (var file in ctx.GetFileNames("*.recovery-information")) { var txId = string.Empty; try { Stream stream; try { stream = ctx.OpenRead(file); } catch (Exception e) { logger.WarnException( "Could not open recovery information: " + file + ", this is expected if it is an active transaction / held by another server", e); continue; } using (stream) using (var reader = new BinaryReader(stream)) { var resourceManagerId = new Guid(reader.ReadString()); if (myResourceManagerId != resourceManagerId) { continue; // it doesn't belong to us, ignore } filesToDelete.Add(file); txId = reader.ReadString(); var db = reader.ReadString(); var dbCmds = string.IsNullOrEmpty(db) == false ? commands.ForDatabase(db) : commands.ForSystemDatabase(); TransactionManager.Reenlist(resourceManagerId, stream.ReadData(), new InternalEnlistment(dbCmds, txId)); resourceManagersRequiringRecovery.Add(resourceManagerId); logger.Info("Recovered transaction {0}", txId); } } catch (Exception e) { logger.WarnException("Could not re-enlist in DTC transaction for tx: " + txId, e); } } foreach (var rm in resourceManagersRequiringRecovery) { try { TransactionManager.RecoveryComplete(rm); } catch (Exception e) { logger.WarnException("Could not properly complete recovery of resource manager: " + rm, e); } } var errors = new List <Exception>(); foreach (var file in filesToDelete) { try { ctx.DeleteFile(file); } catch (Exception e) { errors.Add(e); } } if (errors.Count > 0) { throw new AggregateException(errors); } } }
public void Execute(Guid myResourceManagerId, IDatabaseCommands commands) { var resourceManagersRequiringRecovery = new HashSet<Guid>(); using (var store = IsolatedStorageFile.GetMachineStoreForDomain()) { var filesToDelete = new List<string>(); foreach (var file in store.GetFileNames("*.recovery-information")) { var txId = Guid.Empty; try { IsolatedStorageFileStream stream; try { stream = store.OpenFile(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); } catch (Exception e) { logger.WarnException("Could not open recovery information: " + file +", this is expected if it is an active transaction / held by another server", e); continue; } using (stream) using(var reader = new BinaryReader(stream)) { var resourceManagerId = new Guid(reader.ReadString()); if(myResourceManagerId != resourceManagerId) continue; // it doesn't belong to us, ignore filesToDelete.Add(file); txId = new Guid(reader.ReadString()); var db = reader.ReadString(); var dbCmds = string.IsNullOrEmpty(db) == false ? commands.ForDatabase(db) : commands.ForSystemDatabase(); TransactionManager.Reenlist(resourceManagerId, stream.ReadData(), new InternalEnlistment(dbCmds, txId)); resourceManagersRequiringRecovery.Add(resourceManagerId); logger.Info("Recovered transaction {0}", txId); } } catch (Exception e) { logger.WarnException("Could not re-enlist in DTC transaction for tx: " + txId, e); } } foreach (var rm in resourceManagersRequiringRecovery) { try { TransactionManager.RecoveryComplete(rm); } catch (Exception e) { logger.WarnException("Could not properly complete recovery of resource manager: " + rm, e); } } var errors = new List<Exception>(); foreach (var file in filesToDelete) { try { if (store.FileExists(file)) store.DeleteFile(file); } catch (Exception e) { errors.Add(e); } } if (errors.Count > 0) throw new AggregateException(errors); } }
public IAsyncDatabaseCommands ForSystemDatabase() { return(new EmbeddedAsyncServerClient(databaseCommands.ForSystemDatabase())); }
protected void WaitForRestore(IDatabaseCommands databaseCommands) { var systemDatabaseCommands = databaseCommands.ForSystemDatabase(); // need to be sure that we are checking system database var failureMessages = new[] { "Esent Restore: Failure! Could not restore database!", "Error: Restore Canceled", "Restore Operation: Failure! Could not restore database!" }; var restoreFinishMessages = new[] { "The new database was created", "Esent Restore: Restore Complete", "Restore ended but could not create the datebase document, in order to access the data create a database with the appropriate name", }; var done = SpinWait.SpinUntil(() => { // We expect to get the doc from the <system> database var doc = systemDatabaseCommands.Get(RestoreStatus.RavenRestoreStatusDocumentKey); if (doc == null) return false; var status = doc.DataAsJson.Deserialize<RestoreStatus>(new DocumentConvention()); if (failureMessages.Any(status.Messages.Contains)) throw new InvalidOperationException("Restore failure: " + status.Messages.Aggregate(string.Empty, (output, message) => output + (message + Environment.NewLine))); return restoreFinishMessages.Any(status.Messages.Contains); }, TimeSpan.FromMinutes(5)); if (!done) throw new Exception("WaitForRestore failed"); }