Comparar comentimentos
3 Cometimentos
b59e81a41d
...
828d827c3d
Autor(a) | SHA1 | Data | |
---|---|---|---|
828d827c3d | |||
8ffa64beea | |||
e970ba1682 |
1
cache/mapcache.cpp
externo
Ficheiro normal
1
cache/mapcache.cpp
externo
Ficheiro normal
@ -0,0 +1 @@
|
||||
#include "mapcache.h"
|
37
cache/mapcache.h
externo
Ficheiro normal
37
cache/mapcache.h
externo
Ficheiro normal
@ -0,0 +1,37 @@
|
||||
#ifndef MAPCACHE_H
|
||||
#define MAPCACHE_H
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <shared_mutex>
|
||||
|
||||
/* Thread-Safe Key-Value store */
|
||||
template <class T> class MapCache
|
||||
{
|
||||
private:
|
||||
std::map<std::string, T> cache;
|
||||
mutable std::shared_mutex sharedMutex;
|
||||
|
||||
public:
|
||||
std::optional<T> find(const std::string &key) const
|
||||
{
|
||||
std::shared_lock<std::shared_mutex> lock(this->sharedMutex);
|
||||
auto it = this->cache.find(key);
|
||||
if(it != this->cache.end())
|
||||
{
|
||||
return it->second;
|
||||
}
|
||||
return {};
|
||||
}
|
||||
void set(const std::string &key, const T &val)
|
||||
{
|
||||
std::lock_guard<std::shared_mutex> lock{sharedMutex};
|
||||
this->cache[key] = val;
|
||||
}
|
||||
void clear()
|
||||
{
|
||||
std::lock_guard<std::shared_mutex> lock{sharedMutex};
|
||||
this->cache.clear();
|
||||
}
|
||||
};
|
||||
|
||||
#endif // MAPCACHE_H
|
@ -34,7 +34,7 @@ void Handler::setGeneralVars(TemplatePage &page)
|
||||
}
|
||||
Response Handler::errorResponse(std::string errortitle, std::string errormessage, int status)
|
||||
{
|
||||
TemplatePage &error = this->templ->getPage("error");
|
||||
TemplatePage error = this->templ->getPage("error");
|
||||
error.setVar("title", createPageTitle(errortitle));
|
||||
error.setVar("errortitle", errortitle);
|
||||
error.setVar("errormessage", errormessage);
|
||||
|
@ -32,7 +32,7 @@ Response HandlerAllCategories::handleRequest(const Request &r)
|
||||
"No categories",
|
||||
"This wiki does not have any categories defined yet or your query options did not yield any results");
|
||||
}
|
||||
TemplatePage &searchPage = this->templ->getPage("allcategories");
|
||||
TemplatePage searchPage = this->templ->getPage("allcategories");
|
||||
std::string body =
|
||||
this->templ->renderSearch(resultList, [&](std::string str) { return this->urlProvider->category(str); });
|
||||
searchPage.setVar("categorylist", body);
|
||||
|
@ -32,7 +32,7 @@ Response HandlerAllPages::handleRequest(const Request &r)
|
||||
{
|
||||
return errorResponse("No pages", "This wiki does not have any pages yet");
|
||||
}
|
||||
TemplatePage &searchPage = this->templ->getPage("allpages");
|
||||
TemplatePage searchPage = this->templ->getPage("allpages");
|
||||
std::string body = this->templ->renderSearch(resultList);
|
||||
searchPage.setVar("pagelist", body);
|
||||
searchPage.setVar("title", createPageTitle("All pages"));
|
||||
|
@ -33,7 +33,7 @@ Response HandlerCategory::handleRequest(const Request &r)
|
||||
}
|
||||
QueryOption qo = queryOption(r);
|
||||
auto resultList = categoryDao->fetchMembers(categoryname, qo);
|
||||
TemplatePage &searchPage = this->templ->getPage("show_category");
|
||||
TemplatePage searchPage = this->templ->getPage("show_category");
|
||||
std::string body = this->templ->renderSearch(resultList);
|
||||
searchPage.setVar("pagelist", body);
|
||||
searchPage.setVar("categoryname", categoryname);
|
||||
|
@ -55,7 +55,7 @@ Response HandlerLogin::handleRequest(const Request &r)
|
||||
{
|
||||
page = "index";
|
||||
}
|
||||
TemplatePage &loginTemplatePage = this->templ->getPage("login");
|
||||
TemplatePage loginTemplatePage = this->templ->getPage("login");
|
||||
setGeneralVars(loginTemplatePage);
|
||||
loginTemplatePage.setVar("loginurl", urlProvider->login(page));
|
||||
loginTemplatePage.setVar("title", createPageTitle("Login"));
|
||||
|
@ -63,8 +63,9 @@ void HandlerPage::setPageVars(TemplatePage &page, std::string pagename)
|
||||
if(!pagename.empty())
|
||||
{
|
||||
std::string headerlinks;
|
||||
TemplatePage &headerlink = this->templ->getPage("_headerlink");
|
||||
auto addHeaderLink = [&headerlinks, &headerlink](std::string href, std::string value) {
|
||||
TemplatePage headerlink = this->templ->getPage("_headerlink");
|
||||
auto addHeaderLink = [&headerlinks, &headerlink](std::string href, std::string value)
|
||||
{
|
||||
headerlink.setVar("href", href);
|
||||
headerlink.setVar("value", value);
|
||||
headerlinks += headerlink.render();
|
||||
|
@ -121,7 +121,7 @@ Response HandlerPageEdit::handleRequest(PageDao &pageDao, std::string pagename,
|
||||
}
|
||||
}
|
||||
|
||||
TemplatePage &templatePage = this->templ->getPage("page_creation");
|
||||
TemplatePage templatePage = this->templ->getPage("page_creation");
|
||||
templatePage.setVar("actionurl", urlProvider->editPage(pagename));
|
||||
templatePage.setVar("content", body);
|
||||
setPageVars(templatePage, pagename);
|
||||
|
@ -128,7 +128,7 @@ Response HandlerPageView::handleRequest(PageDao &pageDao, std::string pagename,
|
||||
return errorResponse("Database error", "While trying to fetch revision, a database error occured");
|
||||
}
|
||||
|
||||
TemplatePage &page = this->templ->getPage(templatepartname);
|
||||
TemplatePage page = this->templ->getPage(templatepartname);
|
||||
|
||||
Parser parser;
|
||||
Response result;
|
||||
|
@ -37,7 +37,7 @@ Response HandlerSearch::handleRequest(const Request &r)
|
||||
{
|
||||
return errorResponse("No results", "Your search for " + q + " did not yield any results.");
|
||||
}
|
||||
TemplatePage &searchPage = this->templ->getPage("search");
|
||||
TemplatePage searchPage = this->templ->getPage("search");
|
||||
std::string body = this->templ->renderSearch(resultList);
|
||||
searchPage.setVar("pagelist", body);
|
||||
searchPage.setVar("searchterm", q);
|
||||
|
@ -51,7 +51,7 @@ Response HandlerUserSettings::handleRequest(const Request &r)
|
||||
}
|
||||
}
|
||||
|
||||
TemplatePage &userSettingsPage = this->templ->getPage("usersettings");
|
||||
TemplatePage userSettingsPage = this->templ->getPage("usersettings");
|
||||
setGeneralVars(userSettingsPage);
|
||||
userSettingsPage.setVar("usersettingsurl", urlProvider->userSettings());
|
||||
userSettingsPage.setVar("title", createPageTitle("User settings - " + this->userSession->user.login));
|
||||
|
@ -180,7 +180,9 @@ int main(int argc, char **argv)
|
||||
userdao->save(anon.value());
|
||||
User::setAnon(anon.value());
|
||||
|
||||
Template siteTemplate{config.templateprefix, config.templatepath, config.urls, config.configVarResolver};
|
||||
MapCache<TemplatePage> mapCache;
|
||||
Template siteTemplate{config.templateprefix, config.templatepath, config.urls, config.configVarResolver,
|
||||
mapCache};
|
||||
UrlProvider urlProvider{config.urls};
|
||||
|
||||
auto cache = createCache(config.configVarResolver);
|
||||
|
@ -59,7 +59,7 @@ Response RequestWorker::processRequest(const Request &r)
|
||||
if(session.loggedIn && session.csrf_token != r.post("csrf_token"))
|
||||
{
|
||||
// TODO: this is code duplication
|
||||
TemplatePage &error = this->templ->getPage("error");
|
||||
TemplatePage error = this->templ->getPage("error");
|
||||
error.setVar("errortitle", "Invalid csrf token");
|
||||
error.setVar("errormessage", "Invalid csrf token");
|
||||
return {403, error.render()};
|
||||
|
25
template.cpp
25
template.cpp
@ -24,12 +24,25 @@ SOFTWARE.
|
||||
#include "htmllink.h"
|
||||
#include "logger.h"
|
||||
Template::Template(std::string templateprefix, std::string templatepath, ConfigUrls &configUrls,
|
||||
ConfigVariableResolver &configVarsResolver)
|
||||
ConfigVariableResolver &configVarsResolver, MapCache<TemplatePage> &pageCache)
|
||||
{
|
||||
this->templateprefix = templateprefix;
|
||||
this->templatepath = templatepath;
|
||||
this->configUrls = &configUrls;
|
||||
this->configVarResolver = &configVarsResolver;
|
||||
this->pageCache = &pageCache;
|
||||
}
|
||||
|
||||
TemplatePage Template::getPage(const std::string &pagename)
|
||||
{
|
||||
auto result = this->pageCache->find(pagename);
|
||||
if(result)
|
||||
{
|
||||
return *result;
|
||||
}
|
||||
auto page = createPage(pagename);
|
||||
this->pageCache->set(pagename, page);
|
||||
return page;
|
||||
}
|
||||
|
||||
std::string Template::getPartPath(std::string_view partname)
|
||||
@ -65,16 +78,6 @@ TemplatePage Template::createPage(std::string name)
|
||||
return TemplatePage(replacer.parse(content));
|
||||
}
|
||||
|
||||
TemplatePage &Template::getPage(const std::string &pagename)
|
||||
{
|
||||
if(utils::hasKey(pagesMap, pagename))
|
||||
{
|
||||
return pagesMap[pagename];
|
||||
}
|
||||
pagesMap.insert(std::make_pair(pagename, createPage(pagename)));
|
||||
return pagesMap[pagename];
|
||||
}
|
||||
|
||||
// TODO: this restricts template a bit
|
||||
std::string Template::renderSearch(const std::vector<std::string> &results,
|
||||
std::function<std::string(std::string)> callback) const
|
||||
|
12
template.h
12
template.h
@ -8,16 +8,17 @@
|
||||
#include "response.h"
|
||||
#include "searchresult.h"
|
||||
#include "revision.h"
|
||||
#include "cache/mapcache.h"
|
||||
class Template
|
||||
{
|
||||
private:
|
||||
ConfigVariableResolver *configVarResolver;
|
||||
ConfigUrls *configUrls;
|
||||
MapCache<TemplatePage> *pageCache;
|
||||
|
||||
std::string templateprefix;
|
||||
std::string templatepath;
|
||||
|
||||
std::map<std::string, TemplatePage> pagesMap;
|
||||
std::string resolveIncludes(std::string_view content);
|
||||
|
||||
std::string getPartPath(std::string_view partname);
|
||||
@ -27,12 +28,9 @@ class Template
|
||||
|
||||
public:
|
||||
Template(std::string templateprefix, std::string templatepath, ConfigUrls &configUrls,
|
||||
ConfigVariableResolver &configVarsResolver);
|
||||
/* TODO: returning this as a reference is by no means a risk free business,
|
||||
because between requests, different vars can be set conditionally,
|
||||
thus creating a mess
|
||||
*/
|
||||
TemplatePage &getPage(const std::string &pagename);
|
||||
ConfigVariableResolver &configVarsResolver, MapCache<TemplatePage> &pageCache);
|
||||
|
||||
TemplatePage getPage(const std::string &pagename);
|
||||
|
||||
std::string renderSearch(const std::vector<std::string> &results,
|
||||
std::function<std::string(std::string)> callback) const;
|
||||
|
Carregando…
Criar uma nova questão referindo esta
Bloquear um utilizador