vgritsenko 01/07/27 14:28:03 Modified: src/org/apache/cocoon/acting DatabaseUpdateAction.java Added: src/org/apache/cocoon/acting DatabaseSelectAction.java Log: DatabaseSelectAction - first cut Revision Changes Path 1.8 +2 -2 xml-cocoon2/src/org/apache/cocoon/acting/DatabaseUpdateAction.java Index: DatabaseUpdateAction.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/acting/DatabaseUpdateAction.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- DatabaseUpdateAction.java 2001/07/27 18:04:33 1.7 +++ DatabaseUpdateAction.java 2001/07/27 21:28:03 1.8 @@ -35,13 +35,13 @@ * only one table at a time to update. * * @author <a href="mailto:[EMAIL PROTECTED]">Berin Loritsch</a> - * @version CVS $Revision: 1.7 $ $Date: 2001/07/27 18:04:33 $ + * @version CVS $Revision: 1.8 $ $Date: 2001/07/27 21:28:03 $ */ public class DatabaseUpdateAction extends AbstractDatabaseAction { private static final Map updateStatements = new HashMap(); /** - * Delete a record from the database. This action assumes that + * Update a record in the database. This action assumes that * the file referenced by the "descriptor" parameter conforms * to the AbstractDatabaseAction specifications. */ 1.1 xml-cocoon2/src/org/apache/cocoon/acting/DatabaseSelectAction.java Index: DatabaseSelectAction.java =================================================================== /***************************************************************************** * Copyright (C) The Apache Software Foundation. All rights reserved. * * ------------------------------------------------------------------------- * * This software is published under the terms of the Apache Software License * * version 1.1, a copy of which has been included with this distribution in * * the LICENSE file. * *****************************************************************************/ package org.apache.cocoon.acting; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.Constants; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.environment.Request; import org.apache.cocoon.environment.Redirector; import org.apache.cocoon.environment.SourceResolver; import org.apache.cocoon.generation.ImageDirectoryGenerator; import org.apache.avalon.excalibur.datasource.DataSourceComponent; /** * Select a record from a database. If request parameters are present, * their values are used to populate request attributes. Otherwise, * values from database are used. * * @author <a href="mailto:[EMAIL PROTECTED]">Berin Loritsch</a> * @author <a href="mailto:[EMAIL PROTECTED]">Vadim Gritsenko</a> * @version CVS $Revision: 1.1 $ $Date: 2001/07/27 21:28:03 $ */ public class DatabaseSelectAction extends AbstractDatabaseAction { private static final Map selectStatements = new HashMap(); /** * Select a record from the database. This action assumes that * the file referenced by the "descriptor" parameter conforms * to the AbstractDatabaseAction specifications. */ public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters param) throws Exception { DataSourceComponent datasource = null; Connection conn = null; int currentIndex = 0; // read global parameter settings boolean reloadable = Constants.DESCRIPTOR_RELOADABLE_DEFAULT; if (this.settings.containsKey("reloadable")) reloadable = Boolean.getBoolean((String) this.settings.get("reloadable")); // read local parameter settings try { Configuration conf = this.getConfiguration(param.getParameter("descriptor", (String) this.settings.get("descriptor")), param.getParameterAsBoolean("reloadable",reloadable)); Request request = (Request) objectModel.get(Constants.REQUEST_OBJECT); Configuration[] keys = conf.getChild("table").getChild("keys").getChildren("key"); Configuration[] values = conf.getChild("table").getChild("values").getChildren("value"); PreparedStatement statement = null; ResultSet rset = null; boolean result = false; for (int i = 0; i < keys.length; i++) { final String parameter = keys[i].getAttribute("param"); Object value = request.getParameter(parameter); if (value == null || "".equals(value)) { if (statement == null) { final String query = this.getSelectQuery(conf); datasource = this.getDataSource(conf); conn = datasource.getConnection(); statement = conn.prepareStatement(query); currentIndex = 1; for (int j = 0; j < keys.length; j++, currentIndex++) { this.setColumn(statement, currentIndex, request, keys[j]); } rset = statement.executeQuery(); result = rset.next(); } if (result) value = this.getColumn(rset, request, keys[i]); } if (value != null) request.setAttribute(parameter, value.toString()); } for (int i = 0; i < values.length; i++) { final String parameter = values[i].getAttribute("param"); Object value = request.getParameter(parameter); if (value == null || "".equals(value)) { if (statement == null) { final String query = this.getSelectQuery(conf); datasource = this.getDataSource(conf); conn = datasource.getConnection(); statement = conn.prepareStatement(query); currentIndex = 1; for (int j = 0; j < keys.length; j++, currentIndex++) { this.setColumn(statement, currentIndex, request, keys[j]); } rset = statement.executeQuery(); result = rset.next(); } if (result) value = this.getColumn(rset, request, values[i]); } if (value != null) request.setAttribute(parameter, value.toString()); } if(statement != null) statement.close(); return EMPTY_MAP; } catch (Exception e) { throw new ProcessingException("Could not prepare statement :position = " + currentIndex, e); } finally { if (conn != null) { try { conn.close(); } catch (SQLException sqe) { getLogger().warn("There was an error closing the datasource", sqe); } } if (datasource != null) this.dbselector.release(datasource); } // Result is empty map or exception. No null. } /** * Get the String representation of the PreparedStatement. This is * mapped to the Configuration object itself, so if it doesn't exist, * it will be created. */ protected String getSelectQuery(Configuration conf) throws ConfigurationException { String query = null; synchronized (DatabaseSelectAction.selectStatements) { query = (String) DatabaseSelectAction.selectStatements.get(conf); if (query == null) { Configuration table = conf.getChild("table"); Configuration[] keys = table.getChild("keys").getChildren("key"); Configuration[] values = table.getChild("values").getChildren("value"); StringBuffer queryBuffer = new StringBuffer("SELECT "); int index = 0; for (int i = 0; i < keys.length; i++, index++) { if (index > 0) { queryBuffer.append(", "); } queryBuffer.append(keys[i].getAttribute("dbcol")); } for (int i = 0; i < values.length; i++,index++) { if (index > 0) { queryBuffer.append(", "); } queryBuffer.append(values[i].getAttribute("dbcol")); } queryBuffer.append(" FROM "); queryBuffer.append(table.getAttribute("name")); queryBuffer.append(" WHERE "); for (int i = 0; i < keys.length; i++) { if (i > 0) { queryBuffer.append(" AND "); } queryBuffer.append(keys[i].getAttribute("dbcol")); queryBuffer.append(" = ?"); } query = queryBuffer.toString(); DatabaseSelectAction.selectStatements.put(conf, query); } } return query; } } ---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]