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 }