Mercurial > hg > syntilista
diff src/sqlmodels.cpp @ 213:131463be208b
Split the custom SQL models code into sqlmodels.cpp
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 18 Dec 2017 11:28:00 +0200 |
parents | |
children | 58af72da7f60 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sqlmodels.cpp Mon Dec 18 11:28:00 2017 +0200 @@ -0,0 +1,170 @@ +// +// Syntilista - debt list/management database program +// Programmed and designed by Matti Hämäläinen <ccr@tnsp.org> +// (C) Copyright 2017 Tecnic Software productions (TNSP) +// +// Distributed under 3-clause BSD style license, refer to +// included file "COPYING" for exact terms. +// +#include "main.h" + + +SLPersonSQLModel::SLPersonSQLModel(QObject *parent) : QSqlQueryModel(parent) +{ +} + + +QVariant SLPersonSQLModel::data(const QModelIndex &index, int role) const +{ + QVariant value = QSqlQueryModel::data(index, role); + + if (value.isValid() && role == Qt::DisplayRole) + { + // Format some of the displayed values + switch (index.column()) + { + case 3: + return slMoneyValueToStr(value.toDouble()); + + case 4: + return slDateTimeToStr(value.toDateTime()); + } + } + + if (index.column() == 3 && role == Qt::ForegroundRole) + { + // Use fancy coloring for debt + double val = QSqlQueryModel::data(index, Qt::DisplayRole).toDouble(); + if (val < 0) + return QVariant::fromValue(QColor(Qt::red)); + else + return QVariant::fromValue(QColor(Qt::green)); + } + + return value; +} + + +int SLPersonSQLModel::updatePerson(const SLPersonInfo &info) +{ + QSqlQuery np; + + np.prepare(QStringLiteral("UPDATE people SET first_name=?,last_name=?,extra_info=?,updated=? WHERE id=?")); + np.addBindValue(info.firstName); + np.addBindValue(info.lastName); + np.addBindValue(info.extraInfo); + np.addBindValue(QDateTime::currentDateTimeUtc()); + np.addBindValue(info.id); + np.exec(); + + if (!slCheckAndReportSQLError("SLPersonSQLModel::updatePerson()", np.lastError())) + return -1; + + QSqlDatabase::database().commit(); + updateModel(); + return 0; +} + + +qint64 SLPersonSQLModel::addPerson(const SLPersonInfo &info) +{ + QSqlQuery np; + np.prepare(QStringLiteral("INSERT INTO people (first_name,last_name,extra_info,added,updated) VALUES (?,?,?,?,?)")); + np.addBindValue(info.firstName); + np.addBindValue(info.lastName); + np.addBindValue(info.extraInfo); + np.addBindValue(QDateTime::currentDateTimeUtc()); + np.addBindValue(QDateTime::currentDateTimeUtc()); + np.exec(); + + if (!slCheckAndReportSQLError("SLPersonSQLModel::addPerson()", np.lastError())) + return -1; + + QSqlDatabase::database().commit(); + + QVariant idp = np.lastInsertId(); + + updateModel(); + return idp.isValid() ? idp.toInt() : -2; +} + + +int SLPersonSQLModel::deletePerson(qint64 id) +{ + QSqlDatabase::database().transaction(); + QSqlQuery del; + + del.prepare(QStringLiteral("DELETE FROM people WHERE id=?")); + del.addBindValue(id); + del.exec(); + + if (!slCheckAndReportSQLError("delete user", del.lastError())) + { + QSqlDatabase::database().rollback(); + return -1; + } + + del.prepare(QStringLiteral("DELETE FROM transactions WHERE person=?")); + del.addBindValue(id); + del.exec(); + + if (!slCheckAndReportSQLError("delete user transactions", del.lastError())) + { + QSqlDatabase::database().rollback(); + return -2; + } + + QSqlDatabase::database().commit(); + updateModel(); + return 0; +} + + +void SLPersonSQLModel::updateModel() +{ + query().exec(); + emit dataChanged(index(0, 0), index(rowCount(), columnCount())); +} + + +SLTransactionSQLModel::SLTransactionSQLModel(QObject *parent) : QSqlQueryModel(parent) +{ +} + + +QVariant SLTransactionSQLModel::data(const QModelIndex &index, int role) const +{ + QVariant value = QSqlQueryModel::data(index, role); + + if (value.isValid() && role == Qt::DisplayRole) + { + // Format some of the displayed values + switch (index.column()) + { + case 1: + return slMoneyValueToStrSign(value.toDouble()); + + case 2: + return slDateTimeToStr(value.toDateTime()); + } + } + + if (index.column() == 1 && role == Qt::ForegroundRole) + { + // Use fancy coloring for debt + double val = QSqlQueryModel::data(index, Qt::DisplayRole).toDouble(); + if (val < 0) + return QVariant::fromValue(QColor(Qt::red)); + else + return QVariant::fromValue(QColor(Qt::green)); + } + + return value; +} + + +void SLTransactionSQLModel::updateModel() +{ + query().exec(); + emit dataChanged(QModelIndex(), QModelIndex()); +}