changeset 4:f2404a9987dc

Cleaning up the code.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 30 Mar 2017 12:32:05 +0300
parents 6ca301530cce
children a5a3baee3043
files main.cpp main.h
diffstat 2 files changed, 115 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- 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.");
 }
 
 
--- 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;