From bd1f7b55866cf6300c03db7617b07979451bbd96 Mon Sep 17 00:00:00 2001 From: Iron Prando da Silva Date: Mon, 10 Jan 2022 12:42:46 +0100 Subject: [PATCH] Corrected 'unable to fetch row' exception after removing dependencies database, reopening file and calculating new dependencies. --- .../DDR3TimeDependencies.cpp | 16 ++--- .../phasedependenciestracker.cpp | 21 +++--- .../phasedependenciestracker.h | 2 +- DRAMSys/traceAnalyzer/data/tracedb.cpp | 68 +++++++++++-------- DRAMSys/traceAnalyzer/tracefiletab.cpp | 3 +- 5 files changed, 61 insertions(+), 49 deletions(-) diff --git a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.cpp b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.cpp index 790f5d4a..83b45c18 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.cpp @@ -282,14 +282,14 @@ DependencyMap DDR3TimeDependencies::mSpecializedGetDependencies() const { std::forward_as_tuple("PDEP"), std::forward_as_tuple( std::initializer_list{ - {tRDPDEN, "RD", DependencyType::IntraRank, "tRDPDEN"}, - {tRDPDEN, "RDA", DependencyType::IntraRank, "tRDPDEN"}, - {tWRAPDEN, "WRA", DependencyType::IntraRank, "tWRAPDEN"}, - {tPRPDEN, "PREPB", DependencyType::IntraRank, "tPRPDEN"}, - {tPRPDEN, "PREAB", DependencyType::IntraRank, "tPRPDEN"}, - {tCKE, "PDXP", DependencyType::IntraRank, "tCKE"}, - {tREFPDEN, "REFAB", DependencyType::IntraRank, "tREFPDEN"}, - {tXS, "SREFEX", DependencyType::IntraRank, "tXS"} + {tRDPDEN, "RD", DependencyType::IntraRank, "tRDPDEN"}, + {tRDPDEN, "RDA", DependencyType::IntraRank, "tRDPDEN"}, + {tWRAPDEN, "WRA", DependencyType::IntraRank, "tWRAPDEN"}, + {tPRPDEN, "PREPB", DependencyType::IntraRank, "tPRPDEN"}, + {tPRPDEN, "PREAB", DependencyType::IntraRank, "tPRPDEN"}, + {tCKE, "PDXP", DependencyType::IntraRank, "tCKE"}, + {tREFPDEN, "REFAB", DependencyType::IntraRank, "tREFPDEN"}, + {tXS, "SREFEX", DependencyType::IntraRank, "tXS"} } ) ); diff --git a/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp index f3b6b91b..2180549f 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp @@ -41,17 +41,20 @@ PhaseDependenciesTracker::calculateDependencies(TraceDB& tdb, std::vector 0) { - mCreateTable(tdb); - - auto& phases = mGetAllPhases(tdb, commands); + if (commands.size() > 0) { + auto& phases = mGetFilteredPhases(tdb, commands); if (phases.size() != 0) { auto& entries = mCalculateDependencies(tdb, phases, commands); + + if (entries.size() > 0) { + mCreateTable(tdb); + } + mInsertIntoTable(tdb, entries); } else { - // TODO - not sure if necessary. Still here as a possibility + // TODO - not sure if necessary. Still, a possibility // mRollbackChanges(tdb); // return; } @@ -118,7 +121,7 @@ void PhaseDependenciesTracker::mInsertIntoTable(TraceDB& tdb, const std::vector< } const std::vector> -PhaseDependenciesTracker::mGetAllPhases(TraceDB& tdb, const std::vector& commands) { +PhaseDependenciesTracker::mGetFilteredPhases(TraceDB& tdb, const std::vector& commands) { std::vector> phases; QString queryStr = "SELECT Phases.*, Transactions.TBank, Transactions.TRank " @@ -148,7 +151,7 @@ PhaseDependenciesTracker::mGetAllPhases(TraceDB& tdb, const std::vector if (!query.first()) { throw sqlException( ("Query:\n " + tdb.queryToString(query) + "\n failed. Error: \n" - "Could not safely retrieve number of rows\n").toStdString(), + "Could not retrieve number of rows safely\n").toStdString(), tdb.pathToDB.toStdString()); } @@ -170,7 +173,7 @@ PhaseDependenciesTracker::mGetAllPhases(TraceDB& tdb, const std::vector } while (query.next()); if (rowIt != nrows) { - throw std::runtime_error("An error occurred while fetching phases in 'PhaseDependenciesTracker::mGetAllPhases': expected " + std::to_string(nrows) + " rows, but found " + std::to_string(rowIt) + "\n"); + throw std::runtime_error("An error occurred while fetching phases in 'PhaseDependenciesTracker::mGetFilteredPhases': expected " + std::to_string(nrows) + " rows, but found " + std::to_string(rowIt) + "\n"); } query.finish(); @@ -287,7 +290,7 @@ PhaseDependenciesTracker::mCalculateDependencies(const TraceDB& tdb, const std:: } QSqlQuery PhaseDependenciesTracker::mExecuteQuery(TraceDB& tdb, const QString queryStr) { - QSqlQuery query(tdb.getDatabase()); + QSqlQuery query(tdb.database); query.prepare(queryStr); tdb.executeQuery(query); diff --git a/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h index caf1acbd..5726a6fb 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h +++ b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h @@ -70,7 +70,7 @@ private: static void mCreateTable(TraceDB& tdb); static void mInsertIntoTable(TraceDB& tdb, const std::vector& entries); - static const std::vector> mGetAllPhases(TraceDB& tdb, const std::vector& commands); + static const std::vector> mGetFilteredPhases(TraceDB& tdb, const std::vector& commands); static const std::vector mCalculateDependencies(const TraceDB& tdb, const std::vector>& phases, std::vector& commands); static QSqlQuery mExecuteQuery(TraceDB& tdb, const QString queryStr); diff --git a/DRAMSys/traceAnalyzer/data/tracedb.cpp b/DRAMSys/traceAnalyzer/data/tracedb.cpp index 079351d5..f11cf7ee 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.cpp +++ b/DRAMSys/traceAnalyzer/data/tracedb.cpp @@ -103,21 +103,6 @@ void TraceDB::prepareQueries() if (!selectDependenciesByTimespan.prepare(queryTexts.selectDependenciesByTimespan)) qDebug() << database.lastError().text(); - selectDependencyTypePercentages = QSqlQuery(database); - if (!selectDependencyTypePercentages.prepare(queryTexts.selectDependencyTypePercentages)) - qDebug() << database.lastError().text(); - - selectTimeDependencyPercentages = QSqlQuery(database); - if (!selectTimeDependencyPercentages.prepare(queryTexts.selectTimeDependencyPercentages)) - qDebug() << database.lastError().text(); - - selectDelayedPhasePercentages = QSqlQuery(database); - if (!selectDelayedPhasePercentages.prepare(queryTexts.selectDelayedPhasePercentages)) - qDebug() << database.lastError().text(); - - selectDependencyPhasePercentages = QSqlQuery(database); - if (!selectDependencyPhasePercentages.prepare(queryTexts.selectDependencyPhasePercentages)) - qDebug() << database.lastError().text(); } void TraceDB::updateComments(const std::vector &comments) @@ -487,30 +472,53 @@ std::vector TraceDB::getDebugMessagesInTimespan(const Tim DependencyInfos TraceDB::getDependencyInfos(DependencyInfos::Type infoType) { DependencyInfos dummy; - executeQuery(checkDependenciesExist); - if (!checkDependenciesExist.next() || checkDependenciesExist.value(0).toInt() != 1) + if (!checkDependencyTableExists()) { - checkDependenciesExist.finish(); return dummy; } switch (infoType) { - case DependencyInfos::Type::DependencyType: - executeQuery(selectDependencyTypePercentages); - return parseDependencyInfos(selectDependencyTypePercentages, infoType); + case DependencyInfos::Type::DependencyType: + { + selectDependencyTypePercentages = QSqlQuery(database); + if (!selectDependencyTypePercentages.prepare(queryTexts.selectDependencyTypePercentages)) + qDebug() << database.lastError().text(); - case DependencyInfos::Type::TimeDependency: - executeQuery(selectTimeDependencyPercentages); - return parseDependencyInfos(selectTimeDependencyPercentages, infoType); + executeQuery(selectDependencyTypePercentages); + return parseDependencyInfos(selectDependencyTypePercentages, infoType); + } - case DependencyInfos::Type::DelayedPhase: - executeQuery(selectDelayedPhasePercentages); - return parseDependencyInfos(selectDelayedPhasePercentages, infoType); + case DependencyInfos::Type::TimeDependency: + { + selectTimeDependencyPercentages = QSqlQuery(database); + if (!selectTimeDependencyPercentages.prepare(queryTexts.selectTimeDependencyPercentages)) + qDebug() << database.lastError().text(); + + executeQuery(selectTimeDependencyPercentages); + return parseDependencyInfos(selectTimeDependencyPercentages, infoType); + } + + case DependencyInfos::Type::DelayedPhase: + { + selectDelayedPhasePercentages = QSqlQuery(database); + if (!selectDelayedPhasePercentages.prepare(queryTexts.selectDelayedPhasePercentages)) + qDebug() << database.lastError().text(); + + executeQuery(selectDelayedPhasePercentages); + return parseDependencyInfos(selectDelayedPhasePercentages, infoType); + } + + case DependencyInfos::Type::DependencyPhase: + { + selectDependencyPhasePercentages = QSqlQuery(database); + if (!selectDependencyPhasePercentages.prepare(queryTexts.selectDependencyPhasePercentages)) + qDebug() << database.lastError().text(); + + executeQuery(selectDependencyPhasePercentages); + return parseDependencyInfos(selectDependencyPhasePercentages, infoType); + } - case DependencyInfos::Type::DependencyPhase: - executeQuery(selectDependencyPhasePercentages); - return parseDependencyInfos(selectDependencyPhasePercentages, infoType); } return dummy; diff --git a/DRAMSys/traceAnalyzer/tracefiletab.cpp b/DRAMSys/traceAnalyzer/tracefiletab.cpp index fcd287d2..52ddf73b 100644 --- a/DRAMSys/traceAnalyzer/tracefiletab.cpp +++ b/DRAMSys/traceAnalyzer/tracefiletab.cpp @@ -357,7 +357,8 @@ void TraceFileTab::on_calculateDependencies_clicked() { if (item->checkState() == Qt::Checked) dependencyFilter.push_back(item->text()); } - + + savingChangesToDB = true; PhaseDependenciesTracker::calculateDependencies(navigator->TraceFile(), dependencyFilter); depInfosView = new DependencyInfosModel(navigator->TraceFile(), this); ui->depInfosView->setModel(depInfosView);