From: | "Andrey N(dot) Oktyabrski" <ano(at)antora(dot)ru> |
---|---|
To: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | А lo_open вообще работает? |
Date: | 2006-07-11 08:07:13 |
Message-ID: | 44B35C31.2060703@antora.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-ru-general |
Здравствуйте.
Нужна простая функция - перегнать LO в bytea. Пробовал её написать на
plpgsql, пробовал просто select lo_open(12345) в psql, попробовал уже
через SPI сделать - везде одинаковый результат: lo_open всегда ноль.
Хотя lo_import/lo_export/lo_unlink работают. Подскажите что не так делаю.
Или есть более цивилизованный способ?
#include "postgres.h"
/* Required for largeobjects */
#include "libpq/libpq-fs.h"
#include "libpq/be-fsstubs.h"
/* Required for SPI */
#include "executor/spi.h"
Datum lo2bytea(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(lo2bytea);
Datum lo2bytea(PG_FUNCTION_ARGS) {
Datum oid = PG_GETARG_DATUM(0);
bytea* res = NULL;
int fd = 0;
size_t sz = 0;
char lobuf[8192];
fd = DatumGetInt32(DirectFunctionCall2(lo_open, oid,
Int32GetDatum(INV_READ)));
if (!fd) PG_RETURN_NULL();
res = (bytea*)palloc(VARHDRSZ);
VARATT_SIZEP(res) = VARHDRSZ;
while (sz = lo_read(fd, lobuf, 8192)) {
res = (bytea*)repalloc(res, VARATT_SIZEP(res) + sz);
memcpy(res + VARATT_SIZEP(res), lobuf, sz);
VARATT_SIZEP(res) += sz;
}
PG_RETURN_BYTEA_P(res);
}
From | Date | Subject | |
---|---|---|---|
Next Message | Andrey N. Oktyabrski | 2006-07-11 08:54:11 | Re: А lo_open вообще рабо |
Previous Message | Ilia Kantor | 2006-07-09 09:25:23 | RE: [pgsql-ru-general] Зацените типчик |