001package gudusoft.gsqlparser.stmt.informix;
002
003
004import gudusoft.gsqlparser.EDbVendor;
005import gudusoft.gsqlparser.ESqlClause;
006import gudusoft.gsqlparser.ESqlStatementType;
007import gudusoft.gsqlparser.TCustomSqlStatement;
008import gudusoft.gsqlparser.nodes.TCreateProcedureSqlNode;
009import gudusoft.gsqlparser.nodes.TObjectName;
010import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
011import gudusoft.gsqlparser.nodes.TSymbolTableItem;
012import gudusoft.gsqlparser.stmt.TStoredProcedureSqlStatement;
013
014/**
015 * Informix create function. Not used yet.
016 *
017 *
018 */
019//todo migrate to {@link gudusoft.gsqlparser.stmt.TCreateFunctionStmt}
020public class TInformixCreateFunction extends TStoredProcedureSqlStatement {
021
022    public TInformixCreateFunction(EDbVendor dbvendor) {
023        super(dbvendor);
024        sqlstatementtype = ESqlStatementType.sstinformixCreateFunction;
025    }
026
027    private TObjectName procedureName = null;
028
029    public TObjectName getProcedureName() {
030        return procedureName;
031    }
032
033    public int doParseStatement(TCustomSqlStatement psql) {
034        if (rootNode == null) return -1;
035        if(!(rootNode instanceof TCreateProcedureSqlNode)) return -1;
036        TCreateProcedureSqlNode createProcedureNode = (TCreateProcedureSqlNode)rootNode;
037
038        super.doParseStatement(psql);
039
040        procedureName = createProcedureNode.getProcedureName();
041        this.setParameterDeclarations(createProcedureNode.getParameters());
042
043
044        // push parameterDeclarations into symbolTable
045        if (this.getParameterDeclarations() != null){
046            for(int i=0;i< this.getParameterDeclarations().size();i++){
047                this.getTopStatement().getSymbolTable().push( new TSymbolTableItem(TObjectName.ttobjParameter,this, this.getParameterDeclarations().getParameterDeclarationItem(i)));
048            }
049        }
050
051        if (createProcedureNode.getStmts() != null){
052            createProcedureNode.getStmts().doParse(this, ESqlClause.unknown);
053            for(int i=0;i<createProcedureNode.getStmts().size();i++){
054                this.getBodyStatements().add(createProcedureNode.getStmts().getStatementSqlNode(i).getStmt());
055            }
056        }
057
058        // pop parameterDeclarations from symbolTable
059        if (this.getParameterDeclarations() != null){
060            for(int i=0;i< this.getParameterDeclarations().size();i++){
061                this.getTopStatement().getSymbolTable().pop();
062            }
063        }
064
065        return 0;
066    }
067
068    public void accept(TParseTreeVisitor v){
069        v.preVisit(this);
070        v.postVisit(this);
071    }
072
073    public void acceptChildren(TParseTreeVisitor v){
074        v.preVisit(this);
075        if (this.getParameterDeclarations() != null) getParameterDeclarations().acceptChildren(v);
076        if (getBodyStatements().size() > 0) getBodyStatements().acceptChildren(v);
077
078        v.postVisit(this);
079    }
080
081}