001    package railo.runtime.db;
002    
003    import java.util.Locale;
004    
005    import railo.commons.lang.ParserString;
006    import railo.runtime.exp.PageException;
007    import railo.runtime.format.DateFormat;
008    import railo.runtime.format.TimeFormat;
009    import railo.runtime.op.date.DateCaster;
010    import railo.runtime.type.dt.DateTime;
011    
012    public class SQLPrettyfier {
013            
014            public static final String PLACEHOLDER_COUNT="placeholder_count";       
015            public static final String PLACEHOLDER_ASTERIX="placeholder_asterix";
016            public static final String PLACEHOLDER_QUESTION="QUESTION_MARK_SIGN";
017            
018            
019            
020            public static String prettyfie(String sql){
021                    return prettyfie(sql,false);
022            }
023            
024            public static String prettyfie(String sql, boolean validZql){
025            
026                    ParserString ps=new ParserString(sql.trim());
027                    boolean insideString=false;
028                    //short insideKlammer=0;
029                    StringBuffer sb=new StringBuffer(sql.length());
030                    //char last=0;
031                    
032                    outer:while(!ps.isAfterLast()) {
033                            if(insideString) {
034                            if(ps.isCurrent('\'')) {
035                                if(!ps.hasNext() || !ps.isNext('\''))insideString=false;
036                            }
037                        }
038                            else {
039                                    if(ps.isCurrent('\''))insideString=true;
040                            else if(ps.isCurrent('?')) {
041                                sb.append(" "+PLACEHOLDER_QUESTION+" ");
042                                ps.next();
043                                continue;
044                            }
045                            else if(ps.isCurrent('{')) {
046                                    StringBuffer date=new StringBuffer();
047                                    int pos=ps.getPos();
048                                    while(true) {
049                                            if(ps.isAfterLast()){
050                                                    ps.setPos(pos);
051                                                    break;
052                                            }
053                                            else if(ps.isCurrent('}')) {
054                                                    date.append('}');
055                                                    DateTime d;
056                                                            try {
057                                                                    d = DateCaster.toDateAdvanced(date.toString(), null);
058                                                            } 
059                                                            catch (PageException e) {
060                                                                    ps.setPos(pos);
061                                                            break;
062                                                            }
063                                                            sb.append('\'');
064                                                    sb.append(new DateFormat(Locale.US).format(d,"yyyy-mm-dd"));
065                                                    sb.append(' ');
066                                                    sb.append(new TimeFormat(Locale.US).format(d,"HH:mm:ss"));
067                                                    sb.append('\'');
068                                                    ps.next();
069                                                    continue outer;
070                                            }
071                                            else {
072                                                    date.append(ps.getCurrent());
073                                                    ps.next();
074                                            }
075                                    }
076                            }
077                            else if(ps.isCurrent('*')) {
078                                    sb.append(" "+PLACEHOLDER_ASTERIX+" ");
079                                    ps.next();
080                            //last=ps.getCurrent();
081                                        continue;
082                            }
083                            else if(validZql && ps.isCurrent('a')) {
084                                            if(ps.isPreviousWhiteSpace() && ps.isNext('s') && ps.isNextNextWhiteSpace())    {
085                                            ps.next();
086                                            ps.next();
087                                            ps.removeSpace();
088                                            
089                                            continue;
090                                        }
091                                    
092                            }
093                            /*for(int i=0;i<reseved_words.length;i++) {
094                                    if(ps.isCurrent(reseved_words[i])) {
095                                            int pos=ps.getPos();
096                                            ps.setPos(pos+4);
097                                            if(ps.isCurrentWhiteSpace()) {
098                                                    sb.append(" placeholder_"+reseved_words[i]+" ");
099                                                    continue;
100                                            }
101                                            if(ps.isCurrent(',')) {
102                                                    sb.append(" placeholder_"+reseved_words[i]+",");
103                                                    continue;
104                                            }
105                                            ps.setPos(pos);
106                                    }
107                            }*/
108                                    /*if(ps.isCurrent("char")) {
109                                    int pos=ps.getPos();
110                                    ps.setPos(pos+4);
111                                    if(ps.isCurrentWhiteSpace()) {
112                                            sb.append(" "+PLACEHOLDER_CHAR+" ");
113                                            continue;
114                                    }
115                                    if(ps.isCurrent(',')) {
116                                            sb.append(" "+PLACEHOLDER_CHAR+",");
117                                            continue;
118                                    }
119                                    ps.setPos(pos);
120                            }*/
121                            }
122                        sb.append(ps.getCurrent());
123                            ps.next();
124                    }
125                    ;       
126                    if(!ps.isLast(';'))sb.append(';');
127                    
128                    //print.err(sb.toString());
129                    //print.err("---------------------------------------------------------------------------------");
130                    return sb.toString();
131            }
132            
133            
134    }