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