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

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

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдореИрдВрдиреЗ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ (рдХреБрдХреАрдХрдЯрд░) рдмрдирд╛рдпрд╛ рдФрд░ рдбреЙрдХрд░/рдбреЙрдХрд░-рдХрдВрдкреЛрдЬрд╝ рдФрд░ рдХреЙрдирди рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C++ рдореЗрдВ REST API рд╕реЗрд╡рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ред

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

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

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

conanfile.txt
[рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ]рдкреЛрдХреЛ/1.9.3
libpq/11.5

[рдЬрдирд░реЗрдЯрд░] рд╕реЗрдореЗрдХ

рдФрд░ рдПрдХ рд╕рд░рд▓ рдХрдорд╛рдВрдб "рдХреЙрдирди рдЗрдВрд╕реНрдЯреЙрд▓" рдХреЗ рд╕рд╛рдеред рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ. рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рдерд╛

CMakeLists.txt

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

рдЙрд╕рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ PostgreSQL рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░ рджреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдереА рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдореБрдЭреЗ рдмрд╣реБрдд рдХрдо рдЕрдиреБрднрд╡ рдерд╛, рдФрд░ рдпрд╣ рд╡рд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рдереА рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдкрд╛рдпрдерди рд╕реЗрд╡рд╛рдПрдВ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддреА рдереАрдВред рдФрд░ рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рд╕реАрдЦрд╛? рдпрд╣ POCO рдореЗрдВ рд╣реИ! рд▓реЗрдХрд┐рди рдХреЙрдирди рдХреЛ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ POCO рдореЗрдВ рд╣реИ рдФрд░ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП; рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдПрдХ рдкреБрд░рд╛рдиреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╣реИ (рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА POCO рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЛ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ)ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рджреВрд╕рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдвреВрдВрдврдиреА рд╣реЛрдЧреАред

рдФрд░ рдлрд┐рд░ рдореЗрд░реА рдкрд╕рдВрдж рдПрдХ рдХрдо рд▓реЛрдХрдкреНрд░рд┐рдп рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдкрдбрд╝реА libpg. рдФрд░ рдореИрдВ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдерд╛, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЙрдирди рдореЗрдВ рдерд╛ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕реЗ рдЕрд╕реЗрдВрдмрд▓ рдФрд░ рдЕрд╕реЗрдВрдмрд▓ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛ред

рдЕрдЧрд▓рд╛ рдХрджрдо рдПрдХ рд╕реЗрд╡рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд┐рдЦрдирд╛ рдерд╛ рдЬреЛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХреЗред
рд╣рдореЗрдВ рдЕрдкрдиреА 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ред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдЕрдкрдирд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЯреЗрдореНрдкреНрд▓реЗрдЯрд╕рд░реНрд╡рд░рдРрдкрд╣реИрдВрдбрд▓рд░

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 рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

.env

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

рдЖрдк рд╕рднреА рдХреЛрдб рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ github.

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

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

рдЖрдЧреЗ, docker-compose.yml рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдкрдиреЗ рдорд┐рддреНрд░ рдХреА рд╕рд▓рд╛рд╣ рдкрд░, рдореИрдВрдиреЗ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рдХреБрдХреА рдХрд╛ рдврд╛рдВрдЪрд╛ рдФрд░ рдЕрдм рдЖрдк рдХреЗрд╡рд▓ рдХрдВрд╕реЛрд▓ рдореЗрдВ "рдХреБрдХреАрдХрдЯрд░" рджрд░реНрдЬ рдХрд░рдХреЗ рдПрдХ рдЕрдиреБрдХреВрд▓рд┐рдд рд╡рд╛рддрд╛рд╡рд░рдг рдФрд░ PostgreSQL рд╕реНрдерд╛рдкрд┐рдд рдХреЗ рд╕рд╛рде C++ рдореЗрдВ REST API рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред https://github.com/KovalevVasiliy/cpp_rest_api_template.git" рдФрд░ рдлрд┐рд░ "рдбреЙрдХрд░-рдХрдВрдкреЛрдЬрд╝ рдЕрдк-рдмрд┐рд▓реНрдб"ред

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ