Update of /var/cvs/src/org/mmbase/storage/search/implementation/database
In directory james.mmbase.org:/tmp/cvs-serv14043
Modified Files:
BasicQueryHandler.java
Log Message:
MMB-1779
See also:
http://cvs.mmbase.org/viewcvs/src/org/mmbase/storage/search/implementation/database
See also: http://www.mmbase.org/jira/browse/MMB-1779
Index: BasicQueryHandler.java
===================================================================
RCS file:
/var/cvs/src/org/mmbase/storage/search/implementation/database/BasicQueryHandler.java,v
retrieving revision 1.64
retrieving revision 1.65
diff -u -b -r1.64 -r1.65
--- BasicQueryHandler.java 25 Nov 2008 13:19:07 -0000 1.64
+++ BasicQueryHandler.java 30 Jan 2009 20:06:46 -0000 1.65
@@ -10,16 +10,15 @@
import java.sql.*;
import java.util.*;
-import javax.sql.DataSource;
import org.mmbase.cache.*;
import org.mmbase.bridge.Field;
import org.mmbase.bridge.NodeManager;
import org.mmbase.core.CoreField;
import org.mmbase.module.core.*;
-import org.mmbase.module.database.MultiConnection;
import org.mmbase.storage.implementation.database.DatabaseStorageManager;
import
org.mmbase.storage.implementation.database.DatabaseStorageManagerFactory;
+import org.mmbase.storage.implementation.database.ResultSetReader;
import org.mmbase.storage.search.*;
import org.mmbase.util.logging.*;
import org.mmbase.storage.search.implementation.ModifiableQuery;
@@ -34,7 +33,7 @@
* by the handler, and in this form executed on the database.
*
* @author Rob van Maris
- * @version $Id: BasicQueryHandler.java,v 1.64 2008/11/25 13:19:07 michiel Exp
$
+ * @version $Id: BasicQueryHandler.java,v 1.65 2009/01/30 20:06:46 michiel Exp
$
* @since MMBase-1.7
*/
public class BasicQueryHandler implements SearchQueryHandler {
@@ -48,7 +47,6 @@
/** Sql handler used to generate SQL statements. */
private final SqlHandler sqlHandler;
- /** MMBase instance. */
private final MMBase mmbase;
/**
@@ -64,22 +62,17 @@
// javadoc is inherited
- public List<MMObjectNode> getNodes(SearchQuery query, MMObjectBuilder
builder) throws SearchQueryException {
+ public List<MMObjectNode> getNodes(final SearchQuery query, final
MMObjectBuilder builder) throws SearchQueryException {
- List<MMObjectNode> results;
- Connection con = null;
- PreparedStatement stmt = null;
- String sqlString = null;
-
- try {
+ final List<MMObjectNode> results = new ArrayList<MMObjectNode>();
// Flag, set if offset must be supported by skipping results.
- boolean mustSkipResults =
+ final boolean mustSkipResults =
(query.getOffset() != SearchQuery.DEFAULT_OFFSET) &&
(sqlHandler.getSupportLevel(SearchQueryHandler.FEATURE_OFFSET,
query) == SearchQueryHandler.SUPPORT_NONE);
// Flag, set if sql handler supports maxnumber.
- boolean sqlHandlerSupportsMaxNumber =
sqlHandler.getSupportLevel(SearchQueryHandler.FEATURE_MAX_NUMBER, query) !=
SearchQueryHandler.SUPPORT_NONE;
+ final boolean sqlHandlerSupportsMaxNumber =
sqlHandler.getSupportLevel(SearchQueryHandler.FEATURE_MAX_NUMBER, query) !=
SearchQueryHandler.SUPPORT_NONE;
// report about offset and max support (for debug purposes)
if (log.isDebugEnabled()) {
@@ -88,20 +81,15 @@
log.debug("Database max support = " +
sqlHandlerSupportsMaxNumber);
}
- sqlString = createSqlString(query, mustSkipResults,
sqlHandlerSupportsMaxNumber);
-
+ String sqlString = createSqlString(query, mustSkipResults,
sqlHandlerSupportsMaxNumber);
if (log.isDebugEnabled()) {
log.debug("sql: " + sqlString);
}
- // Execute the SQL... ARGH !!! Has to move!
- // get connection...
- DataSource dataSource = ((DatabaseStorageManagerFactory)
mmbase.getStorageManagerFactory()).getDataSource();
- con = dataSource.getConnection();
- ResultSet rs = null;
+ final DatabaseStorageManager manager =
((DatabaseStorageManagerFactory)
mmbase.getStorageManagerFactory()).getStorageManager();
try {
- stmt = con.prepareStatement(sqlString);
- rs = stmt.executeQuery();
+ manager.executeQuery(sqlString, new ResultSetReader() {
+ public void read(ResultSet rs) throws SQLException {
if (mustSkipResults) {
log.debug("skipping results, to provide weak support for
offset");
for (int i = 0; i < query.getOffset(); i++) {
@@ -115,60 +103,22 @@
// now, we dispatch the reading of the result set to the right
function wich instantiates Nodes of the right type.
if (builder instanceof ClusterBuilder) {
- results = readNodes((ClusterBuilder) builder, fields, rs,
sqlHandlerSupportsMaxNumber, maxNumber, query.getSteps().size());
+ readNodes(results, manager, (ClusterBuilder)
builder, fields, rs, sqlHandlerSupportsMaxNumber, maxNumber,
query.getSteps().size());
} else if (builder instanceof ResultBuilder) {
- results = readNodes((ResultBuilder) builder, fields, rs,
sqlHandlerSupportsMaxNumber, maxNumber);
+ readNodes(results, manager, (ResultBuilder)
builder, fields, rs, sqlHandlerSupportsMaxNumber, maxNumber);
} else {
- results = readNodes(builder, fields, rs,
sqlHandlerSupportsMaxNumber, maxNumber);
- }
- } finally {
- if (rs != null) {
- rs.close();
+ readNodes(results, manager, builder, fields, rs,
sqlHandlerSupportsMaxNumber, maxNumber);
}
}
+ });
} catch (SQLException e) {
- // Something went wrong, log exception
- // and rethrow as SearchQueryException.
- if (log.isDebugEnabled()) {
- log.debug("Query failed:" + query + "\n" + e +
Logging.stackTrace(e));
- }
- if (con instanceof MultiConnection) {
- log.debug("Calling check after exception");
- try {
- ((MultiConnection) con).checkAfterException();
- } catch (SQLException sqe) {
- log.debug(sqe);
- }
- } else {
- log.debug("Not a multiconnection");
- }
throw new SearchQueryException("Query '" + (sqlString == null ? ""
+ query.toString() : sqlString) + "' failed: " + e.getClass().getName() + ": "
+ e.getMessage(), e);
- } finally {
- closeConnection(con, stmt);
}
return results;
}
/**
- * Safely close a database connection and/or a database statement.
- * @param con The connection to close. Can be <code>null</code>.
- * @param stmt The statement to close, prior to closing the connection.
Can be <code>null</code>.
- */
- protected void closeConnection(Connection con, Statement stmt) {
- try {
- if (stmt != null) {
- stmt.close();
- }
- } catch (Exception g) {}
- try {
- if (con != null) {
- con.close();
- }
- } catch (Exception g) {}
- }
-
- /**
* Makes a String of a query, taking into consideration if the database
supports offset and
* maxnumber features. The resulting String is an SQL query which can be
fed to the database.
* @param query the query to convert to sql
@@ -244,10 +194,10 @@
/**
* Read the result list and creates a List of ClusterNodes.
*/
- private List<MMObjectNode> readNodes(ClusterBuilder builder, StepField[]
fields, ResultSet rs,
+ private List<MMObjectNode> readNodes(List<MMObjectNode> results,
+ DatabaseStorageManager storageManager,
+ ClusterBuilder builder, StepField[]
fields, ResultSet rs,
boolean sqlHandlerSupportsMaxNumber, int maxNumber, int
numberOfSteps) {
- List<MMObjectNode> results = new ArrayList<MMObjectNode>();
- DatabaseStorageManager storageManager =
(DatabaseStorageManager)mmbase.getStorageManager();
// Truncate results to provide weak support for maxnumber.
try {
@@ -294,10 +244,10 @@
/**
* Read the result list and creates a List of ResultNodes
*/
- private List<MMObjectNode> readNodes(ResultBuilder builder, StepField[]
fields, ResultSet rs,
+ private List<MMObjectNode> readNodes(List<MMObjectNode> results,
+ DatabaseStorageManager storageManager,
+ ResultBuilder builder, StepField[]
fields, ResultSet rs,
boolean sqlHandlerSupportsMaxNumber, int maxNumber) {
- List<MMObjectNode> results = new ArrayList<MMObjectNode>();
- DatabaseStorageManager storageManager =
(DatabaseStorageManager)mmbase.getStorageManager();
// Truncate results to provide weak support for maxnumber.
try {
@@ -334,12 +284,12 @@
/**
* Read the result list and creates a List of normal MMObjectNodes.
*/
- private List<MMObjectNode> readNodes(MMObjectBuilder builder, StepField[]
fields, ResultSet rs,
+ private List<MMObjectNode> readNodes(List<MMObjectNode> results,
+ DatabaseStorageManager storageManager,
+ MMObjectBuilder builder, StepField[]
fields, ResultSet rs,
boolean sqlHandlerSupportsMaxNumber, int maxNumber) {
- List<MMObjectNode> results= new ArrayList<MMObjectNode>();
- DatabaseStorageManager storageManager =
(DatabaseStorageManager)mmbase.getStorageManager();
- boolean storesAsFile =
builder.getMMBase().getStorageManagerFactory().hasOption(org.mmbase.storage.implementation.database.Attributes.STORES_BINARY_AS_FILE);
+ boolean storesAsFile =
storageManager.getFactory().hasOption(org.mmbase.storage.implementation.database.Attributes.STORES_BINARY_AS_FILE);
// determine indices of queried fields
Map<CoreField, Integer> fieldIndices = new HashMap<CoreField,
Integer>();
Step nodeStep = fields[0].getStep();
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs