public virtual string GetReferenceName(IReferenceDefinition reference)
        {
            string pkColumnNames = Algorithms.Join("", reference.PkColumns,
                                                   s => s);
            string fkColumnNames = Algorithms.Join("", reference.FkColumns,
                                                   s => s);

            return string.Format("FK_{0}_{1}_{2}_{3}",
                                 GetBareIdentifier(reference.FkTable), fkColumnNames,
                                 GetBareIdentifier(reference.PkTable), pkColumnNames);
        }
        private void BindForeignKeyTable(IAddReferenceNode addReferenceNode, IReferenceDefinition reference)
        {
            // If the parent of IAddReferenceNode is either IAddTableNode or IAlterTableNode,
            // ForeignKeyTable is the binding for that node
            if(addReferenceNode.Parent is IAddTableNode || addReferenceNode.PkColumns is IAlterTableNode)
            {
                addReferenceNode.FkTable = reference.FkTable = 
                    Environment.Schema.GetTable(((ITableNode)addReferenceNode.Parent).Name).Name;
                return;
            } // if

            //
            // If parent is IAddColumnNode or IAlterColumnNode, we just move on level higher 
            // and do basically the same
            if(addReferenceNode.Parent is IAddColumnNode || addReferenceNode.PkColumns is IAlterColumnNode)
            {
                addReferenceNode.FkTable = reference.FkTable =
                    Environment.Schema.GetTable(((ITableNode)addReferenceNode.Parent.Parent).Name).Name;
                return;
            } // if

            //
            // If foreign key table is explicitly specified in properties, use that
            if(addReferenceNode.Properties[MdlSyntax.FkTable] != null)
            {
                ITableDefinition fkTable =
                    Environment.Schema.GetTable(AstNodePropertyUtil.AsString(addReferenceNode.Properties[MdlSyntax.FkTable].Value));
                addReferenceNode.FkTable = reference.FkTable = fkTable.Name;

                return;
            } // if

            throw CreateMdlCompilerException(MdlCompilerResources.CouldNotResolveFkTableForAddReference,
                addReferenceNode.Name);
        }
        private void BindForeignKeyColumns(IAddReferenceNode addReferenceNode, IReferenceDefinition reference)
        {
            //
            // If the parent of IAddReferenceNode is an IAddColumnNode or IAlterColumnNode, that column becomes the fk column
            if(addReferenceNode.Parent is IAddColumnNode || addReferenceNode.Parent is IAlterColumnNode)
            {
                string fkColumn = 
                    Environment.Schema.GetTable(reference.FkTable).GetColumn(((IAddColumnNode)addReferenceNode.Parent).Name).Name;
                
                addReferenceNode.FkColumns.Add(fkColumn);
                reference.FkColumns.Add(fkColumn);
                
                return;
            } // if

            //
            // fk-column must be explicitly specified
            if(addReferenceNode.Properties[MdlSyntax.FkColumn] != null)
            {
                //
                // FK table is already bound here
                IColumnDefinition fkColumn =
                    Environment.Schema.GetTable(reference.FkTable).GetColumn(
                        AstNodePropertyUtil.AsString(addReferenceNode.Properties[MdlSyntax.FkColumn].Value));
                
                addReferenceNode.FkColumns.Add(fkColumn.Name);
                reference.FkColumns.Add(fkColumn.Name);

                return;
            } // if

            //
            // If we have fk-columns specified
            if(addReferenceNode.Properties[MdlSyntax.FkColumns] != null)
            {
                IListAstNodePropertyValue list =
                    (IListAstNodePropertyValue)addReferenceNode.Properties[MdlSyntax.FkColumns].Value;
                foreach(IAstNodePropertyValue value in list.Items)
                {
                    string fkColumnName = ((IStringAstNodePropertyValue)value).Value;

                    //
                    // FK table is already bound here
                    IColumnDefinition fkColumn =
                        Environment.Schema.GetTable(reference.FkTable).GetColumn(fkColumnName);

                    addReferenceNode.FkColumns.Add(fkColumn.Name);
                    reference.FkColumns.Add(fkColumn.Name);
                } // foreach

                return;
            } // if

            throw CreateMdlCompilerException(MdlCompilerResources.CouldNotResolveFkColumnForAddReference, addReferenceNode.Name);
        }
        private void BindPrimaryKeyTable(IAddReferenceNode addReferenceNode, IReferenceDefinition reference)
        {
            if(addReferenceNode.Properties[MdlSyntax.PkTable] != null)
            {
                string pkTableName = AstNodePropertyUtil.AsString(addReferenceNode.Properties[MdlSyntax.PkTable].Value);
                ITableDefinition pkTable =
                    Environment.Schema.GetTable(pkTableName);

                if(pkTable == null)
                    throw new MigrationException(string.Format("Could not resolve Primary Key table '{0}'",  pkTableName));

                addReferenceNode.PkTable = pkTable.Name;
                reference.PkTable = pkTable.Name;

                return;
            } // if

            throw CreateMdlCompilerException(MdlCompilerResources.CouldNotResolvePkTableForAddReference, 
                addReferenceNode.Name);
        }
        private void BindPrimaryKeyColumns(IAddReferenceNode addReferenceNode, IReferenceDefinition reference)
        {
            //
            // Presence of "pk-column" means we're referencing only one column.
            if(addReferenceNode.Properties[MdlSyntax.PkColumn] != null)
            {
                //
                // Primary key table must already be bound, so we can use just that.
                IColumnDefinition pkColumn =
                    Environment.Schema.GetTable(reference.PkTable).GetColumn(
                        AstNodePropertyUtil.AsString(addReferenceNode.Properties[MdlSyntax.PkColumn].Value));
                
                addReferenceNode.PkColumns.Add(pkColumn.Name);
                reference.PkColumns.Add(pkColumn.Name);
            } // if
            else
            {
                //
                // Neither pk-column nor pk-columns were specified, so we assume
                // that this is a reference to the primary key of the pk-table
                var pkColumns = Environment.Schema.GetTable(reference.PkTable).GetPrimaryKeyColumns();
                if(pkColumns == null)
                    throw new MigrationException(string.Format("Table '{0}' has not Primary Key defined", reference.PkTable));

                if(pkColumns.Length > 1)
                    throw new MigrationException(
                        string.Format("Table '{0}' has Composite Primary Key defined. You have to explicitly specify 'pk-column` property", 
                            reference.PkTable));
                
                addReferenceNode.PkColumns.Add(pkColumns[0].Name);
                reference.PkColumns.Add(pkColumns[0].Name);
            }
        }
Example #6
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="reference"></param>
        /// <param name="addReferenceNode"></param>
        private static void CopyProperties(IReferenceDefinition reference, IAddReferenceNode addReferenceNode)
        {
            if(!string.IsNullOrEmpty(reference.PkTable))
                AddProperty(addReferenceNode, MdlSyntax.PkTable, reference.PkTable);

            if(reference.PkColumns.Count == 1)
                AddProperty(addReferenceNode, MdlSyntax.PkColumn, reference.PkColumns[0]);
            else
                AddListProperty(addReferenceNode, MdlSyntax.PkColumns,
                    Algorithms.Convert<string, IAstNodePropertyValue>(reference.PkColumns, 
                        delegate(string input) { return new StringAstNodePropertyValue(input); }));

            if(!string.IsNullOrEmpty(reference.FkTable))
                AddProperty(addReferenceNode, MdlSyntax.FkTable, reference.FkTable);

            if(reference.FkColumns.Count == 1)
                AddProperty(addReferenceNode, MdlSyntax.FkColumn, reference.FkColumns[0]);
            else
                AddListProperty(addReferenceNode, MdlSyntax.FkColumns,
                    Algorithms.Convert<string, IAstNodePropertyValue>(reference.FkColumns,
                        delegate(string input) { return new StringAstNodePropertyValue(input); }));
        }