sascha@372: package de.intevation.flys.artifacts.services.meta; sascha@372: sascha@372: import java.util.regex.Pattern; sascha@372: import java.util.regex.Matcher; sascha@372: sascha@372: import java.util.List; sascha@372: import java.util.Map; sascha@372: import java.util.HashMap; sascha@372: import java.util.ArrayList; sascha@372: sascha@372: import java.sql.PreparedStatement; sascha@372: import java.sql.SQLException; sascha@372: import java.sql.Connection; sascha@372: import java.sql.ResultSet; sascha@372: sascha@372: public class CompiledStatement sascha@372: { sascha@372: public static final Pattern VAR = Pattern.compile("\\$\\{([a-zA-Z0-9_]+)\\}"); sascha@372: sascha@372: protected String original; sascha@372: protected String statement; sascha@372: sascha@372: protected Map> positions; sascha@372: sascha@372: protected PreparedStatement preparedStatement; sascha@372: sascha@372: public CompiledStatement() { sascha@372: } sascha@372: sascha@372: public CompiledStatement(String original) { sascha@372: this.original = original; sascha@372: positions = new HashMap>(); sascha@372: compile(); sascha@372: } sascha@372: sascha@372: protected void compile() { sascha@372: sascha@372: StringBuffer sb = new StringBuffer(); sascha@372: sascha@372: Matcher m = VAR.matcher(original); sascha@372: sascha@372: int index = 1; sascha@372: sascha@372: while (m.find()) { sascha@372: String key = m.group(1); sascha@372: List indices = positions.get(key); sascha@372: if (indices == null) { sascha@372: indices = new ArrayList(); sascha@372: positions.put(key, indices); sascha@372: } sascha@372: indices.add(index); sascha@372: m.appendReplacement(sb, "?"); sascha@372: ++index; sascha@372: } sascha@372: sascha@372: m.appendTail(sb); sascha@372: sascha@372: statement = sb.toString(); sascha@372: } sascha@372: sascha@372: public String getStatement() { sascha@372: return statement; sascha@372: } sascha@372: sascha@372: public ResultData execute(Connection connection, StackFrames frames) sascha@372: throws SQLException sascha@372: { sascha@372: if (preparedStatement == null) { sascha@372: preparedStatement = connection.prepareStatement(statement); sascha@372: } sascha@372: sascha@372: for (Map.Entry> entry: positions.entrySet()) { sascha@372: Object value = frames.get(entry.getKey()); sascha@372: for (Integer index: entry.getValue()) { sascha@372: preparedStatement.setObject(index, value); sascha@372: } sascha@372: } sascha@372: sascha@372: ResultSet result = preparedStatement.executeQuery(); sascha@372: try { sascha@372: return new ResultData(preparedStatement.getMetaData()) sascha@372: .addAll(result); sascha@372: } sascha@372: finally { sascha@372: result.close(); sascha@372: } sascha@372: } sascha@372: sascha@372: public void close() { sascha@372: if (preparedStatement != null) { sascha@372: try { sascha@372: preparedStatement.close(); sascha@372: } sascha@372: catch (SQLException sqle) { sascha@372: } sascha@372: preparedStatement = null; sascha@372: } sascha@372: } sascha@372: } sascha@372: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :