001package gudusoft.gsqlparser.stmt;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.compiler.TFrame;
005import gudusoft.gsqlparser.nodes.TBlockSqlNode;
006import gudusoft.gsqlparser.nodes.TCompoundSqlNode;
007import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
008
009/**
010 * sql block may have label name.
011 * <br> This class is just a wrapper of  {@link TBlockSqlNode}, so please use {@link  #getBlockBody()} to get further information.
012 * <br>
013 * Groups related declarations and statements, is the basic unit of a PL/SQL source program.
014 *
015 * @see gudusoft.gsqlparser.stmt.TCommonStoredProcedureSqlStatement#declareStatements
016 * @see gudusoft.gsqlparser.stmt.TCommonStoredProcedureSqlStatement#bodyStatements
017 */
018public class TCommonBlock extends TCommonStoredProcedureSqlStatement {
019    public TCommonBlock(EDbVendor dbvendor){
020        super(dbvendor);
021        sqlstatementtype = ESqlStatementType.sst_plsql_block;
022        }
023
024    public int doParseStatement(TCustomSqlStatement psql) {
025        switch (dbvendor){
026            case dbvdb2:
027                if (rootNode instanceof  TCompoundSqlNode){
028                    TCompoundSqlNode db2CompoundSqlNode = (TCompoundSqlNode) rootNode;
029                    this.blockBody = new TBlockSqlNode();
030                    this.blockBody.init(db2CompoundSqlNode.getStmts());
031                    this.blockBody.setDeclareStmts(db2CompoundSqlNode.getDeclareStmts());
032                    this.blockBody.setStartToken(db2CompoundSqlNode.getStartToken());
033                    this.blockBody.setEndToken(db2CompoundSqlNode.getEndToken());
034                }else {
035                    this.blockBody = (TBlockSqlNode)rootNode;
036                }
037                break;
038            default:
039                this.blockBody = (TBlockSqlNode)rootNode;
040                if (this.blockBody.getLabelName() == null){
041                    this.blockBody.setLabelName(this.getLabelName());
042                }
043                break;
044        }
045
046
047         super.doParseStatement(psql);
048         TFrame currentFrame = new TFrame(this.stmtScope);
049         TFrame upFrame = getFrameStack().peek();
050         if (upFrame.getScope().isRoutine()){
051             this.stmtScope.setEnclosingScope(upFrame.getScope());
052         }
053         currentFrame.pushMeToStack(getFrameStack());
054
055        this.blockBody.doParse(this,ESqlClause.unknown);
056
057        currentFrame.popMeFromStack(getFrameStack());
058        return 0;
059
060
061    }
062
063
064    public void accept(TParseTreeVisitor v){
065        v.preVisit(this);
066        v.postVisit(this);
067    }
068
069    public void acceptChildren(TParseTreeVisitor v){
070        v.preVisit(this);
071        blockBody.acceptChildren(v);
072//        if (getDeclareStatements().size() > 0) getDeclareStatements().acceptChildren(v);
073//        if (getBodyStatements().size() > 0 ) getBodyStatements().acceptChildren(v);
074        v.postVisit(this);
075    }
076
077}