From 48d7180cd5928fac5e450a3bd0c6380544375907 Mon Sep 17 00:00:00 2001 From: Filippo Gentile Date: Tue, 8 Mar 2022 12:09:56 +0100 Subject: [PATCH] ShiftsModel: better shift creation, better error reporting --- src/shifts/shiftsmodel.cpp | 74 +++++++++++++++++++++++++++++--------- src/shifts/shiftsmodel.h | 4 +-- 2 files changed, 59 insertions(+), 19 deletions(-) diff --git a/src/shifts/shiftsmodel.cpp b/src/shifts/shiftsmodel.cpp index 7194a06..00b1af9 100644 --- a/src/shifts/shiftsmodel.cpp +++ b/src/shifts/shiftsmodel.cpp @@ -11,6 +11,21 @@ using namespace sqlite3pp; #include +//Error messages +static constexpr char errorNameAlreadyUsedText[] + = QT_TRANSLATE_NOOP("ShiftsModel", + "There is already another job shift with same name: %1"); + +static constexpr char errorGenericAddText[] + = QT_TRANSLATE_NOOP("ShiftsModel", + "An error occurred while adding a new shift: %1
" + "%2"); + +static constexpr char errorShiftInUseCannotDeleteText[] + = QT_TRANSLATE_NOOP("ShiftsModel", + "Shift %1 is used by some jobs.
" + "To remove it, transfer those jobs to a different shift or remove them."); + ShiftsModel::ShiftsModel(database &db, QObject *parent) : BaseClass(500, db, parent) { @@ -98,13 +113,15 @@ bool ShiftsModel::setData(const QModelIndex &idx, const QVariant &value, int rol set_name.bind(1, newName); set_name.bind(2, item.shiftId); int ret = set_name.execute(); + if(ret == SQLITE_CONSTRAINT_UNIQUE) { - emit modelError(tr("There is already another job shift with same name: %1").arg(newName)); + emit modelError(tr(errorNameAlreadyUsedText).arg(newName)); return false; } else if(ret != SQLITE_OK) { + qDebug() << "Shift Error:" << ret << mDb.error_msg(); return false; } @@ -254,7 +271,7 @@ void ShiftsModel::internalFetch(int first, int /*sortColumn*/, int /*valRow*/, c postResult(vec, first); } -bool ShiftsModel::removeShift(db_id shiftId) +bool ShiftsModel::removeShift(db_id shiftId, const QString& name) { if(!shiftId) return false; @@ -265,6 +282,29 @@ bool ShiftsModel::removeShift(db_id shiftId) if(ret != SQLITE_OK) { qWarning() << "ShiftModel: error removing shift" << ret << mDb.error_msg(); + + if(ret != SQLITE_OK) + { + ret = mDb.extended_error_code(); + if(ret == SQLITE_CONSTRAINT_FOREIGNKEY || ret == SQLITE_CONSTRAINT_TRIGGER) + { + QString tmp = name; + if(name.isNull()) + { + query q(mDb, "SELECT name FROM jobshifts WHERE id=?"); + q.bind(1, shiftId); + q.step(); + tmp = q.getRows().get(0); + } + + emit modelError(tr(errorShiftInUseCannotDeleteText).arg(tmp)); + return false; + } + + qWarning() << "ShiftModel: error removing shift" << ret << mDb.error_msg(); + return false; + } + return false; } @@ -279,14 +319,17 @@ bool ShiftsModel::removeShiftAt(int row) if(row >= curItemCount || row < cacheFirstRow || row >= cacheFirstRow + cache.size()) return false; //Not fetched yet or invalid - return removeShift(cache.at(row - cacheFirstRow).shiftId); + const ShiftItem& item = cache.at(row - cacheFirstRow); + return removeShift(item.shiftId, item.shiftName); } -db_id ShiftsModel::addShift(int *outRow) +db_id ShiftsModel::addShift(const QString& shiftName) { db_id shiftId = 0; - command cmd(mDb, "INSERT INTO jobshifts(id, name) VALUES(NULL, '')"); + command cmd(mDb, "INSERT INTO jobshifts(id, name) VALUES(NULL, ?)"); + cmd.bind(1, shiftName); + sqlite3_mutex *mutex = sqlite3_db_mutex(mDb.db()); sqlite3_mutex_enter(mutex); int ret = cmd.execute(); @@ -296,18 +339,18 @@ db_id ShiftsModel::addShift(int *outRow) } sqlite3_mutex_leave(mutex); - if(ret == SQLITE_CONSTRAINT_UNIQUE) + if(ret != SQLITE_OK) { - //There is already an empty shift, use that instead - query findEmpty(mDb, "SELECT id FROM jobshifts WHERE name = '' OR name IS NULL LIMIT 1"); - if(findEmpty.step() == SQLITE_ROW) + qDebug() << "Shift Error adding:" << ret << mDb.error_msg(); + + if(ret == SQLITE_CONSTRAINT_UNIQUE) { - shiftId = findEmpty.getRows().get(0); + emit modelError(tr(errorNameAlreadyUsedText).arg(shiftName)); + return false; } - } - else if(ret != SQLITE_OK) - { - qDebug() << "Shift Error adding:" << ret; + + //Generic Error + emit modelError(tr(errorGenericAddText).arg(shiftName, mDb.error_msg())); } //Reset filter @@ -317,9 +360,6 @@ db_id ShiftsModel::addShift(int *outRow) refreshData(); //Recalc row count - if(outRow) - *outRow = shiftId ? 0 : -1; //Empty name is always the first - if(shiftId) emit Session->shiftAdded(shiftId); diff --git a/src/shifts/shiftsmodel.h b/src/shifts/shiftsmodel.h index ed6401a..37d4a43 100644 --- a/src/shifts/shiftsmodel.h +++ b/src/shifts/shiftsmodel.h @@ -57,10 +57,10 @@ public: // ShiftModel - bool removeShift(db_id shiftId); + bool removeShift(db_id shiftId, const QString &name); bool removeShiftAt(int row); - db_id addShift(int *outRow); + db_id addShift(const QString &shiftName); // Convinience inline db_id shiftAtRow(int row) const