Exemplo n.º 1
0
        public HttpResponseMessage ExplainGet(string docId)
        {
            if (string.IsNullOrEmpty(docId))
            {
                return(GetMessageWithString("Document key is required.", HttpStatusCode.BadRequest));
            }

            var destinationUrl = GetQueryStringValue("destinationUrl");

            if (string.IsNullOrEmpty(destinationUrl))
            {
                return(GetMessageWithString("Destination url is required.", HttpStatusCode.BadRequest));
            }

            var databaseName = GetQueryStringValue("databaseName");

            if (string.IsNullOrEmpty(databaseName))
            {
                return(GetMessageWithString("Destination database name is required.", HttpStatusCode.BadRequest));
            }

            var result = new ReplicationExplanationForDocument
            {
                Key         = docId,
                Destination = new ReplicationExplanationForDocument.DestinationInformation
                {
                    Url          = destinationUrl,
                    DatabaseName = databaseName
                }
            };

            var destinations = ReplicationTask.GetReplicationDestinations(x => string.Equals(x.Url, destinationUrl, StringComparison.OrdinalIgnoreCase) && string.Equals(x.Database, databaseName, StringComparison.OrdinalIgnoreCase));

            if (destinations == null || destinations.Length == 0)
            {
                result.Message = string.Format("Could not find replication destination for a given url ('{0}') and database ('{1}').", destinationUrl, databaseName);
                return(GetMessageWithObject(result));
            }

            if (destinations.Length > 1)
            {
                result.Message = string.Format("There is more than one replication destination for a given url ('{0}') and database ('{1}').", destinationUrl, databaseName);
                return(GetMessageWithObject(result));
            }

            var destination = destinations[0];
            var destinationsReplicationInformationForSource = ReplicationTask.GetLastReplicatedEtagFrom(destination);

            if (destinationsReplicationInformationForSource == null)
            {
                result.Message = "Could not connect to destination server.";
                return(GetMessageWithObject(result));
            }

            var destinationId = destinationsReplicationInformationForSource.ServerInstanceId.ToString();

            result.Destination.ServerInstanceId = destinationId;
            result.Destination.LastDocumentEtag = destinationsReplicationInformationForSource.LastDocumentEtag;

            var document = Database.Documents.Get(docId, null);

            if (document == null)
            {
                result.Message = string.Format("Document with given key ('{0}') does not exist.", docId);
                return(GetMessageWithObject(result));
            }

            result.Key  = document.Key;
            result.Etag = document.Etag;

            string reason;

            if (destination.FilterDocuments(destinationId, document.Key, document.Metadata, out reason) == false)
            {
                result.Message = reason;
                return(GetMessageWithObject(result));
            }

            reason         = EtagUtil.IsGreaterThan(document.Etag, destinationsReplicationInformationForSource.LastDocumentEtag) ? "Document will be replicated." : "Document should have been replicated.";
            result.Message = reason;

            return(GetMessageWithObject(result));
        }
Exemplo n.º 2
0
        protected List <ReplicationStrategy> GetReplicationDestinations(Predicate <ReplicationDestination> predicate = null)
        {
            var destinations = Replication.GetReplicationDestinations(predicate);

            return(destinations.Where(x => x.IsETL == false).ToList());
        }