diff flys-aft/src/main/java/de/intevation/db/SymbolicStatement.java @ 4073:2c70fae83d0c

start syncing at river level. flys-aft/trunk@3406 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 13 Dec 2011 13:41:43 +0000
parents
children dbd0b3b1b8b8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-aft/src/main/java/de/intevation/db/SymbolicStatement.java	Tue Dec 13 13:41:43 2011 +0000
@@ -0,0 +1,153 @@
+package de.intevation.db;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.PreparedStatement;
+import java.sql.Timestamp;
+
+import org.apache.log4j.Logger;
+
+public class SymbolicStatement {
+
+    private static Logger log = Logger.getLogger(SymbolicStatement.class);
+
+    public static final Pattern VAR = Pattern.compile(":([a-zA-Z0-9_]+)");
+
+    protected String statement;
+    protected String compiled;
+    protected Map<String, List<Integer>> positions;
+
+    public class Instance {
+
+        /** TODO: Support more types. */
+
+        protected PreparedStatement stmnt;
+
+        public Instance(Connection connection) throws SQLException {
+            stmnt = connection.prepareStatement(compiled);
+        }
+
+        public void close() {
+            try {
+                stmnt.close();
+            }
+            catch (SQLException sqle) {
+                log.error("cannot close statement", sqle);
+            }
+        }
+
+        public void setInt(String key, int value)
+        throws SQLException 
+        {
+            List<Integer> pos = positions.get(key.toLowerCase());
+            if (pos != null) {
+                for (Integer p: pos) {
+                    stmnt.setInt(p, value);
+                }
+            }
+        }
+
+        public void setString(String key, String value)
+        throws SQLException 
+        {
+            List<Integer> pos = positions.get(key.toLowerCase());
+            if (pos != null) {
+                for (Integer p: pos) {
+                    stmnt.setString(p, value);
+                }
+            }
+        }
+
+        public void setObject(String key, Object value)
+        throws SQLException 
+        {
+            List<Integer> pos = positions.get(key.toLowerCase());
+            if (pos != null) {
+                for (Integer p: pos) {
+                    stmnt.setObject(p, value);
+                }
+            }
+        }
+
+        public void setTimestamp(String key, Timestamp value)
+        throws SQLException 
+        {
+            List<Integer> pos = positions.get(key.toLowerCase());
+            if (pos != null) {
+                for (Integer p: pos) {
+                    stmnt.setTimestamp(p, value);
+                }
+            }
+        }
+
+        public void setDouble(String key, int value)
+        throws SQLException 
+        {
+            List<Integer> pos = positions.get(key.toLowerCase());
+            if (pos != null) {
+                for (Integer p: pos) {
+                    stmnt.setDouble(p, value);
+                }
+            }
+        }
+
+        public void setNull(String key, int sqlType)
+        throws SQLException 
+        {
+            List<Integer> pos = positions.get(key.toLowerCase());
+            if (pos != null) {
+                for (Integer p: pos) {
+                    stmnt.setNull(p, sqlType);
+                }
+            }
+        }
+
+        public void set(Map<String, Object> map) throws SQLException {
+            for (Map.Entry<String, Object> entry: map.entrySet()) {
+                setObject(entry.getKey(), entry.getValue());
+            }
+        }
+
+        public void clearParameters() throws SQLException {
+            stmnt.clearParameters();
+        }
+
+    } // class Instance
+
+    public SymbolicStatement(String statement) {
+        this.statement = statement;
+        compile();
+    }
+
+    public String getStatement() {
+        return statement;
+    }
+
+    protected void compile() {
+        positions = new HashMap<String, List<Integer>>();
+
+        StringBuffer sb = new StringBuffer();
+        Matcher m = VAR.matcher(statement);
+        int index = 1;
+        while (m.find()) {
+            String key = m.group(1).toLowerCase();
+            List<Integer> list = positions.get(key);
+            if (list == null) {
+                list = new ArrayList<Integer>();
+                positions.put(key, list);
+            }
+            list.add(index++);
+            m.appendReplacement(sb, "?");
+        }
+        m.appendTail(sb);
+        compiled = sb.toString();
+    }
+} // class SymbolicStatement

http://dive4elements.wald.intevation.org