SWC-DB  v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
AppHandler.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 #ifndef swcdb_app_thriftbroker_AppHandler_h
7 #define swcdb_app_thriftbroker_AppHandler_h
8 
9 
10 #include "swcdb/core/Semaphore.h"
12 #include "swcdb/thrift/gen-cpp/Broker.h"
14 
15 #include <thrift/transport/TSocket.h>
16 
19 
24 
25 
26 namespace SWC {
27 namespace thrift = apache::thrift;
28 
29 
30 namespace ThriftBroker {
31 
32 
33 using namespace Thrift;
34 
35 
36 class AppHandler final : virtual public BrokerIf {
37  public:
38 
39  typedef std::shared_ptr<AppHandler> Ptr;
40 
41  const std::shared_ptr<thrift::transport::TSocket> socket;
42 
43  AppHandler(const std::shared_ptr<thrift::transport::TSocket>& a_socket)
44  : socket(a_socket),
45  m_mutex(), m_updaters(), m_processing(0), m_run(true) {
46  }
47 
48  virtual ~AppHandler() noexcept { }
49 
50  void stop() {
51  m_run.store(false);
52  size_t n = 0;
53  bool closed = false;
54  for(size_t updaters = 0;;) {
55  if(!m_processing) {
56  if(!closed) {
57  socket->close();
58  closed = true;
59  }
60  Core::MutexSptd::scope lock(m_mutex);
61  if(!(updaters = m_updaters.size()))
62  return;
63  }
64  if(!(++n % 10)) {
66  "In-process=" SWC_FMT_LU " updaters=" SWC_FMT_LU " check=" SWC_FMT_LU,
67  m_processing.load(), updaters, n
68  );
69  }
70  std::this_thread::sleep_for(std::chrono::milliseconds(300));
71  }
72  }
73 
74  /* SQL any */
75  void exec_sql(Result& _return, const std::string& sql) override {
76  Processing process(this);
77 
78  int err = Error::OK;
79  std::string message;
80  auto cmd = client::SQL::recognize_cmd(err, sql, message);
81  if(err)
82  Converter::exception(err, message);
83 
84  switch(cmd) {
85 
89  return sql_mng_column(sql);
90 
92  sql_list_columns(_return.schemas, sql);
93  return;
94  }
95 
96  case client::SQL::SELECT : {
97  sql_select(_return.cells, sql);
98  return;
99  }
100 
102  sql_compact_columns(_return.compact, sql);
103  return;
104  }
105 
106  case client::SQL::UPDATE :
107  return sql_update(sql, 0);
108 
109  default: { }
110  }
111  }
112 
113 
114  /* SQL SCHEMAS/COLUMNS */
115  void sql_list_columns(Schemas& _return, const std::string& sql) override {
116  Processing process(this);
117 
118  int err = Error::OK;
119  DB::SchemasVec dbschemas;
120  get_schemas(err, "list", sql, dbschemas);
121  process_results(err, dbschemas, _return);
122  }
123 
124  void sql_mng_column(const std::string& sql) override {
125  Processing process(this);
126 
127  int err = Error::OK;
128  std::string message;
129  DB::Schema::Ptr schema;
130  auto func = Comm::Protocol::Mngr::Params::ColumnMng::Function::CREATE;
132  err, sql,
133  &func,
134  schema, message);
135  if(err)
136  Converter::exception(err, message);
137 
138  mng_column(func, schema);
139  }
140 
141  void sql_compact_columns(CompactResults& _return,
142  const std::string& sql) override {
143  Processing process(this);
144 
145  int err = Error::OK;
146  DB::SchemasVec dbschemas;
147  get_schemas(err, "compact", sql, dbschemas);
148  process_results(err, dbschemas, _return);
149  }
150 
151  /* SQL QUERY */
155  int err = Error::OK;
156  DB::Specs::Scan specs;
157  std::string message;
158  uint8_t display_flags = 0;
159  client::SQL::parse_select(err, hdlr->clients, sql, specs, display_flags, message);
160  if(!err) {
161  hdlr->scan(err, std::move(specs));
162  if(!err)
163  hdlr->wait();
164  }
165  if(err)
166  Converter::exception(err, message);
167  return hdlr;
168  }
169 
170  void sql_query(CellsGroup& _return, const std::string& sql,
171  const CellsResult::type rslt) override {
172  Processing process(this);
173 
174  switch(rslt) {
175  case CellsResult::ON_COLUMN : {
176  sql_select_rslt_on_column(_return.ccells, sql);
177  break;
178  }
179  case CellsResult::ON_KEY : {
180  sql_select_rslt_on_key(_return.kcells, sql);
181  break;
182  }
183  case CellsResult::ON_FRACTION : {
184  sql_select_rslt_on_fraction(_return.fcells, sql);
185  break;
186  }
187  default : {
188  sql_select(_return.cells, sql);
189  break;
190  }
191  }
192  }
193 
194  void sql_select(Cells& _return, const std::string& sql) override {
195  Processing process(this);
196 
197  auto hdlr = sync_select(sql);
198 
199  int err = Error::OK;
200  process_results(err, hdlr, _return);
201  if(err)
203  }
204 
205  void sql_select_plain(CellsPlain& _return, const std::string& sql) override {
206  Processing process(this);
207 
208  auto hdlr = sync_select(sql);
209 
210  int err = Error::OK;
211  process_results(err, hdlr, _return);
212  if(err)
214  }
215 
216  void sql_select_rslt_on_column(CCells& _return,
217  const std::string& sql) override {
218  Processing process(this);
219 
220  auto hdlr = sync_select(sql);
221 
222  int err = Error::OK;
223  process_results(err, hdlr, _return);
224  if(err)
226  }
227 
228  void sql_select_rslt_on_key(KCells& _return,
229  const std::string& sql) override {
230  Processing process(this);
231 
232  auto hdlr = sync_select(sql);
233 
234  int err = Error::OK;
235  process_results(err, hdlr, _return);
236  if(err)
238  }
239 
240  void sql_select_rslt_on_fraction(FCells& _return,
241  const std::string& sql) override {
242  Processing process(this);
243 
244  auto hdlr = sync_select(sql);
245 
246  int err = Error::OK;
247  process_results(err, hdlr, _return);
248  if(err)
250  }
251 
252 
253  void sql_select_counter(CellsCounter& _return, const std::string& sql) override {
254  Processing process(this);
255 
256  auto hdlr = sync_select(sql);
257 
258  int err = Error::OK;
259  process_results(err, hdlr, _return);
260  if(err)
262  }
263 
264 
265  void sql_select_serial(CellsSerial& _return, const std::string& sql) override {
266  Processing process(this);
267 
268  auto hdlr = sync_select(sql);
269 
270  int err = Error::OK;
271  process_results(err, hdlr, _return);
272  if(err)
274  }
275 
276 
277  /* SQL UPDATE */
278  void sql_update(const std::string& sql, const int64_t updater_id) override {
279  Processing process(this);
280 
282  if(updater_id)
283  updater(updater_id, hdlr);
284  else
287 
288  std::string message;
289  uint8_t display_flags = 0;
290  int err = Error::OK;
291  client::SQL::parse_update(err, sql, hdlr, display_flags, message);
292  if(err)
293  Converter::exception(err, message);
294 
295  if(updater_id) {
296  hdlr->commit_or_wait();
297  } else {
298  hdlr->commit_if_need();
299  hdlr->wait();
300  }
301  if((err = hdlr->error()))
303  }
304 
305 
306  /* SPECS SCHEMAS/COLUMNS */
307 
308  void list_columns(Schemas& _return,
309  const SpecSchemas& spec) override {
310  Processing process(this);
311 
312  int err = Error::OK;
313  DB::SchemasVec dbschemas;
314  get_schemas(err, spec, dbschemas);
315  process_results(err, dbschemas, _return);
316  }
317 
318  void mng_column(const SchemaFunc::type func,
319  const Schema& schema) override {
320  Processing process(this);
321 
322  DB::Schema::Ptr dbschema = DB::Schema::make();
323  Converter::set(schema, dbschema);
324  mng_column(
326  dbschema
327  );
328  }
329 
330  void compact_columns(CompactResults& _return,
331  const SpecSchemas& spec) override {
332  Processing process(this);
333 
334  int err = Error::OK;
335  DB::SchemasVec dbschemas;
336  get_schemas(err, spec, dbschemas);
337  process_results(err, dbschemas, _return);
338  }
339 
340  /* SPECS SCAN QUERY */
344  int err = Error::OK;
345  DB::Specs::Scan specs;
346 
347  if(spec.__isset.flags)
348  Converter::set(spec.flags, specs.flags);
349 
350  DB::Schema::Ptr schema;
351 
352  for(auto& col : spec.columns_plain) {
353  schema = hdlr->clients->get_schema(err, col.cid);
354  if(!schema)
355  Converter::exception(err, "cid=" + std::to_string(col.cid));
356  if(schema->col_type != DB::Types::Column::PLAIN)
357  Converter::exception(Error::INCOMPATIBLE_OPTIONS, "Mismatching Column Type");
358 
359  auto& dbcol = specs.columns.emplace_back(col.cid, col.intervals.size());
360  for(auto& intval : col.intervals) {
361  Converter::set(intval, *dbcol.add(schema->col_type).get());
362  }
363  }
364 
365  for(auto& col : spec.columns_counter) {
366  schema = hdlr->clients->get_schema(err, col.cid);
367  if(!schema)
368  Converter::exception(err, "cid=" + std::to_string(col.cid));
369  if(!DB::Types::is_counter(schema->col_type))
370  Converter::exception(Error::INCOMPATIBLE_OPTIONS, "Mismatching Column Type");
371 
372  auto& dbcol = specs.columns.emplace_back(col.cid, col.intervals.size());
373  for(auto& intval : col.intervals) {
374  Converter::set(intval, *dbcol.add(schema->col_type).get());
375  }
376  }
377 
378  for(auto& col : spec.columns_serial) {
379  schema = hdlr->clients->get_schema(err, col.cid);
380  if(!schema)
381  Converter::exception(err, "cid=" + std::to_string(col.cid));
382  if(schema->col_type != DB::Types::Column::SERIAL)
383  Converter::exception(Error::INCOMPATIBLE_OPTIONS, "Mismatching Column Type");
384 
385  auto& dbcol = specs.columns.emplace_back(col.cid, col.intervals.size());
386  for(auto& intval : col.intervals) {
387  Converter::set(intval, *dbcol.add(schema->col_type).get());
388  }
389  }
390 
391  if(!err) {
392  hdlr->scan(err, std::move(specs));
393  if(!err)
394  hdlr->wait();
395  }
396  if(err)
398  return hdlr;
399  }
400 
401  void scan_rslt_on(CellsGroup& _return, const SpecScan& specs,
402  const CellsResult::type rslt) override {
403  Processing process(this);
404 
405  switch(rslt) {
406  case CellsResult::ON_COLUMN : {
407  scan_rslt_on_column(_return.ccells, specs);
408  break;
409  }
410  case CellsResult::ON_KEY : {
411  scan_rslt_on_key(_return.kcells, specs);
412  break;
413  }
414  case CellsResult::ON_FRACTION : {
415  scan_rslt_on_fraction(_return.fcells, specs);
416  break;
417  }
418  default : {
419  scan(_return.cells, specs);
420  break;
421  }
422  }
423  }
424 
425  void scan(Cells& _return, const SpecScan& specs) override {
426  Processing process(this);
427 
428  auto hdlr = sync_select(specs);
429 
430  int err = Error::OK;
431  process_results(err, hdlr, _return);
432  if(err)
434  }
435 
436  void scan_rslt_on_column(CCells& _return, const SpecScan& specs) override {
437  Processing process(this);
438 
439  auto hdlr = sync_select(specs);
440 
441  int err = Error::OK;
442  process_results(err, hdlr, _return);
443  if(err)
445  }
446 
447  void scan_rslt_on_key(KCells& _return, const SpecScan& specs) override {
448  Processing process(this);
449 
450  auto hdlr = sync_select(specs);
451 
452  int err = Error::OK;
453  process_results(err, hdlr, _return);
454  if(err)
456  }
457 
458  void scan_rslt_on_fraction(FCells& _return, const SpecScan& specs) override {
459  Processing process(this);
460 
461  auto hdlr = sync_select(specs);
462 
463  int err = Error::OK;
464  process_results(err, hdlr, _return);
465  if(err)
467  }
468 
469 
470  /* UPDATER */
471  int64_t updater_create(const int32_t buffer_size) override {
472  Processing process(this);
473 
474  Core::MutexSptd::scope lock(m_mutex);
475 
476  int64_t id = 1;
477  for(auto it = m_updaters.cbegin();
478  it != m_updaters.cend();
479  it = m_updaters.find(++id)
480  );
481  auto& hdlr = m_updaters[id] =
484  if(buffer_size)
485  hdlr->buff_sz.store(buffer_size);
486 
488  sizeof(hdlr) + sizeof(*hdlr.get()));
489  return id;
490  }
491 
492  void updater_close(const int64_t id) override {
493  Processing process(this);
494 
496  {
497  Core::MutexSptd::scope lock(m_mutex);
498 
499  auto it = m_updaters.find(id);
500  if(it == m_updaters.cend())
501  Converter::exception(ERANGE, "Updater ID not found");
502  hdlr = it->second;
503  m_updaters.erase(it);
504  }
505  updater_close(hdlr);
507  sizeof(hdlr) + sizeof(*hdlr.get()));
508  }
509 
510  /* UPDATE-PLAIN */
511  void update_plain(const UCCellsPlain& cells,
512  const int64_t updater_id) override {
513  Processing process(this);
514 
516  if(updater_id)
517  updater(updater_id, hdlr);
518  else
521 
522  set_cols(cells, hdlr);
523  set(cells, hdlr);
524 
525  if(updater_id) {
526  hdlr->commit_or_wait();
527  } else {
528  hdlr->commit_if_need();
529  hdlr->wait();
530  }
531  if(int err = hdlr->error())
533  }
534 
535  /* UPDATE-COUNTER */
536  void update_counter(const UCCellsCounter& cells,
537  const int64_t updater_id) override {
538  Processing process(this);
539 
541  if(updater_id)
542  updater(updater_id, hdlr);
543  else
546 
547  set_cols(cells, hdlr);
548  set(cells, hdlr);
549 
550  if(updater_id) {
551  hdlr->commit_or_wait();
552  } else {
553  hdlr->commit_if_need();
554  hdlr->wait();
555  }
556  if(int err = hdlr->error())
558  }
559 
560  /* UPDATE-SERIAL */
561  void update_serial(const UCCellsSerial& cells,
562  const int64_t updater_id) override {
563  Processing process(this);
564 
566  if(updater_id)
567  updater(updater_id, hdlr);
568  else
571 
572  set_cols(cells, hdlr);
573  set(cells, hdlr);
574 
575  if(updater_id) {
576  hdlr->commit_or_wait();
577  } else {
578  hdlr->commit_if_need();
579  hdlr->wait();
580  }
581  if(int err = hdlr->error())
583  }
584 
585  /* UPDATE-MODELS */
586  virtual void update_by_types(const UCCellsPlain& plain,
587  const UCCellsCounter& counter,
588  const UCCellsSerial& serial,
589  const int64_t updater_id) override {
590  Processing process(this);
591 
593  if(updater_id)
594  updater(updater_id, hdlr);
595  else
598 
599  set_cols(plain, hdlr);
600  set_cols(counter, hdlr);
601  set_cols(serial, hdlr);
602 
603  set(plain, hdlr);
604  set(counter, hdlr);
605  set(serial, hdlr);
606 
607  if(updater_id) {
608  hdlr->commit_or_wait();
609  } else {
610  hdlr->commit_if_need();
611  hdlr->wait();
612  }
613  if(int err = hdlr->error())
615  }
616 
617  void disconnected() {
618  updater_close();
619  }
620 
621  size_t updaters_commit(size_t release = 0) {
622  size_t released = 0;
624  for(size_t idx=0;;++idx) {
625  {
626  Core::MutexSptd::scope lock(m_mutex);
627  if(idx >= m_updaters.size())
628  break;
629  auto it = m_updaters.cbegin();
630  for(size_t n=0; n < idx; ++it, ++n);
631  hdlr = it->second;
632  }
633  if(size_t sz = hdlr->size_bytes()) {
634  hdlr->commit();
635  if(release && release <= (released += sz))
636  break;
637  }
638  }
639  return released;
640  }
641 
642  private:
643 
644  template <typename UCCellsT>
646  static void set_cols(const UCCellsT& cells,
648  int err = Error::OK;
649  for(auto& col_cells : cells) {
650  if(!hdlr->get(col_cells.first)) {
651  auto schema = hdlr->clients->get_schema(err, col_cells.first);
652  if(err)
654  hdlr->create(schema);
655  }
656  }
657  }
658 
660  static void set(const UCCellsPlain& cells,
662  DB::Cells::Cell dbcell;
663  for(auto& col_cells : cells) {
664  auto col = hdlr->get(col_cells.first);
665  for(auto& cell : col_cells.second) {
666  dbcell.flag = uint8_t(cell.f);
667  dbcell.key.read(cell.k);
668  dbcell.control = 0;
669  if(cell.__isset.ts)
670  dbcell.set_timestamp(cell.ts);
671  if(cell.__isset.ts_desc)
672  dbcell.set_time_order_desc(cell.ts_desc);
673 
674  cell.__isset.encoder
675  ? dbcell.set_value(
676  DB::Types::Encoder(uint8_t(cell.encoder)), cell.v)
677  : dbcell.set_value(cell.v, false);
678 
679  col->add(dbcell);
680  hdlr->commit_or_wait(col.get());
681  }
682  }
683  }
684 
686  static void set(const UCCellsCounter& cells,
688  DB::Cells::Cell dbcell;
689  for(auto& col_cells : cells) {
690  auto col = hdlr->get(col_cells.first);
691  for(auto& cell : col_cells.second) {
692  dbcell.flag = uint8_t(cell.f);
693  dbcell.key.read(cell.k);
694  dbcell.control = 0;
695  if(cell.__isset.ts)
696  dbcell.set_timestamp(cell.ts);
697  if(cell.__isset.ts_desc)
698  dbcell.set_time_order_desc(cell.ts_desc);
699 
700  dbcell.set_counter(cell.op, cell.v);
701 
702  col->add(dbcell);
703  hdlr->commit_or_wait(col.get());
704  }
705  }
706  }
707 
709  static void set(const UCCellsSerial& cells,
711  DB::Cells::Cell dbcell;
712  for(auto& col_cells : cells) {
713  auto col = hdlr->get(col_cells.first);
714  for(auto& cell : col_cells.second) {
715  dbcell.flag = uint8_t(cell.f);
716  dbcell.key.read(cell.k);
717  dbcell.control = 0;
718  if(cell.__isset.ts)
719  dbcell.set_timestamp(cell.ts);
720  if(cell.__isset.ts_desc)
721  dbcell.set_time_order_desc(cell.ts_desc);
722 
724  Converter::set(cell.v, wfields);
725  cell.__isset.encoder
726  ? dbcell.set_value(DB::Types::Encoder(uint8_t(cell.encoder)),
727  wfields.base, wfields.fill())
728  : dbcell.set_value(wfields.base, wfields.fill(), false);
729 
730  col->add(dbcell);
731  hdlr->commit_or_wait(col.get());
732  }
733  }
734  }
735 
736  void updater_close() {
738  {
739  Core::MutexSptd::scope lock(m_mutex);
740  auto it = m_updaters.cbegin();
741  if(it == m_updaters.cend())
742  break;
743  hdlr = it->second;
744  m_updaters.erase(it);
745  }
746  try { updater_close(hdlr); } catch(...) {}
748  sizeof(hdlr) + sizeof(*hdlr.get()));
749  }
750  }
751 
752  void updater(const int64_t id,
754  Core::MutexSptd::scope lock(m_mutex);
755 
756  auto it = m_updaters.find(id);
757  if(it == m_updaters.cend())
758  Converter::exception(ERANGE, "Updater ID not found");
759  hdlr = it->second;
760  }
761 
764  hdlr->commit_if_need();
765  hdlr->wait();
766  int err = hdlr->error();
767  if(err)
769  }
770 
771  void get_schemas(int& err, const char* cmd, const std::string& sql,
772  DB::SchemasVec& dbschemas) {
774  std::string message;
775  auto clients = Env::Clients::get();
777  err, clients, sql, dbschemas, params, message, cmd);
778  if(err)
779  Converter::exception(err, message);
780 
781  if(!params.patterns.names.empty() ||
782  params.patterns.tags.comp != Condition::NONE) {
783  DB::SchemasVec schemas;
784  clients->get_schema(err, params.patterns, schemas);
785  if(err && err != Error::COLUMN_SCHEMA_MISSING)
787  err, "problem getting columns schemas on patterns");
788  err = Error::OK;
789  dbschemas.insert(dbschemas.cend(), schemas.cbegin(), schemas.cend());
790 
791  } else if(dbschemas.empty()) { // get all schemas
793  params, 300000, clients, err, dbschemas);
794  if(err)
796  }
797  }
798 
799  void get_schemas(int& err, const SpecSchemas& spec,
800  DB::SchemasVec& dbschemas) {
801  auto clients = Env::Clients::get();
802  bool has_patterns = !spec.patterns.names.empty() ||
803  !spec.patterns.tags.values.empty() ||
804  spec.patterns.tags.comp != Comp::NONE;
805  if(has_patterns) {
807  if(!spec.patterns.names.empty()) {
808  dbpatterns.names.reserve(spec.patterns.names.size());
809  for(auto& pattern : spec.patterns.names) {
810  dbpatterns.names.emplace_back(
811  Condition::Comp(uint8_t(pattern.comp)), pattern.value);
812  }
813  }
814  if(!spec.patterns.tags.values.empty() ||
815  spec.patterns.tags.comp != Comp::NONE) {
816  dbpatterns.tags.reserve(spec.patterns.tags.values.size());
817  dbpatterns.tags.comp = spec.patterns.tags.comp == Comp::NONE
818  ? Condition::Comp::EQ : Condition::Comp(spec.patterns.tags.comp);
819  for(auto& pattern : spec.patterns.tags.values) {
820  dbpatterns.tags.emplace_back(
821  Condition::Comp(uint8_t(pattern.comp)), pattern.value);
822  }
823  }
824 
825  clients->get_schema(err, dbpatterns, dbschemas);
826  if(err && err != Error::COLUMN_SCHEMA_MISSING)
828  err, "problem getting columns schemas on patterns");
829  err = Error::OK;
830  }
831 
832  DB::Schema::Ptr schema;
833  for(auto& cid : spec.cids) {
834  schema = clients->get_schema(err, cid);
835  if(!schema && !err)
837  if(err)
839  err, "problem getting column cid='"+std::to_string(cid)+"' schema");
840  dbschemas.push_back(schema);
841  }
842 
843  for(auto& name : spec.names) {
844  schema = clients->get_schema(err, name);
845  if(!schema && !err)
847  if(err)
849  err, "problem getting column name='"+name+"' schema");
850  dbschemas.push_back(schema);
851  }
852 
853  if(!has_patterns && dbschemas.empty()) { // get all schemas
856  clients, err, dbschemas
857  );
858  if(err)
860  }
861  }
862 
864  DB::Schema::Ptr& schema) {
865  int err = Error::OK;
867  func, schema, 300000, Env::Clients::get(), err);
868  if(err)
870 
871  if(schema->cid != DB::Schema::NO_CID)
872  Env::Clients::get()->schemas.remove(schema->cid);
873  else
874  Env::Clients::get()->schemas.remove(schema->col_name);
875  }
876 
877  static void process_results(int&, DB::SchemasVec& dbschemas,
878  Schemas& _return) {
879  _return.resize(dbschemas.size());
880  uint32_t c = 0;
881  for(auto& dbschema : dbschemas) {
882  Converter::set(dbschema, _return[c]);
883  ++c;
884  }
885  }
886 
887  static void process_results(int&, DB::SchemasVec& dbschemas,
888  CompactResults& _return) {
889  size_t sz = dbschemas.size();
890  _return.resize(sz);
891  auto clients = Env::Clients::get();
892  for(size_t idx = 0; idx < sz; ++idx) {
893  auto& r = _return[idx];
894  r.cid = dbschemas[idx]->cid;
896  r.cid, 300000, clients, r.err);
897  }
898  }
899 
900  static void process_results(
901  int& err, const client::Query::Select::Handlers::Common::Ptr& hdlr,
902  Cells& _return) {
903  DB::Schema::Ptr schema;
904  DB::Cells::Result cells;
905 
906  auto clients = Env::Clients::get();
907  for(cid_t cid : hdlr->get_cids()) {
908  cells.free();
909  hdlr->get_cells(cid, cells);
910 
911  schema = clients->get_schema(err, cid);
912  if(err)
913  return;
914  switch(schema->col_type) {
916  auto& rcells = _return.serial_cells;
917  size_t c = rcells.size();
918  rcells.resize(c + cells.size());
919  for(auto dbcell : cells) {
920  auto& cell = rcells[c++];
921  cell.c = schema->col_name;
922  dbcell->key.convert_to(cell.k);
923  cell.ts = dbcell->get_timestamp();
924  if(dbcell->vlen)
925  Converter::set(*dbcell, cell.v);
926  }
927  break;
928  }
929  case DB::Types::Column::COUNTER_I64:
930  case DB::Types::Column::COUNTER_I32:
931  case DB::Types::Column::COUNTER_I16:
932  case DB::Types::Column::COUNTER_I8: {
933  auto& rcells = _return.counter_cells;
934  size_t c = rcells.size();
935  rcells.resize(c + cells.size());
936  for(auto dbcell : cells) {
937  auto& cell = rcells[c++];
938  cell.c = schema->col_name;
939  dbcell->key.convert_to(cell.k);
940  cell.ts = dbcell->get_timestamp();
941  uint8_t op = 0;
942  cell.v = dbcell->get_counter(op, cell.eq);
943  if(op & DB::Cells::OP_EQUAL) {
944  cell.__isset.eq = true;
945  if(!(op & DB::Cells::HAVE_REVISION))
946  cell.eq = cell.ts;
947  }
948  }
949  break;
950  }
951  default: {
952  auto& rcells = _return.plain_cells;
953  size_t c = rcells.size();
954  rcells.resize(c + cells.size());
955  for(auto dbcell : cells) {
956  auto& cell = rcells[c++];
957  cell.c = schema->col_name;
958  dbcell->key.convert_to(cell.k);
959  cell.ts = dbcell->get_timestamp();
960  dbcell->get_value(cell.v);
961  }
962  }
963  }
964  }
965  }
966 
967  static void process_results(
968  int& err, const client::Query::Select::Handlers::Common::Ptr& hdlr,
969  CellsPlain& _return) {
970  DB::Schema::Ptr schema;
971  DB::Cells::Result cells;
972  auto clients = Env::Clients::get();
973  for(cid_t cid : hdlr->get_cids()) {
974  cells.free();
975  hdlr->get_cells(cid, cells);
976  schema = clients->get_schema(err, cid);
977  if(err)
978  return;
979 
980  size_t c = _return.size();
981  _return.resize(c + cells.size());
982  for(auto dbcell : cells) {
983  auto& cell = _return[c++];
984  cell.c = schema->col_name;
985  dbcell->key.convert_to(cell.k);
986  cell.ts = dbcell->get_timestamp();
987  dbcell->get_value(cell.v);
988  }
989  }
990  }
991 
992  static void process_results(
993  int& err, const client::Query::Select::Handlers::Common::Ptr& hdlr,
994  CellsCounter& _return) {
995  DB::Schema::Ptr schema;
996  DB::Cells::Result cells;
997  auto clients = Env::Clients::get();
998  for(cid_t cid : hdlr->get_cids()) {
999  cells.free();
1000  hdlr->get_cells(cid, cells);
1001  schema = clients->get_schema(err, cid);
1002  if(err)
1003  return;
1004 
1005  size_t c = _return.size();
1006  _return.resize(c + cells.size());
1007  for(auto dbcell : cells) {
1008  auto& cell = _return[c++];
1009  cell.c = schema->col_name;
1010  dbcell->key.convert_to(cell.k);
1011  cell.ts = dbcell->get_timestamp();
1012  uint8_t op = 0;
1013  cell.v = dbcell->get_counter(op, cell.eq);
1014  if(op & DB::Cells::OP_EQUAL) {
1015  cell.__isset.eq = true;
1016  if(!(op & DB::Cells::HAVE_REVISION))
1017  cell.eq = cell.ts;
1018  }
1019  }
1020  }
1021  }
1022 
1023  static void process_results(
1024  int& err, const client::Query::Select::Handlers::Common::Ptr& hdlr,
1025  CellsSerial& _return) {
1026  DB::Schema::Ptr schema;
1027  DB::Cells::Result cells;
1028  auto clients = Env::Clients::get();
1029  for(cid_t cid : hdlr->get_cids()) {
1030  cells.free();
1031  hdlr->get_cells(cid, cells);
1032  schema = clients->get_schema(err, cid);
1033  if(err)
1034  return;
1035 
1036  size_t c = _return.size();
1037  _return.resize(c + cells.size());
1038  for(auto dbcell : cells) {
1039  auto& cell = _return[c++];
1040  cell.c = schema->col_name;
1041  dbcell->key.convert_to(cell.k);
1042  cell.ts = dbcell->get_timestamp();
1043  if(dbcell->vlen)
1044  Converter::set(*dbcell, cell.v);
1045  }
1046  }
1047  }
1048 
1049  static void process_results(
1050  int& err, const client::Query::Select::Handlers::Common::Ptr& hdlr,
1051  CCells& _return) {
1052  DB::Schema::Ptr schema;
1053  DB::Cells::Result cells;
1054 
1055  auto clients = Env::Clients::get();
1056  for(cid_t cid : hdlr->get_cids()) {
1057  cells.free();
1058  hdlr->get_cells(cid, cells);
1059 
1060  schema = clients->get_schema(err, cid);
1061  if(err)
1062  return;
1063  auto& _col = _return[schema->col_name];
1064 
1065  switch(schema->col_type) {
1067  auto& rcells = _col.serial_cells;
1068  size_t c = rcells.size();
1069  rcells.resize(c + cells.size());
1070  for(auto dbcell : cells) {
1071  auto& cell = rcells[c++];
1072  dbcell->key.convert_to(cell.k);
1073  cell.ts = dbcell->get_timestamp();
1074  if(dbcell->vlen)
1075  Converter::set(*dbcell, cell.v);
1076  }
1077  break;
1078  }
1079  case DB::Types::Column::COUNTER_I64:
1080  case DB::Types::Column::COUNTER_I32:
1081  case DB::Types::Column::COUNTER_I16:
1082  case DB::Types::Column::COUNTER_I8: {
1083  auto& rcells = _col.counter_cells;
1084  size_t c = rcells.size();
1085  rcells.resize(c + cells.size());
1086  for(auto dbcell : cells) {
1087  auto& cell = rcells[c++];
1088  dbcell->key.convert_to(cell.k);
1089  cell.ts = dbcell->get_timestamp();
1090  uint8_t op = 0;
1091  cell.v = dbcell->get_counter(op, cell.eq);
1092  if(op & DB::Cells::OP_EQUAL) {
1093  cell.__isset.eq = true;
1094  if(!(op & DB::Cells::HAVE_REVISION))
1095  cell.eq = cell.ts;
1096  }
1097  }
1098  break;
1099  }
1100  default: {
1101  auto& rcells = _col.plain_cells;
1102  size_t c = rcells.size();
1103  rcells.resize(c + cells.size());
1104  for(auto dbcell : cells) {
1105  auto& cell = rcells[c++];
1106  dbcell->key.convert_to(cell.k);
1107  cell.ts = dbcell->get_timestamp();
1108  dbcell->get_value(cell.v);
1109  }
1110  }
1111  }
1112  }
1113  }
1114 
1115  static void process_results(
1116  int& err, const client::Query::Select::Handlers::Common::Ptr& hdlr,
1117  KCells& _return) {
1118  DB::Schema::Ptr schema;
1119  DB::Cells::Result cells;
1120 
1121  auto clients = Env::Clients::get();
1122  for(cid_t cid : hdlr->get_cids()) {
1123  cells.free();
1124  hdlr->get_cells(cid, cells);
1125 
1126  schema = clients->get_schema(err, cid);
1127  if(err)
1128  return;
1129  switch(schema->col_type) {
1131  for(auto dbcell : cells) {
1132  auto it = std::find_if(_return.begin(), _return.end(),
1133  [dbcell](const kCells& key_cells)
1134  {return dbcell->key.equal(key_cells.k);});
1135  if(it == _return.end()) {
1136  _return.emplace_back();
1137  it = _return.end()-1;
1138  dbcell->key.convert_to(it->k);
1139  }
1140 
1141  auto& cell = it->serial_cells.emplace_back();
1142  cell.c = schema->col_name;
1143  cell.ts = dbcell->get_timestamp();
1144  if(dbcell->vlen)
1145  Converter::set(*dbcell, cell.v);
1146  }
1147  break;
1148  }
1149  case DB::Types::Column::COUNTER_I64:
1150  case DB::Types::Column::COUNTER_I32:
1151  case DB::Types::Column::COUNTER_I16:
1152  case DB::Types::Column::COUNTER_I8: {
1153  for(auto dbcell : cells) {
1154  auto it = std::find_if(_return.begin(), _return.end(),
1155  [dbcell](const kCells& key_cells)
1156  {return dbcell->key.equal(key_cells.k);});
1157  if(it == _return.end()) {
1158  _return.emplace_back();
1159  it = _return.end()-1;
1160  dbcell->key.convert_to(it->k);
1161  }
1162 
1163  auto& cell = it->counter_cells.emplace_back();
1164  cell.c = schema->col_name;
1165  cell.ts = dbcell->get_timestamp();
1166  uint8_t op = 0;
1167  cell.v = dbcell->get_counter(op, cell.eq);
1168  if(op & DB::Cells::OP_EQUAL) {
1169  cell.__isset.eq = true;
1170  if(!(op & DB::Cells::HAVE_REVISION))
1171  cell.eq = cell.ts;
1172  }
1173  }
1174  break;
1175  }
1176  default: {
1177  for(auto dbcell : cells) {
1178  auto it = std::find_if(_return.begin(), _return.end(),
1179  [dbcell](const kCells& key_cells)
1180  {return dbcell->key.equal(key_cells.k);});
1181  if(it == _return.end()) {
1182  _return.emplace_back();
1183  it = _return.end()-1;
1184  dbcell->key.convert_to(it->k);
1185  }
1186 
1187  auto& cell = it->plain_cells.emplace_back();
1188  cell.c = schema->col_name;
1189  cell.ts = dbcell->get_timestamp();
1190  dbcell->get_value(cell.v);
1191  }
1192  }
1193  }
1194  }
1195  }
1196 
1197  static void process_results(
1198  int& err, const client::Query::Select::Handlers::Common::Ptr& hdlr,
1199  FCells& _return) {
1200  DB::Schema::Ptr schema;
1201  DB::Cells::Result cells;
1202 
1203  auto clients = Env::Clients::get();
1205 
1206  for(cid_t cid : hdlr->get_cids()) {
1207  cells.free();
1208  hdlr->get_cells(cid, cells);
1209 
1210  schema = clients->get_schema(err, cid);
1211  if(err)
1212  return;
1213  switch(schema->col_type) {
1215  FCells* fraction_cells;
1216  for(auto dbcell : cells) {
1217  fraction_cells = &_return;
1218  key.clear();
1219  dbcell->key.convert_to(key);
1220  for(auto& f : key)
1221  fraction_cells = &fraction_cells->f[f];
1222  auto& cell = fraction_cells->serial_cells.emplace_back();
1223  cell.c = schema->col_name;
1224  cell.ts = dbcell->get_timestamp();
1225  if(dbcell->vlen)
1226  Converter::set(*dbcell, cell.v);
1227  }
1228  break;
1229  }
1230  case DB::Types::Column::COUNTER_I64:
1231  case DB::Types::Column::COUNTER_I32:
1232  case DB::Types::Column::COUNTER_I16:
1233  case DB::Types::Column::COUNTER_I8: {
1234  FCells* fraction_cells;
1235  for(auto dbcell : cells) {
1236  fraction_cells = &_return;
1237  key.clear();
1238  dbcell->key.convert_to(key);
1239  for(auto& f : key)
1240  fraction_cells = &fraction_cells->f[f];
1241  auto& cell = fraction_cells->counter_cells.emplace_back();
1242  cell.c = schema->col_name;
1243  cell.ts = dbcell->get_timestamp();
1244  uint8_t op = 0;
1245  cell.v = dbcell->get_counter(op, cell.eq);
1246  if(op & DB::Cells::OP_EQUAL) {
1247  cell.__isset.eq = true;
1248  if(!(op & DB::Cells::HAVE_REVISION))
1249  cell.eq = cell.ts;
1250  }
1251  }
1252  break;
1253  }
1254  default: {
1255  FCells* fraction_cells;
1256  for(auto dbcell : cells) {
1257  fraction_cells = &_return;
1258  key.clear();
1259  dbcell->key.convert_to(key);
1260  for(auto& f : key)
1261  fraction_cells = &fraction_cells->f[f];
1262  auto& cell = fraction_cells->plain_cells.emplace_back();
1263  cell.c = schema->col_name;
1264  cell.ts = dbcell->get_timestamp();
1265  dbcell->get_value(cell.v);
1266  }
1267  }
1268  }
1269  }
1270  }
1271 
1272  struct Processing {
1274  Processing(AppHandler* a_hdlr) : hdlr(a_hdlr) {
1275  if(!hdlr->m_run)
1277  hdlr->m_processing.fetch_add(1);
1278  }
1279  Processing(Processing&&) = delete;
1280  Processing(const Processing&) = delete;
1282  Processing& operator=(const Processing&) = delete;
1284  hdlr->m_processing.fetch_sub(1);
1285  }
1286  };
1287 
1289  std::unordered_map<
1293 };
1294 
1295 
1296 
1297 
1298 }}
1299 
1300 #endif // swcdb_app_thriftbroker_AppHandler_h
SWC::DB::Cells::Cell::set_counter
void set_counter(uint8_t op, int64_t v, Types::Column typ=Types::Column::COUNTER_I64, int64_t rev=TIMESTAMP_NULL)
Definition: Cell.h:450
SWC::client::SQL::MODIFY_COLUMN
@ MODIFY_COLUMN
Definition: SQL.h:36
SWC::ThriftBroker::AppHandler::set
static SWC_CAN_INLINE void set(const UCCellsPlain &cells, client::Query::Update::Handlers::Common::Ptr &hdlr)
Definition: AppHandler.h:660
SWC::client::Query::Select::Handlers::Common::make
static SWC_CAN_INLINE Ptr make(const Clients::Ptr &clients, Cb_t &&cb=nullptr, bool rsp_partials=false, const Comm::IoContextPtr &io=nullptr, Clients::Flag executor=Clients::DEFAULT)
Definition: Common.h:26
SWC::Comm::Protocol::Mngr::Params::ColumnListReq
Definition: ColumnList.h:18
SWC::DB::Schemas::TagsPattern::comp
Condition::Comp comp
Definition: Schemas.h:87
SWC::DB::Cells::Cell::set_value
SWC_CAN_INLINE void set_value(uint8_t *v, uint32_t len, bool owner)
Definition: Cell.h:223
SWC::DB::Specs::Scan
Definition: SpecsScan.h:21
SWC::client::Query::Select::Handlers::Common::Ptr
std::shared_ptr< Common > Ptr
Definition: Common.h:22
SWC::Env::ThriftBroker::res
static SWC_CAN_INLINE System::Resources & res() noexcept
Definition: ThriftBrokerEnv.h:30
SWC::Comm::Protocol::Mngr::Req::ColumnCompact_Sync::request
static SWC_CAN_INLINE void request(const Params::ColumnCompactReq &params, const uint32_t timeout, DataArgsT &&... args)
Definition: ColumnCompact_Sync.h:32
SWC::ThriftBroker::AppHandler::process_results
static void process_results(int &err, const client::Query::Select::Handlers::Common::Ptr &hdlr, CellsSerial &_return)
Definition: AppHandler.h:1023
SWC::ThriftBroker::AppHandler::Processing::Processing
Processing(AppHandler *a_hdlr)
Definition: AppHandler.h:1274
SWC::ThriftBroker::AppHandler::Processing::operator=
Processing & operator=(Processing &&)=delete
SWC::ThriftBroker::AppHandler::set
static SWC_CAN_INLINE void set(const UCCellsCounter &cells, client::Query::Update::Handlers::Common::Ptr &hdlr)
Definition: AppHandler.h:686
SWC::ThriftBroker::AppHandler::scan_rslt_on
void scan_rslt_on(CellsGroup &_return, const SpecScan &specs, const CellsResult::type rslt) override
Definition: AppHandler.h:401
SWC::Core::AtomicBase< bool >
SWC::ThriftBroker::AppHandler::Processing::Processing
Processing(const Processing &)=delete
SWC::Error::SERVER_SHUTTING_DOWN
@ SERVER_SHUTTING_DOWN
Definition: Error.h:84
SWC::DB::SchemaPrimitives::NO_CID
static constexpr const cid_t NO_CID
Definition: Schema.h:25
SWC::Env::Clients::get
static SWC_CAN_INLINE client::Clients::Ptr & get() noexcept
Definition: Clients.h:299
SWC_LOGF
#define SWC_LOGF(priority, fmt,...)
Definition: Logger.h:188
SWC::ThriftBroker::AppHandler::Ptr
std::shared_ptr< AppHandler > Ptr
Definition: AppHandler.h:39
SWC::client::SQL::REMOVE_COLUMN
@ REMOVE_COLUMN
Definition: SQL.h:37
SWC::DB::Schema::Ptr
std::shared_ptr< Schema > Ptr
Definition: Schema.h:185
SWC::client::SQL::UPDATE
@ UPDATE
Definition: SQL.h:41
SWC::Core::Vector::clear
SWC_CAN_INLINE void clear() noexcept(_NoExceptDestructor)
Definition: Vector.h:120
SWC::ThriftBroker::AppHandler::scan
void scan(Cells &_return, const SpecScan &specs) override
Definition: AppHandler.h:425
SWC::Comm::Protocol::Mngr::Params::ColumnListReq::patterns
DB::Schemas::SelectorPatterns patterns
Definition: ColumnList.h:32
SWC::ThriftBroker::AppHandler::sql_select_rslt_on_fraction
void sql_select_rslt_on_fraction(FCells &_return, const std::string &sql) override
Definition: AppHandler.h:240
SWC::Core::Atomic< size_t >
SWC::Core::Encoder::Type
Type
Definition: Encoder.h:28
SWC::ThriftBroker::AppHandler::set
static SWC_CAN_INLINE void set(const UCCellsSerial &cells, client::Query::Update::Handlers::Common::Ptr &hdlr)
Definition: AppHandler.h:709
SWC::ThriftBroker::AppHandler::m_mutex
Core::MutexSptd m_mutex
Definition: AppHandler.h:1288
SWC::Core::MutexSptd::scope
Definition: MutexSptd.h:96
SWC::ThriftBroker::AppHandler::sql_select_plain
void sql_select_plain(CellsPlain &_return, const std::string &sql) override
Definition: AppHandler.h:205
SWC::ThriftBroker::AppHandler::scan_rslt_on_column
void scan_rslt_on_column(CCells &_return, const SpecScan &specs) override
Definition: AppHandler.h:436
SWC::Thrift::Converter::exception
void exception(int err, const std::string &msg="")
Definition: Converter.h:23
SWC::ThriftBroker::AppHandler::update_by_types
virtual void update_by_types(const UCCellsPlain &plain, const UCCellsCounter &counter, const UCCellsSerial &serial, const int64_t updater_id) override
Definition: AppHandler.h:586
SWC::ThriftBroker::AppHandler::process_results
static void process_results(int &err, const client::Query::Select::Handlers::Common::Ptr &hdlr, CCells &_return)
Definition: AppHandler.h:1049
SWC::client::SQL::recognize_cmd
Cmd recognize_cmd(int &err, const std::string &sql, std::string &message)
Definition: SQL.cc:14
SWC::DB::Cells::Cell
Definition: Cell.h:92
SWC::ThriftBroker::AppHandler::sql_query
void sql_query(CellsGroup &_return, const std::string &sql, const CellsResult::type rslt) override
Definition: AppHandler.h:170
SWC::ThriftBroker::AppHandler::m_updaters
std::unordered_map< int64_t, client::Query::Update::Handlers::Common::Ptr > m_updaters
Definition: AppHandler.h:1290
SWC::ThriftBroker::AppHandler::socket
const std::shared_ptr< thrift::transport::TSocket > socket
Definition: AppHandler.h:41
SWC::DB::Schemas::SelectorPatterns
Definition: Schemas.h:100
SWC::ThriftBroker::AppHandler::Processing::Processing
Processing(Processing &&)=delete
SWC::DB::Schemas::SelectorPatterns::names
NamePatterns names
Definition: Schemas.h:101
SWC::DB::Cells::Cell::key
DB::Cell::Key key
Definition: Cell.h:357
SWC::ThriftBroker::AppHandler::get_schemas
void get_schemas(int &err, const char *cmd, const std::string &sql, DB::SchemasVec &dbschemas)
Definition: AppHandler.h:771
SWC::ThriftBroker::AppHandler::Processing::operator=
Processing & operator=(const Processing &)=delete
SWC::ThriftBroker::AppHandler
Definition: AppHandler.h:36
SWC::DB::Cells::Result
Definition: Result.h:16
SWC::ThriftBroker::AppHandler::update_serial
void update_serial(const UCCellsSerial &cells, const int64_t updater_id) override
Definition: AppHandler.h:561
SWC::ThriftBroker::AppHandler::sql_mng_column
void sql_mng_column(const std::string &sql) override
Definition: AppHandler.h:124
SWC::ThriftBroker::AppHandler::scan_rslt_on_fraction
void scan_rslt_on_fraction(FCells &_return, const SpecScan &specs) override
Definition: AppHandler.h:458
SWC::ThriftBroker::AppHandler::m_run
Core::AtomicBool m_run
Definition: AppHandler.h:1292
SWC::client::Query::Update::Handlers::Common::make
static SWC_CAN_INLINE Ptr make(const Clients::Ptr &clients, Cb_t &&cb=nullptr, const Comm::IoContextPtr &io=nullptr, Clients::Flag executor=Clients::DEFAULT)
Definition: Common.h:24
SWC::ThriftBroker::AppHandler::sql_select_rslt_on_column
void sql_select_rslt_on_column(CCells &_return, const std::string &sql) override
Definition: AppHandler.h:216
SWC::client::SQL::GET_COLUMNS
@ GET_COLUMNS
Definition: SQL.h:38
SWC::ThriftBroker::AppHandler::m_processing
Core::Atomic< size_t > m_processing
Definition: AppHandler.h:1291
SWC::ThriftBroker::AppHandler::updater
void updater(const int64_t id, client::Query::Update::Handlers::Common::Ptr &hdlr)
Definition: AppHandler.h:752
SWC::ThriftBroker::AppHandler::process_results
static void process_results(int &err, const client::Query::Select::Handlers::Common::Ptr &hdlr, Cells &_return)
Definition: AppHandler.h:900
SWC::Error::OK
@ OK
Definition: Error.h:45
SWC::Condition::Comp
Comp
Definition: Comparators.h:27
SWC::Core::Vector::empty
constexpr SWC_CAN_INLINE bool empty() const noexcept
Definition: Vector.h:168
SWC::ThriftBroker::AppHandler::process_results
static void process_results(int &, DB::SchemasVec &dbschemas, Schemas &_return)
Definition: AppHandler.h:877
SWC::System::Resources::more_mem_releasable
SWC_CAN_INLINE void more_mem_releasable(size_t sz) noexcept
Definition: Resources.h:114
SWC_CAN_INLINE
#define SWC_CAN_INLINE
Definition: Compat.h:102
SWC::System::Resources::less_mem_releasable
SWC_CAN_INLINE void less_mem_releasable(size_t sz) noexcept
Definition: Resources.h:119
SWC::DB::Specs::Scan::columns
Columns columns
Definition: SpecsScan.h:101
SWC::ThriftBroker::AppHandler::sql_select_rslt_on_key
void sql_select_rslt_on_key(KCells &_return, const std::string &sql) override
Definition: AppHandler.h:228
SWC::ThriftBroker::AppHandler::updater_close
void updater_close()
Definition: AppHandler.h:736
SWC::client::SQL::SELECT
@ SELECT
Definition: SQL.h:40
ColumnGet_Sync.h
SWC::ThriftBroker::AppHandler::scan_rslt_on_key
void scan_rslt_on_key(KCells &_return, const SpecScan &specs) override
Definition: AppHandler.h:447
SWC::ThriftBroker::AppHandler::update_plain
void update_plain(const UCCellsPlain &cells, const int64_t updater_id) override
Definition: AppHandler.h:511
SWC::client::SQL::parse_select
void parse_select(int &err, const Clients::Ptr &clients, const std::string &sql, DB::Specs::Scan &specs, uint8_t &display_flags, std::string &message)
Definition: SQL.cc:73
SWC::Core::Buffer::base
value_type * base
Definition: Buffer.h:131
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
SWC::ThriftBroker::AppHandler::list_columns
void list_columns(Schemas &_return, const SpecSchemas &spec) override
Definition: AppHandler.h:308
SWC::ThriftBroker::AppHandler::mng_column
void mng_column(Comm::Protocol::Mngr::Params::ColumnMng::Function func, DB::Schema::Ptr &schema)
Definition: AppHandler.h:863
SWC::client::SQL::COMPACT_COLUMNS
@ COMPACT_COLUMNS
Definition: SQL.h:39
SWC::DB::Schema::make
static SWC_CAN_INLINE Ptr make()
Definition: Schema.h:189
SWC::DB::Types::is_counter
bool SWC_CONST_FUNC is_counter(const Column typ) noexcept
Definition: Column.cc:26
SWC::ThriftBroker::AppHandler::sql_list_columns
void sql_list_columns(Schemas &_return, const std::string &sql) override
Definition: AppHandler.h:115
SWC::Condition::EQ
@ EQ
Definition: Comparators.h:32
SWC::DB::Cells::HAVE_REVISION
constexpr const uint8_t HAVE_REVISION
Definition: Cell.h:81
SWC::ThriftBroker::AppHandler::updater_close
void updater_close(const client::Query::Update::Handlers::Common::Ptr &hdlr)
Definition: AppHandler.h:762
ColumnMng_Sync.h
SWC::ThriftBroker::AppHandler::Processing
Definition: AppHandler.h:1272
SWC::ThriftBroker::AppHandler::process_results
static void process_results(int &err, const client::Query::Select::Handlers::Common::Ptr &hdlr, CellsCounter &_return)
Definition: AppHandler.h:992
SWC::DB::Cells::Result::free
void free() noexcept
Definition: Result.h:56
SWC::ThriftBroker::AppHandler::process_results
static void process_results(int &, DB::SchemasVec &dbschemas, CompactResults &_return)
Definition: AppHandler.h:887
SWC::DB::Cells::Cell::control
uint8_t control
Definition: Cell.h:360
SWC::ThriftBroker::AppHandler::compact_columns
void compact_columns(CompactResults &_return, const SpecSchemas &spec) override
Definition: AppHandler.h:330
SWC::ThriftBroker::AppHandler::mng_column
void mng_column(const SchemaFunc::type func, const Schema &schema) override
Definition: AppHandler.h:318
SWC::ThriftBroker::AppHandler::disconnected
void disconnected()
Definition: AppHandler.h:617
SWC::ThriftBroker::AppHandler::~AppHandler
virtual ~AppHandler() noexcept
Definition: AppHandler.h:48
SWC::DB::Cells::Cell::set_time_order_desc
constexpr SWC_CAN_INLINE void set_time_order_desc(bool desc) noexcept
Definition: Cell.h:169
SWC::ThriftBroker::AppHandler::update_counter
void update_counter(const UCCellsCounter &cells, const int64_t updater_id) override
Definition: AppHandler.h:536
SWC::ThriftBroker::AppHandler::process_results
static void process_results(int &err, const client::Query::Select::Handlers::Common::Ptr &hdlr, KCells &_return)
Definition: AppHandler.h:1115
SWC::ThriftBroker::AppHandler::sync_select
client::Query::Select::Handlers::Common::Ptr sync_select(const std::string &sql)
Definition: AppHandler.h:152
SWC::Comm::Protocol::Mngr::Params::ColumnMng::Function
Function
Definition: ColumnMng.h:21
SWC::ThriftBroker::AppHandler::updater_close
void updater_close(const int64_t id) override
Definition: AppHandler.h:492
SWC_FMT_LU
#define SWC_FMT_LU
Definition: Compat.h:98
SWC::Condition::NONE
@ NONE
Definition: Comparators.h:28
SWC::ThriftBroker::AppHandler::Processing::~Processing
~Processing()
Definition: AppHandler.h:1283
Semaphore.h
SWC::cid_t
uint64_t cid_t
Definition: Identifiers.h:16
SWC::ThriftBroker::AppHandler::get_schemas
void get_schemas(int &err, const SpecSchemas &spec, DB::SchemasVec &dbschemas)
Definition: AppHandler.h:799
SWC::DB::Cell::Serial::Value::FieldsWriter
Definition: CellValueSerialFields.h:34
ColumnCompact_Sync.h
SWC::ThriftBroker::AppHandler::sql_select
void sql_select(Cells &_return, const std::string &sql) override
Definition: AppHandler.h:194
set
void set(uint64_t cmd=0, uint32_t timeout=0) noexcept
Definition: Header.h:33
SWC::client::Query::Update::Handlers::Common::Ptr
std::shared_ptr< Common > Ptr
Definition: Common.h:20
SWC::Core::Vector< Schema::Ptr >
SWC::DB::Schemas::SelectorPatterns::tags
TagsPattern tags
Definition: Schemas.h:102
SWC::ThriftBroker::AppHandler::sql_compact_columns
void sql_compact_columns(CompactResults &_return, const std::string &sql) override
Definition: AppHandler.h:141
SWC::Core::BufferDyn::fill
constexpr SWC_CAN_INLINE size_t fill() const noexcept
Definition: Buffer.h:192
SWC::Error::COLUMN_SCHEMA_MISSING
@ COLUMN_SCHEMA_MISSING
Definition: Error.h:112
SWC::ThriftBroker::AppHandler::stop
void stop()
Definition: AppHandler.h:50
SWC::Comm::Protocol::Mngr::Req::ColumnMng_Sync::request
static SWC_CAN_INLINE void request(const Params::ColumnMng &params, const uint32_t timeout, DataArgsT &&... args)
Definition: ColumnMng_Sync.h:32
SWC::DB::Cells::OP_EQUAL
constexpr const uint8_t OP_EQUAL
Definition: Cell.h:83
SWC::ThriftBroker::AppHandler::sql_select_counter
void sql_select_counter(CellsCounter &_return, const std::string &sql) override
Definition: AppHandler.h:253
SWC::DB::Cell::Key::read
SWC_CAN_INLINE void read(const T &key)
Definition: CellKey.h:144
SWC::ThriftBroker::AppHandler::sql_update
void sql_update(const std::string &sql, const int64_t updater_id) override
Definition: AppHandler.h:278
SWC::Core::Vector::cend
constexpr SWC_CAN_INLINE const_iterator cend() const noexcept
Definition: Vector.h:232
ColumnList_Sync.h
SWC::client::SQL::parse_column_schema
void parse_column_schema(int &err, const std::string &sql, Comm::Protocol::Mngr::Params::ColumnMng::Function func, DB::Schema::Ptr &schema, std::string &message)
Definition: SQL.cc:126
SWC::Core::MutexSptd
Definition: MutexSptd.h:16
SWC::client::SQL::parse_update
void parse_update(int &err, const std::string &sql, const Query::Update::Handlers::BaseUnorderedMap::Ptr &hdlr, uint8_t &display_flags, std::string &message)
Definition: SQL.cc:83
SWC::ThriftBroker::AppHandler::AppHandler
AppHandler(const std::shared_ptr< thrift::transport::TSocket > &a_socket)
Definition: AppHandler.h:43
SWC::LOG_WARN
@ LOG_WARN
Definition: Logger.h:33
Converter.h
SWC::Comm::Protocol::Mngr::Req::ColumnList_Sync::request
static SWC_CAN_INLINE void request(const Params::ColumnListReq &params, const uint32_t timeout, DataArgsT &&... args)
Definition: ColumnList_Sync.h:32
SWC::ThriftBroker::AppHandler::updater_create
int64_t updater_create(const int32_t buffer_size) override
Definition: AppHandler.h:471
SWC::DB::Specs::Scan::flags
Flags flags
Definition: SpecsScan.h:102
SWC::client::SQL::CREATE_COLUMN
@ CREATE_COLUMN
Definition: SQL.h:35
SQL.h
SWC::ThriftBroker::AppHandler::Processing::hdlr
AppHandler * hdlr
Definition: AppHandler.h:1273
SWC::DB::Types::Column::SERIAL
@ SERIAL
SWC::Core::Atomic::fetch_sub
constexpr SWC_CAN_INLINE T fetch_sub(T v) noexcept
Definition: Atomic.h:88
SWC::Core::Vector::push_back
SWC_CAN_INLINE void push_back(ArgsT &&... args)
Definition: Vector.h:331
SWC::ThriftBroker::AppHandler::exec_sql
void exec_sql(Result &_return, const std::string &sql) override
Definition: AppHandler.h:75
id
uint32_t id
Request ID.
Definition: Header.h:57
SWC::Core::Vector::cbegin
constexpr SWC_CAN_INLINE const_iterator cbegin() const noexcept
Definition: Vector.h:216
SWC::Core::Atomic::fetch_add
constexpr SWC_CAN_INLINE T fetch_add(T v) noexcept
Definition: Atomic.h:93
SWC::Core::to_string
SWC_CAN_INLINE std::string to_string(const BitFieldInt< T, SZ > &v)
Definition: BitFieldInt.h:263
Common.h
SWC::Core::Vector::size
constexpr SWC_CAN_INLINE size_type size() const noexcept
Definition: Vector.h:189
SWC::ThriftBroker::AppHandler::sync_select
client::Query::Select::Handlers::Common::Ptr sync_select(const SpecScan &spec)
Definition: AppHandler.h:341
SWC::client::SQL::parse_list_columns
void parse_list_columns(int &err, const Clients::Ptr &clients, const std::string &sql, DB::SchemasVec &schemas, std::string &message, const char *expect_cmd)
Definition: SQL.cc:92
Common.h
SWC::Core::Vector::emplace_back
SWC_CAN_INLINE reference emplace_back(ArgsT &&... args)
Definition: Vector.h:349
SWC::ThriftBroker::AppHandler::updaters_commit
size_t updaters_commit(size_t release=0)
Definition: AppHandler.h:621
SWC::Core::Vector::insert
SWC_CAN_INLINE iterator insert(size_type offset, ArgsT &&... args)
Definition: Vector.h:367
SWC::ThriftBroker::AppHandler::set_cols
static SWC_CAN_INLINE void set_cols(const UCCellsT &cells, client::Query::Update::Handlers::Common::Ptr &hdlr)
Definition: AppHandler.h:646
SWC::Core::Vector::reserve
SWC_CAN_INLINE void reserve(size_type cap)
Definition: Vector.h:288
SWC::DB::Cells::Cell::flag
uint8_t flag
Definition: Cell.h:359
SWC::Error::INCOMPATIBLE_OPTIONS
@ INCOMPATIBLE_OPTIONS
Definition: Error.h:59
SWC::ThriftBroker::AppHandler::sql_select_serial
void sql_select_serial(CellsSerial &_return, const std::string &sql) override
Definition: AppHandler.h:265
SWC::ThriftBroker::AppHandler::process_results
static void process_results(int &err, const client::Query::Select::Handlers::Common::Ptr &hdlr, FCells &_return)
Definition: AppHandler.h:1197
SWC::DB::Cells::Cell::set_timestamp
constexpr SWC_CAN_INLINE void set_timestamp(int64_t ts) noexcept
Definition: Cell.h:182
SWC::ThriftBroker::AppHandler::process_results
static void process_results(int &err, const client::Query::Select::Handlers::Common::Ptr &hdlr, CellsPlain &_return)
Definition: AppHandler.h:967