А lo_open вообще работает?

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);
}

Responses

Browse pgsql-ru-general by date

  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] Зацените типчик