haul        2002/06/28 01:04:33

  Modified:    src/java/org/apache/cocoon/components/language/markup/xsp
                        EsqlQuery.java EsqlConnection.java
               src/java/org/apache/cocoon/components/language/markup/xsp/java
                        esql.xsl
  Log:
    <action dev="CH" type="update">
     Multiple results seem not to be supported by some DBMSs (i.e. Oracle and
     Informix). Therefore this is made optional in ESQL. A new parameter
     (esql:allow-multiple-results) to esql:connection re-enables it. See
     EsqlConnection for details.
    </action>
  
  Revision  Changes    Path
  1.19      +2 -1      
xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/xsp/EsqlQuery.java
  
  Index: EsqlQuery.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/xsp/EsqlQuery.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- EsqlQuery.java    6 Jun 2002 08:41:27 -0000       1.18
  +++ EsqlQuery.java    28 Jun 2002 08:04:33 -0000      1.19
  @@ -366,6 +366,7 @@
             }
             resultSetValid = false;
         }
  +      this.adjustCounts();
         return(hasResultSet);
     }
   
  
  
  
  1.10      +21 -1     
xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/xsp/EsqlConnection.java
  
  Index: EsqlConnection.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/xsp/EsqlConnection.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- EsqlConnection.java       12 Jun 2002 13:59:22 -0000      1.9
  +++ EsqlConnection.java       28 Jun 2002 08:04:33 -0000      1.10
  @@ -74,6 +74,26 @@
     private String url = null;
     private Properties info = new Properties();
     private int limitMethod = LIMIT_METHOD_NOLIMIT;
  +  private boolean multipleResults = false;
  +
  +
  +    public boolean multipleResults() {
  +        return this.multipleResults;
  +    }
  +
  +    /** It appears that some commercial DBMSs like Oracle and Informix
  +    * are broken in that they don't follow the JDBC standard and 
  +    * calls to getUpdateCount after getMoreResults result either in
  +    * an exception (Informix) or return the same value (i.e. not -1) (Oracle).
  +    * In addition, this feature is only useful with stored procedures.
  +    * Hence we disable it per default.
  +    **/
  +    public void setMultipleResults(String value) {
  +        if (value != null)
  +            this.multipleResults = ("true".equalsIgnoreCase(value) || 
"yes".equalsIgnoreCase(value));
  +    }
  +
  +
   
     public Properties getInfo() {
       return(info);
  
  
  
  1.29      +18 -5     
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.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- esql.xsl  10 Jun 2002 09:01:52 -0000      1.28
  +++ esql.xsl  28 Jun 2002 08:04:33 -0000      1.29
  @@ -276,6 +276,7 @@
     <xsl:variable name="pool"><xsl:call-template 
name="get-nested-string"><xsl:with-param name="content" 
select="esql:pool"/></xsl:call-template></xsl:variable>
     <xsl:variable name="autocommit"><xsl:call-template 
name="get-nested-string"><xsl:with-param name="content" 
select="esql:autocommit"/></xsl:call-template></xsl:variable>
     <xsl:variable name="use-limit-clause"><xsl:call-template 
name="get-nested-string"><xsl:with-param name="content" 
select="esql:use-limit-clause"/></xsl:call-template></xsl:variable>
  +  <xsl:variable name="allow-multiple-results"><xsl:call-template 
name="get-nested-string"><xsl:with-param name="content" 
select="esql:allow-multiple-results"/></xsl:call-template></xsl:variable>
     <xsp:logic>
       if (_esql_connection != null) {
         _esql_connections.push(_esql_connection);
  @@ -287,6 +288,9 @@
             try {
               _esql_connection.datasource = (DataSourceComponent) 
_esql_selector.select(String.valueOf(<xsl:copy-of select="$pool"/>));
               _esql_connection.connection = 
_esql_connection.datasource.getConnection();
  +            <xsl:if test="esql:allow-multiple-results">
  +             _esql_connection.setMultipleResults(String.valueOf(<xsl:copy-of 
select="$allow-multiple-results"/>));
  +            </xsl:if>
             } catch (Exception _esql_exception_<xsl:value-of 
select="generate-id(.)"/>) {
               getLogger().error("Could not get the 
datasource",_esql_exception_<xsl:value-of select="generate-id(.)"/>);
               throw new RuntimeException("Could not get the datasource 
"+_esql_exception_<xsl:value-of select="generate-id(.)"/>);
  @@ -311,6 +315,9 @@
               <xsl:for-each select="esql:property">
                 _esql_connection.setProperty("<xsl:value-of 
select="@name"/>",<xsl:call-template name="get-nested-string"><xsl:with-param 
name="content" select="."/></xsl:call-template>);
               </xsl:for-each>
  +            <xsl:if test="esql:allow-multiple-results">
  +              _esql_connection.setMultipleResults(String.valueOf(<xsl:copy-of 
select="$password"/>));
  +            </xsl:if>
               _esql_connection.connection = 
DriverManager.getConnection(_esql_connection.getUrl(), _esql_connection.getInfo());
             } catch (Exception _esql_exception_<xsl:value-of 
select="generate-id(.)"/>) {
               throw new RuntimeException("Error opening connection to dburl: 
"+String.valueOf(<xsl:copy-of select="$dburl"/>)+": "+_esql_exception_<xsl:value-of 
select="generate-id(.)"/>.getMessage());
  @@ -396,7 +403,7 @@
   </xsl:template>
   
   <xsl:template name="do-results">
  -   do {
  +  do {
        if (_esql_query.hasResultSet()) {
           _esql_query.getResultRows();
           if (_esql_query.nextRow()) {
  @@ -418,7 +425,7 @@
           }
           _esql_query.getResultSet().close();
        } else {
  -        if (_esql_query.getUpdateCount() &gt;= 0) {
  +        if (_esql_query.getUpdateCount() &gt; 0) {
              switch (_esql_query.getUpdateCountCount()) {
              <xsl:for-each select="esql:update-results">
                case <xsl:value-of select="position()"/>: <xsl:if 
test="position()=last()"><xsl:text>
  @@ -436,7 +443,7 @@
              }
           }
        }
  -   } while(_esql_query.getMoreResults());
  +   } while(_esql_connection.multipleResults() &amp;&amp; 
_esql_query.getMoreResults());
   </xsl:template>
   
   
  @@ -562,6 +569,12 @@
   </xsl:template>
   
   <xsl:template match="esql:execute-query//esql:no-results">
  +  <xsp:content>
  +    <xsl:apply-templates/>
  +  </xsp:content>
  +</xsl:template>
  +
  +<xsl:template match="esql:execute-query//esql:update-results">
     <xsp:content>
       <xsl:apply-templates/>
     </xsp:content>
  
  
  

----------------------------------------------------------------------
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