From 11718af9b84399248fad7ce22b87cae6356bff84 Mon Sep 17 00:00:00 2001
From: pbattu123
Date: Tue, 3 Mar 2020 16:42:51 -0400
Subject: [PATCH] Merge develop into SONS
---
.gitmodules | 3 +-
CMakeDoxyfile.in | 279 ++++
Doxyfile | 2 +-
libraries/app/CMakeLists.txt | 4 +-
libraries/app/api.cpp | 65 +-
libraries/app/application.cpp | 29 +-
libraries/app/database_api.cpp | 351 +++-
libraries/app/impacted.cpp | 369 -----
libraries/app/include/graphene/app/api.hpp | 60 +-
.../app/include/graphene/app/application.hpp | 8 +-
.../app/include/graphene/app/database_api.hpp | 101 +-
libraries/chain/CMakeLists.txt | 2 +
libraries/chain/account_evaluator.cpp | 83 +-
libraries/chain/account_object.cpp | 19 +-
libraries/chain/asset_evaluator.cpp | 72 +-
libraries/chain/asset_object.cpp | 16 +-
libraries/chain/balance_evaluator.cpp | 1 +
.../chain/committee_member_evaluator.cpp | 10 +-
libraries/chain/db_balance.cpp | 11 +-
libraries/chain/db_block.cpp | 219 ++-
libraries/chain/db_debug.cpp | 2 +-
libraries/chain/db_getter.cpp | 30 +-
libraries/chain/db_init.cpp | 89 +-
libraries/chain/db_maint.cpp | 506 ++++--
libraries/chain/db_management.cpp | 14 +-
libraries/chain/db_market.cpp | 20 +-
libraries/chain/db_notify.cpp | 28 +-
libraries/chain/db_update.cpp | 102 +-
libraries/chain/db_witness_schedule.cpp | 12 +-
libraries/chain/genesis_state.cpp | 69 +
libraries/chain/hardfork.d/GPOS.hf | 4 +
.../include/graphene/chain/account_object.hpp | 96 +-
.../include/graphene/chain/asset_object.hpp | 108 +-
.../include/graphene/chain/balance_object.hpp | 2 +
.../include/graphene/chain/block_database.hpp | 2 +
.../graphene/chain/block_summary_object.hpp | 4 +
.../graphene/chain/budget_record_object.hpp | 17 +-
.../include/graphene/chain/buyback_object.hpp | 2 +
.../graphene/chain/chain_property_object.hpp | 4 +-
.../chain/committee_member_object.hpp | 5 +-
.../graphene/chain/confidential_object.hpp | 9 +-
.../chain/include/graphene/chain/config.hpp | 5 +-
.../chain/include/graphene/chain/database.hpp | 45 +-
.../include/graphene/chain/exceptions.hpp | 16 +
.../include/graphene/chain/fba_object.hpp | 5 +-
.../include/graphene/chain/fork_database.hpp | 5 +
.../include/graphene/chain/genesis_state.hpp | 81 +-
.../graphene/chain/global_property_object.hpp | 4 +-
.../chain/immutable_chain_parameters.hpp | 7 +-
.../include/graphene/chain}/impacted.hpp | 4 +-
.../include/graphene/chain/market_object.hpp | 4 +
.../chain/operation_history_object.hpp | 19 +-
.../graphene/chain/proposal_object.hpp | 5 +-
.../graphene/chain/protocol/account.hpp | 22 +-
.../graphene/chain/protocol/address.hpp | 12 +-
.../graphene/chain/protocol/assert.hpp | 3 +
.../include/graphene/chain/protocol/asset.hpp | 4 +
.../graphene/chain/protocol/asset_ops.hpp | 27 +
.../graphene/chain/protocol/authority.hpp | 3 +
.../graphene/chain/protocol/balance.hpp | 4 +
.../include/graphene/chain/protocol/base.hpp | 5 +
.../include/graphene/chain/protocol/block.hpp | 5 +
.../graphene/chain/protocol/buyback.hpp | 2 +
.../chain/protocol/chain_parameters.hpp | 34 +-
.../chain/protocol/committee_member.hpp | 7 +
.../graphene/chain/protocol/confidential.hpp | 7 +
.../graphene/chain/protocol/custom.hpp | 3 +
.../include/graphene/chain/protocol/ext.hpp | 1 +
.../include/graphene/chain/protocol/fba.hpp | 3 +
.../graphene/chain/protocol/fee_schedule.hpp | 3 +
.../graphene/chain/protocol/market.hpp | 11 +-
.../include/graphene/chain/protocol/memo.hpp | 3 +
.../graphene/chain/protocol/operations.hpp | 2 +
.../graphene/chain/protocol/proposal.hpp | 8 +
.../chain/protocol/special_authority.hpp | 2 +
.../graphene/chain/protocol/transaction.hpp | 5 +
.../graphene/chain/protocol/transfer.hpp | 6 +
.../include/graphene/chain/protocol/types.hpp | 30 +-
.../graphene/chain/protocol/vesting.hpp | 20 +-
.../include/graphene/chain/protocol/vote.hpp | 9 +-
.../chain/protocol/withdraw_permission.hpp | 10 +
.../graphene/chain/protocol/witness.hpp | 6 +
.../graphene/chain/protocol/worker.hpp | 3 +
.../include/graphene/chain/pts_address.hpp | 11 +-
.../chain/special_authority_object.hpp | 2 +
.../graphene/chain/transaction_object.hpp | 4 +-
.../chain/vesting_balance_evaluator.hpp | 1 +
.../graphene/chain/vesting_balance_object.hpp | 8 +-
.../chain/withdraw_permission_object.hpp | 2 +
.../include/graphene/chain/witness_object.hpp | 4 +-
.../chain/witness_schedule_object.hpp | 3 +
.../include/graphene/chain/worker_object.hpp | 5 +-
libraries/chain/proposal_evaluator.cpp | 14 +-
libraries/chain/proposal_object.cpp | 4 +-
libraries/chain/protocol/account.cpp | 16 +
libraries/chain/protocol/address.cpp | 5 +-
libraries/chain/protocol/assert.cpp | 10 +-
libraries/chain/protocol/asset.cpp | 11 +-
libraries/chain/protocol/asset_ops.cpp | 29 +
libraries/chain/protocol/authority.cpp | 3 +
libraries/chain/protocol/block.cpp | 5 +
libraries/chain/protocol/committee_member.cpp | 11 +
libraries/chain/protocol/confidential.cpp | 13 +-
libraries/chain/protocol/custom.cpp | 5 +
libraries/chain/protocol/fee_schedule.cpp | 4 +
libraries/chain/protocol/market.cpp | 9 +
libraries/chain/protocol/memo.cpp | 4 +
libraries/chain/protocol/operations.cpp | 5 +
libraries/chain/protocol/proposal.cpp | 9 +
libraries/chain/protocol/small_ops.cpp | 44 +
libraries/chain/protocol/tournament.cpp | 1 +
libraries/chain/protocol/transaction.cpp | 5 +
libraries/chain/protocol/transfer.cpp | 7 +
libraries/chain/protocol/vote.cpp | 2 +
.../chain/protocol/withdraw_permission.cpp | 11 +-
libraries/chain/protocol/witness.cpp | 6 +
libraries/chain/protocol/worker.cpp | 4 +
libraries/chain/pts_address.cpp | 11 +-
libraries/chain/small_objects.cpp | 72 +
libraries/chain/special_authority.cpp | 5 +
libraries/chain/vesting_balance_evaluator.cpp | 115 +-
libraries/chain/vesting_balance_object.cpp | 40 +-
libraries/chain/worker_evaluator.cpp | 2 +-
libraries/egenesis/egenesis_none.cpp | 2 +
libraries/fc | 2 +-
libraries/net/CMakeLists.txt | 1 +
.../net/include/graphene/net/message.hpp | 14 +-
.../include/graphene/net/peer_connection.hpp | 7 +-
.../include/graphene/net/peer_database.hpp | 8 +-
libraries/net/message.cpp | 29 +
libraries/net/message_oriented_connection.cpp | 34 +-
libraries/net/node.cpp | 24 +-
libraries/net/peer_connection.cpp | 13 +-
libraries/net/peer_database.cpp | 11 +
libraries/plugins/CMakeLists.txt | 2 +
.../account_history_plugin.cpp | 7 +-
.../accounts_list/accounts_list_plugin.cpp | 2 +-
.../affiliate_stats_plugin.cpp | 2 +-
libraries/plugins/bookie/bookie_plugin.cpp | 10 +-
.../delayed_node/delayed_node_plugin.cpp | 2 +-
.../plugins/elasticsearch/CMakeLists.txt | 23 +
.../elasticsearch/elasticsearch_plugin.cpp | 622 +++++++
.../elasticsearch/elasticsearch_plugin.hpp | 289 ++++
libraries/plugins/es_objects/CMakeLists.txt | 23 +
libraries/plugins/es_objects/es_objects.cpp | 401 +++++
.../graphene/es_objects/es_objects.hpp | 113 ++
libraries/plugins/snapshot/CMakeLists.txt | 2 +
.../include/graphene/snapshot/snapshot.hpp | 1 +
libraries/plugins/snapshot/snapshot.cpp | 5 +
libraries/utilities/CMakeLists.txt | 1 +
libraries/utilities/elasticsearch.cpp | 190 +++
.../graphene/utilities/elasticsearch.hpp | 68 +
.../wallet/include/graphene/wallet/wallet.hpp | 88 +-
libraries/wallet/wallet.cpp | 468 +++++-
programs/cli_wallet/main.cpp | 12 +-
programs/witness_node/CMakeLists.txt | 2 +-
programs/witness_node/genesis.json | 37 +-
programs/witness_node/main.cpp | 19 +-
tests/CMakeLists.txt | 20 +-
tests/app/main.cpp | 1 +
tests/cli/main.cpp | 641 +++++++-
tests/common/database_fixture.cpp | 65 +-
tests/elasticsearch/main.cpp | 535 ++++++
tests/tests/block_tests.cpp | 13 +-
tests/tests/gpos_tests.cpp | 1453 +++++++++++++++++
tests/tests/history_api_tests.cpp | 400 ++---
tests/tests/voting_tests.cpp | 362 +++-
167 files changed, 8390 insertions(+), 1445 deletions(-)
create mode 100644 CMakeDoxyfile.in
delete mode 100644 libraries/app/impacted.cpp
create mode 100644 libraries/chain/hardfork.d/GPOS.hf
rename libraries/{app/include/graphene/app => chain/include/graphene/chain}/impacted.hpp (96%)
create mode 100644 libraries/chain/protocol/small_ops.cpp
create mode 100644 libraries/chain/small_objects.cpp
create mode 100644 libraries/net/message.cpp
create mode 100644 libraries/plugins/elasticsearch/CMakeLists.txt
create mode 100644 libraries/plugins/elasticsearch/elasticsearch_plugin.cpp
create mode 100644 libraries/plugins/elasticsearch/include/graphene/elasticsearch/elasticsearch_plugin.hpp
create mode 100644 libraries/plugins/es_objects/CMakeLists.txt
create mode 100644 libraries/plugins/es_objects/es_objects.cpp
create mode 100644 libraries/plugins/es_objects/include/graphene/es_objects/es_objects.hpp
create mode 100644 libraries/utilities/elasticsearch.cpp
create mode 100644 libraries/utilities/include/graphene/utilities/elasticsearch.hpp
create mode 100644 tests/elasticsearch/main.cpp
create mode 100644 tests/tests/gpos_tests.cpp
diff --git a/.gitmodules b/.gitmodules
index 5572259c..4d3518d1 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -4,5 +4,6 @@
ignore = dirty
[submodule "libraries/fc"]
path = libraries/fc
- url = https://github.com/PBSA/peerplays-fc.git
+ url = https://github.com/peerplays-network/peerplays-fc.git
+ branch = latest-fc
ignore = dirty
diff --git a/CMakeDoxyfile.in b/CMakeDoxyfile.in
new file mode 100644
index 00000000..b0ed02fb
--- /dev/null
+++ b/CMakeDoxyfile.in
@@ -0,0 +1,279 @@
+#
+# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE!
+#
+
+DOXYFILE_ENCODING = @DOXYGEN_DOXYFILE_ENCODING@
+PROJECT_NAME = @DOXYGEN_PROJECT_NAME@
+PROJECT_NUMBER = @DOXYGEN_PROJECT_NUMBER@
+PROJECT_BRIEF = @DOXYGEN_PROJECT_BRIEF@
+PROJECT_LOGO = @DOXYGEN_PROJECT_LOGO@
+OUTPUT_DIRECTORY = @DOXYGEN_OUTPUT_DIRECTORY@
+CREATE_SUBDIRS = @DOXYGEN_CREATE_SUBDIRS@
+ALLOW_UNICODE_NAMES = @DOXYGEN_ALLOW_UNICODE_NAMES@
+OUTPUT_LANGUAGE = @DOXYGEN_OUTPUT_LANGUAGE@
+OUTPUT_TEXT_DIRECTION = @DOXYGEN_OUTPUT_TEXT_DIRECTION@
+BRIEF_MEMBER_DESC = @DOXYGEN_BRIEF_MEMBER_DESC@
+REPEAT_BRIEF = @DOXYGEN_REPEAT_BRIEF@
+ABBREVIATE_BRIEF = @DOXYGEN_ABBREVIATE_BRIEF@
+ALWAYS_DETAILED_SEC = @DOXYGEN_ALWAYS_DETAILED_SEC@
+INLINE_INHERITED_MEMB = @DOXYGEN_INLINE_INHERITED_MEMB@
+FULL_PATH_NAMES = @DOXYGEN_FULL_PATH_NAMES@
+STRIP_FROM_PATH = @DOXYGEN_STRIP_FROM_PATH@
+STRIP_FROM_INC_PATH = @DOXYGEN_STRIP_FROM_INC_PATH@
+SHORT_NAMES = @DOXYGEN_SHORT_NAMES@
+JAVADOC_AUTOBRIEF = @DOXYGEN_JAVADOC_AUTOBRIEF@
+JAVADOC_BANNER = @DOXYGEN_JAVADOC_BANNER@
+QT_AUTOBRIEF = @DOXYGEN_QT_AUTOBRIEF@
+MULTILINE_CPP_IS_BRIEF = @DOXYGEN_MULTILINE_CPP_IS_BRIEF@
+INHERIT_DOCS = @DOXYGEN_INHERIT_DOCS@
+SEPARATE_MEMBER_PAGES = @DOXYGEN_SEPARATE_MEMBER_PAGES@
+TAB_SIZE = @DOXYGEN_TAB_SIZE@
+ALIASES = @DOXYGEN_ALIASES@
+TCL_SUBST = @DOXYGEN_TCL_SUBST@
+OPTIMIZE_OUTPUT_FOR_C = @DOXYGEN_OPTIMIZE_OUTPUT_FOR_C@
+OPTIMIZE_OUTPUT_JAVA = @DOXYGEN_OPTIMIZE_OUTPUT_JAVA@
+OPTIMIZE_FOR_FORTRAN = @DOXYGEN_OPTIMIZE_FOR_FORTRAN@
+OPTIMIZE_OUTPUT_VHDL = @DOXYGEN_OPTIMIZE_OUTPUT_VHDL@
+OPTIMIZE_OUTPUT_SLICE = @DOXYGEN_OPTIMIZE_OUTPUT_SLICE@
+EXTENSION_MAPPING = @DOXYGEN_EXTENSION_MAPPING@
+MARKDOWN_SUPPORT = @DOXYGEN_MARKDOWN_SUPPORT@
+TOC_INCLUDE_HEADINGS = @DOXYGEN_TOC_INCLUDE_HEADINGS@
+AUTOLINK_SUPPORT = @DOXYGEN_AUTOLINK_SUPPORT@
+BUILTIN_STL_SUPPORT = @DOXYGEN_BUILTIN_STL_SUPPORT@
+CPP_CLI_SUPPORT = @DOXYGEN_CPP_CLI_SUPPORT@
+SIP_SUPPORT = @DOXYGEN_SIP_SUPPORT@
+IDL_PROPERTY_SUPPORT = @DOXYGEN_IDL_PROPERTY_SUPPORT@
+DISTRIBUTE_GROUP_DOC = @DOXYGEN_DISTRIBUTE_GROUP_DOC@
+GROUP_NESTED_COMPOUNDS = @DOXYGEN_GROUP_NESTED_COMPOUNDS@
+SUBGROUPING = @DOXYGEN_SUBGROUPING@
+INLINE_GROUPED_CLASSES = @DOXYGEN_INLINE_GROUPED_CLASSES@
+INLINE_SIMPLE_STRUCTS = @DOXYGEN_INLINE_SIMPLE_STRUCTS@
+TYPEDEF_HIDES_STRUCT = @DOXYGEN_TYPEDEF_HIDES_STRUCT@
+LOOKUP_CACHE_SIZE = @DOXYGEN_LOOKUP_CACHE_SIZE@
+EXTRACT_ALL = @DOXYGEN_EXTRACT_ALL@
+EXTRACT_PRIVATE = @DOXYGEN_EXTRACT_PRIVATE@
+EXTRACT_PRIV_VIRTUAL = @DOXYGEN_EXTRACT_PRIV_VIRTUAL@
+EXTRACT_PACKAGE = @DOXYGEN_EXTRACT_PACKAGE@
+EXTRACT_STATIC = @DOXYGEN_EXTRACT_STATIC@
+EXTRACT_LOCAL_CLASSES = @DOXYGEN_EXTRACT_LOCAL_CLASSES@
+EXTRACT_LOCAL_METHODS = @DOXYGEN_EXTRACT_LOCAL_METHODS@
+EXTRACT_ANON_NSPACES = @DOXYGEN_EXTRACT_ANON_NSPACES@
+HIDE_UNDOC_MEMBERS = @DOXYGEN_HIDE_UNDOC_MEMBERS@
+HIDE_UNDOC_CLASSES = @DOXYGEN_HIDE_UNDOC_CLASSES@
+HIDE_FRIEND_COMPOUNDS = @DOXYGEN_HIDE_FRIEND_COMPOUNDS@
+HIDE_IN_BODY_DOCS = @DOXYGEN_HIDE_IN_BODY_DOCS@
+INTERNAL_DOCS = @DOXYGEN_INTERNAL_DOCS@
+CASE_SENSE_NAMES = @DOXYGEN_CASE_SENSE_NAMES@
+HIDE_SCOPE_NAMES = @DOXYGEN_HIDE_SCOPE_NAMES@
+HIDE_COMPOUND_REFERENCE= @DOXYGEN_HIDE_COMPOUND_REFERENCE@
+SHOW_INCLUDE_FILES = @DOXYGEN_SHOW_INCLUDE_FILES@
+SHOW_GROUPED_MEMB_INC = @DOXYGEN_SHOW_GROUPED_MEMB_INC@
+FORCE_LOCAL_INCLUDES = @DOXYGEN_FORCE_LOCAL_INCLUDES@
+INLINE_INFO = @DOXYGEN_INLINE_INFO@
+SORT_MEMBER_DOCS = @DOXYGEN_SORT_MEMBER_DOCS@
+SORT_BRIEF_DOCS = @DOXYGEN_SORT_BRIEF_DOCS@
+SORT_MEMBERS_CTORS_1ST = @DOXYGEN_SORT_MEMBERS_CTORS_1ST@
+SORT_GROUP_NAMES = @DOXYGEN_SORT_GROUP_NAMES@
+SORT_BY_SCOPE_NAME = @DOXYGEN_SORT_BY_SCOPE_NAME@
+STRICT_PROTO_MATCHING = @DOXYGEN_STRICT_PROTO_MATCHING@
+GENERATE_TODOLIST = @DOXYGEN_GENERATE_TODOLIST@
+GENERATE_TESTLIST = @DOXYGEN_GENERATE_TESTLIST@
+GENERATE_BUGLIST = @DOXYGEN_GENERATE_BUGLIST@
+GENERATE_DEPRECATEDLIST= @DOXYGEN_GENERATE_DEPRECATEDLIST@
+ENABLED_SECTIONS = @DOXYGEN_ENABLED_SECTIONS@
+MAX_INITIALIZER_LINES = @DOXYGEN_MAX_INITIALIZER_LINES@
+SHOW_USED_FILES = @DOXYGEN_SHOW_USED_FILES@
+SHOW_FILES = @DOXYGEN_SHOW_FILES@
+SHOW_NAMESPACES = @DOXYGEN_SHOW_NAMESPACES@
+FILE_VERSION_FILTER = @DOXYGEN_FILE_VERSION_FILTER@
+LAYOUT_FILE = @DOXYGEN_LAYOUT_FILE@
+CITE_BIB_FILES = @DOXYGEN_CITE_BIB_FILES@
+QUIET = @DOXYGEN_QUIET@
+WARNINGS = @DOXYGEN_WARNINGS@
+WARN_IF_UNDOCUMENTED = @DOXYGEN_WARN_IF_UNDOCUMENTED@
+WARN_IF_DOC_ERROR = @DOXYGEN_WARN_IF_DOC_ERROR@
+WARN_NO_PARAMDOC = @DOXYGEN_WARN_NO_PARAMDOC@
+WARN_AS_ERROR = @DOXYGEN_WARN_AS_ERROR@
+WARN_FORMAT = @DOXYGEN_WARN_FORMAT@
+WARN_LOGFILE = @DOXYGEN_WARN_LOGFILE@
+INPUT = @DOXYGEN_INPUT@
+INPUT_ENCODING = @DOXYGEN_INPUT_ENCODING@
+FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@
+RECURSIVE = @DOXYGEN_RECURSIVE@
+EXCLUDE = @DOXYGEN_EXCLUDE@
+EXCLUDE_SYMLINKS = @DOXYGEN_EXCLUDE_SYMLINKS@
+EXCLUDE_PATTERNS = @DOXYGEN_EXCLUDE_PATTERNS@
+EXCLUDE_SYMBOLS = @DOXYGEN_EXCLUDE_SYMBOLS@
+EXAMPLE_PATH = @DOXYGEN_EXAMPLE_PATH@
+EXAMPLE_PATTERNS = @DOXYGEN_EXAMPLE_PATTERNS@
+EXAMPLE_RECURSIVE = @DOXYGEN_EXAMPLE_RECURSIVE@
+IMAGE_PATH = @DOXYGEN_IMAGE_PATH@
+INPUT_FILTER = @DOXYGEN_INPUT_FILTER@
+FILTER_PATTERNS = @DOXYGEN_FILTER_PATTERNS@
+FILTER_SOURCE_FILES = @DOXYGEN_FILTER_SOURCE_FILES@
+FILTER_SOURCE_PATTERNS = @DOXYGEN_FILTER_SOURCE_PATTERNS@
+USE_MDFILE_AS_MAINPAGE = @DOXYGEN_USE_MDFILE_AS_MAINPAGE@
+SOURCE_BROWSER = @DOXYGEN_SOURCE_BROWSER@
+INLINE_SOURCES = @DOXYGEN_INLINE_SOURCES@
+STRIP_CODE_COMMENTS = @DOXYGEN_STRIP_CODE_COMMENTS@
+REFERENCED_BY_RELATION = @DOXYGEN_REFERENCED_BY_RELATION@
+REFERENCES_RELATION = @DOXYGEN_REFERENCES_RELATION@
+REFERENCES_LINK_SOURCE = @DOXYGEN_REFERENCES_LINK_SOURCE@
+SOURCE_TOOLTIPS = @DOXYGEN_SOURCE_TOOLTIPS@
+USE_HTAGS = @DOXYGEN_USE_HTAGS@
+VERBATIM_HEADERS = @DOXYGEN_VERBATIM_HEADERS@
+CLANG_ASSISTED_PARSING = @DOXYGEN_CLANG_ASSISTED_PARSING@
+CLANG_OPTIONS = @DOXYGEN_CLANG_OPTIONS@
+CLANG_DATABASE_PATH = @DOXYGEN_CLANG_DATABASE_PATH@
+ALPHABETICAL_INDEX = @DOXYGEN_ALPHABETICAL_INDEX@
+COLS_IN_ALPHA_INDEX = @DOXYGEN_COLS_IN_ALPHA_INDEX@
+IGNORE_PREFIX = @DOXYGEN_IGNORE_PREFIX@
+GENERATE_HTML = @DOXYGEN_GENERATE_HTML@
+HTML_OUTPUT = @DOXYGEN_HTML_OUTPUT@
+HTML_FILE_EXTENSION = @DOXYGEN_HTML_FILE_EXTENSION@
+HTML_HEADER = @DOXYGEN_HTML_HEADER@
+HTML_FOOTER = @DOXYGEN_HTML_FOOTER@
+HTML_STYLESHEET = @DOXYGEN_HTML_STYLESHEET@
+HTML_EXTRA_STYLESHEET = @DOXYGEN_HTML_EXTRA_STYLESHEET@
+HTML_EXTRA_FILES = @DOXYGEN_HTML_EXTRA_FILES@
+HTML_COLORSTYLE_HUE = @DOXYGEN_HTML_COLORSTYLE_HUE@
+HTML_COLORSTYLE_SAT = @DOXYGEN_HTML_COLORSTYLE_SAT@
+HTML_COLORSTYLE_GAMMA = @DOXYGEN_HTML_COLORSTYLE_GAMMA@
+HTML_TIMESTAMP = @DOXYGEN_HTML_TIMESTAMP@
+HTML_DYNAMIC_MENUS = @DOXYGEN_HTML_DYNAMIC_MENUS@
+HTML_DYNAMIC_SECTIONS = @DOXYGEN_HTML_DYNAMIC_SECTIONS@
+HTML_INDEX_NUM_ENTRIES = @DOXYGEN_HTML_INDEX_NUM_ENTRIES@
+GENERATE_DOCSET = @DOXYGEN_GENERATE_DOCSET@
+DOCSET_FEEDNAME = @DOXYGEN_DOCSET_FEEDNAME@
+DOCSET_BUNDLE_ID = @DOXYGEN_DOCSET_BUNDLE_ID@
+DOCSET_PUBLISHER_ID = @DOXYGEN_DOCSET_PUBLISHER_ID@
+DOCSET_PUBLISHER_NAME = @DOXYGEN_DOCSET_PUBLISHER_NAME@
+GENERATE_HTMLHELP = @DOXYGEN_GENERATE_HTMLHELP@
+CHM_FILE = @DOXYGEN_CHM_FILE@
+HHC_LOCATION = @DOXYGEN_HHC_LOCATION@
+GENERATE_CHI = @DOXYGEN_GENERATE_CHI@
+CHM_INDEX_ENCODING = @DOXYGEN_CHM_INDEX_ENCODING@
+BINARY_TOC = @DOXYGEN_BINARY_TOC@
+TOC_EXPAND = @DOXYGEN_TOC_EXPAND@
+GENERATE_QHP = @DOXYGEN_GENERATE_QHP@
+QCH_FILE = @DOXYGEN_QCH_FILE@
+QHP_NAMESPACE = @DOXYGEN_QHP_NAMESPACE@
+QHP_VIRTUAL_FOLDER = @DOXYGEN_QHP_VIRTUAL_FOLDER@
+QHP_CUST_FILTER_NAME = @DOXYGEN_QHP_CUST_FILTER_NAME@
+QHP_CUST_FILTER_ATTRS = @DOXYGEN_QHP_CUST_FILTER_ATTRS@
+QHP_SECT_FILTER_ATTRS = @DOXYGEN_QHP_SECT_FILTER_ATTRS@
+QHG_LOCATION = @DOXYGEN_QHG_LOCATION@
+GENERATE_ECLIPSEHELP = @DOXYGEN_GENERATE_ECLIPSEHELP@
+ECLIPSE_DOC_ID = @DOXYGEN_ECLIPSE_DOC_ID@
+DISABLE_INDEX = @DOXYGEN_DISABLE_INDEX@
+GENERATE_TREEVIEW = @DOXYGEN_GENERATE_TREEVIEW@
+ENUM_VALUES_PER_LINE = @DOXYGEN_ENUM_VALUES_PER_LINE@
+TREEVIEW_WIDTH = @DOXYGEN_TREEVIEW_WIDTH@
+EXT_LINKS_IN_WINDOW = @DOXYGEN_EXT_LINKS_IN_WINDOW@
+FORMULA_FONTSIZE = @DOXYGEN_FORMULA_FONTSIZE@
+FORMULA_TRANSPARENT = @DOXYGEN_FORMULA_TRANSPARENT@
+USE_MATHJAX = @DOXYGEN_USE_MATHJAX@
+MATHJAX_FORMAT = @DOXYGEN_MATHJAX_FORMAT@
+MATHJAX_RELPATH = @DOXYGEN_MATHJAX_RELPATH@
+MATHJAX_EXTENSIONS = @DOXYGEN_MATHJAX_EXTENSIONS@
+MATHJAX_CODEFILE = @DOXYGEN_MATHJAX_CODEFILE@
+SEARCHENGINE = @DOXYGEN_SEARCHENGINE@
+SERVER_BASED_SEARCH = @DOXYGEN_SERVER_BASED_SEARCH@
+EXTERNAL_SEARCH = @DOXYGEN_EXTERNAL_SEARCH@
+SEARCHENGINE_URL = @DOXYGEN_SEARCHENGINE_URL@
+SEARCHDATA_FILE = @DOXYGEN_SEARCHDATA_FILE@
+EXTERNAL_SEARCH_ID = @DOXYGEN_EXTERNAL_SEARCH_ID@
+EXTRA_SEARCH_MAPPINGS = @DOXYGEN_EXTRA_SEARCH_MAPPINGS@
+GENERATE_LATEX = @DOXYGEN_GENERATE_LATEX@
+LATEX_OUTPUT = @DOXYGEN_LATEX_OUTPUT@
+LATEX_CMD_NAME = @DOXYGEN_LATEX_CMD_NAME@
+MAKEINDEX_CMD_NAME = @DOXYGEN_MAKEINDEX_CMD_NAME@
+LATEX_MAKEINDEX_CMD = @DOXYGEN_LATEX_MAKEINDEX_CMD@
+COMPACT_LATEX = @DOXYGEN_COMPACT_LATEX@
+PAPER_TYPE = @DOXYGEN_PAPER_TYPE@
+EXTRA_PACKAGES = @DOXYGEN_EXTRA_PACKAGES@
+LATEX_HEADER = @DOXYGEN_LATEX_HEADER@
+LATEX_FOOTER = @DOXYGEN_LATEX_FOOTER@
+LATEX_EXTRA_STYLESHEET = @DOXYGEN_LATEX_EXTRA_STYLESHEET@
+LATEX_EXTRA_FILES = @DOXYGEN_LATEX_EXTRA_FILES@
+PDF_HYPERLINKS = @DOXYGEN_PDF_HYPERLINKS@
+USE_PDFLATEX = @DOXYGEN_USE_PDFLATEX@
+LATEX_BATCHMODE = @DOXYGEN_LATEX_BATCHMODE@
+LATEX_HIDE_INDICES = @DOXYGEN_LATEX_HIDE_INDICES@
+LATEX_SOURCE_CODE = @DOXYGEN_LATEX_SOURCE_CODE@
+LATEX_BIB_STYLE = @DOXYGEN_LATEX_BIB_STYLE@
+LATEX_TIMESTAMP = @DOXYGEN_LATEX_TIMESTAMP@
+LATEX_EMOJI_DIRECTORY = @DOXYGEN_LATEX_EMOJI_DIRECTORY@
+GENERATE_RTF = @DOXYGEN_GENERATE_RTF@
+RTF_OUTPUT = @DOXYGEN_RTF_OUTPUT@
+COMPACT_RTF = @DOXYGEN_COMPACT_RTF@
+RTF_HYPERLINKS = @DOXYGEN_RTF_HYPERLINKS@
+RTF_STYLESHEET_FILE = @DOXYGEN_RTF_STYLESHEET_FILE@
+RTF_EXTENSIONS_FILE = @DOXYGEN_RTF_EXTENSIONS_FILE@
+RTF_SOURCE_CODE = @DOXYGEN_RTF_SOURCE_CODE@
+GENERATE_MAN = @DOXYGEN_GENERATE_MAN@
+MAN_OUTPUT = @DOXYGEN_MAN_OUTPUT@
+MAN_EXTENSION = @DOXYGEN_MAN_EXTENSION@
+MAN_SUBDIR = @DOXYGEN_MAN_SUBDIR@
+MAN_LINKS = @DOXYGEN_MAN_LINKS@
+GENERATE_XML = @DOXYGEN_GENERATE_XML@
+XML_OUTPUT = @DOXYGEN_XML_OUTPUT@
+XML_PROGRAMLISTING = @DOXYGEN_XML_PROGRAMLISTING@
+XML_NS_MEMB_FILE_SCOPE = @DOXYGEN_XML_NS_MEMB_FILE_SCOPE@
+GENERATE_DOCBOOK = @DOXYGEN_GENERATE_DOCBOOK@
+DOCBOOK_OUTPUT = @DOXYGEN_DOCBOOK_OUTPUT@
+DOCBOOK_PROGRAMLISTING = @DOXYGEN_DOCBOOK_PROGRAMLISTING@
+GENERATE_AUTOGEN_DEF = @DOXYGEN_GENERATE_AUTOGEN_DEF@
+GENERATE_PERLMOD = @DOXYGEN_GENERATE_PERLMOD@
+PERLMOD_LATEX = @DOXYGEN_PERLMOD_LATEX@
+PERLMOD_PRETTY = @DOXYGEN_PERLMOD_PRETTY@
+PERLMOD_MAKEVAR_PREFIX = @DOXYGEN_PERLMOD_MAKEVAR_PREFIX@
+ENABLE_PREPROCESSING = @DOXYGEN_ENABLE_PREPROCESSING@
+MACRO_EXPANSION = @DOXYGEN_MACRO_EXPANSION@
+EXPAND_ONLY_PREDEF = @DOXYGEN_EXPAND_ONLY_PREDEF@
+SEARCH_INCLUDES = @DOXYGEN_SEARCH_INCLUDES@
+INCLUDE_PATH = @DOXYGEN_INCLUDE_PATH@
+INCLUDE_FILE_PATTERNS = @DOXYGEN_INCLUDE_FILE_PATTERNS@
+PREDEFINED = @DOXYGEN_PREDEFINED@
+EXPAND_AS_DEFINED = @DOXYGEN_EXPAND_AS_DEFINED@
+SKIP_FUNCTION_MACROS = @DOXYGEN_SKIP_FUNCTION_MACROS@
+TAGFILES = @DOXYGEN_TAGFILES@
+GENERATE_TAGFILE = @DOXYGEN_GENERATE_TAGFILE@
+ALLEXTERNALS = @DOXYGEN_ALLEXTERNALS@
+EXTERNAL_GROUPS = @DOXYGEN_EXTERNAL_GROUPS@
+EXTERNAL_PAGES = @DOXYGEN_EXTERNAL_PAGES@
+CLASS_DIAGRAMS = @DOXYGEN_CLASS_DIAGRAMS@
+DIA_PATH = @DOXYGEN_DIA_PATH@
+HIDE_UNDOC_RELATIONS = @DOXYGEN_HIDE_UNDOC_RELATIONS@
+HAVE_DOT = @DOXYGEN_HAVE_DOT@
+DOT_NUM_THREADS = @DOXYGEN_DOT_NUM_THREADS@
+DOT_FONTNAME = @DOXYGEN_DOT_FONTNAME@
+DOT_FONTSIZE = @DOXYGEN_DOT_FONTSIZE@
+DOT_FONTPATH = @DOXYGEN_DOT_FONTPATH@
+CLASS_GRAPH = @DOXYGEN_CLASS_GRAPH@
+COLLABORATION_GRAPH = @DOXYGEN_COLLABORATION_GRAPH@
+GROUP_GRAPHS = @DOXYGEN_GROUP_GRAPHS@
+UML_LOOK = @DOXYGEN_UML_LOOK@
+UML_LIMIT_NUM_FIELDS = @DOXYGEN_UML_LIMIT_NUM_FIELDS@
+TEMPLATE_RELATIONS = @DOXYGEN_TEMPLATE_RELATIONS@
+INCLUDE_GRAPH = @DOXYGEN_INCLUDE_GRAPH@
+INCLUDED_BY_GRAPH = @DOXYGEN_INCLUDED_BY_GRAPH@
+CALL_GRAPH = @DOXYGEN_CALL_GRAPH@
+CALLER_GRAPH = @DOXYGEN_CALLER_GRAPH@
+GRAPHICAL_HIERARCHY = @DOXYGEN_GRAPHICAL_HIERARCHY@
+DIRECTORY_GRAPH = @DOXYGEN_DIRECTORY_GRAPH@
+DOT_IMAGE_FORMAT = @DOXYGEN_DOT_IMAGE_FORMAT@
+INTERACTIVE_SVG = @DOXYGEN_INTERACTIVE_SVG@
+DOT_PATH = @DOXYGEN_DOT_PATH@
+DOTFILE_DIRS = @DOXYGEN_DOTFILE_DIRS@
+MSCFILE_DIRS = @DOXYGEN_MSCFILE_DIRS@
+DIAFILE_DIRS = @DOXYGEN_DIAFILE_DIRS@
+PLANTUML_JAR_PATH = @DOXYGEN_PLANTUML_JAR_PATH@
+PLANTUML_CFG_FILE = @DOXYGEN_PLANTUML_CFG_FILE@
+PLANTUML_INCLUDE_PATH = @DOXYGEN_PLANTUML_INCLUDE_PATH@
+DOT_GRAPH_MAX_NODES = @DOXYGEN_DOT_GRAPH_MAX_NODES@
+MAX_DOT_GRAPH_DEPTH = @DOXYGEN_MAX_DOT_GRAPH_DEPTH@
+DOT_TRANSPARENT = @DOXYGEN_DOT_TRANSPARENT@
+DOT_MULTI_TARGETS = @DOXYGEN_DOT_MULTI_TARGETS@
+GENERATE_LEGEND = @DOXYGEN_GENERATE_LEGEND@
+DOT_CLEANUP = @DOXYGEN_DOT_CLEANUP@
diff --git a/Doxyfile b/Doxyfile
index 75931ef9..18bb33e2 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8
# title of most generated pages and in a few other places.
# The default value is: My Project.
-PROJECT_NAME = "Graphene"
+PROJECT_NAME = "Peerplays"
# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
# could be handy for archiving the generated documentation or if some version
diff --git a/libraries/app/CMakeLists.txt b/libraries/app/CMakeLists.txt
index e6f8940c..ea0a2c07 100644
--- a/libraries/app/CMakeLists.txt
+++ b/libraries/app/CMakeLists.txt
@@ -5,7 +5,6 @@ add_library( graphene_app
api.cpp
application.cpp
database_api.cpp
- impacted.cpp
plugin.cpp
config_util.cpp
${HEADERS}
@@ -14,7 +13,8 @@ add_library( graphene_app
# need to link graphene_debug_witness because plugins aren't sufficiently isolated #246
#target_link_libraries( graphene_app graphene_market_history graphene_account_history graphene_chain fc graphene_db graphene_net graphene_utilities graphene_debug_witness )
-target_link_libraries( graphene_app graphene_market_history graphene_account_history graphene_accounts_list graphene_affiliate_stats graphene_chain fc graphene_db graphene_net graphene_time graphene_utilities graphene_debug_witness graphene_bookie peerplays_sidechain )
+target_link_libraries( graphene_app graphene_market_history graphene_account_history graphene_accounts_list graphene_affiliate_stats graphene_chain fc graphene_db graphene_net graphene_time graphene_utilities graphene_debug_witness graphene_bookie peerplays_sidechain graphene_elasticsearch)
+
target_include_directories( graphene_app
PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include"
"${CMAKE_CURRENT_SOURCE_DIR}/../egenesis/include" )
diff --git a/libraries/app/api.cpp b/libraries/app/api.cpp
index d31abe19..11d39f69 100644
--- a/libraries/app/api.cpp
+++ b/libraries/app/api.cpp
@@ -26,7 +26,6 @@
#include
#include
#include
-#include
#include
#include
#include
@@ -40,8 +39,19 @@
#include
#include
+#include
#include
+template class fc::api;
+template class fc::api;
+template class fc::api;
+template class fc::api;
+template class fc::api;
+template class fc::api;
+template class fc::api;
+template class fc::api;
+
+
namespace graphene { namespace app {
login_api::login_api(application& a)
@@ -103,7 +113,7 @@ namespace graphene { namespace app {
}
else if( api_name == "asset_api" )
{
- _asset_api = std::make_shared< asset_api >( std::ref( *_app.chain_database() ) );
+ _asset_api = std::make_shared< asset_api >( _app );
}
else if( api_name == "debug_api" )
{
@@ -536,10 +546,12 @@ namespace graphene { namespace app {
} // end get_relevant_accounts( obj )
#endif
- vector history_api::get_fill_order_history( asset_id_type a, asset_id_type b, uint32_t limit )const
+ vector history_api::get_fill_order_history( std::string asset_a, std::string asset_b, uint32_t limit )const
{
FC_ASSERT(_app.chain_database());
const auto& db = *_app.chain_database();
+ asset_id_type a = database_api.get_asset_id_from_string( asset_a );
+ asset_id_type b = database_api.get_asset_id_from_string( asset_b );
if( a > b ) std::swap(a,b);
const auto& history_idx = db.get_index_type().indices().get();
history_key hkey;
@@ -561,7 +573,7 @@ namespace graphene { namespace app {
return result;
}
- vector history_api::get_account_history( account_id_type account,
+ vector history_api::get_account_history( const std::string account_id_or_name,
operation_history_id_type stop,
unsigned limit,
operation_history_id_type start ) const
@@ -570,12 +582,26 @@ namespace graphene { namespace app {
const auto& db = *_app.chain_database();
FC_ASSERT( limit <= 100 );
vector result;
+ account_id_type account;
try {
+ account = database_api.get_account_id_from_string(account_id_or_name);
const account_transaction_history_object& node = account(db).statistics(db).most_recent_op(db);
if(start == operation_history_id_type() || start.instance.value > node.operation_id.instance.value)
start = node.operation_id;
} catch(...) { return result; }
+ if(_app.is_plugin_enabled("elasticsearch")) {
+ auto es = _app.get_plugin("elasticsearch");
+ if(es.get()->get_running_mode() != elasticsearch::mode::only_save) {
+ if(!_app.elasticsearch_thread)
+ _app.elasticsearch_thread= std::make_shared("elasticsearch");
+
+ return _app.elasticsearch_thread->async([&es, &account, &stop, &limit, &start]() {
+ return es->get_account_history(account, stop, limit, start);
+ }, "thread invoke for method " BOOST_PP_STRINGIZE(method_name)).wait();
+ }
+ }
+
const auto& hist_idx = db.get_index_type();
const auto& by_op_idx = hist_idx.indices().get();
auto index_start = by_op_idx.begin();
@@ -594,7 +620,7 @@ namespace graphene { namespace app {
return result;
}
- vector history_api::get_account_history_operations( account_id_type account,
+ vector history_api::get_account_history_operations( const std::string account_id_or_name,
int operation_id,
operation_history_id_type start,
operation_history_id_type stop,
@@ -604,6 +630,11 @@ namespace graphene { namespace app {
const auto& db = *_app.chain_database();
FC_ASSERT( limit <= 100 );
vector result;
+ account_id_type account;
+ try {
+ account = database_api.get_account_id_from_string(account_id_or_name);
+ } catch (...) { return result; }
+
const auto& stats = account(db).statistics(db);
if( stats.most_recent_op == account_transaction_history_id_type() ) return result;
const account_transaction_history_object* node = &stats.most_recent_op(db);
@@ -630,7 +661,7 @@ namespace graphene { namespace app {
}
- vector history_api::get_relative_account_history( account_id_type account,
+ vector history_api::get_relative_account_history( const std::string account_id_or_name,
uint32_t stop,
unsigned limit,
uint32_t start) const
@@ -639,6 +670,10 @@ namespace graphene { namespace app {
const auto& db = *_app.chain_database();
FC_ASSERT(limit <= 100);
vector result;
+ account_id_type account;
+ try {
+ account = database_api.get_account_id_from_string(account_id_or_name);
+ } catch(...) { return result; }
const auto& stats = account(db).statistics(db);
if( start == 0 )
start = stats.total_ops;
@@ -678,11 +713,13 @@ namespace graphene { namespace app {
return hist->tracked_buckets();
}
- vector history_api::get_market_history( asset_id_type a, asset_id_type b,
+ vector history_api::get_market_history( std::string asset_a, std::string asset_b,
uint32_t bucket_seconds, fc::time_point_sec start, fc::time_point_sec end )const
{ try {
FC_ASSERT(_app.chain_database());
const auto& db = *_app.chain_database();
+ asset_id_type a = database_api.get_asset_id_from_string( asset_a );
+ asset_id_type b = database_api.get_asset_id_from_string( asset_b );
vector result;
result.reserve(200);
@@ -702,7 +739,7 @@ namespace graphene { namespace app {
++itr;
}
return result;
- } FC_CAPTURE_AND_RETHROW( (a)(b)(bucket_seconds)(start)(end) ) }
+ } FC_CAPTURE_AND_RETHROW( (asset_a)(asset_b)(bucket_seconds)(start)(end) ) }
crypto_api::crypto_api(){};
@@ -761,12 +798,16 @@ namespace graphene { namespace app {
}
// asset_api
- asset_api::asset_api(graphene::chain::database& db) : _db(db) { }
+ asset_api::asset_api(graphene::app::application& app) :
+ _app(app),
+ _db( *app.chain_database()),
+ database_api( std::ref(*app.chain_database())) { }
asset_api::~asset_api() { }
- vector asset_api::get_asset_holders( asset_id_type asset_id, uint32_t start, uint32_t limit ) const {
+ vector asset_api::get_asset_holders( std::string asset, uint32_t start, uint32_t limit ) const {
FC_ASSERT(limit <= 100);
+ asset_id_type asset_id = database_api.get_asset_id_from_string( asset );
const auto& bal_idx = _db.get_index_type< account_balance_index >().indices().get< by_asset_balance >();
auto range = bal_idx.equal_range( boost::make_tuple( asset_id ) );
@@ -797,11 +838,11 @@ namespace graphene { namespace app {
return result;
}
// get number of asset holders.
- int asset_api::get_asset_holders_count( asset_id_type asset_id ) const {
+ int asset_api::get_asset_holders_count( std::string asset ) const {
const auto& bal_idx = _db.get_index_type< account_balance_index >().indices().get< by_asset_balance >();
+ asset_id_type asset_id = database_api.get_asset_id_from_string( asset );
auto range = bal_idx.equal_range( boost::make_tuple( asset_id ) );
-
int count = boost::distance(range) - 1;
return count;
diff --git a/libraries/app/application.cpp b/libraries/app/application.cpp
index 0f0c0690..adfd8402 100644
--- a/libraries/app/application.cpp
+++ b/libraries/app/application.cpp
@@ -226,7 +226,7 @@ namespace detail {
void new_connection( const fc::http::websocket_connection_ptr& c )
{
- auto wsc = std::make_shared(c, GRAPHENE_MAX_NESTED_OBJECTS);
+ auto wsc = std::make_shared(*c, GRAPHENE_MAX_NESTED_OBJECTS);
auto login = std::make_shared( std::ref(*_self) );
login->enable_api("database_api");
@@ -375,6 +375,11 @@ namespace detail {
}
_chain_db->add_checkpoints( loaded_checkpoints );
+ if( _options->count("enable-standby-votes-tracking") )
+ {
+ _chain_db->enable_standby_votes_tracking( _options->at("enable-standby-votes-tracking").as() );
+ }
+
bool replay = false;
std::string replay_reason = "reason not provided";
@@ -926,6 +931,10 @@ void application::set_program_options(boost::program_options::options_descriptio
("genesis-json", bpo::value(), "File to read Genesis State from")
("dbg-init-key", bpo::value(), "Block signing key to use for init witnesses, overrides genesis file")
("api-access", bpo::value(), "JSON file specifying API permissions")
+ ("enable-standby-votes-tracking", bpo::value()->implicit_value(true),
+ "Whether to enable tracking of votes of standby witnesses and committee members. "
+ "Set it to true to provide accurate data to API clients, set to false for slightly better performance.")
+ ("plugins", bpo::value(), "Space-separated list of plugins to activate")
;
command_line_options.add(configuration_file_options);
command_line_options.add_options()
@@ -982,9 +991,20 @@ void application::initialize(const fc::path& data_dir, const boost::program_opti
wanted.push_back("witness");
wanted.push_back("account_history");
wanted.push_back("market_history");
+ wanted.push_back("bookie");
}
+ int es_ah_conflict_counter = 0;
for (auto& it : wanted)
{
+ if(it == "account_history")
+ ++es_ah_conflict_counter;
+ if(it == "elasticsearch")
+ ++es_ah_conflict_counter;
+
+ if(es_ah_conflict_counter > 1) {
+ elog("Can't start program with elasticsearch and account_history plugin at the same time");
+ std::exit(EXIT_FAILURE);
+ }
if (!it.empty()) enable_plugin(it);
}
}
@@ -1009,9 +1029,7 @@ std::shared_ptr application::get_plugin(const string& name) con
bool application::is_plugin_enabled(const string& name) const
{
- if(my->_active_plugins.find(name) == my->_active_plugins.end())
- return false;
- return true;
+ return !(my->_active_plugins.find(name) == my->_active_plugins.end());
}
net::node_ptr application::p2p_node()
@@ -1051,7 +1069,8 @@ void graphene::app::application::enable_plugin(const string& name)
my->_active_plugins[name]->plugin_set_app(this);
}
-void graphene::app::application::add_available_plugin(std::shared_ptr p) {
+void graphene::app::application::add_available_plugin(std::shared_ptr p)
+{
my->_available_plugins[p->plugin_name()] = p;
}
diff --git a/libraries/app/database_api.cpp b/libraries/app/database_api.cpp
index c6c8a952..c9aba7ff 100644
--- a/libraries/app/database_api.cpp
+++ b/libraries/app/database_api.cpp
@@ -26,11 +26,15 @@
#include
#include
#include
+#include
+#include
#include
#include
#include
+#include
+#include
#include
#include
@@ -45,6 +49,8 @@
typedef std::map< std::pair, std::vector > market_queue_type;
+template class fc::api;
+
namespace graphene { namespace app {
class database_api_impl : public std::enable_shared_from_this
@@ -81,23 +87,26 @@ class database_api_impl : public std::enable_shared_from_this
bool is_public_key_registered(string public_key) const;
// Accounts
- vector> get_accounts(const vector& account_ids)const;
+ account_id_type get_account_id_from_string(const std::string& name_or_id)const;
+ vector> get_accounts(const vector& account_names_or_ids)const;
std::map get_full_accounts( const vector& names_or_ids, bool subscribe );
optional get_account_by_name( string name )const;
- vector get_account_references( account_id_type account_id )const;
+ vector get_account_references( const std::string account_id_or_name )const;
vector> lookup_account_names(const vector& account_names)const;
map lookup_accounts(const string& lower_bound_name, uint32_t limit)const;
uint64_t get_account_count()const;
// Balances
- vector get_account_balances(account_id_type id, const flat_set& assets)const;
- vector get_named_account_balances(const std::string& name, const flat_set& assets)const;
+ vector get_account_balances(const std::string& account_name_or_id, const flat_set& assets)const;
vector get_balance_objects( const vector& addrs )const;
vector get_vested_balances( const vector& objs )const;
- vector get_vesting_balances( account_id_type account_id )const;
+ vector get_vesting_balances( const std::string account_id_or_name )const;
// Assets
- vector> get_assets(const vector& asset_ids)const;
+ asset_id_type get_asset_id_from_string(const std::string& symbol_or_id)const;
+ vector> get_assets(const vector& asset_symbols_or_ids)const;
+ // helper function
+ vector> get_assets( const vector& asset_ids )const;
vector list_assets(const string& lower_bound_symbol, uint32_t limit)const;
vector> lookup_asset_symbols(const vector& symbols_or_ids)const;
uint64_t get_asset_count()const;
@@ -124,12 +133,13 @@ class database_api_impl : public std::enable_shared_from_this
asset get_sweeps_vesting_balance_available_for_claim( account_id_type account )const;
// Markets / feeds
- vector get_limit_orders(asset_id_type a, asset_id_type b, uint32_t limit)const;
- vector get_call_orders(asset_id_type a, uint32_t limit)const;
- vector get_settle_orders(asset_id_type a, uint32_t limit)const;
- vector get_margin_positions( const account_id_type& id )const;
- void subscribe_to_market(std::function callback, asset_id_type a, asset_id_type b);
- void unsubscribe_from_market(asset_id_type a, asset_id_type b);
+ vector get_limit_orders( const asset_id_type a, const asset_id_type b, const uint32_t limit )const;
+ vector get_limit_orders( const std::string& a, const std::string& b, const uint32_t limit)const;
+ vector get_call_orders(const std::string& a, uint32_t limit)const;
+ vector get_settle_orders(const std::string& a, uint32_t limit)const;
+ vector get_margin_positions( const std::string account_id_or_name )const;
+ void subscribe_to_market(std::function callback, const std::string& a, const std::string& b);
+ void unsubscribe_from_market(const std::string& a, const std::string& b);
market_ticker get_ticker( const string& base, const string& quote )const;
market_volume get_24_volume( const string& base, const string& quote )const;
order_book get_order_book( const string& base, const string& quote, unsigned limit = 50 )const;
@@ -137,13 +147,13 @@ class database_api_impl : public std::enable_shared_from_this
// Witnesses
vector> get_witnesses(const vector& witness_ids)const;
- fc::optional get_witness_by_account(account_id_type account)const;
+ fc::optional get_witness_by_account(const std::string account_id_or_name)const;
map lookup_witness_accounts(const string& lower_bound_name, uint32_t limit)const;
uint64_t get_witness_count()const;
// Committee members
vector> get_committee_members(const vector& committee_member_ids)const;
- fc::optional get_committee_member_by_account(account_id_type account)const;
+ fc::optional get_committee_member_by_account(const std::string account_id_or_name)const;
map lookup_committee_member_accounts(const string& lower_bound_name, uint32_t limit)const;
// SON members
@@ -175,10 +185,10 @@ class database_api_impl : public std::enable_shared_from_this
bool verify_authority( const signed_transaction& trx )const;
bool verify_account_authority( const string& name_or_id, const flat_set& signers )const;
processed_transaction validate_transaction( const signed_transaction& trx )const;
- vector< fc::variant > get_required_fees( const vector& ops, asset_id_type id )const;
+ vector< fc::variant > get_required_fees( const vector& ops, const std::string& asset_id_or_symbol )const;
// Proposed transactions
- vector get_proposed_transactions( account_id_type id )const;
+ vector get_proposed_transactions( const std::string account_id_or_name )const;
// Blinded balances
vector get_blinded_balances( const flat_set& commitments )const;
@@ -189,8 +199,14 @@ class database_api_impl : public std::enable_shared_from_this
vector get_tournaments_by_state(tournament_id_type stop, unsigned limit, tournament_id_type start, tournament_state state);
vector get_registered_tournaments(account_id_type account_filter, uint32_t limit) const;
+ // gpos
+ gpos_info get_gpos_info(const account_id_type account) const;
//private:
+ const account_object* get_account_from_string( const std::string& name_or_id,
+ bool throw_if_not_found = true ) const;
+ const asset_object* get_asset_from_string( const std::string& symbol_or_id,
+ bool throw_if_not_found = true ) const;
template
void subscribe_to_item( const T& i )const
{
@@ -630,22 +646,27 @@ bool database_api_impl::is_public_key_registered(string public_key) const
// //
//////////////////////////////////////////////////////////////////////
-vector> database_api::get_accounts(const vector& account_ids)const
+account_id_type database_api::get_account_id_from_string(const std::string& name_or_id)const
{
- return my->get_accounts( account_ids );
+ return my->get_account_from_string( name_or_id )->id;
}
-vector> database_api_impl::get_accounts(const vector& account_ids)const
+vector> database_api::get_accounts(const vector& account_names_or_ids)const
{
- vector> result; result.reserve(account_ids.size());
- std::transform(account_ids.begin(), account_ids.end(), std::back_inserter(result),
- [this](account_id_type id) -> optional {
- if(auto o = _db.find(id))
- {
- subscribe_to_item( id );
- return *o;
- }
- return {};
+ return my->get_accounts( account_names_or_ids );
+}
+
+vector> database_api_impl::get_accounts(const vector& account_names_or_ids)const
+{
+ vector> result; result.reserve(account_names_or_ids.size());
+ std::transform(account_names_or_ids.begin(), account_names_or_ids.end(), std::back_inserter(result),
+ [this](std::string id_or_name) -> optional {
+ const account_object *account = get_account_from_string(id_or_name, false);
+ if(account == nullptr)
+ return {};
+
+ subscribe_to_item( account->id );
+ return *account;
});
return result;
}
@@ -774,16 +795,17 @@ optional database_api_impl::get_account_by_name( string name )co
return optional();
}
-vector database_api::get_account_references( account_id_type account_id )const
+vector database_api::get_account_references( const std::string account_id_or_name )const
{
- return my->get_account_references( account_id );
+ return my->get_account_references( account_id_or_name );
}
-vector database_api_impl::get_account_references( account_id_type account_id )const
+vector database_api_impl::get_account_references( const std::string account_id_or_name )const
{
const auto& idx = _db.get_index_type();
const auto& aidx = dynamic_cast(idx);
const auto& refs = aidx.get_secondary_index();
+ const account_id_type account_id = get_account_from_string(account_id_or_name)->id;
auto itr = refs.account_to_account_memberships.find(account_id);
vector result;
@@ -852,13 +874,16 @@ uint64_t database_api_impl::get_account_count()const
// //
//////////////////////////////////////////////////////////////////////
-vector database_api::get_account_balances(account_id_type id, const flat_set& assets)const
+vector database_api::get_account_balances(const std::string& account_name_or_id, const flat_set& assets)const
{
- return my->get_account_balances( id, assets );
+ return my->get_account_balances( account_name_or_id, assets );
}
-vector database_api_impl::get_account_balances(account_id_type acnt, const flat_set& assets)const
+vector database_api_impl::get_account_balances( const std::string& account_name_or_id,
+ const flat_set& assets)const
{
+ const account_object* account = get_account_from_string(account_name_or_id);
+ account_id_type acnt = account->id;
vector result;
if (assets.empty())
{
@@ -881,15 +906,7 @@ vector database_api_impl::get_account_balances(account_id_type acnt, cons
vector database_api::get_named_account_balances(const std::string& name, const flat_set& assets)const
{
- return my->get_named_account_balances( name, assets );
-}
-
-vector database_api_impl::get_named_account_balances(const std::string& name, const flat_set& assets) const
-{
- const auto& accounts_by_name = _db.get_index_type().indices().get();
- auto itr = accounts_by_name.find(name);
- FC_ASSERT( itr != accounts_by_name.end() );
- return get_account_balances(itr->get_id(), assets);
+ return my->get_account_balances( name, assets );
}
vector database_api::get_balance_objects( const vector& addrs )const
@@ -939,24 +956,26 @@ vector database_api_impl::get_vested_balances( const vector database_api::get_vesting_balances( account_id_type account_id )const
+vector database_api::get_vesting_balances( const std::string account_id_or_name )const
{
- return my->get_vesting_balances( account_id );
+ return my->get_vesting_balances( account_id_or_name );
}
-vector database_api_impl::get_vesting_balances( account_id_type account_id )const
+vector database_api_impl::get_vesting_balances( const std::string account_id_or_name )const
{
try
{
+ const account_id_type account_id = get_account_from_string(account_id_or_name)->id;
vector result;
auto vesting_range = _db.get_index_type().indices().get().equal_range(account_id);
std::for_each(vesting_range.first, vesting_range.second,
[&result](const vesting_balance_object& balance) {
- result.emplace_back(balance);
+ if(balance.balance.amount > 0)
+ result.emplace_back(balance);
});
return result;
}
- FC_CAPTURE_AND_RETHROW( (account_id) );
+ FC_CAPTURE_AND_RETHROW( (account_id_or_name) );
}
//////////////////////////////////////////////////////////////////////
@@ -965,9 +984,48 @@ vector database_api_impl::get_vesting_balances( account_
// //
//////////////////////////////////////////////////////////////////////
-vector> database_api::get_assets(const vector& asset_ids)const
+asset_id_type database_api::get_asset_id_from_string(const std::string& symbol_or_id)const
{
- return my->get_assets( asset_ids );
+ return my->get_asset_from_string( symbol_or_id )->id;
+}
+
+const asset_object* database_api_impl::get_asset_from_string( const std::string& symbol_or_id,
+ bool throw_if_not_found ) const
+{
+ // TODO cache the result to avoid repeatly fetching from db
+ FC_ASSERT( symbol_or_id.size() > 0);
+ const asset_object* asset = nullptr;
+ if (std::isdigit(symbol_or_id[0]))
+ asset = _db.find(fc::variant(symbol_or_id, 1).as(1));
+ else
+ {
+ const auto& idx = _db.get_index_type().indices().get();
+ auto itr = idx.find(symbol_or_id);
+ if (itr != idx.end())
+ asset = &*itr;
+ }
+ if(throw_if_not_found)
+ FC_ASSERT( asset, "no such asset" );
+ return asset;
+}
+
+vector> database_api::get_assets(const vector& asset_symbols_or_ids)const
+{
+ return my->get_assets( asset_symbols_or_ids );
+}
+
+vector> database_api_impl::get_assets(const vector& asset_symbols_or_ids)const
+{
+ vector> result; result.reserve(asset_symbols_or_ids.size());
+ std::transform(asset_symbols_or_ids.begin(), asset_symbols_or_ids.end(), std::back_inserter(result),
+ [this](std::string id_or_name) -> optional {
+ const asset_object* asset_obj = get_asset_from_string( id_or_name, false );
+ if( asset_obj == nullptr )
+ return {};
+ subscribe_to_item(asset_obj->id );
+ return asset_object( *asset_obj );
+ });
+ return result;
}
vector> database_api_impl::get_assets(const vector& asset_ids)const
@@ -1223,7 +1281,7 @@ vector database_api_impl::get_all_unmatched_bets_for_bettor(account_
// //
//////////////////////////////////////////////////////////////////////
-vector database_api::get_limit_orders(asset_id_type a, asset_id_type b, uint32_t limit)const
+vector database_api::get_limit_orders(const std::string& a, const std::string& b, const uint32_t limit)const
{
return my->get_limit_orders( a, b, limit );
}
@@ -1231,12 +1289,22 @@ vector database_api::get_limit_orders(asset_id_type a, asset
/**
* @return the limit orders for both sides of the book for the two assets specified up to limit number on each side.
*/
-vector database_api_impl::get_limit_orders(asset_id_type a, asset_id_type b, uint32_t limit)const
+vector database_api_impl::get_limit_orders(const std::string& a, const std::string& b, const uint32_t limit)const
+{
+ const asset_id_type asset_a_id = get_asset_from_string(a)->id;
+ const asset_id_type asset_b_id = get_asset_from_string(b)->id;
+
+ return get_limit_orders(asset_a_id, asset_b_id, limit);
+}
+
+vector database_api_impl::get_limit_orders( const asset_id_type a, const asset_id_type b,
+ const uint32_t limit )const
{
const auto& limit_order_idx = _db.get_index_type();
const auto& limit_price_idx = limit_order_idx.indices().get();
vector result;
+ result.reserve(limit*2);
uint32_t count = 0;
auto limit_itr = limit_price_idx.lower_bound(price::max(a,b));
@@ -1260,45 +1328,46 @@ vector database_api_impl::get_limit_orders(asset_id_type a,
return result;
}
-vector database_api::get_call_orders(asset_id_type a, uint32_t limit)const
+vector database_api::get_call_orders(const std::string& a, uint32_t limit)const
{
return my->get_call_orders( a, limit );
}
-vector database_api_impl::get_call_orders(asset_id_type a, uint32_t limit)const
+vector database_api_impl::get_call_orders(const std::string& a, uint32_t limit)const
{
const auto& call_index = _db.get_index_type().indices().get();
- const asset_object& mia = _db.get(a);
- price index_price = price::min(mia.bitasset_data(_db).options.short_backing_asset, mia.get_id());
+ const asset_object* mia = get_asset_from_string(a);
+ price index_price = price::min(mia->bitasset_data(_db).options.short_backing_asset, mia->get_id());
return vector(call_index.lower_bound(index_price.min()),
call_index.lower_bound(index_price.max()));
}
-vector database_api::get_settle_orders(asset_id_type a, uint32_t limit)const
+vector database_api::get_settle_orders(const std::string& a, uint32_t limit)const
{
return my->get_settle_orders( a, limit );
}
-vector database_api_impl::get_settle_orders(asset_id_type a, uint32_t limit)const
+vector database_api_impl::get_settle_orders(const std::string& a, uint32_t limit)const
{
const auto& settle_index = _db.get_index_type().indices().get();
- const asset_object& mia = _db.get(a);
- return vector(settle_index.lower_bound(mia.get_id()),
- settle_index.upper_bound(mia.get_id()));
+ const asset_object* mia = get_asset_from_string(a);
+ return vector(settle_index.lower_bound(mia->get_id()),
+ settle_index.upper_bound(mia->get_id()));
}
-vector database_api::get_margin_positions( const account_id_type& id )const
+vector database_api::get_margin_positions( const std::string account_id_or_name )const
{
- return my->get_margin_positions( id );
+ return my->get_margin_positions( account_id_or_name );
}
-vector database_api_impl::get_margin_positions( const account_id_type& id )const
+vector database_api_impl::get_margin_positions( const std::string account_id_or_name )const
{
try
{
const auto& idx = _db.get_index_type();
const auto& aidx = idx.indices().get();
+ const account_id_type id = get_account_from_string(account_id_or_name)->id;
auto start = aidx.lower_bound( boost::make_tuple( id, asset_id_type(0) ) );
auto end = aidx.lower_bound( boost::make_tuple( id+1, asset_id_type(0) ) );
vector result;
@@ -1308,31 +1377,37 @@ vector database_api_impl::get_margin_positions( const account
++start;
}
return result;
- } FC_CAPTURE_AND_RETHROW( (id) )
+ } FC_CAPTURE_AND_RETHROW( (account_id_or_name) )
}
-void database_api::subscribe_to_market(std::function callback, asset_id_type a, asset_id_type b)
+void database_api::subscribe_to_market(std::function callback, const std::string& a, const std::string& b)
{
my->subscribe_to_market( callback, a, b );
}
-void database_api_impl::subscribe_to_market(std::function callback, asset_id_type a, asset_id_type b)
+void database_api_impl::subscribe_to_market(std::function callback, const std::string& a, const std::string& b)
{
- if(a > b) std::swap(a,b);
- FC_ASSERT(a != b);
- _market_subscriptions[ std::make_pair(a,b) ] = callback;
+ auto asset_a_id = get_asset_from_string(a)->id;
+ auto asset_b_id = get_asset_from_string(b)->id;
+
+ if(asset_a_id > asset_b_id) std::swap(asset_a_id,asset_b_id);
+ FC_ASSERT(asset_a_id != asset_b_id);
+ _market_subscriptions[ std::make_pair(asset_a_id,asset_b_id) ] = callback;
}
-void database_api::unsubscribe_from_market(asset_id_type a, asset_id_type b)
+void database_api::unsubscribe_from_market(const std::string& a, const std::string& b)
{
my->unsubscribe_from_market( a, b );
}
-void database_api_impl::unsubscribe_from_market(asset_id_type a, asset_id_type b)
+void database_api_impl::unsubscribe_from_market(const std::string& a, const std::string& b)
{
- if(a > b) std::swap(a,b);
- FC_ASSERT(a != b);
- _market_subscriptions.erase(std::make_pair(a,b));
+ auto asset_a_id = get_asset_from_string(a)->id;
+ auto asset_b_id = get_asset_from_string(b)->id;
+
+ if(asset_a_id > asset_b_id) std::swap(asset_a_id,asset_b_id);
+ FC_ASSERT(asset_a_id != asset_b_id);
+ _market_subscriptions.erase(std::make_pair(asset_a_id,asset_b_id));
}
market_ticker database_api::get_ticker( const string& base, const string& quote )const
@@ -1555,9 +1630,10 @@ vector> database_api::get_witnesses(const vectorget_witnesses( witness_ids );
}
-vector database_api::get_workers_by_account(account_id_type account)const
+vector database_api::get_workers_by_account(const std::string account_id_or_name)const
{
const auto& idx = my->_db.get_index_type().indices().get();
+ const account_id_type account = my->get_account_from_string(account_id_or_name)->id;
auto itr = idx.find(account);
vector result;
@@ -1583,14 +1659,15 @@ vector> database_api_impl::get_witnesses(const vector database_api::get_witness_by_account(account_id_type account)const
+fc::optional database_api::get_witness_by_account(const std::string account_id_or_name)const
{
- return my->get_witness_by_account( account );
+ return my->get_witness_by_account( account_id_or_name );
}
-fc::optional database_api_impl::get_witness_by_account(account_id_type account) const
+fc::optional database_api_impl::get_witness_by_account(const std::string account_id_or_name) const
{
const auto& idx = _db.get_index_type().indices().get();
+ const account_id_type account = get_account_from_string(account_id_or_name)->id;
auto itr = idx.find(account);
if( itr != idx.end() )
return *itr;
@@ -1658,14 +1735,15 @@ vector