Пример #1
0
        public StringBuilder Visit(DefaultConstraintNode defaultConstraintNode)
        {
            var sb = new StringBuilder();

            sb.Append("DEFAULT ");
            sb.Append(defaultConstraintNode.Value);
            return(sb);
        }
Пример #2
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);
        }
Пример #3
0
        public override SQLiteParseTreeNode VisitColumn_constraint__postfix(SQLiteParserSimpleParser.Column_constraint__postfixContext context)
        {
            if (context.NOT() != null)
            {
                return(new NotNullConstraintNode(context)
                {
                    ConflictClause = context.conflict_clause().Accept(this) as ConflictClauseNode
                });
            }
            if (context.PRIMARY() != null)
            {
                var ret = new PrimaryKeyConstraintNode(context);
                if (context.ASC() != null)
                {
                    ret.Order = SortOrder.Asc;
                }
                else if (context.DESC() != null)
                {
                    ret.Order = SortOrder.Desc;
                }

                ret.ConflictClause = context.conflict_clause().Accept(this) as ConflictClauseNode;

                if (context.AUTOINCREMENT() != null)
                {
                    ret.AutoIncrement = true;
                }

                return(ret);
            }
            if (context.UNIQUE() != null)
            {
                return(new UniqueConstraintNode(context)
                {
                    ConflictClause = context.conflict_clause().Accept(this) as ConflictClauseNode
                });
            }
            if (context.CHECK_C() != null)
            {
                return(new CheckConstraintNode(context)
                {
                    Expr = context.expr().GetText()
                });
            }
            if (context.DEFAULT() != null)
            {
                var ret = new DefaultConstraintNode(context);
                if (context.signed_number() != null)
                {
                    ret.Value = context.signed_number().GetText();
                }
                else if (context.literal_value() != null)
                {
                    ret.Value = context.literal_value().GetText();
                }

                else if (context.expr() != null)
                {
                    ret.Value = "( " + context.expr().GetText() + " )";
                }


                return(ret);
            }
            if (context.NULL() != null)
            {
                //it's a default null but sqlite allows it and says it's null
                var ret = new DefaultConstraintNode(context)
                {
                    Value = "NULL"
                };
                return(ret);
            }

            if (context.COLLATE() != null)
            {
                return(new CollateConstraintNode(context)
                {
                    CollationName = context.collation_name().GetText()
                });
            }
            if (context.foreign_key_clause() != null)
            {
                return(context.foreign_key_clause().Accept(this) as ColumnConstraintNode);
            }

            throw new Exception("we should never get here.");
        }