summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuo Ishii2008-03-19 00:39:33 +0000
committerTatsuo Ishii2008-03-19 00:39:33 +0000
commitbc1a6e566a86c0c152aaf0dd9878b0724b8cd89e (patch)
treeb2391c8085a25c05d47f50df145e59ca911885d0
parent0fdf0cac52d486581c8f03bac79d8f952e38b424 (diff)
Add libpq new API lo_import_with_oid() which is similar to lo_import()
except that lob's oid can be specified.
-rw-r--r--doc/src/sgml/lobj.sgml22
-rw-r--r--src/interfaces/libpq/exports.txt1
-rw-r--r--src/interfaces/libpq/fe-lobj.c31
-rw-r--r--src/interfaces/libpq/libpq-fe.h1
4 files changed, 53 insertions, 2 deletions
diff --git a/doc/src/sgml/lobj.sgml b/doc/src/sgml/lobj.sgml
index dbabd75e1d..68cb257c7e 100644
--- a/doc/src/sgml/lobj.sgml
+++ b/doc/src/sgml/lobj.sgml
@@ -161,6 +161,28 @@ Oid lo_import(PGconn *conn, const char *filename);
the server; so it must exist in the client file system and be readable
by the client application.
</para>
+
+ <para>
+ The function
+<synopsis>
+Oid lo_import_with_oid(PGconn *conn, const char *filename, Oid lobjId);
+</synopsis>
+ <indexterm><primary>lo_import_with_oid</></>
+ also imports a new large object. The OID to be assigned can be
+ specified by <replaceable class="parameter">lobjId</replaceable>;
+ if so, failure occurs if that OID is already in use for some large
+ object. If <replaceable class="parameter">lobjId</replaceable>
+ is <symbol>InvalidOid</symbol> (zero) then <function>lo_import_with_oid</> assigns an unused
+ OID (this is the same behavior as <function>lo_import</>).
+ The return value is the OID that was assigned to the new large object,
+ or <symbol>InvalidOid</symbol> (zero) on failure.
+ </para>
+
+ <para>
+ <function>lo_import_with_oid</> is new as of <productname>PostgreSQL</productname>
+ 8.4 and uses <function>lo_create</function> internally which is new in 8.1; if this function is run against 8.0 or before, it will
+ fail and return <symbol>InvalidOid</symbol>.
+ </para>
</sect2>
<sect2>
diff --git a/src/interfaces/libpq/exports.txt b/src/interfaces/libpq/exports.txt
index d9951b2650..b8bd30098e 100644
--- a/src/interfaces/libpq/exports.txt
+++ b/src/interfaces/libpq/exports.txt
@@ -140,3 +140,4 @@ lo_truncate 137
PQconnectionUsedPassword 138
pg_valid_server_encoding_id 139
PQconnectionNeedsPassword 140
+lo_import_with_oid 141
diff --git a/src/interfaces/libpq/fe-lobj.c b/src/interfaces/libpq/fe-lobj.c
index e14c9d659f..5609cf03e2 100644
--- a/src/interfaces/libpq/fe-lobj.c
+++ b/src/interfaces/libpq/fe-lobj.c
@@ -41,6 +41,8 @@
static int lo_initialize(PGconn *conn);
+static Oid
+lo_import_internal(PGconn *conn, const char *filename, const Oid oid);
/*
* lo_open
@@ -484,6 +486,27 @@ lo_unlink(PGconn *conn, Oid lobjId)
Oid
lo_import(PGconn *conn, const char *filename)
{
+ return lo_import_internal(conn, filename, InvalidOid);
+}
+
+/*
+ * lo_import_with_oid -
+ * imports a file as an (inversion) large object.
+ * large object id can be specified.
+ *
+ * returns the oid of that object upon success,
+ * returns InvalidOid upon failure
+ */
+
+Oid
+lo_import_with_oid(PGconn *conn, const char *filename, Oid lobjId)
+{
+ return lo_import_internal(conn, filename, lobjId);
+}
+
+static Oid
+lo_import_internal(PGconn *conn, const char *filename, Oid oid)
+{
int fd;
int nbytes,
tmp;
@@ -507,10 +530,14 @@ lo_import(PGconn *conn, const char *filename)
/*
* create an inversion object
*/
- lobjOid = lo_creat(conn, INV_READ | INV_WRITE);
+ if (oid == InvalidOid)
+ lobjOid = lo_creat(conn, INV_READ | INV_WRITE);
+ else
+ lobjOid = lo_create(conn, oid);
+
if (lobjOid == InvalidOid)
{
- /* we assume lo_creat() already set a suitable error message */
+ /* we assume lo_create() already set a suitable error message */
(void) close(fd);
return InvalidOid;
}
diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h
index 0d33488615..d7eca2fa23 100644
--- a/src/interfaces/libpq/libpq-fe.h
+++ b/src/interfaces/libpq/libpq-fe.h
@@ -495,6 +495,7 @@ extern int lo_tell(PGconn *conn, int fd);
extern int lo_truncate(PGconn *conn, int fd, size_t len);
extern int lo_unlink(PGconn *conn, Oid lobjId);
extern Oid lo_import(PGconn *conn, const char *filename);
+extern Oid lo_import_with_oid(PGconn *conn, const char *filename, Oid lobjId);
extern int lo_export(PGconn *conn, Oid lobjId, const char *filename);
/* === in fe-misc.c === */