amps-python-client 5.3.4.1__zip
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- amps-python-client-5.3.4.1/HISTORY +7 -0
- amps-python-client-5.3.4.1/LICENSE +157 -0
- amps-python-client-5.3.4.1/PKG-INFO +112 -0
- amps-python-client-5.3.4.1/README.md +96 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/ack-messages.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/content-messages.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/intro.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/logon.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/protocol-reference.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/publishing.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/query-delimiters.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/query-subscribe.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/removing.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/utilities.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/environment.pickle +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/doctrees/index.doctree +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/.buildinfo +4 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_images/caution.svg +25 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/ack-messages.rst.txt +32 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/content-messages.rst.txt +27 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/intro.rst.txt +43 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/logon.rst.txt +231 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/protocol-reference.rst.txt +1474 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/publishing.rst.txt +25 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/query-delimiters.rst.txt +12 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/query-subscribe.rst.txt +23 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/removing.rst.txt +6 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/utilities.rst.txt +13 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_sources/index.rst.txt +56 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/ajax-loader.gif +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/alabaster.css +699 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/basic.css +632 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/comment-bright.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/comment-close.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/comment.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/custom.css +192 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/custom.css.backup +161 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/doctools.js +287 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/down-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/down.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/file.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/flag_logo.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/flag_logo.svg +153 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/jquery-3.1.0.js +10074 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/jquery.js +4 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/minus.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/plus.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/pygments.css +74 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/searchtools.js +758 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/underscore-1.3.1.js +999 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/underscore.js +31 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/up-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/up.png +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/_static/websupport.js +808 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/ack-messages.html +417 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/content-messages.html +417 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/intro.html +126 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/logon.html +295 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/protocol-reference.html +1190 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/publishing.html +436 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/query-delimiters.html +173 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/query-subscribe.html +2123 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/removing.html +299 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/chapters/utilities.html +287 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/genindex.html +97 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/index.html +138 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/objects.inv +0 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/search.html +107 -0
- amps-python-client-5.3.4.1/docs/command-reference/html/searchindex.js +1 -0
- amps-python-client-5.3.4.1/docs/html/.buildinfo +4 -0
- amps-python-client-5.3.4.1/docs/html/_sources/code.rst.txt +6 -0
- amps-python-client-5.3.4.1/docs/html/_sources/index.rst.txt +29 -0
- amps-python-client-5.3.4.1/docs/html/_static/ajax-loader.gif +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/basic.css +632 -0
- amps-python-client-5.3.4.1/docs/html/_static/classic.css +261 -0
- amps-python-client-5.3.4.1/docs/html/_static/comment-bright.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/comment-close.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/comment.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/default.css +1 -0
- amps-python-client-5.3.4.1/docs/html/_static/doctools.js +287 -0
- amps-python-client-5.3.4.1/docs/html/_static/down-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/down.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/file.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/jquery-3.1.0.js +10074 -0
- amps-python-client-5.3.4.1/docs/html/_static/jquery.js +4 -0
- amps-python-client-5.3.4.1/docs/html/_static/minus.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/plus.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/pygments.css +74 -0
- amps-python-client-5.3.4.1/docs/html/_static/searchtools.js +758 -0
- amps-python-client-5.3.4.1/docs/html/_static/sidebar.js +159 -0
- amps-python-client-5.3.4.1/docs/html/_static/underscore-1.3.1.js +999 -0
- amps-python-client-5.3.4.1/docs/html/_static/underscore.js +31 -0
- amps-python-client-5.3.4.1/docs/html/_static/up-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/up.png +0 -0
- amps-python-client-5.3.4.1/docs/html/_static/websupport.js +808 -0
- amps-python-client-5.3.4.1/docs/html/code.html +6503 -0
- amps-python-client-5.3.4.1/docs/html/genindex.html +1361 -0
- amps-python-client-5.3.4.1/docs/html/index.html +131 -0
- amps-python-client-5.3.4.1/docs/html/objects.inv +0 -0
- amps-python-client-5.3.4.1/docs/html/py-modindex.html +111 -0
- amps-python-client-5.3.4.1/docs/html/search.html +107 -0
- amps-python-client-5.3.4.1/docs/html/searchindex.js +1 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/advanced-topics.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/cpp-compiler-list.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/cpp-feature-table.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/creating-commands.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/deltas.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/error-handling.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/exceptions.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/first-program.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/high-availability.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/installing.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/introduction.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/moving-from-python-lite.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/performance-tips.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/queues.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/sow.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/subscriptions.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/chapters/utilities.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/environment.pickle +0 -0
- amps-python-client-5.3.4.1/docs/python/doctrees/index.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python/html/.buildinfo +4 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/caution.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/caution.svg +25 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/connection_string.svg +461 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/important.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/important.svg +25 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/tip.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/tip.svg +31 -0
- amps-python-client-5.3.4.1/docs/python/html/_images/warning.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/advanced-topics.rst.txt +398 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/cpp-compiler-list.rst.txt +6 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/cpp-feature-table.rst.txt +26 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/creating-commands.rst.txt +159 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/deltas.rst.txt +79 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/error-handling.rst.txt +482 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/exceptions.rst.txt +128 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/first-program.rst.txt +142 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/high-availability.rst.txt +876 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/installing.rst.txt +184 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/introduction.rst.txt +50 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/moving-from-python-lite.rst.txt +32 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/performance-tips.rst.txt +434 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/queues.rst.txt +282 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/sow.rst.txt +292 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/subscriptions.rst.txt +374 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/utilities.rst.txt +214 -0
- amps-python-client-5.3.4.1/docs/python/html/_sources/index.rst.txt +44 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/ajax-loader.gif +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/alabaster.css +699 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/basic.css +632 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/comment-bright.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/comment-close.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/comment.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/custom.css +192 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/custom.css.backup +161 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/doctools.js +287 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/down-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/down.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/file.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/flag_logo.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/flag_logo.svg +153 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/jquery-3.1.0.js +10074 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/jquery.js +4 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/minus.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/plus.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/pygments.css +74 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/searchtools.js +758 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/underscore-1.3.1.js +999 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/underscore.js +31 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/up-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/up.png +0 -0
- amps-python-client-5.3.4.1/docs/python/html/_static/websupport.js +808 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/advanced-topics.html +447 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/cpp-compiler-list.html +92 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/cpp-feature-table.html +156 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/creating-commands.html +2837 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/deltas.html +169 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/error-handling.html +746 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/exceptions.html +272 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/first-program.html +499 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/high-availability.html +1014 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/installing.html +264 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/introduction.html +245 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/moving-from-python-lite.html +118 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/performance-tips.html +499 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/queues.html +352 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/sow.html +381 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/subscriptions.html +535 -0
- amps-python-client-5.3.4.1/docs/python/html/chapters/utilities.html +302 -0
- amps-python-client-5.3.4.1/docs/python/html/genindex.html +351 -0
- amps-python-client-5.3.4.1/docs/python/html/index.html +380 -0
- amps-python-client-5.3.4.1/docs/python/html/objects.inv +0 -0
- amps-python-client-5.3.4.1/docs/python/html/search.html +107 -0
- amps-python-client-5.3.4.1/docs/python/html/searchindex.js +1 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/chapters/crankitup.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/chapters/equipment.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/environment.pickle +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/index.doctree +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/.buildinfo +4 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_sources/chapters/crankitup.rst.txt +155 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_sources/chapters/equipment.rst.txt +19 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_sources/index.rst.txt +20 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/ajax-loader.gif +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/alabaster.css +699 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/basic.css +632 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/comment-bright.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/comment-close.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/comment.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/custom.css +192 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/custom.css.backup +161 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/doctools.js +287 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/down-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/down.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/file.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/flag_logo.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/flag_logo.svg +153 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/jquery-3.1.0.js +10074 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/jquery.js +4 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/minus.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/plus.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/pygments.css +74 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/searchtools.js +758 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/underscore-1.3.1.js +999 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/underscore.js +31 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/up-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/up.png +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/websupport.js +808 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/chapters/crankitup.html +271 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/chapters/equipment.html +105 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/genindex.html +97 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/index.html +382 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/objects.inv +0 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/search.html +107 -0
- amps-python-client-5.3.4.1/docs/python-quickstart/html/searchindex.js +1 -0
- amps-python-client-5.3.4.1/docs/resources/custom.css +9 -0
- amps-python-client-5.3.4.1/docs/resources/flag_logo.svg +153 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/acks.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/actions.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps-statistics.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps_expressions.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps_functions.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/auxiliary_modules.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/config-file-shortcuts.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/conflated_topics.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/constructing-fields.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/daemon.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/delta.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/distribution.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/enrichment.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/events.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/file_format_versions.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/glossary.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/ha.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/installing_and_starting.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/intro.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/logging.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/messageTypes.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/monitoring.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/oof.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/operation.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/pub_sub.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/queues.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/replication.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/securing.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/sow.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/sow_queries.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/spark.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/transports.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/troubleshooting.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/txlog.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/usecases.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/utilities.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/views.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/environment.pickle +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/doctrees/index.doctree +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/.buildinfo +4 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/AMPS-Queues-Intro.svg +1330 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/GeoRepl.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/HA_async_ack.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/HA_sync_ack.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/Hot-Hot-Replication.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/MessageOrdering.svg +235 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF5.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF6.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF7.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF8.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/PubSub1.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/PubSub2.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWAndSubscribeAndReplace.svg +684 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWQuery1.svg +402 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWQuery2.svg +505 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig1.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig2.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig3.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig4.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/caution.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/caution.svg +25 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/chicago_group.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/delta_original_messages.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/delta_update_message.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/important.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/important.svg +25 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/inline_view_conflation.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/paginated_subs_pub.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/paginated_subs_sub.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/queue_usage_overview.svg +627 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/replication_hub.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/replication_scenario_with_ha.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_overview_1.svg +248 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_overview_2.svg +183 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_update_sequence.svg +1 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/tip.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/tip.svg +31 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/warning.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_images/warning.svg +23 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/acks.rst.txt +232 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/actions.rst.txt +111 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps-statistics.rst.txt +358 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps_expressions.rst.txt +83 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps_functions.rst.txt +11 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/auxiliary_modules.rst.txt +86 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/config-file-shortcuts.rst.txt +9 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/conflated_topics.rst.txt +111 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/constructing-fields.rst.txt +269 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/daemon.rst.txt +232 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/delta.rst.txt +556 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/distribution.rst.txt +186 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/enrichment.rst.txt +191 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/events.rst.txt +39 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/file_format_versions.rst.txt +203 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/glossary.rst.txt +101 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/ha.rst.txt +465 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/installing_and_starting.rst.txt +23 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/intro.rst.txt +116 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/logging.rst.txt +34 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/messageTypes.rst.txt +1398 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/monitoring.rst.txt +326 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/oof.rst.txt +312 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/operation.rst.txt +27 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/pub_sub.rst.txt +49 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/queues.rst.txt +1351 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/replication.rst.txt +1228 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/securing.rst.txt +657 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/sow.rst.txt +57 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/sow_queries.rst.txt +25 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/spark.rst.txt +824 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/transports.rst.txt +291 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/troubleshooting.rst.txt +517 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/txlog.rst.txt +62 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/usecases.rst.txt +21 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/utilities.rst.txt +62 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/views.rst.txt +175 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_sources/index.rst.txt +110 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/ajax-loader.gif +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/alabaster.css +695 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/basic.css +632 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/comment-bright.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/comment-close.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/comment.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/custom.css +192 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/custom.css.backup +161 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/doctools.js +287 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/down-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/down.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/file.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/flag_logo.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/flag_logo.svg +153 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/jquery-3.1.0.js +10074 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/jquery.js +4 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/minus.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/plus.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/pygments.css +74 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/searchtools.js +758 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/underscore-1.3.1.js +999 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/underscore.js +31 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/up-pressed.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/up.png +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/_static/websupport.js +808 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/acks.html +289 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/actions.html +3782 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps-statistics.html +439 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps_expressions.html +1552 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps_functions.html +1626 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/auxiliary_modules.html +2548 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/config-file-shortcuts.html +508 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/conflated_topics.html +328 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/constructing-fields.html +447 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/daemon.html +295 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/delta.html +609 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/distribution.html +246 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/enrichment.html +264 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/events.html +449 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/file_format_versions.html +229 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/glossary.html +215 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/ha.html +978 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/installing_and_starting.html +357 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/intro.html +572 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/logging.html +972 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/messageTypes.html +1280 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/monitoring.html +718 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/oof.html +341 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/operation.html +1515 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/pub_sub.html +934 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/queues.html +1767 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/replication.html +1777 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/securing.html +697 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/sow.html +1038 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/sow_queries.html +621 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/spark.html +819 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/transports.html +352 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/troubleshooting.html +530 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/txlog.html +1013 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/usecases.html +288 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/utilities.html +133 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/chapters/views.html +1120 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/genindex.html +1261 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/index.html +163 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/objects.inv +0 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/search.html +106 -0
- amps-python-client-5.3.4.1/docs/user-guide/html/searchindex.js +1 -0
- amps-python-client-5.3.4.1/include/ampspy_bookmarkstore.hpp +63 -0
- amps-python-client-5.3.4.1/include/ampspy_compat.h +63 -0
- amps-python-client-5.3.4.1/include/ampspy_defs.hpp +181 -0
- amps-python-client-5.3.4.1/include/ampspy_recoverypointadapter.hpp +52 -0
- amps-python-client-5.3.4.1/include/ampspy_shims.hpp +113 -0
- amps-python-client-5.3.4.1/include/ampspy_type_object.hpp +242 -0
- amps-python-client-5.3.4.1/include/ampspy_types.hpp +1139 -0
- amps-python-client-5.3.4.1/include/ampspyver.h +30 -0
- amps-python-client-5.3.4.1/index.html +66 -0
- amps-python-client-5.3.4.1/samples/AMPSConsolePublisher.py +59 -0
- amps-python-client-5.3.4.1/samples/AMPSConsoleSubscriber.py +63 -0
- amps-python-client-5.3.4.1/samples/AMPSFIXBuilderPublisher.py +71 -0
- amps-python-client-5.3.4.1/samples/AMPSFIXShredderSubscriber.py +69 -0
- amps-python-client-5.3.4.1/samples/AMPSNVFIXBuilderPublisher.py +71 -0
- amps-python-client-5.3.4.1/samples/AMPSNVFIXShredderSubscriber.py +67 -0
- amps-python-client-5.3.4.1/samples/AMPSPublishForReplay.py +81 -0
- amps-python-client-5.3.4.1/samples/AMPSQueueConsumer.py +69 -0
- amps-python-client-5.3.4.1/samples/AMPSQueuePublisher.py +59 -0
- amps-python-client-5.3.4.1/samples/AMPSSOWConsolePublisher.py +67 -0
- amps-python-client-5.3.4.1/samples/AMPSSOWConsoleSubscriber.py +77 -0
- amps-python-client-5.3.4.1/samples/AMPSSOWandSubscribeConsoleSubscriber.py +79 -0
- amps-python-client-5.3.4.1/samples/AMPSSOWandSubscribeWithOOF.py +108 -0
- amps-python-client-5.3.4.1/samples/AMPSSubscribeForReplay.py +128 -0
- amps-python-client-5.3.4.1/samples/AMPSUpdateForOOF.py +123 -0
- amps-python-client-5.3.4.1/samples/CompositeMessagePublisher.py +84 -0
- amps-python-client-5.3.4.1/samples/CompositeMessageSubscriber.py +87 -0
- amps-python-client-5.3.4.1/samples/RandomServerChooser.py +41 -0
- amps-python-client-5.3.4.1/samples/sample.xml +335 -0
- amps-python-client-5.3.4.1/setup.py +209 -0
- amps-python-client-5.3.4.1/setup_amps.py +94 -0
- amps-python-client-5.3.4.1/src/ampspy_shims.cpp +203 -0
- amps-python-client-5.3.4.1/src/ampspy_type_object.cpp +484 -0
- amps-python-client-5.3.4.1/src/authenticator.cpp +128 -0
- amps-python-client-5.3.4.1/src/bookmarkstore.cpp +238 -0
- amps-python-client-5.3.4.1/src/client.cpp +2430 -0
- amps-python-client-5.3.4.1/src/client_docs.h +956 -0
- amps-python-client-5.3.4.1/src/cmessagehandler.cpp +151 -0
- amps-python-client-5.3.4.1/src/command.cpp +164 -0
- amps-python-client-5.3.4.1/src/command_docs.h +194 -0
- amps-python-client-5.3.4.1/src/compositemessagebuilder.cpp +111 -0
- amps-python-client-5.3.4.1/src/compositemessageparser.cpp +146 -0
- amps-python-client-5.3.4.1/src/conflatingrecoverypointadapter.cpp +194 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/BlockPublishStore.hpp +2053 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/BlockStore.hpp +677 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/BookmarkStore.hpp +542 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/Buffer.hpp +214 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/CompositeMessageBuilder.hpp +174 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/CompositeMessageParser.hpp +151 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/DefaultServerChooser.hpp +162 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/Field.hpp +719 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/HAClient.hpp +370 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/HAClientImpl.hpp +460 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/HybridPublishStore.hpp +481 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/LoggedBookmarkStore.hpp +1255 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/MMapBookmarkStore.hpp +1283 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/MMapStoreBuffer.hpp +290 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryBookmarkStore.hpp +1622 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryPublishStore.hpp +66 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryStoreBuffer.hpp +244 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/MemorySubscriptionManager.hpp +850 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/Message.hpp +1819 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/MessageRouter.hpp +618 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/PublishStore.hpp +158 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ReconnectDelayStrategy.hpp +106 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ReconnectDelayStrategyImpl.hpp +317 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/RecoveryPoint.hpp +323 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/RecoveryPointAdapter.hpp +501 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/RingBookmarkStore.hpp +669 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/SOWRecoveryPointAdapter.hpp +490 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ServerChooser.hpp +145 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ServerChooserImpl.hpp +95 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/amps.h +775 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/amps_generated.h +46 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/amps_impl.h +204 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/amps_ssl.h +78 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ampscrc.hpp +210 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ampsplusplus.hpp +8817 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ampsuri.h +84 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ampsver.h +41 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/ampsver.h.in +41 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/constants.hpp +194 -0
- amps-python-client-5.3.4.1/src/cpp/include/amps/util.hpp +1692 -0
- amps-python-client-5.3.4.1/src/cpp/src/amps_protocol.c +688 -0
- amps-python-client-5.3.4.1/src/cpp/src/amps_protocol_generated.h +80 -0
- amps-python-client-5.3.4.1/src/cpp/src/amps_ssl.c +489 -0
- amps-python-client-5.3.4.1/src/cpp/src/atfork.c +446 -0
- amps-python-client-5.3.4.1/src/cpp/src/client.c +483 -0
- amps-python-client-5.3.4.1/src/cpp/src/makefile +92 -0
- amps-python-client-5.3.4.1/src/cpp/src/message.c +837 -0
- amps-python-client-5.3.4.1/src/cpp/src/message_generated.h +611 -0
- amps-python-client-5.3.4.1/src/cpp/src/tcp.c +1489 -0
- amps-python-client-5.3.4.1/src/cpp/src/tcps.c +1894 -0
- amps-python-client-5.3.4.1/src/cpp/src/transports.c +123 -0
- amps-python-client-5.3.4.1/src/cpp/src/unix.c +984 -0
- amps-python-client-5.3.4.1/src/cpp/src/uri.c +301 -0
- amps-python-client-5.3.4.1/src/exponentialdelaystrategy.cpp +137 -0
- amps-python-client-5.3.4.1/src/failedwritehandler.cpp +116 -0
- amps-python-client-5.3.4.1/src/fixbuilder.cpp +146 -0
- amps-python-client-5.3.4.1/src/fixeddelaystrategy.cpp +114 -0
- amps-python-client-5.3.4.1/src/fixshredder.cpp +105 -0
- amps-python-client-5.3.4.1/src/fixshredder_docs.h +38 -0
- amps-python-client-5.3.4.1/src/haclient.cpp +691 -0
- amps-python-client-5.3.4.1/src/haclient_docs.h +132 -0
- amps-python-client-5.3.4.1/src/hybridpublishstore.cpp +137 -0
- amps-python-client-5.3.4.1/src/hybridpublishstore_docs.h +31 -0
- amps-python-client-5.3.4.1/src/memorybookmarkstore.cpp +373 -0
- amps-python-client-5.3.4.1/src/memorybookmarkstore_docs.h +39 -0
- amps-python-client-5.3.4.1/src/memorypublishstore.cpp +160 -0
- amps-python-client-5.3.4.1/src/memorypublishstore_docs.h +32 -0
- amps-python-client-5.3.4.1/src/message.cpp +765 -0
- amps-python-client-5.3.4.1/src/message_docs.h +306 -0
- amps-python-client-5.3.4.1/src/messagestream.cpp +623 -0
- amps-python-client-5.3.4.1/src/messagestream_docs.h +45 -0
- amps-python-client-5.3.4.1/src/mmapbookmarkstore.cpp +422 -0
- amps-python-client-5.3.4.1/src/nvfixbuilder.cpp +160 -0
- amps-python-client-5.3.4.1/src/nvfixbuilder_docs.h +33 -0
- amps-python-client-5.3.4.1/src/nvfixshredder.cpp +99 -0
- amps-python-client-5.3.4.1/src/nvfixshredder_docs.h +39 -0
- amps-python-client-5.3.4.1/src/publishstore.cpp +183 -0
- amps-python-client-5.3.4.1/src/raw_wrapper.cpp +756 -0
- amps-python-client-5.3.4.1/src/reason.cpp +71 -0
- amps-python-client-5.3.4.1/src/recoverypoint.cpp +135 -0
- amps-python-client-5.3.4.1/src/recoverypointadapter.cpp +171 -0
- amps-python-client-5.3.4.1/src/ringbookmarkstore.cpp +360 -0
- amps-python-client-5.3.4.1/src/serverchooser.cpp +245 -0
- amps-python-client-5.3.4.1/src/serverchooser_docs.h +39 -0
- amps-python-client-5.3.4.1/src/sowrecoverypointadapter.cpp +248 -0
- amps-python-client-5.3.4.1/src/store.cpp +62 -0
- amps-python-client-5.3.4.1/src/versioninfo.cpp +175 -0
|
@@ -0,0 +1,1398 @@
|
|
|
1
|
+
.. index:: Message types, Message types; FIX, Message types; NVFIX,
|
|
2
|
+
Message types; XML, Message types; JSON, Message types; BSON, Message
|
|
3
|
+
types; composite, Message types; protobuf, Message types; msgpack
|
|
4
|
+
|
|
5
|
+
.. _#ug-messagetypes:
|
|
6
|
+
|
|
7
|
+
.. _messageTypes:
|
|
8
|
+
|
|
9
|
+
Message Types
|
|
10
|
+
==================
|
|
11
|
+
|
|
12
|
+
Message communication between the publisher and subscriber in AMPS is
|
|
13
|
+
managed through the use of message types. Message types define the data
|
|
14
|
+
contained within an AMPS message. Each topic has a specific message
|
|
15
|
+
type. Transports used for publishers and subscribers can also define
|
|
16
|
+
specific message types. For a given transport, AMPS will only process
|
|
17
|
+
messages of the type or types that the transport accepts.
|
|
18
|
+
|
|
19
|
+
When AMPS needs to use the data within a message, AMPS uses the message
|
|
20
|
+
type to parse the message into an internal representation. AMPS uses the
|
|
21
|
+
same internal representation for all message types. Likewise, if AMPS
|
|
22
|
+
needs to create a new message from a set of values (for example, for a
|
|
23
|
+
view), AMPS uses the message type to serialize that set of values into
|
|
24
|
+
the correct format. AMPS filters, commands, processing flow, and so
|
|
25
|
+
forth are the same for every message type. Message types do not change
|
|
26
|
+
how AMPS processes messages. A message type simply allows AMPS to work
|
|
27
|
+
with data of a particular format.
|
|
28
|
+
|
|
29
|
+
In some cases, a given message type cannot support all of the
|
|
30
|
+
capabilities in AMPS. For example, the unparsed ``binary`` message type
|
|
31
|
+
allows arbitrary payloads. This can be extremely useful, but because
|
|
32
|
+
there is no set format for that message type, none of the capabilities
|
|
33
|
+
that rely on parsing data are supported by the ``binary`` message type.
|
|
34
|
+
Where a message type cannot provide a specific capability to AMPS, those
|
|
35
|
+
limitations are described below.
|
|
36
|
+
|
|
37
|
+
Except where limitations are described in this section, all message
|
|
38
|
+
types provided with the AMPS server support all AMPS features. The AMPS
|
|
39
|
+
engine itself is message-type agnostic. There is no difference in
|
|
40
|
+
configuring a SOW that uses a composite type than there is configuring a
|
|
41
|
+
SOW that uses JSON, or BFlat, or Google Protocol buffers.
|
|
42
|
+
|
|
43
|
+
Message types in AMPS are implemented as plug-in modules. For more
|
|
44
|
+
information on plug-in modules, contact 60East support for access to the
|
|
45
|
+
AMPS Server SDK.
|
|
46
|
+
|
|
47
|
+
Default Message Types
|
|
48
|
+
----------------------
|
|
49
|
+
|
|
50
|
+
AMPS automatically loads modules for the following message types:
|
|
51
|
+
|
|
52
|
+
.. list-table:: *AMPS Default Message Types*
|
|
53
|
+
:header-rows: 1
|
|
54
|
+
|
|
55
|
+
* - Message Type
|
|
56
|
+
|
|
57
|
+
- Description
|
|
58
|
+
|
|
59
|
+
* - ``bson``
|
|
60
|
+
|
|
61
|
+
- Binary JSON (BSON) messages. See http://www.bsonspec.org for information on this format.
|
|
62
|
+
|
|
63
|
+
* - ``bflat``
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
- BFlat, a schemaless message format based on key-value pairs that includes support for binary
|
|
67
|
+
representations of numeric data. See http://bflat.io for information on this format.
|
|
68
|
+
|
|
69
|
+
* - ``fix``
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
- FIX messages using numeric tags. FIX is a standard format widely used in the financial
|
|
73
|
+
industry. See https://www.fixtrading.org/what-is-fix/ for more information on
|
|
74
|
+
this format.
|
|
75
|
+
|
|
76
|
+
* - ``json``
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
- JSON (JavaScript Object Notation) messages. See http://www.json.org for information on this
|
|
80
|
+
format.
|
|
81
|
+
|
|
82
|
+
* - ``msgpack``
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
- MessagePack messages. MessagePack is a schemaless serialization format designed to
|
|
86
|
+
efficiently encode data. See http://msgpack.org/index.html for more information on
|
|
87
|
+
MessagePack.
|
|
88
|
+
|
|
89
|
+
* - ``nvfix``
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
- NVFIX (name/value FIX) messages. NVFIX uses the same basic format as FIX, but allows tags to
|
|
93
|
+
contain any byte that is not ``=`` or the configured field separator character (by default,
|
|
94
|
+
the ASCII ``SOH`` character.) By contrast, FIX requires that tags are numeric.
|
|
95
|
+
|
|
96
|
+
* - ``xml``
|
|
97
|
+
|
|
98
|
+
- XML messages (of any schema)
|
|
99
|
+
|
|
100
|
+
* - ``binary``
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
- Uninterpreted binary payload. Because this module does not attempt to parse the payload, it
|
|
104
|
+
does not support content filtering, views and aggregates. Likewise, because there is no set
|
|
105
|
+
format for the payload, this message type cannot support features that construct messages
|
|
106
|
+
(such as delta messaging, ``/AMPS/.*`` topic subscriptions and ``stats`` acks).
|
|
107
|
+
|
|
108
|
+
* - ``protobuf``
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
- Google protocol buffer messages. To use this message type, you must configure a
|
|
112
|
+
``MessageType`` with the format of the messages (the ``.proto`` files).
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
With these message types, AMPS automatically loads the module that
|
|
116
|
+
provides the message type. AMPS declares message types for all of the
|
|
117
|
+
above message types except for ``protobuf``.
|
|
118
|
+
|
|
119
|
+
.. index:: message parsing, message validation; not enforced by AMPS,
|
|
120
|
+
|
|
121
|
+
For efficiency, AMPS only parses the content of a message if required,
|
|
122
|
+
and only to the extent required. For example, if AMPS only needs to find
|
|
123
|
+
the ``id`` tag in an NVFIX message, AMPS will not fully parse the
|
|
124
|
+
message, but will stop parsing the message after finding the ``id`` tag.
|
|
125
|
+
This provides significant performance improvements, and also means that
|
|
126
|
+
AMPS does not verify the format or validity of messages unless it needs
|
|
127
|
+
to parse the messages. When AMPS parses a message, it may only partially
|
|
128
|
+
parse a message, and may not detect corruption or invalid format in a
|
|
129
|
+
message if that corruption occurs after the point at which AMPS has all
|
|
130
|
+
of the required information from the message.
|
|
131
|
+
|
|
132
|
+
The FIX and NVFIX message types support configuration of the field and
|
|
133
|
+
message delimiters.
|
|
134
|
+
|
|
135
|
+
AMPS also allows you to create new message types by assembling existing
|
|
136
|
+
message types into a composite message. Composite message types are
|
|
137
|
+
described in :ref:`Composite Messages <#ug-messagetypes-composite>`, and
|
|
138
|
+
require additional configuration:
|
|
139
|
+
|
|
140
|
+
.. list-table:: *AMPS Composite Message Types*
|
|
141
|
+
:header-rows: 1
|
|
142
|
+
|
|
143
|
+
* - Message Type Name
|
|
144
|
+
|
|
145
|
+
- Description
|
|
146
|
+
|
|
147
|
+
* - ``composite-global``
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
- Composite message type that combines message parts for content filtering. This
|
|
151
|
+
message type combines one or more existing message types into a message. This
|
|
152
|
+
type is described in more detail in
|
|
153
|
+
:ref:`Composite Messages<#ug-messagetypes-composite>`.
|
|
154
|
+
|
|
155
|
+
* - ``composite-local``
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
- Composite message type, filterable by individual parts. This message type
|
|
159
|
+
combines one or more existing message types into a message. This type is
|
|
160
|
+
described in more detail in
|
|
161
|
+
:ref:`Composite Messages <#ug-messagetypes-composite>`.
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
.. index:: bflat,
|
|
165
|
+
|
|
166
|
+
BFlat Messages
|
|
167
|
+
---------------
|
|
168
|
+
|
|
169
|
+
The BFlat message format combines the simplicity and efficiency of
|
|
170
|
+
simple, schemaless data formats such as FIX and NVFIX with the ability
|
|
171
|
+
to manage binary data and preserve the full precision of numeric values.
|
|
172
|
+
BFlat is especially useful for applications that deal with binary data
|
|
173
|
+
or precise numeric values while demanding high levels of throughput.
|
|
174
|
+
|
|
175
|
+
A BFlat message is composed of any number of tag/value pairs, similar to
|
|
176
|
+
FIX and NVFIX messages. Tags and values can contain any value and can
|
|
177
|
+
be of any length. Unlike formats such as FIX, there are no reserved
|
|
178
|
+
characters. In practical terms, the name of a tag must be a valid XPath
|
|
179
|
+
identifier to filter the message in AMPS. However, this is a limitation
|
|
180
|
+
of XPath and not of the BFlat message format.
|
|
181
|
+
|
|
182
|
+
The BFlat message type supports all AMPS features and there are no
|
|
183
|
+
special considerations when using the BFlat message type.
|
|
184
|
+
|
|
185
|
+
Open-source libraries for producing and parsing BFlat messages are available
|
|
186
|
+
from the `BFlat project <http://bflat.io>`_ site.
|
|
187
|
+
|
|
188
|
+
BFlat Data Types
|
|
189
|
+
^^^^^^^^^^^^^^^^^
|
|
190
|
+
|
|
191
|
+
BFlat messages are strongly typed. For numeric values, BFlat can preserve
|
|
192
|
+
the precise value of the following numeric types:
|
|
193
|
+
|
|
194
|
+
.. list-table:: *BFlat Numeric Types*
|
|
195
|
+
:header-rows: 1
|
|
196
|
+
:widths: 25 75
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
* - Type
|
|
200
|
+
|
|
201
|
+
- Description
|
|
202
|
+
|
|
203
|
+
* - int8
|
|
204
|
+
|
|
205
|
+
- 8-bit integer
|
|
206
|
+
|
|
207
|
+
* - int16
|
|
208
|
+
|
|
209
|
+
- 16-bit integer
|
|
210
|
+
|
|
211
|
+
* - int32
|
|
212
|
+
|
|
213
|
+
- 32-bit integer
|
|
214
|
+
|
|
215
|
+
* - int64
|
|
216
|
+
|
|
217
|
+
- 64-bit integer
|
|
218
|
+
|
|
219
|
+
* - double
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
- 64-bit IEEE 754 floating point
|
|
223
|
+
number
|
|
224
|
+
|
|
225
|
+
* - datetime
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
- UTC datetime containing milliseconds
|
|
229
|
+
since Unix epoch (64-bit
|
|
230
|
+
representation)
|
|
231
|
+
|
|
232
|
+
* - leb128
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
- Signed LEB128 integer (variable
|
|
236
|
+
length)
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
BFlat also includes the following non-numeric types:
|
|
240
|
+
|
|
241
|
+
.. list-table:: *BFlat non-numeric Types*
|
|
242
|
+
:header-rows: 1
|
|
243
|
+
:widths: 25 75
|
|
244
|
+
|
|
245
|
+
* - Type
|
|
246
|
+
|
|
247
|
+
- Description
|
|
248
|
+
|
|
249
|
+
* - null
|
|
250
|
+
|
|
251
|
+
- Empty field
|
|
252
|
+
|
|
253
|
+
* - string
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
- String of bytes
|
|
257
|
+
|
|
258
|
+
BFlat does not specify the encoding
|
|
259
|
+
of a string; this is up to the
|
|
260
|
+
application to determine.
|
|
261
|
+
|
|
262
|
+
* - binary
|
|
263
|
+
|
|
264
|
+
- Untyped sequence of bytes
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
BFlat includes the ability to represent arrays of values.
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
Representing Data in BFlat
|
|
271
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
272
|
+
|
|
273
|
+
By convention, BFlat serializers should choose the most compact representation of a
|
|
274
|
+
given value. For example, if an integer value can fit into 8 bits, it should be
|
|
275
|
+
serialized as a value of type ``int8``. An application that parses BFlat should
|
|
276
|
+
assume that a serializer may use different types for values in the same field,
|
|
277
|
+
to optimize for a compact representation, and should not rely on a value being
|
|
278
|
+
of a specific type.
|
|
279
|
+
|
|
280
|
+
For example, a ``TotalValue`` field that can have any integer value could
|
|
281
|
+
be serialized with a type of ``int8`` for values that fit in 8 bits, but could
|
|
282
|
+
be serialized with a integer type that includes more bits if the value is larger,
|
|
283
|
+
and could be serialized with the ``leb128`` type for integer values that cannot
|
|
284
|
+
be represented in 64 bits.
|
|
285
|
+
|
|
286
|
+
When the AMPS server must serialize a BFlat message (for example, when projecting
|
|
287
|
+
a view or as a result of enrichment), AMPS tries to optimize for the most compact message size,
|
|
288
|
+
which could change the representation if the serializer did not choose the most
|
|
289
|
+
compact type for a value.
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
.. index:: messagepack, msgpack
|
|
294
|
+
|
|
295
|
+
MessagePack Messages
|
|
296
|
+
--------------------
|
|
297
|
+
|
|
298
|
+
AMPS fully supports MessagePack messages, with the following
|
|
299
|
+
implementation decisions to represent MessagePack messages in
|
|
300
|
+
the AMPS type system. See :ref:`#ug-expressions-data-types` for
|
|
301
|
+
information on the AMPS data types. Notice, in particular, that
|
|
302
|
+
the AMPS expression language supports automatic type conversion,
|
|
303
|
+
so while this table shows the default AMPS representation for
|
|
304
|
+
a given MessagePack type, AMPS will convert a value as needed
|
|
305
|
+
once the message has been parsed.
|
|
306
|
+
|
|
307
|
+
.. list-table:: *MessagePack Types and AMPS Types*
|
|
308
|
+
:header-rows: 1
|
|
309
|
+
|
|
310
|
+
* - MessagePack Type
|
|
311
|
+
|
|
312
|
+
- AMPS Representation
|
|
313
|
+
|
|
314
|
+
* - nil
|
|
315
|
+
|
|
316
|
+
- NULL
|
|
317
|
+
|
|
318
|
+
* - bool
|
|
319
|
+
|
|
320
|
+
- Boolean
|
|
321
|
+
|
|
322
|
+
* - int (all widths)
|
|
323
|
+
|
|
324
|
+
- Integer
|
|
325
|
+
|
|
326
|
+
* - float (all widths)
|
|
327
|
+
|
|
328
|
+
- Float
|
|
329
|
+
|
|
330
|
+
* - str (all widths)
|
|
331
|
+
|
|
332
|
+
- String
|
|
333
|
+
|
|
334
|
+
* - bin (all widths)
|
|
335
|
+
|
|
336
|
+
- String
|
|
337
|
+
|
|
338
|
+
* - array (all widths)
|
|
339
|
+
|
|
340
|
+
- array of AMPS values
|
|
341
|
+
|
|
342
|
+
* - map (all widths)
|
|
343
|
+
|
|
344
|
+
- nested AMPS values
|
|
345
|
+
|
|
346
|
+
* - ext (all widths)
|
|
347
|
+
|
|
348
|
+
- String
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
Notice that AMPS does not attempt to interpret extension types, and instead
|
|
352
|
+
represents them as arrays of bytes (a String in the AMPS type system).
|
|
353
|
+
|
|
354
|
+
.. _#ug-messagetypes-composite:
|
|
355
|
+
|
|
356
|
+
Composite Messages
|
|
357
|
+
-------------------
|
|
358
|
+
|
|
359
|
+
Sometimes, applications only need to filter on a small subset of the
|
|
360
|
+
fields in a message. Sometimes applications need to send and receive
|
|
361
|
+
messages that cannot be meaningfully parsed by AMPS, such as images or
|
|
362
|
+
audio files. For these cases, AMPS provides a composite message type
|
|
363
|
+
that lets you create a new message type by combining existing message
|
|
364
|
+
types.
|
|
365
|
+
|
|
366
|
+
For example, you might create a message type that includes three parts:
|
|
367
|
+
the metadata for an image as a ``json`` document, a small JPG thumbnail
|
|
368
|
+
as a ``binary`` message part, and a full size PNG image as another
|
|
369
|
+
``binary`` message part.
|
|
370
|
+
|
|
371
|
+
Composite messages can also be useful when the message itself is large
|
|
372
|
+
or resource-intensive to parse. In this case, you can create a message
|
|
373
|
+
type that includes the information needed to filter messages in a JSON
|
|
374
|
+
or NVFIX part, and include the full message in the unparsed payload of
|
|
375
|
+
the composite message, as described below.
|
|
376
|
+
|
|
377
|
+
AMPS provides two different types of composite messages. Messages
|
|
378
|
+
created using the ``composite-local`` module preserve information about
|
|
379
|
+
the individual parts for filtering, aggregation, and projection.
|
|
380
|
+
Messages created using the ``composite-global`` module treat the
|
|
381
|
+
individual parts as elements of a single document.
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
.. index:: unparsed payload,
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
Configuring Composite Message Types
|
|
388
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
389
|
+
|
|
390
|
+
To use a composite message type, you must first configure the type by
|
|
391
|
+
declaring it in the ``MessageTypes`` section of the AMPS configuration
|
|
392
|
+
file. The declaration contains the name of the new composite message
|
|
393
|
+
type, specifies that the new type is composite, and lists the parts of
|
|
394
|
+
the composite message type.
|
|
395
|
+
|
|
396
|
+
For example, the ``MessageType`` element below declares a new composite
|
|
397
|
+
message type named ``images``. The new type contains a ``json`` document
|
|
398
|
+
at the beginning of the message, followed by two uninterpreted binary
|
|
399
|
+
message parts. AMPS will combine the XPath identifiers for all message
|
|
400
|
+
parts into a single set of identifiers. Notice that, because only one
|
|
401
|
+
part of the message type is parsable, using ``composite-global``
|
|
402
|
+
simplifies the identifiers for the message.
|
|
403
|
+
|
|
404
|
+
.. code-block:: xml
|
|
405
|
+
|
|
406
|
+
<MessageTypes>
|
|
407
|
+
...
|
|
408
|
+
|
|
409
|
+
<MessageType>
|
|
410
|
+
<Name>images</Name>
|
|
411
|
+
<Module>composite-global</Module>
|
|
412
|
+
<MessageType>json</MessageType>
|
|
413
|
+
<MessageType>binary</MessageType>
|
|
414
|
+
<MessageType>binary</MessageType>
|
|
415
|
+
</MessageType>
|
|
416
|
+
|
|
417
|
+
...
|
|
418
|
+
|
|
419
|
+
</MessageTypes>
|
|
420
|
+
|
|
421
|
+
The ``MessageType`` entries for the composite message can be any AMPS
|
|
422
|
+
message type, including both the built-in types and any previously
|
|
423
|
+
defined message type.
|
|
424
|
+
|
|
425
|
+
Once the new composite message type is created, you can use the new type
|
|
426
|
+
in the configuration file.
|
|
427
|
+
|
|
428
|
+
Composite message types have the following restrictions:
|
|
429
|
+
|
|
430
|
+
- Delta subscribe and delta publish are not supported for message types
|
|
431
|
+
that use ``composite-global``.
|
|
432
|
+
|
|
433
|
+
- Views, joins, and aggregation cannot project message types that use
|
|
434
|
+
``composite-global``. (However, composite message types that use
|
|
435
|
+
``composite-global`` *can* be an ``UnderlyingTopic`` or one of the
|
|
436
|
+
topics in a ``Join``.)
|
|
437
|
+
|
|
438
|
+
- Composite message types do not support features that automatically
|
|
439
|
+
construct messages, such as subscriptions to the ``AMPS/.*`` topics and
|
|
440
|
+
stats acks, regardless of the module the type uses.
|
|
441
|
+
|
|
442
|
+
Unparsed Payload Section
|
|
443
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
444
|
+
|
|
445
|
+
All composite message types, regardless of how they are defined, provide
|
|
446
|
+
an *unparsed payload* section. The unparsed payload section does not
|
|
447
|
+
need to be declared in the ``MessageType`` declaration. As the name
|
|
448
|
+
suggests, AMPS does not parse or interpret this section, so the unparsed
|
|
449
|
+
payload can contain any content of any type. In an AMPS client,
|
|
450
|
+
the unparsed payload section is represented as bytes that appear
|
|
451
|
+
at the end of the message, after the last defined part.
|
|
452
|
+
|
|
453
|
+
The unparsed payload is included to simplify the common technique where
|
|
454
|
+
a message type contains a header that is used for filtering followed by
|
|
455
|
+
an unparsed binary. If your composite message type contains a single
|
|
456
|
+
binary part, consider using the unparsed payload section in your
|
|
457
|
+
application rather than declaring a binary message part. Notice,
|
|
458
|
+
however, that since AMPS does not parse or interpret this section,
|
|
459
|
+
it may not appear in serialized representations of the message
|
|
460
|
+
(for example, log messages, Galvanometer display, and so on).
|
|
461
|
+
|
|
462
|
+
Content Filtering with Composite Message Types
|
|
463
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
464
|
+
|
|
465
|
+
Composite message types support filtering on the contents of the
|
|
466
|
+
composite message. There are some simple conventions to remember when
|
|
467
|
+
constructing expressions to filter on. For more details about content
|
|
468
|
+
filtering, see :ref:`Filtering Subscriptions by Content<#pub-sub-content>`.
|
|
469
|
+
|
|
470
|
+
These conventions are consistent anywhere that AMPS needs to find a
|
|
471
|
+
value within the composite message type. That includes content filters
|
|
472
|
+
for client subscriptions, identifying SOW keys, creating views and
|
|
473
|
+
aggregates, creating conflated topics, and so on.
|
|
474
|
+
|
|
475
|
+
composite-global
|
|
476
|
+
~~~~~~~~~~~~~~~~
|
|
477
|
+
|
|
478
|
+
When using the ``composite-global`` message type, AMPS combines all
|
|
479
|
+
parts of the message into a unified set of XPath identifiers. AMPS
|
|
480
|
+
creates the set of identifiers for each part of the message. If
|
|
481
|
+
different parts of the message contain the same identifier, AMPS treats
|
|
482
|
+
that identifier as though the identifier contained an array of values:
|
|
483
|
+
AMPS creates an array that contains all of the values in the different
|
|
484
|
+
parts of the message. Message types that do not support content
|
|
485
|
+
filtering do not provide XPath identifiers.
|
|
486
|
+
|
|
487
|
+
For example, consider the message below for a ``composite-global``
|
|
488
|
+
message type that includes two ``json`` parts and a ``binary`` part:
|
|
489
|
+
|
|
490
|
+
.. code::
|
|
491
|
+
|
|
492
|
+
{"id":1,"data":"sample","message":"part one message"}
|
|
493
|
+
{"message":"another part","customer":"Awesome Amalgamated, Ltd."}
|
|
494
|
+
0xDEEA0934DF23A37780934...
|
|
495
|
+
|
|
496
|
+
AMPS constructs the following set of XPath identifiers and values:
|
|
497
|
+
|
|
498
|
+
.. list-table:: *Composite-global Message Identifiers*
|
|
499
|
+
:header-rows: 1
|
|
500
|
+
|
|
501
|
+
* - Identifier
|
|
502
|
+
|
|
503
|
+
- Value
|
|
504
|
+
|
|
505
|
+
* - ``/id``
|
|
506
|
+
|
|
507
|
+
- ``1``
|
|
508
|
+
|
|
509
|
+
* - ``/data``
|
|
510
|
+
|
|
511
|
+
- ``"sample"``
|
|
512
|
+
|
|
513
|
+
* - ``/message``
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
- ``["part one message", "another part"]``
|
|
517
|
+
|
|
518
|
+
* - ``/customer``
|
|
519
|
+
|
|
520
|
+
- ``"Awesome Amalgamated, Ltd."``
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
|
|
524
|
+
In short, when using ``composite-global``, AMPS combines the parsable
|
|
525
|
+
parts of the message into a single global set of XPath values, and
|
|
526
|
+
ignores any part of the message that cannot be parsed.
|
|
527
|
+
|
|
528
|
+
composite-local
|
|
529
|
+
~~~~~~~~~~~~~~~~
|
|
530
|
+
|
|
531
|
+
When using the ``composite-local`` message type, AMPS creates a distinct
|
|
532
|
+
set of XPath identifiers for each part of the message. AMPS adds an
|
|
533
|
+
XPath step with the position of the message part at the beginning of the
|
|
534
|
+
identifier. Message types that do not support content filtering do not
|
|
535
|
+
provide XPath identifiers, and AMPS skips over them.
|
|
536
|
+
|
|
537
|
+
For example, consider the message below for a ``composite-local``
|
|
538
|
+
message type that includes two ``json`` parts and a ``binary`` part:
|
|
539
|
+
|
|
540
|
+
.. code::
|
|
541
|
+
|
|
542
|
+
{"id":1,"data":"sample","message":"part one message"}
|
|
543
|
+
{"message":"another part","customer":"Awesome Amalgamated, Ltd."}
|
|
544
|
+
0xDEEA0934DF23A37780934...
|
|
545
|
+
|
|
546
|
+
AMPS constructs the following set of XPath identifiers and values:
|
|
547
|
+
|
|
548
|
+
.. list-table:: *Composite-local Message Identifiers*
|
|
549
|
+
:header-rows: 1
|
|
550
|
+
|
|
551
|
+
* - Identifier
|
|
552
|
+
|
|
553
|
+
- Value
|
|
554
|
+
|
|
555
|
+
* - ``/0/id``
|
|
556
|
+
|
|
557
|
+
- ``1``
|
|
558
|
+
|
|
559
|
+
* - ``/0/data``
|
|
560
|
+
|
|
561
|
+
- ``"sample"``
|
|
562
|
+
|
|
563
|
+
* - ``/0/message``
|
|
564
|
+
|
|
565
|
+
- ``"part one message"``
|
|
566
|
+
|
|
567
|
+
* - ``/1/message``
|
|
568
|
+
|
|
569
|
+
- ``"another part"``
|
|
570
|
+
|
|
571
|
+
* - ``/1/customer``
|
|
572
|
+
|
|
573
|
+
- ``"Awesome Amalgamated, Ltd."``
|
|
574
|
+
|
|
575
|
+
|
|
576
|
+
|
|
577
|
+
In short, when using ``composite-local``, AMPS creates XPath identifiers
|
|
578
|
+
for each part of the message, using the position of the message part
|
|
579
|
+
within the composite as the first part of the identifier. AMPS skips
|
|
580
|
+
over any part of the message that cannot be parsed, and simply produces
|
|
581
|
+
no values for that part of the message.
|
|
582
|
+
|
|
583
|
+
Choosing a Composite Type
|
|
584
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
585
|
+
|
|
586
|
+
To choose which composite type best fits your application, consider the
|
|
587
|
+
following factors:
|
|
588
|
+
|
|
589
|
+
- If you need to use delta messaging with this message type, use
|
|
590
|
+
``composite-local``.
|
|
591
|
+
|
|
592
|
+
- If there may be redundant field names in the parts of the message,
|
|
593
|
+
and it is important to be able to filter based on which part contains
|
|
594
|
+
the field, use ``composite-local``.
|
|
595
|
+
|
|
596
|
+
- If you need to be able to create views of this type, use
|
|
597
|
+
``composite-local``.
|
|
598
|
+
|
|
599
|
+
Otherwise, ``composite-global`` may be easier and more straightforward
|
|
600
|
+
for client filtering, since clients do not need to know the detailed
|
|
601
|
+
structure of the message type to be able to filter on the message.
|
|
602
|
+
|
|
603
|
+
Protobuf Message Types
|
|
604
|
+
------------------------
|
|
605
|
+
|
|
606
|
+
Protocol buffers, or protobufs for short, is an efficient, automated
|
|
607
|
+
mechanism for serializing structured data. AMPS supports Google protobuf
|
|
608
|
+
messages (version 2 and version 3) as a message format.
|
|
609
|
+
|
|
610
|
+
Since Google protocol buffers use a fixed format for messages, to use
|
|
611
|
+
protobuf, you must configure AMPS with the definition of the messages
|
|
612
|
+
AMPS will process. This involves defining a ``MessageType``. You must
|
|
613
|
+
define a ``MessageType`` for AMPS to be able to parse protobuf messages.
|
|
614
|
+
|
|
615
|
+
60East recommends that the ``.proto`` files used with AMPS explicitly
|
|
616
|
+
declare the protocol buffer syntax version used. If there is no explicit
|
|
617
|
+
declaration, AMPS assumes the file uses protocol buffer 2 syntax.
|
|
618
|
+
|
|
619
|
+
The AMPS engine is message-type agnostic. Except for the limitations
|
|
620
|
+
described in this section, there is no difference to the AMPS engine
|
|
621
|
+
between message types that use protocol buffers and other message types
|
|
622
|
+
such as JSON or XML or FIX.
|
|
623
|
+
|
|
624
|
+
Configuring Protobuf Message Types
|
|
625
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
626
|
+
|
|
627
|
+
To use a protobuf message, you must first edit the configuration file to
|
|
628
|
+
include a new ``MessageType``. Then, specify the path to the protobuf
|
|
629
|
+
file and the name of the protobuf file itself inside the
|
|
630
|
+
``MessageType``. Below is a sample configuration of a protobuf message
|
|
631
|
+
type:
|
|
632
|
+
|
|
633
|
+
.. code-block:: xml
|
|
634
|
+
|
|
635
|
+
...
|
|
636
|
+
|
|
637
|
+
<MessageType>
|
|
638
|
+
<Name>my-protobuf-messages</Name>
|
|
639
|
+
<Module>protobuf</Module>
|
|
640
|
+
<ProtoPath>proto-archive;/mnt/shared/protofiles</ProtoPath>
|
|
641
|
+
<ProtoFile>proto-archive/person.proto</ProtoFile>
|
|
642
|
+
<Type>MyNamespace.Message</Type>
|
|
643
|
+
</MessageType>
|
|
644
|
+
|
|
645
|
+
...
|
|
646
|
+
|
|
647
|
+
Each message type references a ``ProtoFile``, and specifies a single
|
|
648
|
+
top-level type from the file. The ``ProtoFile`` may include other files
|
|
649
|
+
through the standard protocol buffer include mechanism. Likewise, the
|
|
650
|
+
top-level type may be any valid protocol buffer definition, including
|
|
651
|
+
definitions that contain other types.
|
|
652
|
+
|
|
653
|
+
Once the protocol buffer ``MessageType`` is created as described
|
|
654
|
+
above, you must either create a ``Transport`` that specifies that
|
|
655
|
+
message type exactly, or you must create a ``Transport`` that can
|
|
656
|
+
accept any known message type and ensure that the client specifies the
|
|
657
|
+
new message type (in the example case, ``my-protobuf-message``) in the
|
|
658
|
+
connect string.
|
|
659
|
+
|
|
660
|
+
When creating a ``protobuf`` message type, you must provide the
|
|
661
|
+
following parameters:
|
|
662
|
+
|
|
663
|
+
.. list-table:: *Protobuf Message Type Parameters*
|
|
664
|
+
:header-rows: 1
|
|
665
|
+
|
|
666
|
+
* - Parameter
|
|
667
|
+
|
|
668
|
+
- Description
|
|
669
|
+
|
|
670
|
+
* - .. code::
|
|
671
|
+
|
|
672
|
+
Name
|
|
673
|
+
|
|
674
|
+
- The name of the new, customized message type. The rest of the configuration file will
|
|
675
|
+
use this name to refer to the message type.
|
|
676
|
+
|
|
677
|
+
|
|
678
|
+
* - .. code::
|
|
679
|
+
|
|
680
|
+
Module
|
|
681
|
+
|
|
682
|
+
- The module that contains the message type. Use ``protobuf`` for protocol buffer
|
|
683
|
+
messages.
|
|
684
|
+
|
|
685
|
+
|
|
686
|
+
* - .. code::
|
|
687
|
+
|
|
688
|
+
ProtoPath
|
|
689
|
+
|
|
690
|
+
|
|
691
|
+
- The path in which to search for ``.proto`` files. The content of this element has the
|
|
692
|
+
following syntax:
|
|
693
|
+
|
|
694
|
+
.. code::
|
|
695
|
+
|
|
696
|
+
alias ; full-path
|
|
697
|
+
|
|
698
|
+
The alias provides a short identifier to use when searching for .proto files. The
|
|
699
|
+
full path is the path that is substituted for that identifier.
|
|
700
|
+
|
|
701
|
+
For example, in the sample above, ``proto-archive`` is an alias for
|
|
702
|
+
``/mnt/shared/protofiles``.
|
|
703
|
+
|
|
704
|
+
A configuration may omit the alias and simply provide the path. For example:
|
|
705
|
+
|
|
706
|
+
.. code::
|
|
707
|
+
|
|
708
|
+
;/mnt/repository/protodefs
|
|
709
|
+
|
|
710
|
+
You may specify any number of ``ProtoPath`` declarations.
|
|
711
|
+
|
|
712
|
+
* - .. code::
|
|
713
|
+
|
|
714
|
+
ProtoFile
|
|
715
|
+
|
|
716
|
+
- The name of the ``.proto`` file to use for this message type. To use an alias, prefix
|
|
717
|
+
the name of the file with the alias, as shown in the example above.
|
|
718
|
+
|
|
719
|
+
|
|
720
|
+
* - .. code::
|
|
721
|
+
|
|
722
|
+
Type
|
|
723
|
+
|
|
724
|
+
- The name of the type inside the ``.proto`` file to use for this message type. AMPS
|
|
725
|
+
requires a single type.
|
|
726
|
+
|
|
727
|
+
|
|
728
|
+
|
|
729
|
+
Filtering with Protobuf Messages
|
|
730
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
731
|
+
|
|
732
|
+
To filter protobuf messages, there are a couple of conventions you must
|
|
733
|
+
remember. AMPS XPath identifiers begin at the outermost message, so you
|
|
734
|
+
can simply use member names for that message. If you have nested
|
|
735
|
+
messages, you use the name of the nested message and the member name
|
|
736
|
+
when creating an XPath identifier.
|
|
737
|
+
|
|
738
|
+
For example, suppose you have the following definition in a
|
|
739
|
+
``.proto`` file:
|
|
740
|
+
|
|
741
|
+
.. code-block:: cpp
|
|
742
|
+
|
|
743
|
+
message person {
|
|
744
|
+
required string name = 1;
|
|
745
|
+
required int32 personID = 2;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
To access the ``personID`` data member, you simply use the name of the
|
|
749
|
+
data member as the XPath identifier. An example filter that verifies
|
|
750
|
+
that a ``personID`` is greater than 1000 would be:
|
|
751
|
+
|
|
752
|
+
.. code::
|
|
753
|
+
|
|
754
|
+
/personID > 1000
|
|
755
|
+
|
|
756
|
+
If you have nested messages, you simply provide the path to the nested
|
|
757
|
+
message you want to access.
|
|
758
|
+
|
|
759
|
+
Let's assume that the ``person`` message from the above example was
|
|
760
|
+
nested inside another message with the name of ``record``. The example
|
|
761
|
+
filter below shows how to access the nested ``person`` message, and then
|
|
762
|
+
filter to the ``personID``:
|
|
763
|
+
|
|
764
|
+
.. code::
|
|
765
|
+
|
|
766
|
+
/person/personID > 1000
|
|
767
|
+
|
|
768
|
+
In this case, the first part of the identifier (``/person``) specifies
|
|
769
|
+
the sub-message. The second part of the identifier (``/personID``)
|
|
770
|
+
specifies the field within that sub-message. Notice that, as always,
|
|
771
|
+
there is no need to specify the name of the message for the outermost
|
|
772
|
+
message.
|
|
773
|
+
|
|
774
|
+
Working with Multiple Protocol Buffer Types
|
|
775
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
776
|
+
|
|
777
|
+
Some applications require messages of different types: for example, an
|
|
778
|
+
inventory management system may work with customer records,
|
|
779
|
+
inventory records, and shipping order records.
|
|
780
|
+
|
|
781
|
+
When using protocol buffers, each of these messages would use a
|
|
782
|
+
different ``.proto`` file, and therefore would be a different
|
|
783
|
+
message type. Unlike a self-describing format such as JSON or
|
|
784
|
+
XML, the serialized form of a protocol buffer message type
|
|
785
|
+
does not automatically contain any information about the type
|
|
786
|
+
of message or the fields that the message contains. Therefore,
|
|
787
|
+
each protocol buffer message type is best considered as a
|
|
788
|
+
completely distinct type. For example, the parser created for
|
|
789
|
+
an order record and the parser created for a customer record
|
|
790
|
+
are different. Unlike self-describing formats, it is not possible
|
|
791
|
+
to use a single parser for these types, or for a parser to
|
|
792
|
+
correctly handle a previously-unknown message structure.
|
|
793
|
+
|
|
794
|
+
There are two approaches to working with multiple protocol
|
|
795
|
+
buffer types in an AMPS application:
|
|
796
|
+
|
|
797
|
+
1. Keep the message types distinct. Each message type requires
|
|
798
|
+
a separate connection to AMPS. The advantage of this approach
|
|
799
|
+
is that the ``.proto`` files can be maintained and updated
|
|
800
|
+
separately. Each connection has a distinct type and only
|
|
801
|
+
needs to handle messages of that type. The disadvantage of
|
|
802
|
+
this approach is that the application must make a connection
|
|
803
|
+
to AMPS for each type of message received.
|
|
804
|
+
|
|
805
|
+
2. Create a "container" type that can
|
|
806
|
+
*optionally* contain any of the needed message types. The
|
|
807
|
+
advantage of this approach is that this requires only a
|
|
808
|
+
single connection to AMPS. Since there is a single
|
|
809
|
+
"container" type, a topic can hold this "container" type
|
|
810
|
+
and have heterogeneous actual contents. The disadvantage
|
|
811
|
+
to this approach is that it requires a consumer to
|
|
812
|
+
understand the "container" type and changes to the
|
|
813
|
+
contained types may need to be carefully managed across
|
|
814
|
+
the consumers that use the container. A "container" type
|
|
815
|
+
is typically a ``oneof`` of the contained types.
|
|
816
|
+
|
|
817
|
+
For example, you might define a container as follows:
|
|
818
|
+
|
|
819
|
+
.. code-block:: cpp
|
|
820
|
+
|
|
821
|
+
message Container {
|
|
822
|
+
|
|
823
|
+
oneof {
|
|
824
|
+
Order order_type = 1;
|
|
825
|
+
Payment payment_type = 2;
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
message Order {
|
|
830
|
+
required string customer_id = 1;
|
|
831
|
+
...
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
message Payment {
|
|
835
|
+
required string customer_id = 1;
|
|
836
|
+
...
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
In this case, the container type will include **either** an
|
|
840
|
+
``Order`` or a ``Payment``.
|
|
841
|
+
|
|
842
|
+
|
|
843
|
+
.. _#ug-protobuf-union-types:
|
|
844
|
+
|
|
845
|
+
Union Types
|
|
846
|
+
^^^^^^^^^^^
|
|
847
|
+
|
|
848
|
+
When using a protocol buffer message type that contains a union, you can
|
|
849
|
+
navigate the union using the names defined in the top-level element. For
|
|
850
|
+
example, given the union defined below:
|
|
851
|
+
|
|
852
|
+
.. code-block:: cpp
|
|
853
|
+
|
|
854
|
+
message MyUnion {
|
|
855
|
+
optional Order order_type = 1;
|
|
856
|
+
optional Payment payment_type = 2;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
message Order {
|
|
860
|
+
required string customer_id = 1;
|
|
861
|
+
...
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
message Payment {
|
|
865
|
+
required string customer_id = 1;
|
|
866
|
+
...
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
Providing a filter of ``/order_type IS NOT NULL`` will return all of the
|
|
870
|
+
``MyUnion`` messages that contain an ``Order``, while providing a filter
|
|
871
|
+
of ``/payment_type/customer_id = '42'`` will return only the ``MyUnion``
|
|
872
|
+
messages that contain a ``Payment`` message with a ``customer_id`` of
|
|
873
|
+
``42``.
|
|
874
|
+
|
|
875
|
+
Limitations of the Protobuf Message Type
|
|
876
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
877
|
+
|
|
878
|
+
Because the ``protobuf`` message type requires a specific, fixed
|
|
879
|
+
definition for messages, AMPS does not support operations that construct
|
|
880
|
+
messages that may contain arbitrary values. In particular, protobuf does
|
|
881
|
+
not support:
|
|
882
|
+
|
|
883
|
+
- Creating a View with a ``protobuf`` type as the ``MessageType``. AMPS
|
|
884
|
+
allows you to aggregate protobuf messages and project the results as
|
|
885
|
+
another type, but the destination ``MessageType`` for a View cannot be a
|
|
886
|
+
``protobuf`` message type.
|
|
887
|
+
|
|
888
|
+
- Creating an aggregated subscription for a topic that contains messages
|
|
889
|
+
of a ``protobuf`` message type.
|
|
890
|
+
|
|
891
|
+
- Subscriptions to AMPS internal topics. Protobuf message types do not
|
|
892
|
+
support creating messages for AMPS internal topics, such as
|
|
893
|
+
``/AMPS/ClientStatus``.
|
|
894
|
+
|
|
895
|
+
- Enriching or preprocessing ``protobuf`` message types. AMPS does
|
|
896
|
+
not support enrichment or preprocessing of ``protobuf`` messages.
|
|
897
|
+
|
|
898
|
+
|
|
899
|
+
Protocol buffer version 3 messages provide fixed default values for
|
|
900
|
+
omitted fields. This means that there is no reliable way for AMPS to
|
|
901
|
+
determine if a missing field has been intentionally left out of the
|
|
902
|
+
message, or simply contains the fixed default value. The result
|
|
903
|
+
is an additional limitation for protocol buffer version 3 message types:
|
|
904
|
+
|
|
905
|
+
- Protocol buffer version 3 message types do not support delta publish
|
|
906
|
+
or delta subscribe.
|
|
907
|
+
|
|
908
|
+
Protocol buffer version 2 message types can require that specific
|
|
909
|
+
fields are provided in a message (that is, fields can be marked
|
|
910
|
+
required). The result is an additional limitation for
|
|
911
|
+
protocol buffer version 2 message types:
|
|
912
|
+
|
|
913
|
+
- Protocol buffer version 2 message types do not support providing a
|
|
914
|
+
subset of fields in a message by specifying a select list.
|
|
915
|
+
|
|
916
|
+
There are no other limitations in working with protocol buffer message
|
|
917
|
+
types.
|
|
918
|
+
|
|
919
|
+
Working with Optional Default Values
|
|
920
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
921
|
+
|
|
922
|
+
Google protocol buffers provide the ability for a message to have fields
|
|
923
|
+
that are both *optional*, so they need not be provided in the serialized
|
|
924
|
+
message, and *defaulted*, so that there is a specific value interpreted
|
|
925
|
+
when there is no value provided.
|
|
926
|
+
|
|
927
|
+
When no value is provided in the serialized message for an optional
|
|
928
|
+
default value, AMPS interprets the message differently depending on the
|
|
929
|
+
context:
|
|
930
|
+
|
|
931
|
+
- For most uses, AMPS interprets the message as though the value is
|
|
932
|
+
*present and set to the default value*. This means that you can
|
|
933
|
+
filter on optional default values, use them as SOW keys, and
|
|
934
|
+
aggregate optional default values regardless of whether a value is
|
|
935
|
+
present in the serialized message.
|
|
936
|
+
|
|
937
|
+
- For *delta messaging* with protocol buffer version 2, AMPS treats an
|
|
938
|
+
optional default value as though there is *no value present*. AMPS does
|
|
939
|
+
not provide the default value. This means that a delta update must provide
|
|
940
|
+
the default value *explicitly* in the serialized message to set the field to the
|
|
941
|
+
default value. This also means that, if the value present in the
|
|
942
|
+
message is not the default value, but was not changed on the current
|
|
943
|
+
update, AMPS will not emit that value in messages to delta
|
|
944
|
+
subscribers. (Since delta messaging is not supported with protocol
|
|
945
|
+
buffer version 3, this issue does not arise with that version.)
|
|
946
|
+
|
|
947
|
+
|
|
948
|
+
Struct Message Types
|
|
949
|
+
---------------------
|
|
950
|
+
|
|
951
|
+
AMPS includes a message type that allows the server to parse and interpret
|
|
952
|
+
binary data in a fixed format. When configuring the message type, you must
|
|
953
|
+
include a definition of the format.
|
|
954
|
+
|
|
955
|
+
This format is designed to allow AMPS to process messages serialized from
|
|
956
|
+
raw memory, such as would be specified in a C-language ``struct``.
|
|
957
|
+
|
|
958
|
+
Configuring a Struct Message Type
|
|
959
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
960
|
+
|
|
961
|
+
To configure a ``struct`` message type, you must define each field that
|
|
962
|
+
AMPS will use. This does not necessarily have to match the original definition
|
|
963
|
+
of the data. It is possible to "skip over" parts of the binary data
|
|
964
|
+
that AMPS should ignore by declaring that data to be padding.
|
|
965
|
+
|
|
966
|
+
A ``struct`` message type definition must include one or more ``Field`` elements,
|
|
967
|
+
specified in the order in which the data appears in the message. Each ``Field`` specifies
|
|
968
|
+
the name of the field, and the type and length of the data to be used for that
|
|
969
|
+
``Field``. The specifier for a field is composed of: *field name* ``=`` *data format specifier*
|
|
970
|
+
where the field name is the XPath identifier that AMPS will use for this field and the
|
|
971
|
+
data format specifier is a specifier for the type of data and number of bytes for this field.
|
|
972
|
+
|
|
973
|
+
The data format specifier is modeled after the specifiers for the Python
|
|
974
|
+
``struct`` module. The format requires a data type specifier. The data
|
|
975
|
+
type specifier may be preceded by an optional byte order specifier. For
|
|
976
|
+
variable-width data types (for example, strings), include
|
|
977
|
+
an optional byte order specifier and an optional count specifier.
|
|
978
|
+
|
|
979
|
+
The following data type specifiers are recognized by the module:
|
|
980
|
+
|
|
981
|
+
.. list-table:: *Data type specifiers*
|
|
982
|
+
:header-rows: 1
|
|
983
|
+
|
|
984
|
+
* - **Specifier**
|
|
985
|
+
|
|
986
|
+
- **C Type**
|
|
987
|
+
|
|
988
|
+
- **Size (bytes)**
|
|
989
|
+
|
|
990
|
+
- **AMPS Type**
|
|
991
|
+
|
|
992
|
+
* - ``x``
|
|
993
|
+
|
|
994
|
+
|
|
995
|
+
- *n/a*
|
|
996
|
+
|
|
997
|
+
|
|
998
|
+
- (number of
|
|
999
|
+
bytes must
|
|
1000
|
+
be specified)
|
|
1001
|
+
|
|
1002
|
+
|
|
1003
|
+
- Padding bytes, ignored by AMPS
|
|
1004
|
+
|
|
1005
|
+
|
|
1006
|
+
* - ``c``
|
|
1007
|
+
|
|
1008
|
+
|
|
1009
|
+
- ``char``
|
|
1010
|
+
|
|
1011
|
+
|
|
1012
|
+
- 1
|
|
1013
|
+
(number of bytes may
|
|
1014
|
+
be specified)
|
|
1015
|
+
|
|
1016
|
+
- string
|
|
1017
|
+
|
|
1018
|
+
|
|
1019
|
+
* - ``b``
|
|
1020
|
+
|
|
1021
|
+
|
|
1022
|
+
- ``signed char``
|
|
1023
|
+
|
|
1024
|
+
|
|
1025
|
+
- 1
|
|
1026
|
+
|
|
1027
|
+
|
|
1028
|
+
- integer
|
|
1029
|
+
|
|
1030
|
+
|
|
1031
|
+
* - ``B``
|
|
1032
|
+
|
|
1033
|
+
|
|
1034
|
+
- ``unsigned char``
|
|
1035
|
+
|
|
1036
|
+
|
|
1037
|
+
- 1
|
|
1038
|
+
|
|
1039
|
+
|
|
1040
|
+
- integer
|
|
1041
|
+
|
|
1042
|
+
|
|
1043
|
+
* - ``?``
|
|
1044
|
+
|
|
1045
|
+
|
|
1046
|
+
- ``bool``
|
|
1047
|
+
|
|
1048
|
+
(as though
|
|
1049
|
+
``stdbool.h`` were
|
|
1050
|
+
included)
|
|
1051
|
+
|
|
1052
|
+
- 1
|
|
1053
|
+
|
|
1054
|
+
|
|
1055
|
+
- boolean
|
|
1056
|
+
|
|
1057
|
+
|
|
1058
|
+
* - ``h``
|
|
1059
|
+
|
|
1060
|
+
|
|
1061
|
+
- ``short``
|
|
1062
|
+
|
|
1063
|
+
|
|
1064
|
+
- 2
|
|
1065
|
+
|
|
1066
|
+
|
|
1067
|
+
- integer
|
|
1068
|
+
|
|
1069
|
+
|
|
1070
|
+
* - ``H``
|
|
1071
|
+
|
|
1072
|
+
|
|
1073
|
+
- ``unsigned short``
|
|
1074
|
+
|
|
1075
|
+
|
|
1076
|
+
- 2
|
|
1077
|
+
|
|
1078
|
+
|
|
1079
|
+
- integer
|
|
1080
|
+
|
|
1081
|
+
|
|
1082
|
+
* - ``i``
|
|
1083
|
+
|
|
1084
|
+
- ``int``
|
|
1085
|
+
|
|
1086
|
+
- 4
|
|
1087
|
+
|
|
1088
|
+
- integer
|
|
1089
|
+
|
|
1090
|
+
* - ``I``
|
|
1091
|
+
|
|
1092
|
+
- ``unsigned int``
|
|
1093
|
+
|
|
1094
|
+
- 4
|
|
1095
|
+
|
|
1096
|
+
- integer
|
|
1097
|
+
|
|
1098
|
+
* - ``l``
|
|
1099
|
+
|
|
1100
|
+
- ``long``
|
|
1101
|
+
|
|
1102
|
+
- 4
|
|
1103
|
+
|
|
1104
|
+
- integer
|
|
1105
|
+
|
|
1106
|
+
* - ``L``
|
|
1107
|
+
|
|
1108
|
+
- ``unsigned long``
|
|
1109
|
+
|
|
1110
|
+
- 4
|
|
1111
|
+
|
|
1112
|
+
- integer
|
|
1113
|
+
|
|
1114
|
+
* - ``q``
|
|
1115
|
+
|
|
1116
|
+
- ``long long``
|
|
1117
|
+
|
|
1118
|
+
- 8
|
|
1119
|
+
|
|
1120
|
+
- integer
|
|
1121
|
+
|
|
1122
|
+
* - ``Q``
|
|
1123
|
+
|
|
1124
|
+
|
|
1125
|
+
- ``unsigned long long``
|
|
1126
|
+
|
|
1127
|
+
|
|
1128
|
+
- 8
|
|
1129
|
+
|
|
1130
|
+
|
|
1131
|
+
- integer
|
|
1132
|
+
|
|
1133
|
+
|
|
1134
|
+
* - ``n``
|
|
1135
|
+
|
|
1136
|
+
|
|
1137
|
+
- ``ssize_t``
|
|
1138
|
+
|
|
1139
|
+
|
|
1140
|
+
-
|
|
1141
|
+
|
|
1142
|
+
- integer
|
|
1143
|
+
|
|
1144
|
+
|
|
1145
|
+
* - ``N``
|
|
1146
|
+
|
|
1147
|
+
|
|
1148
|
+
- ``size_t``
|
|
1149
|
+
|
|
1150
|
+
|
|
1151
|
+
-
|
|
1152
|
+
|
|
1153
|
+
- integer
|
|
1154
|
+
|
|
1155
|
+
|
|
1156
|
+
* - ``f``
|
|
1157
|
+
|
|
1158
|
+
- ``float``
|
|
1159
|
+
|
|
1160
|
+
- 4
|
|
1161
|
+
|
|
1162
|
+
- double
|
|
1163
|
+
|
|
1164
|
+
* - ``d``
|
|
1165
|
+
|
|
1166
|
+
- ``double``
|
|
1167
|
+
|
|
1168
|
+
- 8
|
|
1169
|
+
|
|
1170
|
+
- double
|
|
1171
|
+
|
|
1172
|
+
* - ``s``
|
|
1173
|
+
|
|
1174
|
+
|
|
1175
|
+
- ``char[]``
|
|
1176
|
+
|
|
1177
|
+
|
|
1178
|
+
- Number of bytes
|
|
1179
|
+
must be specified,
|
|
1180
|
+
AMPS will interpret
|
|
1181
|
+
the specified number of
|
|
1182
|
+
bytes as the string.
|
|
1183
|
+
|
|
1184
|
+
- string
|
|
1185
|
+
|
|
1186
|
+
|
|
1187
|
+
* - ``S``
|
|
1188
|
+
|
|
1189
|
+
|
|
1190
|
+
- ``char[]``
|
|
1191
|
+
|
|
1192
|
+
|
|
1193
|
+
- Number of bytes
|
|
1194
|
+
must be specified,
|
|
1195
|
+
AMPS will interpret
|
|
1196
|
+
the string up to the
|
|
1197
|
+
first NULL character
|
|
1198
|
+
or the number of
|
|
1199
|
+
bytes specified.
|
|
1200
|
+
|
|
1201
|
+
- string
|
|
1202
|
+
|
|
1203
|
+
|
|
1204
|
+
* - ``p``
|
|
1205
|
+
|
|
1206
|
+
|
|
1207
|
+
- ``uint8_t``
|
|
1208
|
+
followed by
|
|
1209
|
+
``char[]``
|
|
1210
|
+
|
|
1211
|
+
|
|
1212
|
+
- Number of bytes
|
|
1213
|
+
must be specified.
|
|
1214
|
+
|
|
1215
|
+
AMPS will consume the
|
|
1216
|
+
number of bytes
|
|
1217
|
+
specified in the
|
|
1218
|
+
``Field`` configuration.
|
|
1219
|
+
The first byte of data
|
|
1220
|
+
specifies the length of
|
|
1221
|
+
the string. Only that
|
|
1222
|
+
number of bytes, starting
|
|
1223
|
+
with the second byte of
|
|
1224
|
+
the data, will be
|
|
1225
|
+
interpreted as the value.
|
|
1226
|
+
|
|
1227
|
+
- string
|
|
1228
|
+
|
|
1229
|
+
|
|
1230
|
+
|
|
1231
|
+
The byte order specifiers are as follows:
|
|
1232
|
+
|
|
1233
|
+
.. list-table:: *Byte order specifiers*
|
|
1234
|
+
:header-rows: 1
|
|
1235
|
+
|
|
1236
|
+
* - **Specifier**
|
|
1237
|
+
|
|
1238
|
+
- **Byte Order**
|
|
1239
|
+
|
|
1240
|
+
* - ``@``
|
|
1241
|
+
|
|
1242
|
+
|
|
1243
|
+
- Native (little-endian for AMPS server)
|
|
1244
|
+
|
|
1245
|
+
|
|
1246
|
+
* - ``=``
|
|
1247
|
+
|
|
1248
|
+
|
|
1249
|
+
- Native (little-endian for AMPS server)
|
|
1250
|
+
|
|
1251
|
+
|
|
1252
|
+
* - ``<``
|
|
1253
|
+
|
|
1254
|
+
- Little-endian
|
|
1255
|
+
|
|
1256
|
+
* - ``>``
|
|
1257
|
+
|
|
1258
|
+
- Big-endian
|
|
1259
|
+
|
|
1260
|
+
|
|
1261
|
+
If no byte order is specified, AMPS assumes a little-endian byte order to
|
|
1262
|
+
match the native byte order of the AMPS server.
|
|
1263
|
+
|
|
1264
|
+
For example, given the following C struct:
|
|
1265
|
+
|
|
1266
|
+
.. code-block:: c
|
|
1267
|
+
|
|
1268
|
+
struct data_type
|
|
1269
|
+
{
|
|
1270
|
+
int32_t id;
|
|
1271
|
+
int32_t internal_id;
|
|
1272
|
+
float price;
|
|
1273
|
+
char label[32];
|
|
1274
|
+
char code[16];
|
|
1275
|
+
char routing_instructions[32];
|
|
1276
|
+
};
|
|
1277
|
+
|
|
1278
|
+
A message type declaration that would make the `id`, `price`, and `code`
|
|
1279
|
+
members available to AMPS could be constructed as follows:
|
|
1280
|
+
|
|
1281
|
+
.. code-block:: xml
|
|
1282
|
+
|
|
1283
|
+
<MessageType>
|
|
1284
|
+
<Name>sample_struct_type</Name>
|
|
1285
|
+
<Module>struct</Module>
|
|
1286
|
+
<Field>/id = i</Field>
|
|
1287
|
+
<Field>/ignored = 4x</Field>
|
|
1288
|
+
<Field>/price = f</Field>
|
|
1289
|
+
<Field>/ignored = 32x</Field>
|
|
1290
|
+
<Field>/code = 16s</Field>
|
|
1291
|
+
</MessageType>
|
|
1292
|
+
|
|
1293
|
+
This configuration declares that the message will be interpreted as follows:
|
|
1294
|
+
|
|
1295
|
+
* The first four bytes of the message will be interpreted
|
|
1296
|
+
as a (little-endian) integer, and that value will be considered to be the `/id`
|
|
1297
|
+
field of the message.
|
|
1298
|
+
* The next four bytes are skipped as padding -- notice that,
|
|
1299
|
+
although a field name is required in the specifier syntax, padding bytes are
|
|
1300
|
+
ignored by AMPS, so there is no field named ``/ignored`` generated. However, if
|
|
1301
|
+
the message is pretty-printed (or displayed in Galvanometer), AMPS will indicate
|
|
1302
|
+
that there are padding bytes present for this field.
|
|
1303
|
+
* The next four bytes are interpreted as a (little-endian) float, and that value
|
|
1304
|
+
will be considered the value of the ``/price`` field.
|
|
1305
|
+
* The next 32 bytes (the ``label`` in the C struct) are skipped as padding. Again,
|
|
1306
|
+
if the message is pretty-printed (or displayed in Galvanometer), AMPS will indicate
|
|
1307
|
+
that there are padding bytes present for this field.
|
|
1308
|
+
* The next 16 bytes of the message are an AMPS string that will be used for the value
|
|
1309
|
+
of the ``/code`` field.
|
|
1310
|
+
* Any remaining bytes (the ``routing_instructions`` from the C struct, in this case)
|
|
1311
|
+
are ignored. If the message is pretty-printed (or displayed in Galvanometer), AMPS
|
|
1312
|
+
will indicate that there are extra bytes present.
|
|
1313
|
+
|
|
1314
|
+
Limitations of Struct Message Types
|
|
1315
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
1316
|
+
|
|
1317
|
+
Since the ``struct`` message type requires a specific, fixed
|
|
1318
|
+
definition for messages, AMPS does not support operations that
|
|
1319
|
+
construct messages that may contain arbitrary values. In
|
|
1320
|
+
particular, message types defined using the ``struct`` message type
|
|
1321
|
+
do not support:
|
|
1322
|
+
|
|
1323
|
+
* Creating a View with a ``struct`` message type as the ``MessageType``.
|
|
1324
|
+
AMPS allows you to aggregate ``struct`` message types and project the
|
|
1325
|
+
results as another message type, but the destination ``MessageType`` for
|
|
1326
|
+
a View cannot be a ``struct`` message type.
|
|
1327
|
+
|
|
1328
|
+
* Creating an aggregated subscription for a topic that contains
|
|
1329
|
+
messages of a ``struct`` message type.
|
|
1330
|
+
|
|
1331
|
+
* Subscriptions to AMPS internal topics (for example, ``/AMPS/ClientStatus``).
|
|
1332
|
+
|
|
1333
|
+
* Enriching or preprocessing messages of a ``struct`` message type.
|
|
1334
|
+
|
|
1335
|
+
* Delta publish or delta subscribe.
|
|
1336
|
+
* Select lists.
|
|
1337
|
+
|
|
1338
|
+
Loading Additional Message Types
|
|
1339
|
+
--------------------------------
|
|
1340
|
+
|
|
1341
|
+
AMPS includes the ability to load custom message types in external
|
|
1342
|
+
modules. As with all AMPS modules, custom message types are compiled
|
|
1343
|
+
into shared object files. AMPS dynamically loads these message types on
|
|
1344
|
+
startup, using the information provided in the configuration file. Once
|
|
1345
|
+
you have loaded and declared those types, you can use the type just as
|
|
1346
|
+
you use the default message types.
|
|
1347
|
+
|
|
1348
|
+
For example, the configuration below creates a message type named
|
|
1349
|
+
``custom-type`` that uses a module named ``libmy-type-module.so`` and
|
|
1350
|
+
specifies a transport for messages of that type:
|
|
1351
|
+
|
|
1352
|
+
.. code-block:: xml
|
|
1353
|
+
|
|
1354
|
+
<Modules>
|
|
1355
|
+
<Module>
|
|
1356
|
+
<!-- Specifies the name to use to refer to this module in the rest of the
|
|
1357
|
+
configuration file -->
|
|
1358
|
+
<Name>custom-type-module</Name>
|
|
1359
|
+
|
|
1360
|
+
<!-- Path to the library to load for this module. In this example, the path is a
|
|
1361
|
+
relative path below the directory where AMPS is started. -->
|
|
1362
|
+
<Library>./custom-modules/libmy-type-module.so</Library>
|
|
1363
|
+
</Module>
|
|
1364
|
+
</Modules>
|
|
1365
|
+
|
|
1366
|
+
<MessageTypes>
|
|
1367
|
+
<MessageType>
|
|
1368
|
+
<!-- The name to use for this message type in the rest of the configuration file. -->
|
|
1369
|
+
<Name>custom-type</Name>
|
|
1370
|
+
|
|
1371
|
+
<!-- Reference to the module that implements this message type, using the Name
|
|
1372
|
+
defined in the Module configuration. -->
|
|
1373
|
+
<Module>custom-type-module</Module>
|
|
1374
|
+
</MessageType>
|
|
1375
|
+
</MessageTypes>
|
|
1376
|
+
|
|
1377
|
+
<Transports>
|
|
1378
|
+
<Transport>
|
|
1379
|
+
<Name>custom-type-tcp</Name>
|
|
1380
|
+
<Type>tcp</Type>
|
|
1381
|
+
<InetAddr>9008</InetAddr>
|
|
1382
|
+
|
|
1383
|
+
<!-- The message type that this transport uses, using the Name defined in the
|
|
1384
|
+
MessageType configuration. -->
|
|
1385
|
+
<MessageType>custom-type</MessageType>
|
|
1386
|
+
<Protocol>amps</Protocol>
|
|
1387
|
+
</Transport>
|
|
1388
|
+
</Transports>
|
|
1389
|
+
|
|
1390
|
+
Once a message type has been declared, you can use it in exactly the
|
|
1391
|
+
same way you use the default message types.
|
|
1392
|
+
|
|
1393
|
+
Notice, however, that custom-developed message types may only provide
|
|
1394
|
+
support for a subset of the features of AMPS. For example, the
|
|
1395
|
+
``binary`` message type provided with AMPS does not support features
|
|
1396
|
+
that require AMPS to parse or construct a message, as described above.
|
|
1397
|
+
The developer of the message type must provide information on what
|
|
1398
|
+
capabilities the message type provides.
|