Example #1
0
        internal ColumnDefNode CreateColumnDefNode()
        {
            var ret = new ColumnDefNode {
                ColumnName = this.ColumnName, ColumnConstraints = new List <ColumnConstraintNode>()
            };

            //dialect converts DbType.Int16-64 to "INT" not "INTEGER" and only INTEGER columns can be autoincremented. This fixes that.
            string correctType = this.IsIdentity ? "INTEGER" : this.DbType;

            ret.TypeNameNode = SQLiteParseVisitor.ParseString <TypeNameNode>(correctType, i => i.type_name());

            //not quite right but should work

            if (this.IsIdentity || this.IsPrimaryKey)
            {
                var primKey = new PrimaryKeyConstraintNode();
                if (this.IsIdentity)
                {
                    primKey.AutoIncrement = true;
                }
                ret.ColumnConstraints.Add(primKey);
            }

            if (this.Default != null)
            {
                ret.ColumnConstraints.Add(new DefaultConstraintNode {
                    Value = DbUtils.ConvertToSqlValue(Default)
                });
            }

            if (this.IsNotNull)
            {
                ret.ColumnConstraints.Add(new NotNullConstraintNode());
            }
            else if (this.Default == null && !this.IsPrimaryKey && !this.IsUnique)
            {
                ret.ColumnConstraints.Add(new DefaultConstraintNode {
                    Value = "NULL"
                });
            }

            if (this.IsUnique)
            {
                ret.ColumnConstraints.Add(new UniqueConstraintNode());
            }

            return(ret);
        }
Example #2
0
        public override SQLiteParseTreeNode VisitColumn_def(SQLiteParserSimpleParser.Column_defContext context)
        {
            var ret = new ColumnDefNode(context)
            {
                ColumnName = context.name().GetText()
            };

            var typeName = context.type_name();

            if (typeName != null)
            {
                ret.TypeNameNode = typeName.Accept(this) as TypeNameNode;
            }

            ret.ColumnConstraints = context.column_constraint().Select(c => c.Accept(this)).Cast <ColumnConstraintNode>().ToList();

            return(ret);
        }
Example #3
0
        public StringBuilder Visit(ColumnDefNode columnDefNode)
        {
            var sb = new StringBuilder();

            sb.Append(columnDefNode.ColumnName);

            if (columnDefNode.TypeNameNode != null)
            {
                sb.Append(" ");
                sb.Append(columnDefNode.TypeNameNode.Accept(this));
            }

            if (columnDefNode.ColumnConstraints != null && columnDefNode.ColumnConstraints.Any())
            {
                foreach (var constraint in columnDefNode.ColumnConstraints)
                {
                    sb.Append(" ");
                    sb.Append(constraint.Accept(this));
                }
            }

            return(sb);
        }
Example #4
0
        public void ParsePartOfAString()
        {
            string parseOnlyAnArgument = "id INTEGER primary key autoincrement";

            SQLiteParseTreeNode statementNodes = SQLiteParseVisitor.ParseString(parseOnlyAnArgument, i => i.column_def());

            var expected = new ColumnDefNode()
            {
                ColumnName        = "id",
                ColumnConstraints = new[]
                {
                    new PrimaryKeyConstraintNode {
                        AutoIncrement = true
                    }
                },
                TypeNameNode = new TypeNameNode()
                {
                    TypeName = "INTEGER"
                }
            }.ToExpectedObject().AddTreeNode();

            expected.ShouldMatch(statementNodes);
        }
Example #5
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);
        }