ShiftsModel: better shift creation, better error reporting

This commit is contained in:
Filippo Gentile 2022-03-08 12:09:56 +01:00
parent d3d6e099b6
commit 48d7180cd5
2 changed files with 59 additions and 19 deletions

View file

@ -11,6 +11,21 @@ using namespace sqlite3pp;
#include <QDebug>
//Error messages
static constexpr char errorNameAlreadyUsedText[]
= QT_TRANSLATE_NOOP("ShiftsModel",
"There is already another job shift with same name: <b>%1</b>");
static constexpr char errorGenericAddText[]
= QT_TRANSLATE_NOOP("ShiftsModel",
"An error occurred while adding a new shift: <b>%1</b><br>"
"%2");
static constexpr char errorShiftInUseCannotDeleteText[]
= QT_TRANSLATE_NOOP("ShiftsModel",
"Shift <b>%1</b> is used by some jobs.<br>"
"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: <b>%1</b>").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<QString>(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<db_id>(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);

View file

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