diff --git a/sources/queued/include/queued/QueuedDatabase.h b/sources/queued/include/queued/QueuedDatabase.h index a86dcb0..22aa41b 100644 --- a/sources/queued/include/queued/QueuedDatabase.h +++ b/sources/queued/include/queued/QueuedDatabase.h @@ -69,6 +69,18 @@ public: * administrator password SHA512 */ void createAdministrator(const QString &_user, const QString &_password); + /** + * @brief create or update actual schema in table + * @param _table + * table name + */ + void createSchema(const QString &_table); + /** + * @brief create given table + * @param _table + * table name + */ + void createTable(const QString &_table); /** * @brief get all records from table * @param _table @@ -165,28 +177,13 @@ private: * @brief database path */ QString m_path; - /** - * @brief create or update actual schema in table - * @param _table - * table name - */ - void createSchema(const QString &_table); - /** - * @brief create given table - * @param _table - * table name - */ - void createTable(const QString &_table); /** * @brief additional function to get column numbers from table - * @param _columns - * columns mapping * @param _record * SQL record from query - * @return map of column names to their numbers + * @return list of columns in table */ - QHash getColumnsInRecord(const QStringList &_columns, - const QSqlRecord &_record) const; + QStringList getColumnsInRecord(const QSqlRecord &_record) const; /** * @brief last insertion ID * @param _table diff --git a/sources/queued/include/queued/QueuedProcessManager.h b/sources/queued/include/queued/QueuedProcessManager.h index bb79665..4d10fc7 100644 --- a/sources/queued/include/queued/QueuedProcessManager.h +++ b/sources/queued/include/queued/QueuedProcessManager.h @@ -68,6 +68,14 @@ public: * @brief QueuedProcessManager class destructor */ virtual ~QueuedProcessManager(); + /** + * @brief parse task definitions from table data + * @param _properties + * map of task properties + * @return data mapped to internal format + */ + static QueuedProcess::QueuedProcessDefinitions + parseDefinitions(const QVariantHash &_properties); /** * @brief add task * @param _properties diff --git a/sources/queued/include/queued/private/QueuedCorePrivateHelper.h b/sources/queued/include/queued/private/QueuedCorePrivateHelper.h index 5bf645b..6c03447 100644 --- a/sources/queued/include/queued/private/QueuedCorePrivateHelper.h +++ b/sources/queued/include/queued/private/QueuedCorePrivateHelper.h @@ -35,6 +35,7 @@ class QueuedAdvancedSettings; class QueuedCorePrivate; class QueuedDatabase; class QueuedPluginManager; +class QueuedProcess; class QueuedProcessManager; class QueuedUserManager; @@ -177,15 +178,15 @@ private: const bool _add); /** * @brief edit task - * @param _id - * task ID to edit + * @param _process + * task object * @param _taskData * task data to edit * @remark _taskData should contain only fields defined in schema, any other * fields will be ignored. No need to pass all properties here * @return true on successful task edition */ - QueuedResult editTaskPrivate(const long long _id, + QueuedResult editTaskPrivate(QueuedProcess *_process, const QVariantHash &_taskData); /** * @brief edit user diff --git a/sources/queued/src/QueuedCorePrivate.cpp b/sources/queued/src/QueuedCorePrivate.cpp index 9edc6d6..f42a3fc 100644 --- a/sources/queued/src/QueuedCorePrivate.cpp +++ b/sources/queued/src/QueuedCorePrivate.cpp @@ -197,9 +197,17 @@ QueuedResult QueuedCorePrivate::editTask(const long long _id, auto task = m_processes->process(_id); if (!task) { - qCWarning(LOG_LIB) << "Could not find task with ID" << _id; - return QueuedError("Task does not exist", - QueuedEnums::ReturnStatus::InvalidArgument); + qCInfo(LOG_LIB) << "Try to get information about task" << _id + << "from database"; + auto data = m_database->get(QueuedDB::TASKS_TABLE, _id); + if (data.isEmpty()) { + qCWarning(LOG_LIB) << "Could not find task with ID" << _id; + return QueuedError("Task does not exist", + QueuedEnums::ReturnStatus::InvalidArgument); + } + + auto defs = QueuedProcessManager::parseDefinitions(data); + task = new QueuedProcess(this, defs, _id); } // check permissions @@ -248,7 +256,7 @@ QueuedResult QueuedCorePrivate::editTask(const long long _id, payload["nice"] = std::min(payload["nice"].toUInt(), authUser->priority()); - return m_helper->editTaskPrivate(_id, payload); + return m_helper->editTaskPrivate(task, payload); } diff --git a/sources/queued/src/QueuedCorePrivateHelper.cpp b/sources/queued/src/QueuedCorePrivateHelper.cpp index b1d272e..31d53ad 100644 --- a/sources/queued/src/QueuedCorePrivateHelper.cpp +++ b/sources/queued/src/QueuedCorePrivateHelper.cpp @@ -297,32 +297,25 @@ QueuedCorePrivateHelper::editPluginPrivate(const QString &_plugin, * @fn editTaskPrivate */ QueuedResult -QueuedCorePrivateHelper::editTaskPrivate(const long long _id, +QueuedCorePrivateHelper::editTaskPrivate(QueuedProcess *_process, const QVariantHash &_taskData) { - qCDebug(LOG_LIB) << "Edit task with ID" << _id; - - auto task = processes()->process(_id); - if (!task) { - qCWarning(LOG_LIB) << "Could not find task with ID" << _id; - return QueuedError("Task does not exist", - QueuedEnums::ReturnStatus::InvalidArgument); - } + qCDebug(LOG_LIB) << "Edit task with ID" << _process->index(); // modify record in database first - bool status = database()->modify(QueuedDB::TASKS_TABLE, _id, _taskData); + bool status = database()->modify(QueuedDB::TASKS_TABLE, _process->index(), _taskData); if (!status) { - qCWarning(LOG_LIB) << "Could not modify task record" << _id + qCWarning(LOG_LIB) << "Could not modify task record" << _process->index() << "in database, do not edit it in memory"; return QueuedError("", QueuedEnums::ReturnStatus::Error); } // modify values stored in memory for (auto &property : _taskData.keys()) - task->setProperty(qPrintable(property), _taskData[property]); + _process->setProperty(qPrintable(property), _taskData[property]); // notify plugins if (plugins()) - emit(plugins()->interface()->onEditTask(_id, _taskData)); + emit(plugins()->interface()->onEditTask(_process->index(), _taskData)); return true; } diff --git a/sources/queued/src/QueuedDatabase.cpp b/sources/queued/src/QueuedDatabase.cpp index 1f22de4..ded1e41 100644 --- a/sources/queued/src/QueuedDatabase.cpp +++ b/sources/queued/src/QueuedDatabase.cpp @@ -113,6 +113,56 @@ void QueuedDatabase::createAdministrator(const QString &_user, } +/** + * @fn createSchema + */ +void QueuedDatabase::createSchema(const QString &_table) +{ + qCDebug(LOG_LIB) << "Create schema for" << _table; + + QSqlRecord record = m_database.record(_table); + // get column names + QStringList columns; + for (int i = 0; i < record.count(); i++) + columns.append(record.fieldName(i)); + + // check and append if any + QStringList schemaColumns = QueuedDB::DBSchema[_table].keys(); + for (auto &column : schemaColumns) { + if (columns.contains(column)) + continue; + QueuedDB::QueuedDBField field = QueuedDB::DBSchema[_table][column]; + QSqlQuery query + = m_database.exec(QString("ALTER TABLE '%1' ADD `%2` %3") + .arg(_table) + .arg(column) + .arg(field.sqlDescription)); + QSqlError error = query.lastError(); + if (error.isValid()) + qCCritical(LOG_LIB) + << "Could not insert column" << column << "to table" << _table + << "error:" << error.text(); + } +} + + +/** + * @fn createTable + */ +void QueuedDatabase::createTable(const QString &_table) +{ + qCDebug(LOG_LIB) << "Create table" << _table; + + QSqlQuery query = m_database.exec( + QString("CREATE TABLE '%1' (`_id` INTEGER PRIMARY KEY AUTOINCREMENT)") + .arg(_table)); + QSqlError error = query.lastError(); + if (error.isValid()) + qCCritical(LOG_LIB) + << "Could not create table" << _table << "error:" << error.text(); +} + + /** * @fn get */ @@ -136,12 +186,11 @@ QList QueuedDatabase::get(const QString &_table, } QSqlRecord record = query.record(); - QStringList columns = QueuedDB::DBSchema[_table].keys(); - auto dbColumns = getColumnsInRecord(columns, record); + auto columns = getColumnsInRecord(record); while (query.next()) { QVariantHash entry; for (auto &column : columns) - entry[column] = query.value(dbColumns[column]); + entry[column] = query.value(column); output.append(entry); } @@ -331,71 +380,18 @@ void QueuedDatabase::removeUsers(const QDateTime &_lastLogin) } -/** - * @fn createSchema - */ -void QueuedDatabase::createSchema(const QString &_table) -{ - qCDebug(LOG_LIB) << "Create schema for" << _table; - - QSqlRecord record = m_database.record(_table); - // get column names - QStringList columns; - for (int i = 0; i < record.count(); i++) - columns.append(record.fieldName(i)); - - // check and append if any - QStringList schemaColumns = QueuedDB::DBSchema[_table].keys(); - for (auto &column : schemaColumns) { - if (columns.contains(column)) - continue; - QueuedDB::QueuedDBField field = QueuedDB::DBSchema[_table][column]; - QSqlQuery query - = m_database.exec(QString("ALTER TABLE '%1' ADD `%2` %3") - .arg(_table) - .arg(column) - .arg(field.sqlDescription)); - QSqlError error = query.lastError(); - if (error.isValid()) - qCCritical(LOG_LIB) - << "Could not insert column" << column << "to table" << _table - << "error:" << error.text(); - } -} - - -/** - * @fn createTable - */ -void QueuedDatabase::createTable(const QString &_table) -{ - qCDebug(LOG_LIB) << "Create table" << _table; - - QSqlQuery query = m_database.exec( - QString("CREATE TABLE '%1' (`_id` INTEGER PRIMARY KEY AUTOINCREMENT)") - .arg(_table)); - QSqlError error = query.lastError(); - if (error.isValid()) - qCCritical(LOG_LIB) - << "Could not create table" << _table << "error:" << error.text(); -} - - /** * @fn getColumnsInRecord */ -QHash -QueuedDatabase::getColumnsInRecord(const QStringList &_columns, - const QSqlRecord &_record) const +QStringList QueuedDatabase::getColumnsInRecord(const QSqlRecord &_record) const { - qCDebug(LOG_LIB) << "Search for columns" << _columns; + qCDebug(LOG_LIB) << "Search for columns" << _record; - return std::accumulate( - _columns.begin(), _columns.end(), QHash(), - [&_record](QHash &map, const QString &column) { - map[column] = _record.indexOf(column); - return map; - }); + QStringList output; + for (int i = 0; i < _record.count(); i++) + output += _record.fieldName(i); + + return output; } @@ -432,9 +428,10 @@ QueuedDatabase::getQueryPayload(const QString &_table, qCDebug(LOG_LIB) << "Add record" << _value << "to table" << _table; QHash output; - QStringList schemaColumns = QueuedDB::DBSchema[_table].keys(); + auto schemaColumns = QueuedDB::DBSchema[_table].keys(); for (auto &key : _value.keys()) { - if (!schemaColumns.contains(key)) { + // we would check it only if there is data about this table + if (!schemaColumns.isEmpty() && !schemaColumns.contains(key)) { qCWarning(LOG_LIB) << "No key" << key << "found in schema of" << _table; continue; diff --git a/sources/queued/src/QueuedProcessManager.cpp b/sources/queued/src/QueuedProcessManager.cpp index 52ca1a5..0553c53 100644 --- a/sources/queued/src/QueuedProcessManager.cpp +++ b/sources/queued/src/QueuedProcessManager.cpp @@ -59,13 +59,12 @@ QueuedProcessManager::~QueuedProcessManager() /** - * @fn add + * @fn parseDefinitions */ -QueuedProcess *QueuedProcessManager::add(const QVariantHash &_properties, - const long long _index) +QueuedProcess::QueuedProcessDefinitions +QueuedProcessManager::parseDefinitions(const QVariantHash &_properties) { - qCDebug(LOG_LIB) << "Add new process" << _properties << "with index" - << _index; + qCDebug(LOG_LIB) << "Parse definitions from" << _properties; QueuedProcess::QueuedProcessDefinitions defs; // parameters @@ -84,7 +83,20 @@ QueuedProcess *QueuedProcessManager::add(const QVariantHash &_properties, defs.endTime = QDateTime::fromString(_properties["endTime"].toString(), Qt::ISODateWithMs); - return add(defs, _index); + return defs; +} + + +/** + * @fn add + */ +QueuedProcess *QueuedProcessManager::add(const QVariantHash &_properties, + const long long _index) +{ + qCDebug(LOG_LIB) << "Add new process" << _properties << "with index" + << _index; + + return add(parseDefinitions(_properties), _index); }