C++ рдорд╛ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛рд╣рд░реВред рдХрд╛рд▓реНрдкрдирд┐рдХ рд╡рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛?

C++ рдорд╛ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛рд╣рд░реВред рдХрд╛рд▓реНрдкрдирд┐рдХ рд╡рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛?

рдпрд╕ рд▓реЗрдЦрдорд╛ рдо рдХрд╕рд░реА рдЯреЗрдореНрдкреНрд▓реЗрдЯ (рдХреБрдХреАрдХрдЯрд░) рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреБ рд░ рдбрдХрд░/рдбрдХрд░-рдХрдореНрдкреЛрдЬ рд░ рдХреЛрдирд╛рди рдкреНрдпрд╛рдХреЗрдЬ рдкреНрд░рдмрдиреНрдзрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ C++ рдорд╛ REST API рд╕реЗрд╡рд╛ рд▓реЗрдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреБред

рдЕрд░реНрдХреЛ рд╣реНрдпрд╛рдХрд╛рдердирдХреЛ рджреМрдбрд╛рди, рдЬрд╕рдорд╛ рдореИрд▓реЗ рдмреНрдпрд╛рдХрдПрдиреНрдб рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рдХреЛ рд░реВрдкрдорд╛ рднрд╛рдЧ рд▓рд┐рдПрдХреЛ рдерд┐рдПрдБ, рдЕрд░реНрдХреЛ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕ рд▓реЗрдЦреНрди рдХреЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рднрдиреНрдиреЗ рдкреНрд░рд╢реНрди рдЙрдареНрдпреЛред рдЕрд╣рд┐рд▓реЗ рд╕рдореНрдо рдЬреЗ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ, рддреНрдпреЛ рдореЗрд░реЛ рд░ рдореЗрд░реЛ рдиреИ рд╣реЛ рдХрд╛рдорд░реЗрдб рдкрд╛рдЗрдердирдорд╛, рдХрд┐рдирдХрд┐ рдореЗрд░реЛ рд╕рд╣рдХрд░реНрдореА рдпрд╕ рдХреНрд╖реЗрддреНрд░рдорд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдерд┐рдП рд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд░реВрдкрдорд╛ рдмреНрдпрд╛рдХрдПрдиреНрдбрд╣рд░реВ рд╡рд┐рдХрд╕рд┐рдд рдЧрд░реЗ, рдЬрдмрдХрд┐ рдо рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдПрдореНрдмреЗрдбреЗрдб рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдерд┐рдПрдБ рд░ рдареВрд▓реЛ рд░ рднрдпрд╛рдирдХ C++ рдорд╛ рд▓реЗрдЦреЗрдХреЛ рдерд┐рдПрдБ, рд░ рдореИрд▓реЗ рднрд░реНрдЦрд░ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдпрдорд╛ рдкрд╛рдЗрдерди рд╕рд┐рдХреЗред

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

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

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 рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЦреЛрдЬреНрди рдерд╛рд▓реЗ, рдХрд┐рдирдХрд┐ рдпреЛ рдПрдЙрдЯрд╛ рдерд┐рдпреЛ рдЬрд╕рдорд╛ рдореИрд▓реЗ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЕрдиреБрднрд╡ рдХрдо рдЧрд░реЗрдХреЛ рдерд┐рдПрдБ, рд░ рдпреЛ рд╣рд╛рдореНрд░реЛ рдкрд╛рдЗрдерди рд╕реЗрд╡рд╛рд╣рд░реВрд╕рдБрдЧ рдЕрдиреНрддрд░реНрдХреНрд░рд┐рдпрд╛ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред рдЕрдирд┐ рдореИрд▓реЗ рдХреЗ рд╕рд┐рдХреЗрдХреЛ рдЫреБ рдерд╛рд╣рд╛ рдЫ? рдпреЛ 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 рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдХреНрд▓рд╛рд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрдирд┐ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрдХреЛ рдЫреБред рд╕рд░рд▓ SQL рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди, рдЬрд╕реНрддреИ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдЙрди, рддреНрдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рдзрд┐ рдЫ ExecuteSQL()ред рдердк рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрдирд╣рд░реВ рд╡рд╛ рдбрд╛рдЯрд╛ рдкреБрди: рдкреНрд░рд╛рдкреНрддрд┐рдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдорд╛рд░реНрдлрдд рдЬрдбрд╛рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрдкрд░реНрдиреЗрдЫ рдЬрдбрд╛рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН() рд░ 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

рддрдкрд╛рдИрдВ рдорд╛ рд╕рдмреИ рдХреЛрдб рд╣реЗрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ githubред

C++ рдорд╛ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛рд╣рд░реВред рдХрд╛рд▓реНрдкрдирд┐рдХ рд╡рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛?

рд░ рдЕрдм dockerfile рд░ docker-compose.yml рд▓реЗрдЦреНрдиреЗ рдЕрдиреНрддрд┐рдо рдЪрд░рдг рдЖрдЙрдБрдЫред рдЗрдорд╛рдирджрд╛рд░реАрдкреВрд░реНрд╡рдХ рднрдиреНрдиреБрдкрд░реНрджрд╛, рдпрд╕рд▓реЗ рдзреЗрд░реИрдЬрд╕реЛ рд╕рдордп рд▓рд┐рдпреЛ, рд░ рдо рдПрдХ рдиреЛрдм рд╣реБрдБ рднрдиреЗрд░ рдорд╛рддреНрд░ рд╣реЛрдЗрди, рдХрд┐рдирдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдкреНрд░рддреНрдпреЗрдХ рдкрдЯрдХ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдерд┐рдпреЛ, рддрд░ рдХрд╛рдирдирдХрд╛ рдХрдордЬреЛрд░реАрд╣рд░реВрдХреЛ рдХрд╛рд░рдгрд▓реЗред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, conan рд▓рд╛рдИ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди, рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рд░ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐, "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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди