Обсуждение: isLast() and empty ResultSet

Поиск
Список
Период
Сортировка

isLast() and empty ResultSet

От
"Ruediger Herrmann"
Дата:
Hello,

I implemented an Iterator interface iterating over a ResultSet. Therefore
I rely on isLast() to implement the Iterator#hasNext() method. This works
fine unless the whole ResultSet is empty.
For empty RresultSets, isLast always returns true.
Stepping through the code I found the reason therefore. Line 544 of
AbstractJdbc2ResultSet says
    if (rows_size == 0)
         return false; // No rows.
At least to me this is suspicious as I would return the opposite. Might that
be a bug or is there any other reason to behave like this?

I am using JDBC Driver 8.0 Build 311 and Server Version 8.0.2.

Regards
Rüdiger



--
+++ NEU: GMX DSL_Flatrate! Schon ab 14,99 EUR/Monat! +++

GMX Garantie: Surfen ohne Tempo-Limit! http://www.gmx.net/de/go/dsl

Re: isLast() and empty ResultSet

От
Kris Jurka
Дата:

On Thu, 21 Apr 2005, Ruediger Herrmann wrote:

> I implemented an Iterator interface iterating over a ResultSet. Therefore
> I rely on isLast() to implement the Iterator#hasNext() method. This works
> fine unless the whole ResultSet is empty.
> For empty RresultSets, isLast always returns true.

It always returns false because isLast implies that you are on the last
row of the ResultSet.  If the ResultSet is empty you aren't on a row,
so you can't be on the last row.

Kris Jurka

Re: isLast() and empty ResultSet

От
Oliver Jowett
Дата:
Ruediger Herrmann wrote:
> Hello,
>
> I implemented an Iterator interface iterating over a ResultSet. Therefore
> I rely on isLast() to implement the Iterator#hasNext() method. This works
> fine unless the whole ResultSet is empty.
> For empty RresultSets, isLast always returns true.
> Stepping through the code I found the reason therefore. Line 544 of
> AbstractJdbc2ResultSet says
>     if (rows_size == 0)
>          return false; // No rows.
> At least to me this is suspicious as I would return the opposite. Might that
> be a bug or is there any other reason to behave like this?

It's not a bug, AFAIK. isLast() returns true if the resultset is
positioned *on* the last row of the resultset. This means that if you
have a 5-row resultset, isLast() is true when the 5th row is the
currently active row (and you can retrieve data from that row at that
point).

For a 0-row resultset, we can never be on the last row as there are no
rows at all.

You could try something like this for your hasNext() condition:

  rs.isBeforeFirst() || (rs.getRow() != 0 && !rs.isLast())

(note that isBeforeFirst() returns false on an empty resultset, per javadoc)

-O

Re: isLast() and empty ResultSet

От
"Ruediger Herrmann"
Дата:
Thanks a lot to all of you for the replies.

I'm now using isBeforeFirst() to test for an empty
ResultSet, wich as far as my tests show seems to work
if it is the first thing done.

Regards
Rüdiger

--- Oliver Jowett <oliver@opencloud.com> wrote:
> Ruediger Herrmann wrote:
> > Hello,
> >
> > I implemented an Iterator interface iterating over
> a ResultSet. Therefore
> > I rely on isLast() to implement the
> Iterator#hasNext() method. This works
> > fine unless the whole ResultSet is empty.
> > For empty RresultSets, isLast always returns true.
> > Stepping through the code I found the reason
> therefore. Line 544 of
> > AbstractJdbc2ResultSet says
> >     if (rows_size == 0)
> >          return false; // No rows.
> > At least to me this is suspicious as I would
> return the opposite. Might that
> > be a bug or is there any other reason to behave
> like this?
>
> It's not a bug, AFAIK. isLast() returns true if the
> resultset is
> positioned *on* the last row of the resultset. This
> means that if you
> have a 5-row resultset, isLast() is true when the
> 5th row is the
> currently active row (and you can retrieve data from
> that row at that
> point).
>
> For a 0-row resultset, we can never be on the last
> row as there are no
> rows at all.
>
> You could try something like this for your hasNext()
> condition:
>
>   rs.isBeforeFirst() || (rs.getRow() != 0 &&
> !rs.isLast())
>
> (note that isBeforeFirst() returns false on an empty
> resultset, per javadoc)
>
> -O
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to
> majordomo@postgresql.org
>
>
>

--
+++ GMX - Die erste Adresse für Mail, Message, More +++

1 GB Mailbox bereits in GMX FreeMail http://www.gmx.net/de/go/mail