private void HandleConflictedAttachment(Attachment attachment) { var attachmentDataStream = attachment.Data(); var attachmentData = attachmentDataStream.ToJObject(); var conflicts = attachmentData.Value<RavenJArray>("Conflicts"); if (conflicts == null) return; var currentSource = Database.TransactionalStorage.Id.ToString(); foreach (var c in conflicts) { var conflict = Database.GetStatic(c.Value<string>()); var conflictSource = conflict.Metadata.Value<RavenJValue>(Constants.RavenReplicationSource).Value<string>(); if (conflictSource != currentSource) continue; this.deletedHistory.Value = new RavenJArray { new RavenJObject { { Constants.RavenReplicationVersion, conflict.Metadata[Constants.RavenReplicationVersion] }, { Constants.RavenReplicationSource, conflict.Metadata[Constants.RavenReplicationSource] } } }; return; } }
protected override bool TryResolve(string id, RavenJObject metadata, byte[] data, Attachment existingAttachment, Func<string, Attachment> getAttachment, out RavenJObject metadataToSave, out byte[] dataToSave) { var existingAttachmentIsInConflict = existingAttachment.Metadata[Constants.RavenReplicationConflict] != null; var existingAttachmentIsDeleted = existingAttachment.Metadata[Constants.RavenDeleteMarker] != null && existingAttachment.Metadata[Constants.RavenDeleteMarker].Value<bool>(); metadataToSave = null; dataToSave = null; if (existingAttachmentIsInConflict && existingAttachmentIsDeleted == false) { var conflictIds = existingAttachment.Data().ToJObject().Value<RavenJArray>("Conflicts") .Select(x => x.Value<string>()) .ToArray(); if (conflictIds.Length == 0) return false; if (conflictIds .Select(getAttachment) .All(doc => Historian.IsDirectChildOfCurrent(metadata, doc.Metadata)) == false) return false; metadataToSave = metadata; dataToSave = data; return true; } return false; }
public bool TryResolveConflict(string id, RavenJObject metadata, byte[] data, Attachment existingAttachment, Func<string, Attachment> getAttachment, out RavenJObject metadataToSave, out byte[] dataToSave) { var success = TryResolve(id, metadata, data, existingAttachment, getAttachment, out metadataToSave, out dataToSave); if (success == false) return false; var metaToSave = metadataToSave; log.Debug(() => { var builder = new StringBuilder(); builder.AppendLine(string.Format("Conflict on attachment with key '{0}' resolved by '{1}'.", id, GetType().Name)); builder.AppendLine(string.Format("Existing metadata:")); if (existingAttachment != null && existingAttachment.Metadata != null) builder.AppendLine(existingAttachment.Metadata.ToString()); builder.AppendLine(string.Format("Incoming metadata:")); if (metadata != null) builder.AppendLine(metadata.ToString()); builder.AppendLine(string.Format("Output metadata:")); if (metaToSave != null) builder.AppendLine(metaToSave.ToString()); return builder.ToString(); }); return true; }
public override bool TryResolve(string id, RavenJObject metadata, byte[] data, Attachment existingAttachment, Func<string, Attachment> getAttachment, out RavenJObject metadataToSave, out byte[] dataToSave) { metadataToSave = metadata; dataToSave = data; return true; }
protected override bool TryResolve(string id, RavenJObject metadata, byte[] data, Attachment existingAttachment, Func<string, Attachment> getAttachment, out RavenJObject metadataToSave, out byte[] dataToSave) { metadataToSave = existingAttachment.Metadata; dataToSave = existingAttachment.Data().ReadData(); return true; }
public virtual void OnRead(string key, Attachment attachment) { }
public abstract bool TryResolve(string id, RavenJObject metadata, byte[] data, Attachment existingAttachment, Func<string, Attachment> getAttachment, out RavenJObject metadataToSave, out byte[] dataToSave);
private static bool IsDirectChildOfCurrentAttachment(Attachment existingAttachment, RavenJObject metadata) { var version = new RavenJObject { {ReplicationConstants.RavenReplicationSource, existingAttachment.Metadata[ReplicationConstants.RavenReplicationSource]}, {ReplicationConstants.RavenReplicationVersion, existingAttachment.Metadata[ReplicationConstants.RavenReplicationVersion]}, }; var history = metadata[ReplicationConstants.RavenReplicationHistory]; if (history == null) // no history, not a parent return false; return history.Values().Contains(version, new RavenJTokenEqualityComparer()); }
public override void OnRead(string key, Attachment attachment) { attachment.Data = () => new MemoryStream(new byte[] { 1, 2, 3, 4 }); attachment.Size = 4; }
private bool HasConflict(Attachment attachment) { var conflict = attachment.Metadata.Value<RavenJValue>(Constants.RavenReplicationConflict); return conflict != null && conflict.Value<bool>(); }
private void HandleAttachment(Attachment document) { deletedHistory.Value = document.Metadata.Value<RavenJArray>(Constants.RavenReplicationHistory) ?? new RavenJArray(); deletedHistory.Value.Add( new RavenJObject { {Constants.RavenReplicationVersion, document.Metadata[Constants.RavenReplicationVersion]}, {Constants.RavenReplicationSource, document.Metadata[Constants.RavenReplicationSource]} }); }
private void HandleAttachment(Attachment document) { deletedHistory.Value = new RavenJArray(ReplicationData.GetHistory(document.Metadata)) { new RavenJObject { {Constants.RavenReplicationVersion, document.Metadata[Constants.RavenReplicationVersion]}, {Constants.RavenReplicationSource, document.Metadata[Constants.RavenReplicationSource]} } }; }
public abstract bool TryResolve(string id, RavenJObject metadata, byte [] data, Attachment existingAttachment);