From 610bdf1cc3aa8fdcb77347ebd33a11c83eb183d3 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 21 Jul 2016 14:06:40 +0200 Subject: [PATCH] DataSource adapters expose setCatalog/setSchema next to setUsername/setPassword Issue: SPR-14501 --- .../AbstractDriverBasedDataSource.java | 50 ++++++++++++++++++- .../UserCredentialsDataSourceAdapter.java | 35 +++++++++++-- 2 files changed, 79 insertions(+), 6 deletions(-) diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/AbstractDriverBasedDataSource.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/AbstractDriverBasedDataSource.java index 0a2808fe93..11558ddb11 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/AbstractDriverBasedDataSource.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/AbstractDriverBasedDataSource.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,6 +39,10 @@ public abstract class AbstractDriverBasedDataSource extends AbstractDataSource { private String password; + private String catalog; + + private String schema; + private Properties connectionProperties; @@ -88,6 +92,40 @@ public abstract class AbstractDriverBasedDataSource extends AbstractDataSource { return this.password; } + /** + * Specify a database catalog to be applied to each Connection. + * @since 4.3.2 + * @see Connection#setCatalog + */ + public void setCatalog(String catalog) { + this.catalog = catalog; + } + + /** + * Return the database catalog to be applied to each Connection, if any. + * @since 4.3.2 + */ + public String getCatalog() { + return this.catalog; + } + + /** + * Specify a database schema to be applied to each Connection. + * @since 4.3.2 + * @see Connection#setSchema + */ + public void setSchema(String schema) { + this.schema = schema; + } + + /** + * Return the database schema to be applied to each Connection, if any. + * @since 4.3.2 + */ + public String getSchema() { + return this.schema; + } + /** * Specify arbitrary connection properties as key/value pairs, * to be passed to the Driver. @@ -152,7 +190,15 @@ public abstract class AbstractDriverBasedDataSource extends AbstractDataSource { if (password != null) { mergedProps.setProperty("password", password); } - return getConnectionFromDriver(mergedProps); + + Connection con = getConnectionFromDriver(mergedProps); + if (this.catalog != null) { + con.setCatalog(this.catalog); + } + if (this.schema != null) { + con.setSchema(this.schema); + } + return con; } /** diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/UserCredentialsDataSourceAdapter.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/UserCredentialsDataSourceAdapter.java index 00d06cbcef..65bfe395ba 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/UserCredentialsDataSourceAdapter.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/UserCredentialsDataSourceAdapter.java @@ -65,6 +65,10 @@ public class UserCredentialsDataSourceAdapter extends DelegatingDataSource { private String password; + private String catalog; + + private String schema; + private final ThreadLocal threadBoundCredentials = new NamedThreadLocal<>("Current JDBC user credentials"); @@ -93,6 +97,24 @@ public class UserCredentialsDataSourceAdapter extends DelegatingDataSource { this.password = password; } + /** + * Specify a database catalog to be applied to each retrieved Connection. + * @since 4.3.2 + * @see Connection#setCatalog + */ + public void setCatalog(String catalog) { + this.catalog = catalog; + } + + /** + * Specify a database schema to be applied to each retrieved Connection. + * @since 4.3.2 + * @see Connection#setSchema + */ + public void setSchema(String schema) { + this.schema = schema; + } + /** * Set user credententials for this proxy and the current thread. @@ -128,12 +150,17 @@ public class UserCredentialsDataSourceAdapter extends DelegatingDataSource { @Override public Connection getConnection() throws SQLException { JdbcUserCredentials threadCredentials = this.threadBoundCredentials.get(); - if (threadCredentials != null) { - return doGetConnection(threadCredentials.username, threadCredentials.password); + Connection con = (threadCredentials != null ? + doGetConnection(threadCredentials.username, threadCredentials.password) : + doGetConnection(this.username, this.password)); + + if (this.catalog != null) { + con.setCatalog(this.catalog); } - else { - return doGetConnection(this.username, this.password); + if (this.schema != null) { + con.setSchema(this.schema); } + return con; } /**