aboutsummaryrefslogtreecommitdiff
path: root/src/net/sourceforge/opentracking/helper/NamedParameterStatement.java
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2010-04-11 14:32:30 +0000
committerAnton Tananaev <anton.tananaev@gmail.com>2010-04-11 14:32:30 +0000
commit794c0ef3f92e5031dd7722325933d4cefdfce047 (patch)
treec0b573e68a4aebea3a0ac9817082740d86fdd1d3 /src/net/sourceforge/opentracking/helper/NamedParameterStatement.java
parentc9e11760f2131a9d0123c8575eaafc22dca407e3 (diff)
downloadtrackermap-server-794c0ef3f92e5031dd7722325933d4cefdfce047.tar.gz
trackermap-server-794c0ef3f92e5031dd7722325933d4cefdfce047.tar.bz2
trackermap-server-794c0ef3f92e5031dd7722325933d4cefdfce047.zip
Import project
Diffstat (limited to 'src/net/sourceforge/opentracking/helper/NamedParameterStatement.java')
-rw-r--r--src/net/sourceforge/opentracking/helper/NamedParameterStatement.java181
1 files changed, 181 insertions, 0 deletions
diff --git a/src/net/sourceforge/opentracking/helper/NamedParameterStatement.java b/src/net/sourceforge/opentracking/helper/NamedParameterStatement.java
new file mode 100644
index 000000000..2480a15e2
--- /dev/null
+++ b/src/net/sourceforge/opentracking/helper/NamedParameterStatement.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2010 Anton Tananaev (anton@tananaev.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sourceforge.opentracking.helper;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Date;
+
+public class NamedParameterStatement {
+
+ /**
+ * Native statement
+ */
+ private final PreparedStatement statement;
+
+ /**
+ * Index mapping
+ */
+ private final Map indexMap;
+
+ /**
+ * Initialize statement
+ */
+ public NamedParameterStatement(Connection connection, String query)
+ throws SQLException {
+
+ indexMap = new HashMap();
+ String parsedQuery = parse(query, indexMap);
+ statement = connection.prepareStatement(parsedQuery);
+ }
+
+ /**
+ * Parse query
+ */
+ static final String parse(String query, Map paramMap) {
+
+ int length = query.length();
+ StringBuffer parsedQuery = new StringBuffer(length);
+ boolean inSingleQuote = false;
+ boolean inDoubleQuote = false;
+ int index = 1;
+
+ for(int i = 0; i < length; i++) {
+
+ char c = query.charAt(i);
+
+ // String end
+ if (inSingleQuote) {
+ if (c == '\'') inSingleQuote = false;
+ } else if (inDoubleQuote) {
+ if (c == '"') inDoubleQuote = false;
+ } else {
+
+ // String begin
+ if (c == '\'') {
+ inSingleQuote = true;
+ } else if (c == '"') {
+ inDoubleQuote = true;
+ } else if (c == ':' && i + 1 < length &&
+ Character.isJavaIdentifierStart(query.charAt(i + 1))) {
+
+ // Identifier name
+ int j = i + 2;
+ while (j < length && Character.isJavaIdentifierPart(query.charAt(j))) j++;
+
+ String name = query.substring(i + 1, j);
+ c = '?';
+ i += name.length();
+
+ // Add to list
+ List indexList = (List) paramMap.get(name);
+ if (indexList == null) {
+ indexList = new LinkedList();
+ paramMap.put(name, indexList);
+ }
+ indexList.add(new Integer(index));
+
+ index++;
+ }
+ }
+
+ parsedQuery.append(c);
+ }
+
+ return parsedQuery.toString();
+ }
+
+ /**
+ * Execute query with result
+ */
+ public ResultSet executeQuery() throws SQLException {
+ return statement.executeQuery();
+ }
+
+
+ /**
+ * Executes query without result
+ */
+ public int executeUpdate() throws SQLException {
+ return statement.executeUpdate();
+ }
+
+ /**
+ * Immediately closes the statement
+ */
+ public void close() throws SQLException {
+ statement.close();
+ }
+
+ /**
+ * Set a parameter
+ */
+ /*public void setObject(String name, Object value) throws SQLException {
+
+ List indexList = (List) indexMap.get(name);
+ if (indexList != null) {
+ for (Object index: indexList) {
+ statement.setObject((Integer) index, value);
+ }
+ }
+ else {
+ throw new IllegalArgumentException();
+ }
+ }*/
+
+ public void setInt(String name, int value) throws SQLException {
+
+ List indexList = (List) indexMap.get(name);
+ for (Object index: indexList) {
+ statement.setInt((Integer) index, value);
+ }
+ }
+
+ public void setBoolean(String name, boolean value) throws SQLException {
+
+ List indexList = (List) indexMap.get(name);
+ for (Object index: indexList) {
+ statement.setBoolean((Integer) index, value);
+ }
+ }
+
+ public void setDouble(String name, double value) throws SQLException {
+
+ List indexList = (List) indexMap.get(name);
+ for (Object index: indexList) {
+ statement.setDouble((Integer) index, value);
+ }
+ }
+
+ public void setTimestamp(String name, Date value) throws SQLException {
+
+ List indexList = (List) indexMap.get(name);
+ for (Object index: indexList) {
+ statement.setTimestamp(
+ (Integer) index,
+ new Timestamp(value.getTime()));
+ }
+ }
+
+}