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); }
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); }