# HG changeset patch # User Matti Hamalainen # Date 1490866325 -10800 # Node ID f2404a9987dc9c1e91d06f24935d5d42be6ce67a # Parent 6ca301530cceae205431b24332d0d90b9fa470da Cleaning up the code. diff -r 6ca301530cce -r f2404a9987dc main.cpp --- a/main.cpp Thu Mar 30 04:23:53 2017 +0300 +++ b/main.cpp Thu Mar 30 12:32:05 2017 +0300 @@ -58,10 +58,10 @@ printf("SQL Error in %s: %s\n", where.toUtf8().constData(), err.text().toUtf8().constData()); - return true; + return false; } else - return false; + return true; } @@ -333,45 +333,58 @@ } +// +// Update visible person list/query based on the current +// filtering and sorting settings. +// void SyntilistaMainWindow::updatePersonList() { QSqlQuery query; - QString queryDir, querySort = QStringLiteral(""); + QString queryOrderDir, queryOrderBy; + // Sort order if (peopleSortOrder == Qt::AscendingOrder) - queryDir = QStringLiteral("ASC"); + queryOrderDir = QStringLiteral("ASC"); else - queryDir = QStringLiteral("DESC"); + queryOrderDir = QStringLiteral("DESC"); + // Sort by which column switch (peopleSortIndex) { case 1: case 2: - querySort = QStringLiteral(" ORDER BY last_name ") + queryDir + QStringLiteral(",first_name ") + queryDir; + queryOrderBy = QStringLiteral(" ORDER BY last_name ") + queryOrderDir + QStringLiteral(",first_name ") + queryOrderDir; break; case 3: - querySort = QStringLiteral(" ORDER BY balance ") + queryDir; + queryOrderBy = QStringLiteral(" ORDER BY balance ") + queryOrderDir; break; case 4: - querySort = QStringLiteral(" ORDER BY updated ") + queryDir; + queryOrderBy = QStringLiteral(" ORDER BY updated ") + queryOrderDir; break; + + default: + queryOrderBy = ""; } + // Are we filtering or not? if (peopleFilter != "") { + // Filter by name(s) QString tmp = "%"+ peopleFilter +"%"; - query.prepare(query_Person +" WHERE first_name LIKE ? OR last_name LIKE ?" + querySort); + query.prepare(query_Person +" WHERE first_name LIKE ? OR last_name LIKE ?" + queryOrderBy); query.addBindValue(tmp); query.addBindValue(tmp); } else { - query.prepare(query_Person + querySort); + // No filter + query.prepare(query_Person + queryOrderBy); } + // Execute the query and update model checkAndReportSQLError("updatePersonList() before exec", query.lastError()); query.exec(); checkAndReportSQLError("updatePersonList() after exec", query.lastError()); @@ -386,6 +399,9 @@ } +// +// Update the list of people when filter parameter changes +// void SyntilistaMainWindow::on_edit_PersonFilter_textChanged(const QString &str) { peopleFilter = cleanupStr(str); @@ -399,87 +415,134 @@ } -bool SyntilistaMainWindow::addTransaction(bool debt, double value) +// +// +// +bool SyntilistaMainWindow::getPersonInfo(qint64 id, PersonInfo &info) { - if (personID <= 0) + QSqlQuery person; + person.prepare("SELECT id,first_name,last_name,extra_info,added,updated FROM people WHERE id=?"); + person.addBindValue(id); + person.exec(); + if (!person.next()) return false; - QSqlQuery person; - person.prepare("SELECT * FROM people WHERE id=?"); - person.addBindValue(personID); - person.exec(); - person.next(); + info.id = person.value(0).toInt(); + info.firstName = person.value(1).toString(); + info.lastName = person.value(2).toString(); + info.extraInfo = person.value(3).toString(); + info.added = person.value(4).toDateTime(); + info.updated = person.value(5).toDateTime(); + + person.finish(); + return true; +} - if (value != 0) +// +// Add one transaction to given person id +// +int SyntilistaMainWindow::addTransaction(qint64 id, double value, PersonInfo &info) +{ + if (!getPersonInfo(id, info)) + return -1; + + QSqlDatabase::database().transaction(); + + QSqlQuery query; + query.prepare("INSERT INTO transactions (person,value,added) VALUES (?,?,?)"); + query.addBindValue(id); + query.addBindValue(value); + query.addBindValue(QDateTime::currentDateTimeUtc()); + query.exec(); + if (!checkAndReportSQLError("addTransaction()", query.lastError())) { - QSqlQuery query; - query.prepare("INSERT INTO transactions (person,value,added) VALUES (?,?,?)"); - query.addBindValue(personID); - query.addBindValue(debt ? -value : value); - query.addBindValue(QDateTime::currentDateTimeUtc()); - query.exec(); - checkAndReportSQLError("addTransaction()", query.lastError()); + QSqlDatabase::database().rollback(); + return -2; + } + + query.prepare("UPDATE people SET updated=? WHERE id=?"); + query.addBindValue(QDateTime::currentDateTimeUtc()); + query.addBindValue(id); + query.exec(); + if (!checkAndReportSQLError("addTransaction update timestamp", query.lastError())) + { + QSqlDatabase::database().rollback(); + return -3; + } + + QSqlDatabase::database().commit(); + + return 0; +} + - query.prepare("UPDATE people SET updated=? WHERE id=?"); - query.addBindValue(QDateTime::currentDateTimeUtc()); - query.addBindValue(personID); - query.exec(); - checkAndReportSQLError("addTransaction update timestamp", query.lastError()); +int SyntilistaMainWindow::addTransactionGUI(qint64 id, bool debt, double value) +{ + PersonInfo info; + + if (id <= 0) + return -1; - QSqlDatabase::database().commit(); + if (value == 0) + { + QString tmp = (debt ? "lisätty" : "vähennetty"); + statusMsg("Velkaa ei "+ tmp +" koska summaa ei määritetty."); + return 1; + } + int ret = addTransaction(id, debt ? -value : value, info); + if (ret == 0) + { ui->edit_Amount->clear(); - updatePersonData(personID); + updatePersonData(id); QString str; if (debt) { str = tr("Lisättiin velkaa %1 EUR henkilölle '%2 %3' (#%4)."). arg(value, 1, 'f', 2). - arg(person.value(1).toString()). - arg(person.value(2).toString()). - arg(person.value(0).toInt()); + arg(info.firstName). + arg(info.lastName). + arg(info.id); } else { str = tr("Vähennettiin velkaa %1 EUR henkilöltä '%2 %3' (#%4)."). arg(value, 1, 'f', 2). - arg(person.value(1).toString()). - arg(person.value(2).toString()). - arg(person.value(0).toInt()); + arg(info.firstName). + arg(info.lastName). + arg(info.id); } - - statusMsg(str); - return true; } else { - QString tmp = (debt ? "lisätty" : "vähennetty"); - statusMsg("Velkaa ei "+ tmp +" koska summaa ei määritetty."); - return false; + appError(tr("SQL-tietokantavirhe"), + tr("Tietokantaan tapahtumaa lisättäessa tapahtui virhe (koodi=%1).").arg(ret)); } + + return ret; } void SyntilistaMainWindow::on_button_AddDebt_clicked() { - addTransaction(true, moneyStrToValue(ui->edit_Amount->text())); + addTransactionGUI(personID, true, moneyStrToValue(ui->edit_Amount->text())); } void SyntilistaMainWindow::on_button_PayDebt_clicked() { - addTransaction(false, moneyStrToValue(ui->edit_Amount->text())); + addTransactionGUI(personID, false, moneyStrToValue(ui->edit_Amount->text())); } void SyntilistaMainWindow::on_button_PayFullDebt_clicked() { if (personBalance < 0) - addTransaction(false, -personBalance); + addTransactionGUI(personID, false, -personBalance); else - statusMsg("Henkilöllä ei ole velkaa."); + statusMsg("Valitulla henkilöllä ei ole velkaa."); } diff -r 6ca301530cce -r f2404a9987dc main.h --- a/main.h Thu Mar 30 04:23:53 2017 +0300 +++ b/main.h Thu Mar 30 12:32:05 2017 +0300 @@ -38,6 +38,7 @@ qint64 id; QString firstName, lastName, extraInfo; + QDateTime added, updated; }; @@ -97,7 +98,9 @@ void readSettings(); void saveSettings(); void setActivePerson(qint64 id); - bool addTransaction(bool debt, double value); + bool getPersonInfo(qint64 id, PersonInfo &info); + int addTransaction(qint64 id, double value, PersonInfo &info); + int addTransactionGUI(qint64 id, bool debt, double value); void updatePersonList(); PersonSQLModel *model_People;