Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/CompiledStatement.java @ 950:22bc87a42a0d
First step to factor out the "Datenkorb" logic into a service independent singleton.
flys-artifacts/trunk@2367 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 20 Jul 2011 09:56:39 +0000 |
parents | c09c9e05ecfa |
children | 2c8fc60125b9 |
line wrap: on
line source
package de.intevation.flys.artifacts.services.meta; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.util.List; import java.util.Map; import java.util.HashMap; import java.util.ArrayList; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Connection; import java.sql.ResultSet; public class CompiledStatement { public static final Pattern VAR = Pattern.compile("\\$\\{([a-zA-Z0-9_]+)\\}"); protected String original; protected String statement; protected Map<String, List<Integer>> positions; protected PreparedStatement preparedStatement; public CompiledStatement() { } public CompiledStatement(String original) { this.original = original; positions = new HashMap<String, List<Integer>>(); compile(); } protected void compile() { StringBuffer sb = new StringBuffer(); Matcher m = VAR.matcher(original); int index = 1; while (m.find()) { String key = m.group(1); List<Integer> indices = positions.get(key); if (indices == null) { indices = new ArrayList<Integer>(); positions.put(key, indices); } indices.add(index); m.appendReplacement(sb, "?"); ++index; } m.appendTail(sb); statement = sb.toString(); } public String getStatement() { return statement; } public ResultData execute(Connection connection, StackFrames frames) throws SQLException { if (preparedStatement == null) { preparedStatement = connection.prepareStatement(statement); } for (Map.Entry<String, List<Integer>> entry: positions.entrySet()) { Object value = frames.get(entry.getKey()); for (Integer index: entry.getValue()) { preparedStatement.setObject(index, value); } } ResultSet result = preparedStatement.executeQuery(); try { return new ResultData(preparedStatement.getMetaData()) .addAll(result); } finally { result.close(); } } public void close() { if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException sqle) { } preparedStatement = null; } } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :