αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαž“αŸ…αž€αŸ’αž“αž»αž„ C ++ αŸ” αžšαžΏαž„αž”αŸ’αžšαžŒαž·αž αž¬αž€αžΆαžšαž–αž·αž?

αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαž“αŸ…αž€αŸ’αž“αž»αž„ C ++ αŸ” αžšαžΏαž„αž”αŸ’αžšαžŒαž·αž αž¬αž€αžΆαžšαž–αž·αž?

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αž„αŸ’αž€αžΎαžαž‚αŸ†αžšαžΌ (cookiecutter) αž“αž·αž„αžšαŸ€αž”αž…αŸ†αž”αžšαž·αžŸαŸ’αžαžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαžšαžŸαŸαžšαžŸαŸαžœαžΆ REST API αž“αŸ…αž€αŸ’αž“αž»αž„ C++ αžŠαŸ„αž™αž”αŸ’αžšαžΎ docker/docker-compose αž“αž·αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αž‰αŸ’αž…αž”αŸ‹ conan αŸ”

αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž› hackathon αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž…αžΌαž›αžšαž½αž˜αž‡αžΆαž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΆαž„αž€αŸ’αžšαŸ„αž™ αžŸαŸ†αžŽαž½αžšαž”αžΆαž“αž€αžΎαžαž‘αžΎαž„αž’αŸ†αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαžŸαžšαžŸαŸαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž˜αžΈαž€αŸ’αžšαžΌαž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ” αž’αŸ’αžœαžΈαŸ—β€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αžŸαžšαžŸαŸαžšβ€‹αžšαž αžΌαžβ€‹αž˜αž€β€‹αžŠαž›αŸ‹β€‹αž–αŸαž›β€‹αž“αŸαŸ‡ αž‚αžΊβ€‹αžŸαžšαžŸαŸαžšβ€‹αžŠαŸ„αž™β€‹αžαŸ’αž‰αž»αŸ† αž“αž·αž„β€‹αžαŸ’αž‰αž»αŸ† αžŸαž˜αž˜αž·αžαŸ’αž αž“αŸ…αž€αŸ’αž“αž»αž„ Python αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαžŸαž αžŸαŸαžœαž·αž€αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‡αžΆαž’αŸ’αž“αž€αž‡αŸ†αž“αžΆαž‰αž€αŸ’αž“αž»αž„αžœαž·αžŸαŸαž™αž“αŸαŸ‡ αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΆαž„αž€αŸ’αžšαŸ„αž™αž”αŸ’αžšαž€αž”αžŠαŸ„αž™αžœαž·αž‡αŸ’αž‡αžΆαž‡αžΈαžœαŸˆ αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž‡αžΆαž‘αžΌαž‘αŸ…αž‡αžΆαž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αž„αŸ’αž€αž”αŸ‹ αž“αž·αž„αžŸαžšαžŸαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„ C++ αžŠαŸαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™ αž“αž·αž„αž‚αž½αžšαž±αŸ’αž™αžαŸ’αž›αžΆαž… αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž‘αžΎαž”αžαŸ‚αžšαŸ€αž“ Python αž“αŸ…αžŸαžΆαž€αž›αžœαž·αž‘αŸ’αž™αžΆαž›αŸαž™αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžˆαž˜αž˜αž»αžαž“αžΉαž„αž—αžΆαžšαž€αž·αž…αŸ’αž…αž“αŸƒαž€αžΆαžšαžŸαžšαžŸαŸαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ‚αž›αž˜αžΆαž“αž”αž“αŸ’αž‘αž»αž€αžαŸ’αž–αžŸαŸ‹ αžŠαŸ‚αž›αž‡αžΆαž—αžΆαžšαž€αž·αž…αŸ’αž…αž…αž˜αŸ’αž”αž„αž‚αžΊαžαŸ’αžšαžΌαžœαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž˜αž€αžŠαž›αŸ‹αžœαžΆαž‡αžΆαž˜αž»αž“ αž αžΎαž™αžŸαžšαžŸαŸαžšαžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž”αŸ‚αž€αž•αŸ’αžŸαŸ‚αž„αž˜αž½αž™αž‘αŸ€αž αž˜αž·αžαŸ’αžαž˜αŸ’αž“αžΆαž€αŸ‹αž”αžΆαž“αžŸαŸ’αž“αžΎαž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αž€αŸ’αž“αž»αž„αž“αžΆαž˜αž‡αžΆαž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ C++ αžŸαžšαžŸαŸαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αŸαŸ‡αžŠαŸ„αž™αž”αŸ’αžšαžΎαž’αŸ’αž“αž€αž‡αŸ†αž“αžΆαž‰αŸ” αžŠαŸ„αž™αž›αžΎαž€αž αŸαžαž»αž•αž›αž“αŸαŸ‡αž‚αžΊαžαžΆαžœαžΆαž“αžΉαž„αž€αžΆαž“αŸ‹αžαŸ‚αž›αžΏαž“ αž•αž›αž·αžαž—αžΆαž–αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“ αž αžΎαž™αž‡αžΆαž‘αžΌαž‘αŸ… αž‚αžŽαŸˆαžœαž·αž“αž·αž…αŸ’αž†αŸαž™αž“αžΉαž„αžšαžΈαž€αžšαžΆαž™αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžšαž”αŸ€αž”αžŠαŸ‚αž›αž™αžΎαž„αžŠαžΉαž„αž–αžΈαžšαž”αŸ€αž”αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž’αž“αž’αžΆαž“αžšαž”αžŸαŸ‹αž€αŸ’αžšαž»αž˜αŸ” αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž†αŸ’αž›αžΎαž™αžαžΆ αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αžŠαŸ‚αž›αž’αŸ’αžœαžΎαžšαžΏαž„αž”αŸ‚αž”αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„ C++ αž αžΎαž™αž’αžΆαž…αž…αŸ†αžŽαžΆαž™αž–αŸαž› 20+ αž˜αŸ‰αŸ„αž„αžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžœαŸ‚αž„αžšαž€ αž…αž„αž€αŸ’αžšαž„ αž“αž·αž„αž—αŸ’αž‡αžΆαž”αŸ‹αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŠαŸ‚αž›αžŸαž˜αžšαž˜αŸ’αž™αž”αžΆαž“αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αŸ” αž“αž·αž™αžΆαž™β€‹αž²αŸ’αž™β€‹αž…αŸ†β€‹αž‘αŸ… αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αž…αžΉαž€αŸ” αž“αŸ„αŸ‡αž αžΎαž™αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αž αž αžΎαž™αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ„αž™αžŸαŸ’αž„αž”αŸ‹αžŸαŸ’αž„αžΆαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ PythonαŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž”αž„αŸ’αžαŸ†αžαŸ’αž›αž½αž“αž―αž„αž±αŸ’αž™αž“αŸ…αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžšαž€αžœαž·αž’αžΈαžŸαžšαžŸαŸαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αŸ…αž€αŸ’αž“αž»αž„ C++ αŸ” αžšαžΏαž„αžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž‚αžΊαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž›αžΎαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŠαŸ‚αž›αžŸαž˜αžšαž˜αŸ’αž™αŸ” αž‡αž˜αŸ’αžšαžΎαžŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αŸ’αž›αžΆαž€αŸ‹αž…αž»αŸ‡ pocoαž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž€αŸ’αž“αž»αž„αžšαž…αž“αžΆαž”αŸαž‘αŸ’αž˜αžαž˜αŸ’αžšαž„αŸ‹αž‘αž·αžŸαžœαžαŸ’αžαž» αž αžΎαž™αžαŸ‚αž˜αž‘αžΆαŸ†αž„αž˜αžΆαž“αž’αŸ†αž“αž½αžαžαžΆαž˜αžšαž™αŸˆαž―αž€αžŸαžΆαžšαž’αž˜αŸ’αž˜αžαžΆαŸ” αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸαŸ‡αž•αž„αžŠαŸ‚αžš, αžŸαŸ†αžŽαž½αžšαž”αžΆαž“αž€αžΎαžαž‘αžΎαž„αž’αŸ†αž–αžΈαž€αžΆαžšαž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαŸ” αžšαž αžΌαžαž˜αž€αžŠαž›αŸ‹αž…αŸ†αžŽαž»αž…αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αŸ’αžœαžΎαž€αžΆαžšαžαŸ‚αž‡αžΆαž˜αž½αž™ Visual Studio, IAR αž“αž·αž„ makefiles αž‘αž‘αŸαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž αžΎαž™β€‹αž‚αŸ’αž˜αžΆαž“β€‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’β€‹αž‘αžΆαŸ†αž„β€‹αž“αŸαŸ‡β€‹αž‘αžΆαž€αŸ‹β€‹αž‘αž„β€‹αž“αžΉαž„β€‹αžαŸ’αž‰αž»αŸ†β€‹αž‘αŸ αž–αŸ’αžšαŸ„αŸ‡β€‹αžαŸ’αž‰αž»αŸ†β€‹αž˜αžΆαž“β€‹αž‚αž˜αŸ’αžšαŸ„αž„β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšβ€‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜β€‹αž‘αžΆαŸ†αž„β€‹αž˜αžΌαž›β€‹αž€αŸ’αž“αž»αž„β€‹αž€αž»αž„αžαžΊαž“αŸαžš dockerαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž–αŸ’αž™αžΆαž™αžΆαž˜αžŸαŸ’αžœαŸ‚αž„αžšαž€ cmake αž“αž·αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ αž€αŸ„αžŽ. αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αž‰αŸ’αž…αž”αŸ‹αž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž˜αž½αž™αŸ”

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! αž”αŸ‰αž»αž“αŸ’αžαŸ‚ conan αž˜αž·αž“αžŠαžΉαž„αžαžΆαžœαžΆαžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„ POCO αž αžΎαž™αž˜αž·αž“αžŠαžΉαž„αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαžαžœαžΆαž‘αŸ αž˜αžΆαž“αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž αž½αžŸαžŸαž˜αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„ (αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαžšαžŸαŸαžšαžšαž½αž…αž αžΎαž™αž’αŸ†αž–αžΈαž€αŸ†αž αž»αžŸαž“αŸαŸ‡αž‘αŸ…αž€αžΆαž“αŸ‹αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαž POCO)αŸ” αž“αŸαŸ‡αž˜αžΆαž“αž“αŸαž™αžαžΆαž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαžšαž€αž˜αžΎαž›αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž‡αž˜αŸ’αžšαžΎαžŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αŸ’αž›αžΆαž€αŸ‹αž‘αŸ…αž›αžΎαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŠαŸ‚αž›αž˜αž·αž“αžŸαžΌαžœαž–αŸαž‰αž“αž·αž™αž˜ libpg. αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αžŸαŸ†αžŽαžΆαž„αž˜αž·αž“αž‚αž½αžšαž±αŸ’αž™αž‡αžΏ αžœαžΆαž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ conan αžšαž½αž…αž αžΎαž™ αž αžΎαž™αžαŸ‚αž˜αž‘αžΆαŸ†αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ† αž“αž·αž„αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αŸ”

αž‡αŸ†αž αžΆαž“αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‚αžΊαžαŸ’αžšαžΌαžœαžŸαžšαžŸαŸαžšαž‚αŸ†αžšαžΌαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ‚αž›αž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ†αžŽαžΎαŸ”
αž™αžΎαž„αžαŸ’αžšαžΌαžœαžαŸ‚αž‘αž‘αž½αž›αž˜αžšαžαž€ 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 αžŸαžΆαž˜αž‰αŸ’αž‰αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„αž˜αžΆαž“αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž˜αž½αž™αŸ” αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·SQL(). αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ†αžŽαž½αžšαžŠαŸ‚αž›αžŸαŸ’αž˜αž»αž‚αŸ’αžšαžŸαŸ’αž˜αžΆαž‰ αž¬αž€αžΆαžšαž‘αžΆαž‰αž™αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαžΆαž˜αžšαž™αŸˆ 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 αž•αž„αžŠαŸ‚αžšαŸ”

.NS

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

αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αž€αžΌαžŠαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ… github αŸ”

αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαž“αŸ…αž€αŸ’αž“αž»αž„ C ++ αŸ” αžšαžΏαž„αž”αŸ’αžšαžŒαž·αž αž¬αž€αžΆαžšαž–αž·αž?

αž αžΎαž™αž₯αž‘αžΌαžœαž“αŸαŸ‡αž˜αž€αžŠαž›αŸ‹αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αŸƒαž€αžΆαžšαžŸαžšαžŸαŸαžš dockerfile αž“αž·αž„ docker-compose.yml αŸ” αž“αž·αž™αžΆαž™αž±αŸ’αž™αžαŸ’αžšαž„αŸ‹αž‘αŸ… αžœαžΆαž”αžΆαž“αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž—αžΆαž‚αž…αŸ’αžšαžΎαž“ αž αžΎαž™αž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αžαŸ’αž‰αž»αŸ†αž‡αžΆαž€αŸ’αž˜αŸαž„αž“αŸ„αŸ‡αž‘αŸ αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αžŸαžΆαž„αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž‘αžΎαž„αžœαž·αž‰αžšαžΆαž›αŸ‹αž–αŸαž› αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž”αž‰αŸ’αž αžΆαžšαž”αžŸαŸ‹ conan αŸ” αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™ conan αž‘αžΆαž‰αž™αž€ αžŠαŸ†αž‘αžΎαž„ αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž…αžΆαŸ†αž”αžΆαž…αŸ‹ αžœαžΆαž˜αž·αž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆαž€αŸ’αž“αž»αž„αž€αžΆαžšαž‘αžΆαž‰αž™αž€ "conan install ." αžœαžΆαž€αŸαžαŸ’αžšαžΌαžœαž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš -s compiler.libcxx=libstdc++11 αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸ αž’αŸ’αž“αž€αž”αŸ’αžšαžαž»αž™αž“αžΉαž„αž€αžΆαžšαž‘αž‘αž½αž›αž€αŸ†αž αž»αžŸαž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž—αŸ’αž‡αžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‡αžΆαž”αŸ‹αž‚αžΆαŸ†αž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αŸ†αž αž»αžŸαž“αŸαŸ‡αž’αžŸαŸ‹αžšαž™αŸˆαž–αŸαž›αž‡αžΆαž…αŸ’αžšαžΎαž“αž˜αŸ‰αŸ„αž„ αž αžΎαž™αžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž“αžΉαž„αž‡αž½αž™αž˜αž“αž»αžŸαŸ’αžŸαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αžαž·αž…αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžŸαžšαžŸαŸαžš docker-compose.yml αžαžΆαž˜αžŠαŸ†αž”αžΌαž“αŸ’αž˜αžΆαž“αžšαž”αžŸαŸ‹αž˜αž·αžαŸ’αžαžαŸ’αž‰αž»αŸ† αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžš αž’αŸ’αž“αž€αž€αžΆαžαŸ‹αžαžΌαžƒαžΈ αž αžΎαž™αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αžαŸ’αž›αž½αž“αž’αŸ’αž“αž€αž“αžΌαžœαž‚αŸ†αžšαžΌαž–αŸαž‰αž›αŸαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ REST API αž“αŸ…αž€αŸ’αž“αž»αž„ C ++ αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“ αž“αž·αž„αžŠαŸ†αž‘αžΎαž„ PostgreSQL αžŠαŸ„αž™αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αž‰αŸ’αž…αžΌαž› "cookiecutter" αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžŸαžΌαž›αŸ” https://github.com/KovalevVasiliy/cpp_rest_api_template.git" αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ "docker-compose up-build" αŸ”

αžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž‚αŸ†αžšαžΌαž“αŸαŸ‡αž“αžΉαž„αž‡αž½αž™αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αž“αŸ…αž›αžΎαž•αŸ’αž›αžΌαžœαž›αŸ†αž”αžΆαž€αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ REST API αž‡αžΆαž—αžΆαžŸαžΆαžŠαŸαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™ αž“αž·αž„αž˜αžΆαž“αžαžΆαž˜αž–αž› αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αžΆαž—αžΆαžŸαžΆαžŠαŸ‚αž›αž…αŸ’αžšαž”αžΌαž€αž…αŸ’αžšαž”αž›αŸ‹αžŠαžΌαž…αž‡αžΆ C ++ αž‡αžΆαžŠαžΎαž˜αŸ”
αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸαŸ‡αž•αž„αžŠαŸ‚αžš αžαŸ’αž‰αž»αŸ†αžŸαžΌαž˜αž•αŸ’αžαž›αŸ‹αž’αž“αž»αžŸαžΆαžŸαž“αŸαž±αŸ’αž™αž’αžΆαž“αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž“αŸαŸ‡ αž’αžαŸ’αžαž”αž‘αŸ” αžœαžΆαž–αž“αŸ’αž™αž›αŸ‹αž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ POCO αž“αž·αž„αžŸαžšαžŸαŸαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ REST API αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹