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:[EMAIL PROTECTED]'true' or 
@needs-query='yes']">_esql_query.execute(true);</xsl:when>
               <xsl:when test="esql:[EMAIL 
PROTECTED]">_esql_query.execute(<xsl:copy-of select="esql:[EMAIL 
PROTECTED]"/>);</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) &lt; 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 &amp;&amp; 
_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() &amp;&amp; 
!_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) &lt; 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]

Reply via email to