RE: [PEAR] Trying to loop through MDB rowset - proposed solution
| From: | Matt Friedman | Date: | Sat, 09 Nov 2002 17:34:25 +0000 |
| Subject: | RE: [PEAR] Trying to loop through MDB rowset - proposed solution | ||
| References: | 1 | Groups: | php.pear.dev |
| Request: | Send a blank email to pear-dev+get-10656@lists.php.net to get a copy of this message | ||
Hi Lucas,
As I said I wanted to come up with a way to loop through record sets
without putting the set into a php array first. MDB doesn't seem to
provide methods that allow for this.
I'm sending a rough implementation of an "iterator" class and its
associated factory method class for your consideration. Since the MDB
query method returns a resource id which points to a result set, we
don't have to rely on MDB to loop through the set. We can pass the
result id to another class which can then be responsible for providing
each item in the list. This hides the database implementation and allows
for all sorts of iteration classes to be written that could make use of
cursors etc... Looping backwards through the set is one example and so
on...
A couple of other advantages: you can choose whether or not to free the
result at the end of the loop (see IsDone()) and if you don't free it,
you can re-use the iterator and loop through the same set again. The
default is to free the set. Also, this solution doesn't require changing
MDB at all.
Anyway, I think my code is fairly self explanatory if not complete.
There needs to be lots more error checking and PEARifying if you want to
use it; but I wanted to contribute the idea. If you have any questions
please let me know.
I hope this turns out to be helpful and useful. :)
Matt Friedman
matt@SpryNewMedia.com
> -----Original Message-----
> From: Matt Friedman [mailto:matt@sprynewmedia.com]
> Sent: Thursday November 7, 2002 4:58 PM
> To: smith@dybnet.de; pear-general@lists.php.net
> Subject: RE: [PEAR] Trying to loop through MDB rowset -
>
> Hi again Lukas,
>
> I've been thinking (ruminating) about this and have a solution (in my
> mind) about a way to satisfy this problem without having to touch MDB
at
> all. What I don't like about the current way is that MDB loops through
> the results and then I have to loop through the results again to
handle
> the data. Makes more sense to me to just loop once.
>
> I'll work on something and submit something to you - you can let me
know
> if it looks reasonable. Give me a day or so.
>
> Matt Friedman
> Web Applications Developer
> www.SpryNewMedia.com
> Phone: 416 992 5482
> Email: matt@SpryNewMedia.com
>
>
>
> > -----Original Message-----
> > From: Lukas Smith [mailto:smith@dybnet.de]
> > Sent: Thursday November 7, 2002 2:42 PM
> > To: 'Matt Friedman'; pear-general@lists.php.net
> > Subject: RE: [PEAR] Trying to loop through MDB rowset -
> >
> > > From: Matt Friedman [mailto:matt@sprynewmedia.com]
> > > Sent: Thursday, November 07, 2002 8:32 PM
> > > To: smith@dybnet.de; pear-general@lists.php.net
> > > Subject: RE: [PEAR] Trying to loop through MDB rowset -
> > >
> > > Thanks very much Lucas.
> > >
> > > Is loading up a new array with the whole result set ok (as in
> > queryAll)?
> > > I had actually thought that using the Resource Id instead of
filling
> a
> > > result set object/array was more efficient. The impression I have
is
> > > that using a result id uses less memory. What about large result
> sets?
> > > This may not be a big issue - I'm just throwing it out there. But
> > that's
> > > actually why I was trying to avoid using queryAll if I could.
> > >
> > > What about the ability to _not_ free the result so that you can
> > continue
> > > to loop through using the resource id when you use fetchRow
etc...?
> > (via
> > > some flag or something?)
> > >
> > > Anyway, thanks again :)
> > >
> >
> > well hmmm ...
> > I ported this behavior from DB's get+() methods.
> > Recently there was the addition of autofree (automatically free a
> result
> > set when the end of the result set is reached). So maybe I shoud
> > re-examine this. Adding another flag is probably not a good idea
> because
> > most methods in MDB have so many parameters already due to the
> datatype
> > abstraction.
> >
> > Fetching everything at once will be faster I am quite sure as you
have
> > less function calls. Then again you might be right that is uses more
> > memory.
> >
> > Regards,
> > Lukas
> >
> >
> > --
> > PEAR General Mailing List (http://pear.php.net/)
> > To unsubscribe, visit: http://www.php.net/unsub.php
>
>
>
> --
> PEAR General Mailing List (http://pear.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
Attachment: [application/x-zip-compressed] RsIterator.zip
Attachment: [application/x-zip-compressed] RsIterator.zip