Russian Qt Forum
Март 28, 2024, 12:49
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Базы данных
>
Загрузка файлов из БД
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Загрузка файлов из БД (Прочитано 8068 раз)
Nidxogg
Гость
Загрузка файлов из БД
«
:
Июль 02, 2015, 18:56 »
Добрый день
Прошу подсказать пути решения следующей задачи:
есть БД postgresql, в которой, в виде BLOB-oв хранятся файла большого размера(от 100мб и выше)
Собственно, БД я использую однопоточно и загрузка файла приводит к замираю программы на длительное время.
1)Хотелось бы, чтобы файл загружался в фоновом режиме. Просьба подсказать возможные пути решения проблемы
Кое что нагуглил в виде статьи
http://www.linuxjournal.com/article/9602
и вроде даже работает, но загружаемые файлы (и информацию о них) необходимо обрабатывать разными способами.
2)Как можно модифицировать пример из статьи, чтобы оставить 1 объект подключения к БД, но иметь возможность идентифицировать на какой запрос пришел соответствующий результат?
Записан
vitfil
Гость
Re: Загрузка файлов из БД
«
Ответ #1 :
Июль 02, 2015, 21:05 »
Загружайте файлы в отдельном потоке. UI в основном потоке, работа с базой - в дополнительном.
Записан
Nidxogg
Гость
Re: Загрузка файлов из БД
«
Ответ #2 :
Июль 02, 2015, 21:12 »
Цитировать
Загружайте файлы в отдельном потоке.
Каким образом?
Бинарные данные файла - результат запроса или я чего-то не понимаю?
Цитировать
работа с базой - в дополнительном
А что по обертке?
Как получить результат запроса из статьи понятно.
Грубо говоря, жму на кнопку1 делаю запрос в потоке, получаю результат. Как определить что это результат именно по кнопке1, а не 2?
«
Последнее редактирование: Июль 02, 2015, 21:15 от Nidxogg
»
Записан
Bepec
Гость
Re: Загрузка файлов из БД
«
Ответ #3 :
Июль 02, 2015, 22:52 »
Это уже проблема вашей реализации.
Вы можете возвращать номер запроса, можете возвращать номер кнопки, можете возвращать имя запрошенного файла и так далее и тому подобное. Выбирайте сами исходя из задачи и масштабов.
Записан
Nidxogg
Гость
Re: Загрузка файлов из БД
«
Ответ #4 :
Июль 03, 2015, 00:01 »
А если у меня используется ±полсотни запросов? Switch на 50 вариантов выглядит как-то не очень
Не хочется изобретать велосипед, чувствую что люди с опытом могут подсказать решение получше
P.S. Вопрос с загрузкой файла ещё актуален
Записан
vbv
Чайник
Offline
Сообщений: 59
Re: Загрузка файлов из БД
«
Ответ #5 :
Июль 03, 2015, 05:23 »
Цитата: Nidxogg от Июль 03, 2015, 00:01
А если у меня используется ±полсотни запросов? Switch на 50 вариантов выглядит как-то не очень
Не хочется изобретать велосипед, чувствую что люди с опытом могут подсказать решение получше
P.S. Вопрос с загрузкой файла ещё актуален
Нет в анализе такого понятия как 50 вариантов.
Есть понятие 0, 1 и много.
т.о. делать поток и в попок пихать идентификатор и держать его до завершения потока.
Записан
Bepec
Гость
Re: Загрузка файлов из БД
«
Ответ #6 :
Июль 03, 2015, 08:07 »
Цитата: Bepec от Июль 02, 2015, 22:52
Вы можете возвращать
номер запроса
,
можете возвращать номер кнопки, можете возвращать имя запрошенного файла и так далее и тому подобное
. Выбирайте сами исходя из задачи и масштабов.
Записан
Nidxogg
Гость
Re: Загрузка файлов из БД
«
Ответ #7 :
Июль 04, 2015, 13:35 »
Да это понятно
Как потом вызвать соответствующий номеру запроса обработчик?
Записан
Old
Джедай : наставник для всех
Online
Сообщений: 4349
Re: Загрузка файлов из БД
«
Ответ #8 :
Июль 04, 2015, 14:09 »
Цитата: Nidxogg от Июль 04, 2015, 13:35
Как потом вызвать соответствующий номеру запроса обработчик?
Вы на вход должны передать id записи, из которой хотите прочитать блоб, на выходе вы получите id этой записи и сам блоб. Вот по id вы его и идентифицируете.
Записан
Nidxogg
Гость
Re: Загрузка файлов из БД
«
Ответ #9 :
Июль 04, 2015, 14:40 »
У меня истерика
А что мне даст этот ID записи?
Все равно в конце вставлять switch на N вариантов обработки?
Записан
Old
Джедай : наставник для всех
Online
Сообщений: 4349
Re: Загрузка файлов из БД
«
Ответ #10 :
Июль 04, 2015, 14:42 »
Цитата: Nidxogg от Июль 04, 2015, 14:40
А что мне даст этот ID записи?
Все равно в конце вставлять switch на N вариантов обработки?
Покажите/расскажите, как обрабатываете эти блобы в однопоточной версии программы.
Записан
Nidxogg
Гость
Re: Загрузка файлов из БД
«
Ответ #11 :
Июль 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, указав загруженный файл параметром и т.д
Записан
Old
Джедай : наставник для всех
Online
Сообщений: 4349
Re: Загрузка файлов из БД
«
Ответ #12 :
Июль 04, 2015, 15:10 »
Решений может быть много: вы можете хранить пары id - action, после завершения загрузки блоба из записи с id, выполнить действие action. action может быть числом идентифицирующим действие или функтором. Можно этот action передавать потоку загрузки вместе с id записи, тогда не понадобиться коллекция пар. Много чего можно придумать.
Записан
Nidxogg
Гость
Re: Загрузка файлов из БД
«
Ответ #13 :
Июль 04, 2015, 15:24 »
Пойду гуглить про функторы
спасибо
P.S. Тема пока не закрывается
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...