PageRenderTime 42ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/Raven.Database/Server/Controllers/DatabasesController.cs

https://github.com/nwendel/ravendb
C# | 124 lines | 98 code | 19 blank | 7 comment | 11 complexity | dd19923ad07d97b6db228315285ae4c9 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, BSD-3-Clause, CC-BY-SA-3.0
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Net;
  4. using System.Net.Http;
  5. using System.Threading;
  6. using System.Web.Http;
  7. using Raven.Abstractions.Data;
  8. using Raven.Database.Extensions;
  9. using Raven.Database.Server.Security;
  10. using Raven.Database.Util;
  11. using Raven.Json.Linq;
  12. namespace Raven.Database.Server.Controllers
  13. {
  14. public class DatabasesController : RavenDbApiController
  15. {
  16. [HttpGet]
  17. [Route("databases")]
  18. public HttpResponseMessage Databases(bool getAdditionalData = false)
  19. {
  20. if (EnsureSystemDatabase() == false)
  21. return
  22. GetMessageWithString(
  23. "The request '" + InnerRequest.RequestUri.AbsoluteUri + "' can only be issued on the system database",
  24. HttpStatusCode.BadRequest);
  25. // This method is NOT secured, and anyone can access it.
  26. // Because of that, we need to provide explicit security here.
  27. // Anonymous Access - All / Get / Admin
  28. // Show all dbs
  29. // Anonymous Access - None
  30. // Show only the db that you have access to (read / read-write / admin)
  31. // If admin, show all dbs
  32. var start = GetStart();
  33. var nextPageStart = start; // will trigger rapid pagination
  34. var databases = Database.Documents.GetDocumentsWithIdStartingWith("Raven/Databases/", null, null, start,
  35. GetPageSize(Database.Configuration.MaxPageSize), CancellationToken.None, ref nextPageStart);
  36. var databasesData = databases
  37. .Select(database =>
  38. new
  39. {
  40. Name = database.Value<RavenJObject>("@metadata").Value<string>("@id").Replace("Raven/Databases/", string.Empty),
  41. Disabled = database.Value<bool>("Disabled")
  42. }).ToList();
  43. var databasesNames = databasesData.Select(databaseObject => databaseObject.Name).ToArray();
  44. List<string> approvedDatabases = null;
  45. if (DatabasesLandlord.SystemConfiguration.AnonymousUserAccessMode == AnonymousUserAccessMode.None)
  46. {
  47. var user = User;
  48. if (user == null)
  49. return null;
  50. if (user.IsAdministrator(DatabasesLandlord.SystemConfiguration.AnonymousUserAccessMode) == false)
  51. {
  52. var authorizer = (MixedModeRequestAuthorizer)this.ControllerContext.Configuration.Properties[typeof(MixedModeRequestAuthorizer)];
  53. approvedDatabases = authorizer.GetApprovedResources(user, this, databasesNames);
  54. }
  55. }
  56. var lastDocEtag = Etag.Empty;
  57. Database.TransactionalStorage.Batch(accessor =>
  58. {
  59. lastDocEtag = accessor.Staleness.GetMostRecentDocumentEtag();
  60. });
  61. if (MatchEtag(lastDocEtag))
  62. return GetEmptyMessage(HttpStatusCode.NotModified);
  63. if (approvedDatabases != null)
  64. {
  65. databasesData = databasesData.Where(databaseData => approvedDatabases.Contains(databaseData.Name)).ToList();
  66. databasesNames = databasesNames.Where(databaseName => approvedDatabases.Contains(databaseName)).ToArray();
  67. }
  68. var responseMessage = getAdditionalData ? GetMessageWithObject(databasesData) : GetMessageWithObject(databasesNames);
  69. WriteHeaders(new RavenJObject(), lastDocEtag, responseMessage);
  70. return responseMessage;
  71. }
  72. [HttpGet]
  73. [Route("database/size")]
  74. [Route("databases/{databaseName}/database/size")]
  75. public HttpResponseMessage DatabaseSize()
  76. {
  77. var totalSizeOnDisk = Database.GetTotalSizeOnDisk();
  78. return GetMessageWithObject(new
  79. {
  80. DatabaseSize = totalSizeOnDisk,
  81. DatabaseSizeHumane = SizeHelper.Humane(totalSizeOnDisk)
  82. });
  83. }
  84. [HttpGet]
  85. [Route("database/storage/sizes")]
  86. [Route("databases/{databaseName}/database/storage/sizes")]
  87. public HttpResponseMessage DatabaseStorageSizes()
  88. {
  89. var indexStorageSize = Database.GetIndexStorageSizeOnDisk();
  90. var transactionalStorageSize = Database.GetTransactionalStorageSizeOnDisk();
  91. var totalDatabaseSize = indexStorageSize + transactionalStorageSize.AllocatedSizeInBytes;
  92. return GetMessageWithObject(new
  93. {
  94. TransactionalStorageAllocatedSize = transactionalStorageSize.AllocatedSizeInBytes,
  95. TransactionalStorageAllocatedSizeHumaneSize = SizeHelper.Humane(transactionalStorageSize.AllocatedSizeInBytes),
  96. TransactionalStorageUsedSize = transactionalStorageSize.UsedSizeInBytes,
  97. TransactionalStorageUsedSizeHumaneSize = SizeHelper.Humane(transactionalStorageSize.UsedSizeInBytes),
  98. IndexStorageSize = indexStorageSize,
  99. IndexStorageSizeHumane = SizeHelper.Humane(indexStorageSize),
  100. TotalDatabaseSize = totalDatabaseSize,
  101. TotalDatabaseSizeHumane = SizeHelper.Humane(totalDatabaseSize),
  102. });
  103. }
  104. }
  105. }