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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Загрузка файлов из БД  (Прочитано 8068 раз)
Nidxogg
Гость
« : Июль 02, 2015, 18:56 »

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

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

Записан
vitfil
Гость
« Ответ #1 : Июль 02, 2015, 21:05 »

Загружайте файлы в отдельном потоке. UI в основном потоке, работа с базой - в дополнительном.
Записан
Nidxogg
Гость
« Ответ #2 : Июль 02, 2015, 21:12 »

Цитировать
Загружайте файлы в отдельном потоке.
Каким образом?
Бинарные данные файла - результат запроса или я чего-то не понимаю?


Цитировать
работа с базой - в дополнительном
А что по обертке?
Как получить результат запроса из статьи понятно.
Грубо говоря, жму на кнопку1 делаю запрос в потоке, получаю результат. Как определить что это результат именно по кнопке1, а не 2?
« Последнее редактирование: Июль 02, 2015, 21:15 от Nidxogg » Записан
Bepec
Гость
« Ответ #3 : Июль 02, 2015, 22:52 »

Это уже проблема вашей реализации.
Вы можете возвращать номер запроса, можете возвращать номер кнопки, можете возвращать имя запрошенного файла и так далее и тому подобное. Выбирайте сами исходя из задачи и масштабов.
Записан
Nidxogg
Гость
« Ответ #4 : Июль 03, 2015, 00:01 »

А если у меня используется ±полсотни запросов? Switch на 50 вариантов выглядит как-то не очень  Непонимающий
Не хочется изобретать велосипед, чувствую что люди с опытом могут подсказать решение получше

P.S. Вопрос с загрузкой файла ещё актуален
Записан
vbv
Чайник
*
Offline Offline

Сообщений: 59


Просмотр профиля
« Ответ #5 : Июль 03, 2015, 05:23 »

А если у меня используется ±полсотни запросов? Switch на 50 вариантов выглядит как-то не очень  Непонимающий
Не хочется изобретать велосипед, чувствую что люди с опытом могут подсказать решение получше

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

Нет в анализе такого понятия как 50 вариантов.
Есть понятие 0, 1 и много.
т.о. делать поток и в попок пихать идентификатор и держать его до завершения потока.
Записан
Bepec
Гость
« Ответ #6 : Июль 03, 2015, 08:07 »

Вы можете возвращать номер запроса, можете возвращать номер кнопки, можете возвращать имя запрошенного файла и так далее и тому подобное. Выбирайте сами исходя из задачи и масштабов.
Записан
Nidxogg
Гость
« Ответ #7 : Июль 04, 2015, 13:35 »

Да это понятно
Как потом вызвать соответствующий номеру запроса обработчик?
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #8 : Июль 04, 2015, 14:09 »

Как потом вызвать соответствующий номеру запроса обработчик?
Вы на вход должны передать id записи, из которой хотите прочитать блоб, на выходе вы получите id этой записи и сам блоб. Вот по id вы его и  идентифицируете.
Записан
Nidxogg
Гость
« Ответ #9 : Июль 04, 2015, 14:40 »

 Непонимающий У меня истерика
А что мне даст этот ID записи?
Все равно в конце вставлять switch на N вариантов обработки?
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #10 : Июль 04, 2015, 14:42 »

А что мне даст этот ID записи?
Все равно в конце вставлять switch на N вариантов обработки?
Покажите/расскажите, как обрабатываете эти блобы в однопоточной версии программы.
Записан
Nidxogg
Гость
« Ответ #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 Online

Сообщений: 4349



Просмотр профиля
« Ответ #12 : Июль 04, 2015, 15:10 »

Решений может быть много: вы можете хранить пары id - action, после завершения загрузки блоба из записи с id, выполнить действие action. action может быть числом идентифицирующим действие или функтором. Можно этот action передавать потоку загрузки вместе с id записи, тогда не понадобиться коллекция пар. Много чего можно придумать.
Записан
Nidxogg
Гость
« Ответ #13 : Июль 04, 2015, 15:24 »

Пойду гуглить про функторы
спасибо

P.S. Тема пока не закрывается
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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