Пример #1
0
        public virtual ChangeSetResult <long> ProcessChangeSet(IDataService dataService, ChangeSet <long, T_record> changeSet, ProcessChangeSetSettings settings)
        {
            var result = new ChangeSetResult <long>();

            foreach (var deletion in changeSet.Delete)
            {
                _repository.Delete <T_record>(deletion);

                result.SuccessfullyDeleted.Add(deletion);
            }

            var validator = new T_validator();

            foreach (var update in changeSet.Update)
            {
                var validationResult = validator.Validate(update.Value);
                if (validationResult.IsValid)
                {
                    try
                    {
                        _repository.Update <T_record>(update.Value);

                        result.SuccessfullyUpdated.Add(update.Key);
                        result.SuccessfullyUpdatedItems.Add(update.Key, update.Value);
                    }
                    catch (Exception ex)
                    {
                        result.FailedUpdates.Add(update.Key, new MessageSet(ex.Message));
                    }
                }
                else
                {
                    var modelValidation = new ModelValidation();
                    validationResult.Errors.ToList().ForEach(x =>
                    {
                        if (string.IsNullOrWhiteSpace(x.PropertyName))
                        {
                            modelValidation.ModelValidations.Add(x.ErrorMessage);
                        }
                        else
                        {
                            modelValidation.PropertyValidations.Add(x.PropertyName, x.ErrorMessage);
                        }
                    });
                    result.FailedUpdates.Add(update.Key, modelValidation);
                }
            }

            foreach (var create in changeSet.Create)
            {
                var validationResult = validator.Validate(create.Value);
                if (validationResult.IsValid)
                {
                    try
                    {
                        var created = _repository.Create <T_record>(create.Value);

                        result.SuccessfullyCreated.Add(create.Key, created.Id);
                        result.SuccessfullyCreatedItems.Add(created.Id, created);
                    }
                    catch (Exception ex)
                    {
                        result.FailedCreates.Add(create.Key, new MessageSet(ex.Message));
                    }
                }
                else
                {
                    var modelValidation = new ModelValidation();
                    validationResult.Errors.ToList().ForEach(x =>
                    {
                        if (string.IsNullOrWhiteSpace(x.PropertyName))
                        {
                            modelValidation.ModelValidations.Add(x.ErrorMessage);
                        }
                        else
                        {
                            modelValidation.PropertyValidations.Add(x.PropertyName, x.ErrorMessage);
                        }
                    });
                    result.FailedCreates.Add(create.Key, modelValidation);
                }
            }

            dataService.NotifyOfExternalChangesToData();

            return(result);
        }
Пример #2
0
        public ChangeSetResult <long> ProcessChangeSet(IDataService dataService, ChangeSet <long, DbConnection> changeSet, ProcessChangeSetSettings settings)
        {
            var result = new ChangeSetResult <long>();

            foreach (var deletion in changeSet.Delete)
            {
                _repository.Delete <DbConnection>(deletion);

                result.SuccessfullyDeleted.Add(deletion);
            }

            var validator = new DbConnectionValidator(_repository);

            foreach (var update in changeSet.Update)
            {
                var validationResult = validator.Validate(update.Value);
                if (validationResult.IsValid)
                {
                    try
                    {
                        update.Value.Status        = DbConnectionStatus.ValidationPending;
                        update.Value.StatusMessage = string.Empty;

                        _repository.Update(update.Value);

                        result.SuccessfullyUpdated.Add(update.Key);
                        result.SuccessfullyUpdatedItems.Add(update.Key, update.Value);
                    }
                    catch (Exception ex)
                    {
                        result.FailedUpdates.Add(update.Key, new MessageSet(ex.Message));
                    }
                }
                else
                {
                    var modelValidation = new ModelValidation();
                    validationResult.Errors.ToList().ForEach(x =>
                    {
                        if (string.IsNullOrWhiteSpace(x.PropertyName))
                        {
                            modelValidation.ModelValidations.Add(x.ErrorMessage);
                        }
                        else
                        {
                            modelValidation.PropertyValidations.Add(x.PropertyName, x.ErrorMessage);
                        }
                    });
                    result.FailedUpdates.Add(update.Key, modelValidation);
                }
            }

            foreach (var create in changeSet.Create)
            {
                var validationResult = validator.Validate(create.Value);
                if (validationResult.IsValid)
                {
                    try
                    {
                        create.Value.Status        = DbConnectionStatus.ValidationPending;
                        create.Value.StatusMessage = string.Empty;

                        var created = _repository.Create(create.Value);

                        result.SuccessfullyCreated.Add(create.Key, created.Id);
                        result.SuccessfullyCreatedItems.Add(created.Id, created);
                    }
                    catch (Exception ex)
                    {
                        result.FailedCreates.Add(create.Key, new MessageSet(ex.Message));
                    }
                }
                else
                {
                    var modelValidation = new ModelValidation();
                    validationResult.Errors.ToList().ForEach(x =>
                    {
                        if (string.IsNullOrWhiteSpace(x.PropertyName))
                        {
                            modelValidation.ModelValidations.Add(x.ErrorMessage);
                        }
                        else
                        {
                            modelValidation.PropertyValidations.Add(x.PropertyName, x.ErrorMessage);
                        }
                    });
                    result.FailedCreates.Add(create.Key, modelValidation);
                }
            }

            dataService.NotifyOfExternalChangesToData(new DataChangeEvent(dataService.DataServiceName, typeof(DbConnection).Name));

            PostProcessChangeSet(dataService, result);

            return(result);
        }
 private static void AssertOperationResultCountIs(int expected, ChangeSetResult result)
 {
     Assert.IsNotNull(result, "result");
     Assert.IsNotNull(result.OperationResults, "result.OperationResults");
     Assert.AreEqual(expected, result.OperationResults.Count(), "result.OperationResults.Count()");
 }
Пример #4
0
        void PostProcessChangeSet(IDataService dataService, ChangeSetResult <long> changeSet)
        {
            string message = string.Empty;

            Task.Run(() =>
            {
                foreach (var deletedId in changeSet.SuccessfullyDeleted
                         .Union(changeSet.SuccessfullyUpdatedItems.Select(u => ((DbConnection)u.Value).Id)))
                {
                    _repository.PurgeSchema(deletedId);

                    dataService.NotifyOfExternalChangesToData(new DataChangeEvent(dataService.DataServiceName, typeof(DbSchema).Name));
                    dataService.NotifyOfExternalChangesToData(new DataChangeEvent(dataService.DataServiceName, typeof(DbObject).Name));
                    dataService.NotifyOfExternalChangesToData(new DataChangeEvent(dataService.DataServiceName, typeof(DbObjectProperty).Name));
                }

                foreach (DbConnection connection in changeSet.SuccessfullyCreatedItems.Select(u => u.Value as DbConnection)
                         .Union(changeSet.SuccessfullyUpdatedItems.Select(u => u.Value as DbConnection)))
                {
                    connection.Status = DbConnectionStatus.ValidationPending;

                    _repository.Update(connection);
                    dataService.NotifyOfExternalChangesToData(new DataChangeEvent(dataService.DataServiceName, typeof(DbConnection).Name));

                    if (_utils.TestConnection(connection.DatabaseType, connection.ConnectionString, out message))
                    {
                        connection.Status = DbConnectionStatus.Valid;
                    }
                    else
                    {
                        connection.Status = DbConnectionStatus.Invalid;
                    }
                    connection.StatusMessage = message;

                    _repository.Update(connection);
                    dataService.NotifyOfExternalChangesToData(new DataChangeEvent(dataService.DataServiceName, typeof(DbConnection).Name));
                }

                foreach (DbConnection connection in changeSet.SuccessfullyCreatedItems.Select(u => u.Value as DbConnection)
                         .Union(changeSet.SuccessfullyUpdatedItems.Select(u => u.Value as DbConnection)))
                {
                    if (connection.Status == DbConnectionStatus.Valid)
                    {
                        connection.Status = DbConnectionStatus.SchemaPending;

                        _repository.Update(connection);
                        dataService.NotifyOfExternalChangesToData(new DataChangeEvent(dataService.DataServiceName, typeof(DbConnection).Name));

                        _repository.FetchSchema(connection);

                        dataService.NotifyOfExternalChangesToData(new DataChangeEvent(dataService.DataServiceName, typeof(DbSchema).Name));
                        dataService.NotifyOfExternalChangesToData(new DataChangeEvent(dataService.DataServiceName, typeof(DbObject).Name));
                        dataService.NotifyOfExternalChangesToData(new DataChangeEvent(dataService.DataServiceName, typeof(DbObjectProperty).Name));

                        connection.Status = DbConnectionStatus.SchemaAvailable;

                        _repository.Update(connection);
                        dataService.NotifyOfExternalChangesToData(new DataChangeEvent(dataService.DataServiceName, typeof(DbConnection).Name));
                    }
                }


                //    var dbObjects = _utils.GetDbObjects(created.DatabaseType, created.ConnectionString, false);
                //    var dbObjectPropertiess = _utils.GetDbObjectProperties(created.DatabaseType, created.ConnectionString);
                //    var dbSchemas = new Dictionary<string, DbSchema>();

                //    foreach (var dbObject in dbObjects)
                //    {
                //        if (!dbSchemas.ContainsKey(dbObject.SchemaName))
                //        {
                //            var schema = new DbSchema() { Name = dbObject.SchemaName, Objects = new List<DbObject>() };
                //            dbSchemas.Add(dbObject.SchemaName, schema);
                //        }

                //        dbSchemas[dbObject.SchemaName].Objects.Add(dbObject);

                //        _repository.Create<DbObject>(dbObject);

                //        foreach (var dbObjectProperty in dbObject.Properties)
                //        {
                //            _repository.Create<DbObjectProperty>(dbObjectProperty);
                //        }
                //    }

                //    foreach (var dbSchema in dbSchemas.Values)
                //    {
                //        _repository.Create<DbSchema>(dbSchema);
                //    }
                //}

                //        if (createOrUpdate)
                //    {
                //        dataService.NotifyOfExternalChangesToData(new DataChangeEvent(dataService.DataServiceName, typeof(DbSchema).Name));
                //        dataService.NotifyOfExternalChangesToData(new DataChangeEvent(dataService.DataServiceName, typeof(DbObject).Name));
                //        dataService.NotifyOfExternalChangesToData(new DataChangeEvent(dataService.DataServiceName, typeof(DbObjectProperty).Name));
                //    }
            });
        }