diff options
Diffstat (limited to 'mappingtablemodel.cpp')
-rw-r--r-- | mappingtablemodel.cpp | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/mappingtablemodel.cpp b/mappingtablemodel.cpp new file mode 100644 index 0000000..84c242a --- /dev/null +++ b/mappingtablemodel.cpp @@ -0,0 +1,181 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#include <QSqlQuery> + +#include "mappingtablemodel.h" +#include "smtreeitem.h" + +MappingTableModel::MappingTableModel(QStringList &headers, const QString &table, QObject *parent) : SmTreeModel(headers, parent), mTable(table){ + //database setup + mDb = QSqlDatabase::database("treedb"); + QString tmpTable = mTable; + tmpTable.chop(1); + mMappingTable = QString("seriesparts_%1map").arg(tmpTable); + mIdColumnName = QString("i%1_id").arg(table); + mNameColumnName = QString("t%1name").arg(tmpTable); + mSequenceName = QString("%1_i%1_id__seq").arg(mTable); + + //queries + QString updateNameQuery = QString("UPDATE %1 set %2 = :name WHERE %3 = :id").arg(mTable).arg(mNameColumnName).arg(mIdColumnName); + mUpdateItemNameQuery = new QSqlQuery(mDb); + mUpdateItemNameQuery->prepare(updateNameQuery); + QString insertItemQuery = QString("INSERT INTO %1 (%2) VALUES (:name)").arg(mTable).arg(mNameColumnName); + mInsertItemQuery = new QSqlQuery(mDb); + mInsertItemQuery->prepare(insertItemQuery); + QString deleteItemQuery = QString("DELETE FROM %1 WHERE %2 = :id").arg(mTable).arg(mIdColumnName); + mDeleteItemQuery = new QSqlQuery(mDb); + mDeleteItemQuery->prepare(deleteItemQuery); + QString addMappingQuery = QString("INSERT INTO %1 (iseriesparts_id, %2) VALUES (:id1, :id2)").arg(mMappingTable).arg(mIdColumnName); + mAddMappingQuery = new QSqlQuery(mDb); + mAddMappingQuery->prepare(addMappingQuery); + QString mappingQuery = QString("SELECT %1 FROM %2, %3 WHERE %1.%4 = %3.%4 AND %3.iseriesparts_id = :id").arg(mNameColumnName).arg(mTable).arg(mMappingTable).arg(mIdColumnName); + mMappingQuery = new QSqlQuery(mDb); + mMappingQuery->prepare(mappingQuery); + + //get data + populate(); +} + +MappingTableModel::~MappingTableModel(){ + delete mUpdateItemNameQuery; + delete mInsertItemQuery; + delete mDeleteItemQuery; + delete mAddMappingQuery; + delete mMappingQuery; + mDb = QSqlDatabase(); +} + +Qt::ItemFlags MappingTableModel::flags(const QModelIndex &index) const{ + if(!index.isValid()){ + return 0; + } + Qt::ItemFlags retval = Qt::ItemIsEnabled | Qt::ItemIsSelectable; + if(index.column() == ItemName){ + return retval | Qt::ItemIsEditable; + } + return retval; +} + +QVariant MappingTableModel::data(const QModelIndex &index, int role) const{ + if(!index.isValid()){ + return QVariant(); + } + + SmTreeItem *item = static_cast<SmTreeItem*>(index.internalPointer()); + + if(role == Qt::DisplayRole || role == Qt::EditRole){ + return item->data(index.column()); + } + if(role == ItemNameRole){ + return item->data(ItemName); + } + if(role == ItemIdRole){ + return item->data(ItemId); + } + return QVariant(); +} + +bool MappingTableModel::setData(const QModelIndex &index, const QVariant &value, int role){ + if(role != Qt::EditRole || !index.isValid()){ + return false; + } + if(index.column() != ItemName){ + return false; + } + SmTreeItem *item = static_cast<SmTreeItem*>(index.internalPointer()); + QString newName = value.toString().toLower().trimmed(); + mUpdateItemNameQuery->bindValue(":name", newName); + mUpdateItemNameQuery->bindValue(":id", item->data(ItemId)); + if(mUpdateItemNameQuery->exec()){ + item->setData(ItemName, newName); + return true; + } + return false; +} + +bool MappingTableModel::addItem(const QVariant &name){ + QString newValue = name.toString().toLower().trimmed(); + if(mItemNames.contains(newValue)){ + return false; + } + mDb.transaction(); + mInsertItemQuery->bindValue(":name", newValue); + if(mInsertItemQuery->exec()){ + QString sequenceQuery = QString("SELECT currval('%1')").arg(mSequenceName); + QSqlQuery lastId(sequenceQuery, mDb); + if(lastId.next()){ + QVariant newId = lastId.value(0); + QList<QVariant> data; + data << newValue << newId; + addRow(data, QModelIndex()); + mItemNames << newValue; + emit needResort(); + return true; + } + } + mDb.rollback(); + return false; +} + +bool MappingTableModel::removeItem(const QModelIndex &idx){ + if(!idx.isValid()){ + return false; + } + QString name = idx.data(ItemNameRole).toString(); + if(!mItemNames.contains(name)){ + return false; + } + mDeleteItemQuery->bindValue(":id", idx.data(ItemIdRole)); + if(mDeleteItemQuery->exec()){ + removeRows(idx.row(), 1, idx.parent()); + return true; + } + return false; +} + +bool MappingTableModel::addMapping(int seriesId, const QList<int> &itemIds){ + if(itemIds.isEmpty()){ + return false; + } + mDb.transaction(); + foreach(int id, itemIds){ + mAddMappingQuery->bindValue(":id1", seriesId); + mAddMappingQuery->bindValue(":id2", id); + if(!mAddMappingQuery->exec()){ + mDb.rollback(); + return false; + } + } + return true; +} + +QList<QVariant> MappingTableModel::mappings(int seriesId){ + QList<QVariant> retval; + mMappingQuery->bindValue(":id", seriesId); + if(mMappingQuery->exec()){ + while(mMappingQuery->next()){ + retval << mMappingQuery->value(0); + } + } + return retval; +} + +void MappingTableModel::populate(){ + QString query = QString("SELECT %1, %2 FROM %3 ORDER BY %2").arg(mIdColumnName).arg(mNameColumnName).arg(mTable); + SmTreeItem *root = new SmTreeItem(2); + QSqlQuery dataQuery(query, mDb); + while(dataQuery.next()){ + QList<QVariant> data; + data << dataQuery.value(1); //name + data << dataQuery.value(0); //id + SmTreeItem *item = new SmTreeItem(data, root); + root->appendChild(item); + mItemNames << dataQuery.value(1).toString(); + } + setRoot(root); +} |