Return-Path: Delivered-To: apmail-cocoon-cvs-archive@www.apache.org Received: (qmail 83257 invoked from network); 16 Jun 2006 12:59:30 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 16 Jun 2006 12:59:30 -0000 Received: (qmail 2824 invoked by uid 500); 16 Jun 2006 12:59:16 -0000 Delivered-To: apmail-cocoon-cvs-archive@cocoon.apache.org Received: (qmail 2741 invoked by uid 500); 16 Jun 2006 12:59:16 -0000 Mailing-List: contact cvs-help@cocoon.apache.org; run by ezmlm Precedence: bulk Reply-To: dev@cocoon.apache.org list-help: list-unsubscribe: List-Post: List-Id: Delivered-To: mailing list cvs@cocoon.apache.org Received: (qmail 2711 invoked by uid 99); 16 Jun 2006 12:59:16 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 16 Jun 2006 05:59:16 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: local policy) Received: from [140.211.166.113] (HELO eris.apache.org) (140.211.166.113) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 16 Jun 2006 05:59:15 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 4D89E1A983A; Fri, 16 Jun 2006 05:58:55 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r414820 - in /cocoon/trunk/blocks/cocoon-databases: cocoon-databases-impl/src/main/java/org/apache/cocoon/transformation/SQLTransformer.java status.xml Date: Fri, 16 Jun 2006 12:58:54 -0000 To: cvs@cocoon.apache.org From: vgritsenko@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20060616125855.4D89E1A983A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: vgritsenko Date: Fri Jun 16 05:58:54 2006 New Revision: 414820 URL: http://svn.apache.org/viewvc?rev=414820&view=rev Log: Read CLOBs using getCharacterStream, delegate character decoding to the database. Revert to old behavior if clob-encoding parameter is present. Modified: cocoon/trunk/blocks/cocoon-databases/cocoon-databases-impl/src/main/java/org/apache/cocoon/transformation/SQLTransformer.java cocoon/trunk/blocks/cocoon-databases/status.xml Modified: cocoon/trunk/blocks/cocoon-databases/cocoon-databases-impl/src/main/java/org/apache/cocoon/transformation/SQLTransformer.java URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-databases/cocoon-databases-impl/src/main/java/org/apache/cocoon/transformation/SQLTransformer.java?rev=414820&r1=414819&r2=414820&view=diff ============================================================================== --- cocoon/trunk/blocks/cocoon-databases/cocoon-databases-impl/src/main/java/org/apache/cocoon/transformation/SQLTransformer.java (original) +++ cocoon/trunk/blocks/cocoon-databases/cocoon-databases-impl/src/main/java/org/apache/cocoon/transformation/SQLTransformer.java Fri Jun 16 05:58:54 2006 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. + * Copyright 1999-2006 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,8 +15,9 @@ */ package org.apache.cocoon.transformation; -import java.io.IOException; import java.io.InputStream; +import java.io.IOException; +import java.io.Reader; import java.io.StringReader; import java.lang.reflect.Field; import java.sql.CallableStatement; @@ -46,6 +47,7 @@ import org.apache.cocoon.components.sax.XMLByteStreamCompiler; import org.apache.cocoon.components.sax.XMLByteStreamInterpreter; import org.apache.cocoon.environment.SourceResolver; +import org.apache.cocoon.transformation.helpers.TextRecorder; import org.apache.cocoon.xml.IncludeXMLConsumer; import org.apache.commons.lang.StringEscapeUtils; @@ -100,7 +102,7 @@ *

* The following DTD is valid: * - * <!ENTITY % param "(own-connection?,(use-connection|(dburl,username,password))?,show-nr-or-rows?,doc-element?,row-element?,namespace-uri?,namespace-prefix?,clob-encoding?)">
+ * <!ENTITY % param "(own-connection?,(use-connection|(dburl,username,password))?,show-nr-or-rows?,doc-element?,row-element?,namespace-uri?,namespace-prefix?,clob-encoding?)">
* <!ELEMENT execute-query (query,(in-parameter|out-parameter)*,execute-query?, %param;)>
* <!ELEMENT own-connection (#PCDATA)>
* <!ELEMENT use-connection (#PCDATA)>
@@ -131,6 +133,13 @@ *

* *

+ * By default, CLOBs are read from the database using character stream, so that character + * decoding is performed by the database. Using clob-encoding parameter, + * this behavior can be overrided, so that data is read as byte stream and decoded using + * specified character encoding. + *

+ * + *

* TODO: Support inserting of the XML data into the database without need to escape it. * Can be implemented by introducing new <sql:xml/> tag to indicate that * startSerializedXMLRecording(...) should be used. @@ -1123,6 +1132,9 @@ this.showNrOfRows = parameters.getParameterAsBoolean(SQLTransformer.MAGIC_NR_OF_ROWS, false); this.clobEncoding = parameters.getParameter(SQLTransformer.CLOB_ENCODING, ""); + if (this.clobEncoding.length() == 0) { + this.clobEncoding = null; + } // Start prefix mapping for output namespace, only if it's not mapped yet final String prefix = SQLTransformer.this.findPrefixMapping(this.outUri); @@ -1291,6 +1303,7 @@ // for a given "name" versus number. That being said this shouldn't be an issue // as this function is only called for ancestor lookups. protected String getColumnValue(String name) throws SQLException { + //noinspection UnnecessaryLocalVariable String retval = getStringValue(rs.getObject(name)); // if (rs.getMetaData().getColumnType( name ) == java.sql.Types.DOUBLE) // retval = transformer.getStringValue( rs.getBigDecimal( name ) ); @@ -1484,9 +1497,14 @@ if (object instanceof byte[]) { // FIXME Encoding? return new String((byte[]) object); - } else if (object instanceof char[]) { + } + + if (object instanceof char[]) { return new String((char[]) object); - } else if (object instanceof Clob) { + } + + // Old behavior: Read bytes & decode + if (object instanceof Clob && this.clobEncoding != null) { Clob clob = (Clob) object; StringBuffer buffer = new StringBuffer(); InputStream is = clob.getAsciiStream(); @@ -1500,7 +1518,26 @@ throw new SQLException("Error reading stream from CLOB"); } return buffer.toString(); - } else if (object != null) { + } + + // Correct behavior: Read character data + if (object instanceof Clob) { + Clob clob = (Clob) object; + StringBuffer buffer = new StringBuffer(); + Reader cs = clob.getCharacterStream(); + try { + char[] chars = new char[BUFFER_SIZE]; + int n; + while ((n = cs.read(chars)) > -1) { + buffer.append(chars, 0, n); + } + } catch (IOException e) { + throw new SQLException("Error reading stream from CLOB"); + } + return buffer.toString(); + } + + if (object != null) { return object.toString(); } Modified: cocoon/trunk/blocks/cocoon-databases/status.xml URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-databases/status.xml?rev=414820&r1=414819&r2=414820&view=diff ============================================================================== --- cocoon/trunk/blocks/cocoon-databases/status.xml (original) +++ cocoon/trunk/blocks/cocoon-databases/status.xml Fri Jun 16 05:58:54 2006 @@ -65,6 +65,10 @@ + + Read CLOBs using getCharacterStream, delegate character decoding + to the database. Revert to old behavior if clob-encoding parameter is present. + Support multiple results in SQLTransformer.