Thread: Problem with Large Object Interface of pgsql_perl5
I'm using PostgreSQL 6.5.3, Perl 5.005_03, and pgsql_perl5 1.8.0 on Linux (intel). Running this program: #!/usr/bin/perl use strict; package Main; use Pg; my $db_name='excised'; my $db_user='excised'; my $db_passwd='excised'; # Connect to the database server my $dbconn = Pg::connectdb("dbname=$db_name user=$db_user password=$db_passwd"); if($dbconn->status ne PGRES_CONNECTION_OK){ # We failed to get a connection, exit with error my $error=$dbconn->errorMessage; print "Error on connection: $error\n"; exit; } print "Database connection opened\n"; my $newoid = $dbconn->lo_creat(PGRES_INV_WRITE|PGRES_INV_READ); if($newoid == PGRES_InvalidOid){ my $error = $dbconn->errorMessage; print "Error on lo_creat: $error\n"; exit; } print "LO created\n"; my $fd = $dbconn->lo_open($newoid,PGRES_INV_WRITE); if($fd == -1){ # Error on opening new oid my $error = $dbconn->errorMessage; print "Error on lo_open (oid = $newoid): $error\n"; # Tryto unlink the oid $dbconn->lo_unlink($newoid); exit; } print "LO opened\n"; my $content = 'This is a test of the emergency broadcasting system, in the event of a real emergency...'; my $numbytes=$dbconn->lo_write($fd,$content,length($content)); if($numbytes != length($content)){ my $rightnum=length($content); my $error = $dbconn->errorMessage; print "Error on lo_write($numbytes != $rightnum): $error\n"; # Try to unlink the oid $dbconn->lo_close($fd); $dbconn->lo_unlink($newoid); exit; } print "LO written\n"; $dbconn->lo_close($fd); $dbconn->lo_unlink($newoid); I get this output: Database connection opened LO created Error on lo_open (oid = 46401): ERROR: lo_lseek: invalid large obj descriptor (0) Can anyone tell me what I'm doing wrong? All help is greatly appreciated. Ken Causey PremierNET, Inc.
Ken Causey <ken@premiernet.net> writes: > Can anyone tell me what I'm doing wrong? Not doing the lo_open inside a transaction. You need begin ... end around any use of an open large object. (This has always been true, but older versions of Postgres didn't enforce it --- they'd just die occasionally if you broke the rule. Now, open LO handles are auto- closed at transaction commit, which is to say at end of statement if you're not inside a BEGIN block.) regards, tom lane
Edmund Mergl was kind enough to point out my error and now that I look back at the Programmer's documentation I see it. Someone might want to update the Pg man page to reflect this. Thanks! Ken Causey PremierNET, Inc. At 01:11 PM 3/31/00 -0500, Tom Lane wrote: >Ken Causey <ken@premiernet.net> writes: >> Can anyone tell me what I'm doing wrong? > >Not doing the lo_open inside a transaction. You need begin ... end >around any use of an open large object. (This has always been true, >but older versions of Postgres didn't enforce it --- they'd just die >occasionally if you broke the rule. Now, open LO handles are auto- >closed at transaction commit, which is to say at end of statement >if you're not inside a BEGIN block.) > > regards, tom lane > >
> Edmund Mergl was kind enough to point out my error and now > that I look back at the Programmer's documentation I see it. Someone > might want to update the Pg man page to reflect this. Thanks! What "Pg man page"? Where? Can't fix what I can't find... - Thomas -- Thomas Lockhart lockhart@alumni.caltech.edu South Pasadena, California
On Fri, 31 Mar 2000, Thomas Lockhart wrote: > > Edmund Mergl was kind enough to point out my error and now > > that I look back at the Programmer's documentation I see it. Someone > > might want to update the Pg man page to reflect this. Thanks! > > What "Pg man page"? Where? Can't fix what I can't find... Use perldoc Pg to read it. It's packaged as /usr/lib/perl5/man/man3/Pg.3 in the RPM. It is located at src/interfaces/perl5/blib/man3/Pg.3 in the tarball. -- Lamar Owen WGCR Internet Radio 1 Peter 4:11
> > What "Pg man page"? Where? Can't fix what I can't find... > Use perldoc Pg to read it. It's packaged as /usr/lib/perl5/man/man3/Pg.3 in > the RPM. It is located at src/interfaces/perl5/blib/man3/Pg.3 in the tarball. Sheesh, a whole 'nother set of docs to look at. Hopefully someone else will pick it up... - Thomas -- Thomas Lockhart lockhart@alumni.caltech.edu South Pasadena, California