Changeset: 3fa949cbc783 for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/3fa949cbc783
Added Files:
        tests/BugSetQueryTimeout_Bug_3357.java
Modified Files:
        ChangeLog
        src/main/java/nl/cwi/monetdb/jdbc/MonetStatement.java
        tests/build.xml
Branch: default
Log Message:

Implemented Statement methods: getQueryTimeout() and setQueryTimeout(int 
seconds).
getQueryTimeout() used to always return 0, now it returns the query timeout 
retrieved from the server.
setQueryTimeout(int seconds) used to always throw SQLException: query time outs 
not supported.
Now it sets the query timeout for the current connection/session on the server.
This fixes bug 3357


diffs (154 lines):

diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,14 @@
 # ChangeLog file for java
 # This file is updated with Maddlog
 
+* Thu Oct  6 2016 Martin van Dinther <[email protected]>
+- Implemented Statement methods: getQueryTimeout() and setQueryTimeout(int
+  seconds).  getQueryTimeout() used to always return 0, now it returns the
+  query timeout retrieved from the server.  setQueryTimeout(int seconds)
+  used to always throw SQLException: query time outs not supported.
+  Now it sets the query timeout for the current connection/session on
+  the server.
+
 * Thu Sep 29 2016 Martin van Dinther <[email protected]>
 - Corrected ResultSet methods: getByte(), getBigDecimal(), getShort(),
   getInt(), getLong(), getFloat() and getDouble() in case the conversion
diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetStatement.java 
b/src/main/java/nl/cwi/monetdb/jdbc/MonetStatement.java
--- a/src/main/java/nl/cwi/monetdb/jdbc/MonetStatement.java
+++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetStatement.java
@@ -826,9 +826,6 @@ public class MonetStatement extends Mone
         * Statement object to execute.  If the limit is exceeded, a
         * SQLException is thrown.
         *
-        * For MonetDB this method always returns zero, as no query
-        * cancelling is possible.
-        *
         * @return the current query timeout limit in seconds; zero means
         *         there is no limit
         * @throws SQLException if a database access error occurs
@@ -836,7 +833,26 @@ public class MonetStatement extends Mone
         */
        @Override
        public int getQueryTimeout() throws SQLException {
-               return 0;
+               Statement st = null;
+               ResultSet rs = null;
+               try {
+                       st = connection.createStatement();
+                       rs = st.executeQuery("SELECT \"querytimeout\" FROM 
\"sys\".\"sessions\"() WHERE \"active\"");
+                       if (rs != null && rs.next()) {
+                               // MonetDB stores querytimeout in a bigint, so 
correctly deal with big int values
+                               long timeout = rs.getLong(1);
+                               return (timeout > Integer.MAX_VALUE) ? 
Integer.MAX_VALUE : (int) timeout;
+                       }
+               /* do not catch SQLException here, as we want to know it when 
it fails */
+               } finally {
+                       if (rs != null) {
+                               rs.close();
+                       }
+                       if (st != null) {
+                                st.close();
+                       }
+               }
+               return 0;       // in case the query didn't return a result 
(which should normally never happen)
        }
 
        /**
@@ -1080,9 +1096,6 @@ public class MonetStatement extends Mone
         * object to execute to the given number of seconds. If the limit is
         * exceeded, an SQLException is thrown.
         *
-        * MonetDB does not support cancelling running queries, hence this
-        * method does not do anything.
-        *
         * @param seconds the new query timeout limit in seconds; zero means
         *        there is no limit
         * @throws SQLException if a database access error occurs or the
@@ -1092,8 +1105,18 @@ public class MonetStatement extends Mone
        public void setQueryTimeout(int seconds) throws SQLException {
                if (seconds < 0)
                        throw new SQLException("Illegal timeout value: " + 
seconds, "M1M05");
-               if (seconds > 0)
-                       addWarning("setQueryTimeout: query time outs not 
supported", "01M24");
+
+               Statement st = null;
+               try {
+                       st = connection.createStatement();
+                       // CALL "sys"."settimeout"(int_value)
+                       st.execute("CALL \"sys\".\"settimeout\"(" + seconds + 
")");
+               /* do not catch SQLException here, as we want to know it when 
it fails */
+               } finally {
+                       if (st != null) {
+                                st.close();
+                       }
+               }
        }
 
        //== 1.6 methods (JDBC 4.0)
diff --git a/tests/BugSetQueryTimeout_Bug_3357.java 
b/tests/BugSetQueryTimeout_Bug_3357.java
new file mode 100644
--- /dev/null
+++ b/tests/BugSetQueryTimeout_Bug_3357.java
@@ -0,0 +1,37 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0.  If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 1997 - July 2008 CWI, August 2008 - 2016 MonetDB B.V.
+ */
+
+import java.sql.*;
+
+public class BugSetQueryTimeout_Bug_3357 {
+       public static void main(String[] args) throws Exception {
+               Class.forName("nl.cwi.monetdb.jdbc.MonetDriver");
+               Connection con = DriverManager.getConnection(args[0]);
+               Statement st = con.createStatement();
+               try {
+                       System.out.println("QueryTimeout = " + 
st.getQueryTimeout());
+
+                       st.setQueryTimeout(123);
+                       System.out.println("QueryTimeout = " + 
st.getQueryTimeout());
+
+                       st.setQueryTimeout(2134567890);
+                       System.out.println("QueryTimeout = " + 
st.getQueryTimeout());
+
+                       st.setQueryTimeout(0);
+                       System.out.println("QueryTimeout = " + 
st.getQueryTimeout());
+
+                       st.setQueryTimeout(-1); // to generate an SQLException 
as negative timeouts are invalid
+                       System.out.println("QueryTimeout = " + 
st.getQueryTimeout());
+               } catch (SQLException se) {
+                       System.out.println("setQueryTimeout(timeout_value) 
throws: " + se);
+               } finally {
+                       st.close();
+               }
+               con.close();
+       }
+}
diff --git a/tests/build.xml b/tests/build.xml
--- a/tests/build.xml
+++ b/tests/build.xml
@@ -128,6 +128,7 @@ Copyright 1997 - July 2008 CWI, August 2
     <antcall target="BugConcurrent_clients_SF_1504657" />
     <antcall target="BugConcurrent_sequences" />
     <antcall target="BugDatabaseMetaData_Bug_3356" />
+    <antcall target="BugSetQueryTimeout_Bug_3357" />
     <antcall target="BugDecimalRound_Bug_3561" />
   </target>
 
@@ -343,4 +344,10 @@ Copyright 1997 - July 2008 CWI, August 2
     </antcall>
   </target>
 
+  <target name="BugSetQueryTimeout_Bug_3357">
+    <antcall target="test_class">
+      <param name="test.class" value="BugSetQueryTimeout_Bug_3357" />
+    </antcall>
+  </target>
+
 </project>
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to