cocoon-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jerzy Kut" <jer...@rzeszow.tiger.com.pl>
Subject Re: esql based logicsheet get-row-count
Date Thu, 18 Apr 2002 12:37:42 GMT
Hi!
Thank You Christian and Torsten!
I solved my trouble :))
First! I make my "SELECT count(*) CNT from <table>" as method in JAVA:

dbman.xsl - logicsheet in dbman namespace

 <xsl:template match="xsp:page">
  <xsp:page>
   <xsl:apply-templates select="@*"/>
   <xsp:logic>

    /**
     * Get table rows count from database.
     * Makes SQL count(*) query on table  and return result as Long.
     * @param pool database pool name (defined in cocoon.xconf)
     * @param table name of table which rows will be accounted
     * @return count of employees
     */
    private Long getRowsCount(String pool, String table) {

      // database query
      String query =
        "select count(*) CNT " +
        "from " + table;

      // database column name
      String column = "CNT";

      // returned employees count value
      Long count = new Long(0);

      try {
        EsqlConnectionCocoon2 sqlConnection = new EsqlConnectionCocoon2();
        sqlConnection.datasource =
          // _esql_selector is private static property of ESQL
          (DataSourceComponent)_esql_selector.select(pool);
        sqlConnection.connection = sqlConnection.datasource.getConnection();
        EsqlQuery sqlQuery = new EsqlQuery(sqlConnection, query);
        sqlQuery.createStatement();
        sqlQuery.execute();
        if (sqlQuery.hasResultSet()) {
           sqlQuery.getResultRows();
         if (sqlQuery.nextRow()) {
            count = new Long(sqlQuery.getResultSet().getInt("CNT"));
          }
        }
        sqlQuery.getResultSet().close();
      } catch (Exception exception) {
        exception.printStackTrace();
      }

      return (count);
    }

   </xsp:logic>

   <xsl:apply-templates/>
  </xsp:page>
 </xsl:template>

 <!--
    - get graduations count from database
   -->
 <xsl:template match="dbman:graduations-count">

  <xsp:expr>getRowsCount("mydb", "SALGRADE")</xsp:expr>
 </xsl:template>

This inserts my method in proper place of class :)) Then I can use
<dbman:graduations-count/> to get count of salary graduations. It isn't
final form but now it works quite good :))

Second! In my navi logicsheet i use <xsl:copy-of> instead <xsl:value-of>
tag:

batchnavi.xsl - logicsheet in batch namespace

 <xsl:template match="batch:navigator">

  <xsl:param name="batch" select="batch:batch/*"/>
  <xsl:param name="batch-size" select="batch:batch-size/*"/>
  <xsl:param name="element-count" select="batch:element-count/*"/>
  <xsl:param name="action" select="batch:action/*"/>
  <xsl:param name="wrap" select="@wrap"/>

  <xsl:variable name="batch-count">
   <xsp:expr>
    (Long.parseLong(<xsl:copy-of select="$element-count"/>.toString()) - 1)
/
    Long.parseLong(<xsl:copy-of select="$batch-size"/>.toString()) + 1
   </xsp:expr>
  </xsl:variable>
</xsl:template>

It inserts calling of getRowsCount(...) method directly from <xsp:expr> in
compiled JAVA code. It try to insert whole method body there before. Now it
works :)

At last! I don't change my main XML/XSP document:

main.xml - my XSP document

  <batch:navigator wrap="yes">
   <batch:action>employees</batch:action>
   <batch:batch><xsp-session:get-attribute
name="employee-batch"/></batch:batch>
   <batch:batch-size><xsp-session:get-attribute
name="employee-batch-size"/></batch:batch-size>
   <batch:element-count><dbman:employees-count/></batch:element-count>
  </batch:navigator>

That's all!
Very, very big thanks for help.
That was trouble with xslt processing indeed :)) ! But I have impression You
keep in mind another resolve Christian ??? With JAVA BEANS.

Best regards
Jerzy Kut

----- Original Message -----
From: "Christian Haul" <haul@dvs1.informatik.tu-darmstadt.de>
To: <cocoon-users@xml.apache.org>
Sent: Wednesday, April 17, 2002 9:33 AM
Subject: Re: esql based logicsheet get-row-count


> On 17.Apr.2002 -- 09:10 AM, Jerzy Kut wrote:
> > Hi cocooners!
> > I know that esql:get-row-count is unavailable yet. But I need to get
this
> > information from my DB.
> > I try:
>
> >    <batch:element-count><dbman:employees-count/></batch:element-count>
>
> > batch.xsl
> >  <xsl:template match="batch:navigator">
> >   <xsl:param name="element-count" select="batch:element-count"/>
>
> >      (Long.parseLong(<xsl:value-of select="$element-count"/>) - 1) /
>
> OK, this is no briliant analysis of your code and certainly will not
> readily solve your problem, however, you have an XSL problem here:
>
> The last line is going to be expanded to something like
>
>
(Long.parseLong(<count><esql:connection><esql:query>.....</esql:connection><
/count>)-1
>
> which certainly was not your intention.
>
> If you pass parameters this way, make sure that your templates really
> expand to a single text node (in the end). This is not like calling
> functions but programming with macros. Bear that in mind!
>
> You might want to use java beans to communicate.
>
> Anyway, this is not a trivial problem and I bet most new-comers hit
> this wall at some time.
>
> Chris.
>
> --
> C h r i s t i a n       H a u l
> haul@informatik.tu-darmstadt.de
>     fingerprint: 99B0 1D9D 7919 644A 4837  7D73 FEF9 6856 335A 9E08
>
> ---------------------------------------------------------------------
> Please check that your question has not already been answered in the
> FAQ before posting. <http://xml.apache.org/cocoon/faqs.html>
>
> To unsubscribe, e-mail: <cocoon-users-unsubscribe@xml.apache.org>
> For additional commands, e-mail: <cocoon-users-help@xml.apache.org>


---------------------------------------------------------------------
Please check that your question has not already been answered in the
FAQ before posting. <http://xml.apache.org/cocoon/faqs.html>

To unsubscribe, e-mail: <cocoon-users-unsubscribe@xml.apache.org>
For additional commands, e-mail: <cocoon-users-help@xml.apache.org>


Mime
View raw message