haul 02/05/16 09:01:54 Modified: src/java/org/apache/cocoon/components/language/markup/xsp/java esql.xsl Log: Fixes bugs / patches 7507 [PATCH] esql - support CLOB in get-xml 9004 [PATCH] add failure-ok to eql:query and documentation 7181 esql:group behaves erratically 8737 esql.xsl: getUrl() for datatypes OTHER with modifications: failure-ok is _not_ added. Instead error-results are evaulated when an exception is caught. If error-results is absent, an exception is raised. If it is present but empty, the error is swallowed. grouping code is completely redone. that should fix most problems previously encountered but one: footers are still not supported as that would require to have scrollable cursors or cache one row. Will add scrollable cursors as option in another patch. PS: will commit to cocoon_2_0_3_branch with time lag since I would like to see if there are complaints first... Revision Changes Path 1.21 +118 -120 xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/xsp/java/esql.xsl Index: esql.xsl =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/xsp/java/esql.xsl,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- esql.xsl 14 May 2002 12:16:08 -0000 1.20 +++ esql.xsl 16 May 2002 16:01:54 -0000 1.21 @@ -1,6 +1,6 @@ <?xml version="1.0"?> -<!-- $Id: esql.xsl,v 1.20 2002/05/14 12:16:08 tcurdt Exp $--> +<!-- $Id: esql.xsl,v 1.21 2002/05/16 16:01:54 haul Exp $--> <!-- ============================================================================ @@ -56,7 +56,7 @@ * ESQL Logicsheet * * @author ? - * @version CVS $Revision: 1.20 $ $Date: 2002/05/14 12:16:08 $ + * @version CVS $Revision: 1.21 $ $Date: 2002/05/16 16:01:54 $ --> <xsl:stylesheet version="1.0" @@ -358,6 +358,51 @@ <xsl:template match="esql:connection/esql:use-limit-clause"/> <xsl:template match="esql:connection/esql:property"/> + +<!-- set one parameter of a prepared or callable statement and use correct method for type --> +<xsl:template name="set-query-parameter"> + <xsl:choose> + <xsl:when test="@type"> + <xsl:variable name="type"><xsl:value-of select="concat(translate(substring(@type,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ'),substring(@type,2))"/></xsl:variable> + <xsl:text>set</xsl:text><xsl:value-of select="$type"/>(<xsl:value-of select="position()"/>,<xsl:call-template name="get-nested-content"><xsl:with-param name="content" select="."/></xsl:call-template>);<xsl:text> + </xsl:text> + </xsl:when> + <xsl:otherwise> + <xsl:text>setString(</xsl:text><xsl:value-of select="position()"/>,String.valueOf(<xsl:call-template name="get-nested-string"><xsl:with-param name="content" select="."/></xsl:call-template>));<xsl:text> + </xsl:text> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xspdoc:desc> internal. set one parameter of a callable statement </xspdoc:desc> +<xsl:template name="set-call-parameter"> + //try { + <xsl:if test="@direction='out' or @direction='inout'"> + <xsl:text>_esql_query.getCallableStatement().</xsl:text> + registerOutParameter(<xsl:value-of select="position()"/>, Types.<xsl:call-template name="get-Sql-Type"><xsl:with-param name="type"><xsl:value-of select="@type"/></xsl:with-param></xsl:call-template><xsl:if test="@typename">, <xsl:value-of select="@typename"/> </xsl:if>); + </xsl:if> + <xsl:if test="not(@direction) or @direction='inout' or @direction='in'"> + <xsl:text>_esql_query.getCallableStatement().</xsl:text> + <xsl:call-template name="set-query-parameter"/> + </xsl:if> + //} catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { + // throw new RuntimeException("Error setting parameter on statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>); + //} +</xsl:template> + + + +<xspdoc:desc> internal. set one parameter of a prepared statement </xspdoc:desc> +<xsl:template name="set-parameter"> + //try { + <xsl:text>_esql_query.getPreparedStatement().</xsl:text> + <xsl:call-template name="set-query-parameter"/> + //} catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { + // throw new RuntimeException("Error setting parameter on statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>); + //} +</xsl:template> + + <xsl:template match="esql:connection//esql:execute-query"> <xsl:variable name="query"><xsl:choose><xsl:when test="esql:query"><xsl:call-template name="get-nested-string"><xsl:with-param name="content" select="esql:query"/></xsl:call-template></xsl:when><xsl:when test="esql:call"><xsl:call-template name="get-nested-string"><xsl:with-param name="content" select="esql:call"/></xsl:call-template></xsl:when></xsl:choose></xsl:variable> @@ -385,82 +430,46 @@ try { <xsl:choose> <xsl:when test="esql:call"> - try { + //try { _esql_query.prepareCall(); - } catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { - throw new RuntimeException("Error preparing statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>.getMessage()); - } + //} catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { + // throw new RuntimeException("Error preparing statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>.getMessage()); + //} <xsl:for-each select="esql:call//esql:parameter"> - try { - <xsl:if test="@direction='out' or @direction='inout'"> - <xsl:text>_esql_query.getCallableStatement().</xsl:text> - registerOutParameter(<xsl:value-of select="position()"/>, Types.<xsl:call-template name="get-Sql-Type"><xsl:with-param name="type"><xsl:value-of select="@type"/></xsl:with-param></xsl:call-template><xsl:if test="@typename">, <xsl:value-of select="@typename"/> </xsl:if>); - </xsl:if> - <xsl:if test="not(@direction) or @direction='inout' or @direction='in'"> - <xsl:text>_esql_query.getCallableStatement().</xsl:text> - <xsl:choose> - <xsl:when test="@type"> - <xsl:variable name="type"><xsl:value-of select="concat(translate(substring(@type,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ'),substring(@type,2))"/></xsl:variable> - <xsl:text>set</xsl:text><xsl:value-of select="$type"/>(<xsl:value-of select="position()"/>,<xsl:call-template name="get-nested-content"><xsl:with-param name="content" select="."/></xsl:call-template>);<xsl:text> -</xsl:text> - </xsl:when> - <xsl:otherwise> - <xsl:text>setString(</xsl:text><xsl:value-of select="position()"/>,String.valueOf(<xsl:call-template name="get-nested-string"><xsl:with-param name="content" select="."/></xsl:call-template>));<xsl:text> -</xsl:text> - </xsl:otherwise> - </xsl:choose> - </xsl:if> - } catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { - throw new RuntimeException("Error setting parameter on statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>); - } + <xsl:call-template name="set-call-parameter"/> </xsl:for-each> - try { + //try { <xsl:choose> <xsl:when test="esql:call[@needs-query='true' or @needs-query='yes']">_esql_query.execute(true);</xsl:when> <xsl:when test="esql:call[@resultset-from-object]">_esql_query.execute(<xsl:copy-of select="esql:call[@resultset-from-object]"/>);</xsl:when> <xsl:otherwise>_esql_query.execute();</xsl:otherwise> </xsl:choose> - } catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { - throw new RuntimeException("Error executing prepared statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>); - } + //} catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { + // throw new RuntimeException("Error executing prepared statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>); + //} </xsl:when> <xsl:when test="esql:query//esql:parameter"> - try { + //try { _esql_query.prepareStatement(); - } catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { - throw new RuntimeException("Error preparing statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>.getMessage()); - } + //} catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { + // throw new RuntimeException("Error preparing statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>.getMessage()); + //} <xsl:for-each select="esql:query//esql:parameter"> - try { - <xsl:text>_esql_query.getPreparedStatement().</xsl:text> - <xsl:choose> - <xsl:when test="@type"> - <xsl:variable name="type"><xsl:value-of select="concat(translate(substring(@type,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ'),substring(@type,2))"/></xsl:variable> - <xsl:text>set</xsl:text><xsl:value-of select="$type"/>(<xsl:value-of select="position()"/>,<xsl:call-template name="get-nested-content"><xsl:with-param name="content" select="."/></xsl:call-template>);<xsl:text> -</xsl:text> - </xsl:when> - <xsl:otherwise> - <xsl:text>setString(</xsl:text><xsl:value-of select="position()"/>,String.valueOf(<xsl:call-template name="get-nested-string"><xsl:with-param name="content" select="."/></xsl:call-template>));<xsl:text> -</xsl:text> - </xsl:otherwise> - </xsl:choose> - } catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { - throw new RuntimeException("Error setting parameter on statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>); - } + <xsl:call-template name="set-parameter"/> </xsl:for-each> - try { + //try { _esql_query.execute(); - } catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { - throw new RuntimeException("Error executing prepared statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>); - } + //} catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { + // throw new RuntimeException("Error executing prepared statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>); + //} </xsl:when> <xsl:otherwise> _esql_query.createStatement(); - try { + //try { _esql_query.execute(); - } catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { - throw new RuntimeException("Error executing statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>); - } + //} catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { + // throw new RuntimeException("Error executing statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>); + //} </xsl:otherwise> </xsl:choose> getLogger().debug("esql query: " + _esql_query.getQueryString()); @@ -493,9 +502,9 @@ } _esql_query.getStatement().close(); } catch (SQLException _esql_exception_<xsl:value-of select="generate-id(.)"/>) { - try { <xsl:choose> <xsl:when test="esql:error-results"> + try { _esql_exception = _esql_exception_<xsl:value-of select="generate-id(.)"/>; _esql_exception_writer = new StringWriter(); _esql_exception.printStackTrace(new PrintWriter(_esql_exception_writer)); @@ -503,14 +512,17 @@ if (!_esql_connection.getAutoCommit()) { _esql_connection.rollback(); } + } catch (Exception _esql_exception_<xsl:value-of select="generate-id(.)"/>_2) {} </xsl:when> <xsl:otherwise> + try { if (!_esql_connection.getAutoCommit()) { _esql_connection.rollback(); } + } catch (Exception _esql_exception_<xsl:value-of select="generate-id(.)"/>_2) {} + throw new RuntimeException("Error executing statement: " + _esql_query.getQueryString() + ": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>); </xsl:otherwise> </xsl:choose> - } catch (Exception _esql_exception_<xsl:value-of select="generate-id(.)"/>_2) {} } if (_esql_queries.empty()) { _esql_query = null; @@ -562,17 +574,11 @@ <xsl:template match="esql:results//esql:row-results"> <xsl:variable name="group" select=".//esql:group"/> <xsp:logic> - - //create booleans for group change watches and strings for old values. - <xsl:apply-templates select=".//esql:group" mode="vars"/> - do { <xsp:content> <xsl:apply-templates/> </xsp:content> - <xsl:if test="count($group) < 1"> - <xsl:call-template name="nextRow"/> - </xsl:if> + <xsl:call-template name="nextRow"/> } while ( _esql_query.keepGoing() ); if (_esql_query.getSkipRows() > 0 ) { @@ -587,17 +593,23 @@ +<xspdoc:desc>Only advance one row if no nested groups exist in this query. Ignore nested queries.</xspdoc:desc> <xsl:template name="nextRow"> + <xsl:if test="not(.//esql:group) or generate-id(.//esql:group)=generate-id(.//esql:execute-query//esql:group)"> + <xsp:logic> //checking out early? if (_esql_query.getMaxRows() != -1 && _esql_query.getCurrentRow() - _esql_query.getSkipRows() == _esql_query.getMaxRows()) { _esql_query.setKeepGoing( false ); } else { //if not, advance normally _esql_query.setKeepGoing( _esql_query.nextRow() ); } + </xsp:logic> + </xsl:if> </xsl:template> + <xsl:template match="esql:results//esql:previous-results"/> @@ -609,67 +621,41 @@ -<xsl:template match="esql:group" mode="vars"> - _esql_query.setGroupingVar("<xsl:value-of select="@group-on"/>Changed", new Boolean(true)); -</xsl:template> - - <xspdoc:desc>Allows header and footer elements around groups of consecutive records with identical values in column named by @group-on. Facilitates a single query with joins to be used in lieu of some nested queries.</xspdoc:desc> -<xsl:template match="esql:group|esql:group//esql:group[.//esql:member]" priority="3"> -<xsp:logic> - if (((Boolean)_esql_query.getGroupingVar("<xsl:value-of select="@group-on"/>Changed")).booleanValue()){ - //header contents - <xsp:content> - <xsl:apply-templates> - <xsl:with-param name="group-on" select="@group-on"/> - </xsl:apply-templates> - </xsp:content> - } -</xsp:logic> -</xsl:template> - - - -<xsl:template match="esql:group//node()[.//esql:member]"> - <xsl:param name="group-on"/> - <xsl:copy> - <xsl:apply-templates select="@*|*|text()"> - <xsl:with-param name="group-on" select="$group-on"/> - </xsl:apply-templates> - </xsl:copy> +<xsl:template match="esql:group//esql:member"> + <xsp:logic> + do { + <xsp:content> + <xsl:apply-templates/> + </xsp:content> + <xsl:call-template name="nextRow"/> + } while (_esql_query.keepGoing() && !_esql_query.hasGroupingVarChanged()); + </xsp:logic> </xsl:template> - <xspdoc:desc>Used in conjunction with and nested inside esql:group. Formatting for individual records goes within esql:member. Header and footer stuff goes in between group and member.</xspdoc:desc> -<xsl:template match="esql:member|esql:group//esql:member[.//esql:member]"> - <xsl:param name="group-on"/> - <xsl:variable name="group" select=".//esql:group"/> +<xsl:template match="esql:group"> + <xsl:variable name="group"> + <xsl:call-template name="get-column"> + <xsl:with-param name="name">group-on</xsl:with-param> + </xsl:call-template> + </xsl:variable> + <xsp:logic> - } - _esql_query.setGroupingVar("<xsl:value-of select="$group-on"/>Old", _esql_query.getResultSet().getString("<xsl:value-of select="$group-on"/>")); + _esql_query.groupLevelPlusPlus(); + if (!_esql_query.groupLevelExists()) { + _esql_query.setGroupingVar(<xsl:copy-of select="$group"/>); + } <xsp:content> - <xsl:apply-templates> - <xsl:with-param name="group-on" select="$group-on"/> - </xsl:apply-templates> + <xsl:apply-templates/> </xsp:content> - - <xsl:if test="count($group) < 1"> - <xsl:call-template name="nextRow"/> - </xsl:if> - if ( _esql_query.keepGoing() ) { - _esql_query.setGroupingVar("<xsl:value-of select="$group-on"/>Changed", new Boolean(!((String)_esql_query.getGroupingVar("<xsl:value-of select="$group-on"/>Old")).equals(_esql_query.getResultSet().getString("<xsl:value-of select="$group-on"/>")))); - } else { - _esql_query.setGroupingVar("<xsl:value-of select="$group-on"/>Changed", new Boolean(true)); - } - if (((Boolean)_esql_query.getGroupingVar("<xsl:value-of select="$group-on"/>Changed")).booleanValue()) { - //footer contents + _esql_query.groupLevelMinusMinus(); </xsp:logic> </xsl:template> - <xsl:template match="esql:results//esql:more-results"/> <xsl:template match="esql:results//esql:more-results" mode="more"> @@ -863,7 +849,12 @@ <xsp:expr><xsl:call-template name="get-resultset"/>.getShort(<xsl:call-template name="get-column"/>)</xsp:expr> </xsl:template> -<xspdoc:desc>returns the value of the given column as a clob</xspdoc:desc> +<xspdoc:desc>returns the value of the given column as unicode string (column can be string or clob</xspdoc:desc> +<xsl:template match="esql:row-results//esql:get-clob" name="get-clob"> + <xsp:expr>EsqlHelper.getStringOrClob(<xsl:call-template name="get-resultset"/>,<xsl:call-template name="get-column"/>)</xsp:expr> +</xsl:template> + +<xspdoc:desc>returns the value of the given column as a clob as ascii string with optinal encoding</xspdoc:desc> <xsl:template match="esql:row-results//esql:get-ascii|esql:call-results//esql:get-ascii"> <xsp:expr>EsqlHelper.getAscii(<xsl:call-template name="get-resultset"/>, <xsl:call-template name="get-column"/>)</xsp:expr> </xsl:template> @@ -1022,9 +1013,10 @@ <xspdoc:desc>used internally to determine which column is the given column. if a column attribute exists and its value is a number, it is taken to be the column's position. if the value is not a number, it is taken to be the column's name. if a column attribute does not exist, an esql:column element is assumed to exist and to render as a string (after all of the xsp instructions have been evaluated), which is taken to be the column's name.</xspdoc:desc> <xsl:template name="get-column"> + <xsl:param name="name">column</xsl:param> <xsl:variable name="column"> <xsl:call-template name="get-parameter"> - <xsl:with-param name="name">column</xsl:with-param> + <xsl:with-param name="name"><xsl:value-of select="$name"/></xsl:with-param> <xsl:with-param name="required">true</xsl:with-param> </xsl:call-template> </xsl:variable> @@ -1065,7 +1057,7 @@ </xsl:variable> <xsl:choose> <xsl:when test="$encoding = 'default'"> - <xsl:value-of select="$resultset"/>.getString(<xsl:value-of select="$column-spec"/>) + EsqlHelper.getAscii(<xsl:value-of select="$resultset"/>,<xsl:value-of select="$column-spec"/>) </xsl:when> <xsl:otherwise> EsqlHelper.getStringFromByteArray(<xsl:value-of select="$resultset"/>.getBytes @@ -1102,6 +1094,12 @@ <xsl:param name="message"/> <xsl:message terminate="yes"><xsl:value-of select="$message"/></xsl:message> </xsl:template> + +<!-- + swallow esql:param tags +--> +<xsl:template match="esql:param"/> + <xsl:template match="@*|node()" priority="-1"> <xsl:copy>
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]