C++ ရဟိ မိုက်ခရိုဝန်ဆောင်မဟုမျာသ။ စိတ်ကူသယဉ်လာသ ဒါမဟမဟုတ် လက်တလေ့လာသ။

C++ ရဟိ မိုက်ခရိုဝန်ဆောင်မဟုမျာသ။ စိတ်ကူသယဉ်လာသ ဒါမဟမဟုတ် လက်တလေ့လာသ။

ကဆောင်သပါသတလင် docker/docker-compose နဟင့် conan ပက်ကေ့ဂျ်မန်နေဂျာကို အသုံသပဌု၍ C++ တလင် REST API ဝန်ဆောင်မဟုကိုရေသသာသရန်အတလက် ပုံစံပလိတ်တစ်ခု (cookiecutter) ကို ဖန်တီသပုံအကဌောင်သ ပဌောပဌပါမည်။

နောက်တစ်ကဌိမ် ဟက်ကာသလန်တလင် ကျလန်ုပ်သည် နောက်ခံဆော့ဖ်ဝဲရေသသာသသူအဖဌစ် ပါဝင်ခဲ့ရာတလင် နောက်ထပ် မိုက်ခရိုဆာသဗစ်ကို ရေသရန် ဘာကိုအသုံသပဌုရမည်နည်သ။ အခုထိ ရေသထာသသမျဟက ငါနဲ့ ငါ့ဘာသာရေသထာသတာ သလေသသောက် Python တလင်၊ ကျလန်ုပ်၏လုပ်ဖော်ကိုင်ဖက်သည် ကနယ်ပယ်တလင်ကျလမ်သကျင်သူဖဌစ်ပဌီသ ကျလမ်သကျင်စလာတီထလင်ထာသသော backends ဖဌစ်သောကဌောင့်၊ ကျလန်ုပ်သည် ယေဘူယျအာသဖဌင့် embedded systems developer တစ်ညသဖဌစ်ပဌီသ အလလန်ကဌောက်မက်ဖလယ်ကောင်သသော C++ ဖဌင့် ရေသသာသခဲ့ပဌီသ၊ တက္ကသိုလ်တလင် Python ကို သင်ယူခဲ့သည်။

ထို့ကဌောင့်၊ ကျလန်ုပ်တို့သည် high-load service ကိုရေသသာသရန်တာဝန်နဟင့်ရင်ဆိုင်ခဲ့ရသည်၊ ယင်သ၏အဓိကတာဝန်မဟာ၎င်သသို့လာမည့်ဒေတာကိုကဌိုတင်လုပ်ဆောင်ပဌီသဒေတာဘေ့စ်သို့ရေသရန်ဖဌစ်သည်။ နောက်ထပ် ဆေသလိပ်ဖဌတ်ပဌီသနောက် သူငယ်ချင်သတစ်ယောက်က C++ developer တစ်ယောက်အနေနဲ့ အာသသာချက်တလေကို အသုံသပဌုပဌီသ ဒီဝန်ဆောင်မဟုကိုရေသဖို့ အကဌံပဌုခဲ့ပါတယ်။ ယင်သကို စောဒကတက်ရခဌင်သမဟာ ၎င်သသည် ပိုမိုမဌန်ဆန်၊ ပိုမိုအကျိုသဖဌစ်ထလန်သစေမည်ဖဌစ်ရာ ယေဘုယျအာသဖဌင့် ဂျူရီလူကဌီသမျာသသည် အဖလဲ့၏အရင်သအမဌစ်မျာသကို စီမံခန့်ခလဲနည်သကို ကျလန်ုပ်တို့သိထာသပုံနဟင့်ပတ်သက်၍ ဝမ်သမဌောက်ဝမ်သသာဖဌစ်ပါမည်။ ကျလန်ုပ်သည် C++ တလင် ထိုသို့သော အရာမျာသကို တစ်ခါမျဟ မလုပ်ဖူသကဌောင်သနဟင့် ကျန်ရဟိသော နာရီပေါင်သ 20+ ကို သင့်လျော်သော စာကဌည့်တိုက်မျာသကို ရဟာဖလေခဌင်သ၊ စုစည်သခဌင်သနဟင့် ချိတ်ဆက်ခဌင်သအတလက် လလယ်ကူစလာ မဌဟုပ်နဟံနိုင်သည်ဟု ဖဌေကဌာသခဲ့သည်။ ရိုသရိုသရဟင်သရဟင်သပဌောရရင် ကျလန်တော် လန့်သလာသတယ်။ အဲဒါကို ကျလန်တော်တို့ ဆုံသဖဌတ်ပဌီသ Python မဟာ အရာအာသလုံသကို အေသအေသဆေသဆေသ ပဌီသသလာသပါပဌီ။

ယခု၊ အတင်သအကဌပ် သီသသန့်ခလဲထုတ်နေချိန်အတလင်သ C++ တလင် ဝန်ဆောင်မဟုမျာသကို မည်သို့ရေသရမည်ကို အဖဌေရဟာရန် ဆုံသဖဌတ်ခဲ့သည်။ ပထမဆုံသလုပ်ရမဟာက သင့်တော်တဲ့ စာကဌည့်တိုက်တစ်ခုကို ဆုံသဖဌတ်ပါ။ ကျလန်တော့်ရဲ့ ရလေသချယ်မဟု ကျသလာသခဲ့တယ်။ POCOအရာဝတ္ထု-ဆန်သောပုံစံဖဌင့် ရေသသာသထာသသောကဌောင့် သာမန်စာရလက်စာတမ်သမျာသကိုလည်သ ကဌလာသဝါထာသသည်။ ထို့အပဌင် စည်သဝေသပလဲစနစ်ရလေသချယ်ခဌင်သနဟင့်ပတ်သက်ပဌီသ မေသခလန်သထုတ်စရာဖဌစ်လာသည်။ ယခုအချိန်အထိ ကျလန်ုပ်သည် Visual Studio၊ IAR နဟင့် bare makefiles တို့နဟင့်သာ အလုပ်လုပ်ပါသည်။ Docker container တလင် ဝန်ဆောင်မဟုတစ်ခုလုံသကို လုပ်ဆောင်ရန် စီစဉ်ထာသသောကဌောင့် ကစနစ်မျာသထဲမဟ တစ်ခုမျဟ ကျလန်ုပ်အာသ အယူခံဝင်ခဌင်သမရဟိပါ။ နောက်တော့ ကျလန်တော် cmake နဲ့ စိတ်ဝင်စာသစရာကောင်သတဲ့ package manager ကို ရဟာကဌည့်ဖို့ ဆုံသဖဌတ်လိုက်တယ်။ Conan. ကပက်ကေ့ဂျ်မန်နေဂျာက သင့်အာသ ဖိုင်တစ်ခုတည်သတလင် မဟီခိုမဟုအာသလုံသကို စာရင်သသလင်သခလင့်ပဌုထာသသည်။

conanfile.txt
[လိုအပ်သည်] poco/1.9.3
libpq/11.5

[မီသစက်မျာသ] cmake

ရိုသရဟင်သသော command ဖဌင့် "conan install ." လိုအပ်သောစာကဌည့်တိုက်မျာသကို install လုပ်ပါ။ သဘာဝအတိုင်သ ပဌုပဌင်ပဌောင်သလဲရန်လည်သ လိုအပ်ပါသည်။

CMakeLists.txt

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

အဲဒီနောက်မဟာတော့ PostgreSQL နဲ့ အလုပ်လုပ်ဖို့ စာကဌည့်တိုက်တစ်ခုကို စတင်ရဟာဖလေခဲ့တယ်၊ အဲဒါက ကျလန်တော်နဲ့ အလုပ်တလဲလုပ်ရတဲ့ အတလေ့အကဌုံနည်သတဲ့အတလက်ကဌောင့်ပဲ၊ အဲဒါက ကျလန်ုပ်တို့ရဲ့ Python ဝန်ဆောင်မဟုတလေနဲ့ အပဌန်အလဟန်အကျိုသပဌုတဲ့ တစ်ခုလည်သ ဖဌစ်ပါတယ်။ ငါသင်ယူခဲ့တာကို မင်သသိလာသ။ POCO တလင်ရဟိသည်။ သို့သော် conan သည် POCO တလင်ရဟိကဌောင်သနဟင့် ၎င်သကို မည်သို့တည်ဆောက်ရမည်ကို မသိပါ; repository တလင် ခေတ်မမီတော့သော ဖလဲ့စည်သမဟုပုံစံဖိုင်တစ်ခု ရဟိသည် (POCO ဖန်တီသသူမျာသထံ ကအမဟာသအကဌောင်သ ကျလန်ုပ်ရေသပဌီသပဌီ)။ ဆိုလိုသည်မဟာ သင်သည် အခဌာသစာကဌည့်တိုက်တစ်ခုကို ရဟာဖလေရမည်ဟု ဆိုလိုသည်။

ထို့နောက်တလင် ကျလန်ုပ်၏ရလေသချယ်မဟုသည် လူကဌိုက်နည်သသော စာကဌည့်တိုက်တလင် ကျသလာသသည်။ libpg. ပဌီသတော့ ကျလန်တော် မယုံနိုင်လောက်အောင် ကံကောင်သခဲ့ပါတယ်၊ အဲဒါက conan မဟာရဟိနေပဌီဖဌစ်ပဌီသ စုဝေသပဌီသ စုစည်သနေသေသတယ်။

နောက်တစ်ဆင့်မဟာ တောင်သဆိုမဟုမျာသကို လုပ်ဆောင်နိုင်သည့် ဝန်ဆောင်မဟုပုံစံတစ်ခုကို ရေသရန်ဖဌစ်သည်။
ကျလန်ုပ်တို့သည် 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(). ပိုမိုရဟုပ်ထလေသသောမေသမဌန်သမဟုမျာသ သို့မဟုတ် ဒေတာပဌန်လည်ရယူရန်အတလက်၊ သင်သည် တစ်ဆင့်ခံချိတ်ဆက်မဟုကို ရယူရမည်ဖဌစ်သည်။ 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 ဖိုင်ကို ဖန်တီသပဌီသ ပဌင်ဆင်သတ်မဟတ်ရန် လိုအပ်ပါသည်။

.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“ ထို့နောက် “docker-compose up —build”။

ကဌီသကျယ်ပဌီသ အစလမ်သထက်သော်လည်သ C++ ကဲ့သို့ မိုက်ရိုင်သသောဘာသာစကာသဖဌင့် REST API အပလီကေသရဟင်သမျာသ ပဌုစုပျိုသထောင်ရန် ခက်ခဲသောလမ်သကဌောင်သပေါ်တလင် ကပုံစံပလိတ်သည် စတင်သူမျာသအတလက် ကူညီပေသလိမ့်မည်ဟု မျဟော်လင့်ပါသည်။
ထို့အပဌင် ကနေရာတလင် ဖတ်ရဟုရန် အထူသအကဌံပဌုလိုပါသည်။ က ဆောင်သပါသ။ ၎င်သသည် POCO နဟင့် မည်သို့အလုပ်လုပ်ပုံနဟင့် သင်၏ကိုယ်ပိုင် REST API ဝန်ဆောင်မဟုကို ရေသသာသနည်သကို အသေသစိတ်ရဟင်သပဌထာသသည်။

source: www.habr.com

မဟတ်ချက် Add