Russian Qt Forum

Qt => Базы данных => Тема начата: Nidxogg от Июль 02, 2015, 18:56



Название: Загрузка файлов из БД
Отправлено: Nidxogg от Июль 02, 2015, 18:56
Добрый день
Прошу подсказать пути решения следующей задачи:
есть БД postgresql, в которой, в виде BLOB-oв хранятся файла большого размера(от 100мб и выше)
Собственно, БД я использую однопоточно и загрузка файла приводит к замираю программы на длительное время.
1)Хотелось бы, чтобы файл загружался в фоновом режиме. Просьба подсказать возможные пути решения проблемы

Кое что нагуглил в виде статьи http://www.linuxjournal.com/article/9602 и вроде даже работает, но загружаемые файлы (и информацию о них) необходимо обрабатывать разными способами.
2)Как можно модифицировать пример из статьи, чтобы оставить 1 объект подключения к БД, но иметь возможность идентифицировать на какой запрос пришел соответствующий результат?



Название: Re: Загрузка файлов из БД
Отправлено: vitfil от Июль 02, 2015, 21:05
Загружайте файлы в отдельном потоке. UI в основном потоке, работа с базой - в дополнительном.


Название: Re: Загрузка файлов из БД
Отправлено: Nidxogg от Июль 02, 2015, 21:12
Цитировать
Загружайте файлы в отдельном потоке.
Каким образом?
Бинарные данные файла - результат запроса или я чего-то не понимаю?


Цитировать
работа с базой - в дополнительном
А что по обертке?
Как получить результат запроса из статьи понятно.
Грубо говоря, жму на кнопку1 делаю запрос в потоке, получаю результат. Как определить что это результат именно по кнопке1, а не 2?


Название: Re: Загрузка файлов из БД
Отправлено: Bepec от Июль 02, 2015, 22:52
Это уже проблема вашей реализации.
Вы можете возвращать номер запроса, можете возвращать номер кнопки, можете возвращать имя запрошенного файла и так далее и тому подобное. Выбирайте сами исходя из задачи и масштабов.


Название: Re: Загрузка файлов из БД
Отправлено: Nidxogg от Июль 03, 2015, 00:01
А если у меня используется ±полсотни запросов? Switch на 50 вариантов выглядит как-то не очень  ???
Не хочется изобретать велосипед, чувствую что люди с опытом могут подсказать решение получше

P.S. Вопрос с загрузкой файла ещё актуален


Название: Re: Загрузка файлов из БД
Отправлено: vbv от Июль 03, 2015, 05:23
А если у меня используется ±полсотни запросов? Switch на 50 вариантов выглядит как-то не очень  ???
Не хочется изобретать велосипед, чувствую что люди с опытом могут подсказать решение получше

P.S. Вопрос с загрузкой файла ещё актуален

Нет в анализе такого понятия как 50 вариантов.
Есть понятие 0, 1 и много.
т.о. делать поток и в попок пихать идентификатор и держать его до завершения потока.


Название: Re: Загрузка файлов из БД
Отправлено: Bepec от Июль 03, 2015, 08:07
Вы можете возвращать номер запроса, можете возвращать номер кнопки, можете возвращать имя запрошенного файла и так далее и тому подобное. Выбирайте сами исходя из задачи и масштабов.


Название: Re: Загрузка файлов из БД
Отправлено: Nidxogg от Июль 04, 2015, 13:35
Да это понятно
Как потом вызвать соответствующий номеру запроса обработчик?


Название: Re: Загрузка файлов из БД
Отправлено: Old от Июль 04, 2015, 14:09
Как потом вызвать соответствующий номеру запроса обработчик?
Вы на вход должны передать id записи, из которой хотите прочитать блоб, на выходе вы получите id этой записи и сам блоб. Вот по id вы его и  идентифицируете.


Название: Re: Загрузка файлов из БД
Отправлено: Nidxogg от Июль 04, 2015, 14:40
 ??? У меня истерика
А что мне даст этот ID записи?
Все равно в конце вставлять switch на N вариантов обработки?


Название: Re: Загрузка файлов из БД
Отправлено: Old от Июль 04, 2015, 14:42
А что мне даст этот ID записи?
Все равно в конце вставлять switch на N вариантов обработки?
Покажите/расскажите, как обрабатываете эти блобы в однопоточной версии программы.


Название: Re: Загрузка файлов из БД
Отправлено: Nidxogg от Июль 04, 2015, 14:54
Собственно есть куча кнопок и соответствующие им слоты
В каждом из слотов делаю запрос, (к примеру по кнопке запросить документ)
Код:
        QSqlQuery qSelect;
        qSelect.prepare("SELECT content FROM doc_table WHERE id = :id_doc");
        qSelect.bindValue(":id_doc",id_docemny);
        qSelect.exec();
        if(qSelect.first){
        QByteArray ba = qSelect.record().field("content").value().toByteArray();
            QString filePath = QDir::tempPath();
            QFile f(filePath+"/"+qSelect.record().field("file_name").value().toString());
            f.open(QIODevice::WriteOnly);
            f.write(ba.fromBase64(ba));
            f.flush();
            f.close();
        }
        //Тут действия для каждого слота
        ....

Действия разные, открыть файл, запустить другие программы через QProcess, указав загруженный файл параметром и т.д


Название: Re: Загрузка файлов из БД
Отправлено: Old от Июль 04, 2015, 15:10
Решений может быть много: вы можете хранить пары id - action, после завершения загрузки блоба из записи с id, выполнить действие action. action может быть числом идентифицирующим действие или функтором. Можно этот action передавать потоку загрузки вместе с id записи, тогда не понадобиться коллекция пар. Много чего можно придумать.


Название: Re: Загрузка файлов из БД
Отправлено: Nidxogg от Июль 04, 2015, 15:24
Пойду гуглить про функторы
спасибо

P.S. Тема пока не закрывается