package railo.commons.sql;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.regex.Pattern;
import railo.commons.lang.ParserString;
import railo.commons.lang.StringUtil;
import railo.runtime.exp.PageException;
import railo.runtime.op.Caster;
import railo.runtime.type.sql.BlobImpl;
import railo.runtime.type.sql.ClobImpl;
public class SQLUtil {
private static final String ESCAPE_CHARS="\\{}[]^$*.?+";
public static Pattern pattern(String pstr,boolean ignoreCase) {
char[] carr = pstr.toCharArray();
char c;
StringBuilder sb=new StringBuilder();
for(int i=0;i<carr.length;i++) {
c=carr[i];
if(ESCAPE_CHARS.indexOf(c)!=-1) {
sb.append('\\');
sb.append(c);
}
else if(c=='%') {
sb.append(".*");
}
else if(c=='_') {
sb.append(".");
}
else {
if(ignoreCase) {
sb.append('[');
sb.append(Character.toLowerCase(c));
sb.append('|');
sb.append(Character.toUpperCase(c));
sb.append(']');
}
else sb.append(c);
}
}
return Pattern.compile(sb.toString());
}
public static boolean match(Pattern pattern, String string) {
return pattern.matcher(string).matches();
}
public static String removeLiterals(String sql) {
if(StringUtil.isEmpty(sql)) return sql;
return removeLiterals(new ParserString(sql),true);
}
private static String removeLiterals(ParserString ps, boolean escapeMysql) {
StringBuilder sb=new StringBuilder();
char c,p=(char)0;
boolean inside=false;
do {
c=ps.getCurrent();
if(c=='\''){
if(inside){
if(escapeMysql && p=='\\'){}
else if(ps.hasNext() && ps.getNext()=='\'')ps.next();
else inside=false;
}
else {
inside=true;
}
}
else {
if(!inside && c!='*' && c!='=' && c!='?')sb.append(c);
}
p=c;
ps.next();
}while(!ps.isAfterLast());
if(inside && escapeMysql) {
ps.setPos(0);
return removeLiterals(ps, false);
}
return sb.toString();
}
/**
* create a blog Object
* @param conn
* @param value
* @return
* @throws PageException
*/
public static Blob toBlob(Connection conn, Object value) throws PageException {
if(value instanceof Blob) return (Blob) value;
if(isOracle(conn)){
Blob blob = OracleBlob.createBlob(conn,Caster.toBinary(value),null);
if(blob!=null) return blob;
}
return BlobImpl.toBlob(value);
}
/**
* create a clob Object
* @param conn
* @param value
* @return
* @throws PageException
*/
public static Clob toClob(Connection conn, Object value) throws PageException {
if(value instanceof Clob) return (Clob) value;
if(isOracle(conn)){
Clob clob = OracleClob.createClob(conn,Caster.toString(value),null);
if(clob!=null) return clob;
}
return ClobImpl.toClob(value);
}
public static boolean isOracle(Connection conn) {
return StringUtil.indexOfIgnoreCase(conn.getClass().getName(), "oracle")!=-1;
}
public static void closeEL(Statement stat) {
if(stat!=null){
try {
stat.close();
} catch (SQLException e) {}
}
}
}