hyperledger/iroha
Iroha - A simple, decentralized ledger http://iroha.tech
rocksdb_common.hpp
Go to the documentation of this file.
1 
6 #ifndef IROHA_ROCKSDB_COMMON_HPP
7 #define IROHA_ROCKSDB_COMMON_HPP
8 
9 #include <charconv>
10 #include <mutex>
11 #include <string>
12 #include <string_view>
13 
14 #include <fmt/compile.h>
15 #include <fmt/format.h>
16 #include <rocksdb/db.h>
17 #include <rocksdb/utilities/optimistic_transaction_db.h>
18 #include <rocksdb/utilities/transaction.h>
21 #include "common/result.hpp"
25 
26 // clang-format off
154 // clang-format on
155 
156 #define RDB_DELIMITER "/"
157 #define RDB_XXX RDB_DELIMITER "{}" RDB_DELIMITER
158 
159 #define RDB_ROOT ""
160 #define RDB_STORE "s"
161 #define RDB_WSV "w"
162 #define RDB_NETWORK "n"
163 #define RDB_SETTINGS "i"
164 #define RDB_ASSETS "x"
165 #define RDB_ROLES "r"
166 #define RDB_TRANSACTIONS "t"
167 #define RDB_ACCOUNTS "a"
168 #define RDB_PEERS "p"
169 #define RDB_STATUSES "u"
170 #define RDB_DETAILS "d"
171 #define RDB_GRANTABLE_PER "g"
172 #define RDB_POSITION "P"
173 #define RDB_TIMESTAMP "T"
174 #define RDB_DOMAIN "D"
175 #define RDB_SIGNATORIES "S"
176 #define RDB_OPTIONS "O"
177 #define RDB_ADDRESS "M"
178 #define RDB_TLS "N"
179 
180 #define RDB_F_QUORUM "q"
181 #define RDB_F_ASSET_SIZE "I"
182 #define RDB_F_TOP_BLOCK "Q"
183 #define RDB_F_PEERS_COUNT "Z"
184 #define RDB_F_TOTAL_COUNT "V"
185 #define RDB_F_VERSION "v"
186 
187 #define RDB_PATH_DOMAIN RDB_ROOT RDB_WSV RDB_DOMAIN RDB_XXX
188 #define RDB_PATH_ACCOUNT RDB_PATH_DOMAIN RDB_ACCOUNTS RDB_XXX
189 
191  static constexpr size_t kDelimiterSize =
192  sizeof(RDB_DELIMITER) / sizeof(RDB_DELIMITER[0]) - 1ull;
193 
194  static constexpr size_t kDelimiterCountForAField = 2ull;
195 
196  static const std::string kDelimiter{RDB_DELIMITER};
197 
203  // domain_id/account_name
204  static auto constexpr kPathAccountRoles{
205  FMT_STRING(RDB_PATH_ACCOUNT RDB_ROLES)};
206 
207  static auto constexpr kPathWsv{FMT_STRING(RDB_ROOT RDB_WSV)};
208 
209  static auto constexpr kPathStore{FMT_STRING(RDB_ROOT RDB_STORE)};
210 
211  // domain_id/account_name
212  static auto constexpr kPathAccount{FMT_STRING(RDB_PATH_ACCOUNT)};
213 
214  // no params
215  static auto constexpr kPathPeers{FMT_STRING(
217 
218  // domain_id/account_name
219  static auto constexpr kPathSignatories{
220  FMT_STRING(RDB_PATH_ACCOUNT RDB_SIGNATORIES)};
221 
222  // no param
223  static auto constexpr kPathRoles{
224  FMT_STRING(RDB_ROOT RDB_WSV RDB_ROLES)};
225 
226  // account
227  static auto constexpr kPathTransactionByTs{
228  FMT_STRING(RDB_ROOT RDB_WSV RDB_TRANSACTIONS
230 
231  // account
232  static auto constexpr kPathTransactionByPosition{
233  FMT_STRING(RDB_ROOT RDB_WSV RDB_TRANSACTIONS
235 
236  // domain_id/account_name ➡️ value
237  static auto constexpr kPathAccountDetail{
238  FMT_STRING(RDB_PATH_ACCOUNT RDB_DETAILS)};
239 
240  // account_domain_id/account_name/asset_id
241  static auto constexpr kPathAccountAssets{
242  FMT_STRING(RDB_PATH_ACCOUNT RDB_ASSETS)};
243 
249  // height ➡️ block data
250  static auto constexpr kBlockDataInStore{
251  FMT_STRING(RDB_ROOT RDB_STORE RDB_XXX)};
252 
253  // account/height/index/ts ➡️ tx_hash
254  static auto constexpr kTransactionByPosition{FMT_STRING(
257 
258  // account/ts/height/index ➡️ tx_hash
259  static auto constexpr kTransactionByTs{FMT_STRING(
262 
263  // account/height ➡️ tx_hash
264  static auto constexpr kTransactionByHeight{FMT_STRING(
267 
268  // account/ts/height/index ➡️ tx_hash
269  static auto constexpr kTransactionByTsLowerBound{FMT_STRING(
272 
273  // tx_hash ➡️ status
274  static auto constexpr kTransactionStatus{
275  FMT_STRING(RDB_ROOT RDB_WSV RDB_TRANSACTIONS
277 
278  // domain_id/account_name/role_name
279  static auto constexpr kAccountRole{
280  FMT_STRING(RDB_PATH_ACCOUNT RDB_ROLES RDB_XXX)};
281 
282  // role_name ➡️ permissions
283  static auto constexpr kRole{
284  FMT_STRING(RDB_ROOT RDB_WSV RDB_ROLES
285  RDB_XXX)};
286 
287  // domain_id/account_name/pubkey ➡️ ""
288  static auto constexpr kSignatory{
290 
291  // domain_id/asset_name ➡️ precision
292  static auto constexpr kAsset{
293  FMT_STRING(RDB_PATH_DOMAIN RDB_ASSETS RDB_XXX)};
294 
295  // account_domain_id/account_name/asset_id ➡️ amount
296  static auto constexpr kAccountAsset{
297  FMT_STRING(RDB_PATH_ACCOUNT RDB_ASSETS RDB_XXX)};
298 
299  // domain_id/account_name/writer_id/key ➡️
300  // value
301  static auto constexpr kAccountDetail{
303 
304  // pubkey ➡️ address
305  static auto constexpr kPeerAddress{
308 
309  // pubkey ➡️ tls
310  static auto constexpr kPeerTLS{
312  RDB_TLS RDB_XXX)};
313 
314  // domain_id/account_name/grantee_domain_id/grantee_account_name
315  // ➡️ permissions
316  static auto constexpr kGranted{
318 
319  // key ➡️ value
320  static auto constexpr kSetting{
321  FMT_STRING(RDB_ROOT RDB_WSV RDB_SETTINGS RDB_XXX)};
322 
328  // domain_id ➡️ default role
329  static auto constexpr kDomain{FMT_STRING(RDB_PATH_DOMAIN)};
330 
331  // "" ➡️ height # hash
332  static auto constexpr kTopBlock{
334  RDB_F_TOP_BLOCK)};
335 
336  // domain_id/account_name
337  static auto constexpr kQuorum{
339 
340  // account_domain_id/account_name ➡️ size
341  static auto constexpr kAccountAssetSize{
343 
344  static auto constexpr kPeersCount{
347 
348  // account ➡️ txs total count
349  static auto constexpr kTxsTotalCount{
350  FMT_STRING(RDB_ROOT RDB_WSV RDB_TRANSACTIONS
352 
353  // ➡️ value
354  static auto constexpr kBlocksTotalCount{
355  FMT_STRING(RDB_ROOT RDB_STORE RDB_F_TOTAL_COUNT)};
356 
357  // ➡️ txs total count
358  static auto constexpr kAllTxsTotalCount{FMT_STRING(
360 
361  // ➡️ domains total count
362  static auto constexpr kDomainsTotalCount{
364 
365  // domain_id/account_name/ ➡️ value
366  static auto constexpr kAccountDetailsCount{
368 
369  // ➡️ value
370  static auto constexpr kStoreVersion{
371  FMT_STRING(RDB_ROOT RDB_STORE RDB_F_VERSION)};
372 
373  // ➡️ value
374  static auto constexpr kWsvVersion{
375  FMT_STRING(RDB_ROOT RDB_WSV RDB_F_VERSION)};
376 
377 } // namespace iroha::ametsuchi::fmtstrings
378 
379 #undef RDB_ADDRESS
380 #undef RDB_TLS
381 #undef RDB_OPTIONS
382 #undef RDB_F_ASSET_SIZE
383 #undef RDB_PATH_DOMAIN
384 #undef RDB_PATH_ACCOUNT
385 #undef RDB_F_QUORUM
386 #undef RDB_DELIMITER
387 #undef RDB_ROOT
388 #undef RDB_STORE
389 #undef RDB_WSV
390 #undef RDB_NETWORK
391 #undef RDB_SETTINGS
392 #undef RDB_ASSETS
393 #undef RDB_ROLES
394 #undef RDB_TRANSACTIONS
395 #undef RDB_ACCOUNTS
396 #undef RDB_PEERS
397 #undef RDB_STATUSES
398 #undef RDB_DETAILS
399 #undef RDB_GRANTABLE_PER
400 #undef RDB_POSITION
401 #undef RDB_TIMESTAMP
402 #undef RDB_DOMAIN
403 #undef RDB_SIGNATORIES
404 #undef RDB_ITEM
405 #undef RDB_F_TOP_BLOCK
406 #undef RDB_F_PEERS_COUNT
407 #undef RDB_F_TOTAL_COUNT
408 #undef RDB_F_VERSION
409 
410 namespace {
411  auto constexpr kValue{FMT_STRING("{}")};
412 }
413 
414 namespace iroha::ametsuchi {
415 
416  struct RocksDBPort;
417  class RocksDbCommon;
418 
422  struct RocksDBContext {
423  RocksDBContext(RocksDBContext const &) = delete;
424  RocksDBContext &operator=(RocksDBContext const &) = delete;
425 
426  explicit RocksDBContext(std::shared_ptr<RocksDBPort> dbp)
427  : db_port(std::move(dbp)) {
428  assert(db_port);
429  }
430 
431  private:
432  friend class RocksDbCommon;
433  friend struct RocksDBPort;
434 
436  std::unique_ptr<rocksdb::Transaction> transaction;
437 
439  fmt::memory_buffer key_buffer;
440 
442  std::string value_buffer;
443 
445  std::shared_ptr<RocksDBPort> db_port;
446 
448  std::mutex this_context_cs;
449  };
450 
451  enum DbErrorCode {
452  kOk = 0,
457  kNoRoles = 4,
462  };
463 
465  struct DbError final {
466  uint32_t code;
467  std::string description;
468  };
469 
470  template <typename T, typename... Args>
472  char const *format,
473  Args &&... args) {
474  assert(format != nullptr);
475  return expected::makeError(
476  DbError{code, fmt::format(format, std::forward<Args>(args)...)});
477  }
478 
479  template <typename T>
480  inline expected::Result<T, DbError> makeError(uint32_t code, DbError &&e) {
481  return expected::makeError(DbError{code, std::move(e.description)});
482  }
483 
487  struct RocksDBPort {
488  RocksDBPort(RocksDBPort const &) = delete;
489  RocksDBPort &operator=(RocksDBPort const &) = delete;
490  RocksDBPort() = default;
491 
492  expected::Result<void, DbError> initialize(std::string const &db_name) {
493  if (db_name_) {
494  assert(*db_name_ == db_name);
495  return {};
496  }
497 
498  rocksdb::Options options;
499  options.create_if_missing = true;
500 
501  rocksdb::OptimisticTransactionDB *transaction_db;
502  auto status = rocksdb::OptimisticTransactionDB::Open(
503  options, db_name, &transaction_db);
504 
505  if (!status.ok())
506  return makeError<void>(DbErrorCode::kInitializeFailed,
507  "Db {} initialization failed with status: {}.",
508  db_name,
509  status.ToString());
510 
511  transaction_db_.reset(transaction_db);
512  db_name_ = db_name;
513  return {};
514  }
515 
516  private:
517  std::unique_ptr<rocksdb::OptimisticTransactionDB> transaction_db_;
518  std::optional<std::string> db_name_;
519  friend class RocksDbCommon;
520 
521  void prepareTransaction(RocksDBContext &tx_context) {
522  assert(transaction_db_);
523  tx_context.transaction.reset(
524  transaction_db_->BeginTransaction(rocksdb::WriteOptions()));
525  }
526  };
527 
528 #define RDB_ERROR_CHECK(...) \
529  if (auto _tmp_gen_var = (__VA_ARGS__); \
530  iroha::expected::hasError(_tmp_gen_var)) \
531  return _tmp_gen_var.assumeError()
532 
533 #define RDB_ERROR_CHECK_TO_STR(...) \
534  if (auto _tmp_gen_var = (__VA_ARGS__); \
535  iroha::expected::hasError(_tmp_gen_var)) \
536  return _tmp_gen_var.assumeError().description
537 
538 #define RDB_TRY_GET_VALUE(name, ...) \
539  typename decltype(__VA_ARGS__)::ValueInnerType name; \
540  if (auto _tmp_gen_var = (__VA_ARGS__); \
541  iroha::expected::hasError(_tmp_gen_var)) \
542  return _tmp_gen_var.assumeError(); \
543  else \
544  name = std::move(_tmp_gen_var.assumeValue())
545 
546 #define RDB_TRY_GET_VALUE_OR_STR_ERR(name, ...) \
547  typename decltype(__VA_ARGS__)::ValueInnerType name; \
548  if (auto _tmp_gen_var = (__VA_ARGS__); \
549  iroha::expected::hasError(_tmp_gen_var)) \
550  return _tmp_gen_var.assumeError().description; \
551  else \
552  name = std::move(_tmp_gen_var.assumeValue())
553 
558  public:
559  explicit RocksDbCommon(std::shared_ptr<RocksDBContext> tx_context)
560  : tx_context_(std::move(tx_context)),
561  context_guard_(tx_context_->this_context_cs) {
562  assert(tx_context_);
563  assert(tx_context_->db_port);
564  }
565 
567  auto &valueBuffer() {
568  return tx_context_->value_buffer;
569  }
570 
572  auto &keyBuffer() {
573  return tx_context_->key_buffer;
574  }
575 
576  private:
577  auto &transaction() {
578  if (!tx_context_->transaction)
579  tx_context_->db_port->prepareTransaction(*tx_context_);
580  return tx_context_->transaction;
581  }
582 
583  [[nodiscard]] bool isTransaction() const {
584  return tx_context_->transaction != nullptr;
585  }
586 
590  template <typename F>
591  auto enumerate(std::unique_ptr<rocksdb::Iterator> &it, F &&func) {
592  if (!it->status().ok())
593  return it->status();
594 
595  rocksdb::Slice const key(keyBuffer().data(), keyBuffer().size());
596  for (; it->Valid() && it->key().starts_with(key); it->Next())
597  if (!std::forward<F>(func)(it, key.size()))
598  break;
599 
600  return it->status();
601  }
602 
603  public:
605  auto commit() {
606  rocksdb::Status status;
607  if (isTransaction())
608  status = transaction()->Commit();
609 
610  transaction().reset();
611  return status;
612  }
613 
615  auto rollback() {
616  rocksdb::Status status;
617  if (isTransaction())
618  status = transaction()->Rollback();
619 
620  transaction().reset();
621  return status;
622  }
623 
624  auto release() {
625  rocksdb::Status status;
626  if (isTransaction())
627  status = transaction()->PopSavePoint();
628  return status;
629  }
630 
632  auto prepare() {
633  rocksdb::Status status;
634  if (isTransaction())
635  status = transaction()->Prepare();
636  return status;
637  }
638 
640  void skip() {
641  if (isTransaction())
642  transaction().reset();
643  }
644 
646  void savepoint() {
647  if (isTransaction())
648  transaction()->SetSavePoint();
649  }
650 
653  rocksdb::Status status;
654  if (isTransaction())
655  status = transaction()->RollbackToSavePoint();
656  return status;
657  }
658 
660  auto encode(uint64_t number) {
661  valueBuffer().clear();
662  fmt::format_to(std::back_inserter(valueBuffer()), kValue, number);
663  }
664 
666  auto decode(uint64_t &number) {
667  return std::from_chars(valueBuffer().data(),
668  valueBuffer().data() + valueBuffer().size(),
669  number);
670  }
671 
673  template <typename S, typename... Args>
674  auto get(S const &fmtstring, Args &&... args) {
675  keyBuffer().clear();
676  fmt::format_to(keyBuffer(), fmtstring, std::forward<Args>(args)...);
677 
678  valueBuffer().clear();
679  return transaction()->Get(
680  rocksdb::ReadOptions(),
681  rocksdb::Slice(keyBuffer().data(), keyBuffer().size()),
682  &valueBuffer());
683  }
684 
686  template <typename S, typename... Args>
687  auto put(S const &fmtstring, Args &&... args) {
688  keyBuffer().clear();
689  fmt::format_to(keyBuffer(), fmtstring, std::forward<Args>(args)...);
690 
691  return transaction()->Put(
692  rocksdb::Slice(keyBuffer().data(), keyBuffer().size()),
693  valueBuffer());
694  }
695 
697  template <typename S, typename... Args>
698  auto del(S const &fmtstring, Args &&... args) {
699  keyBuffer().clear();
700  fmt::format_to(keyBuffer(), fmtstring, std::forward<Args>(args)...);
701 
702  return transaction()->Delete(
703  rocksdb::Slice(keyBuffer().data(), keyBuffer().size()));
704  }
705 
707  template <typename S, typename... Args>
708  auto seek(S const &fmtstring, Args &&... args) {
709  keyBuffer().clear();
710  fmt::format_to(keyBuffer(), fmtstring, std::forward<Args>(args)...);
711 
712  std::unique_ptr<rocksdb::Iterator> it(
713  transaction()->GetIterator(rocksdb::ReadOptions()));
714  it->Seek(rocksdb::Slice(keyBuffer().data(), keyBuffer().size()));
715 
716  return it;
717  }
718 
721  template <typename F, typename S, typename... Args>
722  auto enumerate(std::unique_ptr<rocksdb::Iterator> &it,
723  F &&func,
724  S const &fmtstring,
725  Args &&... args) {
726  keyBuffer().clear();
727  fmt::format_to(keyBuffer(), fmtstring, std::forward<Args>(args)...);
728  return enumerate(it, std::forward<F>(func));
729  }
730 
733  template <typename F, typename S, typename... Args>
734  auto enumerate(F &&func, S const &fmtstring, Args &&... args) {
735  auto it = seek(fmtstring, std::forward<Args>(args)...);
736  return enumerate(it, std::forward<F>(func));
737  }
738 
740  template <typename S, typename... Args>
741  auto filterDelete(S const &fmtstring, Args &&... args) {
742  auto it = seek(fmtstring, std::forward<Args>(args)...);
743  if (!it->status().ok())
744  return it->status();
745 
746  rocksdb::Slice const key(keyBuffer().data(), keyBuffer().size());
747  for (; it->Valid() && it->key().starts_with(key); it->Next())
748  if (auto status = transaction()->Delete(it->key()); !status.ok())
749  return status;
750 
751  return it->status();
752  }
753 
754  private:
755  std::shared_ptr<RocksDBContext> tx_context_;
756  std::lock_guard<std::mutex> context_guard_;
757  };
758 
762  enum struct kDbOperation {
763  kGet,
764  kCheck,
765  kPut,
766  kDel
767  };
768 
773  enum struct kDbEntry {
774  kMustExist,
775  kMustNotExist,
776  kCanExist
778  };
780 
782  template <typename F, typename S, typename... Args>
783  inline auto enumerateKeys(RocksDbCommon &rdb,
784  F &&func,
785  S const &strformat,
786  Args &&... args) {
787  return rdb.enumerate(
788  [func{std::forward<F>(func)}](auto const &it,
789  auto const prefix_size) mutable {
790  assert(it->Valid());
791  auto const key = it->key();
792  return std::forward<F>(func)(rocksdb::Slice(
793  key.data() + prefix_size + fmtstrings::kDelimiterSize,
794  key.size() - prefix_size
797  },
798  strformat,
799  std::forward<Args>(args)...);
800  }
801 
802  template <typename F>
803  inline auto makeKVLambda(F &&func) {
804  return [func{std::forward<F>(func)}](auto const &it,
805  auto const prefix_size) mutable {
806  assert(it->Valid());
807  auto const key = it->key();
808  return std::forward<F>(func)(
809  rocksdb::Slice(key.data() + prefix_size + fmtstrings::kDelimiterSize,
810  key.size() - prefix_size
813  it->value());
814  };
815  }
816 
818  template <typename F, typename S, typename... Args>
820  F &&func,
821  S const &strformat,
822  Args &&... args) {
823  return rdb.enumerate(makeKVLambda(std::forward<F>(func)),
824  strformat,
825  std::forward<Args>(args)...);
826  }
827 
830  template <typename F, typename S, typename... Args>
832  F &&func,
833  std::unique_ptr<rocksdb::Iterator> &it,
834  S const &strformat,
835  Args &&... args) {
836  return rdb.enumerate(it,
837  makeKVLambda(std::forward<F>(func)),
838  strformat,
839  std::forward<Args>(args)...);
840  }
841 
842  template <typename F>
844  rocksdb::Status const &status, F &&op_formatter) {
845  if (status.IsNotFound())
846  return {};
847 
848  if (!status.ok())
849  return makeError<void>(DbErrorCode::kInvalidStatus,
850  "{}. Failed with status: {}.",
851  std::forward<F>(op_formatter)(),
852  status.ToString());
853 
854  return makeError<void>(DbErrorCode::kMustNotExist,
855  "{}. Must not exist.",
856  std::forward<F>(op_formatter)());
857  }
858 
859  template <typename F>
861  rocksdb::Status const &status, F &&op_formatter) {
862  if (status.IsNotFound())
863  return makeError<void>(DbErrorCode::kNotFound,
864  "{}. Was not found.",
865  std::forward<F>(op_formatter)());
866 
867  if (!status.ok())
868  return makeError<void>(DbErrorCode::kInvalidStatus,
869  "{}. Failed with status: {}.",
870  std::forward<F>(op_formatter)(),
871  status.ToString());
872 
873  return {};
874  }
875 
876  template <typename F>
878  F &&op_formatter) {
879  if (status.IsNotFound() || status.ok())
880  return {};
881 
882  return makeError<void>(DbErrorCode::kInvalidStatus,
883  "{}. Failed with status: {}.",
884  std::forward<F>(op_formatter)(),
885  status.ToString());
886  }
887 
888  template <kDbEntry kSc, typename F>
890  F &&op_formatter) {
891  if constexpr (kSc == kDbEntry::kMustExist)
892  return mustExist(status, std::forward<F>(op_formatter));
893  else if constexpr (kSc == kDbEntry::kMustNotExist)
894  return mustNotExist(status, std::forward<F>(op_formatter));
895  else if constexpr (kSc == kDbEntry::kCanExist)
896  return canExist(status, std::forward<F>(op_formatter));
897 
898  static_assert(kSc == kDbEntry::kMustExist || kSc == kDbEntry::kMustNotExist
899  || kSc == kDbEntry::kCanExist,
900  "Unexpected status check value");
901  }
902 
903  template <kDbOperation kOp,
904  kDbEntry kSc,
905  typename OperationDescribtionF,
906  typename... Args>
908  RocksDbCommon &common,
909  OperationDescribtionF &&op_formatter,
910  Args &&... args) {
911  rocksdb::Status status;
912  if constexpr (kOp == kDbOperation::kGet || kOp == kDbOperation::kCheck)
913  status = common.get(std::forward<Args>(args)...);
914  else if constexpr (kOp == kDbOperation::kPut)
915  status = common.put(std::forward<Args>(args)...);
916  else if constexpr (kOp == kDbOperation::kDel)
917  status = common.del(std::forward<Args>(args)...);
918 
919  static_assert(kOp == kDbOperation::kGet || kOp == kDbOperation::kCheck
920  || kOp == kDbOperation::kPut || kOp == kDbOperation::kDel,
921  "Unexpected operation value!");
922 
923  static_assert(
924  kOp != kDbOperation::kDel || kSc != kDbEntry::kMustExist,
925  "Delete operation does not report if key existed before deletion!");
926 
927  RDB_ERROR_CHECK(checkStatus<kSc>(
928  status, std::forward<OperationDescribtionF>(op_formatter)));
929  return status;
930  }
931 
932  template <kDbOperation kOp,
933  typename T,
934  typename = std::enable_if_t<std::is_same<T, uint64_t>::value>>
935  inline std::optional<uint64_t> loadValue(
936  RocksDbCommon &common,
938  std::optional<uint64_t> value;
939  if constexpr (kOp == kDbOperation::kGet) {
940  assert(expected::hasValue(status));
941  if (status.assumeValue().ok()) {
942  uint64_t _;
943  common.decode(_);
944  value = _;
945  }
946  }
947  return value;
948  }
949 
950  template <
951  kDbOperation kOp,
952  typename T,
953  typename = std::enable_if_t<std::is_same<T, std::string_view>::value>>
954  inline std::optional<std::string_view> loadValue(
955  RocksDbCommon &common,
957  std::optional<std::string_view> value;
958  if constexpr (kOp == kDbOperation::kGet) {
959  assert(expected::hasValue(status));
960  if (status.assumeValue().ok())
961  value = common.valueBuffer();
962  }
963  return value;
964  }
965 
966  template <
967  kDbOperation kOp,
968  typename T,
969  typename = std::enable_if_t<
970  std::is_same<T, shared_model::interface::RolePermissionSet>::value>>
971  inline std::optional<shared_model::interface::RolePermissionSet> loadValue(
972  RocksDbCommon &common,
974  std::optional<shared_model::interface::RolePermissionSet> value;
975  if constexpr (kOp == kDbOperation::kGet) {
976  assert(expected::hasValue(status));
977  if (status.assumeValue().ok())
978  value =
980  }
981  return value;
982  }
983 
984  template <kDbOperation kOp,
985  typename T,
986  typename = std::enable_if_t<std::is_same<T, IrohadVersion>::value>>
987  inline std::optional<IrohadVersion> loadValue(
988  RocksDbCommon &common,
990  std::optional<IrohadVersion> value;
991  if constexpr (kOp == kDbOperation::kGet) {
992  assert(expected::hasValue(status));
993  if (status.assumeValue().ok()) {
994  auto const &[major, minor, patch] =
995  staticSplitId<3ull>(common.valueBuffer(), "#");
996  IrohadVersion version{0ul, 0ul, 0ul};
997  std::from_chars(
998  major.data(), major.data() + major.size(), version.major);
999  std::from_chars(
1000  minor.data(), minor.data() + minor.size(), version.minor);
1001  std::from_chars(
1002  patch.data(), patch.data() + patch.size(), version.patch);
1003  value = version;
1004  }
1005  }
1006  return value;
1007  }
1008 
1009  template <kDbOperation kOp,
1010  typename T,
1011  typename = std::enable_if_t<
1012  std::is_same<T, shared_model::interface::Amount>::value>>
1013  inline std::optional<shared_model::interface::Amount> loadValue(
1014  RocksDbCommon &common,
1016  std::optional<shared_model::interface::Amount> value;
1017  if constexpr (kOp == kDbOperation::kGet) {
1018  assert(expected::hasValue(status));
1019  if (status.assumeValue().ok())
1020  value.emplace(common.valueBuffer());
1021  }
1022  return value;
1023  }
1024 
1025  template <kDbOperation kOp,
1026  typename T,
1027  typename = std::enable_if_t<std::is_same<
1028  T,
1030  inline std::optional<shared_model::interface::GrantablePermissionSet>
1033  std::optional<shared_model::interface::GrantablePermissionSet> value;
1034  if constexpr (kOp == kDbOperation::kGet) {
1035  assert(expected::hasValue(status));
1036  if (status.assumeValue().ok())
1038  common.valueBuffer()};
1039  }
1040  return value;
1041  }
1042 
1043  template <kDbOperation kOp,
1044  typename T,
1045  typename = std::enable_if_t<std::is_same<T, bool>::value>>
1046  inline std::optional<bool> loadValue(
1047  RocksDbCommon &common,
1049  std::optional<bool> value;
1050  if constexpr (kOp == kDbOperation::kGet) {
1051  assert(expected::hasValue(status));
1052  if (status.assumeValue().ok())
1053  value = true;
1054  }
1055  return value;
1056  }
1057 
1058  template <typename RetT, kDbOperation kOp, kDbEntry kSc, typename... Args>
1060  RocksDbCommon &common, Args &&... args) {
1061  auto status = executeOperation<kOp, kSc>(
1062  common,
1063  [&] { return fmt::format(std::forward<Args>(args)...); },
1064  std::forward<Args>(args)...);
1065  RDB_ERROR_CHECK(status);
1066  return loadValue<kOp, RetT>(common, status);
1067  }
1068 
1078  template <kDbOperation kOp = kDbOperation::kGet,
1082  std::string_view account,
1083  std::string_view domain) {
1084  return dbCall<uint64_t, kOp, kSc>(
1085  common, fmtstrings::kAccountDetailsCount, domain, account);
1086  }
1087 
1095  template <kDbOperation kOp = kDbOperation::kGet,
1099  return dbCall<IrohadVersion, kOp, kSc>(common, fmtstrings::kStoreVersion);
1100  }
1101 
1109  template <kDbOperation kOp = kDbOperation::kGet,
1111  inline expected::Result<std::optional<IrohadVersion>, DbError> forWSVVersion(
1112  RocksDbCommon &common) {
1113  return dbCall<IrohadVersion, kOp, kSc>(common, fmtstrings::kWsvVersion);
1114  }
1115 
1124  template <kDbOperation kOp = kDbOperation::kGet,
1127  RocksDbCommon &common, uint64_t height) {
1128  return dbCall<std::string_view, kOp, kSc>(
1129  common, fmtstrings::kBlockDataInStore, height);
1130  }
1131 
1139  template <kDbOperation kOp = kDbOperation::kGet,
1141  inline expected::Result<std::optional<uint64_t>, DbError> forBlocksTotalCount(
1142  RocksDbCommon &common) {
1143  return dbCall<uint64_t, kOp, kSc>(common, fmtstrings::kBlocksTotalCount);
1144  }
1145 
1155  template <kDbOperation kOp = kDbOperation::kGet,
1157  inline expected::Result<std::optional<uint64_t>, DbError> forQuorum(
1158  RocksDbCommon &common,
1159  std::string_view account,
1160  std::string_view domain) {
1161  return dbCall<uint64_t, kOp, kSc>(
1162  common, fmtstrings::kQuorum, domain, account);
1163  }
1164 
1173  template <kDbOperation kOp = kDbOperation::kGet,
1175  inline expected::Result<std::optional<uint64_t>, DbError> forTxsTotalCount(
1176  RocksDbCommon &common, std::string_view account_id) {
1177  return dbCall<uint64_t, kOp, kSc>(
1178  common, fmtstrings::kTxsTotalCount, account_id);
1179  }
1180 
1188  template <kDbOperation kOp = kDbOperation::kGet,
1190  inline expected::Result<std::optional<uint64_t>, DbError> forTxsTotalCount(
1191  RocksDbCommon &common) {
1192  return dbCall<uint64_t, kOp, kSc>(common, fmtstrings::kAllTxsTotalCount);
1193  }
1194 
1202  template <kDbOperation kOp = kDbOperation::kGet,
1204  inline expected::Result<std::optional<uint64_t>, DbError>
1206  return dbCall<uint64_t, kOp, kSc>(common, fmtstrings::kDomainsTotalCount);
1207  }
1208 
1218  template <kDbOperation kOp = kDbOperation::kGet,
1220  inline auto forAccount(RocksDbCommon &common,
1221  std::string_view account,
1222  std::string_view domain) {
1223  return forQuorum<kOp, kSc>(common, account, domain);
1224  }
1225 
1234  template <kDbOperation kOp = kDbOperation::kGet,
1236  inline expected::
1237  Result<std::optional<shared_model::interface::RolePermissionSet>, DbError>
1238  forRole(RocksDbCommon &common, std::string_view role) {
1239  return dbCall<shared_model::interface::RolePermissionSet, kOp, kSc>(
1240  common, fmtstrings::kRole, role);
1241  }
1242 
1250  template <kDbOperation kOp = kDbOperation::kGet,
1252  inline expected::Result<std::optional<uint64_t>, DbError> forPeersCount(
1253  RocksDbCommon &common) {
1254  return dbCall<uint64_t, kOp, kSc>(common, fmtstrings::kPeersCount);
1255  }
1256 
1265  template <kDbOperation kOp = kDbOperation::kGet,
1268  forTransactionStatus(RocksDbCommon &common, std::string_view tx_hash) {
1269  return dbCall<std::string_view, kOp, kSc>(
1270  common, fmtstrings::kTransactionStatus, tx_hash);
1271  }
1272 
1283  template <kDbOperation kOp = kDbOperation::kGet,
1285  inline expected::Result<std::optional<std::string_view>, DbError>
1287  std::string_view account,
1288  uint64_t ts,
1289  uint64_t height,
1290  uint64_t index) {
1291  return dbCall<std::string_view, kOp, kSc>(
1292  common, fmtstrings::kTransactionByPosition, account, height, index, ts);
1293  }
1294 
1304  template <kDbOperation kOp = kDbOperation::kGet,
1306  inline expected::Result<std::optional<std::string_view>, DbError>
1308  std::string_view account,
1309  uint64_t ts,
1310  uint64_t height,
1311  uint64_t index) {
1312  return dbCall<std::string_view, kOp, kSc>(
1313  common, fmtstrings::kTransactionByTs, account, ts, height, index);
1314  }
1315 
1324  template <kDbOperation kOp = kDbOperation::kGet,
1326  inline expected::Result<std::optional<std::string_view>, DbError> forSettings(
1327  RocksDbCommon &common, std::string_view key) {
1328  return dbCall<std::string_view, kOp, kSc>(
1329  common, fmtstrings::kSetting, key);
1330  }
1331 
1340  template <kDbOperation kOp = kDbOperation::kGet,
1342  inline expected::Result<std::optional<std::string_view>, DbError>
1343  forPeerAddress(RocksDbCommon &common, std::string_view pubkey) {
1344  return dbCall<std::string_view, kOp, kSc>(
1345  common, fmtstrings::kPeerAddress, pubkey);
1346  }
1347 
1356  template <kDbOperation kOp = kDbOperation::kGet,
1358  inline expected::Result<std::optional<std::string_view>, DbError> forPeerTLS(
1359  RocksDbCommon &common, std::string_view pubkey) {
1360  return dbCall<std::string_view, kOp, kSc>(
1361  common, fmtstrings::kPeerTLS, pubkey);
1362  }
1363 
1373  template <kDbOperation kOp = kDbOperation::kGet,
1375  inline expected::Result<std::optional<uint64_t>, DbError> forAsset(
1376  RocksDbCommon &common, std::string_view asset, std::string_view domain) {
1377  return dbCall<uint64_t, kOp, kSc>(
1378  common, fmtstrings::kAsset, domain, asset);
1379  }
1380 
1390  template <kDbOperation kOp = kDbOperation::kGet,
1392  expected::Result<std::optional<std::string_view>, DbError> forTopBlockInfo(
1393  RocksDbCommon &common) {
1394  return dbCall<std::string_view, kOp, kSc>(common, fmtstrings::kTopBlock);
1395  }
1396 
1407  template <kDbOperation kOp = kDbOperation::kGet,
1410  RocksDbCommon &common,
1411  std::string_view account,
1412  std::string_view domain,
1413  std::string_view role) {
1414  return dbCall<bool, kOp, kSc>(
1415  common, fmtstrings::kAccountRole, domain, account, role);
1416  }
1417 
1430  template <kDbOperation kOp = kDbOperation::kGet,
1432  inline expected::Result<std::optional<std::string_view>, DbError>
1434  std::string_view account,
1435  std::string_view domain,
1436  std::string_view creator_id,
1437  std::string_view key) {
1438  return dbCall<std::string_view, kOp, kSc>(
1439  common, fmtstrings::kAccountDetail, domain, account, creator_id, key);
1440  }
1441 
1452  template <kDbOperation kOp = kDbOperation::kGet,
1455  RocksDbCommon &common,
1456  std::string_view account,
1457  std::string_view domain,
1458  std::string_view pubkey) {
1459  return dbCall<bool, kOp, kSc>(
1460  common, fmtstrings::kSignatory, domain, account, pubkey);
1461  }
1462 
1471  template <kDbOperation kOp = kDbOperation::kGet,
1473  inline expected::Result<std::optional<std::string_view>, DbError> forDomain(
1474  RocksDbCommon &common, std::string_view domain) {
1475  return dbCall<std::string_view, kOp, kSc>(
1476  common, fmtstrings::kDomain, domain);
1477  }
1478 
1488  template <kDbOperation kOp = kDbOperation::kGet,
1490  inline expected::Result<std::optional<uint64_t>, DbError> forAccountAssetSize(
1491  RocksDbCommon &common,
1492  std::string_view account,
1493  std::string_view domain) {
1494  return dbCall<uint64_t, kOp, kSc>(
1495  common, fmtstrings::kAccountAssetSize, domain, account);
1496  }
1497 
1508  template <kDbOperation kOp = kDbOperation::kGet,
1511  DbError>
1513  std::string_view account,
1514  std::string_view domain,
1515  std::string_view asset) {
1516  return dbCall<shared_model::interface::Amount, kOp, kSc>(
1517  common, fmtstrings::kAccountAsset, domain, account, asset);
1518  }
1519 
1531  template <kDbOperation kOp = kDbOperation::kGet,
1533  inline expected::Result<
1534  std::optional<shared_model::interface::GrantablePermissionSet>,
1535  DbError>
1537  std::string_view account,
1538  std::string_view domain,
1539  std::string_view grantee_account_id) {
1540  return dbCall<shared_model::interface::GrantablePermissionSet, kOp, kSc>(
1541  common, fmtstrings::kGranted, domain, account, grantee_account_id);
1542  }
1543 
1553  std::string_view account,
1554  std::string_view domain) {
1555  assert(!domain.empty());
1556  assert(!account.empty());
1557 
1560  std::vector<std::string> roles;
1561  auto status = enumerateKeys(common,
1562  [&](auto role) {
1563  if (!role.empty())
1564  roles.emplace_back(role.ToStringView());
1565  else {
1566  assert(!"Role can not be empty string!");
1567  }
1568  return true;
1569  },
1571  domain,
1572  account);
1573 
1574  if (!status.ok())
1575  return makeError<shared_model::interface::RolePermissionSet>(
1577  "Enumerate account {}@{} roles failed with status: {}.",
1578  account,
1579  domain,
1580  status.ToString());
1581 
1583  for (auto &role : roles) {
1584  auto opt_perm =
1585  forRole<kDbOperation::kGet, kDbEntry::kMustExist>(common, role);
1586  RDB_ERROR_CHECK(opt_perm);
1587  permissions |= *opt_perm.assumeValue();
1588  }
1589 
1590  return permissions;
1591  }
1592 
1594  shared_model::interface::RolePermissionSet const &permissions,
1596  if (permissions.isSet(to_check))
1597  return {};
1598 
1599  return makeError<void>(DbErrorCode::kErrorNoPermissions, "No permissions.");
1600  }
1601 
1603  std::string_view domain_id,
1604  std::string_view creator_domain_id,
1605  shared_model::interface::RolePermissionSet const &permissions,
1608  if (permissions.isSet(all))
1609  return {};
1610 
1611  if (domain_id == creator_domain_id && permissions.isSet(domain))
1612  return {};
1613 
1614  return makeError<void>(DbErrorCode::kErrorNoPermissions, "No permissions.");
1615  }
1616 
1618  shared_model::interface::RolePermissionSet const &permissions,
1620  &grantable_permissions,
1622  if (grantable_permissions.isSet(granted)
1624  return {};
1625 
1626  return makeError<void>(DbErrorCode::kErrorNoPermissions, "No permissions.");
1627  }
1628 
1630  shared_model::interface::RolePermissionSet const &permissions,
1632  &grantable_permissions,
1635  if (permissions.isSet(role))
1636  return {};
1637 
1638  if (grantable_permissions.isSet(granted))
1639  return {};
1640 
1641  return makeError<void>(DbErrorCode::kErrorNoPermissions, "No permissions.");
1642  }
1643 
1645  std::string_view domain_id,
1646  std::string_view creator_domain_id,
1647  std::string_view qry_account_id,
1648  std::string_view creator_id,
1649  shared_model::interface::RolePermissionSet const &permissions,
1653  if (permissions.isSet(all))
1654  return {};
1655 
1656  if (domain_id == creator_domain_id && permissions.isSet(domain))
1657  return {};
1658 
1659  if (qry_account_id == creator_id && permissions.isSet(my))
1660  return {};
1661 
1662  return makeError<void>(DbErrorCode::kErrorNoPermissions, "No permissions.");
1663  }
1664 
1666  struct FirstEntry {
1667  std::string writer_from;
1668  std::string key_from;
1669  };
1670 
1671  std::optional<FirstEntry> first;
1672  uint64_t page_size;
1673  };
1674 
1676  RocksDbCommon &common,
1677  std::string_view account,
1678  std::string_view domain,
1679  uint64_t &total,
1680  std::string_view writer_filter = std::string_view{},
1681  std::string_view key_filter = std::string_view{},
1682  std::optional<PaginationContext> pagination = std::nullopt,
1683  std::string *next_writer = nullptr,
1684  std::string *next_key = nullptr) {
1685  std::string result = "{";
1686  std::string prev_writer;
1687 
1688  auto remains = pagination ? pagination->page_size + 1ull
1689  : std::numeric_limits<uint64_t>::max();
1690  bool found = !pagination || !pagination->first;
1691  bool have_entries = false;
1692 
1693  // TODO(iceseer): find first entry by log(N)
1694  total = 0ull;
1695  auto status = ametsuchi::enumerateKeysAndValues(
1696  common,
1697  [&](auto path, auto value) {
1698  auto const &[cur_writer, _, cur_key] =
1699  staticSplitId<3>(path.ToStringView(), fmtstrings::kDelimiter);
1700 
1701  have_entries = true;
1702  if (!writer_filter.empty() && cur_writer != writer_filter)
1703  return true;
1704  if (!key_filter.empty() && cur_key != key_filter)
1705  return true;
1706 
1707  ++total;
1708  if (!found) {
1709  if (cur_writer != pagination->first->writer_from
1710  || cur_key != pagination->first->key_from)
1711  return true;
1712  found = true;
1713  }
1714 
1715  if (remains == 0ull) {
1716  return true;
1717  } else if (remains-- == 1ull) {
1718  if (next_writer != nullptr)
1719  *next_writer = cur_writer;
1720  if (next_key != nullptr)
1721  *next_key = cur_key;
1722  return true;
1723  }
1724 
1725  if (prev_writer != cur_writer) {
1726  if (prev_writer.empty())
1727  result += '\"';
1728  else
1729  result += "},\"";
1730  result += cur_writer;
1731  result += "\": {";
1732  prev_writer = cur_writer;
1733  } else
1734  result += ", ";
1735 
1736  result += '\"';
1737  result += cur_key;
1738  result += "\": \"";
1739  result += value.ToStringView();
1740  result += '\"';
1741 
1742  return true;
1743  },
1745  domain,
1746  account);
1747  RDB_ERROR_CHECK(canExist(status, [&]() {
1748  return fmt::format("Aggregate account {}@{} data", account, domain);
1749  }));
1750 
1751  if (!found && have_entries)
1752  return makeError<std::string>(DbErrorCode::kInvalidPagination,
1753  "Invalid pagination.");
1754 
1755  result += result.size() == 1ull ? "}" : "}}";
1756  return result;
1757  }
1758 
1760  if (auto status = common.filterDelete(fmtstrings::kPathWsv); !status.ok())
1761  return makeError<void>(DbErrorCode::kOperationFailed,
1762  "Clear WSV failed.");
1763  return {};
1764  }
1765 
1766 } // namespace iroha::ametsuchi
1767 
1768 #endif
std::string key_from
Definition: rocksdb_common.hpp:1668
Definition: block_query.hpp:17
static auto constexpr kPeersCount
Definition: rocksdb_common.hpp:344
Definition: rocksdb_common.hpp:457
expected::Result< std::optional< bool >, DbError > forSignatory(RocksDbCommon &common, std::string_view account, std::string_view domain, std::string_view pubkey)
Definition: rocksdb_common.hpp:1454
auto enumerateKeysAndValues(RocksDbCommon &rdb, F &&func, S const &strformat, Args &&... args)
Enumerating through all the keys matched to prefix and read the value.
Definition: rocksdb_common.hpp:819
#define RDB_PEERS
Definition: rocksdb_common.hpp:168
#define RDB_PATH_ACCOUNT
Definition: rocksdb_common.hpp:188
#define RDB_F_ASSET_SIZE
Definition: rocksdb_common.hpp:181
static auto constexpr kTransactionByPosition
Definition: rocksdb_common.hpp:254
uint64_t page_size
Definition: rocksdb_common.hpp:1672
auto filterDelete(S const &fmtstring, Args &&... args)
Removes range of items by key-filter.
Definition: rocksdb_common.hpp:741
Grantable
Definition: permissions.hpp:76
Definition: rocksdb_common.hpp:460
expected::Result< std::optional< bool >, DbError > forAccountRole(RocksDbCommon &common, std::string_view account, std::string_view domain, std::string_view role)
Definition: rocksdb_common.hpp:1409
auto rollback()
Rollback all transaction changes.
Definition: rocksdb_common.hpp:615
static auto constexpr kRole
Definition: rocksdb_common.hpp:283
static auto constexpr kTxsTotalCount
Definition: rocksdb_common.hpp:349
static auto constexpr kDomainsTotalCount
Definition: rocksdb_common.hpp:362
expected::Result< std::optional< uint64_t >, DbError > forAccountDetailsCount(RocksDbCommon &common, std::string_view account, std::string_view domain)
Definition: rocksdb_common.hpp:1081
expected::Result< std::optional< std::string_view >, DbError > forTopBlockInfo(RocksDbCommon &common)
Definition: rocksdb_common.hpp:1392
static auto constexpr kDomain
Definition: rocksdb_common.hpp:329
expected::Result< std::optional< std::string_view >, DbError > forDomain(RocksDbCommon &common, std::string_view domain)
Definition: rocksdb_common.hpp:1473
expected::Result< std::optional< std::string_view >, DbError > forTransactionStatus(RocksDbCommon &common, std::string_view tx_hash)
Definition: rocksdb_common.hpp:1268
Definition: rocksdb_common.hpp:452
expected::Result< std::optional< shared_model::interface::Amount >, DbError > forAccountAsset(RocksDbCommon &common, std::string_view account, std::string_view domain, std::string_view asset)
Definition: rocksdb_common.hpp:1512
Definition: rocksdb_common.hpp:1665
static auto constexpr kAsset
Definition: rocksdb_common.hpp:292
Definition: permissions.hpp:103
static auto constexpr kAllTxsTotalCount
Definition: rocksdb_common.hpp:358
#define RDB_STATUSES
Definition: rocksdb_common.hpp:169
RocksDBContext(std::shared_ptr< RocksDBPort > dbp)
Definition: rocksdb_common.hpp:426
read the value by the key
static auto constexpr kPathAccount
Definition: rocksdb_common.hpp:212
Definition: round.cpp:51
RocksDbCommon(std::shared_ptr< RocksDBContext > tx_context)
Definition: rocksdb_common.hpp:559
Definition: result_fwd.hpp:27
expected::Result< shared_model::interface::RolePermissionSet, DbError > accountPermissions(RocksDbCommon &common, std::string_view account, std::string_view domain)
Definition: rocksdb_common.hpp:1552
auto commit()
Makes commit to DB.
Definition: rocksdb_common.hpp:605
std::string writer_from
Definition: rocksdb_common.hpp:1667
#define RDB_SIGNATORIES
Definition: rocksdb_common.hpp:175
auto & valueBuffer()
Get value buffer.
Definition: rocksdb_common.hpp:567
Definition: rocksdb_common.hpp:1666
kDbEntry
Definition: rocksdb_common.hpp:773
expected::Result< std::optional< uint64_t >, DbError > forAccountAssetSize(RocksDbCommon &common, std::string_view account, std::string_view domain)
Definition: rocksdb_common.hpp:1490
static auto constexpr kPathPeers
Definition: rocksdb_common.hpp:215
expected::Result< void, DbError > checkPermissions(shared_model::interface::RolePermissionSet const &permissions, shared_model::interface::permissions::Role const to_check)
Definition: rocksdb_common.hpp:1593
Definition: rocksdb_common.hpp:422
static auto constexpr kPathRoles
Definition: rocksdb_common.hpp:223
Definition: rocksdb_common.hpp:453
static auto constexpr kPathAccountRoles
Definition: rocksdb_common.hpp:204
void savepoint()
Saves current state of a transaction.
Definition: rocksdb_common.hpp:646
#define RDB_XXX
Definition: rocksdb_common.hpp:157
static auto constexpr kPathTransactionByPosition
Definition: rocksdb_common.hpp:232
auto encode(uint64_t number)
Encode number into.
Definition: rocksdb_common.hpp:660
Definition: rocksdb_common.hpp:487
static auto constexpr kPathStore
Definition: rocksdb_common.hpp:209
Definition: rocksdb_common.hpp:190
Role
Definition: permissions.hpp:18
uint32_t code
Definition: rocksdb_common.hpp:466
static auto constexpr kAccountDetail
Definition: rocksdb_common.hpp:301
static auto constexpr kAccountDetailsCount
Definition: rocksdb_common.hpp:366
auto enumerate(F &&func, S const &fmtstring, Args &&... args)
Definition: rocksdb_common.hpp:734
auto put(S const &fmtstring, Args &&... args)
Put data from.
Definition: rocksdb_common.hpp:687
static const std::string kDelimiter
Definition: rocksdb_common.hpp:196
Definition: rocksdb_common.hpp:458
auto forAccount(RocksDbCommon &common, std::string_view account, std::string_view domain)
Definition: rocksdb_common.hpp:1220
static auto constexpr kStoreVersion
Definition: rocksdb_common.hpp:370
expected::Result< std::optional< std::string_view >, DbError > forSettings(RocksDbCommon &common, std::string_view key)
Definition: rocksdb_common.hpp:1326
static auto constexpr kTopBlock
Definition: rocksdb_common.hpp:332
#define RDB_SETTINGS
Definition: rocksdb_common.hpp:163
expected::Result< std::string, DbError > aggregateAccountDetails(RocksDbCommon &common, std::string_view account, std::string_view domain, uint64_t &total, std::string_view writer_filter=std::string_view{}, std::string_view key_filter=std::string_view{}, std::optional< PaginationContext > pagination=std::nullopt, std::string *next_writer=nullptr, std::string *next_key=nullptr)
Definition: rocksdb_common.hpp:1675
void skip()
Skips all changes made in this transaction.
Definition: rocksdb_common.hpp:640
#define RDB_DELIMITER
Definition: rocksdb_common.hpp:156
auto seek(S const &fmtstring, Args &&... args)
Searches for the first key that matches a prefix.
Definition: rocksdb_common.hpp:708
auto makeKVLambda(F &&func)
Definition: rocksdb_common.hpp:803
static constexpr size_t kDelimiterSize
Definition: rocksdb_common.hpp:191
static auto constexpr kPathAccountAssets
Definition: rocksdb_common.hpp:241
#define RDB_TLS
Definition: rocksdb_common.hpp:178
static auto constexpr kBlocksTotalCount
Definition: rocksdb_common.hpp:354
expected::Result< void, DbError > checkGrantablePermissions(shared_model::interface::RolePermissionSet const &permissions, shared_model::interface::GrantablePermissionSet const &grantable_permissions, shared_model::interface::permissions::Grantable const granted)
Definition: rocksdb_common.hpp:1617
auto del(S const &fmtstring, Args &&... args)
Delete database entry by the key.
Definition: rocksdb_common.hpp:698
auto decode(uint64_t &number)
Decode number from.
Definition: rocksdb_common.hpp:666
#define RDB_F_TOTAL_COUNT
Definition: rocksdb_common.hpp:184
static constexpr size_t kDelimiterCountForAField
Definition: rocksdb_common.hpp:194
#define RDB_NETWORK
Definition: rocksdb_common.hpp:162
expected::Result< void, DbError > checkStatus(rocksdb::Status status, F &&op_formatter)
Definition: rocksdb_common.hpp:889
#define RDB_ROLES
Definition: rocksdb_common.hpp:165
expected::Result< std::optional< IrohadVersion >, DbError > forWSVVersion(RocksDbCommon &common)
Definition: rocksdb_common.hpp:1111
Definition: rocksdb_common.hpp:461
#define RDB_POSITION
Definition: rocksdb_common.hpp:172
DbErrorCode
Definition: rocksdb_common.hpp:451
expected::Result< std::optional< RetT >, DbError > dbCall(RocksDbCommon &common, Args &&... args)
Definition: rocksdb_common.hpp:1059
expected::Result< std::optional< uint64_t >, DbError > forPeersCount(RocksDbCommon &common)
Definition: rocksdb_common.hpp:1252
Db errors structure.
Definition: rocksdb_common.hpp:465
static auto constexpr kWsvVersion
Definition: rocksdb_common.hpp:374
expected::Result< T, DbError > makeError(uint32_t code, DbError &&e)
Definition: rocksdb_common.hpp:480
#define RDB_TRANSACTIONS
Definition: rocksdb_common.hpp:166
auto get(S const &fmtstring, Args &&... args)
Read data from database to.
Definition: rocksdb_common.hpp:674
std::optional< FirstEntry > first
Definition: rocksdb_common.hpp:1671
expected::Result< std::optional< shared_model::interface::RolePermissionSet >, DbError > forRole(RocksDbCommon &common, std::string_view role)
Definition: rocksdb_common.hpp:1238
expected::Result< std::optional< std::string_view >, DbError > forTransactionByPosition(RocksDbCommon &common, std::string_view account, uint64_t ts, uint64_t height, uint64_t index)
Definition: rocksdb_common.hpp:1286
expected::Result< std::optional< std::string_view >, DbError > forPeerTLS(RocksDbCommon &common, std::string_view pubkey)
Definition: rocksdb_common.hpp:1358
auto enumerateKeys(RocksDbCommon &rdb, F &&func, S const &strformat, Args &&... args)
Enumerating through all the keys matched to prefix without reading value.
Definition: rocksdb_common.hpp:783
#define RDB_ROOT
Definition: rocksdb_common.hpp:159
expected::Result< void, DbError > mustNotExist(rocksdb::Status const &status, F &&op_formatter)
Definition: rocksdb_common.hpp:843
Definition: rocksdb_common.hpp:454
expected::Result< void, DbError > dropWSV(RocksDbCommon &common)
Definition: rocksdb_common.hpp:1759
static auto constexpr kSetting
Definition: rocksdb_common.hpp:320
Definition: rocksdb_common.hpp:459
static auto constexpr kAccountRole
Definition: rocksdb_common.hpp:279
expected::Result< std::optional< std::string_view >, DbError > forTransactionByTimestamp(RocksDbCommon &common, std::string_view account, uint64_t ts, uint64_t height, uint64_t index)
Definition: rocksdb_common.hpp:1307
entry must exist and data must be accessible
#define RDB_ACCOUNTS
Definition: rocksdb_common.hpp:167
expected::Result< void, DbError > canExist(rocksdb::Status const &status, F &&op_formatter)
Definition: rocksdb_common.hpp:877
put the value with the key
auto rollbackToSavepoint()
Restores to the previously saved savepoint.
Definition: rocksdb_common.hpp:652
expected::Result< std::optional< std::string_view >, DbError > forAccountDetail(RocksDbCommon &common, std::string_view account, std::string_view domain, std::string_view creator_id, std::string_view key)
Definition: rocksdb_common.hpp:1433
auto prepare()
Prepare tx for 2pc.
Definition: rocksdb_common.hpp:632
Definition: rocksdb_common.hpp:557
#define RDB_STORE
Definition: rocksdb_common.hpp:160
static auto constexpr kAccountAssetSize
Definition: rocksdb_common.hpp:341
#define RDB_ERROR_CHECK(...)
Definition: rocksdb_common.hpp:528
static auto constexpr kAccountAsset
Definition: rocksdb_common.hpp:296
Definition: rocksdb_common.hpp:455
static auto constexpr kQuorum
Definition: rocksdb_common.hpp:337
expected::Result< rocksdb::Status, DbError > executeOperation(RocksDbCommon &common, OperationDescribtionF &&op_formatter, Args &&... args)
Definition: rocksdb_common.hpp:907
expected::Result< std::optional< std::string_view >, DbError > forPeerAddress(RocksDbCommon &common, std::string_view pubkey)
Definition: rocksdb_common.hpp:1343
static auto constexpr kPeerAddress
Definition: rocksdb_common.hpp:305
auto enumerate(std::unique_ptr< rocksdb::Iterator > &it, F &&func, S const &fmtstring, Args &&... args)
Definition: rocksdb_common.hpp:722
#define RDB_ASSETS
Definition: rocksdb_common.hpp:164
static auto constexpr kTransactionByTs
Definition: rocksdb_common.hpp:259
#define RDB_WSV
Definition: rocksdb_common.hpp:161
std::optional< uint64_t > loadValue(RocksDbCommon &common, expected::Result< rocksdb::Status, DbError > const &status)
Definition: rocksdb_common.hpp:935
static auto constexpr kTransactionByTsLowerBound
Definition: rocksdb_common.hpp:269
static auto constexpr kTransactionByHeight
Definition: rocksdb_common.hpp:264
expected::Result< std::optional< uint64_t >, DbError > forBlocksTotalCount(RocksDbCommon &common)
Definition: rocksdb_common.hpp:1141
static auto constexpr kPathSignatories
Definition: rocksdb_common.hpp:219
#define RDB_F_QUORUM
Definition: rocksdb_common.hpp:180
static auto constexpr kPathTransactionByTs
Definition: rocksdb_common.hpp:227
expected::Result< void, DbError > initialize(std::string const &db_name)
Definition: rocksdb_common.hpp:492
static auto constexpr kTransactionStatus
Definition: rocksdb_common.hpp:274
check the entry exists by the key
static auto constexpr kPathAccountDetail
Definition: rocksdb_common.hpp:237
static auto constexpr kGranted
Definition: rocksdb_common.hpp:316
static auto constexpr kSignatory
Definition: rocksdb_common.hpp:288
static auto constexpr kPeerTLS
Definition: rocksdb_common.hpp:310
static auto constexpr kBlockDataInStore
Definition: rocksdb_common.hpp:250
std::string description
Definition: rocksdb_common.hpp:467
Definition: rocksdb_common.hpp:456
Definition: irohad_version.hpp:23
expected::Result< std::optional< IrohadVersion >, DbError > forStoreVersion(RocksDbCommon &common)
Definition: rocksdb_common.hpp:1098
#define RDB_PATH_DOMAIN
Definition: rocksdb_common.hpp:187
bool isSet(Perm p) const
Definition: permissions.cpp:94
#define RDB_F_TOP_BLOCK
Definition: rocksdb_common.hpp:182
expected::Result< T, DbError > makeError(uint32_t code, char const *format, Args &&... args)
Definition: rocksdb_common.hpp:471
Status
Definition: status.hpp:12
kDbOperation
Definition: rocksdb_common.hpp:762
auto & keyBuffer()
Get key buffer.
Definition: rocksdb_common.hpp:572
#define RDB_ADDRESS
Definition: rocksdb_common.hpp:177
expected::Result< void, DbError > mustExist(rocksdb::Status const &status, F &&op_formatter)
Definition: rocksdb_common.hpp:860
expected::Result< std::optional< shared_model::interface::GrantablePermissionSet >, DbError > forGrantablePermissions(RocksDbCommon &common, std::string_view account, std::string_view domain, std::string_view grantee_account_id)
Definition: rocksdb_common.hpp:1536
#define RDB_F_PEERS_COUNT
Definition: rocksdb_common.hpp:183
expected::Result< std::optional< uint64_t >, DbError > forTxsTotalCount(RocksDbCommon &common, std::string_view account_id)
Definition: rocksdb_common.hpp:1175
#define RDB_DOMAIN
Definition: rocksdb_common.hpp:174
expected::Result< std::optional< uint64_t >, DbError > forDomainsTotalCount(RocksDbCommon &common)
Definition: rocksdb_common.hpp:1205
static auto constexpr kPathWsv
Definition: rocksdb_common.hpp:207
#define RDB_OPTIONS
Definition: rocksdb_common.hpp:176
#define RDB_GRANTABLE_PER
Definition: rocksdb_common.hpp:171
#define RDB_F_VERSION
Definition: rocksdb_common.hpp:185
expected::Result< std::optional< uint64_t >, DbError > forQuorum(RocksDbCommon &common, std::string_view account, std::string_view domain)
Definition: rocksdb_common.hpp:1157
expected::Result< std::optional< uint64_t >, DbError > forAsset(RocksDbCommon &common, std::string_view asset, std::string_view domain)
Definition: rocksdb_common.hpp:1375
expected::Result< std::optional< std::string_view >, DbError > forBlock(RocksDbCommon &common, uint64_t height)
Definition: rocksdb_common.hpp:1126
auto release()
Definition: rocksdb_common.hpp:624
#define RDB_DETAILS
Definition: rocksdb_common.hpp:170
#define RDB_TIMESTAMP
Definition: rocksdb_common.hpp:173