Здравствуйте.
Нужна простая функция - перегнать 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);
}