Re: [svn:DBD-Pg] r9821 - in DBD-Pg/trunk: . t

"Ben Tilly" <[email protected]>
Newsgroups gmane.comp.db.postgresql.dbdpg
Message-ID <[email protected]>
On 8/7/07, Greg Sabino Mullane <greg-738XdyZ4GzZWk0Htik3J/[email protected]> wrote:
>
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: RIPEMD160
>
>
> > As someone who just joined the mailing list, how do I look at the
> > subversion code?
>
> svn co http://svn.perl.org/modules/DBD-Pg/trunk dbdpg

Thank you.

Will this version remove the need for the second parameter to
pg_getline?  If so, then that should be documented.  I didn't install
so I can't test, but I'll note that with older versions of DBD::Pg
copying the code for pg_getline can result in undefined warnings.  I
eliminated that by making sure that the variable passed in is defined.
 Is this warning fixed in this version, or is that still bad?

I also think the cursor documentation could benefit from an example
showing how to use cursors.  Here is a patch adding that.

Cheers,
Ben

--- Pg.pm.bak   2007-08-07 09:34:33.000000000 -0700
+++ Pg.pm       2007-08-07 10:03:29.000000000 -0700
@@ -3401,14 +3401,31 @@

 =head2 Cursors

-Although PostgreSQL has a cursor concept, it has not been used in the current
+Although PostgreSQL supports cursors, they have not been used in the current
 implementation. Cursors in PostgreSQL can only be used inside a transaction
 block. Because only one transaction block at a time is allowed, this would
 have implied the restriction not to use any nested C<SELECT> statements. Hence
 the C<execute> method fetches all data at once into data structures located in
-the front-end application. This approach must to be considered when selecting
+the front-end application. This fact must to be considered when selecting
 large amounts of data!

+You can use cursors in your application, but you'll need to do a little
+work.  First you must make sure that autocommit is off.  Then declare your
+cursor.  Now you are able to issue queries against the cursor, and select
+against your queries.  This typically results in a double loop, like this:
+
+  $dbh->{AutoCommit} = 0;
+  $dbh->do("DECLARE csr CURSOR FOR $sql");
+  while (1) {
+    my $sth = $dbh->prepare("fetch 1000 from csr");
+    $sth->execute;
+    last if 0 == $sth->rows;
+
+    while (my $row = $sth->fetchrow_hashref) {
+      # Do something with the data.
+    }
+  }
+
 =head2 Datatype bool
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.