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 Cvs@lists.mmbase.org http://lists.mmbase.org/mailman/listinfo/cvs