public override async Task <HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) { InnerInitialization(controllerContext); DocumentDatabase db; try { db = await DatabasesLandlord.GetResourceInternal(DatabaseName).ConfigureAwait(false); } catch (Exception e) { return(GetMessageWithObject(new { Error = $"Could not open database named: {DatabaseName}, {e.Message}" }, HttpStatusCode.ServiceUnavailable)); } if (db == null) { return(GetMessageWithObject(new { Error = $"Could not open database named: {DatabaseName}, database does not exists" }, HttpStatusCode.ServiceUnavailable)); } if (db.Configuration == null || db.Configuration.Core.ActiveBundles == null || !db.Configuration.Core.ActiveBundles.Any(activeBundleName => activeBundleName.Equals(BundleName, StringComparison.InvariantCultureIgnoreCase))) { return(GetMessageWithObject(new { Error = $"{BundleName} bundle not activated in database named: {DatabaseName}" }, HttpStatusCode.BadRequest)); } return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false)); }
public override async Task <HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) { if (ForceClusterAwareness == false) { var clusterAwareHeader = GetClusterHeader(controllerContext, Constants.Cluster.ClusterAwareHeader); bool clusterAware; if (clusterAwareHeader == null || bool.TryParse(clusterAwareHeader, out clusterAware) == false || clusterAware == false) { return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false)); } } InnerInitialization(controllerContext); HttpResponseMessage message; if (IsClientV4OrHigher(out message)) { return(message); } if (Database == null || ClusterManager.IsActive() == false) { return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false)); } if (DatabaseName != null && await DatabasesLandlord.GetResourceInternal(DatabaseName).ConfigureAwait(false) == null) { var msg = "Could not find a database named: " + DatabaseName; return(GetMessageWithObject(new { Error = msg }, HttpStatusCode.ServiceUnavailable)); } if (Database.IsClusterDatabase() == false) { return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false)); } if (ClusterManager.IsLeader()) { return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false)); } if (IsReadRequest(controllerContext)) { var clusterReadBehaviorHeader = GetClusterHeader(controllerContext, Constants.Cluster.ClusterReadBehaviorHeader); if (string.Equals(clusterReadBehaviorHeader, "All", StringComparison.OrdinalIgnoreCase)) { return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false)); } } var clusterFailoverBehaviorHeader = GetClusterHeader(controllerContext, Constants.Cluster.ClusterFailoverBehaviorHeader); bool clusterFailoverBehavior; if (bool.TryParse(clusterFailoverBehaviorHeader, out clusterFailoverBehavior) && clusterFailoverBehavior) { return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false)); } return(RedirectToLeader(controllerContext.Request)); }
protected override TData GetData() { if (Landlord.IsDatabaseLoaded(DatabaseName)) { return(GetData(Landlord.GetResourceInternal(DatabaseName).Result)); } return(default(TData)); }
private void Attach(bool force) { if (force == false && attached) { return; } Task.Factory.StartNew(() => { lock (locker) { if (force == false && attached) { return; } var database = databaseLandlord .GetResourceInternal(databaseName) .Result; database.Notifications.OnIndexChange += (db, notification) => { if (notification.Type != IndexChangeTypes.IndexAdded) { return; } loadedIndexes.GetOrAdd(notification.Name, AddIndex); }; database.ConfigurationRetriever.SubscribeToConfigurationDocumentChanges(Constants.RavenReplicationDestinations, AddReplicationDestinationsFromDatabase); AddIndexesFromDatabase(database); AddReplicationDestinationsFromDatabase(); attached = true; } }); }
private List <DatabaseData> GetDatabasesData(IEnumerable <RavenJToken> databases) { return(databases .Select(database => { var bundles = new string[] {}; var settings = database.Value <RavenJObject>("Settings"); if (settings != null) { var activeBundles = settings.Value <string>("Raven/ActiveBundles"); if (activeBundles != null) { bundles = activeBundles.Split(';'); } } var dbName = database.Value <RavenJObject>("@metadata").Value <string>("@id").Replace("Raven/Databases/", string.Empty); var isDatabaseLoaded = DatabasesLandlord.IsDatabaseLoaded(dbName); DocumentDatabase.ReducedDatabaseStatistics stats = null; if (isDatabaseLoaded) { try { var db = DatabasesLandlord.GetResourceInternal(dbName).Result; if (db != null) { stats = db.ReducedStatistics; } } catch (Exception) { //the database is shutting down or locked //we can ignore this } } return new DatabaseData { Name = dbName, Disabled = database.Value <bool>("Disabled"), IndexingDisabled = GetBooleanSettingStatus(database.Value <RavenJObject>("Settings"), Constants.IndexingDisabled), RejectClientsEnabled = GetBooleanSettingStatus(database.Value <RavenJObject>("Settings"), Constants.RejectClientsModeEnabled), ClusterWide = ClusterManager.IsActive() && !GetBooleanSettingStatus(database.Value <RavenJObject>("Settings"), Constants.Cluster.NonClusterDatabaseMarker), Bundles = bundles, IsAdminCurrentTenant = DatabasesLandlord.SystemConfiguration.AnonymousUserAccessMode == AnonymousUserAccessMode.Admin, IsLoaded = isDatabaseLoaded, Stats = stats }; }).ToList()); }
public async Task <HttpResponseMessage> Console(string id) { var database = await DatabasesLandlord.GetResourceInternal(id).ConfigureAwait(false); var script = await ReadJsonObjectAsync <AdminJsScript>().ConfigureAwait(false); var console = new AdminJsConsole(database); var result = console.ApplyScript(script); if (result.Type == JTokenType.Null) { result = new RavenJValue("OK"); } return(GetMessageWithObject(result)); }