From 56931c2e278c35ee7a5405529221c1864b068af4 Mon Sep 17 00:00:00 2001 From: Martin Brodbeck Date: Fri, 10 Aug 2018 15:15:29 +0200 Subject: [PATCH] drastically improve performance for loading sales --- src/core/database.cpp | 48 +++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/src/core/database.cpp b/src/core/database.cpp index 348a8c2..59e8615 100644 --- a/src/core/database.cpp +++ b/src/core/database.cpp @@ -608,6 +608,7 @@ unsigned int Database::loadSales(std::vector>& sales, sales.clear(); + std::map saleMap; while (retCode != SQLITE_DONE) { ++count; auto sale = std::make_unique(); @@ -615,6 +616,7 @@ unsigned int Database::loadSales(std::vector>& sales, sale->setSourceNo(sqlite3_column_int(stmt, 1)); sale->setTimestamp(reinterpret_cast(sqlite3_column_text(stmt, 2))); sale->setState(Sale::State::OK); + saleMap.insert(std::make_pair(sale->getUuidAsString(), sale.get())); sales.push_back(std::move(sale)); retCode = sqlite3_step(stmt); @@ -622,36 +624,32 @@ unsigned int Database::loadSales(std::vector>& sales, sqlite3_finalize(stmt); - for (auto& sale : sales) { - retCode = sqlite3_prepare_v2(db_, - "SELECT sale_id, article_id" - " FROM sales_items" - " WHERE sale_id = :sale_uuid", - -1, &stmt, nullptr); - if (retCode != SQLITE_OK) - throw std::runtime_error(sqlite3_errmsg(db_)); + std::map artMap; + for (const auto& seller : sellers) { + for (const auto article : seller->getArticles(false)) { + artMap.insert(std::make_pair(article->getUuidAsString(), article)); + } + } - sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":sale_uuid"), - sale->getUuidAsString().c_str(), -1, SQLITE_TRANSIENT); + retCode = sqlite3_prepare_v2(db_, + "SELECT sale_id, article_id" + " FROM sales_items", + -1, &stmt, nullptr); + if (retCode != SQLITE_OK) + throw std::runtime_error(sqlite3_errmsg(db_)); + + retCode = sqlite3_step(stmt); + + while (retCode != SQLITE_DONE) { + saleMap[reinterpret_cast(sqlite3_column_text(stmt, 0))]->addArticle( + artMap[reinterpret_cast(sqlite3_column_text(stmt, 1))]); retCode = sqlite3_step(stmt); - - while (retCode != SQLITE_DONE) { - for (auto& seller : sellers) { - auto article = seller->getArticleByUuid( - reinterpret_cast(sqlite3_column_text(stmt, 1))); - if (article != nullptr) { - sale->addArticle(article); - break; - } - } - - retCode = sqlite3_step(stmt); - } - - sqlite3_finalize(stmt); } + sqlite3_finalize(stmt); + //} + return count; }