Esempio n. 1
0
        private void HandleForceRevisionCreation(BlittableJsonReaderObject batchResult)
        {
            // When forcing a revision for a document that does Not have any revisions yet then the HasRevisions flag is added to the document.
            // In this case we need to update the tracked entities in the session with the document new change-vector.

            if (GetBooleanField(batchResult, CommandType.ForceRevisionCreation, "RevisionCreated") == false)
            {
                // no forced revision was created...nothing to update.
                return;
            }

            var id           = GetLazyStringField(batchResult, CommandType.ForceRevisionCreation, Constants.Documents.Metadata.Id);
            var changeVector = GetLazyStringField(batchResult, CommandType.ForceRevisionCreation, Constants.Documents.Metadata.ChangeVector);

            if (_session.DocumentsById.TryGetValue(id, out var documentInfo) == false)
            {
                return;
            }

            documentInfo.ChangeVector = changeVector;

            HandleMetadataModifications(documentInfo, batchResult, id, changeVector);

            var afterSaveChangesEventArgs = new AfterSaveChangesEventArgs(_session, documentInfo.Id, documentInfo.Entity);

            _session.OnAfterSaveChangesInvoke(afterSaveChangesEventArgs);
        }
Esempio n. 2
0
        private void HandlePatch(BlittableJsonReaderObject batchResult)
        {
            if (batchResult.TryGet(nameof(PatchStatus), out string statusAsString) == false)
            {
                ThrowMissingField(CommandType.PATCH, nameof(PatchStatus));
            }

            if (Enum.TryParse(statusAsString, ignoreCase: true, out PatchStatus status) == false)
            {
                ThrowMissingField(CommandType.PATCH, nameof(PatchStatus));
            }

            switch (status)
            {
            case PatchStatus.Created:
            case PatchStatus.Patched:
                if (batchResult.TryGet(nameof(PatchResult.ModifiedDocument), out BlittableJsonReaderObject document) == false)
                {
                    return;
                }

                var id = GetLazyStringField(batchResult, CommandType.PATCH, nameof(ICommandData.Id));

                if (_session.DocumentsById.TryGetValue(id, out var sessionDocumentInfo) == false)
                {
                    return;
                }

                var documentInfo = GetOrAddModifications(id, sessionDocumentInfo, applyModifications: true);

                var changeVector = GetLazyStringField(batchResult, CommandType.PATCH, nameof(Constants.Documents.Metadata.ChangeVector));
                var lastModified = GetLazyStringField(batchResult, CommandType.PATCH, nameof(Constants.Documents.Metadata.LastModified));

                documentInfo.ChangeVector = changeVector;

                documentInfo.Metadata.Modifications = new DynamicJsonValue(documentInfo.Metadata)
                {
                    [Constants.Documents.Metadata.Id]           = id,
                    [Constants.Documents.Metadata.ChangeVector] = changeVector,
                    [Constants.Documents.Metadata.LastModified] = lastModified
                };

                using (var old = documentInfo.Document)
                {
                    documentInfo.Document = document;

                    ApplyMetadataModifications(id, documentInfo);
                }

                if (documentInfo.Entity != null)
                {
                    _session.EntityToBlittable.PopulateEntity(documentInfo.Entity, id, documentInfo.Document, _session.JsonSerializer);
                    var afterSaveChangesEventArgs = new AfterSaveChangesEventArgs(_session, documentInfo.Id, documentInfo.Entity);
                    _session.OnAfterSaveChangesInvoke(afterSaveChangesEventArgs);
                }
                break;
            }
        }
Esempio n. 3
0
        private void HandlePut(int index, BlittableJsonReaderObject batchResult, bool isDeferred)
        {
            object       entity       = null;
            DocumentInfo documentInfo = null;

            if (isDeferred == false)
            {
                entity = _entities[index];
                if (_session.DocumentsByEntity.TryGetValue(entity, out documentInfo) == false)
                {
                    return;
                }
            }

            var id           = GetLazyStringField(batchResult, CommandType.PUT, Constants.Documents.Metadata.Id);
            var changeVector = GetLazyStringField(batchResult, CommandType.PUT, Constants.Documents.Metadata.ChangeVector);

            if (isDeferred)
            {
                if (_session.DocumentsById.TryGetValue(id, out var sessionDocumentInfo) == false)
                {
                    return;
                }

                documentInfo = GetOrAddModifications(id, sessionDocumentInfo, applyModifications: true);

                entity = documentInfo.Entity;
            }

            documentInfo.Metadata.Modifications = new DynamicJsonValue(documentInfo.Metadata);

            foreach (var propertyName in batchResult.GetPropertyNames())
            {
                if (propertyName == nameof(ICommandData.Type))
                {
                    continue;
                }

                documentInfo.Metadata.Modifications[propertyName] = batchResult[propertyName];
            }

            documentInfo.Id           = id;
            documentInfo.ChangeVector = changeVector;

            ApplyMetadataModifications(id, documentInfo);

            _session.DocumentsById.Add(documentInfo);

            if (entity != null)
            {
                _session.GenerateEntityIdOnTheClient.TrySetIdentity(entity, id);
            }

            var afterSaveChangesEventArgs = new AfterSaveChangesEventArgs(_session, documentInfo.Id, documentInfo.Entity);

            _session.OnAfterSaveChangesInvoke(afterSaveChangesEventArgs);
        }
Esempio n. 4
0
        public void SetResult(BlittableArrayResult result)
        {
            if (result.Results == null) //precaution
            {
                ThrowOnNullResults();
                return;
            }

            for (var i = 0; i < _sessionCommandsCount; i++)
            {
                var batchResult = result.Results[i] as BlittableJsonReaderObject;
                if (batchResult == null)
                {
                    throw new ArgumentNullException();
                }

                batchResult.TryGet("Type", out string type);

                if (type != "PUT")
                {
                    continue;
                }

                var entity = _entities[i];
                if (_session.DocumentsByEntity.TryGetValue(entity, out DocumentInfo documentInfo) == false)
                {
                    continue;
                }

                if (batchResult.TryGet(Constants.Documents.Metadata.ChangeVector, out string changeVector) == false || changeVector == null)
                {
                    throw new InvalidOperationException("PUT response is invalid. @change-vector is missing on " + documentInfo.Id);
                }

                if (batchResult.TryGet(Constants.Documents.Metadata.Id, out string id) == false || id == null)
                {
                    throw new InvalidOperationException("PUT response is invalid. @id is missing on " + documentInfo.Id);
                }

                documentInfo.Metadata.Modifications = null;
                documentInfo.Metadata.Modifications = new DynamicJsonValue(documentInfo.Metadata);

                foreach (var propertyName in batchResult.GetPropertyNames())
                {
                    if (propertyName == "Type")
                    {
                        continue;
                    }

                    documentInfo.Metadata.Modifications[propertyName] = batchResult[propertyName];
                }

                documentInfo.Id                     = id;
                documentInfo.ChangeVector           = changeVector;
                documentInfo.Metadata               = _session.Context.ReadObject(documentInfo.Metadata, id);
                documentInfo.Document.Modifications = null;
                documentInfo.Document.Modifications = new DynamicJsonValue(documentInfo.Document)
                {
                    [Constants.Documents.Metadata.Key] = documentInfo.Metadata
                };
                documentInfo.Document         = _session.Context.ReadObject(documentInfo.Document, id);
                documentInfo.MetadataInstance = null;

                _session.DocumentsById.Add(documentInfo);
                _session.GenerateEntityIdOnTheClient.TrySetIdentity(entity, id);

                var afterSaveChangesEventArgs = new AfterSaveChangesEventArgs(_session, documentInfo.Id, documentInfo.Entity);
                _session.OnAfterSaveChangesInvoke(afterSaveChangesEventArgs);
            }
        }