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

Поиск
Список
Период
Сортировка
От Andrey N. Oktyabrski
Тема А lo_open вообще работает?
Дата
Msg-id 44B35C31.2060703@antora.ru
обсуждение исходный текст
Ответы Re: А lo_open вообще рабо  ("Andrey N. Oktyabrski" <ano@antora.ru>)
Список 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);
}

В списке pgsql-ru-general по дате отправления:

Предыдущее
От: "Ilia Kantor"
Дата:
Сообщение: RE: [pgsql-ru-general] Зацените типчик
Следующее
От: "Andrey N. Oktyabrski"
Дата:
Сообщение: Re: А lo_open вообще рабо