From 622ef5af6af97c71db7dcf01df48361a774582a6 Mon Sep 17 00:00:00 2001 From: Albert S Date: Sun, 3 Apr 2022 11:11:28 +0200 Subject: [PATCH] Database: PageDao/CategoryDao: Return 'Page' object, not pagename string --- cli.cpp | 9 ++++----- database/categorydao.h | 4 ++-- database/categorydaosqlite.cpp | 16 ++++++++++++---- database/categorydaosqlite.h | 3 ++- database/pagedao.h | 2 +- database/pagedaosqlite.cpp | 17 ++++++++++++----- database/pagedaosqlite.h | 2 +- dynamic/dynamiccontentpostlist.cpp | 6 +++--- handlers/handlerfeedgenerator.cpp | 11 ++++++----- 9 files changed, 43 insertions(+), 27 deletions(-) diff --git a/cli.cpp b/cli.cpp index e3ec2b3..43801c5 100644 --- a/cli.cpp +++ b/cli.cpp @@ -141,10 +141,9 @@ std::pair CLIHandler::page_list([[maybe_unused]] const std::v QueryOption o; auto result = pageDao->getPageList(o); std::stringstream stream; - for(std::string pagename : result) + for(Page &page : result) { - Page p = pageDao->find(pagename).value(); - stream << p.name << " " << p.pageid << " " << std::string(p.listed ? "listed" : "unlisted") << std::endl; + stream << page.name << " " << page.pageid << " " << std::string(page.listed ? "listed" : "unlisted") << std::endl; } return {true, stream.str()}; } @@ -271,9 +270,9 @@ std::pair CLIHandler::category_show(const std::vectordb->createCategoryDao(); auto members = categoryDao->fetchMembers(args.at(0), QueryOption{}); std::stringstream stream; - for(std::string &member : members) + for(Page &member : members) { - stream << member << std::endl; + stream << member.name << std::endl; } return {true, stream.str()}; } diff --git a/database/categorydao.h b/database/categorydao.h index df2711a..38f73a3 100644 --- a/database/categorydao.h +++ b/database/categorydao.h @@ -5,7 +5,7 @@ #include #include "queryoption.h" #include "../category.h" - +#include "../page.h" class CategoryDao { public: @@ -14,7 +14,7 @@ class CategoryDao virtual std::vector fetchList(QueryOption o) = 0; virtual std::optional find(std::string name) = 0; virtual void deleteCategory(std::string name) = 0; - virtual std::vector fetchMembers(std::string name, QueryOption o) = 0; + virtual std::vector fetchMembers(std::string name, QueryOption o) = 0; }; #endif // CATEGORYDAO_H diff --git a/database/categorydaosqlite.cpp b/database/categorydaosqlite.cpp index cd9b047..019e825 100644 --- a/database/categorydaosqlite.cpp +++ b/database/categorydaosqlite.cpp @@ -94,9 +94,10 @@ std::vector CategoryDaoSqlite::fetchList(QueryOption o) } return result; } -std::vector CategoryDaoSqlite::fetchMembers(std::string name, QueryOption o) + +std::vector CategoryDaoSqlite::fetchMembers(std::string name, QueryOption o) { - std::vector result; + std::vector result; SqliteQueryOption queryOption{o}; std::string queryoptions = @@ -104,11 +105,18 @@ std::vector CategoryDaoSqlite::fetchMembers(std::string name, Query try { - auto query = *db << "SELECT page.name AS name FROM categorymember INNER JOIN page ON page.id = " + auto query = *db << "SELECT page.id, page.name AS name, page.title, page.lastrevision, page.visible FROM categorymember INNER JOIN page ON page.id = " "categorymember.page WHERE category = (SELECT id FROM category WHERE name = ? ) AND " + queryoptions << name; - query >> [&](std::string p) { result.push_back(p); }; + query >> [&](unsigned int id, std::string name, std::string title, unsigned int lastrevision, bool visible) { + Page p; + p.name = name; + p.pageid = id; + p.title = title; + p.current_revision = lastrevision; + p.listed = visible; + result.push_back(p); }; } catch(const sqlite::exceptions::no_rows &e) { diff --git a/database/categorydaosqlite.h b/database/categorydaosqlite.h index 186c8cf..d7ff355 100644 --- a/database/categorydaosqlite.h +++ b/database/categorydaosqlite.h @@ -3,12 +3,13 @@ #include "categorydao.h" #include "sqlitedao.h" +#include "../page.h" class CategoryDaoSqlite : public CategoryDao, protected SqliteDao { public: CategoryDaoSqlite(); std::vector fetchList(QueryOption o) override; - std::vector fetchMembers(std::string name, QueryOption o) override; + std::vector fetchMembers(std::string name, QueryOption o) override; void save(const Category &c) override; void deleteCategory(std::string name) override; std::optional find(std::string name) override; diff --git a/database/pagedao.h b/database/pagedao.h index 5c2a7a2..566671e 100644 --- a/database/pagedao.h +++ b/database/pagedao.h @@ -15,7 +15,7 @@ class PageDao virtual std::optional find(std::string name) = 0; virtual std::optional findByTitle(std::string title) = 0; virtual std::optional find(unsigned int id) = 0; - virtual std::vector getPageList(QueryOption option) = 0; + virtual std::vector getPageList(QueryOption option) = 0; virtual std::vector fetchCategories(std::string pagename, QueryOption option) = 0; virtual void deletePage(std::string page) = 0; virtual void save(const Page &page) = 0; diff --git a/database/pagedaosqlite.cpp b/database/pagedaosqlite.cpp index 131b505..23420f4 100644 --- a/database/pagedaosqlite.cpp +++ b/database/pagedaosqlite.cpp @@ -127,21 +127,28 @@ void PageDaoSqlite::save(const Page &page) throwFrom(e); } } -std::vector PageDaoSqlite::getPageList(QueryOption option) + +std::vector PageDaoSqlite::getPageList(QueryOption option) { - std::vector result; + std::vector result; try { - std::string queryOption = SqliteQueryOption(option) .setOrderByColumn("lower(name)") .setVisibleColumnName("visible") .setPrependWhere(true) .build(); - std::string query = "SELECT name FROM page " + queryOption; + std::string query = "SELECT id, name, title, lastrevision, visible FROM page " + queryOption; + *db << query >> [&](unsigned int pageid, std::string name, std::string title,unsigned int current_revision, bool visible ) { - *db << query >> [&](std::string name) { result.push_back(name); }; + Page tmp; + tmp.pageid = pageid; + tmp.name = name; + tmp.title = title; + tmp.current_revision = current_revision; + tmp.listed = visible; + result.push_back(tmp); }; } catch(const sqlite::errors::no_rows &e) { diff --git a/database/pagedaosqlite.h b/database/pagedaosqlite.h index 103c576..c04b4a8 100644 --- a/database/pagedaosqlite.h +++ b/database/pagedaosqlite.h @@ -22,7 +22,7 @@ class PageDaoSqlite : public PageDao, protected SqliteDao std::optional find(std::string name) override; std::optional findByTitle(std::string title) override; std::optional find(unsigned int id) override; - std::vector getPageList(QueryOption option) override; + std::vector getPageList(QueryOption option) override; std::vector fetchCategories(std::string pagename, QueryOption option) override; using SqliteDao::SqliteDao; int fetchPageId(std::string pagename); diff --git a/dynamic/dynamiccontentpostlist.cpp b/dynamic/dynamiccontentpostlist.cpp index 9c3d439..9c41377 100644 --- a/dynamic/dynamiccontentpostlist.cpp +++ b/dynamic/dynamiccontentpostlist.cpp @@ -10,10 +10,10 @@ std::string DynamicContentPostList::render() option.includeInvisible = false; auto members = categoryDao->fetchMembers(this->argument, option); std::vector> pageList; - for(std::string &member : members) + for(const Page &member : members) { - auto revision = revisionDao->getRevisionForPage(member, 1); - pageList.push_back({member, revision->timestamp}); + auto revision = revisionDao->getRevisionForPage(member.name, 1); + pageList.push_back({member.name, revision->timestamp}); } std::sort(pageList.begin(), pageList.end(), [](std::pair &a, std::pair &b) { return a.second > b.second; }); diff --git a/handlers/handlerfeedgenerator.cpp b/handlers/handlerfeedgenerator.cpp index 08e7410..f7e7e83 100644 --- a/handlers/handlerfeedgenerator.cpp +++ b/handlers/handlerfeedgenerator.cpp @@ -10,7 +10,9 @@ std::vector HandlerFeedGenerator::fetch QueryOption option; option.includeInvisible = false; // option.limit = 20; - std::set members; + + auto comppage = [](const Page &a, const Page &b) { return a.name == b.name; }; + std::set members (comppage); if(categories.empty()) { auto pages = pageDao->getPageList(option); @@ -29,11 +31,10 @@ std::vector HandlerFeedGenerator::fetch std::copy(catmembers.begin(), catmembers.end(), std::inserter(members, members.end())); } } - for(const std::string &member : members) + for(const Page &member : members) { - auto page = pageDao->find(member).value(); - auto revision = revisionDao->getRevisionForPage(page.name, 1).value(); - result.push_back({page, revision}); + auto revision = revisionDao->getRevisionForPage(member.name, 1).value(); + result.push_back({member, revision}); } std::sort(result.begin(), result.end(), [](EntryRevisionPair &a, EntryRevisionPair &b) { return a.second.timestamp > b.second.timestamp; });