view flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/CompiledStatement.java @ 372:fc3cf0ef777e

Added meta data service. flys-artifacts/trunk@1781 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 29 Apr 2011 15:10:44 +0000
parents
children c09c9e05ecfa
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 :

http://dive4elements.wald.intevation.org