|From:||Tatsuo Ishii <ishii(at)postgresql(dot)org>|
|Cc:||tgl(at)sss(dot)pgh(dot)pa(dot)us, anzai(at)sraoss(dot)co(dot)jp, nagata(at)sraoss(dot)co(dot)jp|
|Subject:||Re: 64-bit API for large object|
|Views:||Raw Message | Whole Thread | Download mbox | Resend email|
Ok, here is the patch to implement 64-bit API for large object, to
allow to use up to 4TB large objects(or 16TB if BLCKSZ changed to
32KB). The patch is based on Jeremy Drake's patch posted on September
and reasonably updated/edited to adopt PostgreSQL 9.3 by Nozomi Anzai
for the backend part and Yugo Nagata for the rest(including
Here are changes made in the patch:
1) Frontend lo_* libpq functions(fe-lobj.c)(Yugo Nagata)
lo_initialize() gathers backend 64-bit large object handling
function's oid, namely lo_lseek64, lo_tell64, lo_truncate64.
If client calls lo_*64 functions and backend does not support them,
lo_*64 functions return error to caller. There might be an argument
since calls to lo_*64 functions can automatically be redirected to
32-bit older API. I don't know this is worth the trouble though.
Currently lo_initialize() throws an error if one of oids are not
available. I doubt we do the same way for 64-bit functions since this
will make 9.3 libpq unable to access large objects stored in pre-9.2
To pass 64-bit integer to PQfn, PQArgBlock is used like this: int *ptr
is a pointer to 64-bit integer and actual data is placed somewhere
else. There might be other way: add new member to union u to store
int *ptr; /* can't use void (dec compiler barfs) */
int64 bigint; /* 64-bit integer */
I'm a little bit worried about this way because PQArgBlock is a public
Also we add new type "pg_int64":
#define HAVE_PG_INT64 1
typedef long long int pg_int64;
in postgres_ext.h per suggestion from Tom Lane:
2) Backend lo_* functions (be-fsstubs.c)(Nozomi Anzai)
Add lo_lseek64, lo_tell64, lo_truncate64 so that they can handle
64-bit seek position and data length. loread64 and lowrite64 are not
added because if a program tries to read/write more than 2GB at once,
it would be a sign that the program need to be re-designed anyway.
3) Backend inv_api.c functions(Nozomi Anzai)
No need to add new functions. Just extend them to handle 64-bit data.
BTW , what will happen if older 32-bit libpq accesses large objects
lo_read and lo_write: they can read or write lobjs using 32-bit API as
long as requested read/write data length is smaller than 2GB. So I
think we can safely allow them to access over 2GB lobjs.
lo_lseek: again as long as requested offset is smaller than 2GB, there
would be no problem.
lo_tell:if current seek position is beyond 2GB, returns an error.
4) src/test/examples/testlo64.c added for 64-bit API example(Yugo Nagata)
|Next Message||Dan Scott||2012-09-11 03:59:18||Doc typo: lexems -> lexemes|
|Previous Message||Bruce Momjian||2012-09-11 02:17:23||Re: Draft release notes complete|