C++ рдордзреАрд▓ рд╕реВрдХреНрд╖реНрдо рд╕реЗрд╡рд╛. рдХрд╛рд▓реНрдкрдирд┐рдХ рдХрд┐рдВрд╡рд╛ рд╡рд╛рд╕реНрддрд╡?

C++ рдордзреАрд▓ рд╕реВрдХреНрд╖реНрдо рд╕реЗрд╡рд╛. рдХрд╛рд▓реНрдкрдирд┐рдХ рдХрд┐рдВрд╡рд╛ рд╡рд╛рд╕реНрддрд╡?

рдпрд╛ рд▓реЗрдЦрд╛рдд рдореА рдЯреЗрдореНрдкреНрд▓реЗрдЯ (рдХреБрдХреАрдХрдЯрд░) рдХрд╕реЗ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЖрдгрд┐ рдбреЙрдХрд░/рдбреЙрдХрд░-рдХрдВрдкреЛрдЬ рдЖрдгрд┐ рдХреЙрдирди рдкреЕрдХреЗрдЬ рдореЕрдиреЗрдЬрд░ рд╡рд╛рдкрд░реВрди C++ рдордзреНрдпреЗ REST API рд╕реЗрд╡рд╛ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╕реЗ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдпрд╛рдмрджреНрджрд▓ рдмреЛрд▓реЗрди.

рдкреБрдвреАрд▓ рд╣реЕрдХрд╛рдереЙрди рджрд░рдореНрдпрд╛рди, рдЬреНрдпрд╛рдордзреНрдпреЗ рдореА рдмреЕрдХрдПрдВрдб рдбреЗрд╡реНрд╣рд▓рдкрд░ рдореНрд╣рдгреВрди рднрд╛рдЧ рдШреЗрддрд▓рд╛ рд╣реЛрддрд╛, рдкреБрдвреАрд▓ рдорд╛рдпрдХреНрд░реЛрд╕рд░реНрд╡реНрд╣рд┐рд╕ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рдп рд╡рд╛рдкрд░рд╛рд╡реЗ рдпрд╛рдмрджреНрджрд▓ рдкреНрд░рд╢реНрди рдирд┐рд░реНрдорд╛рдг рдЭрд╛рд▓рд╛. рдЖрддреНрддрд╛рдкрд░реНрдпрдВрдд рдЬреЗ рдХрд╛рд╣реА рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ рддреЗ рд╕рд░реНрд╡ рдореА рдЖрдгрд┐ рдорд╛рдЭреЗ рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ рдХреЙрдореНрд░реЗрдб рдкрд╛рдпрдердирдордзреНрдпреЗ, рдорд╛рдЭрд╛ рд╕рд╣рдХрд╛рд░реА рдпрд╛ рдХреНрд╖реЗрддреНрд░рд╛рддреАрд▓ рддрдЬреНрдЮ рдЕрд╕рд▓реНрдпрд╛рдиреЗ рдЖрдгрд┐ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХрд░рд┐рддреНрдпрд╛ рдмреЕрдХрдПрдВрдб рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗ рд╣реЛрддреЗ, рддрд░ рдореА рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдПрдореНрдмреЗрдбреЗрдб рд╕рд┐рд╕реНрдЯрдо рдбреЗрд╡реНрд╣рд▓рдкрд░ рд╣реЛрддреЛ рдЖрдгрд┐ рдорд╣рд╛рди рдЖрдгрд┐ рднрдпрд╛рдирдХ C++ рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рддреЛ рдЖрдгрд┐ рдореА рдиреБрдХрддреЗрдЪ рд╡рд┐рджреНрдпрд╛рдкреАрдард╛рдд рдкрд╛рдпрдерди рд╢рд┐рдХрд▓реЛ.

рдореНрд╣рдгреВрди, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЙрдЪреНрдЪ-рд▓реЛрдб рд╕реЗрд╡рд╛ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреЗ рдХрд╛рд░реНрдп рд╣реЛрддреЗ, рдЬреНрдпрд╛рдЪреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣реЛрддреЗ рддреНрдпрд╛рдХрдбреЗ рдпреЗрдгрд╛рд░рд╛ рдбреЗрдЯрд╛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдгреЗ рдЖрдгрд┐ рдбреЗрдЯрд╛рдмреЗрд╕рд╡рд░ рд▓рд┐рд╣рд┐рдгреЗ. рдЖрдгрд┐ рджреБрд╕рд░реНтАНрдпрд╛ рд╕реНрдореЛрдХ рдмреНрд░реЗрдХрдирдВрддрд░, рдПрдХрд╛ рдорд┐рддреНрд░рд╛рдиреЗ рд╕реБрдЪрд╡рд▓реЗ рдХреА рдореА, рдПрдХ C++ рд╡рд┐рдХрд╕рдХ рдореНрд╣рдгреВрди, рд╕рд╛рдзрдХрд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рд╣реА рд╕реЗрд╡рд╛ рд▓рд┐рд╣рд╛. рдпрд╛рд╡рд░ рдпреБрдХреНрддрд┐рд╡рд╛рдж рдХрд░рдгреЗ рдореНрд╣рдгрдЬреЗ рддреЗ рдЬрд▓рдж, рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдирдХреНрд╖рдо рдЕрд╕реЗрд▓ рдЖрдгрд┐ рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рд╕рдВрдШрд╛рдЪреА рд╕рдВрд╕рд╛рдзрдиреЗ рдХрд╢реА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛рдпрдЪреА рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдХрд╕реЗ рдХрд│рддреЗ рдпрд╛рдЪрд╛ рдЬреНрдпреВрд░реАрд▓рд╛ рдЖрдирдВрдж рд╣реЛрдИрд▓. рдЬреНрдпрд╛рд▓рд╛ рдореА рдЙрддреНрддрд░ рджрд┐рд▓реЗ рдХреА рдореА рдЕрд╢рд╛ рдЧреЛрд╖реНрдЯреА C++ рдордзреНрдпреЗ рдХрдзреАрдЪ рдХреЗрд▓реНрдпрд╛ рдирд╛рд╣реАрдд рдЖрдгрд┐ рдЙрд░рд▓реЗрд▓реЗ 20+ рддрд╛рд╕ рдпреЛрдЧреНрдп рд▓рд╛рдпрдмреНрд░рд░реА рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА, рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд▓рд┐рдВрдХ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд╣рдЬрдкрдгреЗ рдШрд╛рд▓рд╡реВ рд╢рдХреЗрди. рд╕реЛрдкреНрдпрд╛ рднрд╛рд╖реЗрдд рд╕рд╛рдВрдЧрд╛рдпрдЪреЗ рддрд░, рдореА рдЪрд┐рдХрди рдмрд╛рд╣реЗрд░ рдХрд╛рдврд▓реЗ. рдЖрдореНрд╣реА рддреЗрдЪ рдард░рд╡рд▓реЗ рдЖрдгрд┐ рдкрд╛рдпрдердирдордзреАрд▓ рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╢рд╛рдВрддрдкрдгреЗ рдкреВрд░реНрдг рдХреЗрд▓реЗ.

рдЖрддрд╛, рд╕рдХреНрддреАрдЪреНрдпрд╛ рд╕реЗрд▓реНрдл-рдЖрдпрд╕реЛрд▓реЗрд╢рди рджрд░рдореНрдпрд╛рди, рдореА C++ рдордзреНрдпреЗ рд╕реЗрд╡рд╛ рдХрд╢рд╛ рд▓рд┐рд╣рд╛рдпрдЪреНрдпрд╛ рд╣реЗ рд╢реЛрдзрдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛. рд╕рд░реНрд╡рдкреНрд░рдердо рдпреЛрдЧреНрдп рд▓рд╛рдпрдмреНрд░рд░реА рдард░рд╡рд╛рдпрдЪреА. рдорд╛рдЭреА рдирд┐рд╡рдб рдкрдбрд▓реА poco, рдХрд╛рд░рдг рддреЗ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рд╢реИрд▓реАрдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рд╣реЛрддреЗ рдЖрдгрд┐ рд╕рд╛рдорд╛рдиреНрдп рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рджреЗрдЦреАрд▓ рдмрдврд╛рдИ рдорд╛рд░рддреЗ. рддрд╕реЗрдЪ, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкреНрд░рдгрд╛рд▓реА рдирд┐рд╡рдбрдгреНрдпрд╛рдмрд╛рдмрдд рдкреНрд░рд╢реНрди рдирд┐рд░реНрдорд╛рдг рдЭрд╛рд▓рд╛. рдЖрддрд╛рдкрд░реНрдпрдВрдд рдореА рдлрдХреНрдд рд╡реНрд╣рд┐рдЬреНрдпреБрдЕрд▓ рд╕реНрдЯреБрдбрд┐рдУ, рдЖрдпрдПрдЖрд░ рдЖрдгрд┐ рдмреЗрдЕрд░ рдореЗрдХрдлрд╛рдИрд▓реНрд╕рдордзреНрдпреЗ рдХрд╛рдо рдХреЗрд▓реЗ рдЖрд╣реЗ. рдЖрдгрд┐ рдпрд╛рдкреИрдХреА рдХреЛрдгрддреНрдпрд╛рд╣реА рдкреНрд░рдгрд╛рд▓реАрдиреЗ рдорд▓рд╛ рдЖрд╡рд╛рд╣рди рдХреЗрд▓реЗ рдирд╛рд╣реА, рдХрд╛рд░рдг рдореА рд╕рдВрдкреВрд░реНрдг рд╕реЗрд╡рд╛ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪреА рдпреЛрдЬрдирд╛ рдЖрдЦрд▓реА рд╣реЛрддреА. рдордЧ рдореА cmake рдЖрдгрд┐ рдПрдХ рдордиреЛрд░рдВрдЬрдХ рдкреЕрдХреЗрдЬ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╢реЛрдзрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛ рдХрд╛рдирди. рдпрд╛ рдкреЕрдХреЗрдЬ рдореЕрдиреЗрдЬрд░рдиреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд░реНрд╡ рдЕрд╡рд▓рдВрдмрдирд╛рдВрдЪреА рдПрдХрд╛ рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдиреЛрдВрджрдгреА рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджрд┐рд▓реА

conanfile.txt
[рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ]poco/1.9.3
libpq/11.5

[рдЬрдирд░реЗрдЯрд░] cmake

рдЖрдгрд┐ "conan install ." рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдпрдмреНрд░рд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛. рд╕рд╛рд╣рдЬрд┐рдХрдЪ рддреНрдпрд╛рдд рдмрджрд▓ рдХрд░рдгреЗрд╣реА рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ

CMakeLists.txt

include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})

рддреНрдпрд╛рдирдВрддрд░, рдореА PostgreSQL рд╕реЛрдмрдд рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд▓рд╛рдпрдмреНрд░рд░реА рд╢реЛрдзреВ рд▓рд╛рдЧрд▓реЛ, рдХрд╛рд░рдг рдорд▓рд╛ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдЪрд╛ рдлрд╛рд░рд╕рд╛ рдЕрдиреБрднрд╡ рдирд╡реНрд╣рддрд╛ рдЖрдгрд┐ рдЖрдордЪреНрдпрд╛ Python рд╕реЗрд╡рд╛рдВрд╢реА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрд▓рд╛. рдЖрдгрд┐ рдореА рдХрд╛рдп рд╢рд┐рдХрд▓реЛ рд╣реЗ рддреБрд▓рд╛ рдорд╛рд╣реАрдд рдЖрд╣реЗ рдХрд╛? рд╣реЗ POCO рдордзреНрдпреЗ рдЖрд╣реЗ! рдкрд░рдВрддреБ рдХреЛрдирдирд▓рд╛ рд╣реЗ рдорд╛рд╣рд┐рдд рдирд╛рд╣реА рдХреА рддреЗ POCO рдордзреНрдпреЗ рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рдХрд╕реЗ рддрдпрд╛рд░ рдХрд░рд╛рд╡реЗ рд╣реЗ рдорд╛рд╣рд┐рдд рдирд╛рд╣реА; рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рдПрдХ рдЬреБрдиреА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рдЖрд╣реЗ (рдореА рдЖрдзреАрдЪ рдпрд╛ рддреНрд░реБрдЯреАрдмрджреНрджрд▓ POCO рдЪреНрдпрд╛ рдирд┐рд░реНрдорд╛рддреНрдпрд╛рдВрдирд╛ рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ). рдпрд╛рдЪрд╛ рдЕрд░реНрде рддреБрдореНрд╣рд╛рд▓рд╛ рджреБрд╕рд░реА рд▓рд╛рдпрдмреНрд░рд░реА рд╢реЛрдзрд╛рд╡реА рд▓рд╛рдЧреЗрд▓.

рдЖрдгрд┐ рдордЧ рдорд╛рдЭреА рдирд┐рд╡рдб рдХрдореА рд▓реЛрдХрдкреНрд░рд┐рдп рд▓рд╛рдпрдмреНрд░рд░реАрд╡рд░ рдкрдбрд▓реА libpg. рдЖрдгрд┐ рдореА рдЖрд╢реНрдЪрд░реНрдпрдХрд╛рд░рдХрдкрдгреЗ рднрд╛рдЧреНрдпрд╡рд╛рди рд╣реЛрддреЛ, рддреЗ рдЖрдзреАрдЪ рдХреЛрдирдирдордзреНрдпреЗ рд╣реЛрддреЗ рдЖрдгрд┐ рдЕрдЧрджреА рдПрдХрддреНрд░ рдЖрдгрд┐ рдПрдХрддреНрд░ рдХреЗрд▓реЗ рдЬрд╛рдд рд╣реЛрддреЗ.

рдкреБрдвреАрд▓ рдкрд╛рдпрд░реА рдореНрд╣рдгрдЬреЗ рд╕реЗрд╡рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд┐рд╣рд┐рдгреЗ рдЬреЗ рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реВ рд╢рдХрддреЗ.
рдЖрдореНрд╣рд╛рд▓рд╛ Poco::Util::ServerApplication рдХрдбреВрди рдЖрдордЪрд╛ TemplateServerApp рд╡рд░реНрдЧ рд╡рд╛рд░рд╕рд╛ рдорд┐рд│рд╛рд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ рдЖрдгрд┐ рдореБрдЦреНрдп рдкрджреНрдзрдд рдУрд╡реНрд╣рд░рд░рд╛рдЗрдб рдХреЗрд▓реА рдкрд╛рд╣рд┐рдЬреЗ.

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 рд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдореА рдПрдХ рд╡рд░реНрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рджреЗрдЦреАрд▓ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЖрд╣реЗ. рд╕рд╛рдзреЗ рдПрд╕рдХреНрдпреВрдПрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЬрд╕реЗ рдХреА рдЯреЗрдмрд▓ рддрдпрд╛рд░ рдХрд░рдгреЗ, рдПрдХ рдкрджреНрдзрдд рдЖрд╣реЗ рдПрдХреНрдЭрд┐рдХреНрдпреВрдЯрдПрд╕рдХреНрдпреВрдПрд▓(). рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрдирд╛рдВрд╕рд╛рдареА рдХрд┐рдВрд╡рд╛ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддреАрд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдпрд╛рджреНрд╡рд╛рд░реЗ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ рдХрдиреЗрдХреНрд╢рди рдорд┐рд│рд╡рд╛() рдЖрдгрд┐ 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 рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдЖрдгрд┐ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рджреЗрдЦреАрд▓ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

.env

DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432

рдпреЗрдереЗ рддреБрдореНрд╣реА рд╕рд░реНрд╡ рдХреЛрдб рдкрд╛рд╣реВ рд╢рдХрддрд╛ github

C++ рдордзреАрд▓ рд╕реВрдХреНрд╖реНрдо рд╕реЗрд╡рд╛. рдХрд╛рд▓реНрдкрдирд┐рдХ рдХрд┐рдВрд╡рд╛ рд╡рд╛рд╕реНрддрд╡?

рдЖрдгрд┐ рдЖрддрд╛ dockerfile рдЖрдгрд┐ docker-compose.yml рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪрд╛ рдЕрдВрддрд┐рдо рдЯрдкреНрдкрд╛ рдпреЗрддреЛ. рдЦрд░реЗ рд╕рд╛рдВрдЧрд╛рдпрдЪреЗ рддрд░, рдпрд╛рд╕ рдмрд░рд╛рдЪ рд╡реЗрд│ рд▓рд╛рдЧрд▓рд╛, рдЖрдгрд┐ рдХреЗрд╡рд│ рдореА рдиреВрдм рдЖрд╣реЗ рдореНрд╣рдгреВрди рдирд╛рд╣реА, рдХрд╛рд░рдг рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдВрдЪреА рдкреБрдирд░реНрдмрд╛рдВрдзрдгреА рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ, рдкрд░рдВрддреБ рдХреЙрдирдирдЪреНрдпрд╛ рддреНрд░реБрдЯреАрдВрдореБрд│реЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдХреЙрдирди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдЖрд╡рд╢реНрдпрдХ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, "conan install" рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдгреЗ рдкреБрд░реЗрд╕реЗ рдирд╛рд╣реА, рддреНрдпрд╛рд▓рд╛ -s compiler.libcxx=libstdc++11 рдкреЕрд░рд╛рдореАрдЯрд░ рджреЗрдЦреАрд▓ рдкрд╛рд╕ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЕрдиреНрдпрдерд╛ рддреБрдордЪрд╛ рдЕрд░реНрдЬ рдЬреЛрдбрдгреНрдпрд╛рдЪреНрдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдиреЗрдХ рддреНрд░реБрдЯреА рдорд┐рд│рдгреНрдпрд╛рдЪрд╛ рдзреЛрдХрд╛ рдЖрд╣реЗ. рдореА рдЕрдиреЗрдХ рддрд╛рд╕рд╛рдВрдкрд╛рд╕реВрди рдпрд╛ рддреНрд░реБрдЯреАрдордзреНрдпреЗ рдЕрдбрдХрд▓реЛ рдЖрд╣реЗ рдЖрдгрд┐ рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рд╣рд╛ рд▓реЗрдЦ рдЗрддрд░ рд▓реЛрдХрд╛рдВрдирд╛ рдХрдореА рд╡реЗрд│реЗрдд рдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░реЗрд▓.

рдкреБрдвреЗ, docker-compose.yml рд▓рд┐рд╣рд┐рд▓реНрдпрд╛рдирдВрддрд░, рдорд╛рдЭреНрдпрд╛ рдорд┐рддреНрд░рд╛рдЪреНрдпрд╛ рд╕рд▓реНрд▓реНрдпрд╛рдиреБрд╕рд╛рд░, рдореА рд╕рдорд░реНрдерди рдЬреЛрдбрд▓реЗ рдХреБрдХреАрдХрдЯрд░ рдЖрдгрд┐ рдЖрддрд╛ рддреБрдореНрд╣реА рд╕реНрд╡рддрдГрд▓рд╛ C++ рдордзреАрд▓ REST API рд╕реЗрд╡реЗрд╕рд╛рдареА, рд╕рд╛рдиреБрдХреВрд▓рд┐рдд рд╡рд╛рддрд╛рд╡рд░рдгрд╛рд╕рд╣, рдЖрдгрд┐ PostgreSQL рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВрди, рдлрдХреНрдд рдХрдиреНрд╕реЛрд▓рдордзреНрдпреЗ "рдХреБрдХреАрдХрдЯрд░" рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░реВрди рд╕реНрд╡рддрдГрд▓рд╛ рдПрдХ рдкреВрд░реНрдг рдЯреЗрдореНрдкрд▓реЗрдЯ рдорд┐рд│рд╡реВ рд╢рдХрддрд╛. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" рдЖрдгрд┐ рдирдВрддрд░ тАЬрдбреЙрдХрд░-рдХрдВрдкреЛрдЬ рдЕрдк тАФрдмрд┐рд▓реНрдбтАЭ.

рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рд╣реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдирд╡рд╢рд┐рдХреНрдпрд╛рдВрдирд╛ REST API рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдХрдареАрдг рдорд╛рд░реНрдЧрд╛рд╡рд░ рдЙрддреНрдХреГрд╖реНрдЯ рдЖрдгрд┐ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рдкрд░рдВрддреБ C++ рд╕рд╛рд░рдЦреНрдпрд╛ рдЕрдирд╛рдбрд╝реА рднрд╛рд╖реЗрдд рдорджрдд рдХрд░реЗрд▓.
рддрд╕реЗрдЪ, рдореА рдпреЗрдереЗ рд╡рд╛рдЪрдгреНрдпрд╛рдЪреА рдЬреЛрд░рджрд╛рд░ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ рд╣реЗ рд▓реЗрдЦ. рд╣реЗ POCO рд╕рд╣ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рд╛рд╡реЗ рдЖрдгрд┐ рддреБрдордЪреА рд╕реНрд╡рддрдГрдЪреА REST API рд╕реЗрд╡рд╛ рдХрд╢реА рд▓рд┐рд╣рд╛рд╡реА рдпрд╛рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд░реНрдгрди рдХрд░рддреЗ.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛