diff options
author | Tatsuo Ishii | 2008-03-19 00:39:33 +0000 |
---|---|---|
committer | Tatsuo Ishii | 2008-03-19 00:39:33 +0000 |
commit | bc1a6e566a86c0c152aaf0dd9878b0724b8cd89e (patch) | |
tree | b2391c8085a25c05d47f50df145e59ca911885d0 | |
parent | 0fdf0cac52d486581c8f03bac79d8f952e38b424 (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.sgml | 22 | ||||
-rw-r--r-- | src/interfaces/libpq/exports.txt | 1 | ||||
-rw-r--r-- | src/interfaces/libpq/fe-lobj.c | 31 | ||||
-rw-r--r-- | src/interfaces/libpq/libpq-fe.h | 1 |
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 === */ |