/// <summary>
        /// Visits the given <paramref name="versionNode"/>.
        /// </summary>
        /// <param name="versionNode"></param>
        public override void Visit(IVersionNode versionNode)
        {
            IUpgradeNode upgradeNode = new UpgradeNode(versionNode);

            foreach(IAstNode astNode in versionNode.ChildNodes)
            {
                astNode.Parent = upgradeNode;
                upgradeNode.ChildNodes.Add(astNode);
            } // foreach

            versionNode.ChildNodes.Clear();
            versionNode.ChildNodes.Add(upgradeNode);
        }
        /// <summary>
        /// Visits the given <paramref name="versionNode"/>.
        /// </summary>
        /// <param name="versionNode"></param>
        public override void Visit(IVersionNode versionNode)
        {
            //
            // Add a IAddTableNode which will create "SchemaInfo" tabled 
            // to the first IVersionNode we encounter 
            if(builtSchemaInfo)
                return;

            IAddTableNode addSchemaInfoTableNode = new AddTableNode(versionNode, "SchemaInfo");
            
            IAddColumnNode addVersionColumnNode = new AddColumnNode(addSchemaInfoTableNode, "Version");
            addVersionColumnNode.Properties.AddProperty(AstNodeProperty.Symbol(MdlSyntax.Type, DbType.Int64.ToString()));
            addVersionColumnNode.Properties.AddProperty(AstNodeProperty.Symbol(MdlSyntax.Unique, "true"));
            addVersionColumnNode.Properties.AddProperty(AstNodeProperty.Symbol(MdlSyntax.Nullable, "false"));

            addSchemaInfoTableNode.ChildNodes.Add(addVersionColumnNode);

            builtSchemaInfo = true;

            versionNode.ChildNodes.Insert(0, addSchemaInfoTableNode);
        }
 /// <summary>
 /// Visits the given <paramref name="versionNode"/>.
 /// </summary>
 /// <param name="versionNode"></param>
 public override void Visit(IVersionNode versionNode)
 {
     Visit(versionNode.ChildNodes);
 }
        /// <summary>
        /// Visits the given <paramref name="versionNode"/>.
        /// </summary>
        /// <param name="versionNode"></param>
        public override void Visit(IVersionNode versionNode)
        {
            textWriter.Write("version {0}", versionNode.Number);

            WriteProperties(versionNode);
            VisitBlock(versionNode);
        }
 private IAstNode GetNode(IVersionNode versionNode, MigrationMode migrationMode)
 {
     return migrationMode == MigrationMode.Upgrade ?
         (IAstNode)GetFirst<IUpgradeNode>(versionNode.ChildNodes) :
         (IAstNode)GetFirst<IDowngradeNode>(versionNode.ChildNodes);
 }