public override SQLiteParseTreeNode VisitTable_constraint__foreign_key_constraint(SQLiteParserSimpleParser.Table_constraint__foreign_key_constraintContext context) { var ret = new TableConstraintForeignKeyNode(context) { FieldNames = context.table_constraint__parens_field_list() .foreign_key_clause__column_list() .id() .Select(i => i.GetText()) .ToList(), ForeignKeyClauseNode = context.foreign_key_clause().Accept(this) as ForeignKeyClauseNode }; return(ret); }
public StringBuilder Visit(TableConstraintForeignKeyNode tableConstraintForeignKeyNode) { var sb = new StringBuilder(); AppendConstraint(tableConstraintForeignKeyNode, sb); sb.Append("FOREIGN KEY ("); sb.Append(string.Join(", ", tableConstraintForeignKeyNode.FieldNames)); sb.Append(") "); if (tableConstraintForeignKeyNode.ForeignKeyClauseNode != null) { sb.Append(tableConstraintForeignKeyNode.ForeignKeyClauseNode.Accept(this)); } return(sb); }
private CreateTableNode IncorporateAlterationsInCreateNode(AlterTableCommand command, CreateTableNode createTableNode) { foreach (TableCommand alterCommand in command.TableCommands) { if (alterCommand is AddColumnCommand) { var addColumn = alterCommand as AddColumnCommand; createTableNode.ColumnDefinitions.Add(addColumn.CreateColumnDefNode()); } else if (alterCommand is DropColumnCommand) { var dropColumn = alterCommand as DropColumnCommand; ColumnDefNode result = createTableNode.ColumnDefinitions.FirstOrDefault(i => i.ColumnName == dropColumn.ColumnName); if (result == null) { //bad!! throw new InvalidColumnException <DropColumnCommand>(String.Format("Altering column {0} failed. No such column exists on table {1}.", dropColumn.ColumnName, dropColumn.TableName), dropColumn); } else { //remove our column createTableNode.ColumnDefinitions.Remove(result); } } else if (alterCommand is AlterColumnCommand) { var alterColumn = alterCommand as AlterColumnCommand; ColumnDefNode columnDef = createTableNode.ColumnDefinitions.FirstOrDefault(i => i.ColumnName == alterColumn.ColumnName); if (columnDef == null) { //throw!!!! throw new InvalidColumnException <AlterColumnCommand>(String.Format("Altering column {0} failed. No such column exists on table {1}.", alterColumn.ColumnName, alterColumn.TableName), alterColumn); } //modify the type name if (!String.IsNullOrEmpty(alterColumn.DbType)) { columnDef.TypeNameNode = SQLiteParseVisitor.ParseString <TypeNameNode>(alterColumn.DbType, i => i.type_name()); } if (alterColumn.Default != null) { //modify the default DefaultConstraintNode defaultConstraint = columnDef.ColumnConstraints.OfType <DefaultConstraintNode>().FirstOrDefault(); if (defaultConstraint == null) { //we'll create our own defaultConstraint = new DefaultConstraintNode { Value = DbUtils.ConvertToSqlValue(alterColumn.Default) }; //and add it! columnDef.ColumnConstraints.Add(defaultConstraint); } else { //we modify the one that exists defaultConstraint.Value = DbUtils.ConvertToSqlValue(alterColumn.Default); } } } else if (alterCommand is CreateForeignKeyCommand) { var foreignKeyCommand = alterCommand as CreateForeignKeyCommand; var keyNode = new TableConstraintForeignKeyNode { FieldNames = foreignKeyCommand.SrcColumns, ConstraintName = foreignKeyCommand.Name, ForeignKeyClauseNode = new ForeignKeyClauseNode { TableName = foreignKeyCommand.DestTable, FieldList = foreignKeyCommand.DestColumns, ForeignDeferrable = new ForeignDeferrableNode().SetToTrulyDeferrable() } }; createTableNode.TableConstraints.Add(keyNode); } else if (alterCommand is DropForeignKeyCommand) { var foreignKeyCommand = alterCommand as DropForeignKeyCommand; TableConstraintForeignKeyNode foreignKeyDrop = createTableNode.TableConstraints .OfType <TableConstraintForeignKeyNode>() .FirstOrDefault(n => n.ConstraintName == foreignKeyCommand.Name); if (foreignKeyDrop == null) { throw new InvalidForeignKeyException(String.Format("No foreign key {0} exists.", foreignKeyCommand.Name), foreignKeyCommand); } createTableNode.TableConstraints.Remove(foreignKeyDrop); } } return(createTableNode); }