Russian Qt Forum
Ноябрь 23, 2024, 07:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: работа с BLOB-ами  (Прочитано 5377 раз)
sector
Гость
« : Декабрь 14, 2005, 06:29 »

Подскажите плиз каким образом при работе с BLOB (lo_import и lo_export) обойтись без создания темповых файлов???
т.е в базе лежит картинка и надо ее вывести на экран без lo_export(name_file)Непонимающий
Заранее спасибо.
:? :? :?
Записан
sector
Гость
« Ответ #1 : Декабрь 20, 2005, 07:17 »

Ура почти разобрался))) правда через пятую точку)))
Приходится делать еще один коннект через стандартный интерфейс поставляемый postgres(((
Как подцепится через QSqlDatabase пока не знаю. Может кто подскажет.....
Вообщем после долгого капания в нете нашел одну ссылку http://archives.postgresql.org/pgsql-general/2003-03/msg00989.php
где находится полная реализация!!! Мучает один вопрос - почему это не реализовано в QT???

Мне в принципе понадобилась только одна функция - немного подкорректировал и вот ....
Код:

#include <libpq-fe.h>
#include <pgsql/libpq/libpq-fs.h>

. . .

QByteArray picWidget::readBlob(int oid)
{
PGconn *db;
PGresult *res;
db = PQconnectdb("host=localhost port=5432 dbname=mydb user=name_user password=pass");
    if(PQstatus(db) != CONNECTION_OK)
    QMessageBox::warning(this, QObject::tr("Невозможно открыть БАЗУ ДАННЫХ"), QObject::tr("???"));

QByteArray ba;
res = PQexec(db, "begin");
PQclear(res);
int fd = lo_open(db, oid, INV_READ);
if (fd < 0)
{
qWarning( "QPGSQLResult::readBlob: unable to open large object for read" );
return ba;
}

int size = 0;
int retval = lo_lseek(db, fd, 0L, SEEK_END);
if (retval >= 0)
{
        size = lo_tell(db, fd);
lo_lseek(db, fd, 0L, SEEK_SET);
}
if (size == 0)
{
lo_close(db, fd);
return ba;
}
char *buf = new char[size];

retval = lo_read(db, fd, buf, size);

if (retval < 0)
{
qWarning( "QPGSQLDriver::readBlob: unable to read large object" );
}
else
{
ba = QByteArray(buf, size);
}
delete [] buf;
lo_close(db, fd);
res = PQexec(db, "end");
PQclear(res);
PQfinish(db);
return ba;
}


... оно работает!!!!
Записан
Dendy
Гость
« Ответ #2 : Декабрь 20, 2005, 09:47 »

Може у цій задачі є труднощі з кросовостю між різними БД.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 20.