haul        2002/08/09 01:28:14

  Modified:    src/java/org/apache/cocoon/components/language/markup/xsp
                        EsqlQuery.java
               src/java/org/apache/cocoon/components/language/markup/xsp/java
                        esql.xsl
  Log:
    <action dev="CH" type="update">
     ESQL: Allow arbitrary types for prepared and callable statements via
     dynamically loading classes like the SQLTransformer does. Is-null now uses
     dynamic colum specification. Fixed skip-row feature, which was off by one.
     Added tag to get connection meta data.
    </action>
  
  Revision  Changes    Path
  1.21      +58 -10    
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.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- EsqlQuery.java    25 Jul 2002 19:55:35 -0000      1.20
  +++ EsqlQuery.java    9 Aug 2002 08:28:14 -0000       1.21
  @@ -58,7 +58,7 @@
   import java.sql.ResultSetMetaData;
   import java.sql.SQLException;
   import java.util.ArrayList;
  -
  +import java.lang.reflect.Field;
   /**
    * This helper class takes care of contstructing queries
    * and cursor positioning (paging) for all different kinds
  @@ -183,12 +183,33 @@
   
     public PreparedStatement prepareStatement() throws SQLException {
       switch(limitMethod) {
  -      case EsqlConnection.LIMIT_METHOD_JDBC:
  -        preparedStatement = connection.prepareStatement( getQueryString(), 
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
  +    case EsqlConnection.LIMIT_METHOD_POSTGRESQL:
  +    case EsqlConnection.LIMIT_METHOD_MYSQL:
  +        preparedStatement = connection.prepareStatement(getQueryString() );
           break;
  -      default:
  -        preparedStatement = connection.prepareStatement( getQueryString() );
  -    };
  +    case EsqlConnection.LIMIT_METHOD_JDBC:
  +        // Produce scrollable ResultSet and skip rows with 
ResultSet.absolute(skipRows).
  +        // With SQL Server, statement.getResultSet() throws
  +        // java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error 
setting up static cursor cache.
  +        // Same error with TYPE_SCROLL_SENSITIVE.
  +        preparedStatement = connection.prepareStatement( getQueryString(),
  +                                                         
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
  +        if (maxRows > -1) {
  +            // if all JDBC driver's honoured this the code to quit after maxRows 
could be removed
  +            preparedStatement.setMaxRows(skipRows + maxRows +1); // need this to 
determine if there's more
  +        }
  +        break;
  +    case EsqlConnection.LIMIT_METHOD_NOLIMIT:
  +    default:
  +        // maxRows can be set without the limit method being set - it defaults to 
LIMIT_METHOD_NOLIMIT
  +        // which is not such a good name as its really another way of limiting 
using JDBC.
  +        // Produce non-scrollable ResultSet and skip rows with multiple 
ResultSet.next().
  +        preparedStatement = connection.prepareStatement(getQueryString() );
  +        if (maxRows > -1) {
  +            preparedStatement.setMaxRows(skipRows + maxRows +1); // need this to 
determine if there's more
  +        }
  +        break;
  +    }
       statement = preparedStatement;
       return(preparedStatement);
     }
  @@ -196,11 +217,22 @@
   
     public CallableStatement prepareCall() throws SQLException {
       switch(limitMethod) {
  -      case EsqlConnection.LIMIT_METHOD_JDBC:
  +    case EsqlConnection.LIMIT_METHOD_POSTGRESQL:
  +    case EsqlConnection.LIMIT_METHOD_MYSQL:
  +        preparedStatement = connection.prepareCall( getQueryString() );
  +        break;
  +    case EsqlConnection.LIMIT_METHOD_JDBC:
           preparedStatement = connection.prepareCall( getQueryString(), 
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
  +        if (maxRows > -1) {
  +            preparedStatement.setMaxRows(skipRows + maxRows +1); // need this to 
determine if there's more
  +        }
           break;
  -      default:
  +    case EsqlConnection.LIMIT_METHOD_NOLIMIT:
  +     default:
           preparedStatement = connection.prepareCall( getQueryString() );
  +        if (maxRows > -1) {
  +            preparedStatement.setMaxRows(skipRows + maxRows +1); // need this to 
determine if there's more
  +        }
       };
       statement = preparedStatement;
       return((CallableStatement)preparedStatement);
  @@ -338,7 +370,7 @@
   
     public boolean execute( int resultSetFromObject ) throws SQLException {
         hasResultSet = this.execute(false);
  -      resultSet = (ResultSet) ((CallableStatement) preparedStatement).getObject(1);
  +      resultSet = (ResultSet) ((CallableStatement) 
preparedStatement).getObject(resultSetFromObject);
         resultSetValid = true;
         return hasResultSet;
     }
  @@ -428,4 +460,20 @@
         };
       }
     }
  +
  +    /** 
  +     * Get the integer value for a JDBC type.
  +     */
  +    public static int getType(String typeName) 
  +        throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException 
{
  +
  +        int index = typeName.lastIndexOf(".");
  +        String className = typeName.substring(0, index);
  +        String fieldName = typeName.substring(index + 1);
  +        Class clss = Class.forName( className );
  +        Field fld = clss.getField( fieldName );
  +        return fld.getInt( fieldName );
  +    }           
  +
  +
   }
  
  
  
  1.31      +33 -26    
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.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- esql.xsl  2 Jul 2002 13:38:02 -0000       1.30
  +++ esql.xsl  9 Aug 2002 08:28:14 -0000       1.31
  @@ -1,4 +1,4 @@
  -<?xml version="1.0"?>
  +<?xml version="1.0"?><!-- -*- xsl -*- -->
   
   <!-- $Id$-->
   <!--
  @@ -203,8 +203,7 @@
         <xsl:if test=".//esql:connection/esql:pool">
               private static ComponentSelector _esql_selector = null;
   
  -            public void compose(ComponentManager manager) throws 
org.apache.avalon.framework.component.ComponentException {
  -              super.compose(manager);
  +            protected ComponentSelector _esql_get_selector() throws 
org.apache.avalon.framework.component.ComponentException {
                 if (_esql_selector == null) {
                   try {
                     _esql_selector = (ComponentSelector) 
manager.lookup(DataSourceComponent.ROLE + "Selector");
  @@ -212,6 +211,7 @@
                     getLogger().error("Could not look up the datasource component", 
cme);
                   }
                 }
  +              return _esql_selector;
               }
         </xsl:if>
   
  @@ -286,7 +286,7 @@
         <xsl:choose>
           <xsl:when test="esql:pool">
             try {
  -            _esql_connection.datasource = (DataSourceComponent) 
_esql_selector.select(String.valueOf(<xsl:copy-of select="$pool"/>));
  +            _esql_connection.datasource = (DataSourceComponent) 
_esql_get_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"/>));
  @@ -362,10 +362,19 @@
   <xsl:template match="esql:connection/esql:username"/>
   <xsl:template match="esql:connection/esql:password"/>
   <xsl:template match="esql:connection/esql:pool"/>
  +<xsl:template match="esql:connection/esql:allow-multiple-results"/>
   <xsl:template match="esql:connection/esql:autocommit"/>
   <xsl:template match="esql:connection/esql:use-limit-clause"/>
   <xsl:template match="esql:connection/esql:property"/>
   
  +<xspdoc:desc>Returns the connection's meta data.</xspdoc:desc>
  +<xsl:template match="esql:get-connection-metadata">
  +  <xsp:expr>_esql_connection.getMetaData()</xsp:expr>
  +</xsl:template>
  +
  +<xsl:template match="esql:connection/esql:get-connection">
  +  <xsp:expr>_esql_connection</xsp:expr>
  +</xsl:template>
   
   <!-- set one parameter of a prepared or callable statement and use correct method 
for type -->
   <xsl:template name="set-query-parameter">
  @@ -386,7 +395,7 @@
   <xsl:template name="set-call-parameter">
     <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>);
  +    registerOutParameter(<xsl:value-of select="position()"/>, <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>
  @@ -554,9 +563,6 @@
   </xsl:template>
   
   <xsl:template match="esql:execute-query//esql:call-results">
  -  <xsp:logic>
  -  // call results2
  -  </xsp:logic>
     <xsp:content>
       <xsl:apply-templates/>
     </xsp:content>
  @@ -954,13 +960,13 @@
   </xsl:template>
   
   <xspdoc:desc>returns the type of the given column as int. the column must be 
specified by number, not name.</xspdoc:desc>
  -<xsl:template 
match="esql:row-results//esql:get-column-type|esql:call-results//esql:get-column-type" 
name="get-column-type">
  +<xsl:template match="esql:row-results//esql:get-column-type" name="get-column-type">
     <xsp:expr><xsl:call-template 
name="get-resultset"/>.getMetaData().getColumnType(<xsl:call-template 
name="get-column"/>)</xsp:expr>
   </xsl:template>
   
   <xspdoc:desc>allows null-column testing. Evaluates to a Java expression, which is 
true when the referred column contains a null-value for the current resultset 
row</xspdoc:desc>
  -<xsl:template 
match="esql:row-results//esql:is-null|esql:call-results//esql:is-null">
  -  <xsp:expr>((<xsl:call-template name="get-resultset"/>.getObject("<xsl:value-of 
select="@column"/>") == null) || <xsl:call-template 
name="get-resultset"/>.wasNull())</xsp:expr>
  +<xsl:template match="esql:row-results//esql:is-null">
  +  <xsp:expr>((<xsl:call-template 
name="get-resultset"/>.getObject(<xsl:call-template name="get-column"/>) == null) || 
<xsl:call-template name="get-resultset"/>.wasNull())</xsp:expr>
   </xsl:template>
   
   <xsl:template match="esql:result"/>
  @@ -1080,19 +1086,20 @@
     <xsl:param name="type"/>
     <xsl:choose>
       <!-- just do the 'unusual' mappings -->
  -    <xsl:when test="$type='Byte'">TINYINT</xsl:when>
  -    <xsl:when test="$type='Short'">SMALLINT</xsl:when>
  -    <xsl:when test="$type='Int'">INTEGER</xsl:when>
  -    <xsl:when test="$type='Long'">BIGINT</xsl:when>
  -    <xsl:when test="$type='Float'">REAL</xsl:when>
  -    <xsl:when test="$type='BigDecimal'">DECIMAL</xsl:when>
  -    <xsl:when test="$type='Boolean'">BIT</xsl:when>
  -    <xsl:when test="$type='String'">VARCHAR</xsl:when>
  -    <xsl:when test="$type='Bytes'">BINARY</xsl:when>
  -    <xsl:when test="$type='AsciiStream'">LONGVARCHAR</xsl:when>
  -    <xsl:when test="$type='UnicodeStream'">LONGVARCHAR</xsl:when>
  -    <xsl:when test="$type='BinaryStream'">VARBINARY</xsl:when>
  -    <xsl:otherwise><xsl:value-of 
select="translate(@type,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/></xsl:otherwise>
  +    <xsl:when test="$type='Byte'">Types.TINYINT</xsl:when>
  +    <xsl:when test="$type='Short'">Types.SMALLINT</xsl:when>
  +    <xsl:when test="$type='Int'">Types.INTEGER</xsl:when>
  +    <xsl:when test="$type='Long'">Types.BIGINT</xsl:when>
  +    <xsl:when test="$type='Float'">Types.REAL</xsl:when>
  +    <xsl:when test="$type='BigDecimal'">Types.DECIMAL</xsl:when>
  +    <xsl:when test="$type='Boolean'">Types.BIT</xsl:when>
  +    <xsl:when test="$type='String'">Types.VARCHAR</xsl:when>
  +    <xsl:when test="$type='Bytes'">Types.BINARY</xsl:when>
  +    <xsl:when test="$type='AsciiStream'">Types.LONGVARCHAR</xsl:when>
  +    <xsl:when test="$type='UnicodeStream'">Types.LONGVARCHAR</xsl:when>
  +    <xsl:when test="$type='BinaryStream'">Types.VARBINARY</xsl:when>
  +    <xsl:when test="contains($type,'.')">EsqlQuery.getType("<xsl:value-of 
select="$type"/>")</xsl:when>
  +    <xsl:otherwise>Types.<xsl:value-of 
select="translate(@type,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/></xsl:otherwise>
     </xsl:choose>
   </xsl:template>
   
  
  
  

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