You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2018/06/18 22:16:13 UTC

commons-dbcp git commit: [DBCP-479] Support default schema in configuration.

Repository: commons-dbcp
Updated Branches:
  refs/heads/master 35a456bb6 -> a0c48c1e1


[DBCP-479] Support default schema in configuration.

Project: http://git-wip-us.apache.org/repos/asf/commons-dbcp/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-dbcp/commit/a0c48c1e
Tree: http://git-wip-us.apache.org/repos/asf/commons-dbcp/tree/a0c48c1e
Diff: http://git-wip-us.apache.org/repos/asf/commons-dbcp/diff/a0c48c1e

Branch: refs/heads/master
Commit: a0c48c1e155462c2851b41eb7aa707f310516411
Parents: 35a456b
Author: Gary Gregory <ga...@gmail.com>
Authored: Mon Jun 18 16:16:09 2018 -0600
Committer: Gary Gregory <ga...@gmail.com>
Committed: Mon Jun 18 16:16:09 2018 -0600

----------------------------------------------------------------------
 src/changes/changes.xml                         |  3 ++
 .../apache/commons/dbcp2/BasicDataSource.java   | 39 ++++++++++++++++++++
 .../commons/dbcp2/BasicDataSourceFactory.java   | 28 ++++++++------
 .../commons/dbcp2/BasicDataSourceMXBean.java    | 10 +++++
 .../dbcp2/PoolableConnectionFactory.java        | 15 ++++++++
 .../dbcp2/managed/BasicManagedDataSource.java   |  1 +
 .../commons/dbcp2/TestBasicDataSource.java      |  9 ++++-
 .../dbcp2/TestBasicDataSourceFactory.java       | 11 +++---
 .../apache/commons/dbcp2/TesterConnection.java  |  7 +++-
 9 files changed, 103 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 62c845b..1224770 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -67,6 +67,9 @@ The <action> type attribute can be add,update,fix,remove.
       <action dev="ggregory" type="update" issue="DBCP-506" due-to="Gary Gregory">
         Support JDBC 4.2.
       </action>
+      <action dev="ggregory" type="update" issue="DBCP-479" due-to="Guillaume Husta, Gary Gregory">
+        Support default schema in configuration.
+      </action>
     </release>
     <release version="2.4.0" date="2018-06-12" description="This is a minor release, including bug fixes and enhancements.">
       <action dev="ggregory" type="fix" issue="DBCP-484" due-to="Emanuel Freitas">

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java b/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java
index d940e7e..8d08509 100644
--- a/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java
+++ b/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java
@@ -224,6 +224,11 @@ public class BasicDataSource implements DataSource, BasicDataSourceMXBean, MBean
     private volatile String defaultCatalog;
 
     /**
+     * The default "schema" of connections created by this pool.
+     */
+    private volatile String defaultSchema;
+
+    /**
      * Returns the default catalog.
      *
      * @return the default catalog
@@ -234,6 +239,17 @@ public class BasicDataSource implements DataSource, BasicDataSourceMXBean, MBean
     }
 
     /**
+     * Returns the default schema.
+     *
+     * @return the default schema.
+     * @since 2.5.0
+     */
+    @Override
+    public String getDefaultSchema() {
+        return this.defaultSchema;
+    }
+
+    /**
      * <p>
      * Sets the default catalog.
      * </p>
@@ -255,6 +271,28 @@ public class BasicDataSource implements DataSource, BasicDataSourceMXBean, MBean
     }
 
     /**
+     * <p>
+     * Sets the default schema.
+     * </p>
+     * <p>
+     * Note: this method currently has no effect once the pool has been initialized. The pool is initialized the first
+     * time one of the following methods is invoked: <code>getConnection, setLogwriter,
+     * setLoginTimeout, getLoginTimeout, getLogWriter.</code>
+     * </p>
+     *
+     * @param defaultSchema
+     *            the default catalog
+     * @since 2.5.0
+     */
+    public void setDefaultSchema(final String defaultSchema) {
+        if (defaultSchema != null && defaultSchema.trim().length() > 0) {
+            this.defaultSchema = defaultSchema;
+        } else {
+            this.defaultSchema = null;
+        }
+    }
+
+    /**
      * The property that controls if the pooled connections cache some state rather than query the database for current
      * state to improve performance.
      */
@@ -2317,6 +2355,7 @@ public class BasicDataSource implements DataSource, BasicDataSourceMXBean, MBean
             connectionFactory.setDefaultAutoCommit(defaultAutoCommit);
             connectionFactory.setDefaultTransactionIsolation(defaultTransactionIsolation);
             connectionFactory.setDefaultCatalog(defaultCatalog);
+            connectionFactory.setDefaultSchema(defaultSchema);
             connectionFactory.setCacheState(cacheState);
             connectionFactory.setPoolStatements(poolPreparedStatements);
             connectionFactory.setMaxOpenPreparedStatements(maxOpenPreparedStatements);

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/main/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java b/src/main/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java
index 69c2cb9..959aecf 100644
--- a/src/main/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java
+++ b/src/main/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java
@@ -63,6 +63,7 @@ public class BasicDataSourceFactory implements ObjectFactory {
     private static final String PROP_DEFAULTREADONLY = "defaultReadOnly";
     private static final String PROP_DEFAULTTRANSACTIONISOLATION = "defaultTransactionIsolation";
     private static final String PROP_DEFAULTCATALOG = "defaultCatalog";
+    private static final String PROP_DEFAULTSCHEMA = "defaultSchema";
     private static final String PROP_CACHESTATE = "cacheState";
     private static final String PROP_DRIVERCLASSNAME = "driverClassName";
     private static final String PROP_LIFO = "lifo";
@@ -130,17 +131,17 @@ public class BasicDataSourceFactory implements ObjectFactory {
     private static final String SILENTPROP_AUTH = "auth";
 
     private static final String[] ALL_PROPERTIES = {PROP_DEFAULTAUTOCOMMIT, PROP_DEFAULTREADONLY,
-            PROP_DEFAULTTRANSACTIONISOLATION, PROP_DEFAULTCATALOG, PROP_CACHESTATE, PROP_DRIVERCLASSNAME, PROP_LIFO,
-            PROP_MAXTOTAL, PROP_MAXIDLE, PROP_MINIDLE, PROP_INITIALSIZE, PROP_MAXWAITMILLIS, PROP_TESTONCREATE,
-            PROP_TESTONBORROW, PROP_TESTONRETURN, PROP_TIMEBETWEENEVICTIONRUNSMILLIS, PROP_NUMTESTSPEREVICTIONRUN,
-            PROP_MINEVICTABLEIDLETIMEMILLIS, PROP_SOFTMINEVICTABLEIDLETIMEMILLIS, PROP_EVICTIONPOLICYCLASSNAME,
-            PROP_TESTWHILEIDLE, PROP_PASSWORD, PROP_URL, PROP_USERNAME, PROP_VALIDATIONQUERY,
-            PROP_VALIDATIONQUERY_TIMEOUT, PROP_CONNECTIONINITSQLS, PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED,
-            PROP_REMOVEABANDONEDONBORROW, PROP_REMOVEABANDONEDONMAINTENANCE, PROP_REMOVEABANDONEDTIMEOUT,
-            PROP_LOGABANDONED, PROP_ABANDONEDUSAGETRACKING, PROP_POOLPREPAREDSTATEMENTS, PROP_MAXOPENPREPAREDSTATEMENTS,
-            PROP_CONNECTIONPROPERTIES, PROP_MAXCONNLIFETIMEMILLIS, PROP_LOGEXPIREDCONNECTIONS, PROP_ROLLBACK_ON_RETURN,
-            PROP_ENABLE_AUTOCOMMIT_ON_RETURN, PROP_DEFAULT_QUERYTIMEOUT, PROP_FASTFAIL_VALIDATION,
-            PROP_DISCONNECTION_SQL_CODES, PROP_JMX_NAME };
+            PROP_DEFAULTTRANSACTIONISOLATION, PROP_DEFAULTCATALOG, PROP_DEFAULTSCHEMA, PROP_CACHESTATE,
+            PROP_DRIVERCLASSNAME, PROP_LIFO, PROP_MAXTOTAL, PROP_MAXIDLE, PROP_MINIDLE, PROP_INITIALSIZE,
+            PROP_MAXWAITMILLIS, PROP_TESTONCREATE, PROP_TESTONBORROW, PROP_TESTONRETURN,
+            PROP_TIMEBETWEENEVICTIONRUNSMILLIS, PROP_NUMTESTSPEREVICTIONRUN, PROP_MINEVICTABLEIDLETIMEMILLIS,
+            PROP_SOFTMINEVICTABLEIDLETIMEMILLIS, PROP_EVICTIONPOLICYCLASSNAME, PROP_TESTWHILEIDLE, PROP_PASSWORD,
+            PROP_URL, PROP_USERNAME, PROP_VALIDATIONQUERY, PROP_VALIDATIONQUERY_TIMEOUT, PROP_CONNECTIONINITSQLS,
+            PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED, PROP_REMOVEABANDONEDONBORROW, PROP_REMOVEABANDONEDONMAINTENANCE,
+            PROP_REMOVEABANDONEDTIMEOUT, PROP_LOGABANDONED, PROP_ABANDONEDUSAGETRACKING, PROP_POOLPREPAREDSTATEMENTS,
+            PROP_MAXOPENPREPAREDSTATEMENTS, PROP_CONNECTIONPROPERTIES, PROP_MAXCONNLIFETIMEMILLIS,
+            PROP_LOGEXPIREDCONNECTIONS, PROP_ROLLBACK_ON_RETURN, PROP_ENABLE_AUTOCOMMIT_ON_RETURN,
+            PROP_DEFAULT_QUERYTIMEOUT, PROP_FASTFAIL_VALIDATION, PROP_DISCONNECTION_SQL_CODES, PROP_JMX_NAME };
 
     /**
      * Obsolete properties from DBCP 1.x. with warning strings suggesting new properties. LinkedHashMap will guarantee
@@ -337,6 +338,11 @@ public class BasicDataSourceFactory implements ObjectFactory {
             dataSource.setDefaultCatalog(value);
         }
 
+        value = properties.getProperty(PROP_DEFAULTSCHEMA);
+        if (value != null) {
+            dataSource.setDefaultSchema(value);
+        }
+
         value = properties.getProperty(PROP_CACHESTATE);
         if (value != null) {
             dataSource.setCacheState(Boolean.valueOf(value).booleanValue());

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/main/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java b/src/main/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java
index 4693c88..4754764 100644
--- a/src/main/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java
+++ b/src/main/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java
@@ -59,6 +59,16 @@ public interface BasicDataSourceMXBean {
     String getDefaultCatalog();
 
     /**
+     * See {@link BasicDataSource#getDefaultSchema()}
+     *
+     * @return {@link BasicDataSource#getDefaultSchema()}
+     * @since 2.5.0
+     */
+    default String getDefaultSchema() {
+        return null;
+    }
+
+    /**
      * See {@link BasicDataSource#getCacheState()}
      *
      * @return {@link BasicDataSource#getCacheState()}

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java b/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java
index 9ff815b..ad932bc 100644
--- a/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java
+++ b/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java
@@ -157,6 +157,17 @@ public class PoolableConnectionFactory implements PooledObjectFactory<PoolableCo
         this.defaultCatalog = defaultCatalog;
     }
 
+    /**
+     * Sets the default "schema" setting for borrowed {@link Connection}s
+     *
+     * @param defaultSchema
+     *            the default "schema" setting for borrowed {@link Connection}s
+     * @since 2.5.0
+     */
+    public void setDefaultSchema(final String defaultSchema) {
+        this.defaultSchema = defaultSchema;
+    }
+
     public void setCacheState(final boolean cacheState) {
         this.cacheState = cacheState;
     }
@@ -427,6 +438,9 @@ public class PoolableConnectionFactory implements PooledObjectFactory<PoolableCo
         if (defaultCatalog != null && !defaultCatalog.equals(conn.getCatalog())) {
             conn.setCatalog(defaultCatalog);
         }
+        if (defaultSchema != null && !defaultSchema.equals(conn.getSchema())) {
+            conn.setSchema(defaultSchema);
+        }
         conn.setDefaultQueryTimeout(defaultQueryTimeoutSeconds);
     }
 
@@ -478,6 +492,7 @@ public class PoolableConnectionFactory implements PooledObjectFactory<PoolableCo
     private boolean rollbackOnReturn = true;
     private int defaultTransactionIsolation = UNKNOWN_TRANSACTIONISOLATION;
     private String defaultCatalog;
+    private String defaultSchema;
     private boolean cacheState;
     private boolean poolStatements;
     private int maxOpenPreparedStatements = GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL_PER_KEY;

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java b/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java
index 329c0bd..723c621 100644
--- a/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java
+++ b/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java
@@ -207,6 +207,7 @@ public class BasicManagedDataSource extends BasicDataSource {
             connectionFactory.setDefaultAutoCommit(getDefaultAutoCommit());
             connectionFactory.setDefaultTransactionIsolation(getDefaultTransactionIsolation());
             connectionFactory.setDefaultCatalog(getDefaultCatalog());
+            connectionFactory.setDefaultSchema(getDefaultSchema());
             connectionFactory.setCacheState(getCacheState());
             connectionFactory.setPoolStatements(isPoolPreparedStatements());
             connectionFactory.setMaxOpenPreparedStatements(getMaxOpenPreparedStatements());

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java b/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java
index 595d7e9..b1550b4 100644
--- a/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java
+++ b/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java
@@ -463,7 +463,9 @@ public class TestBasicDataSource extends TestConnectionPool {
             StackMessageLog.clear();
             ds.close();
             // Exception must have been swallowed by the pool - verify it is logged
-            assertTrue(StackMessageLog.popMessage().indexOf("bang") > 0);
+            final String message = StackMessageLog.popMessage();
+            Assert.assertNotNull(message);
+            assertTrue(message.indexOf("bang") > 0);
         } catch (final SQLException ex) {
             assertTrue(ex.getMessage().indexOf("Cannot close") > 0);
             assertTrue(ex.getCause().getMessage().indexOf("bang") > 0);
@@ -484,7 +486,9 @@ public class TestBasicDataSource extends TestConnectionPool {
             StackMessageLog.lock();
             StackMessageLog.clear();
             ds.close();
-            assertTrue(StackMessageLog.popMessage().indexOf("boom") > 0);
+            final String message = StackMessageLog.popMessage();
+            Assert.assertNotNull(message);
+            assertTrue(message.indexOf("boom") > 0);
         } catch (final IllegalStateException ex) {
             assertTrue(ex.getMessage().indexOf("boom") > 0); // RTE is not wrapped by BDS#close
         } finally {
@@ -666,6 +670,7 @@ public class TestBasicDataSource extends TestConnectionPool {
             conn.close();
             assertEquals(0, ds.getNumIdle());
             final String message = StackMessageLog.popMessage();
+            Assert.assertNotNull(message);
             assertTrue(message.indexOf("exceeds the maximum permitted value") > 0);
         } finally {
             StackMessageLog.clear();

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/test/java/org/apache/commons/dbcp2/TestBasicDataSourceFactory.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/dbcp2/TestBasicDataSourceFactory.java b/src/test/java/org/apache/commons/dbcp2/TestBasicDataSourceFactory.java
index f3234b8..f4f0f33 100644
--- a/src/test/java/org/apache/commons/dbcp2/TestBasicDataSourceFactory.java
+++ b/src/test/java/org/apache/commons/dbcp2/TestBasicDataSourceFactory.java
@@ -59,15 +59,14 @@ public class TestBasicDataSourceFactory {
         try {
             StackMessageLog.lock();
             StackMessageLog.clear();
-            final Reference ref = new Reference("javax.sql.DataSource",
-                                          BasicDataSourceFactory.class.getName(), null);
-            ref.add(new StringRefAddr("foo", "bar"));     // Unknown
+            final Reference ref = new Reference("javax.sql.DataSource", BasicDataSourceFactory.class.getName(), null);
+            ref.add(new StringRefAddr("foo", "bar")); // Unknown
             ref.add(new StringRefAddr("maxWait", "100")); // Changed
-            ref.add(new StringRefAddr("driverClassName", "org.apache.commons.dbcp2.TesterDriver")); //OK
+            ref.add(new StringRefAddr("driverClassName", "org.apache.commons.dbcp2.TesterDriver")); // OK
             final BasicDataSourceFactory basicDataSourceFactory = new BasicDataSourceFactory();
             basicDataSourceFactory.getObjectInstance(ref, null, null, null);
             final List<String> messages = StackMessageLog.getAll();
-            assertEquals(2,messages.size());
+            assertEquals(messages.toString(), 2, messages.size());
             for (final String message : messages) {
                 if (message.contains("maxWait")) {
                     assertTrue(message.contains("use maxWaitMillis"));
@@ -118,6 +117,7 @@ public class TestBasicDataSourceFactory {
         properties.setProperty("defaultReadOnly", "false");
         properties.setProperty("defaultTransactionIsolation", "READ_COMMITTED");
         properties.setProperty("defaultCatalog", "test");
+        properties.setProperty("defaultSchema", "testSchema");
         properties.setProperty("testOnBorrow", "true");
         properties.setProperty("testOnReturn", "false");
         properties.setProperty("username", "userName");
@@ -158,6 +158,7 @@ public class TestBasicDataSourceFactory {
         assertEquals(Boolean.FALSE, ds.getDefaultReadOnly());
         assertEquals(Connection.TRANSACTION_READ_COMMITTED, ds.getDefaultTransactionIsolation());
         assertEquals("test", ds.getDefaultCatalog());
+        assertEquals("testSchema", ds.getDefaultSchema());
         assertTrue(ds.getTestOnBorrow());
         assertFalse(ds.getTestOnReturn());
         assertEquals("userName", ds.getUsername());

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/test/java/org/apache/commons/dbcp2/TesterConnection.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/dbcp2/TesterConnection.java b/src/test/java/org/apache/commons/dbcp2/TesterConnection.java
index a014a60..4329b1f 100644
--- a/src/test/java/org/apache/commons/dbcp2/TesterConnection.java
+++ b/src/test/java/org/apache/commons/dbcp2/TesterConnection.java
@@ -44,6 +44,7 @@ public class TesterConnection implements Connection {
     protected int _transactionIsolation = 1;
     protected DatabaseMetaData _metaData = new TesterDatabaseMetaData();
     protected String _catalog = null;
+    protected String schema;
     protected Map<String,Class<?>> _typeMap = null;
     protected boolean _readOnly = false;
     protected SQLWarning warnings = null;
@@ -384,12 +385,14 @@ public class TesterConnection implements Connection {
 
     @Override
     public void setSchema(final String schema) throws SQLException {
-        throw new SQLException("Not implemented.");
+        checkOpen();
+        this.schema= schema;
     }
 
     @Override
     public String getSchema() throws SQLException {
-        throw new SQLException("Not implemented.");
+        checkOpen();
+        return schema;
     }
 
     @Override