Changeset: b3ca1157be73 for monetdb-java URL: https://dev.monetdb.org/hg/monetdb-java/rev/b3ca1157be73 Modified Files: src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java Branch: default Log Message:
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. diffs (81 lines): diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java b/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java --- 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 } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list