first thoughts about database

This commit is contained in:
Blue 2023-12-07 17:32:43 -03:00
parent 1b9d5e4a7b
commit 03f38387e2
Signed by: blue
GPG key ID: 9B203B252A63EE38
14 changed files with 255 additions and 20 deletions

View file

@ -12,13 +12,13 @@ void Router::addRoute(const std::string& path, const Handler& handler) {
std::cerr << "could'not add route " + path + " to the routing table";
}
void Router::route(const std::string& path, std::unique_ptr<Request> request) {
void Router::route(const std::string& path, std::unique_ptr<Request> request, Server* server) {
auto itr = table.find(path);
if (itr == table.end())
return handleNotFound(path, std::move(request));
try {
bool result = itr->second(request.get());
bool result = itr->second(request.get(), server);
if (!result)
handleInternalError(std::runtime_error("handler failed to handle the request"), std::move(request));
} catch (const std::exception& e) {

View file

@ -8,14 +8,16 @@
#include "request/request.h"
#include "response/response.h"
class Server;
class Router {
public:
using Handler = std::function<bool(Request*)>;
using Handler = std::function<bool(Request*, Server*)>;
Router();
void addRoute(const std::string& path, const Handler& handler);
void route(const std::string& path, std::unique_ptr<Request> request);
void route(const std::string& path, std::unique_ptr<Request> request, Server* server);
private:
void handleNotFound(const std::string& path, std::unique_ptr<Request> request);

View file

@ -1,19 +1,21 @@
#include "server.h"
constexpr static const char* REQUEST_URI("REQUEST_URI");
constexpr static const char* DOCUMENT_URI("DOCUMENT_URI");
constexpr static const char* DOCUMENT_ROOT("DOCUMENT_ROOT");
constexpr static const char* SCRIPT_NAME("SCRIPT_NAME");
constexpr static const char* SCRIPT_FILENAME("SCRIPT_FILENAME");
Server::Server():
terminating(false),
requestCount(0),
serverName(std::nullopt),
router()
router(),
db()
{
std::cout << "Startig pica..." << std::endl;
db = DBInterface::create(DBInterface::Type::mysql);
std::cout << "Database type: MySQL" << std::endl;
db->setCredentials("pica", "pica");
db->setDatabase("pica");
db->connect("/run/mysqld/mysqld.sock");
router.addRoute("info", Server::info);
router.addRoute("env", Server::printEnvironment);
}
@ -54,7 +56,7 @@ void Server::handleRequest(std::unique_ptr<Request> request) {
try {
std::string path = request->getPath(serverName.value());
router.route(path.data(), std::move(request));
router.route(path.data(), std::move(request), this);
} catch (const std::exception e) {
Response error(Response::Status::internalError);
error.setBody(std::string(e.what()));
@ -62,7 +64,8 @@ void Server::handleRequest(std::unique_ptr<Request> request) {
}
}
bool Server::printEnvironment(Request* request) {
bool Server::printEnvironment(Request* request, Server* server) {
(void)server;
nlohmann::json body = nlohmann::json::object();
request->printEnvironment(body);
@ -73,7 +76,8 @@ bool Server::printEnvironment(Request* request) {
return true;
}
bool Server::info(Request* request) {
bool Server::info(Request* request, Server* server) {
(void)server;
Response res;
nlohmann::json body = nlohmann::json::object();
body["type"] = "Pica";

View file

@ -17,6 +17,7 @@
#include "request/request.h"
#include "response/response.h"
#include "router.h"
#include "database/dbinterface.h"
class Server {
public:
@ -28,12 +29,13 @@ public:
private:
void handleRequest(std::unique_ptr<Request> request);
static bool info(Request* request);
static bool printEnvironment(Request* request);
static bool info(Request* request, Server* server);
static bool printEnvironment(Request* request, Server* server);
private:
bool terminating;
uint64_t requestCount;
std::optional<std::string> serverName;
Router router;
std::unique_ptr<DBInterface> db;
};