/** * * Copyright (c) 2014, the Railo Company Ltd. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see <http://www.gnu.org/licenses/>. * **/ package lucee.commons.sql; import java.sql.Blob; import java.sql.Clob; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.regex.Pattern; import lucee.commons.io.SystemUtil; import lucee.commons.lang.ExceptionUtil; import lucee.commons.lang.ParserString; import lucee.commons.lang.StringUtil; import lucee.runtime.db.driver.ConnectionProxy; import lucee.runtime.exp.PageException; import lucee.runtime.op.Caster; import lucee.runtime.type.sql.BlobImpl; import lucee.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 * @throws SQLException */ public static Blob toBlob(Connection conn, Object value) throws PageException, SQLException { if(value instanceof Blob) return (Blob) value; // Java >= 1.6 if(SystemUtil.JAVA_VERSION>=SystemUtil.JAVA_VERSION_1_6) { try { Blob blob = conn.createBlob(); blob.setBytes(1, Caster.toBinary(value)); return blob; } catch(Throwable t){ ExceptionUtil.rethrowIfNecessary(t); return BlobImpl.toBlob(value); } } // Java < 1.6 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 * @throws SQLException */ public static Clob toClob(Connection conn, Object value) throws PageException, SQLException { if(value instanceof Clob) return (Clob) value; // Java >= 1.6 if(SystemUtil.JAVA_VERSION>=SystemUtil.JAVA_VERSION_1_6) { Clob clob = conn.createClob(); clob.setString(1, Caster.toString(value)); return clob; } // Java < 1.6 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) { if(conn instanceof ConnectionProxy) conn=((ConnectionProxy)conn).getConnection(); return StringUtil.indexOfIgnoreCase(conn.getClass().getName(), "oracle")!=-1; } public static void closeEL(Statement stat) { if(stat!=null){ try { stat.close(); } catch (SQLException e) {} } } public static void closeEL(Connection conn) { if(conn!=null){ try { conn.close(); } catch (SQLException e) {} } } public static void closeEL(ResultSet rs) { if(rs!=null){ try { rs.close(); } catch (SQLException e) {} } } }