haul 2002/06/28 01:16:42 Modified: src/java/org/apache/cocoon/components/language/markup/xsp Tag: cocoon_2_0_3_branch EsqlQuery.java EsqlConnection.java src/java/org/apache/cocoon/components/language/markup/xsp/java Tag: cocoon_2_0_3_branch esql.xsl Log: <action dev="CH" type="update"> Multiple results seem not to be supported by some DBMSs (i.e. Oracle and Informix). Therefore this is made optional in ESQL. A new parameter (esql:allow-multiple-results) to esql:connection re-enables it. See EsqlConnection for details. </action> Revision Changes Path No revision No revision 1.11.2.6 +2 -1 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.11.2.5 retrieving revision 1.11.2.6 diff -u -r1.11.2.5 -r1.11.2.6 --- EsqlQuery.java 6 Jun 2002 08:43:34 -0000 1.11.2.5 +++ EsqlQuery.java 28 Jun 2002 08:16:42 -0000 1.11.2.6 @@ -366,6 +366,7 @@ } resultSetValid = false; } + this.adjustCounts(); return(hasResultSet); } 1.6.2.3 +22 -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.6.2.2 retrieving revision 1.6.2.3 diff -u -r1.6.2.2 -r1.6.2.3 --- EsqlConnection.java 12 Jun 2002 06:29:00 -0000 1.6.2.2 +++ EsqlConnection.java 28 Jun 2002 08:16:42 -0000 1.6.2.3 @@ -74,6 +74,26 @@ private String url = null; private Properties info = new Properties(); private int limitMethod = LIMIT_METHOD_NOLIMIT; + private boolean multipleResults = false; + + + public boolean multipleResults() { + return this.multipleResults; + } + + /** It appears that some commercial DBMSs like Oracle and Informix + * are broken in that they don't follow the JDBC standard and + * calls to getUpdateCount after getMoreResults result either in + * an exception (Informix) or return the same value (i.e. not -1) (Oracle). + * In addition, this feature is only useful with stored procedures. + * Hence we disable it per default. + **/ + public void setMultipleResults(String value) { + if (value != null) + this.multipleResults = ("true".equalsIgnoreCase(value) || "yes".equalsIgnoreCase(value)); + } + + public Properties getInfo() { return(info); @@ -199,7 +219,7 @@ } public boolean isClosed() throws SQLException { - return(isClosed()); + return(connection.isClosed()); } public java.sql.DatabaseMetaData getMetaData() throws SQLException { No revision No revision 1.13.2.6 +29 -10 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.13.2.5 retrieving revision 1.13.2.6 diff -u -r1.13.2.5 -r1.13.2.6 --- esql.xsl 4 Jun 2002 09:37:17 -0000 1.13.2.5 +++ esql.xsl 28 Jun 2002 08:16:42 -0000 1.13.2.6 @@ -174,6 +174,7 @@ <xsp:include>java.sql.Struct</xsp:include> <xsp:include>java.sql.SQLException</xsp:include> <xsp:include>java.sql.Clob</xsp:include> + <xsp:include>java.sql.Blob</xsp:include> <xsp:include>java.text.SimpleDateFormat</xsp:include> <xsp:include>java.text.DecimalFormat</xsp:include> <xsp:include>java.io.StringWriter</xsp:include> @@ -275,6 +276,7 @@ <xsl:variable name="pool"><xsl:call-template name="get-nested-string"><xsl:with-param name="content" select="esql:pool"/></xsl:call-template></xsl:variable> <xsl:variable name="autocommit"><xsl:call-template name="get-nested-string"><xsl:with-param name="content" select="esql:autocommit"/></xsl:call-template></xsl:variable> <xsl:variable name="use-limit-clause"><xsl:call-template name="get-nested-string"><xsl:with-param name="content" select="esql:use-limit-clause"/></xsl:call-template></xsl:variable> + <xsl:variable name="allow-multiple-results"><xsl:call-template name="get-nested-string"><xsl:with-param name="content" select="esql:allow-multiple-results"/></xsl:call-template></xsl:variable> <xsp:logic> if (_esql_connection != null) { _esql_connections.push(_esql_connection); @@ -286,6 +288,9 @@ try { _esql_connection.datasource = (DataSourceComponent) _esql_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"/>)); + </xsl:if> } catch (Exception _esql_exception_<xsl:value-of select="generate-id(.)"/>) { getLogger().error("Could not get the datasource",_esql_exception_<xsl:value-of select="generate-id(.)"/>); throw new RuntimeException("Could not get the datasource "+_esql_exception_<xsl:value-of select="generate-id(.)"/>); @@ -310,6 +315,9 @@ <xsl:for-each select="esql:property"> _esql_connection.setProperty("<xsl:value-of select="@name"/>",<xsl:call-template name="get-nested-string"><xsl:with-param name="content" select="."/></xsl:call-template>); </xsl:for-each> + <xsl:if test="esql:allow-multiple-results"> + _esql_connection.setMultipleResults(String.valueOf(<xsl:copy-of select="$password"/>)); + </xsl:if> _esql_connection.connection = DriverManager.getConnection(_esql_connection.getUrl(), _esql_connection.getInfo()); } catch (Exception _esql_exception_<xsl:value-of select="generate-id(.)"/>) { throw new RuntimeException("Error opening connection to dburl: "+String.valueOf(<xsl:copy-of select="$dburl"/>)+": "+_esql_exception_<xsl:value-of select="generate-id(.)"/>.getMessage()); @@ -395,7 +403,7 @@ </xsl:template> <xsl:template name="do-results"> - do { + do { if (_esql_query.hasResultSet()) { _esql_query.getResultRows(); if (_esql_query.nextRow()) { @@ -417,7 +425,7 @@ } _esql_query.getResultSet().close(); } else { - if (_esql_query.getUpdateCount() >= 0) { + if (_esql_query.getUpdateCount() > 0) { switch (_esql_query.getUpdateCountCount()) { <xsl:for-each select="esql:update-results"> case <xsl:value-of select="position()"/>: <xsl:if test="position()=last()"><xsl:text> @@ -435,7 +443,7 @@ } } } - } while(_esql_query.getMoreResults()); + } while(_esql_connection.multipleResults() && _esql_query.getMoreResults()); </xsl:template> @@ -566,6 +574,12 @@ </xsp:content> </xsl:template> +<xsl:template match="esql:execute-query//esql:update-results"> + <xsp:content> + <xsl:apply-templates/> + </xsp:content> +</xsl:template> + <xsl:template match="esql:update-results//esql:get-update-count"> <xsp:expr>_esql_query.getUpdateCount()</xsp:expr> </xsl:template> @@ -849,8 +863,13 @@ <xsp:expr><xsl:call-template name="get-resultset"/>.getShort(<xsl:call-template name="get-column"/>)</xsp:expr> </xsl:template> +<xspdoc:desc>returns the value of the given column as byte array</xspdoc:desc> +<xsl:template match="esql:row-results//esql:get-blob|esql:call-results//esql:get-blob" name="get-blob"> + <xsp:expr>EsqlHelper.getBlob(<xsl:call-template name="get-resultset"/>,<xsl:call-template name="get-column"/>)</xsp:expr> +</xsl:template> + <xspdoc:desc>returns the value of the given column as unicode string (column can be string or clob</xspdoc:desc> -<xsl:template match="esql:row-results//esql:get-clob" name="get-clob"> +<xsl:template match="esql:row-results//esql:get-clob|esql:call-results//esql:get-clob" name="get-clob"> <xsp:expr>EsqlHelper.getStringOrClob(<xsl:call-template name="get-resultset"/>,<xsl:call-template name="get-column"/>)</xsp:expr> </xsl:template> @@ -920,17 +939,17 @@ </xsl:template> <xspdoc:desc>returns the name of the given column. the column mus tbe specified by number, not name.</xspdoc:desc> -<xsl:template match="esql:row-results//esql:get-column-name|esql:call-results//esql:get-column-name"> +<xsl:template match="esql:results//esql:get-column-name"> <xsp:expr><xsl:call-template name="get-resultset"/>.getMetaData().getColumnName(<xsl:call-template name="get-column"/>)</xsp:expr> </xsl:template> <xspdoc:desc>returns the label of the given column. the column mus tbe specified by number, not name.</xspdoc:desc> -<xsl:template match="esql:row-results//esql:get-column-label|esql:call-results//esql:get-column-label"> +<xsl:template match="esql:results//esql:get-column-label"> <xsp:expr><xsl:call-template name="get-resultset"/>.getMetaData().getColumnLabel(<xsl:call-template name="get-column"/>)</xsp:expr> </xsl:template> <xspdoc:desc>returns the name of the type of the given column. the column must be specified by number, not name.</xspdoc:desc> -<xsl:template match="esql:row-results//esql:get-column-type-name|esql:call-results//esql:get-column-type-name"> +<xsl:template match="esql:results//esql:get-column-type-name"> <xsp:expr><xsl:call-template name="get-resultset"/>.getMetaData().getColumnTypeName(<xsl:call-template name="get-column"/>)</xsp:expr> </xsl:template> @@ -940,7 +959,7 @@ </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"> +<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>
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]