public ResultSetColumnMapping(IResultSetColumnMapping other, IListener listener, IPolicies policies, ICompilerMessageBuilder messageProvider)
 {
     if(ReferenceEquals(other, null))
         throw new ArgumentNullException(nameof(other));
     this.ColumnName = other.ColumnName;
     this.PropertyName = other.PropertyName;
 }
        public async Task<ISqlSchemaMappingCompilerOutput> CompileAsync(
            ISqlSchemaMappingCompilerInput input,
            ICompilerMessageBuilder messageProvider = null)
        {
            if(ReferenceEquals(input, null))
                throw new ArgumentNullException(nameof(input));

            messageProvider = messageProvider ?? new CompilerMessageBuilder();

            try
            {
                this.m_output = new SqlSchemaMappingCompilerOutput();
                var args = new XArgs(this.m_output, new Policies(), new CompilerMessageBuilder());
                
                                
                this.m_input = new SqlSchemaMappingCompilerInputAdapter(input, messageProvider, this.m_output);
                if (this.m_output.Errors.Any()) return this.m_output;

                this.m_output.DataRowInterfaces.AddRange(m_input.DataRowInterfaces);
                this.m_output.OperationRequestContracts.AddRange(m_input.OperationResponseInterfaces);
                this.m_output.OperationResponseContracts.AddRange(m_input.OperationResponseInterfaces);
                
                await this.CompileTableTypesAsync(args);

                return this.m_output;
            }
            finally
            {
                this.m_input = null;
                this.m_output = null;
                this.m_interfaceNames.Clear();
            }            
        }
 public BlobProperty(
         IProperty other,
         IListener listener,
         IPolicies policies,
         ICompilerMessageBuilder messageProvider,
         int propertyIndex)
     : base(other, listener, policies, messageProvider, propertyIndex)
 {
 }
        public PropertySet(
            IPropertySet other,
            IListener listener,
            IPolicies policies,             
            ICompilerMessageBuilder messageProvider,
            int interfaceIndex)
        {
            if(ReferenceEquals(other, null))
                throw new ArgumentNullException(nameof(other));
            if (ReferenceEquals(listener, null))
                throw new ArgumentNullException(nameof(listener));
            if (ReferenceEquals(policies, null))
                throw new ArgumentNullException(nameof(policies));
            if (ReferenceEquals(messageProvider, null))
                throw new ArgumentNullException(nameof(messageProvider));

            this.InterfaceName = other.InterfaceName ?? policies.GenerateSurrogateInterfaceName(interfaceIndex);

            if (ReferenceEquals(other.InterfaceName, null))
                listener.Error(messageProvider.MissingInterfaceName(this.InterfaceName, interfaceIndex));

            if (false == policies.IsValidInterfaceName(this.InterfaceName))
                listener.Error(messageProvider.InvalidInterfaceName(this.InterfaceName, interfaceIndex));

            if (ReferenceEquals(other.Properties, null))
            {
                listener.Error(messageProvider.EmptyPropertiesList(this.InterfaceName, interfaceIndex));
                return;
            }

            int propertyIndex = 0;
            foreach (var property in other.Properties.OfType<IBasicProperty>())
            {
                this.Properties.Add(
                    new BasicProperty(property, listener, policies, messageProvider, propertyIndex++));
            }

            propertyIndex = 0;
            foreach (var property in other.Properties.OfType<IBlobProperty>())
            {
                this.Properties.Add(
                    new BlobProperty(property, listener, policies, messageProvider, propertyIndex++));
            }

            propertyIndex = 0;
            foreach (var property in other.Properties.OfType<ITableValueProperty>())
            {
                this.Properties.Add(
                    new TableValueProperty(property, listener, policies, messageProvider, propertyIndex++));
            }

            this.m_ixPropertyByName = this.Properties.ToDictionary(
                p => p.PropertyName,
                StringComparer.OrdinalIgnoreCase);
        }
        public DataRowMapping(IDataRowMapping mapping, IListener listener, IPolicies policies, ICompilerMessageBuilder compilerMessageBuilder)
        {
            InterfaceName = mapping.InterfaceName;

            foreach (var columnMapping in mapping.ColumnMappings)
            {
                var item = new ResultSetColumnMapping(columnMapping, listener, policies, compilerMessageBuilder);
                this.Mappings.Add(item);
                this.m_ixColumnMappingByColumnName.Add(item.ColumnName, item);
            }
        }
        public BasicProperty(
            IBasicProperty other, 
            IListener listener, 
            IPolicies policies,             
            ICompilerMessageBuilder messageProvider,
            int propertyIndex)
            : base(other, listener, policies, messageProvider, propertyIndex)
        {
            messageProvider = messageProvider ?? new CompilerMessageBuilder();

            this.PropertyTypeName = other.PropertyTypeName ?? typeof(object).FullName;
            if(false == policies.IsValidBasicPropertyTypeName(other.PropertyTypeName))
                listener.Error(messageProvider.InvalidBasicPropertyTypeName(this.PropertyName, other.PropertyTypeName));
        }
 public TableValueProperty(
     ITableValueProperty other, 
     IListener listener, 
     IPolicies policies, 
     ICompilerMessageBuilder messageProvider, 
     int propertyIndex)
     : base(other, listener, policies, messageProvider, propertyIndex)
 {
     this.DataRowInterfaceName = other.DataRowInterfaceName ?? typeof(object).FullName;
     if (ReferenceEquals(other.DataRowInterfaceName, null))
         listener.Error(messageProvider.MissingDataRowInterfaceName(propertyIndex));
     else if(false == policies.IsValidInterfaceName(this.DataRowInterfaceName))
         listener.Error(messageProvider.InvalidDataRowInterfaceName(this.DataRowInterfaceName, propertyIndex));
 }
Beispiel #8
0
        public XArgs(
            IListener listener, 
            IPolicies policies, 
            ICompilerMessageBuilder messageBuilder)
        {
            if(ReferenceEquals(listener, null))
                throw new ArgumentNullException(nameof(listener));
            if (ReferenceEquals(policies, null))
                throw new ArgumentNullException(nameof(policies));
            if (ReferenceEquals(messageBuilder, null))
                throw new ArgumentNullException(nameof(messageBuilder));

            this.Listener = listener;
            this.Policies = policies;
            this.MessageBuilder = messageBuilder;
        }
        public SqlSchemaMappingCompilerInputAdapter(
            ISqlSchemaMappingCompilerInput other, 
            ICompilerMessageBuilder compilerMessageBuilder,
            IListener listener)
        {
            if(ReferenceEquals(other, null))
                throw new ArgumentNullException(nameof(other));
            if (ReferenceEquals(compilerMessageBuilder, null))
                throw new ArgumentNullException(nameof(compilerMessageBuilder));

            var interfaceNames = new HashSet<string>();
            var databaseObjectNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

            var policies = new Policies();

            {// Data row contracts
                var contracts = other.DataRowInterfaces.ToDenseCollection();
                for (int interfaceIndex = 0; interfaceIndex < contracts.Count; ++interfaceIndex)
                {
                    var contract = contracts[interfaceIndex];
                    var item = new PropertySet(contract, listener, policies, compilerMessageBuilder, interfaceIndex);
                    this.DataRowInterfaces.Add(item);
                    if (!interfaceNames.Add(item.InterfaceName))
                        listener.Error(compilerMessageBuilder.DuplicateInterfaceNameInDataRowInterfaces(item.InterfaceName));
                    this.m_ixInterfaceByInterfaceName[item.InterfaceName] = item;
                    this.m_ixDataRowInterfaceByInterfaceName[item.InterfaceName] = item;
                }
            }

            {// Operation request contracts
                var contracts = other.OperationRequestInterfaces.ToDenseCollection();
                for (int interfaceIndex = 0; interfaceIndex < contracts.Count; ++interfaceIndex)
                {
                    var contract = contracts[interfaceIndex];
                    var item = new PropertySet(contract, listener, policies, compilerMessageBuilder, interfaceIndex);
                    this.OperationRequestInterfaces.Add(item);
                    if (!interfaceNames.Add(item.InterfaceName))
                        listener.Error(compilerMessageBuilder.DuplicateInterfaceNameInOperationRequestInterfaces(item.InterfaceName));
                    this.m_ixInterfaceByInterfaceName[item.InterfaceName] = item;
                    this.m_ixOperationRequestInterfaceByInterfaceName[item.InterfaceName] = item;
                    foreach (var tableValueProperty in item.Properties.OfType<TableValueProperty>())
                    {
                        if (!this.m_ixDataRowInterfaceByInterfaceName.ContainsKey(tableValueProperty.DataRowInterfaceName))
                        {
                            listener.Error(
                                compilerMessageBuilder.TableValueInterfaceNotDefined(
                                    item.InterfaceName,
                                    tableValueProperty.DataRowInterfaceName,
                                    tableValueProperty.PropertyName));
                        }
                    }
                }
            }

            {// Operation response contracts
                var contracts = other.OperationResponseInterfaces.ToDenseCollection();
                for (int interfaceIndex = 0; interfaceIndex < contracts.Count; ++interfaceIndex)
                {
                    var contract = contracts[interfaceIndex];
                    var item = new PropertySet(contract, listener, policies, compilerMessageBuilder, interfaceIndex);
                    this.OperationResponseInterfaces.Add(item);
                    if (!interfaceNames.Add(item.InterfaceName))
                        listener.Error(compilerMessageBuilder.DuplicateInterfaceNameInOperationResponseInterfaces(item.InterfaceName));
                    this.m_ixInterfaceByInterfaceName[item.InterfaceName] = item;
                    this.m_ixOperationResponseInterfaceByInterfaceName[item.InterfaceName] = item;
                }
            }

            foreach (var userSelector in other.TableTypeSelectors)
            {
                var selector =new SqlTableTypeSelector(userSelector, listener, policies, compilerMessageBuilder);
                TableTypeSelectors.Add(selector);
                if (false == databaseObjectNames.Add(selector.FullName))
                {
                    listener.Error(compilerMessageBuilder.DuplicateDatabaseObjectSelector(selector.FullName));
                    continue;
                }

                foreach (var dataRowMapping in selector.DataRowMappings)
                {
                    if (!this.m_ixDataRowInterfaceByInterfaceName.ContainsKey(dataRowMapping.InterfaceName))
                    {
                        listener.Error(compilerMessageBuilder.TableValueInterfaceReferedByTableTypeMappingNotDefined(selector.FullName, dataRowMapping.InterfaceName));
                        continue;
                    }

                    var contract = this.m_ixDataRowInterfaceByInterfaceName[dataRowMapping.InterfaceName];
                    dataRowMapping.Interface = contract;

                    var propertyNames = new HashSet<string>(contract.Properties.Select(m=> m.PropertyName), StringComparer.OrdinalIgnoreCase);

                    foreach (var mapping in dataRowMapping.Mappings)
                    {
                        if (false == propertyNames.Contains(mapping.PropertyName))
                        {
                            listener.Error(compilerMessageBuilder.InterfacePropertyNotFound(mapping.PropertyName));
                        }
                    }
                }
            }
        }