Author: turnstep
Date: Wed Jan 20 13:14:28 2010
New Revision: 13758

Modified:
   DBD-Pg/trunk/Changes
   DBD-Pg/trunk/Pg.pm
   DBD-Pg/trunk/Pg.xs
   DBD-Pg/trunk/dbdimp.c
   DBD-Pg/trunk/dbdimp.h
   DBD-Pg/trunk/t/03dbmethod.t

Log:
First pass at lo_import_with_oid support


Modified: DBD-Pg/trunk/Changes
==============================================================================
--- DBD-Pg/trunk/Changes        (original)
+++ DBD-Pg/trunk/Changes        Wed Jan 20 13:14:28 2010
@@ -1,5 +1,10 @@
 ('GSM' is Greg Sabino Mullane, [email protected])
 
+2.17.0
+
+  - Added support for new lo_import_with_oid function.
+    [GSM] (CPAN bug #53835)
+
 2.16.1 Released January 20, 2010 (subversion r13756)
 
   - Output error messages in UTF-8 as needed. Reported by 

Modified: DBD-Pg/trunk/Pg.pm
==============================================================================
--- DBD-Pg/trunk/Pg.pm  (original)
+++ DBD-Pg/trunk/Pg.pm  Wed Jan 20 13:14:28 2010
@@ -152,6 +152,7 @@
                DBD::Pg::db->install_method('pg_lo_close');
                DBD::Pg::db->install_method('pg_lo_unlink');
                DBD::Pg::db->install_method('pg_lo_import');
+               DBD::Pg::db->install_method('pg_lo_import_with_oid');
                DBD::Pg::db->install_method('pg_lo_export');
 
                return $drh;
@@ -2148,6 +2149,18 @@
 Imports a Unix file as a large object and returns the object id of the new
 object or C<undef> upon failure.
 
+=item lo_import_with_oid
+
+
+  $lobjId = $dbh->pg_lo_import($filename, $OID);
+
+Same as lo_import, but attempts to use the supplied OID as the 
+large object number. If this number is 0, it falls back to the 
+behavior of lo_import (which assigns the next available OID).
+
+This is only available when DBD::Pg is compiled against a Postgres 
+server version 8.4 or later.
+
 =item lo_export
 
   $ret = $dbh->pg_lo_export($lobjId, $filename);

Modified: DBD-Pg/trunk/Pg.xs
==============================================================================
--- DBD-Pg/trunk/Pg.xs  (original)
+++ DBD-Pg/trunk/Pg.xs  Wed Jan 20 13:14:28 2010
@@ -481,6 +481,17 @@
 
 
 void
+pg_lo_import_with_oid(dbh, filename, lobjId)
+       SV * dbh
+       char * filename
+       unsigned int lobjId
+       CODE:
+               const unsigned int ret = (lobjId==0) ? pg_db_lo_import(dbh, 
filename)
+                       : pg_db_lo_import_with_oid(dbh, filename, lobjId);
+               ST(0) = (ret > 0) ? sv_2mortal(newSVuv(ret)) : &PL_sv_undef;
+
+
+void
 pg_lo_export(dbh, lobjId, filename)
        SV * dbh
        unsigned int lobjId

Modified: DBD-Pg/trunk/dbdimp.c
==============================================================================
--- DBD-Pg/trunk/dbdimp.c       (original)
+++ DBD-Pg/trunk/dbdimp.c       Wed Jan 20 13:14:28 2010
@@ -4414,6 +4414,34 @@
 }
 
 /* ================================================================== */
+unsigned int pg_db_lo_import_with_oid (SV * dbh, char * filename, unsigned int 
lobjId)
+{
+
+       Oid loid;
+       dTHX;
+       D_imp_dbh(dbh);
+
+       if (TSTART) TRC(DBILOGFP, "%sBegin pg_db_lo_import_with_oid (filename: 
%s, oid: %d)\n",
+                                       THEADER, filename, lobjId);
+
+       if (!pg_db_start_txn(aTHX_ dbh,imp_dbh))
+               return 0; /* No other option, because lo_import* returns an Oid 
*/
+
+       if (TLIBPQ) {
+               TRC(DBILOGFP, "%slo_import_with_oid\n", THEADER);
+       }
+       loid = lo_import_with_oid(imp_dbh->conn, filename, lobjId); /* 0 on 
error */
+
+       if (DBIc_has(imp_dbh, DBIcf_AutoCommit)) {
+               if (!pg_db_end_txn(aTHX_ dbh, imp_dbh, 0==loid ? 0 : 1))
+                       return 0;
+       }
+
+       return loid;
+
+}
+
+/* ================================================================== */
 int pg_db_lo_export (SV * dbh, unsigned int lobjId, char * filename)
 {
 

Modified: DBD-Pg/trunk/dbdimp.h
==============================================================================
--- DBD-Pg/trunk/dbdimp.h       (original)
+++ DBD-Pg/trunk/dbdimp.h       Wed Jan 20 13:14:28 2010
@@ -231,6 +231,8 @@
 
 unsigned int pg_db_lo_import (SV *dbh, char *filename);
 
+unsigned int pg_db_lo_import_with_oid (SV *dbh, char *filename, unsigned int 
lobjId);
+
 int pg_db_lo_export (SV *dbh, unsigned int lobjId, char *filename);
 
 int pg_db_result (SV *h, imp_dbh_t *imp_dbh);

Modified: DBD-Pg/trunk/t/03dbmethod.t
==============================================================================
--- DBD-Pg/trunk/t/03dbmethod.t (original)
+++ DBD-Pg/trunk/t/03dbmethod.t Wed Jan 20 13:14:28 2010
@@ -26,7 +26,7 @@
 if (! defined $dbh) {
        plan skip_all => 'Connection to database failed, cannot continue 
testing';
 }
-plan tests => 524;
+plan tests => 529;
 
 isnt ($dbh, undef, 'Connect to database for database handle method testing');
 
@@ -1400,12 +1400,14 @@
 ok (!$result, $t);
 $dbh->rollback();
 
+my $abctext = $pgversion >= 80500 ? 'x6162630a646566' : "abc\ndef";
+
 SKIP: {
 
        eval {
                require File::Temp;
        };
-       $@ and skip ('Must have File::Temp to test pg_lo_import and 
pg_lo_export', 8);
+       $@ and skip ('Must have File::Temp to test pg_lo_import* and 
pg_lo_export', 8);
 
        $t='DB handle method "pg_lo_import" works';
        my ($fh,$filename) = File::Temp::tmpnam();
@@ -1414,12 +1416,46 @@
        $handle = $dbh->pg_lo_import($filename);
        my $objid = $handle;
        ok ($handle, $t);
-       unlink $filename;
 
        $t='DB handle method "pg_lo_import" inserts correct data';
        $SQL = "SELECT data FROM pg_largeobject where loid = $handle";
        $info = $dbh->selectall_arrayref($SQL)->[0][0];
-       is_deeply ($info, "abc\ndef", $t);
+       is_deeply ($info, $abctext, $t);
+       $dbh->commit();
+
+  SKIP: {
+               if ($pglibversion < 80400) {
+                       skip ('Cannot test pg_lo_import_with_oid unless 
compiled against 8.4 or better server', 5);
+               }
+
+               $t='DB handle method "pg_lo_import_with_oid" works with high 
number';
+               my $highnumber = 345167;
+               $dbh->pg_lo_unlink($highnumber);
+               $dbh->commit();
+               my $thandle = $dbh->pg_lo_import_with_oid($filename, 
$highnumber);
+               is ($thandle, $highnumber, $t);
+               ok ($thandle, $t);
+
+               $t='DB handle method "pg_lo_import_with_oid" inserts correct 
data';
+               $SQL = "SELECT data FROM pg_largeobject where loid = $thandle";
+               $info = $dbh->selectall_arrayref($SQL)->[0][0];
+               is_deeply ($info, $abctext, $t);
+
+               $t='DB handle method "pg_lo_import_with_oid" fails when given 
already used number';
+               eval {
+                       $thandle = $dbh->pg_lo_import_with_oid($filename, 
$objid);
+               };
+               is ($thandle, undef, $t);
+               $dbh->rollback();
+
+               $t='DB handle method "pg_lo_import_with_oid" falls back to 
lo_import when number is 0';
+               eval {
+                       $thandle = $dbh->pg_lo_import_with_oid($filename, 0);
+               };
+               ok ($thandle, $t);
+       }
+
+       unlink $filename;
 
        $t='DB handle method "pg_lo_open" works after "pg_lo_insert"';
        $handle = $dbh->pg_lo_open($handle, $R);
@@ -1517,7 +1553,7 @@
        $sth = $dbh->prepare($SQL);
        $sth->execute($handle);
        $info = $sth->fetchall_arrayref()->[0][0];
-       is_deeply ($info, "abc\ndef", $t);
+       is_deeply ($info, $abctext, $t);
 
        $t='DB handle method "pg_lo_import" works (AutoCommit on, begin_work 
called, no command)';
        $dbh->begin_work();
@@ -1525,7 +1561,7 @@
        ok ($handle, $t);
        $sth->execute($handle);
        $info = $sth->fetchall_arrayref()->[0][0];
-       is_deeply ($info, "abc\ndef", $t);
+       is_deeply ($info, $abctext, $t);
        $dbh->rollback();
 
        $t='DB handle method "pg_lo_import" works (AutoCommit on, begin_work 
called, no command, rollback)';
@@ -1544,7 +1580,7 @@
        ok ($handle, $t);
        $sth->execute($handle);
        $info = $sth->fetchall_arrayref()->[0][0];
-       is_deeply ($info, "abc\ndef", $t);
+       is_deeply ($info, $abctext, $t);
        $dbh->rollback();
 
        $t='DB handle method "pg_lo_import" works (AutoCommit on, begin_work 
called, second command, rollback)';
@@ -1564,7 +1600,7 @@
        ok ($handle, $t);
        $sth->execute($handle);
        $info = $sth->fetchall_arrayref()->[0][0];
-       is_deeply ($info, "abc\ndef", $t);
+       is_deeply ($info, $abctext, $t);
 
        $t='DB handle method "pg_lo_import" works (AutoCommit not on, second 
command)';
        $dbh->rollback();
@@ -1573,7 +1609,7 @@
        ok ($handle, $t);
        $sth->execute($handle);
        $info = $sth->fetchall_arrayref()->[0][0];
-       is_deeply ($info, "abc\ndef", $t);
+       is_deeply ($info, $abctext, $t);
 
        unlink $filename;
        $dbh->{AutoCommit} = 1;

Reply via email to