Pobieranie danych XML i wrzucenie ich do bazy danych po przetworzeniu

0

Cześć,

tworzę aplikację w QT/C++, która musi pobierać raz na jakiś czas pewne dane XMLowe wystawiane na stronie. Problem w tym, że są one w kilku plikach, więc muszę pobrać każdy z nich osobno i wyciągnąć
to, co mnie interesuje i wrzucić do bazy (sqlite). Dalsze operacje na danych będą już wykonywane z użyciem bazy danych.

Mam teraz następujące pytania.
Dane pobieram wykorzystując klasę QNetworkAccessManager, zastanawiam się czy mogę użyć tego samego obiektu by pobrać wszystkie dane w taki sposób jak poniżej?

void MainWindow::on_update_data_clicked()
{
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(process_data(QNetworkReply*)));
            
    manager->get(QNetworkRequest(QUrl("http://website.com/api/file1.xml")));
    manager->get(QNetworkRequest(QUrl("http://website.com/api/file2.xml")));
    manager->get(QNetworkRequest(QUrl("http://website.com/api/file3.xml")));
    manager->get(QNetworkRequest(QUrl("http://website.com/api/file4.xml")));
    
}

void MainWindow::process_data(QNetworkReply *reply)
{
    //jakies przetwarzanie odpowiedzi
}

Czy to jest bezpieczne? Na przykład w momencie, gdy dane z *file1 *bedą jeszcze przetwarzane w metodzie process_data, a zostaną już pobrane dane *file2 *i metoda process_data zostanie wywołana kolejny raz.
Jak odróżnić w process_data, który plik przetwarzać, bo każdy z plików jest inny? Czy lepiej stworzyć 4 obiekty QNetworkAccessManager i jakiegoś enuma identyfikującego dany manager i przekazywać informacje o tym do metody process_data?
W jaki sposób najlepiej trzymać dane wyciągnięte z XMLi przed wrzuceniem ich do bazy? Powiedzmy, że z kilku XMLi wyciągam dane, które trafią do jednej tabeli w bazie. Będzie to np. jakes 1-2k rekorów. Myślałem by stworzyć sobie własny kontener na wektorach i tam je przechowywać przed wykonaniem zapytania do bazy.

Dzięki za wskazówki.

0
  1. Możesz sprawdzić w QNetworkReply::request() na jaki request (a więc i url) dostałeś odpowiedź.
  2. Jeśli nie bawisz się w wielowątkowość samodzielnie (a raczej tego nie robisz, skoro do MainWindow podpinasz logikę) to nie masz się co martwić o jednoczesne wywołanie process_data - wszystko zostanie sekwencyjnie wywołane przez event loopa.
  3. Używaj nowego syntaxu connect - tak jest bezpieczniej.
  4. Pamiętaj aby zwolnić reply
  5. Do XML użyj czego chcesz (QXmlStreamReader albo Boost.PropertyTree pierwsze przychodzą na myśl)
  6. Dane trzymaj najlepiej w wektorze/innym kontenerze (ale domyślnie wektorze) struktur - tak powinno być czytelnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1