diff --git a/doc/src/sgml/lobj.sgml b/doc/src/sgml/lobj.sgml index 69a21c99cf78f1bbe439168326e9bcc0091f9d04..65ac435e36ed1272c0d5a3059ea776290e8fa689 100644 --- a/doc/src/sgml/lobj.sgml +++ b/doc/src/sgml/lobj.sgml @@ -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> diff --git a/src/backend/libpq/be-fsstubs.c b/src/backend/libpq/be-fsstubs.c index 5badb97cbec94688d7df03172392bf5c7426b015..e2477a1dd14f22d9ccc41d5f7c62d5781a06d940 100644 --- a/src/backend/libpq/be-fsstubs.c +++ b/src/backend/libpq/be-fsstubs.c @@ -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; } /* diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 72afc3636010f069d4cb1e4086cf5cc02dfc7a51..7bbdbe658a1bbb1bc66bb178dae1eb82f89f61c2 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -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 diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index d1864d320d9022537990e3039f0aab5300c3945a..3aea12b838f17c7e61186e7e7af61c71c2f60dde 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -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"); diff --git a/src/include/libpq/be-fsstubs.h b/src/include/libpq/be-fsstubs.h index ca65e5bdc036250b14d5189e08da74915d5bb77e..2d5d9a8f8396d86d31e69526b9337c6c6b474dfb 100644 --- a/src/include/libpq/be-fsstubs.h +++ b/src/include/libpq/be-fsstubs.h @@ -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);