Add server side lo_import(filename, oid) function.
authorTatsuo Ishii <ishii@postgresql.org>
Sat, 22 Mar 2008 01:55:14 +0000 (01:55 +0000)
committerTatsuo Ishii <ishii@postgresql.org>
Sat, 22 Mar 2008 01:55:14 +0000 (01:55 +0000)
doc/src/sgml/lobj.sgml
src/backend/libpq/be-fsstubs.c
src/include/catalog/catversion.h
src/include/catalog/pg_proc.h
src/include/libpq/be-fsstubs.h

index 69a21c99cf78f1bbe439168326e9bcc0091f9d04..65ac435e36ed1272c0d5a3059ea776290e8fa689 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/lobj.sgml,v 1.47 2008/03/19 00:39:33 ishii Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/lobj.sgml,v 1.48 2008/03/22 01:55:14 ishii Exp $ -->
 
  <chapter id="largeObjects">
   <title id="largeObjects-title">Large Objects</title>
@@ -422,6 +422,9 @@ SELECT lo_unlink(173454);  -- deletes large object with OID 173454
 INSERT INTO image (name, raster)
     VALUES ('beautiful image', lo_import('/etc/motd'));
 
+INSERT INTO image (name, raster)  -- same as above, but specify OID to use
+    VALUES ('beautiful image', lo_import('/etc/motd', 68583));
+
 SELECT lo_export(image.raster, '/tmp/motd') FROM image
     WHERE name = 'beautiful image';
 </programlisting>
index 5badb97cbec94688d7df03172392bf5c7426b015..e2477a1dd14f22d9ccc41d5f7c62d5781a06d940 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/libpq/be-fsstubs.c,v 1.87 2008/01/01 19:45:49 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/libpq/be-fsstubs.c,v 1.88 2008/03/22 01:55:14 ishii Exp $
  *
  * NOTES
  *       This should be moved to a more appropriate place.  It is here
@@ -79,6 +79,7 @@ static MemoryContext fscxt = NULL;
 
 static int     newLOfd(LargeObjectDesc *lobjCookie);
 static void deleteLOfd(int fd);
+static Oid lo_import_internal(text *filename, Oid lobjOid);
 
 
 /*****************************************************************************
@@ -320,14 +321,34 @@ Datum
 lo_import(PG_FUNCTION_ARGS)
 {
        text       *filename = PG_GETARG_TEXT_P(0);
+
+       PG_RETURN_OID(lo_import_internal(filename, InvalidOid));
+}
+
+/*
+ * lo_import_with_oid -
+ *       imports a file as an (inversion) large object specifying oid.
+ */
+Datum
+lo_import_with_oid(PG_FUNCTION_ARGS)
+{
+       text       *filename = PG_GETARG_TEXT_P(0);
+       Oid                oid = PG_GETARG_OID(1);
+
+       PG_RETURN_OID(lo_import_internal(filename, oid));
+}
+
+static Oid
+lo_import_internal(text *filename, Oid lobjOid)
+{
        File            fd;
        int                     nbytes,
                                tmp;
        char            buf[BUFSIZE];
        char            fnamebuf[MAXPGPATH];
        LargeObjectDesc *lobj;
-       Oid                     lobjOid;
-
+       Oid     oid;
+       
 #ifndef ALLOW_DANGEROUS_LO_FUNCTIONS
        if (!superuser())
                ereport(ERROR,
@@ -356,12 +377,12 @@ lo_import(PG_FUNCTION_ARGS)
        /*
         * create an inversion object
         */
-       lobjOid = inv_create(InvalidOid);
+       oid = inv_create(lobjOid);
 
        /*
         * read in from the filesystem and write to the inversion object
         */
-       lobj = inv_open(lobjOid, INV_WRITE, fscxt);
+       lobj = inv_open(oid, INV_WRITE, fscxt);
 
        while ((nbytes = FileRead(fd, buf, BUFSIZE)) > 0)
        {
@@ -378,7 +399,7 @@ lo_import(PG_FUNCTION_ARGS)
        inv_close(lobj);
        FileClose(fd);
 
-       PG_RETURN_OID(lobjOid);
+       return oid;
 }
 
 /*
index 72afc3636010f069d4cb1e4086cf5cc02dfc7a51..7bbdbe658a1bbb1bc66bb178dae1eb82f89f61c2 100644 (file)
@@ -37,7 +37,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.442 2008/03/10 13:53:35 mha Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.443 2008/03/22 01:55:14 ishii Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     200803101
+#define CATALOG_VERSION_NO     200803221
 
 #endif
index d1864d320d9022537990e3039f0aab5300c3945a..3aea12b838f17c7e61186e7e7af61c71c2f60dde 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.482 2008/01/01 19:45:57 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.483 2008/03/22 01:55:14 ishii Exp $
  *
  * NOTES
  *       The script catalog/genbki.sh reads this file and generates .bki
@@ -1027,6 +1027,8 @@ DESCR("storage manager");
 
 DATA(insert OID = 764 (  lo_import                PGNSP PGUID 12 1 0 f f t f v 1 26 "25" _null_ _null_ _null_  lo_import - _null_ _null_ ));
 DESCR("large object import");
+DATA(insert OID = 767 (  lo_import                PGNSP PGUID 12 1 0 f f t f v 2 26 "25 26" _null_ _null_ _null_       lo_import_with_oid - _null_ _null_ ));
+DESCR("large object import");
 DATA(insert OID = 765 (  lo_export                PGNSP PGUID 12 1 0 f f t f v 2 23 "26 25" _null_ _null_ _null_ lo_export - _null_ _null_ ));
 DESCR("large object export");
 
index ca65e5bdc036250b14d5189e08da74915d5bb77e..2d5d9a8f8396d86d31e69526b9337c6c6b474dfb 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/libpq/be-fsstubs.h,v 1.30 2008/01/01 19:45:58 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/libpq/be-fsstubs.h,v 1.31 2008/03/22 01:55:14 ishii Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -20,6 +20,7 @@
  * LO functions available via pg_proc entries
  */
 extern Datum lo_import(PG_FUNCTION_ARGS);
+extern Datum lo_import_with_oid(PG_FUNCTION_ARGS);
 extern Datum lo_export(PG_FUNCTION_ARGS);
 
 extern Datum lo_creat(PG_FUNCTION_ARGS);