SWC-DB  v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
ColumnGet.h
Go to the documentation of this file.
1 /*
2  * SWC-DB© Copyright since 2019 Alex Kashirin <kashirin.alex@gmail.com>
3  * License details at <https://github.com/kashirin-alex/swc-db/#license>
4  */
5 
6 
7 #ifndef swcdb_manager_Protocol_handlers_ColumnGet_h
8 #define swcdb_manager_Protocol_handlers_ColumnGet_h
9 
10 
12 
13 
14 namespace SWC { namespace Comm { namespace Protocol {
15 namespace Mngr { namespace Handler {
16 
17 
18 void mngr_update_response(const ConnHandlerPtr& conn, const Event::Ptr& ev,
19  int err, Params::ColumnGetReq::Flag flag,
20  const DB::Schema::Ptr& schema) {
21  if(!err && !schema)
23 
24  auto cbp = err
25  ? Buffers::make(ev, 4)
26  : Buffers::make(ev, Params::ColumnGetRsp(flag, schema), 4);
27  cbp->append_i32(err);
28  conn->send_response(cbp);
29 }
30 
31 
32 
34  public:
35  typedef std::shared_ptr<MngrColumnGet> Ptr;
36 
38  MngrColumnGet(const ConnHandlerPtr& a_conn, const Event::Ptr& a_ev,
40  const Params::ColumnGetReq& params)
41  : client::ConnQueue::ReqBase(
42  Buffers::make(
43  params, 0, COLUMN_GET, a_ev->header.timeout_ms)
44  ),
45  conn(a_conn), ev(a_ev), flag(a_flag) {
46  }
47 
48  virtual ~MngrColumnGet() noexcept { }
49 
50  bool valid() override {
51  return !ev->expired() &&
52  conn->is_open() &&
54  }
55 
56  void handle_no_conn() override {
57  if(valid())
58  request_again();
59  else if(!Env::Mngr::mngd_columns()->running())
62  }
63 
64  void handle(ConnHandlerPtr, const Event::Ptr& a_ev) override {
65  Params::ColumnGetRsp params;
66  int err = a_ev->response_code();
67  if(!err) {
68  try {
69  const uint8_t *ptr = a_ev->data.base + 4;
70  size_t remain = a_ev->data.size - 4;
71  params.decode(&ptr, &remain);
72  if(params.schema &&
73  Env::Mngr::mngd_columns()->is_active(params.schema->cid)) {
74  int tmperr;
75  Env::Mngr::schemas()->add(tmperr, params.schema);
76  }
77  } catch(...) {
80  err = e.code();
81  }
82  }
83 
84  if(valid())
85  mngr_update_response(conn, ev, err, flag, params.schema);
86  }
87 
88  private:
92 
93 };
94 
95 
97  switch(params.flag) {
98  case Params::ColumnGetReq::Flag::SCHEMA_BY_ID:
99  return Env::Mngr::schemas()->get(params.cid);
100 
101  case Params::ColumnGetReq::Flag::SCHEMA_BY_NAME:
102  return Env::Mngr::schemas()->get(params.name);
103 
104  case Params::ColumnGetReq::Flag::ID_BY_NAME:
105  return Env::Mngr::schemas()->get(params.name);
106 
107  default:
109  return nullptr;
110  }
111 }
112 
113 void column_get(const ConnHandlerPtr& conn, const Event::Ptr& ev) {
114  try {
115 
116  const uint8_t *ptr = ev->data.base;
117  size_t remain = ev->data.size;
118 
119  Params::ColumnGetReq params;
120  params.decode(&ptr, &remain);
121 
122  int err = Error::OK;
123  DB::Schema::Ptr schema;
124  if(Env::Mngr::mngd_columns()->is_schemas_mngr(err)) {
125  if(!err)
126  schema = get_schema(err, params);
127  return mngr_update_response(conn, ev, err, params.flag, schema);
128  }
129 
130  schema = get_schema(err, params);
131  if(schema || err)
132  return mngr_update_response(conn, ev, err, params.flag, schema);
133 
134  auto flag = params.flag;
135  if(flag == Params::ColumnGetReq::Flag::ID_BY_NAME)
136  params.flag = Params::ColumnGetReq::Flag::SCHEMA_BY_NAME;
137 
139  MngrColumnGet::Ptr(new MngrColumnGet(conn, ev, flag, params)));
140 
141  } catch(...) {
145  conn, ev, e.code(), Params::ColumnGetReq::Flag::ID_BY_NAME, nullptr);
146  }
147 
148 }
149 
150 
151 
152 }}}}}
153 
154 #endif // swcdb_manager_Protocol_handlers_ColumnGet_h
SWC::DB::Schemas::add
void add(int &err, const Schema::Ptr &schema)
Definition: Schemas.cc:19
SWC::Comm::Protocol::Mngr::Params::ColumnGetReq
Definition: ColumnGet.h:18
SWC::Error::Exception::code
constexpr SWC_CAN_INLINE int code() const noexcept
Definition: Exception.h:51
SWC::Error::COLUMN_SCHEMA_NAME_NOT_EXISTS
@ COLUMN_SCHEMA_NAME_NOT_EXISTS
Definition: Error.h:105
SWC_LOG_OSTREAM
#define SWC_LOG_OSTREAM
Definition: Logger.h:44
SWC::Comm::Protocol::Mngr::Params::ColumnGetReq::cid
cid_t cid
Definition: ColumnGet.h:45
SWC::Error::SERVER_SHUTTING_DOWN
@ SERVER_SHUTTING_DOWN
Definition: Error.h:84
SWC::Manager::MngdColumns::is_active
bool is_active(cid_t cid) noexcept
Definition: MngdColumns.cc:139
SWC::DB::Schema::Ptr
std::shared_ptr< Schema > Ptr
Definition: Schema.h:185
SWC_LOG_OUT
#define SWC_LOG_OUT(pr, _code_)
Definition: Logger.h:178
SWC::Comm::Protocol::Mngr::Params::ColumnGetReq::Flag
Flag
Definition: ColumnGet.h:21
SWC::Comm::Protocol::Mngr::Handler::mngr_update_response
void mngr_update_response(const ConnHandlerPtr &conn, const Event::Ptr &ev, int err, Params::ColumnGetReq::Flag flag, const DB::Schema::Ptr &schema)
Definition: ColumnGet.h:18
SWC::client::Query::ReqBase
Comm::client::ConnQueue::ReqBase ReqBase
Definition: Profiling.h:21
SWC::Comm::client::ConnQueueReqBase
Definition: ClientConnQueue.h:22
SWC::Comm::Protocol::Mngr::Handler::MngrColumnGet::conn
ConnHandlerPtr conn
Definition: ColumnGet.h:89
SWC::Comm::client::ConnQueueReqBase::request_again
void request_again()
Definition: ClientConnQueue.cc:12
SWC::Comm::Protocol::Mngr::Handler::MngrColumnGet::flag
Mngr::Params::ColumnGetReq::Flag flag
Definition: ColumnGet.h:91
SWC::Comm::Protocol::Mngr::Handler::MngrColumnGet::handle
void handle(ConnHandlerPtr, const Event::Ptr &a_ev) override
Definition: ColumnGet.h:64
SWC::Comm::Protocol::Mngr::Handler::get_schema
DB::Schema::Ptr get_schema(int &err, const Params::ColumnGetReq &params)
Definition: ColumnGet.h:96
timeout_ms
uint32_t timeout_ms
Request timeout.
Definition: Header.h:58
SWC::Error::OK
@ OK
Definition: Error.h:45
SWC_CAN_INLINE
#define SWC_CAN_INLINE
Definition: Compat.h:102
SWC::DB::Schemas::get
Schema::Ptr get(cid_t cid) noexcept
Definition: Schemas.cc:56
SWC::Comm::Protocol::Mngr::Handler::MngrColumnGet::ev
Event::Ptr ev
Definition: ColumnGet.h:90
SWC_CURRENT_EXCEPTION
#define SWC_CURRENT_EXCEPTION(_msg_)
Definition: Exception.h:119
SWC::Manager::MngdColumns::running
SWC_CAN_INLINE bool running() const noexcept
Definition: MngdColumns.h:47
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
SWC::Env::Mngr::mngd_columns
static SWC_CAN_INLINE Manager::MngdColumns * mngd_columns() noexcept
Definition: MngrEnv.h:74
SWC::Comm::Protocol::Mngr::Handler::column_get
void column_get(const ConnHandlerPtr &conn, const Event::Ptr &ev)
Definition: ColumnGet.h:113
SWC::Comm::Protocol::Mngr::Params::ColumnGetReq::name
std::string name
Definition: ColumnGet.h:44
ColumnGet.h
SWC::Comm::Protocol::Mngr::Handler::MngrColumnGet
Definition: ColumnGet.h:33
SWC::Comm::Buffers
Definition: Buffers.h:20
SWC::LOG_ERROR
@ LOG_ERROR
Definition: Logger.h:32
SWC::Comm::ConnHandlerPtr
std::shared_ptr< ConnHandler > ConnHandlerPtr
Definition: AppContext.h:17
SWC::Comm::Protocol::Mngr::COLUMN_GET
@ COLUMN_GET
Definition: Commands.h:66
SWC::Comm::Buffers::make
static SWC_CAN_INLINE Ptr make(uint32_t reserve=0)
Definition: Buffers.h:27
SWC::Env::Mngr::schemas
static SWC_CAN_INLINE Manager::Schemas * schemas() noexcept
Definition: MngrEnv.h:54
SWC::Comm::Protocol::Mngr::Params::ColumnGetRsp
Definition: ColumnGet.h:59
SWC::Comm::Protocol::Mngr::Handler::MngrColumnGet::handle_no_conn
void handle_no_conn() override
Definition: ColumnGet.h:56
SWC::Comm::Protocol::Mngr::Handler::MngrColumnGet::valid
bool valid() override
Definition: ColumnGet.h:50
SWC::Comm::Serializable::decode
void decode(const uint8_t **bufp, size_t *remainp)
Definition: Serializable.h:59
SWC::Env::Mngr::role
static SWC_CAN_INLINE Manager::MngrRole * role() noexcept
Definition: MngrEnv.h:64
SWC::Manager::MngrRole::req_mngr_inchain
void req_mngr_inchain(const Comm::client::ConnQueue::ReqBase::Ptr &req)
Definition: MngrRole.cc:137
SWC::Comm::Event::Ptr
std::shared_ptr< Event > Ptr
Definition: Event.h:33
SWC::Error::COLUMN_UNKNOWN_GET_FLAG
@ COLUMN_UNKNOWN_GET_FLAG
Definition: Error.h:103
SWC::Comm::Protocol::Mngr::Params::ColumnGetRsp::schema
DB::Schema::Ptr schema
Definition: ColumnGet.h:74
SWC::Comm::Protocol::Mngr::Handler::MngrColumnGet::MngrColumnGet
SWC_CAN_INLINE MngrColumnGet(const ConnHandlerPtr &a_conn, const Event::Ptr &a_ev, Params::ColumnGetReq::Flag a_flag, const Params::ColumnGetReq &params)
Definition: ColumnGet.h:38
SWC::Comm::Protocol::Mngr::Handler::MngrColumnGet::~MngrColumnGet
virtual ~MngrColumnGet() noexcept
Definition: ColumnGet.h:48
SWC::Comm::Protocol::Mngr::Handler::MngrColumnGet::Ptr
std::shared_ptr< MngrColumnGet > Ptr
Definition: ColumnGet.h:35
SWC::Error::Exception
Definition: Exception.h:21
SWC::Comm::Protocol::Mngr::Params::ColumnGetReq::flag
Flag flag
Definition: ColumnGet.h:43