示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }