#include "file_status.hpp" #include #include #include "tables.hpp" std::optional TaskInfo::getId(soci::session& sql, std::string_view hash) { auto hash_str = std::string { hash }; soci::rowset row_data = (sql.prepare << R"(-- SELECT Tasks.hash, Tasks.status, Tasks.timestamp AS TaskTimestamp, Tasks.url, Files.timestamp AS FileTimestamp, Files.filename, Files.format FROM Tasks LEFT OUTER JOIN Files ON Files.id = Tasks.id WHERE Tasks.hash = :file_hash ;)", soci::use(hash_str, "file_hash")); for (auto const& el : row_data) { return fromRow(el); } return {}; } std::vector TaskInfo::getAll(soci::session& sql) { soci::rowset row_data(sql.prepare << R"(-- SELECT Tasks.hash, Tasks.status, Tasks.timestamp AS TaskTimestamp, Tasks.url, Files.timestamp AS FileTimestamp, Files.filename, Files.format FROM Tasks LEFT JOIN Files ON Files.id = Tasks.id ORDER BY TaskTimestamp DESC;")"); std::vector data; for (auto const& el : row_data) { data.push_back(fromRow(el)); } return data; } TaskInfo TaskInfo::fromRow(soci::row const& row) { TaskInfo status; auto file_status = row.get("status"); status.hash = row.get("hash"); status.name = fmt::format("Task {}", status.hash); status.status = magic_enum::enum_name(file_status); status.timestamp = row.get("TaskTimestamp"); status.url = row.get("url"); if (file_status == FileStatus::COMPLETE) { status.file = { .timestamp = row.get("FileTimestamp"), .filename = row.get("filename"), .format = row.get("format") }; } return status; }