Beispiel #1
0
        private void SaveNewReplicationStatus(SqlReplicationStatus localReplicationStatus)
        {
            int retries = 5;

            while (retries > 0)
            {
                retries--;
                try
                {
                    var obj = RavenJObject.FromObject(localReplicationStatus);
                    Database.Documents.Put(RavenSqlReplicationStatus, null, obj, new RavenJObject(), null);

                    break;
                }
                catch (SynchronizationLockException)
                {
                    // just ignore it, we'll save that next time
                    break;
                }
                catch (ConcurrencyException)
                {
                    Thread.Sleep(50);
                }
            }
        }
Beispiel #2
0
        private Etag GetLastEtagFor(SqlReplicationStatus replicationStatus, SqlReplicationConfig sqlReplicationConfig)
        {
            var lastEtag       = Etag.Empty;
            var lastEtagHolder = replicationStatus.LastReplicatedEtags.FirstOrDefault(
                x => string.Equals(sqlReplicationConfig.Name, x.Name, StringComparison.InvariantCultureIgnoreCase));

            if (lastEtagHolder != null)
            {
                lastEtag = lastEtagHolder.LastDocEtag;
            }
            return(lastEtag);
        }
        private Guid?GetLeastReplicatedEtag(List <SqlReplicationConfig> config, SqlReplicationStatus localReplicationStatus)
        {
            Guid?leastReplicatedEtag = null;

            foreach (var sqlReplicationConfig in config)
            {
                var lastEtag = GetLastEtagFor(localReplicationStatus, sqlReplicationConfig);
                if (leastReplicatedEtag == null)
                {
                    leastReplicatedEtag = lastEtag;
                }
                else if (ByteArrayComparer.Instance.Compare(lastEtag, leastReplicatedEtag.Value) < 0)
                {
                    leastReplicatedEtag = lastEtag;
                }
            }
            return(leastReplicatedEtag);
        }
Beispiel #4
0
        private void SaveNewReplicationStatus(SqlReplicationStatus localReplicationStatus)
        {
            int retries = 5;

            while (retries > 0)
            {
                retries--;
                try
                {
                    var obj = RavenJObject.FromObject(localReplicationStatus);
                    Database.Documents.Put(RavenSqlReplicationStatus, null, obj, new RavenJObject(), null);

                    break;
                }
                catch (ConcurrencyException)
                {
                    Thread.Sleep(50);
                }
            }
        }
Beispiel #5
0
        private void UpdateLastReplicatedStatus(SqlReplicationStatus localReplicationStatus, List <SqlReplicationConfig> config)
        {
            var lastReplicatedToDelete = new List <LastReplicatedEtag>();

            foreach (var lastReplicated in localReplicationStatus.LastReplicatedEtags)
            {
                if (config.Exists(x => x.Name.Equals(lastReplicated.Name, StringComparison.InvariantCultureIgnoreCase)) == false)
                {
                    lastReplicatedToDelete.Add(lastReplicated);
                }
            }

            if (lastReplicatedToDelete.Count == 0)
            {
                return; // nothing to do
            }
            foreach (var status in lastReplicatedToDelete)
            {
                localReplicationStatus.LastReplicatedEtags.Remove(status);
            }

            SaveNewReplicationStatus(localReplicationStatus);
        }
Beispiel #6
0
		private Guid GetLastEtagFor(SqlReplicationStatus replicationStatus, SqlReplicationConfig sqlReplicationConfig)
		{
			var lastEtag = Guid.Empty;
			var lastEtagHolder = replicationStatus.LastReplicatedEtags.FirstOrDefault(
				x => string.Equals(sqlReplicationConfig.Name, x.Name, StringComparison.InvariantCultureIgnoreCase));
			if (lastEtagHolder != null)
				lastEtag = lastEtagHolder.LastDocEtag;
			return lastEtag;
		}
Beispiel #7
0
		private Guid? GetLeastReplicatedEtag(List<SqlReplicationConfig> config, SqlReplicationStatus localReplicationStatus)
		{
			Guid? leastReplicatedEtag = null;
			foreach (var sqlReplicationConfig in config)
			{
				var lastEtag = GetLastEtagFor(localReplicationStatus, sqlReplicationConfig);
				if (leastReplicatedEtag == null)
					leastReplicatedEtag = lastEtag;
				else if (ByteArrayComparer.Instance.Compare(lastEtag, leastReplicatedEtag.Value) < 0)
					leastReplicatedEtag = lastEtag;
			}
			return leastReplicatedEtag;
		}
Beispiel #8
0
		private Etag GetLeastReplicatedEtag(IEnumerable<SqlReplicationConfig> config, SqlReplicationStatus localReplicationStatus)
		{
			var synchronizationEtag = etagSynchronizer.GetSynchronizationEtag();
			Etag leastReplicatedEtag = null;
			foreach (var sqlReplicationConfig in config)
			{
				var lastEtag = GetLastEtagFor(localReplicationStatus, sqlReplicationConfig);
				if (leastReplicatedEtag == null)
					leastReplicatedEtag = lastEtag;
				else if (lastEtag.CompareTo(leastReplicatedEtag) < 0)
					leastReplicatedEtag = lastEtag;
			}
			var calculateSynchronizationEtag = etagSynchronizer.CalculateSynchronizationEtag(synchronizationEtag, leastReplicatedEtag);

			return calculateSynchronizationEtag;
		}
Beispiel #9
0
		private void SaveNewReplicationStatus(SqlReplicationStatus localReplicationStatus, Etag latestEtag)
		{
			int retries = 5;
			while (retries > 0)
			{
				retries--;
				try
				{
					var obj = RavenJObject.FromObject(localReplicationStatus);
					Database.Put(RavenSqlreplicationStatus, null, obj, new RavenJObject(), null);

					lastLatestEtag = latestEtag;
					break;
				}
				catch (ConcurrencyException)
				{
					Thread.Sleep(50);
				}
			}
		}
		private Etag GetLeastReplicatedEtag(IEnumerable<SqlReplicationConfig> config, SqlReplicationStatus localReplicationStatus)
		{
			Etag leastReplicatedEtag = null;
			foreach (var sqlReplicationConfig in config)
			{
				var lastEtag = GetLastEtagFor(localReplicationStatus, sqlReplicationConfig);
				if (leastReplicatedEtag == null)
					leastReplicatedEtag = lastEtag;
				else if (lastEtag.CompareTo(leastReplicatedEtag) < 0)
					leastReplicatedEtag = lastEtag;
			}

			return leastReplicatedEtag;
		}
        private Etag GetLeastReplicatedEtag(IEnumerable <SqlReplicationConfig> config, SqlReplicationStatus localReplicationStatus)
        {
            var  synchronizationEtag = etagSynchronizer.GetSynchronizationEtag();
            Etag leastReplicatedEtag = null;

            foreach (var sqlReplicationConfig in config)
            {
                var lastEtag = GetLastEtagFor(localReplicationStatus, sqlReplicationConfig);
                if (leastReplicatedEtag == null)
                {
                    leastReplicatedEtag = lastEtag;
                }
                else if (lastEtag.CompareTo(leastReplicatedEtag) < 0)
                {
                    leastReplicatedEtag = lastEtag;
                }
            }
            var calculateSynchronizationEtag = etagSynchronizer.CalculateSynchronizationEtag(synchronizationEtag, leastReplicatedEtag);

            return(calculateSynchronizationEtag);
        }
Beispiel #12
0
		private void SaveNewReplicationStatus(SqlReplicationStatus localReplicationStatus)
		{
			int retries = 5;
			while (retries > 0)
			{
				retries--;
				try
				{
					var obj = RavenJObject.FromObject(localReplicationStatus);
					Database.Documents.Put(RavenSqlReplicationStatus, null, obj, new RavenJObject(), null);

					break;
				}
				catch (SynchronizationLockException)
				{
					// just ignore it, we'll save that next time
					break;
				}
				catch (ConcurrencyException)
				{
					Thread.Sleep(50);
				}
			}
		}
Beispiel #13
0
        private Etag GetLeastReplicatedEtag(IEnumerable <SqlReplicationConfig> config, SqlReplicationStatus localReplicationStatus)
        {
            Etag leastReplicatedEtag = null;

            foreach (var sqlReplicationConfig in config)
            {
                var lastEtag = GetLastEtagFor(localReplicationStatus, sqlReplicationConfig);
                if (leastReplicatedEtag == null)
                {
                    leastReplicatedEtag = lastEtag;
                }
                else if (lastEtag.CompareTo(leastReplicatedEtag) < 0)
                {
                    leastReplicatedEtag = lastEtag;
                }
            }

            return(leastReplicatedEtag);
        }
		protected override async Task ExecuteAsync(object parameter)
		{
			if(ApplicationModel.Current == null || ApplicationModel.Current.Server.Value == null || ApplicationModel.Current.Server.Value.SelectedDatabase.Value == null)
				return;
			if (settingsModel == null)
				return;

			var databaseName = ApplicationModel.Current.Server.Value.SelectedDatabase.Value.Name;
			var session = ApplicationModel.Current.Server.Value.DocumentStore.OpenAsyncSession(databaseName);

			if(databaseName == Constants.SystemDatabase)
			{
				var systemSession = ApplicationModel.Current.Server.Value.DocumentStore.OpenAsyncSession();
				await SaveApiKeys(systemSession);
				var savedWinAuth = SaveWindowsAuth(systemSession);
				if(needToSaveChanges)
					await systemSession.SaveChangesAsync();
				ApplicationModel.Current.Notifications.Add(savedWinAuth
					? new Notification("Api keys and Windows Authentication saved")
					: new Notification("Only Api keys where saved, something when wrong with Windows Authentication", NotificationLevel.Error));
				return;
			}

			var periodicBackup = settingsModel.GetSection<PeriodicBackupSettingsSectionModel>();
			if (periodicBackup != null)
				await SavePeriodicBackup(periodicBackup, session);

			var quotaSettings = settingsModel.GetSection<QuotaSettingsSectionModel>();
            if (quotaSettings != null)
			{
				settingsModel.DatabaseDocument.Settings[Constants.SizeHardLimitInKB] =
                    (quotaSettings.MaxSize * 1024).ToString(CultureInfo.InvariantCulture);
				settingsModel.DatabaseDocument.Settings[Constants.SizeSoftLimitInKB] =
                    (quotaSettings.WarnSize * 1024).ToString(CultureInfo.InvariantCulture);
				settingsModel.DatabaseDocument.Settings[Constants.DocsHardLimit] =
                    (quotaSettings.MaxDocs).ToString(CultureInfo.InvariantCulture);
				settingsModel.DatabaseDocument.Settings[Constants.DocsSoftLimit] =
                    (quotaSettings.WarnDocs).ToString(CultureInfo.InvariantCulture);

				if (settingsModel.DatabaseDocument.Id == null)
					settingsModel.DatabaseDocument.Id = databaseName;
				await DatabaseCommands.CreateDatabaseAsync(settingsModel.DatabaseDocument);
			}

		    var replicationSettings = settingsModel.GetSection<ReplicationSettingsSectionModel>();
			if (replicationSettings != null)
			{
				ReplicationDocument document;
				try
				{
					document = await session.LoadAsync<ReplicationDocument>("Raven/Replication/Destinations") ?? new ReplicationDocument();
				}
				catch
				{
					document = new ReplicationDocument();
				}

				document.Destinations.Clear();
				foreach (var destination in replicationSettings.ReplicationDestinations.Where(destination => !string.IsNullOrWhiteSpace(destination.Url)))
				{
					document.Destinations.Add(destination);
				}
				try
				{
					if(document.Destinations.Count != 0 && document.Destinations.Any(destination => destination.Disabled == false))
						await CheckDestinations(document);

					session.Store(document);
					needToSaveChanges = true;
				}
				catch (Exception e)
				{
					ApplicationModel.Current.AddErrorNotification(e.GetBaseException());
				}
			
			}

			var scriptedSettings = settingsModel.GetSection<ScriptedIndexSettingsSectionModel>();
			if (scriptedSettings != null)
			{
				scriptedSettings.StoreChanges();
				foreach (var scriptedIndexResults in scriptedSettings.ScriptedIndexes)
				{

					if (scriptedIndexResults.Value != null)
					{
						scriptedIndexResults.Value.Id = ScriptedIndexResults.IdPrefix + scriptedIndexResults.Key;
						session.Store(scriptedIndexResults.Value, scriptedIndexResults.Value.Id);
					}
				}

				foreach (var indexName in scriptedSettings.DeletedIndexes)
				{
					var id = ScriptedIndexResults.IdPrefix + indexName;

					await DatabaseCommands.DeleteDocumentAsync(id);
				}

				needToSaveChanges = true;
			}

			var sqlReplicationSettings = settingsModel.GetSection<SqlReplicationSettingsSectionModel>();
			if (sqlReplicationSettings != null)
			{
				if (sqlReplicationSettings.SqlReplicationConfigs.Any(config => string.IsNullOrWhiteSpace(config.Name)) == false)
				{
					var problemWithTable = false;
					foreach (var sqlReplicationConfigModel in sqlReplicationSettings.SqlReplicationConfigs)
					{
						var hashset = new HashSet<string>();
						foreach (var sqlReplicationTable in sqlReplicationConfigModel.SqlReplicationTables)
						{
							var exists = !hashset.Add(sqlReplicationTable.TableName);
							if (string.IsNullOrWhiteSpace(sqlReplicationTable.DocumentKeyColumn) ||
							    string.IsNullOrWhiteSpace(sqlReplicationTable.TableName) || exists)
							{
								problemWithTable = true;
								break;
							}
						}
						if (problemWithTable)
							break;
					}

					if (problemWithTable)
					{
						ApplicationModel.Current.AddNotification(
							new Notification(
								"Sql Replication settings were not saved, all tables must distinct names and have document keys",
								NotificationLevel.Error));
					}
					else
					{
						var hasChanges = new List<string>();
						var documents = await session.Advanced.LoadStartingWithAsync<SqlReplicationConfig>("Raven/SqlReplication/Configuration/");

						sqlReplicationSettings.UpdateIds();
						if (documents != null)
						{
							hasChanges = sqlReplicationSettings.SqlReplicationConfigs.Where(config => HasChanges(config,
								documents.FirstOrDefault(replicationConfig =>replicationConfig.Name == config.Name)))
								.Select(config => config.Name).ToList();

							foreach (var sqlReplicationConfig in documents)
							{
								if (sqlReplicationSettings.SqlReplicationConfigs.All(config => config.Id != sqlReplicationConfig.Id))
								{
									session.Delete(sqlReplicationConfig);
								}
							}
						}

						if (hasChanges != null && hasChanges.Count > 0)
						{
							var resetReplication = new ResetReplication(hasChanges);
							await resetReplication.ShowAsync();
							
							const string ravenSqlreplicationStatus = "Raven/SqlReplication/Status";

							var status = await session.LoadAsync<SqlReplicationStatus>(ravenSqlreplicationStatus);
							if(status == null)
								status = new SqlReplicationStatus();

							foreach (var name in resetReplication.Selected)
							{
								var lastReplicatedEtag = status.LastReplicatedEtags.FirstOrDefault(etag => etag.Name == name);
								if (lastReplicatedEtag != null)
									lastReplicatedEtag.LastDocEtag = Etag.Empty;
							}

							session.Store(status, ravenSqlreplicationStatus);
						}
						// preload all those values, so we only do this in a single request
						await session.LoadAsync<SqlReplicationConfig>(
							sqlReplicationSettings.SqlReplicationConfigs.Select(
								x => "Raven/SqlReplication/Configuration/" + x.Name)
							);
						foreach (var sqlReplicationConfig in sqlReplicationSettings.SqlReplicationConfigs)
						{
							var id = "Raven/SqlReplication/Configuration/" + sqlReplicationConfig.Name;
							var config = await session.LoadAsync<SqlReplicationConfig>(id);
							config  = UpdateConfig(config, sqlReplicationConfig);
							session.Store(config);
						}
					}
					needToSaveChanges = true;
				}
				else
				{
					ApplicationModel.Current.AddNotification(
						new Notification("Sql Replication settings not saved, all replications must have a name", NotificationLevel.Error));
				}
			}

			var versioningSettings = settingsModel.GetSection<VersioningSettingsSectionModel>();
            if (versioningSettings != null)
			{
                var versionsToDelete = versioningSettings.OriginalVersioningConfigurations
					.Where(originalVersioningConfiguration =>
                        versioningSettings.VersioningConfigurations.Contains(originalVersioningConfiguration) == false)
					.ToList();
				foreach (var versioningConfiguration in versionsToDelete)
				{
					await DatabaseCommands.DeleteDocumentAsync(versioningConfiguration.Id);
				}

                foreach (var versioningConfiguration in versioningSettings.VersioningConfigurations)
				{
					if (versioningConfiguration.Id.StartsWith("Raven/Versioning/",StringComparison.OrdinalIgnoreCase) == false)
						versioningConfiguration.Id = "Raven/Versioning/" + versioningConfiguration.Id;
					session.Store(versioningConfiguration);
				}

				if (versioningSettings.DatabaseDocument != null)
					await DatabaseCommands.CreateDatabaseAsync(versioningSettings.DatabaseDocument);

				needToSaveChanges = true;
			}

			var authorizationSettings = settingsModel.GetSection<AuthorizationSettingsSectionModel>();
			if (authorizationSettings != null)
			{
				var usersToDelete = authorizationSettings.OriginalAuthorizationUsers
					.Where(authorizationUser => authorizationSettings.AuthorizationUsers.Contains(authorizationUser) == false)
					.ToList();
				foreach (var authorizationUser in usersToDelete)
				{
					await DatabaseCommands.DeleteDocumentAsync(authorizationUser.Id);
				}

				var rolesToDelete = authorizationSettings.OriginalAuthorizationRoles
					.Where(authorizationRole => authorizationSettings.AuthorizationRoles.Contains(authorizationRole) == false)
					.ToList();
				foreach (var authorizationRole in rolesToDelete)
				{
					await DatabaseCommands.DeleteDocumentAsync(authorizationRole.Id);
				}

				foreach (var authorizationRole in authorizationSettings.AuthorizationRoles)
				{
					session.Store(authorizationRole);
				}

				foreach (var authorizationUser in authorizationSettings.AuthorizationUsers)
				{
					session.Store(authorizationUser);
				}

				needToSaveChanges = true;
			}

			if(needToSaveChanges)
				await session.SaveChangesAsync();
			foreach (var settingsSectionModel in settingsModel.Sections)
			{
				settingsSectionModel.MarkAsSaved();
			}

			ApplicationModel.Current.AddNotification(new Notification("Updated Settings for: " + databaseName));
		}
Beispiel #15
0
        private void UpdateLastReplicatedStatus(SqlReplicationStatus localReplicationStatus, List<SqlReplicationConfig> config)
        {
            var lastReplicatedToDelete = new List<LastReplicatedEtag>();
            foreach (var lastReplicated in localReplicationStatus.LastReplicatedEtags)
            {
                if (config.Exists(x => x.Name.Equals(lastReplicated.Name, StringComparison.InvariantCultureIgnoreCase)) == false)
                {
                    lastReplicatedToDelete.Add(lastReplicated);
                }
            }

            if (lastReplicatedToDelete.Count == 0)
                return; // nothing to do

            foreach (var status in lastReplicatedToDelete)
            {
                localReplicationStatus.LastReplicatedEtags.Remove(status);
            }

            SaveNewReplicationStatus(localReplicationStatus);
        }