// SPDX-FileCopyrightText: 2023 Yury Gubich // SPDX-License-Identifier: GPL-3.0-or-later #include "server.h" #include "handler/info.h" #include "handler/env.h" constexpr uint8_t currentDbVesion = 1; Server::Server(): terminating(false), requestCount(0), serverName(std::nullopt), 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"); db->migrate(currentDbVesion); router.addRoute(std::make_unique()); router.addRoute(std::make_unique()); } Server::~Server() {} void Server::run(int socketDescriptor) { while (!terminating) { std::unique_ptr request = std::make_unique(); bool result = request->wait(socketDescriptor); if (!result) { std::cerr << "Error accepting a request" << std::endl; return; } handleRequest(std::move(request)); } } void Server::handleRequest(std::unique_ptr request) { ++requestCount; if (!serverName) { try { serverName = request->getServerName(); std::cout << "received server name " << serverName.value() << std::endl; } catch (...) { std::cerr << "failed to read server name" << std::endl; Response error(*request.get(), Response::Status::internalError); error.send(); return; } } std::string path = request->getPath(serverName.value()); router.route(path.data(), std::move(request)); }