コード例 #1
0
        public ReplicationTopologyRootNode Discover()
        {
            var nextStart = 0;

            var root = new ReplicationTopologyRootNode(database.ServerUrl, database.TransactionalStorage.Id);

            if (ttl <= 0)
            {
                return(root);
            }

            ConfigurationDocument <ReplicationDocument <ReplicationDestination.ReplicationDestinationWithConfigurationOrigin> > configurationDocument = null;

            try
            {
                configurationDocument = database.ConfigurationRetriever.GetConfigurationDocument <ReplicationDocument <ReplicationDestination.ReplicationDestinationWithConfigurationOrigin> >(Constants.RavenReplicationDestinations);
            }
            catch (Exception)
            {
                root.Errors.Add(string.Format("Could not deserialize '{0}'.", Constants.RavenReplicationDestinations));
            }

            var sources = database.Documents.GetDocumentsWithIdStartingWith(Constants.RavenReplicationSourcesBasePath, null, null, 0, int.MaxValue, database.WorkContext.CancellationToken, ref nextStart);

            if (@from.Contains(database.ServerUrl) == false)
            {
                @from.Add(database.ServerUrl);
            }

            if (configurationDocument != null)
            {
                root.Destinations = HandleDestinations(configurationDocument.MergedDocument);
            }

            root.Sources = HandleSources(sources, root);

            return(root);
        }
コード例 #2
0
        public ReplicationTopologyRootNode Discover()
        {
            var nextStart = 0;

            var root = new ReplicationTopologyRootNode(database.ServerUrl, database.TransactionalStorage.Id);

            if (ttl <= 0)
            {
                return(root);
            }

            var destinations = database.Documents.Get(Constants.RavenReplicationDestinations, null);
            var sources      = database.Documents.GetDocumentsWithIdStartingWith(Constants.RavenReplicationSourcesBasePath, null, null, 0, int.MaxValue, database.WorkContext.CancellationToken, ref nextStart);

            if (@from.Contains(database.ServerUrl) == false)
            {
                @from.Add(database.ServerUrl);
            }

            root.Destinations = HandleDestinations(destinations, root);
            root.Sources      = HandleSources(sources, root);

            return(root);
        }
コード例 #3
0
        private List <ReplicationTopologySourceNode> HandleSources(IEnumerable <RavenJToken> sources, ReplicationTopologyRootNode root)
        {
            var nodes = new List <ReplicationTopologySourceNode>();

            foreach (var sourceAsJson in sources.Cast <RavenJObject>())
            {
                SourceReplicationInformation source = null;
                try
                {
                    source = sourceAsJson.JsonDeserialization <SourceReplicationInformation>();
                }
                catch (Exception)
                {
                    root.Errors.Add(string.Format("Could not deserialize source node."));
                }

                var node = HandleSource(source);
                nodes.Add(node);
            }

            return(nodes);
        }
コード例 #4
0
        private bool TryGetSchema(string serverUrl, RavenConnectionStringOptions connectionStringOptions, out ReplicationTopologyRootNode rootNode, out string error)
        {
            var url = string.Format("{0}/admin/replication/topology/discover?&ttl={1}", serverUrl, ttl - 1);

            try
            {
                var request = requestFactory.Create(url, HttpMethods.Post, connectionStringOptions);
                request.Write(from);

                error    = null;
                rootNode = request.ExecuteRequest <ReplicationTopologyRootNode>();

                var visitedNodes = new HashSet <string>();
                FindVisitedNodes(rootNode, visitedNodes);
                foreach (var visitedNode in visitedNodes)
                {
                    if (@from.Contains(visitedNode) == false)
                    {
                        @from.Add(visitedNode);
                    }
                }
                return(true);
            }
            catch (Exception e)
            {
                error    = e.Message;
                rootNode = null;
                return(false);
            }
        }
コード例 #5
0
        private List <ReplicationTopologyDestinationNode> HandleDestinations(JsonDocument destinationsAsJson, ReplicationTopologyRootNode root)
        {
            var nodes = new List <ReplicationTopologyDestinationNode>();

            if (destinationsAsJson == null)
            {
                return(nodes);
            }

            ReplicationDocument destinations;

            try
            {
                destinations = destinationsAsJson.DataAsJson.JsonDeserialization <ReplicationDocument>();
            }
            catch (Exception)
            {
                root.Errors.Add(string.Format("Could not deserialize '{0}'.", Constants.RavenReplicationDestinations));

                return(nodes);
            }

            nodes.AddRange(destinations.Destinations.Select(HandleDestination));

            return(nodes);
        }