แแ แกแขแแขแแแจแ แแแกแแฃแแ แแ แแแแแ, แแฃ แ แแแแ แจแแแฅแแแแ แจแแแแแแ (แฅแฃแฅแ-แคแแแแแแ) แแ แแแแแงแแแ แแแ แแแ C++-แจแ REST API แกแแ แแแกแแก แแแกแแฌแแ แแ docker/docker-compose-แแก แแ แแแแแแแก แแแแแขแแก แแแแแฏแแ แแก แแแแแงแแแแแแ.
แจแแแแแแ แฐแแแแแแแแก แแ แแก, แ แแแแแจแแช แแ แแแแแฆแ แแแแแฌแแแแแแ, แ แแแแ แช แแแฅแแแแแก แแแแแแแแแ แ, แแแฉแแแ แแแแฎแแ, แ แ แแแแแแแงแแแ แจแแแแแแ แแแแ แแกแแ แแแกแแก แแแกแแฌแแ แแ. แ แแช แแฅแแแแ แแแแฌแแ แ แงแแแแแคแแ แ แแ แแ แฉแแแ แแแแฌแแ แ
แแกแ แ แแ, แฉแแแ แแแแแฎแแแ แแแฆแแแ แแแขแแแ แแแแก แกแแ แแแกแแก แแแฌแแ แแก แแแแชแแแ, แ แแแแแก แแแแแแ แ แแแแชแแแ แแงแ แแแกแจแ แจแแแแกแฃแแ แแแแแชแแแแแแก แฌแแแแกแฌแแ แแแแฃแจแแแแแ แแ แแแแแชแแแแ แแแแแจแ แฉแแฌแแ แ. แแ แแแ แแแ แแแแแแแก แจแแกแแแแแแแก แจแแแแแ, แแแแแแแ แแ แจแแแแแแแแแแ, แ แแ แแ, แ แแแแ แช C++ แแแแแแแแแ แแ, แแแแแฌแแ แ แแก แกแแ แแแกแ แแ แแคแแกแแแแแแแ แแแแแงแแแแแแ. แแแแก แแขแแแชแแแ แแ แแก แแก, แ แแ แแก แแฅแแแแ แฃแคแ แ แกแฌแ แแคแ, แฃแคแ แ แแ แแแฃแฅแขแแฃแแ แแ แแแแแแแ, แแแฃแ แ แแฆแคแ แแแแแแแแฃแแ แแฅแแแแ แแแแ, แแฃ แ แแแแ แแแชแแ แ แแแแ แแแแ แแแ แแฃแแแแก แ แแกแฃแ แกแแแ. แ แแแแช แแ แแฃแแแกแฃแฎแ, แ แแ แแ แแกแแ แแก แแแแแแแแแแแ แแกแแแแกแ แ แแ C++-แจแ แแ แแแแแแแ แจแแแแซแแ แแแ แฉแแแแ 20+ แกแแแแก แแแแแแแแ แจแแกแแแแแแกแ แแแแแแแแแแแแแก แซแแแแแก, แจแแแแแแแกแ แแ แแแแแแจแแ แแแแก. แแแ แขแแแแ แ แแ แแแฅแแแ, แแ แแแแขแแแ. แกแฌแแ แแ แแก แแแแแแฌแงแแแขแแ แแ แแจแแแแแ แแแแแกแ แฃแแแ แงแแแแแคแแ แ แแแแแแจแ.
แแฎแแ, แแซแฃแแแแแแ แแแแแแแแแแชแแแก แแ แแก, แแแแแแฌแงแแแขแ แแแแแแ, แ แแแแ แแแแฌแแ แ แกแแ แแแกแแแ C++-แจแ. แแแ แแแแ แ แแช แฃแแแ แแแแแแแแแแแ แแงแ แจแแกแแคแแ แแกแ แแแแแแแแแแแก แแ แฉแแแ. แฉแแแ แแ แฉแแแแแ แแแแชแ
conanfile.txt
[แแแแแฎแแแก] poco/1.9.3
libpq/11.5
แแ แแแ แขแแแ แแ แซแแแแแแ "conan install ." แแแแแแกแขแแแแ แแ แกแแญแแ แ แแแแแแแแแแแแ. แแฃแแแแ แแแแ, แแกแแแ แแฃแชแแแแแแแ แแงแ แชแแแแแแแแแแก แจแแขแแแ
CMakeLists.txt
include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})
แแแแก แจแแแแแ แแแแแฌแงแ แแแแแแแแแแแก แซแแแแ PostgreSQL-แแแ แแฃแจแแแแแกแแแแก, แ แแแแแ แแก แแงแ แแแแแแแแแแ, แ แแแแแแแแแช แแฃแจแแแแแก แแชแแ แ แแแแแชแแแแแแ แแฅแแแแ แแ แแกแแแ แแงแ แแก, แ แแแแแแแแแแช แฉแแแแ Python แกแแ แแแกแแแ แฃแ แแแแ แแแแแแแ. แแ แแชแ แ แ แแแกแฌแแแแ? แแก POCO-แจแแ! แแแแ แแ แแแแแแแ แแ แแชแแก, แ แแ แแก แแ แแก POCO-แจแ แแ แแ แแชแแก แ แแแแ แแแจแแแแก แแแ; แกแแชแแแจแ แแ แแก แแแซแแแแแแฃแแ แแแแคแแแฃแ แแชแแแก แคแแแแ (แแ แจแแชแแแแแก แจแแกแแฎแแ แฃแแแ แแแแฌแแ แ POCO-แก แจแแแฅแแแแแแแก). แแก แแแจแแแแก, แ แแ แแฅแแแ แแแแแฌแแแ แกแฎแแ แแแแแแแแแแแก แซแแแแ.
แจแแแแแ แแ แฉแแแ แแ แฉแแแแแ แแแแแแแแ แแแแฃแแแ แฃแ แแแแแแแแแแแแ แแแแชแ
แจแแแแแแ แแแแแฏแ แแงแ แกแแ แแแกแแก แจแแแแแแแก แแแฌแแ แ, แ แแแแแกแแช แจแแฃแซแแแ แแแแฎแแแแแแแก แแแแฃแจแแแแแ.
แฉแแแ แฃแแแ แแแแแแแแ แแแแแ แแแแแฆแแ แฉแแแแ TemplateServerApp แแแแกแ Poco::Util::ServerApplication-แแแ แแ แแแแแฃแฅแแแ แซแแ แแแแแ แแแแแแ.
TemplateServerApp
#pragma once
#include <string>
#include <vector>
#include <Poco/Util/ServerApplication.h>
class TemplateServerApp : public Poco::Util::ServerApplication
{
protected:
int main(const std::vector<std::string> &);
};
int TemplateServerApp::main(const vector<string> &)
{
HTTPServerParams* pParams = new HTTPServerParams;
pParams->setMaxQueued(100);
pParams->setMaxThreads(16);
HTTPServer s(new TemplateRequestHandlerFactory, ServerSocket(8000), pParams);
s.start();
cerr << "Server started" << endl;
waitForTerminationRequest(); // wait for CTRL-C or kill
cerr << "Shutting down..." << endl;
s.stop();
return Application::EXIT_OK;
}
แแแแแแ แแแแแแจแ แฃแแแ แแแแแงแแแแ แแแ แแแแขแ แแแ: แแแ แขแ, แซแแคแแแแก แ แแแแแแแแ แแ แ แแแแก แแแแ. แแ แ แแช แแแแแแ แแ, แแฅแแแ แฃแแแ แแแฃแแแแแ แแแแแฃแจแแแแแแแ แจแแแแแแแแแ แแแแฎแแแแแแแกแแแแก. แแก แแแแแแแ แฅแแ แฎแแแก แจแแฅแแแแ
TemplateRequestHandlerFactory
class TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
{
return new TemplateServerAppHandler;
}
};
แฉแแแก แจแแแแฎแแแแแจแ, แแก แฃแแ แแแแ แงแแแแ แฏแแ แแ แฅแแแแก แแ แแกแ แแ แแแแแ แแแแแฃแจแแแแแแแก - TemplateServerAppHandler. แกแฌแแ แแ แแฅ แจแแแแแซแแแ แแแแแแแแแกแแ แฉแแแแ แแแแแแก แแแแแแ.
TemplateServerAppHandler
class TemplateServerAppHandler : public HTTPRequestHandler
{
public:
void handleRequest(HTTPServerRequest &req, HTTPServerResponse &resp)
{
URI uri(req.getURI());
string method = req.getMethod();
cerr << "URI: " << uri.toString() << endl;
cerr << "Method: " << req.getMethod() << endl;
StringTokenizer tokenizer(uri.getPath(), "/", StringTokenizer::TOK_TRIM);
HTMLForm form(req,req.stream());
if(!method.compare("POST"))
{
cerr << "POST" << endl;
}
else if(!method.compare("PUT"))
{
cerr << "PUT" << endl;
}
else if(!method.compare("DELETE"))
{
cerr << "DELETE" << endl;
}
resp.setStatus(HTTPResponse::HTTP_OK);
resp.setContentType("application/json");
ostream& out = resp.send();
out << "{"hello":"heh"}" << endl;
out.flush();
}
};
แแ แแกแแแ แจแแแฅแแแแ แแแแกแแก แจแแแแแแ PostgreSQL-แแแ แแฃแจแแแแแกแแแแก. แแแ แขแแแ SQL-แแก แจแแกแแกแ แฃแแแแแแ, แ แแแแ แแชแแ แชแฎแ แแแแก แจแแฅแแแ, แแ แกแแแแแก แแแแแแ ExecuteSQL(). แฃแคแ แ แ แแฃแแ แแแแฎแแแแแแแก แแ แแแแแชแแแแแแก แแแกแแฆแแแแ, แแฅแแแ แแแแแฌแแแ แแแแจแแ แแก แแแฆแแแ GetConnection () แแ แแแแแแงแแแแ libpg API. (แแแแแ แแแแแแแแแแแ แแแแแแแกแฌแแ แแ แแ แฃแกแแแแ แแแแแแก).
แแแแแชแแแแ แแแแ
#pragma once
#include <memory>
#include <mutex>
#include <libpq-fe.h>
class Database
{
public:
Database();
std::shared_ptr<PGconn> GetConnection() const;
bool ExecuteSQL(const std::string& sql);
private:
void establish_connection();
void LoadEnvVariables();
std::string m_dbhost;
int m_dbport;
std::string m_dbname;
std::string m_dbuser;
std::string m_dbpass;
std::shared_ptr<PGconn> m_connection;
};
แแแแแชแแแแ แแแแแกแแแ แแแแแแจแแ แแแแก แงแแแแ แแแ แแแแขแ แ แแฆแแแฃแแแ แแแ แแแแแแ, แแกแ แ แแ แแฅแแแ แแกแแแ แแญแแ แแแแแ .env แคแแแแแก แจแแฅแแแ แแ แแแแคแแแฃแ แแชแแ.
.แแแ
DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432
แแฅแแแ แจแแแแซแแแแ แแแฎแแ แงแแแแ แแแแ แแฅ
แแ แแฎแแ แแแแแก dockerfile แแ docker-compose.yml แแแฌแแ แแก แแแแ แแขแแแ. แแแ แแแแ แแแแฎแ แแ, แแแแก แงแแแแแแ แแแขแ แแ แ แแแกแญแแ แแ แแ แแ แ แแฎแแแแ แแแแขแแ, แ แแ แแ แแแ แแแแ, แ แแแแแ แกแแญแแ แ แแงแ แงแแแแ แฏแแ แแ แแแแแแแแแแแแแก แแฆแแแแแ, แแ แแแแ แแแแแแแก แฎแแ แแแแแแแก แแแแ. แแแแแแแแแ, แแแแกแแแแแก, แ แแ Conan-แแ แฉแแแแขแแแ แแแก, แแแแแแกแขแแแแ แแก แแ แแแจแแแแก แกแแญแแ แ แแแแแแแแแแฃแแแแแแ, แแ แแ แแก แกแแแแแ แแกแ แแแแกแแแแแก, แ แแ แแแแแแฌแแ แแก โconan install .โ, แแแ แแกแแแ แฃแแแ แแแแแ แแก -s compiler.libcxx=libstdc++11 แแแ แแแแขแ แ, แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ. แแฅแแแแ แแแแแชแฎแแแแก แแแแแแจแแ แแแแก แแขแแแแ แแฅแแแ แ แแกแแแแ แจแแชแแแแแแแก แแแแแฃแแแก แแแฆแแแแก. แแ แ แแแแแแแแ แกแแแแแก แแแแแแแแแแแจแ แแแแ แฉแ แแ แจแแชแแแแแ แแ แแแแแ แแแฅแแก, แ แแ แแก แกแขแแขแแ แแแแฎแแแ แแแ แกแฎแแ แแแแแแแแแแก แแ แแ แแแแแแแก แแแแแแ แแแแจแ แแแแแแ แแ แแจแ.
แจแแแแแ, docker-compose.yml-แแก แแแฌแแ แแก แจแแแแแ, แฉแแแ แแแแแแ แแก แ แฉแแแแ, แแแแแแแขแ แแฎแแ แแแญแแ แ
แแแแแ แแแฅแแก, แ แแ แแก แจแแแแแแ แแแแฎแแแ แแแ แแแแฌแงแแแแแแแแก REST API แแแแแแแชแแแแแก แจแแแฃแจแแแแแแก แ แแฃแ แแแแแ แแแ แแ แซแแแแ , แแแแ แแ แแกแแ แแแฃแฎแแ แฎแแแแ แแแแแ, แ แแแแ แแชแแ C++.
แแกแแแ, แแแ แฉแแแ แแฅ แฌแแแแแแฎแแ
แฌแงแแ แ: www.habr.com