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

Reply via email to