Posgresql Large Objects
От: dosik Россия www.dosik.ru
Дата: 15.06.17 09:25
Оценка:
Кто нибудь юзал. У меня первое знакомство не удалось, ибо код:
    Oid obj = lo_creat(conn, INV_READ | INV_WRITE);
    if (obj == 0)
        return "cannot create LO";
    int fd = lo_open(conn, obj, INV_WRITE);
    if (fd < 0)
        return "cannot open LO";
    int res = lo_write(conn, fd, data.get(), size);

вызывает ошибку в последней строчке — неверный дескриптор большого объекта. (lo_open возвращает 0)
PostgreSQL 9.6.3
Быть может это мертворожденное дитя и ни когда и не работало? Или я что-то не настроил?
Тем не менее на сколько это эффективно по сравнению с тем же файловым хранилищем или, скажем, NoSQL?
Re: Posgresql Large Objects
От: Ops Россия  
Дата: 22.06.17 21:06
Оценка: +1
Здравствуйте, dosik, Вы писали:

D>Быть может это мертворожденное дитя и ни когда и не работало? Или я что-то не настроил?


All large object manipulation using these functions must take place within an SQL transaction block, since large object file descriptors are only valid for the duration of a transaction.

Не оно? Автокоммит выключен?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: Posgresql Large Objects
От: blonduser  
Дата: 26.06.17 08:03
Оценка: +1
Здравствуйте, dosik, Вы писали:

D>Кто нибудь юзал. У меня первое знакомство не удалось, ибо код:

D>
D>    Oid obj = lo_creat(conn, INV_READ | INV_WRITE);
D>    if (obj == 0)
D>        return "cannot create LO";
D>    int fd = lo_open(conn, obj, INV_WRITE);
D>    if (fd < 0)
D>        return "cannot open LO";
D>    int res = lo_write(conn, fd, data.get(), size);
D>

D>вызывает ошибку в последней строчке — неверный дескриптор большого объекта. (lo_open возвращает 0)
D>PostgreSQL 9.6.3
D>Быть может это мертворожденное дитя и ни когда и не работало? Или я что-то не настроил?
D>Тем не менее на сколько это эффективно по сравнению с тем же файловым хранилищем или, скажем, NoSQL?

Нужно перед "lo_open" выполнить PQexec(conn, "BEGIN");
После "lo_write" выполнить PQexec(conn, "END");

И будет вам счастье.
Re[2]: Posgresql Large Objects
От: dosik Россия www.dosik.ru
Дата: 07.07.17 12:02
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>

Ops>All large object manipulation using these functions must take place within an SQL transaction block, since large object file descriptors are only valid for the duration of a transaction.

Ops>Не оно? Автокоммит выключен?

Да, оно. Спасибо.
Re[2]: Posgresql Large Objects
От: dosik Россия www.dosik.ru
Дата: 07.07.17 12:02
Оценка:
Здравствуйте, blonduser, Вы писали:

B>Нужно перед "lo_open" выполнить PQexec(conn, "BEGIN");

B>После "lo_write" выполнить PQexec(conn, "END");

B>И будет вам счастье.


Да да, именно так проблему и решил. Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.