001package gudusoft.gsqlparser.stmt.mssql;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.nodes.TFetchSqlNode;
005import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
006import gudusoft.gsqlparser.nodes.TObjectName;
007import gudusoft.gsqlparser.nodes.TCloseSqlNode;
008
009public class TMssqlClose extends TCustomSqlStatement {
010     public TMssqlClose (EDbVendor dbvendor){
011        super(dbvendor);
012        sqlstatementtype = ESqlStatementType.sstmssqlclose ;
013        }
014
015    void buildsql() {
016    }
017
018    void clear() {
019    }
020
021    String getasprettytext() {
022        return "";
023    }
024
025    void iterate(TVisitorAbs pvisitor) {
026    }
027
028    public int doParseStatement(TCustomSqlStatement psql) {
029       super.doParseStatement(psql);
030       if (rootNode != null) {
031           TCloseSqlNode node = (TCloseSqlNode)rootNode;
032           this.cursorName = node.getCursorName();
033       }
034       if (this.cursorName == null) {
035           // Fallback: extract cursor name from tokens directly.
036           // Forms: CLOSE cursor_name | CLOSE VARIABLE | CLOSE GLOBAL cursor_name
037           //        | CLOSE ALL SYMMETRIC KEYS | CLOSE SYMMETRIC KEY cursor_name
038           TSourceToken tk = getStartToken();
039           TSourceToken end = getEndToken();
040           if (tk != null) {
041               tk = tk.nextSolidToken();
042               if (tk != null && tk.toString().equalsIgnoreCase("global")) {
043                   tk = tk.nextSolidToken();
044               }
045               if (tk != null && end != null && tk.posinlist <= end.posinlist
046                       && !tk.toString().equalsIgnoreCase("symmetric")
047                       && !tk.toString().equalsIgnoreCase("all")) {
048                   this.cursorName = TObjectName.createObjectName(
049                           dbvendor, EDbObjectType.cursor, tk);
050               }
051           }
052       }
053      return 0;
054   }
055
056   public void accept(TParseTreeVisitor v){
057       v.preVisit(this);
058       v.postVisit(this);
059   }
060
061    public void acceptChildren(TParseTreeVisitor v){
062        v.preVisit(this);
063        v.postVisit(this);
064    }
065
066   private TObjectName cursorName = null;
067
068   public TObjectName getCursorName() {
069       return cursorName;
070   }
071
072    public void setCursorName(TObjectName cursorName) {
073        this.cursorName = cursorName;
074    }
075}