Mercurial > hg > monetdb-java
changeset 7:b3ca1157be73
Improve DatabaseMetaData.getDatabaseProductVersion() to never return a null String.
This prevents runtime NullPointerException in getTables() and getTableTypes().
Also improved error reporting when JDBC driver failed to fetch the value of environment variable monet_version
as reported in bug 4038.
It will now throw an SQLException with the error message.
author | Martin van Dinther <martin.van.dinther@monetdbsolutions.com> |
---|---|
date | Thu, 29 Sep 2016 13:02:21 +0200 (2016-09-29) |
parents | 2165c6f838fe |
children | a27ee2cb14a0 |
files | src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java |
diffstat | 1 files changed, 16 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java +++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java @@ -27,6 +27,8 @@ import java.util.ArrayList; */ public class MonetDatabaseMetaData extends MonetWrapper implements DatabaseMetaData { private Connection con; + + // Internal cache for 3 server environment values private String env_current_user; private String env_monet_version; private String env_max_clients; @@ -36,12 +38,11 @@ public class MonetDatabaseMetaData exten } /** - * Internal cache for 3 environment values retrieved from the - * server, to avoid querying the server over and over again. - * Once a value is read, it is kept in the private env_* variables for reuse. - * We currently only need the env values of: current_user, monet_version and max_clients. + * Utility method to fetch some server environment values combined in one query for efficiency. + * We currently fetch the env values of: current_user, monet_version and max_clients. + * We cache them locally such that we do not need to query the server again and again. */ - private synchronized void getEnvValues() { + private synchronized void getEnvValues() throws SQLException { Statement st = null; ResultSet rs = null; try { @@ -65,8 +66,7 @@ public class MonetDatabaseMetaData exten } } } - } catch (SQLException e) { - // ignore + /* do not catch SQLException here, as we want to know it when it fails */ } finally { if (rs != null) { try { @@ -224,7 +224,8 @@ public class MonetDatabaseMetaData exten public String getDatabaseProductVersion() throws SQLException { if (env_monet_version == null) getEnvValues(); - return env_monet_version; + // always return a valid String to prevent NPE in getTables() and getTableTypes() + return (env_monet_version != null) ? env_monet_version : ""; } /** @@ -1408,7 +1409,7 @@ public class MonetDatabaseMetaData exten * @return the maximum number of connections */ @Override - public int getMaxConnections() { + public int getMaxConnections() throws SQLException { if (env_max_clients == null) getEnvValues(); @@ -3611,7 +3612,7 @@ public class MonetDatabaseMetaData exten if (env_monet_version != null) { try { int start = env_monet_version.indexOf("."); - major = Integer.parseInt(env_monet_version.substring(0, start)); + major = Integer.parseInt((start >= 0) ? env_monet_version.substring(0, start) : env_monet_version); } catch (NumberFormatException e) { // ignore } @@ -3633,8 +3634,11 @@ public class MonetDatabaseMetaData exten if (env_monet_version != null) { try { int start = env_monet_version.indexOf("."); - int end = env_monet_version.indexOf(".", start + 1); - minor = Integer.parseInt(env_monet_version.substring(start + 1, end)); + if (start >= 0) { + start++; + int end = env_monet_version.indexOf(".", start); + minor = Integer.parseInt((end > 0) ? env_monet_version.substring(start, end) : env_monet_version.substring(start)); + } } catch (NumberFormatException e) { // ignore }