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]