You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by vg...@apache.org on 2006/06/09 17:01:45 UTC
svn commit: r413064 - in /cocoon/branches/BRANCH_2_1_X:
src/blocks/databases/java/org/apache/cocoon/transformation/SQLTransformer.java
status.xml
Author: vgritsenko
Date: Fri Jun 9 08:01:45 2006
New Revision: 413064
URL: http://svn.apache.org/viewvc?rev=413064&view=rev
Log:
<action dev="VG" type="update">
Databases: Support CLOBs in SQLTransformer when returned as stored procedure
parameters, or as columns in a cursor returned by stored procedure.
</action>
<action dev="VG" type="fix">
Databases: Fix reading of the CLOBs in SQLTransformer.
</action>
Modified:
cocoon/branches/BRANCH_2_1_X/src/blocks/databases/java/org/apache/cocoon/transformation/SQLTransformer.java
cocoon/branches/BRANCH_2_1_X/status.xml
Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/databases/java/org/apache/cocoon/transformation/SQLTransformer.java
URL: http://svn.apache.org/viewvc/cocoon/branches/BRANCH_2_1_X/src/blocks/databases/java/org/apache/cocoon/transformation/SQLTransformer.java?rev=413064&r1=413063&r2=413064&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/blocks/databases/java/org/apache/cocoon/transformation/SQLTransformer.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/blocks/databases/java/org/apache/cocoon/transformation/SQLTransformer.java Fri Jun 9 08:01:45 2006
@@ -150,6 +150,8 @@
*/
public class SQLTransformer extends AbstractSAXTransformer {
+ private static final int BUFFER_SIZE = 1024;
+
/** The SQL transformer namespace */
public static final String NAMESPACE = "http://apache.org/cocoon/SQL/2.0";
@@ -930,13 +932,13 @@
protected int columnCase;
/** Registered IN parameters */
- protected HashMap inParameters;
+ protected Map inParameters;
/** Registered OUT parameters */
- protected HashMap outParameters;
+ protected Map outParameters;
/** Mapping out parameters - objectModel */
- protected HashMap outParametersNames;
+ protected Map outParametersNames;
/** Check if nr of rows need to be written out. */
protected boolean showNrOfRows;
@@ -1023,7 +1025,8 @@
protected void setOutParameter(int pos, String type, String name) {
if (outParameters == null) {
- outParameters = new HashMap();
+ // make sure output parameters are ordered
+ outParameters = new TreeMap();
outParametersNames = new HashMap();
}
outParameters.put(new Integer(pos), type);
@@ -1071,16 +1074,16 @@
while (i.hasNext()) {
Integer counter = (Integer) i.next();
String type = (String) outParameters.get(counter);
- int index = type.lastIndexOf(".");
+ int index = type.lastIndexOf(".");
String className, fieldName;
- if (index > -1) {
- className = type.substring(0, index);
- fieldName = type.substring(index + 1, type.length());
- } else {
+ if (index == -1) {
getLogger().error("Invalid SQLType: " + type, null);
throw new SQLException("Invalid SQLType: " + type);
}
+ className = type.substring(0, index);
+ fieldName = type.substring(index + 1, type.length());
+
try {
Class clss = Class.forName(className);
Field fld = clss.getField(fieldName);
@@ -1301,30 +1304,15 @@
return nr;
}
- protected String getColumnValue(int i) throws SQLException {
- int numberOfChar = 1024;
- String retval;
-
- if (rs.getMetaData().getColumnType(i) == java.sql.Types.DOUBLE) {
- retval = getStringValue(rs.getBigDecimal(i));
- } else if (rs.getMetaData().getColumnType(i) == java.sql.Types.CLOB) {
- Clob clob = rs.getClob(i);
- InputStream inputStream = clob.getAsciiStream();
- byte[] readByte = new byte[numberOfChar];
- StringBuffer buffer = new StringBuffer();
- try {
- while (inputStream.read(readByte) > -1) {
- String string = new String(readByte, this.clobEncoding);
- buffer.append(string);
- }
- } catch (IOException e) {
- throw new SQLException("Error reading stream from CLOB");
- }
- retval = buffer.toString();
+ protected String getColumnValue(ResultSet rs, int i) throws SQLException {
+ final int type = rs.getMetaData().getColumnType(i);
+ if (type == java.sql.Types.DOUBLE) {
+ return getStringValue(rs.getBigDecimal(i));
+ } else if (type == java.sql.Types.CLOB) {
+ return getStringValue(rs.getClob(i));
} else {
- retval = getStringValue(rs.getObject(i));
+ return getStringValue(rs.getObject(i));
}
- return retval;
}
// fix not applied here because there is no metadata from Name -> number and coltype
@@ -1332,7 +1320,7 @@
// as this function is only called for ancestor lookups.
protected String getColumnValue(String name) throws SQLException {
String retval = getStringValue(rs.getObject(name));
- // if (rs.getMetaData().getColumnType( name ) == 8)
+ // if (rs.getMetaData().getColumnType( name ) == java.sql.Types.DOUBLE)
// retval = transformer.getStringValue( rs.getBigDecimal( name ) );
return retval;
}
@@ -1430,20 +1418,41 @@
for (int i = 1; i <= md.getColumnCount(); i++) {
String columnName = getColumnName(md.getColumnName(i));
start(columnName, EMPTY_ATTRIBUTES);
- serializeData(getColumnValue(i));
+ serializeData(getColumnValue(rs, i));
end(columnName);
}
}
}
+ private void serializeResultSet(ResultSet rs) throws SQLException, SAXException {
+ final ResultSetMetaData md = rs.getMetaData();
+ final int n = md.getColumnCount();
+
+ // Get column names
+ final String[] columns = new String[n + 1];
+ for (int i = 1; i <= n; i++) {
+ columns[i] = getColumnName(md.getColumnName(i));
+ }
+
+ // Process rows
+ while (rs.next()) {
+ start(rowElement, EMPTY_ATTRIBUTES);
+ for (int i = 1; i <= n; i++) {
+ start(columns[i], EMPTY_ATTRIBUTES);
+ serializeData(getColumnValue(rs, i));
+ end(columns[i]);
+ }
+ end(this.rowElement);
+ }
+ }
+
protected void serializeStoredProcedure()
throws SQLException, SAXException {
if (outParametersNames == null || cst == null) {
return;
}
- // make sure output follows order as parameter order in stored procedure
- Iterator itOutKeys = new TreeMap(outParameters).keySet().iterator();
+ Iterator itOutKeys = outParameters.keySet().iterator();
while (itOutKeys.hasNext()) {
final Integer counter = (Integer) itOutKeys.next();
try {
@@ -1456,27 +1465,11 @@
} else {
final ResultSet rs = (ResultSet) obj;
try {
- ResultSetMetaData md = rs.getMetaData();
- while (rs.next()) {
- start(this.rowElement, EMPTY_ATTRIBUTES);
- for (int i = 1; i <= md.getColumnCount(); i++) {
- String columnName = getColumnName(md.getColumnName(i));
- start(columnName, EMPTY_ATTRIBUTES);
- if (md.getColumnType(i) == 8) { // prevent nasty exponent notation
- serializeData(getStringValue(rs.getBigDecimal(i)));
- } else {
- serializeData(getStringValue(rs.getObject(i)));
- }
- end(columnName);
- }
- end(this.rowElement);
- }
+ serializeResultSet(rs);
} finally {
try {
rs.close();
- } catch (SQLException e) {
- /* ignored */
- }
+ } catch (SQLException e) { /* ignored */ }
}
}
@@ -1505,12 +1498,26 @@
/**
* Convert object to string represenation
*/
- private String getStringValue(Object object) {
+ private String getStringValue(Object object) throws SQLException {
if (object instanceof byte[]) {
// FIXME Encoding?
return new String((byte[]) object);
} else if (object instanceof char[]) {
return new String((char[]) object);
+ } else if (object instanceof Clob) {
+ Clob clob = (Clob) object;
+ StringBuffer buffer = new StringBuffer();
+ InputStream is = clob.getAsciiStream();
+ try {
+ byte[] bytes = new byte[BUFFER_SIZE];
+ int n;
+ while ((n = is.read(bytes)) > -1) {
+ buffer.append(new String(bytes, 0, n, this.clobEncoding));
+ }
+ } catch (IOException e) {
+ throw new SQLException("Error reading stream from CLOB");
+ }
+ return buffer.toString();
} else if (object != null) {
return object.toString();
}
@@ -1545,8 +1552,7 @@
return "<ancestor level " + level + ", name " + name + ">";
}
}
-
-
+
/**
* Stop recording of text and return the recorded information.
* @return The String, trimmed.
@@ -1566,5 +1572,4 @@
}
return text;
}
-
}
Modified: cocoon/branches/BRANCH_2_1_X/status.xml
URL: http://svn.apache.org/viewvc/cocoon/branches/BRANCH_2_1_X/status.xml?rev=413064&r1=413063&r2=413064&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/status.xml (original)
+++ cocoon/branches/BRANCH_2_1_X/status.xml Fri Jun 9 08:01:45 2006
@@ -182,6 +182,13 @@
<release version="@version@" date="@date@">
-->
<release version="2.1.10" date="TBD">
+ <action dev="VG" type="update">
+ Databases: Support CLOBs in SQLTransformer when returned as stored procedure
+ parameters, or as columns in a cursor returned by stored procedure.
+ </action>
+ <action dev="VG" type="fix">
+ Databases: Fix reading of the CLOBs in SQLTransformer.
+ </action>
<action dev="AG" type="update">
Updated bcel to 5.2.
</action>
@@ -189,7 +196,8 @@
CForms Block: Add multiple repeater drag & drop dojo sample.
</action>
<action dev="CZ" type="fix" fixes-bug="COCOON-1857" due-to="Brian Vargas" due-to-email="ardvaark-apachebugs@procrastinators.org">
- Set instrumentation manager on child component managers to enable instrumentation of all components including sitemap components.
+ Set instrumentation manager on child component managers to enable
+ instrumentation of all components including sitemap components.
</action>
<action dev="AG" type="update">
Updated dojo to 20060605.