private void InitializeTriggers() { PutTriggers.OfType <IRequiresDocumentDatabaseInitialization>().Apply(initialization => initialization.Initialize(this)); DeleteTriggers.OfType <IRequiresDocumentDatabaseInitialization>().Apply(initialization => initialization.Initialize(this)); ReadTriggers.OfType <IRequiresDocumentDatabaseInitialization>().Apply(initialization => initialization.Initialize(this)); IndexUpdateTriggers.OfType <IRequiresDocumentDatabaseInitialization>().Apply(initialization => initialization.Initialize(this)); }
private void InitializeTriggersExceptIndexCodecs() { FileCodecs.OfType <IRequiresFileSystemInitialization>().Apply(initialization => initialization.Initialize(this)); PutTriggers.Init(disableAllTriggers).OfType <IRequiresFileSystemInitialization>().Apply(initialization => initialization.Initialize(this)); DeleteTriggers.Init(disableAllTriggers).OfType <IRequiresFileSystemInitialization>().Apply(initialization => initialization.Initialize(this)); ReadTriggers.Init(disableAllTriggers).OfType <IRequiresFileSystemInitialization>().Apply(initialization => initialization.Initialize(this)); }
private void AssertPutOperationNotVetoed(string key, JObject metadata, JObject document, TransactionInformation transactionInformation) { var vetoResult = PutTriggers .Select(trigger => new { Trigger = trigger, VetoResult = trigger.AllowPut(key, document, metadata, transactionInformation) }) .FirstOrDefault(x => x.VetoResult.IsAllowed == false); if (vetoResult != null) { throw new OperationVetoedException("PUT vetoed by " + vetoResult.Trigger + " because: " + vetoResult.VetoResult.Reason); } }
public PutResult Put(string key, Guid?etag, RavenJObject document, RavenJObject metadata, TransactionInformation transactionInformation) { if (key != null && Encoding.Unicode.GetByteCount(key) >= 255) { throw new ArgumentException("The key must be a maximum of 255 bytes in unicode, 127 characters", "key"); } log.DebugFormat("Putting a document with key: {0} and etag {1}", key, etag); if (string.IsNullOrEmpty(key)) { // we no longer sort by the key, so it doesn't matter // that the key is no longer sequential key = Guid.NewGuid().ToString(); } RemoveReservedProperties(document); RemoveReservedProperties(metadata); Guid newEtag = Guid.Empty; lock (this) { TransactionalStorage.Batch(actions => { if (key.EndsWith("/")) { key += actions.General.GetNextIdentityValue(key); } if (transactionInformation == null) { AssertPutOperationNotVetoed(key, metadata, document, transactionInformation); PutTriggers.Apply(trigger => trigger.OnPut(key, document, metadata, transactionInformation)); newEtag = actions.Documents.AddDocument(key, etag, document, metadata); // We detect this by using the etags // AddIndexingTask(actions, metadata, () => new IndexDocumentsTask { Keys = new[] { key } }); PutTriggers.Apply(trigger => trigger.AfterPut(key, document, metadata, newEtag, transactionInformation)); } else { newEtag = actions.Transactions.AddDocumentInTransaction(key, etag, document, metadata, transactionInformation); } workContext.ShouldNotifyAboutWork(); }); } TransactionalStorage .ExecuteImmediatelyOrRegisterForSyncronization(() => PutTriggers.Apply(trigger => trigger.AfterCommit(key, document, metadata, newEtag))); return(new PutResult { Key = key, ETag = newEtag }); }
private void SecondStageInitialization() { FileCodecs .OfType <IRequiresFileSystemInitialization>() .Apply(initialization => initialization.SecondStageInit()); PutTriggers.Apply(initialization => initialization.SecondStageInit()); DeleteTriggers.Apply(initialization => initialization.SecondStageInit()); ReadTriggers.Apply(initialization => initialization.SecondStageInit()); }
private void SecondStageInitialization() { DocumentCodecs .OfType <IRequiresDocumentDatabaseInitialization>() .Concat(PutTriggers.OfType <IRequiresDocumentDatabaseInitialization>()) .Concat(DeleteTriggers.OfType <IRequiresDocumentDatabaseInitialization>()) .Concat(IndexCodecs.OfType <IRequiresDocumentDatabaseInitialization>()) .Concat(IndexQueryTriggers.OfType <IRequiresDocumentDatabaseInitialization>()) .Concat(AttachmentPutTriggers.OfType <IRequiresDocumentDatabaseInitialization>()) .Concat(AttachmentDeleteTriggers.OfType <IRequiresDocumentDatabaseInitialization>()) .Concat(AttachmentReadTriggers.OfType <IRequiresDocumentDatabaseInitialization>()) .Concat(IndexUpdateTriggers.OfType <IRequiresDocumentDatabaseInitialization>()) .Apply(initialization => initialization.SecondStageInit()); }
public PutResult Put(string key, Guid?etag, JObject document, JObject metadata, TransactionInformation transactionInformation) { if (string.IsNullOrEmpty(key)) { // we no longer sort by the key, so it doesn't matter // that the key is no longer sequential key = Guid.NewGuid().ToString(); } RemoveReservedProperties(document); RemoveReservedProperties(metadata); Guid newEtag = Guid.Empty; lock (this) { TransactionalStorage.Batch(actions => { if (key.EndsWith("/")) { key += actions.General.GetNextIdentityValue(key); } if (transactionInformation == null) { AssertPutOperationNotVetoed(key, metadata, document, transactionInformation); PutTriggers.Apply(trigger => trigger.OnPut(key, document, metadata, transactionInformation)); newEtag = actions.Documents.AddDocument(key, etag, document, metadata); // We detect this by using the etags // AddIndexingTask(actions, metadata, () => new IndexDocumentsTask { Keys = new[] { key } }); PutTriggers.Apply(trigger => trigger.AfterPut(key, document, metadata, newEtag, transactionInformation)); } else { newEtag = actions.Transactions.AddDocumentInTransaction(key, etag, document, metadata, transactionInformation); } workContext.ShouldNotifyAboutWork(); }); } TransactionalStorage .ExecuteImmediatelyOrRegisterForSyncronization(() => PutTriggers.Apply(trigger => trigger.AfterCommit(key, document, metadata, newEtag))); return(new PutResult { Key = key, ETag = newEtag }); }
public PutResult Put(string key, Guid?etag, JObject document, JObject metadata, TransactionInformation transactionInformation) { if (string.IsNullOrEmpty(key)) { Guid value; UuidCreateSequential(out value); key = value.ToString(); } RemoveReservedProperties(document); RemoveReservedProperties(metadata); TransactionalStorage.Batch(actions => { metadata["Last-Modified"] = JToken.FromObject(DateTime.UtcNow.ToString("r")); if (key.EndsWith("/")) { key += actions.General.GetNextIdentityValue(key); } metadata.Add("@id", new JValue(key)); if (transactionInformation == null) { AssertPutOperationNotVetoed(key, metadata, document, transactionInformation); PutTriggers.Apply(trigger => trigger.OnPut(key, document, metadata, transactionInformation)); etag = actions.Documents.AddDocument(key, etag, document, metadata); AddIndexingTask(actions, metadata, () => new IndexDocumentsTask { Keys = new[] { key } }); PutTriggers.Apply(trigger => trigger.AfterPut(key, document, metadata, etag.Value, transactionInformation)); } else { etag = actions.Transactions.AddDocumentInTransaction(key, etag, document, metadata, transactionInformation); } workContext.ShouldNotifyAboutWork(); }); TransactionalStorage .ExecuteImmediatelyOrRegisterForSyncronization(() => PutTriggers.Apply(trigger => trigger.AfterCommit(key, document, metadata, etag.Value))); return(new PutResult { Key = key, ETag = etag.Value }); }
private void InitializeTriggersExceptIndexCodecs() { DocumentCodecs // .Init(disableAllTriggers) // Document codecs should always be activated (RavenDB-576) .OfType <IRequiresDocumentDatabaseInitialization>().Apply(initialization => initialization.Initialize(this)); PutTriggers.Init(disableAllTriggers).OfType <IRequiresDocumentDatabaseInitialization>().Apply(initialization => initialization.Initialize(this)); DeleteTriggers.Init(disableAllTriggers).OfType <IRequiresDocumentDatabaseInitialization>().Apply(initialization => initialization.Initialize(this)); ReadTriggers.Init(disableAllTriggers).OfType <IRequiresDocumentDatabaseInitialization>().Apply(initialization => initialization.Initialize(this)); IndexQueryTriggers.Init(disableAllTriggers).OfType <IRequiresDocumentDatabaseInitialization>().Apply(initialization => initialization.Initialize(this)); AttachmentPutTriggers.Init(disableAllTriggers).OfType <IRequiresDocumentDatabaseInitialization>().Apply(initialization => initialization.Initialize(this)); AttachmentDeleteTriggers.Init(disableAllTriggers).OfType <IRequiresDocumentDatabaseInitialization>().Apply(initialization => initialization.Initialize(this)); AttachmentReadTriggers.Init(disableAllTriggers).OfType <IRequiresDocumentDatabaseInitialization>().Apply(initialization => initialization.Initialize(this)); IndexUpdateTriggers.Init(disableAllTriggers).OfType <IRequiresDocumentDatabaseInitialization>().Apply(initialization => initialization.Initialize(this)); }