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,669 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2010-2023 60East Technologies Inc., All Rights Reserved.
|
|
4
|
+
//
|
|
5
|
+
// This computer software is owned by 60East Technologies Inc. and is
|
|
6
|
+
// protected by U.S. copyright laws and other laws and by international
|
|
7
|
+
// treaties. This computer software is furnished by 60East Technologies
|
|
8
|
+
// Inc. pursuant to a written license agreement and may be used, copied,
|
|
9
|
+
// transmitted, and stored only in accordance with the terms of such
|
|
10
|
+
// license agreement and with the inclusion of the above copyright notice.
|
|
11
|
+
// This computer software or any other copies thereof may not be provided
|
|
12
|
+
// or otherwise made available to any other person.
|
|
13
|
+
//
|
|
14
|
+
// U.S. Government Restricted Rights. This computer software: (a) was
|
|
15
|
+
// developed at private expense and is in all respects the proprietary
|
|
16
|
+
// information of 60East Technologies Inc.; (b) was not developed with
|
|
17
|
+
// government funds; (c) is a trade secret of 60East Technologies Inc.
|
|
18
|
+
// for all purposes of the Freedom of Information Act; and (d) is a
|
|
19
|
+
// commercial item and thus, pursuant to Section 12.212 of the Federal
|
|
20
|
+
// Acquisition Regulations (FAR) and DFAR Supplement Section 227.7202,
|
|
21
|
+
// Government's use, duplication or disclosure of the computer software
|
|
22
|
+
// is subject to the restrictions set forth by 60East Technologies Inc..
|
|
23
|
+
//
|
|
24
|
+
////////////////////////////////////////////////////////////////////////////
|
|
25
|
+
|
|
26
|
+
#ifndef _RINGBOOKMARKSTORE_H_
|
|
27
|
+
#define _RINGBOOKMARKSTORE_H_
|
|
28
|
+
|
|
29
|
+
#define AMPS_RING_POSITIONS 3
|
|
30
|
+
// Setting bookmark max at 6 bookmarks in a range (5 commas, open, :, and close)
|
|
31
|
+
#define AMPS_RING_BYTES_BOOKMARK (AMPS_MAX_BOOKMARK_LEN * 6 + 8)
|
|
32
|
+
#define AMPS_RING_ENTRY_SIZE 1024
|
|
33
|
+
#define AMPS_RING_BYTES_SUBID ( AMPS_RING_ENTRY_SIZE - ( AMPS_RING_POSITIONS * AMPS_RING_BYTES_BOOKMARK ) )
|
|
34
|
+
#define AMPS_RING_ENTRIES 32
|
|
35
|
+
|
|
36
|
+
#include <amps/MemoryBookmarkStore.hpp>
|
|
37
|
+
#ifdef _WIN32
|
|
38
|
+
#include <windows.h>
|
|
39
|
+
#else
|
|
40
|
+
#include <sys/mman.h>
|
|
41
|
+
#include <unistd.h>
|
|
42
|
+
#endif
|
|
43
|
+
#include <sys/types.h>
|
|
44
|
+
#include <sys/stat.h>
|
|
45
|
+
#include <fcntl.h>
|
|
46
|
+
|
|
47
|
+
#if !defined(MREMAP_MAYMOVE)
|
|
48
|
+
#define MREMAP_MAYMOVE 0
|
|
49
|
+
#endif
|
|
50
|
+
|
|
51
|
+
/// \file RingBookmarkStore.hpp
|
|
52
|
+
/// \brief Provides AMPS::RingBookmarkStore, a bookmark store that stores
|
|
53
|
+
/// only the MOST_RECENT bookmark to a file and keeps any bookmarks later
|
|
54
|
+
/// than the most recent in memory.
|
|
55
|
+
|
|
56
|
+
namespace AMPS
|
|
57
|
+
{
|
|
58
|
+
///
|
|
59
|
+
/// A BookmarkStoreImpl that stores only the MOST_RECENT bookmark to a file
|
|
60
|
+
/// for recovery and keeps any bookmarks later than most recent in memory.
|
|
61
|
+
/// This class is best used when you want permanent storage for recovery on
|
|
62
|
+
/// the client side, but expect to process all messages in order. It will not
|
|
63
|
+
/// protect you from possibly missing or duplicate bookmarks that can occur
|
|
64
|
+
/// if you are using a bookmark live subscription and you have to fail over
|
|
65
|
+
/// to another AMPS instance which receives messages in a different order.
|
|
66
|
+
/// The storage actually has 3 storage positions to allow for protection
|
|
67
|
+
/// against crashes while updating storage.
|
|
68
|
+
class RingBookmarkStore : public MemoryBookmarkStore
|
|
69
|
+
{
|
|
70
|
+
struct SubscriptionPosition
|
|
71
|
+
{
|
|
72
|
+
size_t _index;
|
|
73
|
+
size_t _current;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
public:
|
|
77
|
+
///
|
|
78
|
+
/// Create a RingBookmarkStore using fileName_ for storage of most recent.
|
|
79
|
+
/// If the file exists and has a valid bookmark, it will be recovered.
|
|
80
|
+
/// \param fileName_ The name of the file to use for storage.
|
|
81
|
+
RingBookmarkStore(const char* fileName_)
|
|
82
|
+
: MemoryBookmarkStore(), _fileSize(0), _currentIndex(0), _log(0)
|
|
83
|
+
#ifdef _WIN32
|
|
84
|
+
, _file(INVALID_HANDLE_VALUE), _mapFile(INVALID_HANDLE_VALUE)
|
|
85
|
+
#else
|
|
86
|
+
, _fd(0)
|
|
87
|
+
#endif
|
|
88
|
+
, _ringRecovering(true)
|
|
89
|
+
{
|
|
90
|
+
init(fileName_);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
RingBookmarkStore(const std::string& fileName_)
|
|
94
|
+
: MemoryBookmarkStore(), _fileSize(0), _currentIndex(0), _log(0)
|
|
95
|
+
#ifdef _WIN32
|
|
96
|
+
, _file(INVALID_HANDLE_VALUE), _mapFile(INVALID_HANDLE_VALUE)
|
|
97
|
+
#else
|
|
98
|
+
, _fd(0)
|
|
99
|
+
#endif
|
|
100
|
+
, _ringRecovering(true)
|
|
101
|
+
{
|
|
102
|
+
init(fileName_.c_str());
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
virtual ~RingBookmarkStore()
|
|
106
|
+
{
|
|
107
|
+
#ifdef _WIN32
|
|
108
|
+
UnmapViewOfFile(_log);
|
|
109
|
+
_log = 0;
|
|
110
|
+
CloseHandle(_mapFile);
|
|
111
|
+
_mapFile = INVALID_HANDLE_VALUE;
|
|
112
|
+
CloseHandle(_file);
|
|
113
|
+
_file = INVALID_HANDLE_VALUE;
|
|
114
|
+
#else
|
|
115
|
+
munmap(_log, _fileSize);
|
|
116
|
+
_log = 0;
|
|
117
|
+
close(_fd);
|
|
118
|
+
_fd = 0;
|
|
119
|
+
#endif
|
|
120
|
+
// In case _lock gets acquired by reader thread between end of this
|
|
121
|
+
// destructor and start of base class destructor, prevent write()
|
|
122
|
+
_ringRecovering = true;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
///
|
|
126
|
+
/// Return the corresponding sequence number for this bookmark.
|
|
127
|
+
/// \param message_ The Message to check.
|
|
128
|
+
///
|
|
129
|
+
virtual size_t log(Message& message_)
|
|
130
|
+
{
|
|
131
|
+
Lock<Mutex> guard(_lock);
|
|
132
|
+
size_t ret = MemoryBookmarkStore::_log(message_);
|
|
133
|
+
if (BookmarkRange::isRange(message_.getBookmark()))
|
|
134
|
+
{
|
|
135
|
+
Message::Field subId = message_.getSubscriptionId();
|
|
136
|
+
if (subId.empty())
|
|
137
|
+
{
|
|
138
|
+
subId = message_.getSubscriptionIds();
|
|
139
|
+
}
|
|
140
|
+
write(subId, MemoryBookmarkStore::_getMostRecent(subId, false));
|
|
141
|
+
}
|
|
142
|
+
return ret;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
///
|
|
146
|
+
/// Log a discard-bookmark entry to the persistent log
|
|
147
|
+
/// based on a bookmark sequence number.
|
|
148
|
+
/// \param message_ The Message to discard.
|
|
149
|
+
///
|
|
150
|
+
virtual void discard(const Message& message_)
|
|
151
|
+
{
|
|
152
|
+
Lock<Mutex> guard(_lock);
|
|
153
|
+
if (MemoryBookmarkStore::_discard(message_) && _recentChanged)
|
|
154
|
+
{
|
|
155
|
+
Message::Field subId = message_.getSubscriptionId();
|
|
156
|
+
if (subId.empty())
|
|
157
|
+
{
|
|
158
|
+
subId = message_.getSubscriptionIds();
|
|
159
|
+
}
|
|
160
|
+
write(subId, MemoryBookmarkStore::_getMostRecent(subId, false));
|
|
161
|
+
_recentChanged = false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
///
|
|
166
|
+
/// Log a discard-bookmark entry to the persistent log
|
|
167
|
+
/// based on a bookmark sequence number. Use the \ref discard(const Message&)
|
|
168
|
+
/// function instead when you have the full Message object available..
|
|
169
|
+
/// \param subId_ The id of the subscription to which the bookmark applies.
|
|
170
|
+
/// \param bookmarkSeqNo_ The bookmark sequence number to discard.
|
|
171
|
+
///
|
|
172
|
+
virtual void discard(const Message::Field& subId_, size_t bookmarkSeqNo_)
|
|
173
|
+
{
|
|
174
|
+
Lock<Mutex> guard(_lock);
|
|
175
|
+
if (MemoryBookmarkStore::_discard(subId_, bookmarkSeqNo_)
|
|
176
|
+
&& _recentChanged)
|
|
177
|
+
{
|
|
178
|
+
write(subId_, MemoryBookmarkStore::_getMostRecent(subId_, false));
|
|
179
|
+
_recentChanged = false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
///
|
|
184
|
+
/// Mark the bookmark provided as replicated to all sync replication
|
|
185
|
+
/// destinations for the given subscription.
|
|
186
|
+
/// \param subId_ The subscription Id to which the bookmark applies.
|
|
187
|
+
/// \param bookmark_ The most recent replicated bookmark.
|
|
188
|
+
virtual void persisted(const Message::Field& subId_,
|
|
189
|
+
const Message::Field& bookmark_)
|
|
190
|
+
{
|
|
191
|
+
Lock<Mutex> guard(_lock);
|
|
192
|
+
MemoryBookmarkStore::_persisted(find(subId_), bookmark_);
|
|
193
|
+
if (_recentChanged)
|
|
194
|
+
{
|
|
195
|
+
write(subId_, MemoryBookmarkStore::_getMostRecent(subId_, false));
|
|
196
|
+
_recentChanged = false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
///
|
|
201
|
+
/// Returns the most recent bookmark from the log that
|
|
202
|
+
/// ought to be used for (re-)subscriptions.
|
|
203
|
+
/// \param subId_ The id of the subscription to check.
|
|
204
|
+
///
|
|
205
|
+
virtual Message::Field getMostRecent(const Message::Field& subId_)
|
|
206
|
+
{
|
|
207
|
+
Lock<Mutex> guard(_lock);
|
|
208
|
+
return MemoryBookmarkStore::_getMostRecent(subId_);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
///
|
|
212
|
+
/// Called to purge the contents of this store.
|
|
213
|
+
/// Removes any tracking history associated with publishers and received
|
|
214
|
+
/// messages, and may delete or truncate on-disk representations as well.
|
|
215
|
+
///
|
|
216
|
+
virtual void purge()
|
|
217
|
+
{
|
|
218
|
+
Lock<Mutex> guard(_lock);
|
|
219
|
+
_positionMap.clear();
|
|
220
|
+
memset(_log, 0, _fileSize);
|
|
221
|
+
MemoryBookmarkStore::_purge();
|
|
222
|
+
_currentIndex = 0;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
///
|
|
226
|
+
/// Called to purge the contents of this store for particular subId.
|
|
227
|
+
/// Removes any tracking history associated with publishers and received
|
|
228
|
+
/// messages, and will remove the subId from the file as well.
|
|
229
|
+
///
|
|
230
|
+
virtual void purge(const Message::Field& subId_)
|
|
231
|
+
{
|
|
232
|
+
Lock<Mutex> guard(_lock);
|
|
233
|
+
Lock<Mutex> fileGuard(_fileLock);
|
|
234
|
+
Lock<Mutex> posGuard(_posLock);
|
|
235
|
+
if (_positionMap.count(subId_) == 0)
|
|
236
|
+
{
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
// Remove from memory
|
|
240
|
+
MemoryBookmarkStore::_purge(subId_);
|
|
241
|
+
// Remove from the file
|
|
242
|
+
SubscriptionPosition pos = _positionMap[subId_];
|
|
243
|
+
memset(_log + (pos._index * AMPS_RING_ENTRY_SIZE), 0,
|
|
244
|
+
AMPS_RING_ENTRY_SIZE);
|
|
245
|
+
// Move any following subs back an index
|
|
246
|
+
Message::Field sub;
|
|
247
|
+
for (size_t index = pos._index; index < _currentIndex - 1; ++index)
|
|
248
|
+
{
|
|
249
|
+
char* start = _log + (index * AMPS_RING_ENTRY_SIZE);
|
|
250
|
+
memcpy(start, start + AMPS_RING_ENTRY_SIZE, AMPS_RING_ENTRY_SIZE);
|
|
251
|
+
char* end = (char*)memchr(start, '\0', AMPS_RING_BYTES_SUBID);
|
|
252
|
+
if (!end)
|
|
253
|
+
{
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
sub.assign(start, (size_t)(end - start));
|
|
257
|
+
_positionMap[sub]._index = index;
|
|
258
|
+
}
|
|
259
|
+
_positionMap.erase(subId_);
|
|
260
|
+
// We have one less sub
|
|
261
|
+
--_currentIndex;
|
|
262
|
+
// Clear the end
|
|
263
|
+
memset(_log + (_currentIndex * AMPS_RING_ENTRY_SIZE), 0,
|
|
264
|
+
AMPS_RING_ENTRY_SIZE);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
private:
|
|
268
|
+
void init(const char* fileName_)
|
|
269
|
+
{
|
|
270
|
+
#ifdef _WIN32
|
|
271
|
+
_file = CreateFileA(fileName_, GENERIC_READ | GENERIC_WRITE, 0,
|
|
272
|
+
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
273
|
+
if ( _file == INVALID_HANDLE_VALUE )
|
|
274
|
+
{
|
|
275
|
+
DWORD err = getErrorNo();
|
|
276
|
+
std::ostringstream os;
|
|
277
|
+
os << "Failed to create file " << fileName_ << " for RingBookmarkStore\n";
|
|
278
|
+
error(os.str(), err);
|
|
279
|
+
}
|
|
280
|
+
LARGE_INTEGER liFileSize;
|
|
281
|
+
if (GetFileSizeEx(_file, &liFileSize) == 0)
|
|
282
|
+
{
|
|
283
|
+
error("Failure getting file size for RingBookmarkStore.", getErrorNo());
|
|
284
|
+
}
|
|
285
|
+
DWORD fsLow = liFileSize.LowPart;
|
|
286
|
+
DWORD fsHigh = liFileSize.HighPart;
|
|
287
|
+
#ifdef _WIN64
|
|
288
|
+
size_t fileSize = liFileSize.QuadPart;
|
|
289
|
+
#else
|
|
290
|
+
size_t fileSize = liFileSize.LowPart;
|
|
291
|
+
#endif
|
|
292
|
+
size_t existingSize = AMPS_RING_ENTRIES * AMPS_RING_ENTRY_SIZE;
|
|
293
|
+
if (existingSize > fileSize)
|
|
294
|
+
{
|
|
295
|
+
fsLow = (DWORD)existingSize;
|
|
296
|
+
#ifdef _WIN64
|
|
297
|
+
fsHigh = (DWORD)(existingSize >> 32);
|
|
298
|
+
#endif
|
|
299
|
+
}
|
|
300
|
+
setFileSize(fsHigh, fsLow);
|
|
301
|
+
#else
|
|
302
|
+
_fd = open(fileName_, O_RDWR | O_CREAT, (mode_t)0644);
|
|
303
|
+
if (_fd == -1)
|
|
304
|
+
{
|
|
305
|
+
int err = getErrorNo();
|
|
306
|
+
std::ostringstream os;
|
|
307
|
+
os << "Failed to open log file " << fileName_ << " for RingBookmarkStore";
|
|
308
|
+
error(os.str(), err);
|
|
309
|
+
}
|
|
310
|
+
struct stat statBuf;
|
|
311
|
+
if (fstat(_fd, &statBuf) == -1)
|
|
312
|
+
{
|
|
313
|
+
int err = getErrorNo();
|
|
314
|
+
std::ostringstream os;
|
|
315
|
+
os << "Failed to stat log file " << fileName_ << " for RingBookmarkStore";
|
|
316
|
+
error(os.str(), err);
|
|
317
|
+
}
|
|
318
|
+
size_t fSize = (size_t)statBuf.st_size;
|
|
319
|
+
if (fSize == 0)
|
|
320
|
+
if (::write(_fd, "\0\0\0\0", 4) != 4)
|
|
321
|
+
{
|
|
322
|
+
error("Failed to initialize empty file.", getErrorNo());
|
|
323
|
+
}
|
|
324
|
+
setFileSize((fSize > AMPS_RING_ENTRIES * AMPS_RING_ENTRY_SIZE ?
|
|
325
|
+
fSize - 1 : AMPS_RING_ENTRIES * AMPS_RING_ENTRY_SIZE));
|
|
326
|
+
#endif
|
|
327
|
+
recover();
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
#ifdef _WIN32
|
|
331
|
+
DWORD getErrorNo() const
|
|
332
|
+
{
|
|
333
|
+
return GetLastError();
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
void error(const std::string& message_, DWORD err)
|
|
337
|
+
{
|
|
338
|
+
std::ostringstream os;
|
|
339
|
+
static const DWORD msgSize = 2048;
|
|
340
|
+
char pMsg[msgSize];
|
|
341
|
+
DWORD sz = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |
|
|
342
|
+
FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
|
343
|
+
NULL, err, LANG_NEUTRAL,
|
|
344
|
+
pMsg, msgSize, NULL);
|
|
345
|
+
os << message_ << ". Error is " << pMsg;
|
|
346
|
+
throw StoreException(os.str());
|
|
347
|
+
}
|
|
348
|
+
#else
|
|
349
|
+
int getErrorNo() const
|
|
350
|
+
{
|
|
351
|
+
return errno;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
void error(const std::string& message_, int err)
|
|
355
|
+
{
|
|
356
|
+
std::ostringstream os;
|
|
357
|
+
os << message_ << ". Error is " << strerror(err);
|
|
358
|
+
throw StoreException(os.str());
|
|
359
|
+
}
|
|
360
|
+
#endif
|
|
361
|
+
|
|
362
|
+
// Used to log the new _mostRecent bookmark
|
|
363
|
+
void write(const Message::Field& subId_,
|
|
364
|
+
const Message::Field& bookmark_)
|
|
365
|
+
{
|
|
366
|
+
Lock<Mutex> guard(_fileLock);
|
|
367
|
+
if ( !_ringRecovering)
|
|
368
|
+
{
|
|
369
|
+
if (bookmark_.len() > AMPS_RING_BYTES_BOOKMARK)
|
|
370
|
+
{
|
|
371
|
+
throw StoreException("Bookmark is too large for fixed size storage. Consider rebuilding after changing AMPS_RING_BYTES_BOOKMARK in include/RingBookmarkStore.hpp");
|
|
372
|
+
}
|
|
373
|
+
SubscriptionPosition& pos = findPos(subId_);
|
|
374
|
+
size_t nextPos = (pos._current + 1) % AMPS_RING_POSITIONS;
|
|
375
|
+
// Get pointer to start of next position for cursor
|
|
376
|
+
char* offset = _log + (pos._index * AMPS_RING_ENTRY_SIZE) + AMPS_RING_BYTES_SUBID + (nextPos * AMPS_RING_BYTES_BOOKMARK);
|
|
377
|
+
// Write the 'cursor' to start of following entry and advance offset
|
|
378
|
+
*offset = '*';
|
|
379
|
+
// Change offset to beginning of current bookmark
|
|
380
|
+
offset = _log + ((pos._index * AMPS_RING_ENTRY_SIZE) + AMPS_RING_BYTES_SUBID + (pos._current * AMPS_RING_BYTES_BOOKMARK) + 1);
|
|
381
|
+
size_t len = bookmark_.len();
|
|
382
|
+
// Write the bookmark and advance offset
|
|
383
|
+
memcpy(offset, static_cast<const void*>(bookmark_.data()), len);
|
|
384
|
+
offset += len;
|
|
385
|
+
// Set extra bytes to NULL
|
|
386
|
+
memset(offset, 0, AMPS_RING_BYTES_BOOKMARK - (len + 2));
|
|
387
|
+
// Return to beginning and change the cursor
|
|
388
|
+
offset = offset - len - 1;
|
|
389
|
+
*offset = '+';
|
|
390
|
+
// Update current for the next write
|
|
391
|
+
pos._current = nextPos;
|
|
392
|
+
|
|
393
|
+
// Sync the changes to disk
|
|
394
|
+
#ifdef _WIN32
|
|
395
|
+
#ifdef _WIN64
|
|
396
|
+
size_t syncStart = (pos._index * AMPS_RING_ENTRY_SIZE) & ~((getPageSize() - 1) & 0xFFFFFFFFFFFFFFFF);
|
|
397
|
+
#else
|
|
398
|
+
size_t syncStart = (pos._index * AMPS_RING_ENTRY_SIZE) & (size_t)~(getPageSize() - 1);
|
|
399
|
+
#endif
|
|
400
|
+
if (!FlushViewOfFile(_log + syncStart, (pos._index * AMPS_RING_ENTRY_SIZE) - syncStart + AMPS_RING_ENTRY_SIZE))
|
|
401
|
+
#else
|
|
402
|
+
size_t syncStart = (pos._index * AMPS_RING_ENTRY_SIZE) & ~(getPageSize() - 1);
|
|
403
|
+
if (msync(_log + syncStart, (pos._index * AMPS_RING_ENTRY_SIZE) - syncStart + AMPS_RING_ENTRY_SIZE, MS_ASYNC) != 0)
|
|
404
|
+
#endif
|
|
405
|
+
{
|
|
406
|
+
error("Failed to sync mapped memory", getErrorNo());
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
#ifdef _WIN32
|
|
412
|
+
void setFileSize(DWORD newSizeHigh_, DWORD newSizeLow_)
|
|
413
|
+
{
|
|
414
|
+
bool remap = (_mapFile && _mapFile != INVALID_HANDLE_VALUE);
|
|
415
|
+
if (remap)
|
|
416
|
+
{
|
|
417
|
+
UnmapViewOfFile(_log);
|
|
418
|
+
CloseHandle(_mapFile);
|
|
419
|
+
_positionMap.clear();
|
|
420
|
+
}
|
|
421
|
+
_mapFile = CreateFileMappingA( _file, NULL, PAGE_READWRITE, newSizeHigh_, newSizeLow_, NULL);
|
|
422
|
+
if (_mapFile == NULL || _mapFile == INVALID_HANDLE_VALUE)
|
|
423
|
+
{
|
|
424
|
+
error("Failed to create map of log file", getErrorNo());
|
|
425
|
+
_log = 0;
|
|
426
|
+
_fileSize = 0;
|
|
427
|
+
}
|
|
428
|
+
#ifdef _WIN64
|
|
429
|
+
size_t sz = ((size_t)newSizeHigh_ << 32) | (size_t)newSizeLow_;
|
|
430
|
+
#else
|
|
431
|
+
size_t sz = (size_t)newSizeLow_;
|
|
432
|
+
#endif
|
|
433
|
+
_log = (char*)MapViewOfFile(_mapFile, FILE_MAP_ALL_ACCESS, 0, 0, sz);
|
|
434
|
+
if (_log == NULL)
|
|
435
|
+
{
|
|
436
|
+
error("Failed to map log file to memory", getErrorNo());
|
|
437
|
+
_log = 0;
|
|
438
|
+
_fileSize = 0;
|
|
439
|
+
return;
|
|
440
|
+
}
|
|
441
|
+
_fileSize = sz;
|
|
442
|
+
// Call recover to reset the _positionMap
|
|
443
|
+
if (remap)
|
|
444
|
+
{
|
|
445
|
+
recover();
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
#else
|
|
449
|
+
void setFileSize(size_t newSize_)
|
|
450
|
+
{
|
|
451
|
+
bool remap = (_log != 0);
|
|
452
|
+
// Make sure we're using a multiple of page size
|
|
453
|
+
size_t sz = newSize_ & (size_t)(~(getPageSize() - 1));
|
|
454
|
+
if (sz < newSize_)
|
|
455
|
+
{
|
|
456
|
+
sz += getPageSize();
|
|
457
|
+
}
|
|
458
|
+
// Improper resize attempt
|
|
459
|
+
if (newSize_ <= _fileSize)
|
|
460
|
+
{
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
// Extend the underlying file
|
|
464
|
+
if (lseek(_fd, (off_t)sz, SEEK_SET) == -1)
|
|
465
|
+
{
|
|
466
|
+
error("Seek failed for RingBookmarkStore", getErrorNo());
|
|
467
|
+
}
|
|
468
|
+
if (::write(_fd, "", 1) == -1)
|
|
469
|
+
{
|
|
470
|
+
error("Failed to grow RingBookmarkStore", getErrorNo());
|
|
471
|
+
}
|
|
472
|
+
void* newLog = MAP_FAILED;
|
|
473
|
+
if (_log)
|
|
474
|
+
{
|
|
475
|
+
_positionMap.clear();
|
|
476
|
+
|
|
477
|
+
#ifdef linux
|
|
478
|
+
newLog = (mremap(_log, _fileSize, sz, MREMAP_MAYMOVE));
|
|
479
|
+
#else
|
|
480
|
+
// try making a new mmap right after the current one.
|
|
481
|
+
newLog = mmap(_log + _fileSize, sz, PROT_READ | PROT_WRITE,
|
|
482
|
+
MAP_SHARED | MAP_FIXED, _fd, (off_t)sz);
|
|
483
|
+
if (newLog != _log)
|
|
484
|
+
{
|
|
485
|
+
// this mmap is relatively small; better to just close the old mmap and reset.
|
|
486
|
+
munmap(_log, _fileSize);
|
|
487
|
+
newLog = mmap(0, sz, PROT_READ | PROT_WRITE, MAP_SHARED, _fd, 0);
|
|
488
|
+
}
|
|
489
|
+
#endif
|
|
490
|
+
}
|
|
491
|
+
else // New mapping
|
|
492
|
+
{
|
|
493
|
+
// New mapping, map the full file size for recovery or else it std size
|
|
494
|
+
newLog = (mmap(0, sz, PROT_READ | PROT_WRITE, MAP_SHARED, _fd, 0));
|
|
495
|
+
}
|
|
496
|
+
_fileSize = sz;
|
|
497
|
+
|
|
498
|
+
if (newLog == MAP_FAILED)
|
|
499
|
+
{
|
|
500
|
+
_log = 0;
|
|
501
|
+
_fileSize = 0;
|
|
502
|
+
error("Failed to map log file to memory", getErrorNo());
|
|
503
|
+
}
|
|
504
|
+
_log = static_cast<char*>(newLog);
|
|
505
|
+
if (remap)
|
|
506
|
+
{
|
|
507
|
+
recover();
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
#endif
|
|
511
|
+
|
|
512
|
+
void recover(void)
|
|
513
|
+
{
|
|
514
|
+
//Lock<Mutex> guard(_lock);
|
|
515
|
+
_ringRecovering = true;
|
|
516
|
+
Message::Field sub;
|
|
517
|
+
Message::Field bookmarkField;
|
|
518
|
+
|
|
519
|
+
_currentIndex = 0;
|
|
520
|
+
size_t maxEntries = _fileSize / AMPS_RING_ENTRY_SIZE > AMPS_RING_ENTRIES ? _fileSize / AMPS_RING_ENTRY_SIZE : AMPS_RING_ENTRIES;
|
|
521
|
+
for (; _currentIndex < maxEntries; ++_currentIndex)
|
|
522
|
+
{
|
|
523
|
+
char* offset = _log + (_currentIndex * AMPS_RING_ENTRY_SIZE);
|
|
524
|
+
if (*offset == '\0')
|
|
525
|
+
{
|
|
526
|
+
break;
|
|
527
|
+
}
|
|
528
|
+
//It's possible we wrote the subId and not NULLs, so be careful
|
|
529
|
+
char* end = (char*)memchr(offset, '\0', AMPS_RING_BYTES_SUBID);
|
|
530
|
+
if (!end)
|
|
531
|
+
{
|
|
532
|
+
// Failed subscription id read, we're done
|
|
533
|
+
break;
|
|
534
|
+
}
|
|
535
|
+
// Safe to continue
|
|
536
|
+
sub.assign(offset, (size_t)(end - offset));
|
|
537
|
+
// Put this sub into the MemoryBookmarkStore
|
|
538
|
+
Subscription* subPtr = MemoryBookmarkStore::find(sub);
|
|
539
|
+
// Put this sub into the _positionMap
|
|
540
|
+
// This is recovery, so do it directly and not with findPos
|
|
541
|
+
SubscriptionPosition& pos = _positionMap[sub];
|
|
542
|
+
pos._index = _currentIndex;
|
|
543
|
+
offset += AMPS_RING_BYTES_SUBID;
|
|
544
|
+
size_t foundCursor = AMPS_RING_POSITIONS;
|
|
545
|
+
for (pos._current = 0; pos._current < AMPS_RING_POSITIONS; pos._current++)
|
|
546
|
+
{
|
|
547
|
+
if (offset[pos._current * AMPS_RING_BYTES_BOOKMARK] == '*')
|
|
548
|
+
{
|
|
549
|
+
// Subtract one position
|
|
550
|
+
pos._current = (pos._current + (AMPS_RING_POSITIONS - 1)) % AMPS_RING_POSITIONS;
|
|
551
|
+
// Subtract one more if a second bookmark is found
|
|
552
|
+
if (offset[foundCursor * AMPS_RING_BYTES_BOOKMARK] == '*')
|
|
553
|
+
{
|
|
554
|
+
pos._current = (pos._current + (AMPS_RING_POSITIONS - 1)) % AMPS_RING_POSITIONS;
|
|
555
|
+
}
|
|
556
|
+
break;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
if (pos._current >= AMPS_RING_POSITIONS)
|
|
560
|
+
{
|
|
561
|
+
// No valid bookmark found, just use 0
|
|
562
|
+
pos._current = 0;
|
|
563
|
+
}
|
|
564
|
+
else
|
|
565
|
+
{
|
|
566
|
+
// We found a cursor
|
|
567
|
+
offset += pos._current * AMPS_RING_BYTES_BOOKMARK;
|
|
568
|
+
//It's possible we wrote bookmark and not NULLs, so be careful
|
|
569
|
+
end = (char*)memchr(offset, '\0', AMPS_RING_BYTES_BOOKMARK);
|
|
570
|
+
if (end && end != offset)
|
|
571
|
+
{
|
|
572
|
+
// add 1 to account for leading '+'
|
|
573
|
+
bookmarkField.assign(offset + 1, (size_t)(end - offset - 1));
|
|
574
|
+
// log, discard to make it the most recent
|
|
575
|
+
if (!BookmarkRange::isRange(bookmarkField))
|
|
576
|
+
{
|
|
577
|
+
// This adds bookmark to _publishers
|
|
578
|
+
subPtr->isDiscarded(bookmarkField);
|
|
579
|
+
subPtr->discard(subPtr->log(bookmarkField));
|
|
580
|
+
}
|
|
581
|
+
else
|
|
582
|
+
{
|
|
583
|
+
subPtr->log(bookmarkField);
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
_ringRecovering = false;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
SubscriptionPosition& findPos(const Message::Field& subId_)
|
|
592
|
+
{
|
|
593
|
+
Lock<Mutex> guard(_posLock);
|
|
594
|
+
if (_positionMap.count(subId_) == 0)
|
|
595
|
+
{
|
|
596
|
+
// New subid
|
|
597
|
+
// Move to its start position and write the sub id
|
|
598
|
+
char* offset = _log + (_currentIndex * AMPS_RING_ENTRY_SIZE);
|
|
599
|
+
size_t len = subId_.len();
|
|
600
|
+
memcpy(offset, static_cast<const void*>(subId_.data()), len);
|
|
601
|
+
// Add it to the map with the current index
|
|
602
|
+
// Use the data written to the mmap for the subid
|
|
603
|
+
Message::Field subId;
|
|
604
|
+
subId.assign(offset, len);
|
|
605
|
+
_positionMap[subId]._index = _currentIndex;
|
|
606
|
+
_positionMap[subId]._current = 0;
|
|
607
|
+
// Fill extra spaces with NULL
|
|
608
|
+
offset += len;
|
|
609
|
+
memset(offset, 0, AMPS_RING_BYTES_SUBID - len);
|
|
610
|
+
// Advance current index
|
|
611
|
+
++_currentIndex;
|
|
612
|
+
}
|
|
613
|
+
return _positionMap[subId_];
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
Subscription* find(const Message::Field& subId_)
|
|
617
|
+
{
|
|
618
|
+
if (subId_.empty())
|
|
619
|
+
{
|
|
620
|
+
throw StoreException("A valid subscription ID must be provided to the RingBookmarkStore");
|
|
621
|
+
}
|
|
622
|
+
findPos(subId_);
|
|
623
|
+
return MemoryBookmarkStore::find(subId_);
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
|
|
627
|
+
Mutex _fileLock;
|
|
628
|
+
size_t _fileSize;
|
|
629
|
+
size_t _currentIndex;
|
|
630
|
+
char* _log;
|
|
631
|
+
#ifdef _WIN32
|
|
632
|
+
HANDLE _file;
|
|
633
|
+
HANDLE _mapFile;
|
|
634
|
+
#else
|
|
635
|
+
int _fd;
|
|
636
|
+
#endif
|
|
637
|
+
Mutex _posLock;
|
|
638
|
+
typedef std::map<Message::Field, SubscriptionPosition, Message::Field::FieldHash> PositionMap;
|
|
639
|
+
PositionMap _positionMap;
|
|
640
|
+
bool _ringRecovering;
|
|
641
|
+
#ifdef _WIN32
|
|
642
|
+
static DWORD getPageSize()
|
|
643
|
+
{
|
|
644
|
+
static DWORD pageSize = 0;
|
|
645
|
+
if (pageSize == 0)
|
|
646
|
+
{
|
|
647
|
+
SYSTEM_INFO SYS_INFO;
|
|
648
|
+
GetSystemInfo(&SYS_INFO);
|
|
649
|
+
pageSize = SYS_INFO.dwPageSize;
|
|
650
|
+
#else
|
|
651
|
+
static size_t getPageSize()
|
|
652
|
+
{
|
|
653
|
+
static size_t pageSize = 0UL;
|
|
654
|
+
if (pageSize == 0)
|
|
655
|
+
{
|
|
656
|
+
pageSize = (size_t)sysconf(_SC_PAGESIZE);
|
|
657
|
+
#endif
|
|
658
|
+
}
|
|
659
|
+
return pageSize;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
} // end namespace AMPS
|
|
666
|
+
|
|
667
|
+
|
|
668
|
+
#endif // _RINGBOOKMARKSTORE_H_
|
|
669
|
+
|