001package gudusoft.gsqlparser;
002
003import java.util.concurrent.ConcurrentHashMap;
004
005public class TSingletonParser {
006    private static volatile TSingletonParser instance;
007
008    // Per-vendor parser cache to avoid cross-vendor contamination
009    private final ConcurrentHashMap<EDbVendor, TGSqlParser> parsers = new ConcurrentHashMap<>();
010
011    private TSingletonParser(){}
012
013    public static TSingletonParser getInstance() {
014
015        if (instance == null) {
016            synchronized (TSingletonParser.class) {
017                if (instance == null)
018                    instance = new TSingletonParser();
019            }
020        }
021        return instance;
022    }
023
024    public synchronized TStatementList getStmts(EDbVendor dbVendor, String str){
025        TStatementList statements = new TStatementList();
026        TGSqlParser sqlParser = this.getParser(dbVendor);
027        sqlParser.sqltext = str;
028        int i = sqlParser.parse();
029        if (i == 0){
030            for(int j=0;j<sqlParser.getSqlstatements().size();j++){
031                statements.add(sqlParser.getSqlstatements().get(j));
032            }
033        }
034        return statements;
035    }
036
037    public synchronized TSourceTokenList getTokens(EDbVendor dbVendor, String str){
038        TSourceTokenList stList = new TSourceTokenList();
039        TGSqlParser sqlParser = this.getParser(dbVendor);
040        sqlParser.sqltext = str;
041        sqlParser.tokenizeSqltext();
042        for(int i=0;i<sqlParser.sourcetokenlist.size();i++){
043            stList.add(sqlParser.sourcetokenlist.get(i));
044        }
045        return stList;
046    }
047
048    private synchronized TGSqlParser getParser(EDbVendor dbVendor) {
049        return parsers.computeIfAbsent(dbVendor, TGSqlParser::new);
050    }
051
052}