Changeset: 9b1b53763dc9 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9b1b53763dc9
Modified Files:
java/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java
Branch: default
Log Message:
Adding new utility function executeMetaDataQuery() to replace
getStmt().executeQuery()
It now also calls stmt.closeOnCompletion(); such that resources are freed
properly.
diffs (274 lines):
diff --git a/java/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java
b/java/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java
--- a/java/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java
+++ b/java/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java
@@ -36,15 +36,6 @@ public class MonetDatabaseMetaData exten
con = parent;
}
- private synchronized Statement getStmt() throws SQLException {
- // use Statement which allows scrolling both directions through
results
- // cannot reuse stmt here, as people may request multiple
- // queries, see for example bug #2703
- return con.createStatement(
- ResultSet.TYPE_SCROLL_INSENSITIVE,
- ResultSet.CONCUR_READ_ONLY);
- }
-
/**
* Internal cache for 3 environment values retrieved from the
* server, to avoid querying the server over and over again.
@@ -55,7 +46,7 @@ public class MonetDatabaseMetaData exten
Statement st = null;
ResultSet rs = null;
try {
- st = getStmt();
+ st = con.createStatement();
rs = st.executeQuery(
"SELECT \"name\", \"value\" FROM
\"sys\".\"environment\"" +
" WHERE \"name\" IN ('monet_version',
'max_clients')" +
@@ -92,6 +83,29 @@ public class MonetDatabaseMetaData exten
// for debug: System.out.println("Read: env_current_user: " + env_current_user
+ " env_monet_version: " + env_monet_version + " env_max_clients: " +
env_max_clients);
}
+
+ /**
+ * Internal utility method to create a Statement object, execute a
query and return the ResulSet object.
+ * As the Statement object is created internally (the caller does not
see it and thus can not close it),
+ * we set it to close (and free server resources) when the ResultSet
object is closed by the caller.
+ */
+ private ResultSet executeMetaDataQuery(String query) throws
SQLException {
+ Statement stmt = null;
+ ResultSet rs = null;
+ stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
+ if (stmt != null) {
+ rs = stmt.executeQuery(query);
+ if (rs != null) {
+ /* we want the statement object to be closed
also when the resultset is closed by the caller */
+ stmt.closeOnCompletion();
+ } else {
+ /* failed to produce a resultset, so release
resources for created statement object now */
+ stmt.close();
+ }
+ }
+ return rs;
+ }
+
/**
* Can all the procedures returned by getProcedures be called
* by the current user?
@@ -391,7 +405,7 @@ public class MonetDatabaseMetaData exten
Statement st = null;
ResultSet rs = null;
try {
- st = getStmt();
+ st = con.createStatement();
rs = st.executeQuery("SELECT \"keyword\" FROM
\"sys\".\"keywords\" ORDER BY 1");
// Fetch the keywords and concatenate them into a
StringBuffer separated by comma's
boolean isfirst = true;
@@ -490,7 +504,7 @@ public class MonetDatabaseMetaData exten
ResultSet rs = null;
try {
String select = "SELECT DISTINCT \"name\" FROM
\"sys\".\"functions\" " + whereClause + " ORDER BY 1";
- st = getStmt();
+ st = con.createStatement();
rs = st.executeQuery(select);
// Fetch the function names and concatenate them into a
StringBuffer separated by comma's
boolean isfirst = true;
@@ -1601,7 +1615,7 @@ public class MonetDatabaseMetaData exten
query.append(" ORDER BY \"PROCEDURE_SCHEM\",
\"PROCEDURE_NAME\", \"SPECIFIC_NAME\"");
- return getStmt().executeQuery(query.toString());
+ return executeMetaDataQuery(query.toString());
}
/**
@@ -1712,7 +1726,7 @@ public class MonetDatabaseMetaData exten
}
query.append(" ORDER BY \"PROCEDURE_SCHEM\",
\"PROCEDURE_NAME\", \"ORDINAL_POSITION\"");
- return getStmt().executeQuery(query.toString());
+ return executeMetaDataQuery(query.toString());
}
//== this is a helper method which does not belong to the interface
@@ -1862,7 +1876,7 @@ public class MonetDatabaseMetaData exten
query.append(" ORDER BY \"TABLE_TYPE\", \"TABLE_SCHEM\",
\"TABLE_NAME\"");
- return getStmt().executeQuery(query.toString());
+ return executeMetaDataQuery(query.toString());
}
/**
@@ -1899,7 +1913,7 @@ public class MonetDatabaseMetaData exten
query += "WHERE \"name\" ILIKE '" +
escapeQuotes(schemaPattern) + "' ";
query += "ORDER BY \"TABLE_SCHEM\"";
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
/**
@@ -1920,7 +1934,7 @@ public class MonetDatabaseMetaData exten
public ResultSet getCatalogs() throws SQLException {
// MonetDB does NOT support catalogs.
// Return a resultset with no rows
- return getStmt().executeQuery("SELECT cast(null as char(1)) AS
\"TABLE_CAT\" WHERE 1 = 0");
+ return executeMetaDataQuery("SELECT cast(null as char(1)) AS
\"TABLE_CAT\" WHERE 1 = 0");
}
/**
@@ -1955,7 +1969,7 @@ public class MonetDatabaseMetaData exten
"SELECT 'VIEW' ORDER BY 1";
}
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
/**
@@ -2058,7 +2072,7 @@ public class MonetDatabaseMetaData exten
query += "ORDER BY \"TABLE_SCHEM\", \"TABLE_NAME\",
\"ORDINAL_POSITION\"";
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
/**
@@ -2141,7 +2155,7 @@ public class MonetDatabaseMetaData exten
query += "ORDER BY \"COLUMN_NAME\", \"PRIVILEGE\"";
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
/**
@@ -2217,7 +2231,7 @@ public class MonetDatabaseMetaData exten
query += "ORDER BY \"TABLE_SCHEM\", \"TABLE_NAME\",
\"PRIVILEGE\"";
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
/**
@@ -2294,7 +2308,7 @@ public class MonetDatabaseMetaData exten
}
query += "ORDER BY \"keys\".\"type\"";
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
/**
@@ -2407,7 +2421,7 @@ public class MonetDatabaseMetaData exten
query += "ORDER BY \"COLUMN_NAME\"";
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
final static String keyQuery1 =
@@ -2502,7 +2516,7 @@ public class MonetDatabaseMetaData exten
query += "ORDER BY \"PKTABLE_CAT\", \"PKTABLE_SCHEM\",
\"PKTABLE_NAME\", \"PK_NAME\", \"KEY_SEQ\"";
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
/**
@@ -2572,7 +2586,7 @@ public class MonetDatabaseMetaData exten
query += "ORDER BY \"FKTABLE_CAT\", \"FKTABLE_SCHEM\",
\"FKTABLE_NAME\", \"FK_NAME\", \"KEY_SEQ\"";
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
/**
@@ -2663,7 +2677,7 @@ public class MonetDatabaseMetaData exten
query += "ORDER BY \"FKTABLE_CAT\", \"FKTABLE_SCHEM\",
\"FKTABLE_NAME\", \"FK_NAME\", \"KEY_SEQ\"";
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
/**
@@ -2756,7 +2770,7 @@ public class MonetDatabaseMetaData exten
"\"radix\" AS \"NUM_PREC_RADIX\" " +
"FROM \"sys\".\"types\"";
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
/**
@@ -2877,7 +2891,7 @@ public class MonetDatabaseMetaData exten
Statement sub = null;
if (!approximate) sub = con.createStatement();
- ResultSet rs = getStmt().executeQuery(query);
+ ResultSet rs = executeMetaDataQuery(query);
try {
while (rs.next()) {
String[] result = new String[13];
@@ -3036,7 +3050,7 @@ public class MonetDatabaseMetaData exten
"'java.lang.Object' AS \"CLASS_NAME\", 0 AS
\"DATA_TYPE\", " +
"'' AS \"REMARKS\", 0 AS \"BASE_TYPE\" WHERE 1 = 0";
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
@@ -3161,7 +3175,7 @@ public class MonetDatabaseMetaData exten
"cast(null as char(1)) AS \"SUPERTYPE_CAT\", '' AS
\"SUPERTYPE_SCHEM\", " +
"'' AS \"SUPERTYPE_NAME\" WHERE 1 = 0";
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
/**
@@ -3207,7 +3221,7 @@ public class MonetDatabaseMetaData exten
"SELECT cast(null as char(1)) AS \"TABLE_CAT\", '' AS
\"TABLE_SCHEM\", '' AS \"TABLE_NAME\", " +
"'' AS \"SUPERTABLE_NAME\" WHERE 1 = 0";
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
/**
@@ -3297,7 +3311,7 @@ public class MonetDatabaseMetaData exten
"'' AS \"SCOPE_CATALOG\", '' AS \"SCOPE_SCHEMA\", '' AS
\"SCOPE_TABLE\", " +
"0 AS \"SOURCE_DATA_TYPE\" WHERE 1 = 0";
- return getStmt().executeQuery(query);
+ return executeMetaDataQuery(query);
}
/**
@@ -3614,7 +3628,7 @@ public class MonetDatabaseMetaData exten
query.append(" ORDER BY \"FUNCTION_SCHEM\", \"FUNCTION_NAME\",
\"SPECIFIC_NAME\"");
- return getStmt().executeQuery(query.toString());
+ return executeMetaDataQuery(query.toString());
}
/**
@@ -3721,7 +3735,7 @@ public class MonetDatabaseMetaData exten
}
query.append(" ORDER BY \"FUNCTION_SCHEM\", \"FUNCTION_NAME\",
\"ORDINAL_POSITION\"");
- return getStmt().executeQuery(query.toString());
+ return executeMetaDataQuery(query.toString());
}
//== 1.7 methods (JDBC 4.1)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list