コード例 #1
0
ファイル: ForeignKey.cs プロジェクト: eksotama/LayerGenerate
        internal override void AddForeignColumn(string catalog, string schema,
                                                string physicalTableName, string physicalColumnName, bool primary)
        {
            Column column = this.ForeignKeys.Table.Tables[physicalTableName].Columns[physicalColumnName] as Column;

            Column c = column.Clone();

            if (primary)
            {
                if (null == _primaryColumns)
                {
                    _primaryColumns            = (Columns)this.dbRoot.ClassFactory.CreateColumns();
                    _primaryColumns.ForeignKey = this;
                }

                _primaryColumns.AddColumn(c);
            }
            else
            {
                if (null == _foreignColumns)
                {
                    _foreignColumns            = (Columns)this.dbRoot.ClassFactory.CreateColumns();
                    _foreignColumns.ForeignKey = this;
                }

                _foreignColumns.AddColumn(c);
            }

            column.AddForeignKey(this);
        }
コード例 #2
0
        public BasicGenerator Parse(string encodedString, string replacement)
        {
            LoadReplacement(replacement);
            Tables        = new List <Table>();
            encodedString = new Regex(@" +").Replace(encodedString, " ");
            string[] tables = encodedString.Split(tablesSeparators);
            foreach (string tbl in tables)
            {
                bool   addMultiPrimary = false;
                string s = tbl.Trim();
                if (s.Length <= 3)
                {
                    continue;
                }
                int      columnsIndex         = 1;
                string[] lines                = s.Split('\n');
                string[] tableStringNameAttrs = lines[0].Split(',');
                string   tableName            = tableStringNameAttrs[0].Trim();
                if (tableStringNameAttrs.Length > 1 && tableStringNameAttrs[1].Contains("noid"))
                {
                    addMultiPrimary = true;
                }
                Table  table  = new Table(MakeItemName(tableName, false), tableName);
                Column column = null;
                if (!addMultiPrimary && Config.AddIdWithPrimaryAuto)
                {
                    string col = "id";
                    if (Config.AddLongNameForColumnId)
                    {
                        col += col + " " + MakeItemName(table.Name);
                    }
                    column = new Column(MakeItemName(col), col);
                    column.SetPrimaryAutoIncrement();
                    //columnsIndex++;
                    table.AddColumn(column);
                }
                for (; columnsIndex < lines.Length; columnsIndex++)
                {
                    string line = lines[columnsIndex].Trim();
                    if (line.Length <= 2)
                    {
                        continue;
                    }

                    //attrs
                    string[] attributes = line.Split(',');

                    //name
                    string name = MakeItemName(attributes[0]);
                    column = new Column(name, attributes[0]);
                    if (attributes.Length <= 1)
                    {
                        throw new ApplicationException("Error: Type not specified for line: " + columnsIndex +
                                                       " in table " + tableName);
                    }

                    //type
                    string dataType = attributes[1].Trim();
                    column.Type = GetDataType(dataType);
                    if (Config.SetIntUnsigned)
                    {
                        switch (column.Type.Pattern.Type)
                        {
                        case EnumDataTypes.ByteInt:
                        case EnumDataTypes.Int:
                        case EnumDataTypes.SmallInt:
                            column.IsUnsigned = true;
                            break;
                        }
                    }

                    //left attributes
                    string necessity  = Config.NoAnswer;
                    string htmlAttrs  = "";
                    string htmlUnique = Config.NoAnswer;
                    if (attributes.Length > 2)
                    {
                        for (int i = 2; i < attributes.Length; i++)
                        {
                            string param = attributes[i].Trim();
                            if (param.StartsWith(AttributeNullFlag.SearchString))
                            {
                                column.NullFlagAttribute = AttributeNullFlag;
                            }
                            else if (param.StartsWith(AttributeUnique.SearchString))
                            {
                                column.UniqueAttribute = AttributeUnique;
                            }
                            else if (param.StartsWith(AttributePrimary.SearchString))
                            {
                                column.IsPrimary = true;
                            }
                            else if (param.StartsWith(AttributeReference.SearchString))
                            {
                                string refer = param.Substring(param.IndexOf(' '));
                                string refTable;
                                string refCol = null;
                                if (refer.Contains("."))
                                {
                                    string[] parts = refer.Split('.');
                                    refTable = MakeItemName(parts[0], false);
                                    refCol   = MakeItemName(parts[1]);
                                }
                                else
                                {
                                    refTable = MakeItemName(refer, false);
                                }
                                ForeignKey key = new ForeignKey()
                                {
                                    Key             = column,
                                    RefTableString  = refTable,
                                    RefColumnString = refCol
                                };
                                column.AddForeignKey(key);
                            }
                        }
                    }
                    table.AddColumn(column);
                }
                Tables.Add(table);
            }

            foreach (var table in Tables)
            {
                foreach (var column in table.Columns)
                {
                    if (column.ForeignKeys != null)
                    {
                        foreach (ForeignKey foreignKey in column.ForeignKeys)
                        {
                            Table refTable = Tables.FirstOrDefault(tbl => tbl.Name == foreignKey.RefTableString);
                            if (refTable == null)
                            {
                                throw new ArgumentException(
                                          $"Referenced table `{foreignKey.RefTableString}` not found. " +
                                          $"Referenced at {table.Name}.{column.Name}");
                            }
                            Column refColumn = refTable.Columns[0];
                            if (foreignKey.RefColumnString != null)
                            {
                                refColumn = refTable.Columns.First(
                                    column1 => column1.Name == foreignKey.RefColumnString);
                            }
                            foreignKey.RefTable  = refTable;
                            foreignKey.RefColumn = refColumn;
                        }
                    }
                }
            }
            foreach (var table in Tables)
            {
                foreach (var column in table.Columns)
                {
                    if (!string.IsNullOrEmpty(Config.ColumnPrefix))
                    {
                        column.Name = Config.ColumnPrefix + column.Name;
                    }
                }
                if (!string.IsNullOrEmpty(Config.TablePrefix))
                {
                    table.Name = Config.TablePrefix + table.Name;
                }
            }
            return(this);
        }