Corrected 'unable to fetch row' exception after removing dependencies database, reopening file and calculating new dependencies.

This commit is contained in:
Iron Prando da Silva
2022-01-10 12:42:46 +01:00
parent 6d7a172605
commit bd1f7b5586
5 changed files with 61 additions and 49 deletions

View File

@@ -282,14 +282,14 @@ DependencyMap DDR3TimeDependencies::mSpecializedGetDependencies() const {
std::forward_as_tuple("PDEP"),
std::forward_as_tuple(
std::initializer_list<TimeDependency>{
{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"}
}
)
);

View File

@@ -41,17 +41,20 @@ PhaseDependenciesTracker::calculateDependencies(TraceDB& tdb, std::vector<QStrin
mDropTable(tdb);
if (commands.size() > 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<std::shared_ptr<DBPhaseEntry>>
PhaseDependenciesTracker::mGetAllPhases(TraceDB& tdb, const std::vector<QString>& commands) {
PhaseDependenciesTracker::mGetFilteredPhases(TraceDB& tdb, const std::vector<QString>& commands) {
std::vector<std::shared_ptr<DBPhaseEntry>> phases;
QString queryStr = "SELECT Phases.*, Transactions.TBank, Transactions.TRank "
@@ -148,7 +151,7 @@ PhaseDependenciesTracker::mGetAllPhases(TraceDB& tdb, const std::vector<QString>
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<QString>
} 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);

View File

@@ -70,7 +70,7 @@ private:
static void mCreateTable(TraceDB& tdb);
static void mInsertIntoTable(TraceDB& tdb, const std::vector<DBDependencyEntry>& entries);
static const std::vector<std::shared_ptr<DBPhaseEntry>> mGetAllPhases(TraceDB& tdb, const std::vector<QString>& commands);
static const std::vector<std::shared_ptr<DBPhaseEntry>> mGetFilteredPhases(TraceDB& tdb, const std::vector<QString>& commands);
static const std::vector<DBDependencyEntry> mCalculateDependencies(const TraceDB& tdb, const std::vector<std::shared_ptr<DBPhaseEntry>>& phases, std::vector<QString>& commands);
static QSqlQuery mExecuteQuery(TraceDB& tdb, const QString queryStr);

View File

@@ -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<CommentModel::Comment> &comments)
@@ -487,30 +472,53 @@ std::vector<CommentModel::Comment> 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;

View File

@@ -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);