You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by kr...@apache.org on 2016/04/20 17:04:28 UTC

lucene-solr:branch_6x: SOLR-8809: Implement Connection.prepareStatement

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_6x 0ee231986 -> 6276fe5ec


SOLR-8809: Implement Connection.prepareStatement


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/6276fe5e
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/6276fe5e
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/6276fe5e

Branch: refs/heads/branch_6x
Commit: 6276fe5ec7bcbdd30e30059391707084b9c8e989
Parents: 0ee2319
Author: Kevin Risden <kr...@apache.org>
Authored: Tue Apr 19 13:15:23 2016 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Wed Apr 20 10:03:54 2016 -0500

----------------------------------------------------------------------
 solr/CHANGES.txt                                |   2 +
 .../client/solrj/io/sql/ConnectionImpl.java     |   6 +-
 .../solrj/io/sql/PreparedStatementImpl.java     | 394 +++++++++++++++++++
 .../solr/client/solrj/io/sql/StatementImpl.java |  10 +-
 .../solr/client/solrj/io/sql/JdbcTest.java      |  32 ++
 5 files changed, 438 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6276fe5e/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 672a9b7..40dde9e 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -71,6 +71,8 @@ New Features
 * SOLR-8349: Allow sharing of large in memory data structures across cores (Gus Heck, noble)
 
 
+* SOLR-8809: Implement Connection.prepareStatement (Kevin Risden)
+
 Bug Fixes
 ----------------------
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6276fe5e/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java
index aa78e14..5139527 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ConnectionImpl.java
@@ -88,17 +88,17 @@ class ConnectionImpl implements Connection {
 
   @Override
   public PreparedStatement prepareStatement(String sql) throws SQLException {
-    return null;
+    return new PreparedStatementImpl(this, sql);
   }
 
   @Override
   public CallableStatement prepareCall(String sql) throws SQLException {
-    return null;
+    throw new UnsupportedOperationException();
   }
 
   @Override
   public String nativeSQL(String sql) throws SQLException {
-    return null;
+    throw new UnsupportedOperationException();
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6276fe5e/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/PreparedStatementImpl.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/PreparedStatementImpl.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/PreparedStatementImpl.java
new file mode 100644
index 0000000..b3e7c9e
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/PreparedStatementImpl.java
@@ -0,0 +1,394 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.solr.client.solrj.io.sql;
+
+import java.io.InputStream;
+import java.io.Reader;
+import java.math.BigDecimal;
+import java.net.URL;
+import java.sql.Array;
+import java.sql.Blob;
+import java.sql.Clob;
+import java.sql.Date;
+import java.sql.NClob;
+import java.sql.ParameterMetaData;
+import java.sql.PreparedStatement;
+import java.sql.Ref;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.RowId;
+import java.sql.SQLException;
+import java.sql.SQLXML;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.Calendar;
+
+class PreparedStatementImpl extends StatementImpl implements PreparedStatement {
+  private final String sql;
+
+  PreparedStatementImpl(ConnectionImpl connection, String sql) {
+    super(connection);
+    this.sql = sql;
+  }
+
+  @Override
+  public ResultSet executeQuery() throws SQLException {
+    return super.executeQuery(this.sql);
+  }
+
+  @Override
+  public int executeUpdate() throws SQLException {
+    return super.executeUpdate(this.sql);
+  }
+
+  @Override
+  public boolean execute() throws SQLException {
+    return super.execute(this.sql);
+  }
+
+  @Override
+  public void clearParameters() throws SQLException {
+
+  }
+
+  @Override
+  public ResultSetMetaData getMetaData() throws SQLException {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public ParameterMetaData getParameterMetaData() throws SQLException {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void addBatch() throws SQLException {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void setNull(int parameterIndex, int sqlType) throws SQLException {
+
+  }
+
+  @Override
+  public void setBoolean(int parameterIndex, boolean x) throws SQLException {
+
+  }
+
+  @Override
+  public void setByte(int parameterIndex, byte x) throws SQLException {
+
+  }
+
+  @Override
+  public void setShort(int parameterIndex, short x) throws SQLException {
+
+  }
+
+  @Override
+  public void setInt(int parameterIndex, int x) throws SQLException {
+
+  }
+
+  @Override
+  public void setLong(int parameterIndex, long x) throws SQLException {
+
+  }
+
+  @Override
+  public void setFloat(int parameterIndex, float x) throws SQLException {
+
+  }
+
+  @Override
+  public void setDouble(int parameterIndex, double x) throws SQLException {
+
+  }
+
+  @Override
+  public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException {
+
+  }
+
+  @Override
+  public void setString(int parameterIndex, String x) throws SQLException {
+
+  }
+
+  @Override
+  public void setBytes(int parameterIndex, byte[] x) throws SQLException {
+
+  }
+
+  @Override
+  public void setDate(int parameterIndex, Date x) throws SQLException {
+
+  }
+
+  @Override
+  public void setTime(int parameterIndex, Time x) throws SQLException {
+
+  }
+
+  @Override
+  public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException {
+
+  }
+
+  @Override
+  public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException {
+
+  }
+
+  @Override
+  public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException {
+
+  }
+
+  @Override
+  public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException {
+
+  }
+
+  @Override
+  public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException {
+
+  }
+
+  @Override
+  public void setObject(int parameterIndex, Object x) throws SQLException {
+
+  }
+
+  @Override
+  public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException {
+
+  }
+
+  @Override
+  public void setRef(int parameterIndex, Ref x) throws SQLException {
+
+  }
+
+  @Override
+  public void setBlob(int parameterIndex, Blob x) throws SQLException {
+
+  }
+
+  @Override
+  public void setClob(int parameterIndex, Clob x) throws SQLException {
+
+  }
+
+  @Override
+  public void setArray(int parameterIndex, Array x) throws SQLException {
+
+  }
+
+  @Override
+  public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException {
+
+  }
+
+  @Override
+  public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException {
+
+  }
+
+  @Override
+  public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException {
+
+  }
+
+  @Override
+  public void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException {
+
+  }
+
+  @Override
+  public void setURL(int parameterIndex, URL x) throws SQLException {
+
+  }
+
+  @Override
+  public void setRowId(int parameterIndex, RowId x) throws SQLException {
+
+  }
+
+  @Override
+  public void setNString(int parameterIndex, String value) throws SQLException {
+
+  }
+
+  @Override
+  public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException {
+
+  }
+
+  @Override
+  public void setNClob(int parameterIndex, NClob value) throws SQLException {
+
+  }
+
+  @Override
+  public void setClob(int parameterIndex, Reader reader, long length) throws SQLException {
+
+  }
+
+  @Override
+  public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException {
+
+  }
+
+  @Override
+  public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException {
+
+  }
+
+  @Override
+  public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException {
+
+  }
+
+  @Override
+  public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException {
+
+  }
+
+  @Override
+  public void setAsciiStream(int parameterIndex, InputStream x, long length) throws SQLException {
+
+  }
+
+  @Override
+  public void setBinaryStream(int parameterIndex, InputStream x, long length) throws SQLException {
+
+  }
+
+  @Override
+  public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException {
+
+  }
+
+  @Override
+  public void setAsciiStream(int parameterIndex, InputStream x) throws SQLException {
+
+  }
+
+  @Override
+  public void setBinaryStream(int parameterIndex, InputStream x) throws SQLException {
+
+  }
+
+  @Override
+  public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException {
+
+  }
+
+  @Override
+  public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException {
+
+  }
+
+  @Override
+  public void setClob(int parameterIndex, Reader reader) throws SQLException {
+
+  }
+
+  @Override
+  public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException {
+
+  }
+
+  @Override
+  public void setNClob(int parameterIndex, Reader reader) throws SQLException {
+
+  }
+
+  // Methods below cannot be called from a PreparedStatement based on JDBC spec
+
+  @Override
+  public ResultSet executeQuery(String sql) throws SQLException {
+    throw new SQLException("Cannot be called from PreparedStatement");
+  }
+
+  @Override
+  public int executeUpdate(String sql) throws SQLException {
+    throw new SQLException("Cannot be called from PreparedStatement");
+  }
+
+  @Override
+  public boolean execute(String sql) throws SQLException {
+    throw new SQLException("Cannot be called from PreparedStatement");
+  }
+
+  @Override
+  public void addBatch( String sql ) throws SQLException {
+    throw new SQLException("Cannot be called from PreparedStatement");
+  }
+
+  @Override
+  public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException {
+    throw new SQLException("Cannot be called from PreparedStatement");
+  }
+
+  @Override
+  public int executeUpdate(String sql, int columnIndexes[]) throws SQLException {
+    throw new SQLException("Cannot be called from PreparedStatement");
+  }
+
+  @Override
+  public int executeUpdate(String sql, String columnNames[]) throws SQLException {
+    throw new SQLException("Cannot be called from PreparedStatement");
+  }
+
+  @Override
+  public boolean execute(String sql, int autoGeneratedKeys) throws SQLException {
+    throw new SQLException("Cannot be called from PreparedStatement");
+  }
+
+  @Override
+  public boolean execute(String sql, int columnIndexes[]) throws SQLException {
+    throw new SQLException("Cannot be called from PreparedStatement");
+  }
+
+  @Override
+  public boolean execute(String sql, String columnNames[]) throws SQLException {
+    throw new SQLException("Cannot be called from PreparedStatement");
+  }
+
+  @Override
+  public long executeLargeUpdate(String sql) throws SQLException {
+    throw new SQLException("Cannot be called from PreparedStatement");
+  }
+
+  @Override
+  public long executeLargeUpdate(String sql, int autoGeneratedKeys) throws SQLException {
+    throw new SQLException("Cannot be called from PreparedStatement");
+  }
+
+  @Override
+  public long executeLargeUpdate(String sql, int columnIndexes[]) throws SQLException {
+    throw new SQLException("Cannot be called from PreparedStatement");
+  }
+
+  @Override
+  public long executeLargeUpdate(String sql, String columnNames[]) throws SQLException {
+    throw new SQLException("Cannot be called from PreparedStatement");
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6276fe5e/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
index 6af58da..24b20a4 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
@@ -51,8 +51,7 @@ class StatementImpl implements Statement {
     this.connection = connection;
   }
 
-  @Override
-  public ResultSet executeQuery(String sql) throws SQLException {
+  private ResultSet executeQueryImpl(String sql) throws SQLException {
     try {
       if(this.currentResultSet != null) {
         this.currentResultSet.close();
@@ -108,6 +107,11 @@ class StatementImpl implements Statement {
   }
 
   @Override
+  public ResultSet executeQuery(String sql) throws SQLException {
+    return this.executeQueryImpl(sql);
+  }
+
+  @Override
   public int executeUpdate(String sql) throws SQLException {
     return 0;
   }
@@ -203,7 +207,7 @@ class StatementImpl implements Statement {
 
   @Override
   public ResultSet getResultSet() throws SQLException {
-    return this.executeQuery(this.currentSQL);
+    return this.executeQueryImpl(this.currentSQL);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6276fe5e/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
index 200c971..40d14a1 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
@@ -20,6 +20,7 @@ import java.io.File;
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.DriverManager;
+import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.Statement;
@@ -530,6 +531,37 @@ public class JdbcTest extends AbstractFullDistribZkTestBase {
 
         assertFalse(statement.getMoreResults());
       }
+
+      try (PreparedStatement statement = con.prepareStatement(sql)) {
+        assertEquals(con, statement.getConnection());
+
+        assertNull(statement.getWarnings());
+        statement.clearWarnings();
+        assertNull(statement.getWarnings());
+
+        assertEquals(0, statement.getFetchSize());
+        statement.setFetchSize(0);
+        assertEquals(0, statement.getFetchSize());
+
+        try (ResultSet rs = statement.executeQuery()) {
+          assertEquals(statement, rs.getStatement());
+
+          checkResultSetMetadata(rs);
+          checkResultSet(rs);
+        }
+
+        assertTrue(statement.execute());
+        assertEquals(-1, statement.getUpdateCount());
+
+        try (ResultSet rs = statement.getResultSet()) {
+          assertEquals(statement, rs.getStatement());
+
+          checkResultSetMetadata(rs);
+          checkResultSet(rs);
+        }
+
+        assertFalse(statement.getMoreResults());
+      }
     }
   }