amps-python-client 5.3.4.1__zip → 5.3.4.2__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.
Files changed (917) hide show
  1. amps-python-client-5.3.4.2/PKG-INFO +112 -0
  2. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/ack-messages.doctree +0 -0
  3. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/content-messages.doctree +0 -0
  4. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/intro.doctree +0 -0
  5. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/logon.doctree +0 -0
  6. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/protocol-reference.doctree +0 -0
  7. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/publishing.doctree +0 -0
  8. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/query-delimiters.doctree +0 -0
  9. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/query-subscribe.doctree +0 -0
  10. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/removing.doctree +0 -0
  11. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/utilities.doctree +0 -0
  12. amps-python-client-5.3.4.2/docs/command-reference/doctrees/environment.pickle +0 -0
  13. amps-python-client-5.3.4.2/docs/command-reference/doctrees/index.doctree +0 -0
  14. amps-python-client-5.3.4.2/docs/command-reference/html/.buildinfo +4 -0
  15. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/ack-messages.rst.txt +8 -0
  16. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/content-messages.rst.txt +8 -0
  17. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/intro.rst.txt +8 -0
  18. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/logon.rst.txt +8 -0
  19. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/protocol-reference.rst.txt +8 -0
  20. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/publishing.rst.txt +8 -0
  21. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/query-delimiters.rst.txt +8 -0
  22. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/query-subscribe.rst.txt +8 -0
  23. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/removing.rst.txt +8 -0
  24. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/utilities.rst.txt +8 -0
  25. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/index.rst.txt +36 -0
  26. amps-python-client-5.3.4.2/docs/command-reference/html/_static/custom.css +161 -0
  27. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/ack-messages.html +95 -0
  28. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/content-messages.html +95 -0
  29. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/intro.html +95 -0
  30. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/logon.html +95 -0
  31. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/protocol-reference.html +93 -0
  32. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/publishing.html +95 -0
  33. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/query-delimiters.html +95 -0
  34. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/query-subscribe.html +95 -0
  35. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/removing.html +95 -0
  36. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/utilities.html +95 -0
  37. amps-python-client-5.3.4.2/docs/command-reference/html/genindex.html +97 -0
  38. amps-python-client-5.3.4.2/docs/command-reference/html/index.html +98 -0
  39. amps-python-client-5.3.4.2/docs/command-reference/html/objects.inv +6 -0
  40. amps-python-client-5.3.4.2/docs/command-reference/html/search.html +107 -0
  41. amps-python-client-5.3.4.2/docs/command-reference/html/searchindex.js +1 -0
  42. amps-python-client-5.3.4.2/docs/html/.buildinfo +4 -0
  43. amps-python-client-5.3.4.2/docs/html/code.html +6616 -0
  44. amps-python-client-5.3.4.2/docs/html/genindex.html +1363 -0
  45. amps-python-client-5.3.4.2/docs/html/index.html +131 -0
  46. amps-python-client-5.3.4.2/docs/html/objects.inv +0 -0
  47. amps-python-client-5.3.4.2/docs/html/py-modindex.html +111 -0
  48. amps-python-client-5.3.4.2/docs/html/search.html +107 -0
  49. amps-python-client-5.3.4.2/docs/html/searchindex.js +1 -0
  50. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/advanced-topics.doctree +0 -0
  51. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/cpp-compiler-list.doctree +0 -0
  52. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/cpp-feature-table.doctree +0 -0
  53. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/creating-commands.doctree +0 -0
  54. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/deltas.doctree +0 -0
  55. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/error-handling.doctree +0 -0
  56. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/exceptions.doctree +0 -0
  57. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/first-program.doctree +0 -0
  58. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/high-availability.doctree +0 -0
  59. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/installing.doctree +0 -0
  60. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/introduction.doctree +0 -0
  61. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/moving-from-python-lite.doctree +0 -0
  62. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/performance-tips.doctree +0 -0
  63. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/queues.doctree +0 -0
  64. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/sow.doctree +0 -0
  65. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/subscriptions.doctree +0 -0
  66. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/utilities.doctree +0 -0
  67. amps-python-client-5.3.4.2/docs/python/doctrees/environment.pickle +0 -0
  68. amps-python-client-5.3.4.2/docs/python/doctrees/index.doctree +0 -0
  69. amps-python-client-5.3.4.2/docs/python/html/.buildinfo +4 -0
  70. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/advanced-topics.rst.txt +398 -0
  71. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/cpp-feature-table.rst.txt +26 -0
  72. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/creating-commands.rst.txt +159 -0
  73. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/deltas.rst.txt +79 -0
  74. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/error-handling.rst.txt +481 -0
  75. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/exceptions.rst.txt +123 -0
  76. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/first-program.rst.txt +168 -0
  77. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/high-availability.rst.txt +879 -0
  78. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/installing.rst.txt +184 -0
  79. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/introduction.rst.txt +50 -0
  80. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/moving-from-python-lite.rst.txt +32 -0
  81. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/performance-tips.rst.txt +432 -0
  82. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/queues.rst.txt +282 -0
  83. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/sow.rst.txt +294 -0
  84. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/subscriptions.rst.txt +374 -0
  85. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/utilities.rst.txt +214 -0
  86. amps-python-client-5.3.4.2/docs/python/html/_static/custom.css +161 -0
  87. amps-python-client-5.3.4.2/docs/python/html/chapters/advanced-topics.html +447 -0
  88. amps-python-client-5.3.4.2/docs/python/html/chapters/cpp-compiler-list.html +92 -0
  89. amps-python-client-5.3.4.2/docs/python/html/chapters/cpp-feature-table.html +156 -0
  90. amps-python-client-5.3.4.2/docs/python/html/chapters/creating-commands.html +2882 -0
  91. amps-python-client-5.3.4.2/docs/python/html/chapters/deltas.html +169 -0
  92. amps-python-client-5.3.4.2/docs/python/html/chapters/error-handling.html +745 -0
  93. amps-python-client-5.3.4.2/docs/python/html/chapters/exceptions.html +266 -0
  94. amps-python-client-5.3.4.2/docs/python/html/chapters/first-program.html +526 -0
  95. amps-python-client-5.3.4.2/docs/python/html/chapters/high-availability.html +1017 -0
  96. amps-python-client-5.3.4.2/docs/python/html/chapters/installing.html +264 -0
  97. amps-python-client-5.3.4.2/docs/python/html/chapters/introduction.html +245 -0
  98. amps-python-client-5.3.4.2/docs/python/html/chapters/moving-from-python-lite.html +118 -0
  99. amps-python-client-5.3.4.2/docs/python/html/chapters/performance-tips.html +499 -0
  100. amps-python-client-5.3.4.2/docs/python/html/chapters/queues.html +352 -0
  101. amps-python-client-5.3.4.2/docs/python/html/chapters/sow.html +383 -0
  102. amps-python-client-5.3.4.2/docs/python/html/chapters/subscriptions.html +535 -0
  103. amps-python-client-5.3.4.2/docs/python/html/chapters/utilities.html +302 -0
  104. amps-python-client-5.3.4.2/docs/python/html/genindex.html +351 -0
  105. amps-python-client-5.3.4.2/docs/python/html/index.html +382 -0
  106. amps-python-client-5.3.4.2/docs/python/html/objects.inv +0 -0
  107. amps-python-client-5.3.4.2/docs/python/html/search.html +107 -0
  108. amps-python-client-5.3.4.2/docs/python/html/searchindex.js +1 -0
  109. amps-python-client-5.3.4.2/docs/python-quickstart/doctrees/chapters/crankitup.doctree +0 -0
  110. amps-python-client-5.3.4.2/docs/python-quickstart/doctrees/chapters/equipment.doctree +0 -0
  111. amps-python-client-5.3.4.2/docs/python-quickstart/doctrees/environment.pickle +0 -0
  112. amps-python-client-5.3.4.2/docs/python-quickstart/doctrees/index.doctree +0 -0
  113. amps-python-client-5.3.4.2/docs/python-quickstart/html/.buildinfo +4 -0
  114. amps-python-client-5.3.4.2/docs/python-quickstart/html/_static/custom.css +161 -0
  115. amps-python-client-5.3.4.2/docs/python-quickstart/html/chapters/crankitup.html +271 -0
  116. amps-python-client-5.3.4.2/docs/python-quickstart/html/chapters/equipment.html +105 -0
  117. amps-python-client-5.3.4.2/docs/python-quickstart/html/genindex.html +97 -0
  118. amps-python-client-5.3.4.2/docs/python-quickstart/html/index.html +381 -0
  119. amps-python-client-5.3.4.2/docs/python-quickstart/html/objects.inv +0 -0
  120. amps-python-client-5.3.4.2/docs/python-quickstart/html/search.html +107 -0
  121. amps-python-client-5.3.4.2/docs/python-quickstart/html/searchindex.js +1 -0
  122. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/acks.doctree +0 -0
  123. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/actions.doctree +0 -0
  124. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/amps-statistics.doctree +0 -0
  125. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/amps_expressions.doctree +0 -0
  126. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/amps_functions.doctree +0 -0
  127. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/auxiliary_modules.doctree +0 -0
  128. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/config-file-shortcuts.doctree +0 -0
  129. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/conflated_topics.doctree +0 -0
  130. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/constructing-fields.doctree +0 -0
  131. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/daemon.doctree +0 -0
  132. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/delta.doctree +0 -0
  133. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/distribution.doctree +0 -0
  134. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/enrichment.doctree +0 -0
  135. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/events.doctree +0 -0
  136. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/file_format_versions.doctree +0 -0
  137. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/glossary.doctree +0 -0
  138. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/ha.doctree +0 -0
  139. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/installing_and_starting.doctree +0 -0
  140. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/intro.doctree +0 -0
  141. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/logging.doctree +0 -0
  142. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/messageTypes.doctree +0 -0
  143. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/monitoring.doctree +0 -0
  144. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/oof.doctree +0 -0
  145. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/operation.doctree +0 -0
  146. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/pub_sub.doctree +0 -0
  147. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/queues.doctree +0 -0
  148. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/replication.doctree +0 -0
  149. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/securing.doctree +0 -0
  150. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/sow.doctree +0 -0
  151. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/sow_queries.doctree +0 -0
  152. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/spark.doctree +0 -0
  153. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/transports.doctree +0 -0
  154. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/troubleshooting.doctree +0 -0
  155. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/txlog.doctree +0 -0
  156. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/usecases.doctree +0 -0
  157. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/utilities.doctree +0 -0
  158. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/views.doctree +0 -0
  159. amps-python-client-5.3.4.2/docs/user-guide/doctrees/environment.pickle +0 -0
  160. amps-python-client-5.3.4.2/docs/user-guide/doctrees/index.doctree +0 -0
  161. amps-python-client-5.3.4.2/docs/user-guide/html/.buildinfo +4 -0
  162. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/acks.rst.txt +8 -0
  163. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/actions.rst.txt +8 -0
  164. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/amps-statistics.rst.txt +8 -0
  165. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/amps_expressions.rst.txt +8 -0
  166. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/amps_functions.rst.txt +8 -0
  167. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/auxiliary_modules.rst.txt +8 -0
  168. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/config-file-shortcuts.rst.txt +8 -0
  169. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/conflated_topics.rst.txt +8 -0
  170. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/constructing-fields.rst.txt +8 -0
  171. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/daemon.rst.txt +8 -0
  172. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/delta.rst.txt +8 -0
  173. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/distribution.rst.txt +8 -0
  174. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/enrichment.rst.txt +8 -0
  175. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/events.rst.txt +8 -0
  176. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/file_format_versions.rst.txt +8 -0
  177. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/glossary.rst.txt +8 -0
  178. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/ha.rst.txt +8 -0
  179. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/installing_and_starting.rst.txt +8 -0
  180. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/intro.rst.txt +8 -0
  181. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/logging.rst.txt +8 -0
  182. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/messageTypes.rst.txt +8 -0
  183. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/monitoring.rst.txt +8 -0
  184. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/oof.rst.txt +8 -0
  185. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/operation.rst.txt +8 -0
  186. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/pub_sub.rst.txt +8 -0
  187. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/queues.rst.txt +8 -0
  188. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/replication.rst.txt +8 -0
  189. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/securing.rst.txt +8 -0
  190. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/sow.rst.txt +8 -0
  191. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/sow_queries.rst.txt +8 -0
  192. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/transports.rst.txt +8 -0
  193. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/troubleshooting.rst.txt +8 -0
  194. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/txlog.rst.txt +8 -0
  195. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/usecases.rst.txt +8 -0
  196. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/utilities.rst.txt +8 -0
  197. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/views.rst.txt +8 -0
  198. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/index.rst.txt +62 -0
  199. amps-python-client-5.3.4.2/docs/user-guide/html/_static/custom.css +161 -0
  200. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/acks.html +94 -0
  201. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/actions.html +94 -0
  202. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/amps-statistics.html +94 -0
  203. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/amps_expressions.html +94 -0
  204. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/amps_functions.html +94 -0
  205. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/auxiliary_modules.html +94 -0
  206. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/config-file-shortcuts.html +94 -0
  207. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/conflated_topics.html +94 -0
  208. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/constructing-fields.html +94 -0
  209. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/daemon.html +94 -0
  210. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/delta.html +94 -0
  211. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/distribution.html +94 -0
  212. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/enrichment.html +94 -0
  213. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/events.html +94 -0
  214. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/file_format_versions.html +94 -0
  215. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/glossary.html +92 -0
  216. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/ha.html +94 -0
  217. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/installing_and_starting.html +94 -0
  218. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/intro.html +94 -0
  219. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/logging.html +94 -0
  220. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/messageTypes.html +94 -0
  221. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/monitoring.html +94 -0
  222. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/oof.html +94 -0
  223. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/operation.html +94 -0
  224. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/pub_sub.html +94 -0
  225. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/queues.html +94 -0
  226. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/replication.html +94 -0
  227. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/securing.html +94 -0
  228. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/sow.html +94 -0
  229. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/sow_queries.html +94 -0
  230. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/spark.html +819 -0
  231. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/transports.html +94 -0
  232. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/troubleshooting.html +94 -0
  233. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/txlog.html +94 -0
  234. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/usecases.html +94 -0
  235. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/utilities.html +94 -0
  236. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/views.html +94 -0
  237. amps-python-client-5.3.4.2/docs/user-guide/html/genindex.html +133 -0
  238. amps-python-client-5.3.4.2/docs/user-guide/html/index.html +96 -0
  239. amps-python-client-5.3.4.2/docs/user-guide/html/objects.inv +0 -0
  240. amps-python-client-5.3.4.2/docs/user-guide/html/search.html +106 -0
  241. amps-python-client-5.3.4.2/docs/user-guide/html/searchindex.js +1 -0
  242. amps-python-client-5.3.4.2/include/ampspy_bookmarkstore.hpp +63 -0
  243. amps-python-client-5.3.4.2/include/ampspy_compat.h +63 -0
  244. amps-python-client-5.3.4.2/include/ampspy_defs.hpp +181 -0
  245. amps-python-client-5.3.4.2/include/ampspy_recoverypointadapter.hpp +52 -0
  246. amps-python-client-5.3.4.2/include/ampspy_shims.hpp +113 -0
  247. amps-python-client-5.3.4.2/include/ampspy_type_object.hpp +242 -0
  248. amps-python-client-5.3.4.2/include/ampspy_types.hpp +1139 -0
  249. amps-python-client-5.3.4.2/include/ampspyver.h +30 -0
  250. amps-python-client-5.3.4.2/index.html +66 -0
  251. amps-python-client-5.3.4.2/samples/AMPSConsolePublisher.py +59 -0
  252. amps-python-client-5.3.4.2/samples/AMPSConsoleSubscriber.py +63 -0
  253. amps-python-client-5.3.4.2/samples/AMPSFIXBuilderPublisher.py +71 -0
  254. amps-python-client-5.3.4.2/samples/AMPSFIXShredderSubscriber.py +69 -0
  255. amps-python-client-5.3.4.2/samples/AMPSNVFIXBuilderPublisher.py +71 -0
  256. amps-python-client-5.3.4.2/samples/AMPSNVFIXShredderSubscriber.py +67 -0
  257. amps-python-client-5.3.4.2/samples/AMPSPublishForReplay.py +81 -0
  258. amps-python-client-5.3.4.2/samples/AMPSQueueConsumer.py +69 -0
  259. amps-python-client-5.3.4.2/samples/AMPSQueuePublisher.py +59 -0
  260. amps-python-client-5.3.4.2/samples/AMPSSOWConsolePublisher.py +67 -0
  261. amps-python-client-5.3.4.2/samples/AMPSSOWConsoleSubscriber.py +77 -0
  262. amps-python-client-5.3.4.2/samples/AMPSSOWandSubscribeConsoleSubscriber.py +79 -0
  263. amps-python-client-5.3.4.2/samples/AMPSSOWandSubscribeWithOOF.py +108 -0
  264. amps-python-client-5.3.4.2/samples/AMPSSubscribeForReplay.py +128 -0
  265. amps-python-client-5.3.4.2/samples/AMPSUpdateForOOF.py +123 -0
  266. amps-python-client-5.3.4.2/samples/CompositeMessagePublisher.py +84 -0
  267. amps-python-client-5.3.4.2/samples/CompositeMessageSubscriber.py +87 -0
  268. amps-python-client-5.3.4.2/samples/RandomServerChooser.py +66 -0
  269. amps-python-client-5.3.4.2/samples/sample.xml +335 -0
  270. amps-python-client-5.3.4.2/setup.py +210 -0
  271. amps-python-client-5.3.4.2/setup_amps.py +94 -0
  272. amps-python-client-5.3.4.2/src/ampspy_shims.cpp +214 -0
  273. amps-python-client-5.3.4.2/src/ampspy_type_object.cpp +495 -0
  274. amps-python-client-5.3.4.2/src/authenticator.cpp +128 -0
  275. amps-python-client-5.3.4.2/src/bookmarkstore.cpp +246 -0
  276. amps-python-client-5.3.4.2/src/client.cpp +2648 -0
  277. amps-python-client-5.3.4.2/src/client_docs.h +956 -0
  278. amps-python-client-5.3.4.2/src/cmessagehandler.cpp +161 -0
  279. amps-python-client-5.3.4.2/src/command.cpp +164 -0
  280. amps-python-client-5.3.4.2/src/command_docs.h +269 -0
  281. amps-python-client-5.3.4.2/src/compositemessagebuilder.cpp +113 -0
  282. amps-python-client-5.3.4.2/src/compositemessageparser.cpp +151 -0
  283. amps-python-client-5.3.4.2/src/conflatingrecoverypointadapter.cpp +197 -0
  284. amps-python-client-5.3.4.2/src/cpp/include/amps/BlockPublishStore.hpp +2053 -0
  285. amps-python-client-5.3.4.2/src/cpp/include/amps/BlockStore.hpp +677 -0
  286. amps-python-client-5.3.4.2/src/cpp/include/amps/BookmarkStore.hpp +542 -0
  287. amps-python-client-5.3.4.2/src/cpp/include/amps/Buffer.hpp +214 -0
  288. amps-python-client-5.3.4.2/src/cpp/include/amps/CompositeMessageBuilder.hpp +174 -0
  289. amps-python-client-5.3.4.2/src/cpp/include/amps/CompositeMessageParser.hpp +151 -0
  290. amps-python-client-5.3.4.2/src/cpp/include/amps/DefaultServerChooser.hpp +162 -0
  291. amps-python-client-5.3.4.2/src/cpp/include/amps/Field.hpp +719 -0
  292. amps-python-client-5.3.4.2/src/cpp/include/amps/HAClient.hpp +370 -0
  293. amps-python-client-5.3.4.2/src/cpp/include/amps/HAClientImpl.hpp +460 -0
  294. amps-python-client-5.3.4.2/src/cpp/include/amps/HybridPublishStore.hpp +481 -0
  295. amps-python-client-5.3.4.2/src/cpp/include/amps/LoggedBookmarkStore.hpp +1256 -0
  296. amps-python-client-5.3.4.2/src/cpp/include/amps/MMapBookmarkStore.hpp +1283 -0
  297. amps-python-client-5.3.4.2/src/cpp/include/amps/MMapStoreBuffer.hpp +290 -0
  298. amps-python-client-5.3.4.2/src/cpp/include/amps/MemoryBookmarkStore.hpp +1628 -0
  299. amps-python-client-5.3.4.2/src/cpp/include/amps/MemoryPublishStore.hpp +66 -0
  300. amps-python-client-5.3.4.2/src/cpp/include/amps/MemoryStoreBuffer.hpp +244 -0
  301. amps-python-client-5.3.4.2/src/cpp/include/amps/MemorySubscriptionManager.hpp +850 -0
  302. amps-python-client-5.3.4.2/src/cpp/include/amps/Message.hpp +1819 -0
  303. amps-python-client-5.3.4.2/src/cpp/include/amps/MessageRouter.hpp +647 -0
  304. amps-python-client-5.3.4.2/src/cpp/include/amps/PublishStore.hpp +158 -0
  305. amps-python-client-5.3.4.2/src/cpp/include/amps/ReconnectDelayStrategy.hpp +106 -0
  306. amps-python-client-5.3.4.2/src/cpp/include/amps/ReconnectDelayStrategyImpl.hpp +317 -0
  307. amps-python-client-5.3.4.2/src/cpp/include/amps/RecoveryPoint.hpp +323 -0
  308. amps-python-client-5.3.4.2/src/cpp/include/amps/RecoveryPointAdapter.hpp +501 -0
  309. amps-python-client-5.3.4.2/src/cpp/include/amps/RingBookmarkStore.hpp +669 -0
  310. amps-python-client-5.3.4.2/src/cpp/include/amps/SOWRecoveryPointAdapter.hpp +494 -0
  311. amps-python-client-5.3.4.2/src/cpp/include/amps/ServerChooser.hpp +145 -0
  312. amps-python-client-5.3.4.2/src/cpp/include/amps/ServerChooserImpl.hpp +95 -0
  313. amps-python-client-5.3.4.2/src/cpp/include/amps/amps.h +803 -0
  314. amps-python-client-5.3.4.2/src/cpp/include/amps/amps_impl.h +208 -0
  315. amps-python-client-5.3.4.2/src/cpp/include/amps/amps_ssl.h +78 -0
  316. amps-python-client-5.3.4.2/src/cpp/include/amps/ampscrc.hpp +210 -0
  317. amps-python-client-5.3.4.2/src/cpp/include/amps/ampsplusplus.hpp +8850 -0
  318. amps-python-client-5.3.4.2/src/cpp/include/amps/ampsuri.h +84 -0
  319. amps-python-client-5.3.4.2/src/cpp/include/amps/ampsver.h +41 -0
  320. amps-python-client-5.3.4.2/src/cpp/include/amps/ampsver.h.in +41 -0
  321. amps-python-client-5.3.4.2/src/cpp/include/amps/constants.hpp +194 -0
  322. amps-python-client-5.3.4.2/src/cpp/include/amps/util.hpp +1722 -0
  323. amps-python-client-5.3.4.2/src/cpp/src/amps_protocol.c +693 -0
  324. amps-python-client-5.3.4.2/src/cpp/src/amps_ssl.c +489 -0
  325. amps-python-client-5.3.4.2/src/cpp/src/atfork.c +451 -0
  326. amps-python-client-5.3.4.2/src/cpp/src/client.c +498 -0
  327. amps-python-client-5.3.4.2/src/cpp/src/message.c +837 -0
  328. amps-python-client-5.3.4.2/src/cpp/src/message_generated.h +611 -0
  329. amps-python-client-5.3.4.2/src/cpp/src/tcp.c +1517 -0
  330. amps-python-client-5.3.4.2/src/cpp/src/tcps.c +1885 -0
  331. amps-python-client-5.3.4.2/src/cpp/src/transports.c +129 -0
  332. amps-python-client-5.3.4.2/src/cpp/src/unix.c +1002 -0
  333. amps-python-client-5.3.4.2/src/cpp/src/uri.c +301 -0
  334. amps-python-client-5.3.4.2/src/exponentialdelaystrategy.cpp +137 -0
  335. amps-python-client-5.3.4.2/src/failedwritehandler.cpp +116 -0
  336. amps-python-client-5.3.4.2/src/fixbuilder.cpp +146 -0
  337. amps-python-client-5.3.4.2/src/fixeddelaystrategy.cpp +114 -0
  338. amps-python-client-5.3.4.2/src/fixshredder.cpp +105 -0
  339. amps-python-client-5.3.4.2/src/fixshredder_docs.h +38 -0
  340. amps-python-client-5.3.4.2/src/haclient.cpp +691 -0
  341. amps-python-client-5.3.4.2/src/haclient_docs.h +186 -0
  342. amps-python-client-5.3.4.2/src/hybridpublishstore.cpp +137 -0
  343. amps-python-client-5.3.4.2/src/hybridpublishstore_docs.h +31 -0
  344. amps-python-client-5.3.4.2/src/memorybookmarkstore.cpp +373 -0
  345. amps-python-client-5.3.4.2/src/memorybookmarkstore_docs.h +39 -0
  346. amps-python-client-5.3.4.2/src/memorypublishstore.cpp +160 -0
  347. amps-python-client-5.3.4.2/src/memorypublishstore_docs.h +32 -0
  348. amps-python-client-5.3.4.2/src/message.cpp +765 -0
  349. amps-python-client-5.3.4.2/src/message_docs.h +306 -0
  350. amps-python-client-5.3.4.2/src/messagestream.cpp +630 -0
  351. amps-python-client-5.3.4.2/src/messagestream_docs.h +45 -0
  352. amps-python-client-5.3.4.2/src/mmapbookmarkstore.cpp +422 -0
  353. amps-python-client-5.3.4.2/src/nvfixbuilder.cpp +160 -0
  354. amps-python-client-5.3.4.2/src/nvfixbuilder_docs.h +35 -0
  355. amps-python-client-5.3.4.2/src/nvfixshredder.cpp +99 -0
  356. amps-python-client-5.3.4.2/src/nvfixshredder_docs.h +43 -0
  357. amps-python-client-5.3.4.2/src/publishstore.cpp +183 -0
  358. amps-python-client-5.3.4.2/src/raw_wrapper.cpp +765 -0
  359. amps-python-client-5.3.4.2/src/reason.cpp +71 -0
  360. amps-python-client-5.3.4.2/src/recoverypoint.cpp +135 -0
  361. amps-python-client-5.3.4.2/src/recoverypointadapter.cpp +171 -0
  362. amps-python-client-5.3.4.2/src/ringbookmarkstore.cpp +360 -0
  363. amps-python-client-5.3.4.2/src/serverchooser.cpp +245 -0
  364. amps-python-client-5.3.4.2/src/serverchooser_docs.h +41 -0
  365. amps-python-client-5.3.4.2/src/sowrecoverypointadapter.cpp +248 -0
  366. amps-python-client-5.3.4.2/src/store.cpp +62 -0
  367. amps-python-client-5.3.4.2/src/versioninfo.cpp +175 -0
  368. amps-python-client-5.3.4.1/PKG-INFO +0 -112
  369. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/ack-messages.doctree +0 -0
  370. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/content-messages.doctree +0 -0
  371. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/intro.doctree +0 -0
  372. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/logon.doctree +0 -0
  373. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/protocol-reference.doctree +0 -0
  374. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/publishing.doctree +0 -0
  375. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/query-delimiters.doctree +0 -0
  376. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/query-subscribe.doctree +0 -0
  377. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/removing.doctree +0 -0
  378. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/utilities.doctree +0 -0
  379. amps-python-client-5.3.4.1/docs/command-reference/doctrees/environment.pickle +0 -0
  380. amps-python-client-5.3.4.1/docs/command-reference/doctrees/index.doctree +0 -0
  381. amps-python-client-5.3.4.1/docs/command-reference/html/.buildinfo +0 -4
  382. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/ack-messages.rst.txt +0 -32
  383. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/content-messages.rst.txt +0 -27
  384. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/intro.rst.txt +0 -43
  385. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/logon.rst.txt +0 -231
  386. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/protocol-reference.rst.txt +0 -1474
  387. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/publishing.rst.txt +0 -25
  388. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/query-delimiters.rst.txt +0 -12
  389. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/query-subscribe.rst.txt +0 -23
  390. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/removing.rst.txt +0 -6
  391. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/utilities.rst.txt +0 -13
  392. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/index.rst.txt +0 -56
  393. amps-python-client-5.3.4.1/docs/command-reference/html/_static/custom.css +0 -192
  394. amps-python-client-5.3.4.1/docs/command-reference/html/_static/custom.css.backup +0 -161
  395. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/ack-messages.html +0 -417
  396. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/content-messages.html +0 -417
  397. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/intro.html +0 -126
  398. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/logon.html +0 -295
  399. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/protocol-reference.html +0 -1190
  400. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/publishing.html +0 -436
  401. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/query-delimiters.html +0 -173
  402. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/query-subscribe.html +0 -2123
  403. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/removing.html +0 -299
  404. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/utilities.html +0 -287
  405. amps-python-client-5.3.4.1/docs/command-reference/html/genindex.html +0 -97
  406. amps-python-client-5.3.4.1/docs/command-reference/html/index.html +0 -138
  407. amps-python-client-5.3.4.1/docs/command-reference/html/objects.inv +0 -0
  408. amps-python-client-5.3.4.1/docs/command-reference/html/search.html +0 -107
  409. amps-python-client-5.3.4.1/docs/command-reference/html/searchindex.js +0 -1
  410. amps-python-client-5.3.4.1/docs/html/.buildinfo +0 -4
  411. amps-python-client-5.3.4.1/docs/html/code.html +0 -6503
  412. amps-python-client-5.3.4.1/docs/html/genindex.html +0 -1361
  413. amps-python-client-5.3.4.1/docs/html/index.html +0 -131
  414. amps-python-client-5.3.4.1/docs/html/objects.inv +0 -0
  415. amps-python-client-5.3.4.1/docs/html/py-modindex.html +0 -111
  416. amps-python-client-5.3.4.1/docs/html/search.html +0 -107
  417. amps-python-client-5.3.4.1/docs/html/searchindex.js +0 -1
  418. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/advanced-topics.doctree +0 -0
  419. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/cpp-compiler-list.doctree +0 -0
  420. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/cpp-feature-table.doctree +0 -0
  421. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/creating-commands.doctree +0 -0
  422. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/deltas.doctree +0 -0
  423. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/error-handling.doctree +0 -0
  424. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/exceptions.doctree +0 -0
  425. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/first-program.doctree +0 -0
  426. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/high-availability.doctree +0 -0
  427. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/installing.doctree +0 -0
  428. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/introduction.doctree +0 -0
  429. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/moving-from-python-lite.doctree +0 -0
  430. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/performance-tips.doctree +0 -0
  431. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/queues.doctree +0 -0
  432. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/sow.doctree +0 -0
  433. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/subscriptions.doctree +0 -0
  434. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/utilities.doctree +0 -0
  435. amps-python-client-5.3.4.1/docs/python/doctrees/environment.pickle +0 -0
  436. amps-python-client-5.3.4.1/docs/python/doctrees/index.doctree +0 -0
  437. amps-python-client-5.3.4.1/docs/python/html/.buildinfo +0 -4
  438. amps-python-client-5.3.4.1/docs/python/html/_images/caution.svg +0 -25
  439. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/advanced-topics.rst.txt +0 -398
  440. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/cpp-feature-table.rst.txt +0 -26
  441. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/creating-commands.rst.txt +0 -159
  442. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/deltas.rst.txt +0 -79
  443. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/error-handling.rst.txt +0 -482
  444. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/exceptions.rst.txt +0 -128
  445. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/first-program.rst.txt +0 -142
  446. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/high-availability.rst.txt +0 -876
  447. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/installing.rst.txt +0 -184
  448. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/introduction.rst.txt +0 -50
  449. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/moving-from-python-lite.rst.txt +0 -32
  450. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/performance-tips.rst.txt +0 -434
  451. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/queues.rst.txt +0 -282
  452. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/sow.rst.txt +0 -292
  453. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/subscriptions.rst.txt +0 -374
  454. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/utilities.rst.txt +0 -214
  455. amps-python-client-5.3.4.1/docs/python/html/_static/custom.css +0 -192
  456. amps-python-client-5.3.4.1/docs/python/html/_static/custom.css.backup +0 -161
  457. amps-python-client-5.3.4.1/docs/python/html/chapters/advanced-topics.html +0 -447
  458. amps-python-client-5.3.4.1/docs/python/html/chapters/cpp-compiler-list.html +0 -92
  459. amps-python-client-5.3.4.1/docs/python/html/chapters/cpp-feature-table.html +0 -156
  460. amps-python-client-5.3.4.1/docs/python/html/chapters/creating-commands.html +0 -2837
  461. amps-python-client-5.3.4.1/docs/python/html/chapters/deltas.html +0 -169
  462. amps-python-client-5.3.4.1/docs/python/html/chapters/error-handling.html +0 -746
  463. amps-python-client-5.3.4.1/docs/python/html/chapters/exceptions.html +0 -272
  464. amps-python-client-5.3.4.1/docs/python/html/chapters/first-program.html +0 -499
  465. amps-python-client-5.3.4.1/docs/python/html/chapters/high-availability.html +0 -1014
  466. amps-python-client-5.3.4.1/docs/python/html/chapters/installing.html +0 -264
  467. amps-python-client-5.3.4.1/docs/python/html/chapters/introduction.html +0 -245
  468. amps-python-client-5.3.4.1/docs/python/html/chapters/moving-from-python-lite.html +0 -118
  469. amps-python-client-5.3.4.1/docs/python/html/chapters/performance-tips.html +0 -499
  470. amps-python-client-5.3.4.1/docs/python/html/chapters/queues.html +0 -352
  471. amps-python-client-5.3.4.1/docs/python/html/chapters/sow.html +0 -381
  472. amps-python-client-5.3.4.1/docs/python/html/chapters/subscriptions.html +0 -535
  473. amps-python-client-5.3.4.1/docs/python/html/chapters/utilities.html +0 -302
  474. amps-python-client-5.3.4.1/docs/python/html/genindex.html +0 -351
  475. amps-python-client-5.3.4.1/docs/python/html/index.html +0 -380
  476. amps-python-client-5.3.4.1/docs/python/html/objects.inv +0 -0
  477. amps-python-client-5.3.4.1/docs/python/html/search.html +0 -107
  478. amps-python-client-5.3.4.1/docs/python/html/searchindex.js +0 -1
  479. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/chapters/crankitup.doctree +0 -0
  480. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/chapters/equipment.doctree +0 -0
  481. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/environment.pickle +0 -0
  482. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/index.doctree +0 -0
  483. amps-python-client-5.3.4.1/docs/python-quickstart/html/.buildinfo +0 -4
  484. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/custom.css +0 -192
  485. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/custom.css.backup +0 -161
  486. amps-python-client-5.3.4.1/docs/python-quickstart/html/chapters/crankitup.html +0 -271
  487. amps-python-client-5.3.4.1/docs/python-quickstart/html/chapters/equipment.html +0 -105
  488. amps-python-client-5.3.4.1/docs/python-quickstart/html/genindex.html +0 -97
  489. amps-python-client-5.3.4.1/docs/python-quickstart/html/index.html +0 -382
  490. amps-python-client-5.3.4.1/docs/python-quickstart/html/objects.inv +0 -0
  491. amps-python-client-5.3.4.1/docs/python-quickstart/html/search.html +0 -107
  492. amps-python-client-5.3.4.1/docs/python-quickstart/html/searchindex.js +0 -1
  493. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/acks.doctree +0 -0
  494. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/actions.doctree +0 -0
  495. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps-statistics.doctree +0 -0
  496. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps_expressions.doctree +0 -0
  497. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps_functions.doctree +0 -0
  498. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/auxiliary_modules.doctree +0 -0
  499. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/config-file-shortcuts.doctree +0 -0
  500. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/conflated_topics.doctree +0 -0
  501. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/constructing-fields.doctree +0 -0
  502. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/daemon.doctree +0 -0
  503. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/delta.doctree +0 -0
  504. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/distribution.doctree +0 -0
  505. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/enrichment.doctree +0 -0
  506. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/events.doctree +0 -0
  507. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/file_format_versions.doctree +0 -0
  508. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/glossary.doctree +0 -0
  509. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/ha.doctree +0 -0
  510. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/installing_and_starting.doctree +0 -0
  511. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/intro.doctree +0 -0
  512. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/logging.doctree +0 -0
  513. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/messageTypes.doctree +0 -0
  514. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/monitoring.doctree +0 -0
  515. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/oof.doctree +0 -0
  516. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/operation.doctree +0 -0
  517. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/pub_sub.doctree +0 -0
  518. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/queues.doctree +0 -0
  519. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/replication.doctree +0 -0
  520. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/securing.doctree +0 -0
  521. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/sow.doctree +0 -0
  522. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/sow_queries.doctree +0 -0
  523. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/spark.doctree +0 -0
  524. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/transports.doctree +0 -0
  525. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/troubleshooting.doctree +0 -0
  526. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/txlog.doctree +0 -0
  527. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/usecases.doctree +0 -0
  528. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/utilities.doctree +0 -0
  529. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/views.doctree +0 -0
  530. amps-python-client-5.3.4.1/docs/user-guide/doctrees/environment.pickle +0 -0
  531. amps-python-client-5.3.4.1/docs/user-guide/doctrees/index.doctree +0 -0
  532. amps-python-client-5.3.4.1/docs/user-guide/html/.buildinfo +0 -4
  533. amps-python-client-5.3.4.1/docs/user-guide/html/_images/AMPS-Queues-Intro.svg +0 -1330
  534. amps-python-client-5.3.4.1/docs/user-guide/html/_images/GeoRepl.png +0 -0
  535. amps-python-client-5.3.4.1/docs/user-guide/html/_images/HA_async_ack.png +0 -0
  536. amps-python-client-5.3.4.1/docs/user-guide/html/_images/HA_sync_ack.png +0 -0
  537. amps-python-client-5.3.4.1/docs/user-guide/html/_images/Hot-Hot-Replication.png +0 -0
  538. amps-python-client-5.3.4.1/docs/user-guide/html/_images/MessageOrdering.svg +0 -235
  539. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF5.png +0 -0
  540. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF6.png +0 -0
  541. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF7.png +0 -0
  542. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF8.png +0 -0
  543. amps-python-client-5.3.4.1/docs/user-guide/html/_images/PubSub1.svg +0 -1
  544. amps-python-client-5.3.4.1/docs/user-guide/html/_images/PubSub2.svg +0 -1
  545. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWAndSubscribeAndReplace.svg +0 -684
  546. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWQuery1.svg +0 -402
  547. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWQuery2.svg +0 -505
  548. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig1.svg +0 -1
  549. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig2.svg +0 -1
  550. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig3.svg +0 -1
  551. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig4.svg +0 -1
  552. amps-python-client-5.3.4.1/docs/user-guide/html/_images/caution.png +0 -0
  553. amps-python-client-5.3.4.1/docs/user-guide/html/_images/caution.svg +0 -25
  554. amps-python-client-5.3.4.1/docs/user-guide/html/_images/chicago_group.png +0 -0
  555. amps-python-client-5.3.4.1/docs/user-guide/html/_images/delta_original_messages.png +0 -0
  556. amps-python-client-5.3.4.1/docs/user-guide/html/_images/delta_update_message.png +0 -0
  557. amps-python-client-5.3.4.1/docs/user-guide/html/_images/important.png +0 -0
  558. amps-python-client-5.3.4.1/docs/user-guide/html/_images/important.svg +0 -25
  559. amps-python-client-5.3.4.1/docs/user-guide/html/_images/inline_view_conflation.svg +0 -1
  560. amps-python-client-5.3.4.1/docs/user-guide/html/_images/paginated_subs_pub.png +0 -0
  561. amps-python-client-5.3.4.1/docs/user-guide/html/_images/paginated_subs_sub.png +0 -0
  562. amps-python-client-5.3.4.1/docs/user-guide/html/_images/queue_usage_overview.svg +0 -627
  563. amps-python-client-5.3.4.1/docs/user-guide/html/_images/replication_hub.png +0 -0
  564. amps-python-client-5.3.4.1/docs/user-guide/html/_images/replication_scenario_with_ha.png +0 -0
  565. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_overview_1.svg +0 -248
  566. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_overview_2.svg +0 -183
  567. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_update_sequence.svg +0 -1
  568. amps-python-client-5.3.4.1/docs/user-guide/html/_images/tip.png +0 -0
  569. amps-python-client-5.3.4.1/docs/user-guide/html/_images/tip.svg +0 -31
  570. amps-python-client-5.3.4.1/docs/user-guide/html/_images/warning.png +0 -0
  571. amps-python-client-5.3.4.1/docs/user-guide/html/_images/warning.svg +0 -23
  572. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/acks.rst.txt +0 -232
  573. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/actions.rst.txt +0 -111
  574. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps-statistics.rst.txt +0 -358
  575. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps_expressions.rst.txt +0 -83
  576. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps_functions.rst.txt +0 -11
  577. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/auxiliary_modules.rst.txt +0 -86
  578. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/config-file-shortcuts.rst.txt +0 -9
  579. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/conflated_topics.rst.txt +0 -111
  580. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/constructing-fields.rst.txt +0 -269
  581. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/daemon.rst.txt +0 -232
  582. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/delta.rst.txt +0 -556
  583. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/distribution.rst.txt +0 -186
  584. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/enrichment.rst.txt +0 -191
  585. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/events.rst.txt +0 -39
  586. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/file_format_versions.rst.txt +0 -203
  587. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/glossary.rst.txt +0 -101
  588. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/ha.rst.txt +0 -465
  589. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/installing_and_starting.rst.txt +0 -23
  590. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/intro.rst.txt +0 -116
  591. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/logging.rst.txt +0 -34
  592. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/messageTypes.rst.txt +0 -1398
  593. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/monitoring.rst.txt +0 -326
  594. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/oof.rst.txt +0 -312
  595. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/operation.rst.txt +0 -27
  596. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/pub_sub.rst.txt +0 -49
  597. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/queues.rst.txt +0 -1351
  598. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/replication.rst.txt +0 -1228
  599. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/securing.rst.txt +0 -657
  600. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/sow.rst.txt +0 -57
  601. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/sow_queries.rst.txt +0 -25
  602. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/transports.rst.txt +0 -291
  603. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/troubleshooting.rst.txt +0 -517
  604. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/txlog.rst.txt +0 -62
  605. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/usecases.rst.txt +0 -21
  606. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/utilities.rst.txt +0 -62
  607. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/views.rst.txt +0 -175
  608. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/index.rst.txt +0 -110
  609. amps-python-client-5.3.4.1/docs/user-guide/html/_static/custom.css +0 -192
  610. amps-python-client-5.3.4.1/docs/user-guide/html/_static/custom.css.backup +0 -161
  611. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/acks.html +0 -289
  612. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/actions.html +0 -3782
  613. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps-statistics.html +0 -439
  614. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps_expressions.html +0 -1552
  615. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps_functions.html +0 -1626
  616. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/auxiliary_modules.html +0 -2548
  617. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/config-file-shortcuts.html +0 -508
  618. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/conflated_topics.html +0 -328
  619. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/constructing-fields.html +0 -447
  620. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/daemon.html +0 -295
  621. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/delta.html +0 -609
  622. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/distribution.html +0 -246
  623. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/enrichment.html +0 -264
  624. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/events.html +0 -449
  625. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/file_format_versions.html +0 -229
  626. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/glossary.html +0 -215
  627. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/ha.html +0 -978
  628. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/installing_and_starting.html +0 -357
  629. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/intro.html +0 -572
  630. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/logging.html +0 -972
  631. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/messageTypes.html +0 -1280
  632. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/monitoring.html +0 -718
  633. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/oof.html +0 -341
  634. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/operation.html +0 -1515
  635. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/pub_sub.html +0 -934
  636. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/queues.html +0 -1767
  637. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/replication.html +0 -1777
  638. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/securing.html +0 -697
  639. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/sow.html +0 -1038
  640. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/sow_queries.html +0 -621
  641. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/spark.html +0 -819
  642. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/transports.html +0 -352
  643. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/troubleshooting.html +0 -530
  644. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/txlog.html +0 -1013
  645. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/usecases.html +0 -288
  646. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/utilities.html +0 -133
  647. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/views.html +0 -1120
  648. amps-python-client-5.3.4.1/docs/user-guide/html/genindex.html +0 -1261
  649. amps-python-client-5.3.4.1/docs/user-guide/html/index.html +0 -163
  650. amps-python-client-5.3.4.1/docs/user-guide/html/objects.inv +0 -0
  651. amps-python-client-5.3.4.1/docs/user-guide/html/search.html +0 -106
  652. amps-python-client-5.3.4.1/docs/user-guide/html/searchindex.js +0 -1
  653. amps-python-client-5.3.4.1/include/ampspy_bookmarkstore.hpp +0 -63
  654. amps-python-client-5.3.4.1/include/ampspy_compat.h +0 -63
  655. amps-python-client-5.3.4.1/include/ampspy_defs.hpp +0 -181
  656. amps-python-client-5.3.4.1/include/ampspy_recoverypointadapter.hpp +0 -52
  657. amps-python-client-5.3.4.1/include/ampspy_shims.hpp +0 -113
  658. amps-python-client-5.3.4.1/include/ampspy_type_object.hpp +0 -242
  659. amps-python-client-5.3.4.1/include/ampspy_types.hpp +0 -1139
  660. amps-python-client-5.3.4.1/include/ampspyver.h +0 -30
  661. amps-python-client-5.3.4.1/index.html +0 -66
  662. amps-python-client-5.3.4.1/samples/AMPSConsolePublisher.py +0 -59
  663. amps-python-client-5.3.4.1/samples/AMPSConsoleSubscriber.py +0 -63
  664. amps-python-client-5.3.4.1/samples/AMPSFIXBuilderPublisher.py +0 -71
  665. amps-python-client-5.3.4.1/samples/AMPSFIXShredderSubscriber.py +0 -69
  666. amps-python-client-5.3.4.1/samples/AMPSNVFIXBuilderPublisher.py +0 -71
  667. amps-python-client-5.3.4.1/samples/AMPSNVFIXShredderSubscriber.py +0 -67
  668. amps-python-client-5.3.4.1/samples/AMPSPublishForReplay.py +0 -81
  669. amps-python-client-5.3.4.1/samples/AMPSQueueConsumer.py +0 -69
  670. amps-python-client-5.3.4.1/samples/AMPSQueuePublisher.py +0 -59
  671. amps-python-client-5.3.4.1/samples/AMPSSOWConsolePublisher.py +0 -67
  672. amps-python-client-5.3.4.1/samples/AMPSSOWConsoleSubscriber.py +0 -77
  673. amps-python-client-5.3.4.1/samples/AMPSSOWandSubscribeConsoleSubscriber.py +0 -79
  674. amps-python-client-5.3.4.1/samples/AMPSSOWandSubscribeWithOOF.py +0 -108
  675. amps-python-client-5.3.4.1/samples/AMPSSubscribeForReplay.py +0 -128
  676. amps-python-client-5.3.4.1/samples/AMPSUpdateForOOF.py +0 -123
  677. amps-python-client-5.3.4.1/samples/CompositeMessagePublisher.py +0 -84
  678. amps-python-client-5.3.4.1/samples/CompositeMessageSubscriber.py +0 -87
  679. amps-python-client-5.3.4.1/samples/RandomServerChooser.py +0 -41
  680. amps-python-client-5.3.4.1/samples/sample.xml +0 -335
  681. amps-python-client-5.3.4.1/setup.py +0 -209
  682. amps-python-client-5.3.4.1/setup_amps.py +0 -94
  683. amps-python-client-5.3.4.1/src/ampspy_shims.cpp +0 -203
  684. amps-python-client-5.3.4.1/src/ampspy_type_object.cpp +0 -484
  685. amps-python-client-5.3.4.1/src/authenticator.cpp +0 -128
  686. amps-python-client-5.3.4.1/src/bookmarkstore.cpp +0 -238
  687. amps-python-client-5.3.4.1/src/client.cpp +0 -2430
  688. amps-python-client-5.3.4.1/src/client_docs.h +0 -956
  689. amps-python-client-5.3.4.1/src/cmessagehandler.cpp +0 -151
  690. amps-python-client-5.3.4.1/src/command.cpp +0 -164
  691. amps-python-client-5.3.4.1/src/command_docs.h +0 -194
  692. amps-python-client-5.3.4.1/src/compositemessagebuilder.cpp +0 -111
  693. amps-python-client-5.3.4.1/src/compositemessageparser.cpp +0 -146
  694. amps-python-client-5.3.4.1/src/conflatingrecoverypointadapter.cpp +0 -194
  695. amps-python-client-5.3.4.1/src/cpp/include/amps/BlockPublishStore.hpp +0 -2053
  696. amps-python-client-5.3.4.1/src/cpp/include/amps/BlockStore.hpp +0 -677
  697. amps-python-client-5.3.4.1/src/cpp/include/amps/BookmarkStore.hpp +0 -542
  698. amps-python-client-5.3.4.1/src/cpp/include/amps/Buffer.hpp +0 -214
  699. amps-python-client-5.3.4.1/src/cpp/include/amps/CompositeMessageBuilder.hpp +0 -174
  700. amps-python-client-5.3.4.1/src/cpp/include/amps/CompositeMessageParser.hpp +0 -151
  701. amps-python-client-5.3.4.1/src/cpp/include/amps/DefaultServerChooser.hpp +0 -162
  702. amps-python-client-5.3.4.1/src/cpp/include/amps/Field.hpp +0 -719
  703. amps-python-client-5.3.4.1/src/cpp/include/amps/HAClient.hpp +0 -370
  704. amps-python-client-5.3.4.1/src/cpp/include/amps/HAClientImpl.hpp +0 -460
  705. amps-python-client-5.3.4.1/src/cpp/include/amps/HybridPublishStore.hpp +0 -481
  706. amps-python-client-5.3.4.1/src/cpp/include/amps/LoggedBookmarkStore.hpp +0 -1255
  707. amps-python-client-5.3.4.1/src/cpp/include/amps/MMapBookmarkStore.hpp +0 -1283
  708. amps-python-client-5.3.4.1/src/cpp/include/amps/MMapStoreBuffer.hpp +0 -290
  709. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryBookmarkStore.hpp +0 -1622
  710. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryPublishStore.hpp +0 -66
  711. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryStoreBuffer.hpp +0 -244
  712. amps-python-client-5.3.4.1/src/cpp/include/amps/MemorySubscriptionManager.hpp +0 -850
  713. amps-python-client-5.3.4.1/src/cpp/include/amps/Message.hpp +0 -1819
  714. amps-python-client-5.3.4.1/src/cpp/include/amps/MessageRouter.hpp +0 -618
  715. amps-python-client-5.3.4.1/src/cpp/include/amps/PublishStore.hpp +0 -158
  716. amps-python-client-5.3.4.1/src/cpp/include/amps/ReconnectDelayStrategy.hpp +0 -106
  717. amps-python-client-5.3.4.1/src/cpp/include/amps/ReconnectDelayStrategyImpl.hpp +0 -317
  718. amps-python-client-5.3.4.1/src/cpp/include/amps/RecoveryPoint.hpp +0 -323
  719. amps-python-client-5.3.4.1/src/cpp/include/amps/RecoveryPointAdapter.hpp +0 -501
  720. amps-python-client-5.3.4.1/src/cpp/include/amps/RingBookmarkStore.hpp +0 -669
  721. amps-python-client-5.3.4.1/src/cpp/include/amps/SOWRecoveryPointAdapter.hpp +0 -490
  722. amps-python-client-5.3.4.1/src/cpp/include/amps/ServerChooser.hpp +0 -145
  723. amps-python-client-5.3.4.1/src/cpp/include/amps/ServerChooserImpl.hpp +0 -95
  724. amps-python-client-5.3.4.1/src/cpp/include/amps/amps.h +0 -775
  725. amps-python-client-5.3.4.1/src/cpp/include/amps/amps_impl.h +0 -204
  726. amps-python-client-5.3.4.1/src/cpp/include/amps/amps_ssl.h +0 -78
  727. amps-python-client-5.3.4.1/src/cpp/include/amps/ampscrc.hpp +0 -210
  728. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsplusplus.hpp +0 -8817
  729. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsuri.h +0 -84
  730. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsver.h +0 -41
  731. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsver.h.in +0 -41
  732. amps-python-client-5.3.4.1/src/cpp/include/amps/constants.hpp +0 -194
  733. amps-python-client-5.3.4.1/src/cpp/include/amps/util.hpp +0 -1692
  734. amps-python-client-5.3.4.1/src/cpp/src/amps_protocol.c +0 -688
  735. amps-python-client-5.3.4.1/src/cpp/src/amps_ssl.c +0 -489
  736. amps-python-client-5.3.4.1/src/cpp/src/atfork.c +0 -446
  737. amps-python-client-5.3.4.1/src/cpp/src/client.c +0 -483
  738. amps-python-client-5.3.4.1/src/cpp/src/message.c +0 -837
  739. amps-python-client-5.3.4.1/src/cpp/src/message_generated.h +0 -611
  740. amps-python-client-5.3.4.1/src/cpp/src/tcp.c +0 -1489
  741. amps-python-client-5.3.4.1/src/cpp/src/tcps.c +0 -1894
  742. amps-python-client-5.3.4.1/src/cpp/src/transports.c +0 -123
  743. amps-python-client-5.3.4.1/src/cpp/src/unix.c +0 -984
  744. amps-python-client-5.3.4.1/src/cpp/src/uri.c +0 -301
  745. amps-python-client-5.3.4.1/src/exponentialdelaystrategy.cpp +0 -137
  746. amps-python-client-5.3.4.1/src/failedwritehandler.cpp +0 -116
  747. amps-python-client-5.3.4.1/src/fixbuilder.cpp +0 -146
  748. amps-python-client-5.3.4.1/src/fixeddelaystrategy.cpp +0 -114
  749. amps-python-client-5.3.4.1/src/fixshredder.cpp +0 -105
  750. amps-python-client-5.3.4.1/src/fixshredder_docs.h +0 -38
  751. amps-python-client-5.3.4.1/src/haclient.cpp +0 -691
  752. amps-python-client-5.3.4.1/src/haclient_docs.h +0 -132
  753. amps-python-client-5.3.4.1/src/hybridpublishstore.cpp +0 -137
  754. amps-python-client-5.3.4.1/src/hybridpublishstore_docs.h +0 -31
  755. amps-python-client-5.3.4.1/src/memorybookmarkstore.cpp +0 -373
  756. amps-python-client-5.3.4.1/src/memorybookmarkstore_docs.h +0 -39
  757. amps-python-client-5.3.4.1/src/memorypublishstore.cpp +0 -160
  758. amps-python-client-5.3.4.1/src/memorypublishstore_docs.h +0 -32
  759. amps-python-client-5.3.4.1/src/message.cpp +0 -765
  760. amps-python-client-5.3.4.1/src/message_docs.h +0 -306
  761. amps-python-client-5.3.4.1/src/messagestream.cpp +0 -623
  762. amps-python-client-5.3.4.1/src/messagestream_docs.h +0 -45
  763. amps-python-client-5.3.4.1/src/mmapbookmarkstore.cpp +0 -422
  764. amps-python-client-5.3.4.1/src/nvfixbuilder.cpp +0 -160
  765. amps-python-client-5.3.4.1/src/nvfixbuilder_docs.h +0 -33
  766. amps-python-client-5.3.4.1/src/nvfixshredder.cpp +0 -99
  767. amps-python-client-5.3.4.1/src/nvfixshredder_docs.h +0 -39
  768. amps-python-client-5.3.4.1/src/publishstore.cpp +0 -183
  769. amps-python-client-5.3.4.1/src/raw_wrapper.cpp +0 -756
  770. amps-python-client-5.3.4.1/src/reason.cpp +0 -71
  771. amps-python-client-5.3.4.1/src/recoverypoint.cpp +0 -135
  772. amps-python-client-5.3.4.1/src/recoverypointadapter.cpp +0 -171
  773. amps-python-client-5.3.4.1/src/ringbookmarkstore.cpp +0 -360
  774. amps-python-client-5.3.4.1/src/serverchooser.cpp +0 -245
  775. amps-python-client-5.3.4.1/src/serverchooser_docs.h +0 -39
  776. amps-python-client-5.3.4.1/src/sowrecoverypointadapter.cpp +0 -248
  777. amps-python-client-5.3.4.1/src/store.cpp +0 -62
  778. amps-python-client-5.3.4.1/src/versioninfo.cpp +0 -175
  779. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/HISTORY +0 -0
  780. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/LICENSE +0 -0
  781. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/README.md +0 -0
  782. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/ajax-loader.gif +0 -0
  783. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/alabaster.css +0 -0
  784. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/basic.css +0 -0
  785. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/comment-bright.png +0 -0
  786. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/comment-close.png +0 -0
  787. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/comment.png +0 -0
  788. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/doctools.js +0 -0
  789. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/down-pressed.png +0 -0
  790. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/down.png +0 -0
  791. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/file.png +0 -0
  792. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/flag_logo.png +0 -0
  793. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/flag_logo.svg +0 -0
  794. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/jquery-3.1.0.js +0 -0
  795. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/jquery.js +0 -0
  796. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/minus.png +0 -0
  797. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/plus.png +0 -0
  798. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/pygments.css +0 -0
  799. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/searchtools.js +0 -0
  800. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/underscore-1.3.1.js +0 -0
  801. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/underscore.js +0 -0
  802. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/up-pressed.png +0 -0
  803. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/up.png +0 -0
  804. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/websupport.js +0 -0
  805. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_sources/code.rst.txt +0 -0
  806. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_sources/index.rst.txt +0 -0
  807. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/ajax-loader.gif +0 -0
  808. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/basic.css +0 -0
  809. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/classic.css +0 -0
  810. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/comment-bright.png +0 -0
  811. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/comment-close.png +0 -0
  812. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/comment.png +0 -0
  813. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/default.css +0 -0
  814. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/doctools.js +0 -0
  815. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/down-pressed.png +0 -0
  816. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/down.png +0 -0
  817. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/file.png +0 -0
  818. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/jquery-3.1.0.js +0 -0
  819. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/jquery.js +0 -0
  820. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/minus.png +0 -0
  821. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/plus.png +0 -0
  822. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/pygments.css +0 -0
  823. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/searchtools.js +0 -0
  824. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/sidebar.js +0 -0
  825. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/underscore-1.3.1.js +0 -0
  826. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/underscore.js +0 -0
  827. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/up-pressed.png +0 -0
  828. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/up.png +0 -0
  829. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/websupport.js +0 -0
  830. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_images/caution.png +0 -0
  831. {amps-python-client-5.3.4.1/docs/command-reference → amps-python-client-5.3.4.2/docs/python}/html/_images/caution.svg +0 -0
  832. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_images/connection_string.svg +0 -0
  833. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_images/important.png +0 -0
  834. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_images/important.svg +0 -0
  835. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_images/tip.png +0 -0
  836. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_images/tip.svg +0 -0
  837. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_images/warning.png +0 -0
  838. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_sources/chapters/cpp-compiler-list.rst.txt +0 -0
  839. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_sources/index.rst.txt +0 -0
  840. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/ajax-loader.gif +0 -0
  841. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/alabaster.css +0 -0
  842. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/basic.css +0 -0
  843. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/comment-bright.png +0 -0
  844. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/comment-close.png +0 -0
  845. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/comment.png +0 -0
  846. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/doctools.js +0 -0
  847. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/down-pressed.png +0 -0
  848. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/down.png +0 -0
  849. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/file.png +0 -0
  850. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/flag_logo.png +0 -0
  851. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/flag_logo.svg +0 -0
  852. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/jquery-3.1.0.js +0 -0
  853. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/jquery.js +0 -0
  854. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/minus.png +0 -0
  855. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/plus.png +0 -0
  856. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/pygments.css +0 -0
  857. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/searchtools.js +0 -0
  858. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/underscore-1.3.1.js +0 -0
  859. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/underscore.js +0 -0
  860. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/up-pressed.png +0 -0
  861. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/up.png +0 -0
  862. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/websupport.js +0 -0
  863. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_sources/chapters/crankitup.rst.txt +0 -0
  864. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_sources/chapters/equipment.rst.txt +0 -0
  865. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_sources/index.rst.txt +0 -0
  866. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/ajax-loader.gif +0 -0
  867. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/alabaster.css +0 -0
  868. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/basic.css +0 -0
  869. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/comment-bright.png +0 -0
  870. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/comment-close.png +0 -0
  871. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/comment.png +0 -0
  872. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/doctools.js +0 -0
  873. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/down-pressed.png +0 -0
  874. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/down.png +0 -0
  875. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/file.png +0 -0
  876. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/flag_logo.png +0 -0
  877. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/flag_logo.svg +0 -0
  878. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/jquery-3.1.0.js +0 -0
  879. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/jquery.js +0 -0
  880. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/minus.png +0 -0
  881. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/plus.png +0 -0
  882. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/pygments.css +0 -0
  883. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/searchtools.js +0 -0
  884. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/underscore-1.3.1.js +0 -0
  885. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/underscore.js +0 -0
  886. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/up-pressed.png +0 -0
  887. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/up.png +0 -0
  888. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/websupport.js +0 -0
  889. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/resources/custom.css +0 -0
  890. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/resources/flag_logo.svg +0 -0
  891. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_sources/chapters/spark.rst.txt +0 -0
  892. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/ajax-loader.gif +0 -0
  893. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/alabaster.css +0 -0
  894. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/basic.css +0 -0
  895. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/comment-bright.png +0 -0
  896. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/comment-close.png +0 -0
  897. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/comment.png +0 -0
  898. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/doctools.js +0 -0
  899. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/down-pressed.png +0 -0
  900. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/down.png +0 -0
  901. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/file.png +0 -0
  902. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/flag_logo.png +0 -0
  903. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/flag_logo.svg +0 -0
  904. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/jquery-3.1.0.js +0 -0
  905. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/jquery.js +0 -0
  906. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/minus.png +0 -0
  907. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/plus.png +0 -0
  908. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/pygments.css +0 -0
  909. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/searchtools.js +0 -0
  910. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/underscore-1.3.1.js +0 -0
  911. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/underscore.js +0 -0
  912. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/up-pressed.png +0 -0
  913. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/up.png +0 -0
  914. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/websupport.js +0 -0
  915. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/src/cpp/include/amps/amps_generated.h +0 -0
  916. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/src/cpp/src/amps_protocol_generated.h +0 -0
  917. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/src/cpp/src/makefile +0 -0
@@ -0,0 +1,1628 @@
1
+ ////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // Copyright (c) 2010-2024 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 _MEMORYBOOKMARKSTORE_H_
27
+ #define _MEMORYBOOKMARKSTORE_H_
28
+
29
+ #include <amps/BookmarkStore.hpp>
30
+ #include <amps/Field.hpp>
31
+ #include <amps/Message.hpp>
32
+ #include <amps/RecoveryPoint.hpp>
33
+ #include <amps/RecoveryPointAdapter.hpp>
34
+ #include <functional>
35
+ #include <map>
36
+ #include <sstream>
37
+ #include <vector>
38
+ #include <stdlib.h>
39
+ #include <assert.h>
40
+
41
+ #define AMPS_MIN_BOOKMARK_LEN 3
42
+ #define AMPS_INITIAL_MEMORY_BOOKMARK_SIZE 16384UL
43
+
44
+ /// \file MemoryBookmarkStore.hpp
45
+ /// \brief Provides AMPS::MemoryBookmarkStore, a bookmark store that holds
46
+ /// bookmarks in memory. This bookmark store protects against connectivity
47
+ /// failures.
48
+
49
+ namespace AMPS
50
+ {
51
+
52
+ ///
53
+ /// A BookmarkStoreImpl implementation that stores bookmarks in memory. This
54
+ /// store protects against connectivity failures. This store does not
55
+ /// persist the bookmark store, so this store cannot be used to resume
56
+ /// subscriptions after application restart.
57
+ class MemoryBookmarkStore : public BookmarkStoreImpl
58
+ {
59
+ protected:
60
+ class Subscription
61
+ {
62
+ public:
63
+ typedef std::map<Message::Field, size_t, Message::Field::FieldHash> RecoveryMap;
64
+ typedef std::map<amps_uint64_t, amps_uint64_t> PublisherMap;
65
+ typedef std::map<Message::Field, size_t, Message::Field::FieldHash>::iterator
66
+ RecoveryIterator;
67
+ typedef std::map<amps_uint64_t, amps_uint64_t>::iterator PublisherIterator;
68
+
69
+ // Start sequence at 1 so that 0 can be used during file subclasses
70
+ // recovery as an indicator that a message wasn't logged because
71
+ // isDiscarded() was true.
72
+ Subscription(MemoryBookmarkStore* store_, const Message::Field& id_)
73
+ : _current(1), _currentBase(0), _least(1), _leastBase(0)
74
+ , _recoveryMin(AMPS_UNSET_INDEX), _recoveryBase(AMPS_UNSET_INDEX)
75
+ , _recoveryMax(AMPS_UNSET_INDEX), _recoveryMaxBase(AMPS_UNSET_INDEX)
76
+ , _entriesLength(AMPS_INITIAL_MEMORY_BOOKMARK_SIZE), _entries(NULL)
77
+ , _store(store_)
78
+ {
79
+ // Need our own memory for the sub id
80
+ _id.deepCopy(id_);
81
+ _store->resize(_id, (char**)&_entries,
82
+ sizeof(Entry)*AMPS_INITIAL_MEMORY_BOOKMARK_SIZE, false);
83
+ setLastPersistedToEpoch();
84
+ }
85
+
86
+ ~Subscription()
87
+ {
88
+ Lock<Mutex> guard(_subLock);
89
+ if (_entries)
90
+ {
91
+ for (size_t i = 0; i < _entriesLength; ++i)
92
+ {
93
+ _entries[i]._val.clear();
94
+ }
95
+ // resize to 0 will free _entries
96
+ _store->resize(_id, (char**)&_entries, 0);
97
+ }
98
+ _id.clear();
99
+ _recent.clear();
100
+ _lastPersisted.clear();
101
+ _recentList.clear();
102
+ _range.clear();
103
+ _recoveryTimestamp.clear();
104
+ }
105
+
106
+ size_t log(const Message::Field& bookmark_)
107
+ {
108
+ if (bookmark_ == AMPS_BOOKMARK_NOW)
109
+ {
110
+ return 0;
111
+ }
112
+ Lock<Mutex> guard(_subLock);
113
+ // Either relog the recovery or log it
114
+ size_t index = recover(bookmark_, true);
115
+ if (index == AMPS_UNSET_INDEX)
116
+ {
117
+ // Check for wrap
118
+ if (_current >= _entriesLength)
119
+ {
120
+ _current = 0;
121
+ _currentBase += _entriesLength;
122
+ }
123
+ // Check for resize
124
+ // If list is too small, double it
125
+ if ((_current == _least && _leastBase < _currentBase) ||
126
+ (_current == _recoveryMin && _recoveryBase < _currentBase))
127
+ {
128
+ if (!_store->resize(_id, (char**)&_entries,
129
+ sizeof(Entry) * _entriesLength * 2))
130
+ {
131
+ //Try again
132
+ return log(bookmark_);
133
+ }
134
+ // Length was doubled
135
+ _entriesLength *= 2;
136
+ }
137
+
138
+ // Add this entry to the end of our list
139
+ /*
140
+ if (bookmark_ == AMPS_BOOKMARK_NOW)
141
+ {
142
+ // Save a now timestamp bookmark
143
+ char* nowTimestamp = new char[AMPS_TIMESTAMP_LEN];
144
+ struct tm timeInfo;
145
+ time_t now;
146
+ time(&now);
147
+ #ifdef _WIN32
148
+ gmtime_s(&timeInfo, &now);
149
+ #else
150
+ gmtime_r(&now, &timeInfo);
151
+ #endif
152
+ strftime(nowTimestamp, AMPS_TIMESTAMP_LEN,
153
+ "%Y%m%dT%H%M%S", &timeInfo);
154
+ nowTimestamp[AMPS_TIMESTAMP_LEN-1] = 'Z';
155
+ _entries[_current]._val.assign(nowTimestamp,
156
+ AMPS_TIMESTAMP_LEN);
157
+ _entries[_current]._active = false;
158
+ index = _current++;
159
+ return index + _currentBase;
160
+ }
161
+ else
162
+ */
163
+ {
164
+ // Is this an attempt at a range?
165
+ if (!BookmarkRange::isRange(bookmark_))
166
+ {
167
+ _entries[_current]._val.deepCopy(bookmark_);
168
+ }
169
+ else
170
+ {
171
+ // Deep copy of the range is saved
172
+ _range.set(bookmark_);
173
+ // Stricter check on range syntax
174
+ if (!_range.isValid())
175
+ {
176
+ throw CommandException("Invalid bookmark range specified.");
177
+ }
178
+ if (!_range.isStartInclusive())
179
+ {
180
+ // Put it in our publishers map
181
+ amps_uint64_t publisher, sequence;
182
+ std::vector<Field> bmList = Field::parseBookmarkList(_range.getStart());
183
+ for (std::vector<Field>::iterator bkmk = bmList.begin(); bkmk != bmList.end(); ++bkmk)
184
+ {
185
+ parseBookmark(*bkmk, publisher, sequence);
186
+ if (publisher != (amps_uint64_t)0)
187
+ {
188
+ // Compare it to our publishers map
189
+ PublisherIterator pub = _publishers.find(publisher);
190
+ if (pub == _publishers.end() || pub->second < sequence)
191
+ {
192
+ _publishers[publisher] = sequence;
193
+ }
194
+ }
195
+ }
196
+ }
197
+ Unlock<Mutex> unlock(_subLock);
198
+ _store->updateAdapter(this);
199
+ // Don't actually log a range
200
+ return 0;
201
+ }
202
+ }
203
+ _entries[_current]._active = true;
204
+ index = _current++;
205
+ }
206
+ return index + _currentBase;
207
+ }
208
+
209
+ bool discard(size_t index_)
210
+ {
211
+ Lock<Mutex> guard(_subLock);
212
+ return _discard(index_);
213
+ }
214
+
215
+ bool discard(const Message::Field& bookmark_)
216
+ {
217
+ // These are discarded when logged or not logged
218
+ if (bookmark_ == AMPS_BOOKMARK_NOW)
219
+ {
220
+ return false;
221
+ }
222
+ Lock<Mutex> guard(_subLock);
223
+ size_t search = _least;
224
+ size_t searchBase = _leastBase;
225
+ size_t searchMax = _current;
226
+ size_t searchMaxBase = _currentBase;
227
+ if (_least + _leastBase == _current + _currentBase)
228
+ {
229
+ if (_recoveryMin != AMPS_UNSET_INDEX)
230
+ {
231
+ search = _recoveryMin;
232
+ searchBase = _recoveryBase;
233
+ searchMax = _recoveryMax;
234
+ searchMaxBase = _recoveryMaxBase;
235
+ }
236
+ else // Store is empty, so nothing to do
237
+ {
238
+ return false;
239
+ }
240
+ }
241
+ assert(searchMax != AMPS_UNSET_INDEX);
242
+ assert(searchMaxBase != AMPS_UNSET_INDEX);
243
+ assert(search != AMPS_UNSET_INDEX);
244
+ assert(searchBase != AMPS_UNSET_INDEX);
245
+ // Search while we don't find the provided bookmark and we're in valid range
246
+ while (search + searchBase < searchMax + searchMaxBase)
247
+ {
248
+ if (_entries[search]._val == bookmark_)
249
+ {
250
+ return _discard(search + searchBase);
251
+ }
252
+ if (++search == _entriesLength)
253
+ {
254
+ // Least has now loooped around
255
+ searchBase += _entriesLength;
256
+ search = 0;
257
+ }
258
+ }
259
+ return false;
260
+ }
261
+
262
+ // Get sequence number from a Field that is a bookmark
263
+ static void parseBookmark(const Message::Field& field_,
264
+ amps_uint64_t& publisherId_,
265
+ amps_uint64_t& sequenceNumber_)
266
+ {
267
+ Message::Field::parseBookmark(field_, publisherId_, sequenceNumber_);
268
+ }
269
+
270
+ // Check to see if this message is older than the most recent one seen,
271
+ // and if it is, check if it discarded.
272
+ bool isDiscarded(const Message::Field& bookmark_)
273
+ {
274
+ Lock<Mutex> guard(_subLock);
275
+ if (BookmarkRange::isRange(bookmark_))
276
+ {
277
+ return false;
278
+ }
279
+ // Check if we've already recovered this bookmark
280
+ size_t recoveredIdx = recover(bookmark_, false);
281
+
282
+ amps_uint64_t publisher, sequence;
283
+ parseBookmark(bookmark_, publisher, sequence);
284
+ // Compare it to our publishers map
285
+ PublisherIterator pub = _publishers.find(publisher);
286
+ if (pub == _publishers.end() || pub->second < sequence)
287
+ {
288
+ _publishers[publisher] = sequence;
289
+ if (recoveredIdx == AMPS_UNSET_INDEX)
290
+ {
291
+ return false;
292
+ }
293
+ }
294
+ if (recoveredIdx != AMPS_UNSET_INDEX)
295
+ {
296
+ if (!_entries[recoveredIdx]._active)
297
+ {
298
+ _recovered.erase(bookmark_);
299
+ return true;
300
+ }
301
+ return false;
302
+ }
303
+ // During recovery, we don't really care if it's been discarded
304
+ // or not. We just want _publishers updated. No need for the
305
+ // costly linear search.
306
+ if (_store->_recovering)
307
+ {
308
+ return false;
309
+ }
310
+ // During failure and recovery scenarios, we'll see out of order
311
+ // bookmarks arrive, either because (a) we're replaying or (b)
312
+ // a publisher has cut over, and we've cut over to a new server.
313
+ // Scan the list to see if we have a match.
314
+ size_t base = _leastBase;
315
+ for (size_t i = _least; i + base < _current + _currentBase; i++)
316
+ {
317
+ if ( i >= _entriesLength )
318
+ {
319
+ i = 0;
320
+ base = _currentBase;
321
+ }
322
+ if (_entries[i]._val == bookmark_)
323
+ {
324
+ return !_entries[i]._active;
325
+ }
326
+ }
327
+
328
+ return true; // message is totally discarded
329
+ }
330
+
331
+ bool empty(void) const
332
+ {
333
+ if (_least == AMPS_UNSET_INDEX ||
334
+ ((_least + _leastBase) == (_current + _currentBase) &&
335
+ _recoveryMin == AMPS_UNSET_INDEX))
336
+ {
337
+ return true;
338
+ }
339
+ return false;
340
+ }
341
+
342
+ void updateMostRecent()
343
+ {
344
+ Lock<Mutex> guard(_subLock);
345
+ _updateMostRecent();
346
+ }
347
+
348
+ const BookmarkRange& getRange() const
349
+ {
350
+ return _range;
351
+ }
352
+
353
+ Message::Field getMostRecentList(bool usePublishersList_ = true)
354
+ {
355
+ Lock<Mutex> guard(_subLock);
356
+ bool useLastPersisted = !_lastPersisted.empty() &&
357
+ _lastPersisted.len() > 1;
358
+ // when this is called, we'll take a moment to update the list
359
+ // of things recovered,
360
+ // so we don't accidentally log anything we ought not to.
361
+ _updateMostRecent();
362
+ bool useRecent = !_recent.empty() && _recent.len() > 1;
363
+ amps_uint64_t lastPublisher = 0;
364
+ amps_uint64_t lastSeq = 0;
365
+ amps_uint64_t recentPublisher = 0;
366
+ amps_uint64_t recentSeq = 0;
367
+ if (useLastPersisted)
368
+ {
369
+ parseBookmark(_lastPersisted, lastPublisher, lastSeq);
370
+ }
371
+ if (useRecent)
372
+ {
373
+ parseBookmark(_recent, recentPublisher, recentSeq);
374
+ if (empty() && useLastPersisted)
375
+ {
376
+ useRecent = false;
377
+ }
378
+ else
379
+ {
380
+ if (useLastPersisted && lastPublisher == recentPublisher)
381
+ {
382
+ if (lastSeq <= recentSeq)
383
+ {
384
+ useRecent = false;
385
+ }
386
+ else
387
+ {
388
+ useLastPersisted = false;
389
+ }
390
+ }
391
+ }
392
+ }
393
+ // Set size for all bookmarks that will be used
394
+ size_t totalLen = (useLastPersisted ? _lastPersisted.len() + 1 : 0);
395
+ if (useRecent)
396
+ {
397
+ totalLen += _recent.len() + 1;
398
+ }
399
+ // If we don't have a non-EPOCH persisted ack and we don't have a
400
+ // non-EPOCH most recent bookmark, OR we have a range
401
+ // we can build a list based on all the publishers instead.
402
+ if (usePublishersList_
403
+ && ((!useLastPersisted && !useRecent)
404
+ || _lastPersisted == AMPS_BOOKMARK_EPOCH))
405
+ {
406
+ std::ostringstream os;
407
+ for (PublisherIterator pub = _publishers.begin();
408
+ pub != _publishers.end(); ++pub)
409
+ {
410
+ if (pub->first == 0 && pub->second == 0)
411
+ {
412
+ continue;
413
+ }
414
+ if (pub->first == recentPublisher && recentSeq < pub->second)
415
+ {
416
+ os << recentPublisher << '|' << recentSeq << "|,";
417
+ }
418
+ else
419
+ {
420
+ os << pub->first << '|' << pub->second << "|,";
421
+ }
422
+ }
423
+ std::string recent = os.str();
424
+ totalLen = recent.length();
425
+ if (!recent.empty())
426
+ {
427
+ if (!_recoveryTimestamp.empty())
428
+ {
429
+ totalLen += _recoveryTimestamp.len();
430
+ recent += std::string(_recoveryTimestamp);
431
+ }
432
+ else
433
+ {
434
+ // Remove trailing ,
435
+ recent.erase(--totalLen);
436
+ }
437
+ // Reset _recentList to new value and return it
438
+ _recentList.clear();
439
+ _recentList = Message::Field(recent).deepCopy();
440
+ if (_range.isValid())
441
+ {
442
+ if (_range.getStart() != recent
443
+ && _recentList != AMPS_BOOKMARK_EPOCH)
444
+ {
445
+ _range.replaceStart(_recentList, true);
446
+ }
447
+ else if (_range.isStartInclusive())
448
+ {
449
+ amps_uint64_t publisher, sequence;
450
+ parseBookmark(_range.getStart(), publisher,
451
+ sequence);
452
+ PublisherIterator pub = _publishers.find(publisher);
453
+ if (pub != _publishers.end()
454
+ && pub->second >= sequence)
455
+ {
456
+ _range.makeStartExclusive();
457
+ }
458
+ }
459
+ return _range;
460
+ }
461
+ return _recentList;
462
+ }
463
+ if (_range.isValid())
464
+ {
465
+ return _range;
466
+ }
467
+ }
468
+ if (!_recoveryTimestamp.empty() && !_range.isValid())
469
+ {
470
+ totalLen += _recoveryTimestamp.len() + 1;
471
+ }
472
+ // If we have nothing discarded, return EPOCH
473
+ if (totalLen == 0
474
+ || (_recent.len() < 2 && !empty()))
475
+ {
476
+ if (_range.isValid())
477
+ {
478
+ return _range;
479
+ }
480
+ if (!useRecent)
481
+ {
482
+ return Message::Field(AMPS_BOOKMARK_EPOCH);
483
+ }
484
+ _setLastPersistedToEpoch();
485
+ return _lastPersisted;
486
+ }
487
+ // Remove the trailing , from the length
488
+ totalLen -= 1;
489
+ char* field = new char[totalLen];
490
+ size_t len = 0;
491
+ if (useRecent)
492
+ {
493
+ len = _recent.len();
494
+ memcpy(field, _recent.data(), len);
495
+ if (len < totalLen)
496
+ {
497
+ field[len++] = ',';
498
+ }
499
+ }
500
+ if (useLastPersisted)
501
+ {
502
+ memcpy(field + len, _lastPersisted.data(), _lastPersisted.len());
503
+ len += _lastPersisted.len();
504
+ if (len < totalLen)
505
+ {
506
+ field[len++] = ',';
507
+ }
508
+ }
509
+ if (!_recoveryTimestamp.empty() && !_range.isValid())
510
+ {
511
+ memcpy(field + len, _recoveryTimestamp.data(),
512
+ _recoveryTimestamp.len());
513
+ // If more is to be written after this, uncomment the following
514
+ //len += _lastPersisted.len();
515
+ //if (len < totalLen) field[len++] = ',';
516
+ }
517
+ // _recentList clear will delete[] current buffer and assign will get cleared
518
+ _recentList.clear();
519
+ _recentList.assign(field, totalLen);
520
+ if (_range.isValid())
521
+ {
522
+ if (_recentList != AMPS_BOOKMARK_EPOCH)
523
+ {
524
+ if (_range.getStart() != _recentList)
525
+ {
526
+ _range.replaceStart(_recentList, true);
527
+ }
528
+ else if (_range.isStartInclusive())
529
+ {
530
+ amps_uint64_t publisher, sequence;
531
+ parseBookmark(_range.getStart(), publisher,
532
+ sequence);
533
+ PublisherIterator pub = _publishers.find(publisher);
534
+ if (pub != _publishers.end()
535
+ && pub->second >= sequence)
536
+ {
537
+ _range.makeStartExclusive();
538
+ }
539
+ }
540
+ }
541
+ return _range;
542
+ }
543
+ return _recentList;
544
+ }
545
+
546
+ Message::Field getMostRecent(bool update_ = false)
547
+ {
548
+ Lock<Mutex> guard(_subLock);
549
+ // Return the same as last time if nothing's changed
550
+ // _recent is the most recent bookmark.
551
+ if (update_ && _store->_recentChanged)
552
+ {
553
+ _updateMostRecent();
554
+ }
555
+ if (_recent.empty())
556
+ {
557
+ return Message::Field(AMPS_BOOKMARK_EPOCH);
558
+ }
559
+ else
560
+ {
561
+ return _recent;
562
+ }
563
+ }
564
+
565
+ Message::Field getLastPersisted()
566
+ {
567
+ Lock<Mutex> guard(_subLock);
568
+ return _lastPersisted;
569
+ }
570
+
571
+ void setMostRecent(const Message::Field& recent_)
572
+ {
573
+ _recent.clear();
574
+ _recent.deepCopy(recent_);
575
+ }
576
+
577
+ void setRecoveryTimestamp(const char* recoveryTimestamp_,
578
+ size_t len_ = 0)
579
+ {
580
+ _recoveryTimestamp.clear();
581
+ size_t len = (len_ == 0) ? AMPS_TIMESTAMP_LEN : len_;
582
+ char* ts = new char[len];
583
+ memcpy((void*)ts, (const void*)recoveryTimestamp_, len);
584
+ _recoveryTimestamp.assign(ts, len);
585
+ }
586
+
587
+ void moveEntries(char* old_, char* new_, size_t newSize_)
588
+ {
589
+ size_t least = _least;
590
+ size_t leastBase = _leastBase;
591
+ if (_recoveryMin != AMPS_UNSET_INDEX)
592
+ {
593
+ least = _recoveryMin;
594
+ leastBase = _recoveryBase;
595
+ }
596
+ // First check if we grew in place, if so, just move current after least
597
+ if (old_ == new_)
598
+ {
599
+ if (newSize_ - (sizeof(Entry)*_entriesLength) > sizeof(Entry)*least)
600
+ {
601
+ memcpy(new_ + (sizeof(Entry)*_entriesLength),
602
+ old_, (sizeof(Entry)*least));
603
+ // Clear the beginning where those entries were
604
+ memset(old_, 0, sizeof(Entry)*least);
605
+ }
606
+ else // We have to use an intermediate buffer
607
+ {
608
+ Entry* buffer = new Entry[least];
609
+ memcpy((void*)buffer, (void*)old_, sizeof(Entry)*least);
610
+ //Put the beginning entries at the start of the new buffer
611
+ memcpy((void*)new_, (void*)((char*)old_ + (sizeof(Entry)*least)),
612
+ (_entriesLength - least)*sizeof(Entry));
613
+ //Put the end entries after the beginning entries
614
+ memcpy((void*)((char*)new_ + ((_entriesLength - least)*sizeof(Entry))),
615
+ (void*)buffer, least * sizeof(Entry));
616
+ // Least is now at 0 so base must be increased
617
+ leastBase += least;
618
+ least = 0;
619
+ delete [] buffer;
620
+ }
621
+ }
622
+ else
623
+ {
624
+ //Put the beginning entries at the start of the new buffer
625
+ memcpy((void*)new_, (void*)((char*)old_ + (sizeof(Entry)*least)),
626
+ (_entriesLength - least)*sizeof(Entry));
627
+ //Put the end entries after the beginning entries
628
+ memcpy((void*)((char*)new_ + ((_entriesLength - least)*sizeof(Entry))),
629
+ (void*)old_, least * sizeof(Entry));
630
+ // Least is now at 0 so base must be increased
631
+ leastBase += least;
632
+ least = 0;
633
+ }
634
+ if (_recoveryMin != AMPS_UNSET_INDEX)
635
+ {
636
+ _least = least + (_least + _leastBase) - (_recoveryMin + _recoveryBase);
637
+ _recoveryMax = least + (_recoveryMax + _recoveryMaxBase) -
638
+ (_recoveryMin + _recoveryBase);
639
+ _recoveryMaxBase = leastBase;
640
+ _recoveryMin = least;
641
+ _recoveryBase = leastBase;
642
+ }
643
+ else
644
+ {
645
+ _least = least;
646
+ }
647
+ _leastBase = leastBase;
648
+ // Current is now after everything and using the same base
649
+ _currentBase = _leastBase;
650
+ _current = least + _entriesLength;
651
+ }
652
+
653
+ inline size_t getOldestBookmarkSeq()
654
+ {
655
+ Lock<Mutex> guard(_subLock);
656
+ // If there is nothing in the store, return -1, otherwise return lowest
657
+ return ((_least + _leastBase) == (_current + _currentBase)) ? AMPS_UNSET_INDEX :
658
+ _least + _leastBase;
659
+ }
660
+
661
+ bool lastPersisted(const Message::Field& bookmark_)
662
+ {
663
+ // These shouldn't be persisted
664
+ if (bookmark_ == AMPS_BOOKMARK_NOW
665
+ || BookmarkRange::isRange(bookmark_))
666
+ {
667
+ return false;
668
+ }
669
+ Lock<Mutex> guard(_subLock);
670
+ return _setLastPersisted(bookmark_);
671
+ }
672
+
673
+ bool _setLastPersisted(const Message::Field& bookmark_)
674
+ {
675
+ if (!_lastPersisted.empty())
676
+ {
677
+ amps_uint64_t publisher, publisher_lastPersisted;
678
+ amps_uint64_t sequence, sequence_lastPersisted;
679
+ parseBookmark(bookmark_, publisher, sequence);
680
+ parseBookmark(_lastPersisted, publisher_lastPersisted,
681
+ sequence_lastPersisted);
682
+ if (publisher == publisher_lastPersisted &&
683
+ sequence <= sequence_lastPersisted)
684
+ {
685
+ return false;
686
+ }
687
+ }
688
+ // deepCopy will clear what's in _lastPersisted
689
+ _lastPersisted.deepCopy(bookmark_);
690
+ _store->_recentChanged = true;
691
+ _recoveryTimestamp.clear();
692
+ return true;
693
+ }
694
+
695
+ Message::Field lastPersisted(size_t bookmark_)
696
+ {
697
+ Lock<Mutex> guard(_subLock);
698
+ Message::Field& bookmark = _entries[bookmark_]._val;
699
+ // These shouldn't be persisted
700
+ if (bookmark == AMPS_BOOKMARK_NOW
701
+ || BookmarkRange::isRange(bookmark))
702
+ {
703
+ return bookmark;
704
+ }
705
+ _setLastPersisted(bookmark);
706
+ return bookmark;
707
+ }
708
+
709
+ // Returns the index of the recovered item, either the index where it
710
+ // was first stored prior to getMostRecent, or the new index if it is
711
+ // relogged either because this is called from log() or because it was
712
+ // not active but also not persisted.
713
+ size_t recover(const Message::Field& bookmark_, bool relogIfNotDiscarded)
714
+ {
715
+ size_t retVal = AMPS_UNSET_INDEX;
716
+ if (_recovered.empty() || _recoveryBase == AMPS_UNSET_INDEX)
717
+ {
718
+ return retVal;
719
+ }
720
+ // Check if this is a recovered bookmark.
721
+ // If so, copy the existing one to the new location
722
+ RecoveryIterator item = _recovered.find(bookmark_);
723
+ if (item != _recovered.end())
724
+ {
725
+ size_t seqNo = item->second;
726
+ size_t index = (seqNo - _recoveryBase) % _entriesLength;
727
+ // If we only have recovery entries and isDiscarded is
728
+ // checking on an already discarded entry, update recent.
729
+ if (_least + _leastBase == _current + _currentBase &&
730
+ !_entries[index]._active)
731
+ {
732
+ _store->_recentChanged = true;
733
+ _recent.clear();
734
+ _recent = _entries[index]._val.deepCopy();
735
+ retVal = moveEntry(index);
736
+ if (retVal == AMPS_UNSET_INDEX)
737
+ {
738
+ recover(bookmark_, relogIfNotDiscarded);
739
+ }
740
+ _least = _current;
741
+ _leastBase = _currentBase;
742
+ }
743
+ else if (!_entries[index]._active || relogIfNotDiscarded)
744
+ {
745
+ retVal = moveEntry(index);
746
+ if (retVal == AMPS_UNSET_INDEX)
747
+ {
748
+ recover(bookmark_, relogIfNotDiscarded);
749
+ }
750
+ }
751
+ else
752
+ {
753
+ return index;
754
+ }
755
+ _recovered.erase(item);
756
+ if (_recovered.empty())
757
+ {
758
+ _recoveryMin = AMPS_UNSET_INDEX;
759
+ _recoveryBase = AMPS_UNSET_INDEX;
760
+ _recoveryMax = AMPS_UNSET_INDEX;
761
+ _recoveryMaxBase = AMPS_UNSET_INDEX;
762
+ }
763
+ else if (index == _recoveryMin)
764
+ {
765
+ while (_entries[_recoveryMin]._val.empty() &&
766
+ (_recoveryMin + _recoveryBase) < (_recoveryMax + _recoveryMaxBase))
767
+ {
768
+ if (++_recoveryMin == _entriesLength)
769
+ {
770
+ _recoveryMin = 0;
771
+ _recoveryBase += _entriesLength;
772
+ }
773
+ }
774
+ }
775
+ }
776
+ return retVal;
777
+ }
778
+
779
+ // Return the id of this Subscription
780
+ Message::Field id() const
781
+ {
782
+ return _id;
783
+ }
784
+
785
+ struct Entry
786
+ {
787
+ Message::Field _val; //16
788
+ bool _active; //17
789
+ char _padding[32 - sizeof(Message::Field) - sizeof(bool)]; //32
790
+
791
+ Entry() : _active(false)
792
+ {
793
+ ;
794
+ }
795
+ };
796
+
797
+ struct EntryHash
798
+ {
799
+ Field::FieldHash _hasher;
800
+
801
+ size_t operator()(const Entry* entryPtr_) const
802
+ {
803
+ return _hasher(entryPtr_->_val);
804
+ }
805
+
806
+ bool operator()(const Entry* lhsPtr_, const Entry* rhsPtr_) const
807
+ {
808
+ return _hasher(lhsPtr_->_val, rhsPtr_->_val);
809
+ }
810
+ };
811
+
812
+ //typedef std::set<Entry*, EntryHash> EntryPtrList;
813
+ typedef std::vector<Entry*> EntryPtrList;
814
+
815
+ void getRecoveryEntries(EntryPtrList& list_)
816
+ {
817
+ if (_recoveryMin == AMPS_UNSET_INDEX ||
818
+ _recoveryMax == AMPS_UNSET_INDEX)
819
+ {
820
+ return;
821
+ }
822
+ size_t base = _recoveryBase;
823
+ size_t max = _recoveryMax + _recoveryMaxBase;
824
+ for (size_t i = _recoveryMin; i + base < max; ++i)
825
+ {
826
+ if (i == _entriesLength)
827
+ {
828
+ i = 0;
829
+ base = _recoveryMaxBase;
830
+ }
831
+ //list_.insert(&(_entries[i]));
832
+ list_.push_back(&(_entries[i]));
833
+ }
834
+ return;
835
+ }
836
+
837
+ void getActiveEntries(EntryPtrList& list_)
838
+ {
839
+ size_t base = _leastBase;
840
+ for (size_t i = _least; i + base < _current + _currentBase; ++i)
841
+ {
842
+ if (i >= _entriesLength)
843
+ {
844
+ i = 0;
845
+ base = _currentBase;
846
+ }
847
+ //list_.insert(&(_entries[i]));
848
+ list_.push_back(&(_entries[i]));
849
+ }
850
+ return;
851
+ }
852
+
853
+ Entry* getEntryByIndex(size_t index_)
854
+ {
855
+ Lock<Mutex> guard(_subLock);
856
+ size_t base = (_recoveryBase == AMPS_UNSET_INDEX ||
857
+ index_ >= _least + _leastBase)
858
+ ? _leastBase : _recoveryBase;
859
+ // Return NULL if not a valid index
860
+ size_t min = (_recoveryMin == AMPS_UNSET_INDEX ?
861
+ _least + _leastBase :
862
+ _recoveryMin + _recoveryBase);
863
+ if (index_ >= _current + _currentBase || index_ < min)
864
+ {
865
+ return NULL;
866
+ }
867
+ return &(_entries[(index_ - base) % _entriesLength]);
868
+ }
869
+
870
+ void justRecovered()
871
+ {
872
+ Lock<Mutex> guard(_subLock);
873
+ _updateMostRecent();
874
+ EntryPtrList list;
875
+ getRecoveryEntries(list);
876
+ setPublishersToDiscarded(&list, &_publishers);
877
+ }
878
+
879
+ void setPublishersToDiscarded(EntryPtrList* recovered_,
880
+ PublisherMap* publishers_)
881
+ {
882
+ // Need to reset publishers to only have up to the last
883
+ // discarded sequence number. Messages that were in transit
884
+ // during previous run but not discarded should be considered
885
+ // new and not duplicate after a restart/recovery.
886
+ for (EntryPtrList::iterator i = recovered_->begin();
887
+ i != recovered_->end(); ++i)
888
+ {
889
+ if ((*i)->_val.empty())
890
+ {
891
+ continue;
892
+ }
893
+ amps_uint64_t publisher = (amps_uint64_t)0;
894
+ amps_uint64_t sequence = (amps_uint64_t)0;
895
+ parseBookmark((*i)->_val, publisher, sequence);
896
+ if (publisher && sequence && (*i)->_active &&
897
+ (*publishers_)[publisher] >= sequence)
898
+ {
899
+ (*publishers_)[publisher] = sequence - 1;
900
+ }
901
+ }
902
+ }
903
+
904
+ void clearLastPersisted()
905
+ {
906
+ Lock<Mutex> guard(_subLock);
907
+ _lastPersisted.clear();
908
+ }
909
+
910
+ void setLastPersistedToEpoch()
911
+ {
912
+ Lock<Mutex> guard(_subLock);
913
+ _setLastPersistedToEpoch();
914
+ }
915
+
916
+ private:
917
+ Subscription(const Subscription&);
918
+ Subscription& operator=(const Subscription&);
919
+
920
+ size_t moveEntry(size_t index_)
921
+ {
922
+ // Check for wrap
923
+ if (_current >= _entriesLength)
924
+ {
925
+ _current = 0;
926
+ _currentBase += _entriesLength;
927
+ }
928
+ // Check for resize
929
+ // If list is too small, double it
930
+ if ((_current == _least % _entriesLength &&
931
+ _leastBase < _currentBase) ||
932
+ (_current == _recoveryMin && _recoveryBase < _currentBase))
933
+ {
934
+ if (!_store->resize(_id, (char**)&_entries,
935
+ sizeof(Entry) * _entriesLength * 2))
936
+ {
937
+ return AMPS_UNSET_INDEX;
938
+ }
939
+ // Length was doubled
940
+ _entriesLength *= 2;
941
+ }
942
+ _entries[_current]._val = _entries[index_]._val;
943
+ _entries[_current]._active = _entries[index_]._active;
944
+ // No need to clear Field, just set it to empty
945
+ _entries[index_]._val.assign(NULL, 0);
946
+ _entries[index_]._active = false;
947
+ return _current++;
948
+ }
949
+
950
+ void _setLastPersistedToEpoch()
951
+ {
952
+ size_t fieldLen = strlen(AMPS_BOOKMARK_EPOCH);
953
+ char* field = new char[fieldLen];
954
+ memcpy(field, AMPS_BOOKMARK_EPOCH, fieldLen);
955
+ _lastPersisted.clear();
956
+ _lastPersisted.assign(field, fieldLen);
957
+ }
958
+
959
+ bool _discard(size_t index_)
960
+ {
961
+ bool retVal = false;
962
+ // Lock should already be held
963
+ assert((_recoveryBase == AMPS_UNSET_INDEX && _recoveryMin == AMPS_UNSET_INDEX) ||
964
+ (_recoveryBase != AMPS_UNSET_INDEX && _recoveryMin != AMPS_UNSET_INDEX));
965
+ size_t base = (_recoveryBase == AMPS_UNSET_INDEX
966
+ || index_ >= _least + _leastBase)
967
+ ? _leastBase : _recoveryBase;
968
+ // discard of a record not in the log is a no-op
969
+ size_t min = (_recoveryMin == AMPS_UNSET_INDEX ? _least + _leastBase :
970
+ _recoveryMin + _recoveryBase);
971
+ if (index_ >= _current + _currentBase || index_ < min)
972
+ {
973
+ return retVal;
974
+ }
975
+
976
+ // log that this one is discarded, then
977
+ // recalculate what the most recent entry is.
978
+ Entry& e = _entries[(index_ - base) % _entriesLength];
979
+ e._active = false;
980
+
981
+ size_t index = index_;
982
+ if (_recoveryMin != AMPS_UNSET_INDEX &&
983
+ index_ == _recoveryMin + _recoveryBase)
984
+ {
985
+ // Find all to discard
986
+ size_t j = _recoveryMin;
987
+ while (j + _recoveryBase < _recoveryMax + _recoveryMaxBase &&
988
+ !_entries[j]._active)
989
+ {
990
+ // This index might be left-over from a slow discard and we
991
+ // may have reconnected. We have a few possibilities at this point.
992
+ // 1. If we re-logged this bookmark, this index will point at an
993
+ // empty bookmark. This could happen if the discard thread was slow
994
+ // and the reconnect was fast. We wouldn't report the
995
+ // the re-arrival of the bookmark as a duplicate because it
996
+ // hadn't been marked as discarded. In this case, we have to
997
+ // simply move past this in the recovery area.
998
+ // 2. This bookmark should become _recent because we haven't
999
+ // yet received anything since our last call to getMostRecent.
1000
+ // In this case, we need to take it out of recovered but not
1001
+ // clear it. The publishers map should report it as duplicate.
1002
+ // 3. This is the 'oldest' recovered, but we have received new
1003
+ // bookmarks since we got this one. We can clear it because the
1004
+ // publishers map should report it as a duplicate if/when it
1005
+ // does arrive again. Move the _recoveryMin ahead and remove it
1006
+ // from recovered.
1007
+ Message::Field& bookmark = _entries[j]._val;
1008
+ // Option 1 skips this and just moves on
1009
+ if (!bookmark.empty())
1010
+ {
1011
+ _recovered.erase(bookmark);
1012
+ // Make sure our publishers map will mark it discarded
1013
+ amps_uint64_t publisher, sequence;
1014
+ parseBookmark(bookmark, publisher, sequence);
1015
+ PublisherIterator pub = _publishers.find(publisher);
1016
+ if (pub == _publishers.end() || pub->second < sequence)
1017
+ {
1018
+ _publishers[publisher] = sequence;
1019
+ }
1020
+ if (_least + _leastBase == _current + _currentBase ||
1021
+ ((_least + _leastBase) % _entriesLength) ==
1022
+ ((_recoveryMin + _recoveryBase + 1)) % _entriesLength)
1023
+ {
1024
+ // Option 2, reset recent
1025
+ retVal = true;
1026
+ _store->_recentChanged = true;
1027
+ _recoveryTimestamp.clear();
1028
+ _recent.clear();
1029
+ _recent = bookmark;
1030
+ bookmark.assign(NULL, 0);
1031
+ }
1032
+ else
1033
+ {
1034
+ // Option 3, simply clear this one
1035
+ bookmark.clear();
1036
+ }
1037
+ }
1038
+ // If we reach the buffer end,
1039
+ // keep checking from the beginning
1040
+ if (++j == _entriesLength)
1041
+ {
1042
+ // Least has now loooped around
1043
+ _recoveryBase += _entriesLength;
1044
+ j = 0;
1045
+ }
1046
+ }
1047
+ assert(j + _recoveryBase != _recoveryMax + _recoveryMaxBase ||
1048
+ _recovered.empty());
1049
+ if (_recovered.empty())
1050
+ {
1051
+ _recoveryMin = AMPS_UNSET_INDEX;
1052
+ _recoveryBase = AMPS_UNSET_INDEX;
1053
+ _recoveryMax = AMPS_UNSET_INDEX;
1054
+ _recoveryMaxBase = AMPS_UNSET_INDEX;
1055
+ // Cleared recovered, want to check onward
1056
+ index = _least + _leastBase;
1057
+ }
1058
+ else
1059
+ {
1060
+ _recoveryMin = j;
1061
+ }
1062
+ }
1063
+ // if this is the first item in the list, discard all inactive ones
1064
+ // as long as recovery also says its okay
1065
+ if (index == _least + _leastBase)
1066
+ {
1067
+ // Find all to discard
1068
+ size_t j = _least;
1069
+ while (j + _leastBase < _current + _currentBase &&
1070
+ !_entries[j]._active)
1071
+ {
1072
+ //Must free associated memory
1073
+ _recent.clear();
1074
+ _recent = _entries[j]._val;
1075
+ _entries[j]._val.assign(NULL, 0);
1076
+ _store->_recentChanged = true;
1077
+ retVal = true;
1078
+ _recoveryTimestamp.clear();
1079
+ // If we reach the buffer end,
1080
+ // keep checking from the beginning
1081
+ if (++j == _entriesLength)
1082
+ {
1083
+ // Least has now loooped around
1084
+ _leastBase += _entriesLength;
1085
+ j = 0;
1086
+ }
1087
+ }
1088
+ _least = j;
1089
+ }
1090
+ return retVal;
1091
+ }
1092
+
1093
+ void _updateMostRecent()
1094
+ {
1095
+ // Lock is already held
1096
+ _recovered.clear();
1097
+ assert((_recoveryBase == AMPS_UNSET_INDEX && _recoveryMin == AMPS_UNSET_INDEX) ||
1098
+ (_recoveryBase != AMPS_UNSET_INDEX && _recoveryMin != AMPS_UNSET_INDEX));
1099
+ size_t base = (_recoveryMin == AMPS_UNSET_INDEX) ? _leastBase : _recoveryBase;
1100
+ size_t start = (_recoveryMin == AMPS_UNSET_INDEX) ? _least : _recoveryMin;
1101
+ _recoveryMin = AMPS_UNSET_INDEX;
1102
+ _recoveryBase = AMPS_UNSET_INDEX;
1103
+ _recoveryMax = AMPS_UNSET_INDEX;
1104
+ _recoveryMaxBase = AMPS_UNSET_INDEX;
1105
+ for (size_t i = start; i + base < _current + _currentBase; i++)
1106
+ {
1107
+ if ( i >= _entriesLength )
1108
+ {
1109
+ i = 0;
1110
+ base = _currentBase;
1111
+ }
1112
+ if (i >= _recoveryMax + _recoveryBase && i < _least + _leastBase)
1113
+ {
1114
+ continue;
1115
+ }
1116
+ Entry& entry = _entries[i];
1117
+ if (!entry._val.empty())
1118
+ {
1119
+ _recovered[entry._val] = i + base;
1120
+ if (_recoveryMin == AMPS_UNSET_INDEX)
1121
+ {
1122
+ _recoveryMin = i;
1123
+ _recoveryBase = base;
1124
+ _recoveryMax = _current;
1125
+ _recoveryMaxBase = _currentBase;
1126
+ }
1127
+ }
1128
+ }
1129
+ if (_current == _entriesLength)
1130
+ {
1131
+ _current = 0;
1132
+ _currentBase += _entriesLength;
1133
+ }
1134
+ _least = _current;
1135
+ _leastBase = _currentBase;
1136
+ }
1137
+
1138
+ Message::Field _id;
1139
+ Message::Field _recent;
1140
+ Message::Field _lastPersisted;
1141
+ Message::Field _recentList;
1142
+ BookmarkRange _range;
1143
+ Message::Field _recoveryTimestamp;
1144
+ size_t _current;
1145
+ size_t _currentBase;
1146
+ size_t _least;
1147
+ size_t _leastBase;
1148
+ size_t _recoveryMin;
1149
+ size_t _recoveryBase;
1150
+ size_t _recoveryMax;
1151
+ size_t _recoveryMaxBase;
1152
+ size_t _entriesLength;
1153
+ Entry* _entries;
1154
+ MemoryBookmarkStore* _store;
1155
+ Mutex _subLock;
1156
+ RecoveryMap _recovered;
1157
+ public:
1158
+ PublisherMap _publishers;
1159
+ };
1160
+
1161
+ public:
1162
+ ///
1163
+ /// Creates a MemoryBookmarkStore
1164
+ MemoryBookmarkStore() : BookmarkStoreImpl(),
1165
+ _subsLock(),
1166
+ _lock(),
1167
+ _serverVersion(AMPS_DEFAULT_MIN_VERSION),
1168
+ _recentChanged(true),
1169
+ _recovering(false),
1170
+ _recoveryPointAdapter(NULL),
1171
+ _recoveryPointFactory(NULL)
1172
+ { ; }
1173
+
1174
+ typedef RecoveryPointAdapter::iterator RecoveryIterator;
1175
+
1176
+ ///
1177
+ /// Creates a MemoryBookmarkStore
1178
+ /// \param adapter_ The {@link RecoveryPointAdapter} to notify
1179
+ /// about updates.
1180
+ /// \param factory_ An optional factory function to use
1181
+ /// to create the {@link RecoveryPoint} objects sent to the recoveryPointAdapter_.
1182
+ MemoryBookmarkStore(const RecoveryPointAdapter& adapter_,
1183
+ RecoveryPointFactory factory_ = NULL)
1184
+ : BookmarkStoreImpl()
1185
+ , _subsLock()
1186
+ , _lock()
1187
+ , _serverVersion(AMPS_DEFAULT_MIN_VERSION)
1188
+ , _recentChanged(true)
1189
+ , _recovering(true)
1190
+ , _recoveryPointAdapter(adapter_)
1191
+ , _recoveryPointFactory(factory_)
1192
+ {
1193
+ Message msg;
1194
+ if (!_recoveryPointFactory)
1195
+ {
1196
+ _recoveryPointFactory = &FixedRecoveryPoint::create;
1197
+ }
1198
+ for (RecoveryIterator recoveryPoint = _recoveryPointAdapter.begin();
1199
+ recoveryPoint != _recoveryPointAdapter.end();
1200
+ ++recoveryPoint)
1201
+ {
1202
+ Field subId(recoveryPoint->getSubId());
1203
+ msg.setSubscriptionHandle(static_cast<amps_subscription_handle>(0));
1204
+ msg.setSubId(subId);
1205
+ Field bookmark = recoveryPoint->getBookmark();
1206
+ if (BookmarkRange::isRange(bookmark))
1207
+ {
1208
+ msg.setBookmark(bookmark);
1209
+ _log(msg);
1210
+ }
1211
+ else
1212
+ {
1213
+ std::vector<Field> bmList = Field::parseBookmarkList(bookmark);
1214
+ for (std::vector<Field>::iterator bkmk = bmList.begin(); bkmk != bmList.end(); ++bkmk)
1215
+ {
1216
+ if (Field::isTimestamp(*bkmk))
1217
+ {
1218
+ find(subId)->setRecoveryTimestamp(bkmk->data(), bkmk->len());
1219
+ }
1220
+ else
1221
+ {
1222
+ msg.assignBookmark(bkmk->data(), bkmk->len());
1223
+ _isDiscarded(msg);
1224
+ _log(msg);
1225
+ _discard(msg);
1226
+ }
1227
+ }
1228
+ // Reset to original bookmark
1229
+ msg.setBookmark(bookmark);
1230
+ }
1231
+ }
1232
+ _recovering = false;
1233
+ }
1234
+
1235
+ virtual ~MemoryBookmarkStore()
1236
+ {
1237
+ if (_recoveryPointAdapter.isValid())
1238
+ {
1239
+ _recoveryPointAdapter.close();
1240
+ }
1241
+ __purge();
1242
+ }
1243
+
1244
+ ///
1245
+ /// Log a bookmark to the persistent log and return the corresponding
1246
+ /// sequence number for this bookmark.
1247
+ /// \param message_ The Message to log.
1248
+ ///
1249
+ virtual size_t log(Message& message_)
1250
+ {
1251
+ Lock<Mutex> guard(_lock);
1252
+ return _log(message_);
1253
+ }
1254
+
1255
+ ///
1256
+ /// Log a discard-bookmark entry to the persistent log
1257
+ /// based on a bookmark sequence number.
1258
+ /// \param message_ The Message to discard.
1259
+ ///
1260
+ virtual void discard(const Message& message_)
1261
+ {
1262
+ Lock<Mutex> guard(_lock);
1263
+ (void)_discard(message_);
1264
+ }
1265
+
1266
+ ///
1267
+ /// Log a discard-bookmark entry to the persistent log
1268
+ /// based on a bookmark sequence number. Use the \ref discard(const Message&)
1269
+ /// function instead when you have the full Message object available..
1270
+ /// \param subId_ The id of the subscription to which the bookmark applies.
1271
+ /// \param bookmarkSeqNo_ The bookmark sequence number to discard.
1272
+ ///
1273
+ virtual void discard(const Message::Field& subId_, size_t bookmarkSeqNo_)
1274
+ {
1275
+ Lock<Mutex> guard(_lock);
1276
+ (void)_discard(subId_, bookmarkSeqNo_);
1277
+ }
1278
+
1279
+ ///
1280
+ /// Returns the most recent bookmark from the log that
1281
+ /// ought to be used for (re-)subscriptions.
1282
+ /// \param subId_ The id of the subscription to check.
1283
+ ///
1284
+ virtual Message::Field getMostRecent(const Message::Field& subId_)
1285
+ {
1286
+ Lock<Mutex> guard(_lock);
1287
+ return _getMostRecent(subId_);
1288
+ }
1289
+
1290
+ ///
1291
+ /// Called for each arriving message to determine if
1292
+ /// the application has already seen this bookmark and should
1293
+ /// not be reprocessed. Returns 'true' if the bookmark is
1294
+ /// in the log and should not be re-processed, false otherwise.
1295
+ /// \param message_ The Message to check.
1296
+ /// \return Whether or not the Message has been discarded from this store.
1297
+ ///
1298
+ virtual bool isDiscarded(Message& message_)
1299
+ {
1300
+ Lock<Mutex> guard(_lock);
1301
+ return _isDiscarded(message_);
1302
+ }
1303
+
1304
+ ///
1305
+ /// Called to purge the contents of this store.
1306
+ /// Removes any tracking history associated with publishers and received
1307
+ /// messages, and may delete or truncate on-disk representations as well.
1308
+ ///
1309
+ virtual void purge()
1310
+ {
1311
+ Lock<Mutex> guard(_lock);
1312
+ _purge();
1313
+ }
1314
+
1315
+ ///
1316
+ /// Called to purge the contents of this store for particular subId.
1317
+ /// Removes any tracking history associated with publishers and received
1318
+ /// messages, and will remove the subId from the file as well.
1319
+ ///
1320
+ virtual void purge(const Message::Field& subId_)
1321
+ {
1322
+ Lock<Mutex> guard(_lock);
1323
+ _purge(subId_);
1324
+ }
1325
+
1326
+ ///
1327
+ /// Called to find the oldest bookmark in the store.
1328
+ /// \param subId_ The subscription ID on which to find the oldest bookmark.
1329
+ /// \return The bookmark that is oldest in the store for subId_
1330
+ virtual size_t getOldestBookmarkSeq(const Message::Field& subId_)
1331
+ {
1332
+ Lock<Mutex> guard(_lock);
1333
+ return _getOldestBookmarkSeq(subId_);
1334
+ }
1335
+
1336
+ ///
1337
+ /// Mark the bookmark provided as replicated to all sync replication
1338
+ /// destinations for the given subscription.
1339
+ /// \param subId_ The subscription Id to which the bookmark applies.
1340
+ /// \param bookmark_ The most recent replicated bookmark.
1341
+ virtual void persisted(const Message::Field& subId_,
1342
+ const Message::Field& bookmark_)
1343
+ {
1344
+ Lock<Mutex> guard(_lock);
1345
+ _persisted(find(subId_), bookmark_);
1346
+ }
1347
+
1348
+ ///
1349
+ /// Mark the bookmark provided as replicated to all sync replication
1350
+ /// destinations for the given subscription.
1351
+ /// \param subId_ The subscription Id to which the bookmark applies.
1352
+ /// \param bookmark_ The most recent bookmark's sequence number.
1353
+ /// \return The bookmark field that was just marked persisted.
1354
+ virtual Message::Field persisted(const Message::Field& subId_,
1355
+ size_t bookmark_)
1356
+ {
1357
+ Lock<Mutex> guard(_lock);
1358
+ return _persisted(find(subId_), bookmark_);
1359
+ }
1360
+
1361
+ ///
1362
+ /// Internally used to set the server version so the store knows how to deal
1363
+ /// with persisted acks and calls to getMostRecent().
1364
+ /// \param version_ The version of the server being used.
1365
+ void setServerVersion(const VersionInfo& version_)
1366
+ {
1367
+ setServerVersion(version_.getOldStyleVersion());
1368
+ }
1369
+
1370
+ ///
1371
+ /// Internally used to set the server version so the store knows how to deal
1372
+ /// with persisted acks and calls to getMostRecent().
1373
+ /// \param version_ The version of the server being used.
1374
+ void setServerVersion(size_t version_)
1375
+ {
1376
+ Lock<Mutex> guard(_subsLock);
1377
+ _serverVersion = version_;
1378
+ }
1379
+
1380
+ inline bool isWritableBookmark(size_t length)
1381
+ {
1382
+ return length >= AMPS_MIN_BOOKMARK_LEN;
1383
+ }
1384
+
1385
+ typedef Subscription::EntryPtrList EntryPtrList;
1386
+
1387
+ protected:
1388
+
1389
+ // Called once lock is acquired
1390
+ size_t _log(Message& message_)
1391
+ {
1392
+ Message::Field bookmark = message_.getBookmark();
1393
+ Subscription* pSub = (Subscription*)(message_.getSubscriptionHandle());
1394
+ if (!pSub)
1395
+ {
1396
+ Message::Field subId = message_.getSubscriptionId();
1397
+ if (subId.empty())
1398
+ {
1399
+ subId = message_.getSubscriptionIds();
1400
+ }
1401
+ pSub = find(subId);
1402
+ message_.setSubscriptionHandle(
1403
+ static_cast<amps_subscription_handle>(pSub));
1404
+ }
1405
+ size_t retVal = pSub->log(bookmark);
1406
+ message_.setBookmarkSeqNo(retVal);
1407
+ return retVal;
1408
+ }
1409
+
1410
+ // Called once lock is acquired, or from ctor
1411
+ bool _discard(const Message& message_)
1412
+ {
1413
+ size_t bookmarkSeqNo = message_.getBookmarkSeqNo();
1414
+ Subscription* pSub = (Subscription*)(message_.getSubscriptionHandle());
1415
+ if (!pSub)
1416
+ {
1417
+ Message::Field subId = message_.getSubscriptionId();
1418
+ if (subId.empty())
1419
+ {
1420
+ subId = message_.getSubscriptionIds();
1421
+ }
1422
+ pSub = find(subId);
1423
+ }
1424
+ bool retVal = pSub->discard(bookmarkSeqNo);
1425
+ if (retVal)
1426
+ {
1427
+ updateAdapter(pSub);
1428
+ }
1429
+ return retVal;
1430
+ }
1431
+
1432
+ // Called once lock is acquired
1433
+ bool _discard(const Message::Field& subId_, size_t bookmarkSeqNo_)
1434
+ {
1435
+ Subscription* pSub = find(subId_);
1436
+ bool retVal = pSub->discard(bookmarkSeqNo_);
1437
+ if (retVal)
1438
+ {
1439
+ updateAdapter(pSub);
1440
+ }
1441
+ return retVal;
1442
+ }
1443
+
1444
+ // Called once lock is acquired
1445
+ Message::Field _getMostRecent(const Message::Field& subId_,
1446
+ bool usePublishersList_ = true)
1447
+ {
1448
+ Subscription* pSub = find(subId_);
1449
+ return pSub->getMostRecentList(usePublishersList_);
1450
+ }
1451
+
1452
+ // Called once lock is acquired
1453
+ bool _isDiscarded(Message& message_)
1454
+ {
1455
+ Message::Field subId = message_.getSubscriptionId();
1456
+ if (subId.empty())
1457
+ {
1458
+ subId = message_.getSubscriptionIds();
1459
+ }
1460
+ Subscription* pSub = find(subId);
1461
+ message_.setSubscriptionHandle(
1462
+ static_cast<amps_subscription_handle>(pSub));
1463
+ return pSub->isDiscarded(message_.getBookmark());
1464
+ }
1465
+
1466
+ // Called once lock is acquired
1467
+ size_t _getOldestBookmarkSeq(const Message::Field& subId_)
1468
+ {
1469
+ Subscription* pSub = find(subId_);
1470
+ return pSub->getOldestBookmarkSeq();
1471
+ }
1472
+
1473
+ // Called once lock is acquired
1474
+ virtual void _persisted(Subscription* pSub_,
1475
+ const Message::Field& bookmark_)
1476
+ {
1477
+ if (pSub_->lastPersisted(bookmark_))
1478
+ {
1479
+ updateAdapter(pSub_);
1480
+ }
1481
+ }
1482
+
1483
+ // Called once lock is acquired
1484
+ virtual Message::Field _persisted(Subscription* pSub_, size_t bookmark_)
1485
+ {
1486
+ return pSub_->lastPersisted(bookmark_);
1487
+ }
1488
+
1489
+ // Called once lock is acquired
1490
+ void _purge()
1491
+ {
1492
+ if (_recoveryPointAdapter.isValid())
1493
+ {
1494
+ _recoveryPointAdapter.purge();
1495
+ }
1496
+ __purge();
1497
+ }
1498
+
1499
+ // Called once lock is acquired
1500
+ void __purge()
1501
+ {
1502
+ // Walk through list and clear Fields before calling clear
1503
+ while (!_subs.empty())
1504
+ {
1505
+ SubscriptionMap::iterator iter = _subs.begin();
1506
+ //The subId key is cleared when deleting the Subscription, which shares
1507
+ //the _data pointer in its id field.
1508
+ const_cast<Message::Field&>(iter->first).clear();
1509
+ delete (iter->second);
1510
+ _subs.erase(iter);
1511
+ }
1512
+ _subs.clear();
1513
+ }
1514
+
1515
+ // Called once lock is acquired
1516
+ virtual void _purge(const Message::Field& subId_)
1517
+ {
1518
+ if (_recoveryPointAdapter.isValid())
1519
+ {
1520
+ _recoveryPointAdapter.purge(subId_);
1521
+ }
1522
+ __purge(subId_);
1523
+ }
1524
+
1525
+ // Called once lock is acquired
1526
+ virtual void __purge(const Message::Field& subId_)
1527
+ {
1528
+ Lock<Mutex> guard(_subsLock);
1529
+ SubscriptionMap::iterator iter = _subs.find(subId_);
1530
+ if (iter == _subs.end())
1531
+ {
1532
+ return;
1533
+ }
1534
+ const_cast<Message::Field&>(iter->first).clear();
1535
+ delete (iter->second);
1536
+ _subs.erase(iter);
1537
+ }
1538
+
1539
+ // Can be used by subclasses during recovery
1540
+ void setMostRecent(const Message::Field& subId_,
1541
+ const Message::Field& recent_)
1542
+ {
1543
+ find(subId_)->setMostRecent(recent_);
1544
+ }
1545
+
1546
+ Mutex _subsLock;
1547
+ Mutex _lock;
1548
+ static const char ENTRY_BOOKMARK = 'b';
1549
+ static const char ENTRY_DISCARD = 'd';
1550
+ static const char ENTRY_PERSISTED = 'p';
1551
+
1552
+ virtual Subscription* find(const Message::Field& subId_)
1553
+ {
1554
+ if (subId_.empty())
1555
+ {
1556
+ throw StoreException("A valid subscription ID must be provided to the Bookmark Store");
1557
+ }
1558
+ Lock<Mutex> guard(_subsLock);
1559
+ if (_subs.count(subId_) == 0)
1560
+ {
1561
+ // Subscription will be created
1562
+ Message::Field id;
1563
+ id.deepCopy(subId_);
1564
+ _subs[id] = new Subscription(this, id);
1565
+ return _subs[id];
1566
+ }
1567
+ return _subs[subId_];
1568
+ }
1569
+
1570
+ virtual bool resize(const Message::Field& subId_, char** newBuffer_, size_t size_,
1571
+ bool callResizeHandler_ = true)
1572
+ {
1573
+ assert(newBuffer_ != 0);
1574
+ if (size_ == 0) // Delete the buffer
1575
+ {
1576
+ if (*newBuffer_)
1577
+ {
1578
+ free(*newBuffer_);
1579
+ *newBuffer_ = NULL;
1580
+ }
1581
+ return true;
1582
+ }
1583
+ if (callResizeHandler_ && !callResizeHandler(subId_, size_))
1584
+ {
1585
+ return false;
1586
+ }
1587
+ char* oldBuffer = *newBuffer_ ? *newBuffer_ : NULL;
1588
+ *newBuffer_ = (char*)malloc(size_);
1589
+ memset(*newBuffer_, 0, size_);
1590
+ if (oldBuffer)
1591
+ {
1592
+ find(subId_)->moveEntries(oldBuffer, *newBuffer_, size_);
1593
+ free(oldBuffer);
1594
+ }
1595
+ return true;
1596
+ }
1597
+
1598
+ protected:
1599
+ void updateAdapter(Subscription* pSub_)
1600
+ {
1601
+ if (_recovering || !_recentChanged || !_recoveryPointAdapter.isValid())
1602
+ {
1603
+ return;
1604
+ }
1605
+ // We have to make a copy here, since the return from getMostRecentList
1606
+ // could get changed once the lock is released.
1607
+ RecoveryPoint update = _recoveryPointFactory(pSub_->id(),
1608
+ pSub_->getMostRecentList(false)).deepCopy();
1609
+ Unlock<Mutex> unlock(_lock);
1610
+ _recoveryPointAdapter.update(update);
1611
+ // Free memmory of the copy, adapter should have copies of the fields
1612
+ update.clear();
1613
+ }
1614
+
1615
+ typedef std::map<Message::Field, Subscription*, Message::Field::FieldHash> SubscriptionMap;
1616
+ SubscriptionMap _subs;
1617
+ size_t _serverVersion;
1618
+ bool _recentChanged;
1619
+ bool _recovering;
1620
+ typedef std::set<Subscription*> SubscriptionSet;
1621
+ RecoveryPointAdapter _recoveryPointAdapter;
1622
+ RecoveryPointFactory _recoveryPointFactory;
1623
+ };
1624
+
1625
+ } // end namespace AMPS
1626
+
1627
+ #endif //_MEMORYBOOKMARKSTORE_H_
1628
+