haul        02/05/16 09:01:17

  Modified:    src/java/org/apache/cocoon/components/language/markup/xsp
                        EsqlConnection.java EsqlHelper.java EsqlQuery.java
  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.8       +7 -2      
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.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- EsqlConnection.java       17 Apr 2002 13:09:02 -0000      1.7
  +++ EsqlConnection.java       16 May 2002 16:01:17 -0000      1.8
  @@ -60,7 +60,7 @@
    *
    * based on the orginal esql.xsl
    * @author <a href="mailto:[EMAIL PROTECTED]";>Torsten Curdt</a>
  - * @version CVS $Id: EsqlConnection.java,v 1.7 2002/04/17 13:09:02 cziegeler Exp $
  + * @version CVS $Id: EsqlConnection.java,v 1.8 2002/05/16 16:01:17 haul Exp $
    */
   
   public class EsqlConnection implements Connection {
  @@ -80,7 +80,12 @@
     }
   
     public String getUrl() {
  -    return(url);
  +    if (this.url == null) 
  +      try {
  +        this.url=this.connection.getMetaData().getURL();
  +      } catch (SQLException e) {
  +      };
  +    return this.url;
     }
   
     public void setUrl( String url ) {
  
  
  
  1.9       +70 -26    
xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/xsp/EsqlHelper.java
  
  Index: EsqlHelper.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/language/markup/xsp/EsqlHelper.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- EsqlHelper.java   14 May 2002 12:16:08 -0000      1.8
  +++ EsqlHelper.java   16 May 2002 16:01:17 -0000      1.9
  @@ -51,9 +51,12 @@
   package org.apache.cocoon.components.language.markup.xsp;
   
   import java.io.BufferedInputStream;
  +import java.io.BufferedReader;
  +import java.io.Reader;
   import java.sql.ResultSet;
   import java.io.InputStream;
   import java.sql.Clob;
  +import java.sql.Types;
   
   /**
    * This is a helper class to remove redundant code in
  @@ -61,46 +64,88 @@
    *
    * based on the orginal esql.xsl
    * @author <a href="mailto:[EMAIL PROTECTED]";>Torsten Curdt</a>
  - * @version CVS $Id: EsqlHelper.java,v 1.8 2002/05/14 12:16:08 tcurdt Exp $
  + * @version CVS $Id: EsqlHelper.java,v 1.9 2002/05/16 16:01:17 haul Exp $
    */
   
   public class EsqlHelper {
   
  -      public final static String getAscii(ResultSet set, String column) {
  -        InputStream asciiStream = null;
  -        byte[] buffer = null;
   
  +    /** returns Unicode encoded string from CLOB or String column 
  +     */
  +    public final static String getStringOrClob(ResultSet set, String column) throws 
RuntimeException {
  +        
  +        String result = null;
           try {
  -            Clob dbClob = set.getClob(column);
  -            int length = (int) dbClob.length();
  -            asciiStream = new BufferedInputStream(dbClob.getAsciiStream());
  -            buffer = new byte[length];
  -            asciiStream.read(buffer);
  -            asciiStream.close();
  +            result = EsqlHelper.getStringOrClob(set,set.findColumn(column));
           } catch (Exception e) {
               throw new RuntimeException("Error getting clob data: " + 
e.getMessage());
  -        } finally {
  -            if (asciiStream != null) try {asciiStream.close();} catch (Exception 
ase) {
  -                throw new RuntimeException("Error closing clob stream: " + 
ase.getMessage());
  +        }
  +        return result;
  +    }
  +
  +
  +    /** returns Unicode encoded string from CLOB or String column 
  +     */
  +    public final static String getStringOrClob(ResultSet set, int column) throws 
java.lang.Exception {
  +        
  +        Reader reader = null;
  +        char[] buffer = null;
  +    
  +        try {
  +            if (set.getMetaData().getColumnType(column)==java.sql.Types.CLOB) {
  +                Clob dbClob = set.getClob(column);
  +                int length = (int) dbClob.length();
  +                reader = new BufferedReader(dbClob.getCharacterStream());
  +                buffer = new char[length];
  +                reader.read(buffer);
  +                reader.close();
  +                if (reader != null)
  +                    reader.close();
  +                if (buffer == null)
  +                    return "";
  +                return new String(buffer);
  +            } else {           
  +                return set.getString(column);
               }
  +        } catch ( Exception e) {
  +            throw new RuntimeException("Error getting clob data: " + 
e.getMessage());
           }
  +    }
   
  -        if (buffer == null) return "";
   
  -        return new String(buffer);
  +    /** returns ascii string from CLOB or String column 
  +     */
  +      public final static String getAscii(ResultSet set, String column) throws 
RuntimeException {
  +
  +          String result = null;
  +          try {
  +              result = EsqlHelper.getAscii(set,set.findColumn(column));
  +          } catch (Exception e) {
  +              throw new RuntimeException("Error getting clob data: " + 
e.getMessage());
  +          }
  +          return result;
         }
   
  +
  +    /** returns ascii string from CLOB or String column 
  +     */
         public final static String getAscii(ResultSet set, int column) {
           InputStream asciiStream = null;
  -        byte[] buffer = null;
  +        String result = null;
   
           try {
  -            Clob dbClob = set.getClob(column);
  -            int length = (int) dbClob.length();
  -            asciiStream = new BufferedInputStream(dbClob.getAsciiStream());
  -            buffer = new byte[length];
  -            asciiStream.read(buffer);
  -            asciiStream.close();
  +            if (set.getMetaData().getColumnType(column) == Types.CLOB) {
  +                byte[] buffer = null;
  +                Clob dbClob = set.getClob(column);
  +                int length = (int) dbClob.length();
  +                asciiStream = new BufferedInputStream(dbClob.getAsciiStream());
  +                buffer = new byte[length];
  +                asciiStream.read(buffer);
  +                asciiStream.close();
  +                result = (buffer!=null? new String(buffer) : null);
  +            } else {
  +                result = set.getString(column);
  +            }
           } catch (Exception e) {
               throw new RuntimeException("Error getting clob data: " + 
e.getMessage());
           } finally {
  @@ -108,10 +153,9 @@
                   throw new RuntimeException("Error closing clob stream: " + 
ase.getMessage());
               }
           }
  -
  -        if (buffer == null) return "";
  -
  -        return new String(buffer);
  +        
  +        
  +        return result;
         }
   
         public final static String getStringFromByteArray(byte[] bytes, String 
encoding) {
  
  
  
  1.15      +44 -8     
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.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- EsqlQuery.java    19 Apr 2002 18:18:45 -0000      1.14
  +++ EsqlQuery.java    16 May 2002 16:01:17 -0000      1.15
  @@ -57,6 +57,7 @@
   import java.sql.ResultSet;
   import java.sql.ResultSetMetaData;
   import java.sql.SQLException;
  +import java.util.ArrayList;
   
   /**
    * This helper class takes care of contstructing queries
  @@ -65,7 +66,7 @@
    *
    * based on the orginal esql.xsl
    * @author <a href="mailto:[EMAIL PROTECTED]";>Torsten Curdt</a>
  - * @version CVS $Id: EsqlQuery.java,v 1.14 2002/04/19 18:18:45 froehlich Exp $
  + * @version CVS $Id: EsqlQuery.java,v 1.15 2002/05/16 16:01:17 haul Exp $
    */
   
   public class EsqlQuery {
  @@ -80,7 +81,9 @@
     private int maxRows = -1;
     private int skipRows = 0;
     private boolean keepgoing = true;
  -  private java.util.Hashtable groupingVars = new java.util.Hashtable();
  +
  +    private ArrayList groups = null;
  +    private int groupLevel = -1;
   
     private String query;
     private int limitMethod;
  @@ -100,6 +103,17 @@
       this.hasResultSet = (this.resultSet != null);
     }
   
  +
  +    class EsqlGroup {
  +        public String var = null;
  +        public Object value = null;
  +        
  +        EsqlGroup ( String var, Object value ) {
  +            this.var = var;
  +            this.value = value;
  +        }
  +    }
  +
     public int getSkipRows() {
       return(skipRows);
     }
  @@ -211,13 +225,35 @@
       keepgoing = still;
     }
   
  -  public Object setGroupingVar( String key, Object value) {
  -    return groupingVars.put(key,value);
  -  }
   
  -  public Object getGroupingVar( String key) {
  -    return groupingVars.get(key);
  -  }
  +    public void groupLevelPlusPlus() {
  +        this.groupLevel++;
  +    }
  +
  +    public void groupLevelMinusMinus() {
  +        this.groupLevel--;
  +    }
  +
  +    public boolean groupLevelExists() {
  +        return (this.groups != null && this.groups.get(this.groupLevel) != null);
  +    }
  +
  +    public void setGroupingVar( String key ) throws SQLException {
  +        if (this.groups == null)
  +            this.groups = new ArrayList(1);
  +        this.groups.ensureCapacity(this.groupLevel);
  +        this.groups.add(this.groupLevel, new EsqlGroup(key, 
this.getResultSet().getObject(key)));
  +    }
  +
  +    public boolean hasGroupingVarChanged() throws SQLException {
  +        Object tmp = 
this.getResultSet().getObject(((EsqlGroup)this.groups.get(this.groupLevel)).var);
  +        if (tmp.equals(((EsqlGroup)this.groups.get(groupLevel)).value)) {
  +            return false;
  +        } else {
  +            ((EsqlGroup)this.groups.get(groupLevel)).value = tmp;
  +            return true;
  +        }
  +    }
   
     public ResultSetMetaData getResultSetMetaData() {
       return(resultSetMetaData);
  
  
  

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