annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/CompiledStatement.java @ 973:c30ada285d45

Reuse the compiled statements in meta data service. flys-artifacts/trunk@2399 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sat, 23 Jul 2011 18:47:08 +0000
parents 0c8aca463bd4
children
rev   line source
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 package de.intevation.flys.artifacts.services.meta;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 import java.util.regex.Pattern;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 import java.util.regex.Matcher;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 import java.util.List;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 import java.util.Map;
972
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
8 import java.util.TreeMap;
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 import java.util.ArrayList;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 import java.sql.PreparedStatement;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 import java.sql.SQLException;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13 import java.sql.Connection;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 import java.sql.ResultSet;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
972
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
16 import net.sf.ehcache.Cache;
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
17 import net.sf.ehcache.Element;
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
18
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
19 import de.intevation.flys.artifacts.cache.CacheFactory;
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
20
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21 public class CompiledStatement
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22 {
972
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
23 public static final String DATACAGE_DB_CACHE =
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
24 "datacage.db";
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
25
969
2c8fc60125b9 Meta data template: Allow '-' in variable names.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 742
diff changeset
26 public static final Pattern VAR =
2c8fc60125b9 Meta data template: Allow '-' in variable names.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 742
diff changeset
27 Pattern.compile("\\$\\{([a-zA-Z0-9_-]+)\\}");
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
28
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29 protected String original;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30 protected String statement;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
31
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32 protected Map<String, List<Integer>> positions;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33
973
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
34 protected int numVars;
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35
973
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
36 public class Instance {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
37
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
38 protected PreparedStatement preparedStatement;
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
39
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
40 public Instance() {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
41 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
42
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
43 protected ResultData executeCached(
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
44 Cache cache,
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
45 Connection connection,
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
46 StackFrames frames
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
47 )
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
48 throws SQLException
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
49 {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
50 Object [] values = new Object[numVars];
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
51
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
52 StringBuilder sb = new StringBuilder(original);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
53
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
54 for (Map.Entry<String, List<Integer>> entry: positions.entrySet()) {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
55 String key = entry.getKey();
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
56 Object value = frames.get(key);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
57 sb.append(';').append(key).append(':').append(value);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
58 for (Integer index: entry.getValue()) {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
59 values[index] = value;
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
60 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
61 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
62
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
63 // XXX: Maybe too many collisions?
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
64 // String key = original + Arrays.hashCode(values);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
65 String key = sb.toString();
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
66
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
67 Element element = cache.get(key);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
68
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
69 if (element != null) {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
70 return (ResultData)element.getValue();
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
71 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
72
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
73 if (preparedStatement == null) {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
74 preparedStatement = connection.prepareStatement(statement);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
75 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
76
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
77 for (int i = 0; i < values.length; ++i) {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
78 preparedStatement.setObject(i+1, values[i]);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
79 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
80
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
81 ResultData data;
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
82
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
83 ResultSet result = preparedStatement.executeQuery();
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
84 try {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
85 data = new ResultData(preparedStatement.getMetaData())
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
86 .addAll(result);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
87 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
88 finally {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
89 result.close();
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
90 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
91
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
92 element = new Element(key, data);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
93 cache.put(element);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
94
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
95 return data;
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
96 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
97
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
98 protected ResultData executeUncached(
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
99 Connection connection,
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
100 StackFrames frames
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
101 )
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
102 throws SQLException
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
103 {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
104 if (preparedStatement == null) {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
105 preparedStatement = connection.prepareStatement(statement);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
106 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
107
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
108 for (Map.Entry<String, List<Integer>> entry: positions.entrySet()) {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
109 Object value = frames.get(entry.getKey());
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
110 for (Integer index: entry.getValue()) {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
111 preparedStatement.setObject(index+1, value);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
112 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
113 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
114
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
115 ResultSet result = preparedStatement.executeQuery();
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
116 try {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
117 return new ResultData(preparedStatement.getMetaData())
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
118 .addAll(result);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
119 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
120 finally {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
121 result.close();
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
122 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
123 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
124
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
125 public ResultData execute(Connection connection, StackFrames frames)
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
126 throws SQLException
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
127 {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
128 Cache cache = CacheFactory.getCache(DATACAGE_DB_CACHE);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
129
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
130 return cache != null
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
131 ? executeCached(cache, connection, frames)
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
132 : executeUncached(connection, frames);
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
133 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
134
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
135 public void close() {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
136 if (preparedStatement != null) {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
137 try {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
138 preparedStatement.close();
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
139 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
140 catch (SQLException sqle) {
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
141 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
142 preparedStatement = null;
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
143 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
144 }
c30ada285d45 Reuse the compiled statements in meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 972
diff changeset
145 } // class Instance
972
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
146
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
147 public CompiledStatement() {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
148 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
149
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
150 public CompiledStatement(String original) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
151 this.original = original;
972
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
152 // TreeMap to ensure order
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
153 positions = new TreeMap<String, List<Integer>>();
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
154 compile();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
155 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
156
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
157 protected void compile() {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
158
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
159 StringBuffer sb = new StringBuffer();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
160
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
161 Matcher m = VAR.matcher(original);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
162
972
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
163 int index = 0;
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
164
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
165 while (m.find()) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
166 String key = m.group(1);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
167 List<Integer> indices = positions.get(key);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
168 if (indices == null) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
169 indices = new ArrayList<Integer>();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
170 positions.put(key, indices);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
171 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
172 indices.add(index);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
173 m.appendReplacement(sb, "?");
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
174 ++index;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
175 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
176
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
177 m.appendTail(sb);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
178
972
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
179 numVars = index;
0c8aca463bd4 Added caching support for the static part of the datacage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 969
diff changeset
180
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
181 statement = sb.toString();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
182 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
183
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
184 public String getStatement() {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
185 return statement;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
186 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
187 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
188 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org