Here is the proposed patches. If there's no objection, I will commit(or Shall I wait for next "commit festa"?).
Note that I decide to use lo_import_with_oid, but the signature is changed(the second and the third arguments are swapped because it seems more natural). -- Tatsuo Ishii SRA OSS, Inc. Japan > I would like to propose new large object client side API for 8.4. > > Currently we have: > > Oid lo_import(PGconn *conn, const char *filename); > > But we do not have an API which imports a large object specifying the > object id. This is inconvenient and inconsistent since we already have > lo_create() and lo_open() which allow to specify the large object id. > > So I propose to add new API: > > int lo_import_with_oid(PGconn *conn, Oid lobjId, const char > *filename); > > Another idea is changing the signature of lo_import: > > Oid lo_import(PGconn *conn, Oid lobjId, const char *filename); > > which will be cleaner but break the backward compatibility. > > Comments are welcome. > -- > Tatsuo Ishii > SRA OSS, Inc. Japan > > -- > Sent via pgsql-hackers mailing list ([EMAIL PROTECTED]) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-hackers
? src/interfaces/libpq/exports.list ? src/interfaces/libpq/libpq.so.5.2 Index: doc/src/sgml/lobj.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/lobj.sgml,v retrieving revision 1.46 diff -c -r1.46 lobj.sgml *** doc/src/sgml/lobj.sgml 14 Mar 2007 00:15:26 -0000 1.46 --- doc/src/sgml/lobj.sgml 18 Mar 2008 01:02:10 -0000 *************** *** 161,166 **** --- 161,188 ---- 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> Index: src/interfaces/libpq/exports.txt =================================================================== RCS file: /cvsroot/pgsql/src/interfaces/libpq/exports.txt,v retrieving revision 1.18 diff -c -r1.18 exports.txt *** src/interfaces/libpq/exports.txt 9 Dec 2007 19:01:40 -0000 1.18 --- src/interfaces/libpq/exports.txt 18 Mar 2008 01:02:10 -0000 *************** *** 140,142 **** --- 140,143 ---- PQconnectionUsedPassword 138 pg_valid_server_encoding_id 139 PQconnectionNeedsPassword 140 + lo_import_with_oid 141 Index: src/interfaces/libpq/fe-lobj.c =================================================================== RCS file: /cvsroot/pgsql/src/interfaces/libpq/fe-lobj.c,v retrieving revision 1.64 diff -c -r1.64 fe-lobj.c *** src/interfaces/libpq/fe-lobj.c 1 Jan 2008 19:46:00 -0000 1.64 --- src/interfaces/libpq/fe-lobj.c 18 Mar 2008 01:02:11 -0000 *************** *** 41,46 **** --- 41,48 ---- static int lo_initialize(PGconn *conn); + static Oid + lo_import_internal(PGconn *conn, const char *filename, const Oid oid); /* * lo_open *************** *** 484,489 **** --- 486,512 ---- 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,516 **** /* * create an inversion object */ ! lobjOid = lo_creat(conn, INV_READ | INV_WRITE); if (lobjOid == InvalidOid) { ! /* we assume lo_creat() already set a suitable error message */ (void) close(fd); return InvalidOid; } --- 530,543 ---- /* * create an inversion object */ ! if (oid == InvalidOid) ! lobjOid = lo_creat(conn, INV_READ | INV_WRITE); ! else ! lobjOid = lo_create(conn, oid); ! if (lobjOid == InvalidOid) { ! /* we assume lo_create() already set a suitable error message */ (void) close(fd); return InvalidOid; } Index: src/interfaces/libpq/libpq-fe.h =================================================================== RCS file: /cvsroot/pgsql/src/interfaces/libpq/libpq-fe.h,v retrieving revision 1.141 diff -c -r1.141 libpq-fe.h *** src/interfaces/libpq/libpq-fe.h 1 Jan 2008 19:46:00 -0000 1.141 --- src/interfaces/libpq/libpq-fe.h 18 Mar 2008 01:02:12 -0000 *************** *** 495,500 **** --- 495,501 ---- 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 === */
-- Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-patches