001package gudusoft.gsqlparser.stmt;
002
003
004import gudusoft.gsqlparser.*;
005import gudusoft.gsqlparser.nodes.TObjectName;
006import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
007import gudusoft.gsqlparser.nodes.TPrepareSqlNode;
008import gudusoft.gsqlparser.nodes.TStatementSqlNode;
009
010public class TPrepareStmt extends TCustomSqlStatement {
011
012    public TPrepareStmt(EDbVendor dbvendor) {
013        super(dbvendor);
014        sqlstatementtype = ESqlStatementType.sstprepare;
015    }
016
017
018    private TCustomSqlStatement preparableStmt;
019
020    public TCustomSqlStatement getPreparableStmt() {
021        return preparableStmt;
022    }
023
024    private TObjectName stmtName;
025    private String  preparableStmtStr = "";
026
027    public String getPreparableStmtStr() {
028        return preparableStmtStr;
029    }
030
031    public TObjectName getStmtName() {
032        return stmtName;
033    }
034
035    TGSqlParser parser;
036
037
038    public int doParseStatement(TCustomSqlStatement psql) {
039        if (rootNode == null) return -1;
040        super.doParseStatement(psql);
041
042        if ((dbvendor == EDbVendor.dbvpresto)||(dbvendor == EDbVendor.dbvathena)){
043            TStatementSqlNode sqlNode = new TStatementSqlNode();
044            sqlNode.init(rootNode);
045            sqlNode.doParse(this, ESqlClause.unknown);
046            preparableStmt = sqlNode.getStmt();
047
048        }else{
049            TPrepareSqlNode sqlNode = (TPrepareSqlNode)rootNode;
050
051            stmtName = sqlNode.getStmtName();
052            preparableStmtStr = sqlNode.getPreparableStmt();
053            if (preparableStmtStr.startsWith("'")) {
054                preparableStmtStr = preparableStmtStr.replace("'", "");
055            }else if (sqlNode.getPreparableStmt().startsWith("\"")) {
056                preparableStmtStr = preparableStmtStr.replace("\"", "");
057            }
058
059            if (preparableStmtStr.length() > 0){
060                parser = new TGSqlParser(this.dbvendor);
061                parser.sqltext = preparableStmtStr;
062                //A whitespace-only or comment-only prepared string parses with
063                //rc 0 and ZERO statements (mantis 4681) — guard before get(0).
064                if ((parser.parse() == 0) && (parser.sqlstatements.size() > 0)){
065                    preparableStmt = parser.sqlstatements.get(0);
066                }
067            }
068        }
069
070        return 0;
071    }
072
073    public void accept(TParseTreeVisitor v){
074        v.preVisit(this);
075        v.postVisit(this);
076    }
077
078    public void acceptChildren(TParseTreeVisitor v){
079        v.preVisit(this);
080        if (preparableStmt != null) preparableStmt.accept(v);
081        v.postVisit(this);
082    }
083
084    public void setPreparableStmt(TCustomSqlStatement preparableStmt) {
085        this.preparableStmt = preparableStmt;
086    }
087
088    public void setStmtName(TObjectName stmtName) {
089        this.stmtName = stmtName;
090    }
091
092    public void setPreparableStmtStr(String preparableStmtStr) {
093        this.preparableStmtStr = preparableStmtStr;
094    }
095}