Hello,
the patch attached above brings the following two changes to the
SQLTransformer:
1. SQLExceptions coming from query.execute() are catched and the following
output is added to the resulting xml documenters set
<sql:rowset>
<sql:error>The error messge from the SQLException.<sql:error>
</sql:rowset>
2. The element <sql:escape-string> is added. The purpose of this is, that
you can write the following statement:
<sql:execute-query>
<sql:query isupdate="true">
update test_table set test1 = '<sql:escape-string>A string with tick ' and
backslash \ in it.</sql:escape-string>'
</sql:query>
</sql:execute-query>
The tick ' will be escaped with a double tick '' and the backslash will
be escaped with a double backlslash \\ befor adding to the query string.
With this it is although possible to create sql queries from stylesheets
using form paramters like in the following example:
<sql:execute-query>
<sql:query isupdate="true">
update test_table set
test = '<sql:escape-string><xsl:value-of
select="$input_test1"/></sql:escape-string>'
</sql:query>
</sql:execute-query>
Cheers,
Peter Seiderer
I am not subscribed to the mailing list. Please reply via
CC to [EMAIL PROTECTED]
diff -ru cocoon-2.0rc2_orig/src/org/apache/cocoon/transformation/SQLTransformer.java
cocoon-2.0rc2/src/org/apache/cocoon/transformation/SQLTransformer.java
--- cocoon-2.0rc2_orig/src/org/apache/cocoon/transformation/SQLTransformer.java Wed
Nov 7 12:36:07 2001
+++ cocoon-2.0rc2/src/org/apache/cocoon/transformation/SQLTransformer.java Mon
+Nov 26 20:53:10 2001
@@ -62,6 +62,8 @@
public static final String MAGIC_OUT_PARAMETER_NAME_ATTRIBUTE = "name";
public static final String MAGIC_OUT_PARAMETER_NR_ATTRIBUTE = "nr";
public static final String MAGIC_OUT_PARAMETER_TYPE_ATTRIBUTE = "type";
+ public static final String MAGIC_ESCAPE_STRING = "escape-string";
+ public static final String MAGIC_ERROR = "error";
public static final String MAGIC_ANCESTOR_VALUE = "ancestor-value";
public static final String MAGIC_ANCESTOR_VALUE_LEVEL_ATTRIBUTE = "level";
@@ -81,6 +83,7 @@
public static final int STATE_INSIDE_SUBSTITUTE_VALUE_ELEMENT = 5;
public static final int STATE_INSIDE_IN_PARAMETER_ELEMENT = 6;
public static final int STATE_INSIDE_OUT_PARAMETER_ELEMENT = 7;
+ public static final int STATE_INSIDE_ESCAPE_STRING = 8;
/** Default parameters that might apply to all queries **/
protected Properties default_properties;
@@ -220,35 +223,50 @@
getLogger().debug( "SQLTransformer executing query nr " + index );
AttributesImpl attr = new AttributesImpl();
Query query = (Query) queries.elementAt( index );
+ boolean query_failure = false;
try {
- query.execute();
-
- if ( showNrOfRows != null && showNrOfRows.equalsIgnoreCase( "true" ) ) {
- attr.addAttribute( my_uri, query.nr_of_rows, query.nr_of_rows,
"CDATA",
- String.valueOf( query.getNrOfRows() ) );
- }
- String name = query.getName();
- if ( name != null ) {
- attr.addAttribute( my_uri, query.name_attribute,
query.name_attribute, "CDATA",
- name );
- }
- this.start( query.rowset_name, attr );
- attr = new AttributesImpl();
- if ( !query.isStoredProcedure() ) {
- while ( query.next() ) {
- this.start( query.row_name, attr );
- query.serializeRow();
- if ( index + 1 < queries.size() ) {
- executeQuery( index + 1 );
- }
- this.end( query.row_name );
- }
- } else {
- query.serializeStoredProcedure();
- }
- } catch ( SQLException e ) {
- getLogger().debug( "SQLTransformer.executeQuery()", e );
- throw new SAXException( e );
+ try {
+ query.execute();
+ } catch ( SQLException e ) {
+ getLogger().debug( "SQLTransformer:.executeQuery() query.execute
+failed ", e );
+ AttributesImpl my_attr = new AttributesImpl();
+ this.start( query.rowset_name, my_attr );
+ this.start( MAGIC_ERROR, my_attr);
+ this.data( e.getMessage());
+ this.end( MAGIC_ERROR );
+ this.end( query.rowset_name );
+ query_failure = true;
+ }
+ if ( !query_failure ) {
+
+ if ( showNrOfRows != null && showNrOfRows.equalsIgnoreCase( "true" ) )
+{
+ attr.addAttribute( my_uri, query.nr_of_rows, query.nr_of_rows,
+"CDATA",
+ String.valueOf( query.getNrOfRows() ) );
+ }
+ String name = query.getName();
+ if ( name != null ) {
+ attr.addAttribute( my_uri, query.name_attribute,
+query.name_attribute, "CDATA",
+ name );
+ }
+ this.start( query.rowset_name, attr );
+ attr = new AttributesImpl();
+ if ( !query.isStoredProcedure() ) {
+ while ( query.next() ) {
+ this.start( query.row_name, attr );
+ query.serializeRow();
+ if ( index + 1 < queries.size() ) {
+ executeQuery( index + 1 );
+ }
+ this.end( query.row_name );
+ }
+ } else {
+ query.serializeStoredProcedure();
+ }
+ this.end( query.rowset_name );
+ }
+ } catch ( SQLException e ) {
+ getLogger().debug( "SQLTransformer.executeQuery()", e );
+ throw new SAXException( e );
} finally {
try {
query.close();
@@ -256,8 +274,6 @@
getLogger().warn( "SQLTransformer: Could not close JDBC connection",
e );
}
}
- this.end( query.rowset_name );
-// this.contentHandler.endPrefixMapping("");
}
protected static void throwIllegalStateException( String message ) {
@@ -439,6 +455,42 @@
current_state = SQLTransformer.STATE_INSIDE_QUERY_ELEMENT;
}
+ protected void startEscapeStringElement( Attributes attributes ) {
+ switch ( current_state ) {
+ case SQLTransformer.STATE_INSIDE_QUERY_ELEMENT:
+ if ( current_value.length() > 0 ) {
+ getCurrentQuery().addQueryPart( current_value.toString() );
+ getLogger().debug( "QUERY IS \"" +
+ current_value.toString() + "\"" );
+ current_value.setLength( 0 );
+ }
+
+ current_state = SQLTransformer.STATE_INSIDE_ESCAPE_STRING;
+ break;
+ default:
+ throwIllegalStateException( "Not expecting a start escape-string
+element" );
+ }
+ }
+
+ protected void endEscapeStringElement() {
+ switch ( current_state) {
+ case SQLTransformer.STATE_INSIDE_ESCAPE_STRING:
+ if ( current_value.length() > 0 ) {
+ String escape = current_value.toString();
+ escape = replaceCharWithString( escape, '\'', "''" );
+ escape = replaceCharWithString( escape, '\\', "\\\\" );
+ getCurrentQuery().addQueryPart( escape );
+ getLogger().debug( "QUERY IS \"" +
+ current_value.toString() + "\"" );
+ current_value.setLength( 0 );
+ }
+ current_state = SQLTransformer.STATE_INSIDE_QUERY_ELEMENT;
+ break;
+ default:
+ throwIllegalStateException( "Not expecting a end escape-string element" );
+ }
+ }
+
protected void startInParameterElement( Attributes attributes ) {
switch ( current_state ) {
case SQLTransformer.STATE_INSIDE_EXECUTE_QUERY_ELEMENT:
@@ -541,6 +593,8 @@
startInParameterElement( attributes );
} else if ( name.equals( SQLTransformer.MAGIC_OUT_PARAMETER ) ) {
startOutParameterElement( attributes );
+ } else if ( name.equals( SQLTransformer.MAGIC_ESCAPE_STRING ) ) {
+ startEscapeStringElement( attributes );
} else {
startValueElement( name );
}
@@ -568,6 +622,8 @@
endOutParameterElement();
} else if ( name.equals( SQLTransformer.MAGIC_VALUE ) || current_state ==
SQLTransformer.STATE_INSIDE_VALUE_ELEMENT ) {
endValueElement();
+ } else if ( name.equals( SQLTransformer.MAGIC_ESCAPE_STRING ) ) {
+ endEscapeStringElement();
} else {
super.endElement( uri, name, raw );
}
@@ -576,7 +632,8 @@
public void characters( char ary[], int start,
int length ) throws SAXException {
if ( current_state != SQLTransformer.STATE_INSIDE_VALUE_ELEMENT &&
- current_state != SQLTransformer.STATE_INSIDE_QUERY_ELEMENT ) {
+ current_state != SQLTransformer.STATE_INSIDE_QUERY_ELEMENT &&
+ current_state != SQLTransformer.STATE_INSIDE_ESCAPE_STRING ) {
super.characters( ary, start, length );
}
getLogger().debug( "RECEIVED CHARACTERS: " +
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]