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
@@ -1,2053 +0,0 @@
1
- ////////////////////////////////////////////////////////////////////////////
2
- //
3
- // Copyright (c) 2010-2023 60East Technologies Inc., All Rights Reserved.
4
- //
5
- // This computer software is owned by 60East Technologies Inc. and is
6
- // protected by U.S. copyright laws and other laws and by international
7
- // treaties. This computer software is furnished by 60East Technologies
8
- // Inc. pursuant to a written license agreement and may be used, copied,
9
- // transmitted, and stored only in accordance with the terms of such
10
- // license agreement and with the inclusion of the above copyright notice.
11
- // This computer software or any other copies thereof may not be provided
12
- // or otherwise made available to any other person.
13
- //
14
- // U.S. Government Restricted Rights. This computer software: (a) was
15
- // developed at private expense and is in all respects the proprietary
16
- // information of 60East Technologies Inc.; (b) was not developed with
17
- // government funds; (c) is a trade secret of 60East Technologies Inc.
18
- // for all purposes of the Freedom of Information Act; and (d) is a
19
- // commercial item and thus, pursuant to Section 12.212 of the Federal
20
- // Acquisition Regulations (FAR) and DFAR Supplement Section 227.7202,
21
- // Government's use, duplication or disclosure of the computer software
22
- // is subject to the restrictions set forth by 60East Technologies Inc..
23
- //
24
- ////////////////////////////////////////////////////////////////////////////
25
-
26
- #ifndef _BLOCKPUBLISHSTORE_H_
27
- #define _BLOCKPUBLISHSTORE_H_
28
- #include <amps/ampsplusplus.hpp>
29
- #include <amps/BlockStore.hpp>
30
- #include <amps/Buffer.hpp>
31
- #include <sstream>
32
- #include <stack>
33
- #include <string>
34
- #include <map>
35
- #include <amps/ampscrc.hpp>
36
- #if __cplusplus >= 201103L || _MSC_VER >= 1900
37
- #include <atomic>
38
- #endif
39
-
40
- #ifdef _WIN32
41
- #include <intrin.h>
42
- #include <sys/timeb.h>
43
- #else
44
- #include <sys/time.h>
45
- #if AMPS_SSE_42
46
- #include <cpuid.h>
47
- #endif
48
- #endif
49
- #include <iostream>
50
-
51
- /// \file BlockPublishStore.hpp
52
- /// \brief Provides AMPS::BlockPublishStore, a concrete implementation of a
53
- /// store that breaks the allocated storage into blocks. Used as a base class
54
- /// for other stores in the AMPS C++ client.
55
-
56
- namespace AMPS
57
- {
58
- ///
59
- /// Used as a base class for other stores in the AMPS C++ client, this
60
- /// is an implementation of StoreImpl that breaks a provided Buffer into
61
- /// uniform blocks for storing messages and tracks used and unused blocks.
62
- ///
63
- class BlockPublishStore : public StoreImpl
64
- {
65
- public:
66
- typedef BlockStore::Block Block;
67
- typedef Lock<BlockStore> BufferLock;
68
- typedef Unlock<BlockStore> BufferUnlock;
69
-
70
- typedef enum
71
- {
72
- SOW_DELETE_DATA = 0x01,
73
- SOW_DELETE_FILTER = 0x02,
74
- SOW_DELETE_KEYS = 0x04,
75
- SOW_DELETE_BOOKMARK = 0x08,
76
- SOW_DELETE_BOOKMARK_CANCEL = 0x10,
77
- SOW_DELETE_UNKNOWN = 0x80
78
- } SowDeleteType;
79
-
80
- ///
81
- /// Default constant values for BlockPublishStore
82
- enum Constants : amps_uint32_t
83
- {
84
- DEFAULT_BLOCK_HEADER_SIZE = 32,
85
- DEFAULT_BLOCK_CHAIN_HEADER_SIZE = 64,
86
- DEFAULT_BLOCKS_PER_REALLOC = 1000,
87
- DEFAULT_BLOCK_SIZE = 2048
88
- };
89
-
90
- /**********************************************************************
91
- * Storage format
92
- *************************************************************************
93
- * Field Description | Type | # Bytes
94
- *************************************************************************
95
- * HEADER as detailed below | | 32 TOTAL
96
- * | |
97
- * Total number of blocks used by the record | uint32_t | 4
98
- * Total length of the saved record | uint32_t | 4
99
- * HA Message sequence | uint64_t | 8
100
- * CRC Value - only set in first Block | uint64_t | 8
101
- * next in chain offset | uint64_t | 8
102
- *************************************************************************
103
- * CHAIN HEADER as detailed below | | 64 TOTAL
104
- * | |
105
- * operation | uint32_t | 4
106
- * command id length | uint32_t | 4
107
- * correltation id length | uint32_t | 4
108
- * expiration length | uint32_t | 4
109
- * sow key length | uint32_t | 4
110
- * topic length | uint32_t | 4
111
- * sow delete flag | int32_t | 4
112
- * ack types | uint32_t | 4
113
- * unused [8] | uint32_t | 4*8 = 32
114
- *************************************************************************
115
- * DATA SECTION - can be spread across multiple blocks
116
- *
117
- * command id | char[]
118
- * correlation id | char[]
119
- * expiration | char[]
120
- * sow key | char[]
121
- * topic | char[]
122
- * data | char[]
123
- *************************************************************************/
124
-
125
- struct BlockHeader
126
- {
127
- amps_uint32_t _blocksToWrite;
128
- amps_uint32_t _totalRemaining;
129
- amps_uint64_t _seq;
130
- amps_uint64_t _crcVal;
131
- amps_uint64_t _nextInChain;
132
- };
133
-
134
- struct BlockChainHeader
135
- {
136
- amps_uint32_t _operation;
137
- amps_uint32_t _commandIdLen;
138
- amps_uint32_t _correlationIdLen;
139
- amps_uint32_t _expirationLen;
140
- amps_uint32_t _sowKeyLen;
141
- amps_uint32_t _topicLen;
142
- amps_int32_t _flag;
143
- amps_uint32_t _ackTypes;
144
- amps_uint32_t _unused[8];
145
- BlockChainHeader() // -V730
146
- : _operation(0), _commandIdLen(0), _correlationIdLen(0)
147
- , _expirationLen(0), _sowKeyLen(0), _topicLen(0), _flag(-1)
148
- , _ackTypes(0)
149
- { ; }
150
- };
151
-
152
- ///
153
- /// Block header is number of blocks, total length, sequence number,
154
- /// crc, next in chain offset
155
- /// \return The size of Block header
156
- static inline amps_uint32_t getBlockHeaderSize()
157
- {
158
- return DEFAULT_BLOCK_HEADER_SIZE;
159
- }
160
-
161
- ///
162
- /// Block chain header is operation, command id length, correlation id
163
- /// length, expiration length, sow key length, topic length, sow delete
164
- /// flag, ack types
165
- /// \return The size of Block chain header
166
- static inline amps_uint32_t getBlockChainHeaderSize()
167
- {
168
- return DEFAULT_BLOCK_CHAIN_HEADER_SIZE;
169
- }
170
-
171
- ///
172
- /// Return the size left in a block for data when it has a header in it
173
- /// \return The amount of room left in a block for data
174
- inline amps_uint32_t getBlockSize()
175
- {
176
- return _blockStore.getBlockSize();
177
- }
178
-
179
- ///
180
- /// Return the size left in a block for data when it has a header in it
181
- /// \return The amount of room left in a block for data
182
- inline amps_uint32_t getBlockDataSize()
183
- {
184
- return _blockStore.getBlockSize() - getBlockHeaderSize();
185
- }
186
-
187
- /// Create a BlockPublishStore using buffer_, that grows by
188
- /// blocksPerRealloc_ blocks when it must grow. If isFile_ is true,
189
- /// it will use CRCs for all storage and retrieval.
190
- /// \param buffer_ Pointer to an allocated Buffer implementation that
191
- /// will be used for storage. The store will delete buffer_ when it is
192
- /// destructed.
193
- /// \param blocksPerRealloc_ Number of blocks to add to when growing
194
- /// the size of the Buffer.
195
- /// \param isFile_ Whether or not the buffer is a recoverable file.
196
- /// If false, the buffer is intialized as if empty, otherwise recovery
197
- /// remains possible and a CRC will be used for all stored items.
198
- /// \param errorOnPublishGap_ If true, PublishStoreGapException can be
199
- /// thrown by the store if the client logs onto a server that appears
200
- /// to be missing messages no longer held in the store.
201
- /// \param blockSize_ Size in bytes for each Block
202
- BlockPublishStore(Buffer* buffer_,
203
- amps_uint32_t blocksPerRealloc_ = 1000,
204
- bool isFile_ = false,
205
- bool errorOnPublishGap_ = false,
206
- amps_uint32_t blockSize_ = DEFAULT_BLOCK_SIZE)
207
- : StoreImpl(errorOnPublishGap_)
208
- , _blockStore(buffer_, blocksPerRealloc_,
209
- DEFAULT_BLOCK_HEADER_SIZE,
210
- (blockSize_ > DEFAULT_BLOCK_HEADER_SIZE * 2
211
- ? blockSize_ : DEFAULT_BLOCK_HEADER_SIZE * 2))
212
- , _metadataBlock(0)
213
- , _maxDiscarded((amps_uint64_t)0), _lastSequence((amps_uint64_t)1)
214
- , _stored(0)
215
- {
216
- _blockStore.setResizeHandler(&BlockPublishStore::canResize, (void*)this);
217
- chooseCRC(isFile_);
218
- if (!isFile_)
219
- {
220
- // This gets set in recover in file-based stores
221
- BufferLock bufferGuard(_blockStore);
222
- _blockStore.init();
223
- _metadataBlock = _blockStore.get(1);
224
- // Remove metadata block from used list
225
- _blockStore.setUsedList(0);
226
- _blockStore.setEndOfUsedList(0);
227
- // Metadata block holds block size, block header size,
228
- // last discarded sequence, client version
229
- _metadataBlock->_sequence = (amps_uint64_t)0;
230
- Buffer* pBuffer = _blockStore.getBuffer();
231
- pBuffer->setPosition(_metadataBlock->_offset);
232
- pBuffer->putUint32((amps_uint32_t)getBlockSize());
233
- pBuffer->putUint32((amps_uint32_t)getBlockHeaderSize());
234
- pBuffer->putUint64((amps_uint64_t)0);
235
- // Metadata blocks puts client version in CRC position
236
- pBuffer->putUint64((amps_uint64_t)VersionInfo::parseVersion(AMPS_CLIENT_VERSION));
237
- // No next in chain
238
- pBuffer->putUint64((amps_uint64_t)0);
239
- }
240
- }
241
-
242
- ///
243
- /// Destructor that cleans up the buffer and other associated memory
244
- virtual ~BlockPublishStore()
245
- {
246
- }
247
-
248
- ///
249
- /// Store a given message that will be delivered to AMPS.
250
- /// This method will also assign a sequence number to the Message.
251
- /// This method is primarily used internally by the Client to store
252
- /// outgoing messages.
253
- /// \param message_ The Message to put into the store.
254
- virtual amps_uint64_t store(const Message& message_)
255
- {
256
- return store(message_, true);
257
- }
258
-
259
- ///
260
- /// Store a given message that will be delivered to AMPS.
261
- /// This method will also assign a sequence number to the Message if
262
- /// assignSequence_ is true.
263
- /// HybridPublishStore uses this method with false when moving messages
264
- /// from memory to file.
265
- /// \param message_ The Message to put into the store.
266
- /// \param assignSequence_ If true, message_ will be updated with the
267
- /// next sequence number from the store.
268
- /// \return The sequence number of the message_.
269
- amps_uint64_t store(const Message& message_, bool assignSequence_)
270
- {
271
- const char* commandId, *correlationId, *expiration, *sowKey,
272
- *topic, *data;
273
- size_t dataLen = 0;
274
- BlockHeader blockHeader;
275
- BlockChainHeader chainHeader;
276
- message_.getRawCommandId(&commandId, &dataLen);
277
- chainHeader._commandIdLen = (amps_uint32_t)dataLen;
278
- message_.getRawCorrelationId(&correlationId, &dataLen);
279
- chainHeader._correlationIdLen = (amps_uint32_t)dataLen;
280
- message_.getRawExpiration(&expiration, &dataLen);
281
- chainHeader._expirationLen = (amps_uint32_t)dataLen;
282
- message_.getRawSowKey(&sowKey, &dataLen);
283
- chainHeader._sowKeyLen = (amps_uint32_t)dataLen;
284
- message_.getRawTopic(&topic, &dataLen);
285
- chainHeader._topicLen = (amps_uint32_t)dataLen;
286
- message_.getRawData(&data, &dataLen);
287
- chainHeader._flag = -1;
288
- Message::Command::Type operation = message_.getCommandEnum();
289
- chainHeader._operation = (amps_uint32_t)operation;
290
- if (operation == Message::Command::SOWDelete)
291
- {
292
- if (dataLen > 0)
293
- {
294
- chainHeader._flag = SOW_DELETE_DATA;
295
- }
296
- else
297
- {
298
- message_.getRawFilter(&data, &dataLen);
299
- if (dataLen > 0)
300
- {
301
- chainHeader._flag = SOW_DELETE_FILTER;
302
- }
303
- else
304
- {
305
- message_.getRawSowKeys(&data, &dataLen);
306
- if (dataLen > 0)
307
- {
308
- chainHeader._flag = SOW_DELETE_KEYS;
309
- }
310
- else
311
- {
312
- message_.getRawBookmark(&data, &dataLen);
313
- chainHeader._flag = SOW_DELETE_BOOKMARK;
314
- // Check options for cancel
315
- Message::Field options = message_.getOptions();
316
- size_t remaining = options.len();
317
- const void* next = NULL;
318
- const void* start = (const void*)(options.data());
319
- // Not necessarily null-terminated so no strstr
320
- while (remaining >= 6 &&
321
- (next = memchr(start, (int)'c', remaining)) != NULL)
322
- {
323
- remaining = (size_t)next - (size_t)start;
324
- if (remaining >= 6 && strncmp((const char*)start,
325
- "cancel", 6) == 0)
326
- {
327
- chainHeader._flag = SOW_DELETE_BOOKMARK_CANCEL;
328
- break;
329
- }
330
- }
331
- }
332
- }
333
- }
334
- }
335
- blockHeader._totalRemaining = (
336
- (chainHeader._operation == Message::Command::Unknown)
337
- ? 0
338
- : (getBlockChainHeaderSize()
339
- + chainHeader._commandIdLen
340
- + chainHeader._correlationIdLen
341
- + chainHeader._expirationLen
342
- + chainHeader._sowKeyLen
343
- + chainHeader._topicLen
344
- + (amps_uint32_t)dataLen));
345
- size_t lastBlockLength = ((operation == Message::Command::Unknown) ? 0 :
346
- (blockHeader._totalRemaining % getBlockDataSize()));
347
- blockHeader._blocksToWrite = ((operation == Message::Command::Unknown)
348
- ? 1
349
- : ((amps_uint32_t)(blockHeader._totalRemaining
350
- / getBlockDataSize())
351
- + ((lastBlockLength > 0) ? 1 : 0)));
352
- blockHeader._crcVal = (amps_uint64_t)0ULL;
353
- blockHeader._crcVal = _crc(commandId,
354
- chainHeader._commandIdLen,
355
- blockHeader._crcVal);
356
- blockHeader._crcVal = _crc(correlationId,
357
- chainHeader._correlationIdLen,
358
- blockHeader._crcVal);
359
- blockHeader._crcVal = _crc(expiration,
360
- chainHeader._expirationLen,
361
- blockHeader._crcVal);
362
- blockHeader._crcVal = _crc(sowKey,
363
- chainHeader._sowKeyLen,
364
- blockHeader._crcVal);
365
- blockHeader._crcVal = _crc(topic,
366
- chainHeader._topicLen,
367
- blockHeader._crcVal);
368
- blockHeader._crcVal = _crc(data, dataLen, blockHeader._crcVal);
369
-
370
- // Reserve slots for storage, growing if necessary
371
- BufferLock bufferGuard(_blockStore);
372
- Block* first = _blockStore.get(blockHeader._blocksToWrite);
373
- if (assignSequence_)
374
- {
375
- if (_lastSequence <= 2)
376
- {
377
- _getLastPersisted();
378
- }
379
- blockHeader._seq = ++_lastSequence;
380
- }
381
- else
382
- {
383
- blockHeader._seq = amps_message_get_field_uint64(
384
- message_.getMessage(),
385
- AMPS_Sequence);
386
- if (!_maxDiscarded)
387
- {
388
- _maxDiscarded = blockHeader._seq - 1;
389
- }
390
- if (blockHeader._seq >= _lastSequence)
391
- {
392
- _lastSequence = blockHeader._seq;
393
- }
394
- }
395
-
396
- try
397
- {
398
- size_t topicWritten = 0UL;
399
- size_t dataWritten = 0UL;
400
- size_t commandWritten = 0UL;
401
- size_t correlationWritten = 0UL;
402
- size_t expirationWritten = 0UL;
403
- size_t sowKeyWritten = 0UL;
404
- Buffer* pBuffer = _blockStore.getBuffer();
405
- for (Block* next = first; next; next = next->_nextInChain)
406
- {
407
- next->_sequence = blockHeader._seq;
408
- if (next->_nextInChain)
409
- {
410
- blockHeader._nextInChain = next->_nextInChain->_offset;
411
- }
412
- else
413
- {
414
- blockHeader._nextInChain = (amps_uint64_t)0;
415
- }
416
- // Set buffer to start of Block and write the header
417
- pBuffer->setPosition(next->_offset);
418
- pBuffer->putBytes((const char*)&blockHeader, sizeof(BlockHeader));
419
- // Clear crcVal, as it's only written in the first Block
420
- blockHeader._crcVal = (amps_uint64_t)0;
421
- size_t bytesRemaining = getBlockDataSize();
422
- if (next == first)
423
- {
424
- // Write Block chain header
425
- chainHeader._ackTypes = (amps_uint32_t)message_.getAckTypeEnum();
426
- pBuffer->putBytes((const char*)&chainHeader,
427
- sizeof(BlockChainHeader));
428
- pBuffer->setPosition(next->_offset + getBlockHeaderSize() + getBlockChainHeaderSize());
429
- bytesRemaining -= getBlockChainHeaderSize();
430
- }
431
- else
432
- {
433
- pBuffer->setPosition(next->_offset + getBlockHeaderSize());
434
- }
435
-
436
- if (commandWritten < chainHeader._commandIdLen)
437
- {
438
- size_t commandWrite = (chainHeader._commandIdLen - commandWritten < bytesRemaining) ? chainHeader._commandIdLen - commandWritten : bytesRemaining;
439
- pBuffer->putBytes(commandId + commandWritten,
440
- commandWrite);
441
- bytesRemaining -= commandWrite;
442
- commandWritten += commandWrite;
443
- }
444
- if (correlationWritten < chainHeader._correlationIdLen)
445
- {
446
- size_t correlationWrite = (chainHeader._correlationIdLen - correlationWritten < bytesRemaining) ? chainHeader._correlationIdLen - correlationWritten : bytesRemaining;
447
- pBuffer->putBytes(correlationId + correlationWritten,
448
- correlationWrite);
449
- bytesRemaining -= correlationWrite;
450
- correlationWritten += correlationWrite;
451
- }
452
- if (bytesRemaining > 0 && expirationWritten < chainHeader._expirationLen)
453
- {
454
- size_t expWrite = (chainHeader._expirationLen - expirationWritten < bytesRemaining) ? chainHeader._expirationLen - expirationWritten : bytesRemaining;
455
- pBuffer->putBytes(expiration + expirationWritten, expWrite);
456
- bytesRemaining -= expWrite;
457
- expirationWritten += expWrite;
458
- }
459
- if (bytesRemaining > 0 && sowKeyWritten < chainHeader._sowKeyLen)
460
- {
461
- size_t sowKeyWrite = (chainHeader._sowKeyLen - sowKeyWritten < bytesRemaining) ? chainHeader._sowKeyLen - sowKeyWritten : bytesRemaining;
462
- pBuffer->putBytes(sowKey + sowKeyWritten, sowKeyWrite);
463
- bytesRemaining -= sowKeyWrite;
464
- sowKeyWritten += sowKeyWrite;
465
- }
466
- if (bytesRemaining > 0 && topicWritten < chainHeader._topicLen)
467
- {
468
- size_t topicWrite = (chainHeader._topicLen - topicWritten
469
- < bytesRemaining)
470
- ? chainHeader._topicLen - topicWritten
471
- : bytesRemaining;
472
- pBuffer->putBytes(topic + topicWritten, topicWrite);
473
- bytesRemaining -= topicWrite;
474
- topicWritten += topicWrite;
475
- }
476
- if (bytesRemaining > 0 && dataWritten < dataLen)
477
- {
478
- size_t dataWrite = (dataLen - dataWritten < bytesRemaining) ?
479
- dataLen - dataWritten : bytesRemaining;
480
- pBuffer->putBytes(data + dataWritten, dataWrite);
481
- bytesRemaining -= dataWrite;
482
- dataWritten += dataWrite;
483
- }
484
- }
485
- }
486
- catch (const AMPSException&)
487
- {
488
- _blockStore.put(first);
489
- throw;
490
- }
491
- AMPS_FETCH_ADD(&_stored, 1);
492
- return blockHeader._seq;
493
- }
494
-
495
- /// Remove all messages with an index up to and including index_.
496
- /// This method is used internally by the Client to remove messages once
497
- /// they have been acknowledged by AMPS as stored on the server side.
498
- /// \param index_ The highest index to remove.
499
- /// \throw PublishStoreGapException If index_ < getLastPersisted() which could
500
- /// leave a gap on the server of missing messages from this Client.
501
- virtual void discardUpTo(amps_uint64_t index_)
502
- {
503
- // Get the lock
504
- BufferLock bufferGuard(_blockStore);
505
- Buffer* pBuffer = _blockStore.getBuffer();
506
- // Don't use _getLastPersisted() here, don't want to set it
507
- // to something other than index_ if it's not already set
508
- amps_uint64_t lastPersisted = _metadataBlock->_sequence;
509
- // Make sure it's a real index and we have messages to discard
510
- if (index_ == (amps_uint64_t)0 || !_blockStore.front() || index_ <= _maxDiscarded)
511
- {
512
- // During logon it's very possible we don't have a last persisted
513
- // but that the Client is calling discardUpTo with the ack value.
514
- if (lastPersisted < index_)
515
- {
516
- pBuffer->setPosition(_metadataBlock->_offset + 8);
517
- pBuffer->putUint64(index_);
518
- _metadataBlock->_sequence = index_;
519
- if (_maxDiscarded < index_)
520
- {
521
- _maxDiscarded = index_;
522
- }
523
- if (_lastSequence <= index_)
524
- {
525
- _lastSequence = index_;
526
- }
527
- }
528
- else if (!index_) // Fresh logon, no sequence history
529
- {
530
- _getLastPersisted();
531
- }
532
- else if (getErrorOnPublishGap() && index_ < lastPersisted) //Message gap
533
- {
534
- std::ostringstream os;
535
- os << "Server last saw " << index_ << " from Client but Store "
536
- << "has already discarded up to " << lastPersisted
537
- << " which would leave a gap of unreceived messages.";
538
- throw PublishStoreGapException(os.str());
539
- }
540
- _blockStore.signalAll();
541
- return;
542
- }
543
-
544
- _maxDiscarded = index_;
545
- AMPS_FETCH_SUB(&_stored, _blockStore.put(index_));
546
- _blockStore.signalAll();
547
- if (lastPersisted >= index_)
548
- {
549
- return;
550
- }
551
- pBuffer->setPosition(_metadataBlock->_offset + 8);
552
- pBuffer->putUint64(index_);
553
- _metadataBlock->_sequence = index_;
554
- if (_lastSequence < index_)
555
- {
556
- _lastSequence = index_;
557
- }
558
- }
559
-
560
- /// Replay all messages in the Store onto the given StoreReplayer.
561
- /// This is used internally by the Client to replay any messages to the
562
- /// server after a successful connection or reconnection to AMPS.
563
- /// \param replayer_ The StoreReplayer that will transmit the message.
564
- void replay(StoreReplayer& replayer_)
565
- {
566
- // Get the lock
567
- BufferLock bufferGuard(_blockStore);
568
- // If we don't have anything yet, return
569
- if (!_blockStore.front())
570
- {
571
- return;
572
- }
573
- Block* next = _blockStore.front();
574
- try
575
- {
576
- for (Block* block = _blockStore.front(); block; block = next)
577
- {
578
- // Replay the message
579
- replayOnto(block, replayer_);
580
- next = block->_nextInList;
581
- }
582
- }
583
- catch (const StoreException&)
584
- {
585
- _blockStore.putAll(next);
586
- throw;
587
- }
588
- }
589
-
590
- /// Replay one message in the Store onto the given StoreReplayer.
591
- /// This is used internally by replay to replay each message.
592
- /// \param replayer_ The StoreReplayer that will transmit the message.
593
- /// \param index_ The index of the message to replay.
594
- /// \return Returns true for success, false for failure such as an
595
- /// invalid index.
596
- bool replaySingle(StoreReplayer& replayer_, amps_uint64_t index_)
597
- {
598
- BufferLock bufferGuard(_blockStore);
599
- // If we don't have anything yet, return
600
- if (!_blockStore.front())
601
- {
602
- return false;
603
- }
604
- // Get the end point
605
- amps_uint64_t lastIdx = _blockStore.back()->_sequence;
606
- // Get the start point
607
- amps_uint64_t leastIdx = _blockStore.front()->_sequence;
608
- if (index_ >= leastIdx && index_ <= lastIdx)
609
- {
610
- Block* block = _blockStore.front();
611
- while (block && block->_sequence != index_)
612
- {
613
- block = block->_nextInList;
614
- }
615
- if (!block)
616
- {
617
- return false;
618
- }
619
- // If total bytes is 0, it's a queue ack and gets skipped.
620
- Buffer* pBuffer = _blockStore.getBuffer();
621
- pBuffer->setPosition(block->_offset +
622
- sizeof(amps_uint32_t));
623
- if (pBuffer->getUint32() == 0)
624
- {
625
- return false;
626
- }
627
- replayOnto(block, replayer_);
628
- return true;
629
- }
630
- else // Get Store and Client back in sync
631
- {
632
- _message.reset();
633
- leastIdx -= 1;
634
- _message.setSequence(leastIdx);
635
- replayer_.execute(_message);
636
- return false;
637
- }
638
- }
639
-
640
- /// Method to return the count of messages that currently in the Store
641
- /// because they have not been discarded, presumably because AMPS has not
642
- /// yet acknowledged them. This assumes that there are no gaps in sequence
643
- /// numbers for better performance.
644
- /// \return The count of messages in the store.
645
- size_t unpersistedCount() const
646
- {
647
- size_t count = (size_t)_stored;
648
- return count;
649
- }
650
-
651
- ///
652
- /// Method to wait for the Store to discard everything that has been
653
- /// stored up to the point in time when flush is called. It will get
654
- /// the current max and wait up to timeout for that message to be discarded
655
- /// \param timeout_ The number of milliseconds to wait.
656
- /// \throw DisconnectedException The Client is no longer connected to a server.
657
- /// \throw ConnectionException An error occurred while sending the message.
658
- /// \throw TimedOutException The publish command was not acked in the allowed time.
659
- virtual void flush(long timeout_)
660
- {
661
- BufferLock bufferGuard(_blockStore);
662
- amps_uint64_t waitFor = _getHighestUnpersisted();
663
- // Check that we aren't already empty
664
- if (waitFor == getUnsetSequence())
665
- {
666
- return;
667
- }
668
- if (timeout_ > 0)
669
- {
670
- bool timedOut = false;
671
- AMPS_START_TIMER(timeout_);
672
- // While timeout hasn't expired and we haven't had everything acked
673
- while (!timedOut && _stored != 0
674
- && waitFor >= _getLowestUnpersisted())
675
- {
676
- if (!_blockStore.wait(timeout_))
677
- {
678
- // May have woken up early, check real time
679
- AMPS_RESET_TIMER(timedOut, timeout_);
680
- }
681
- }
682
- // If we timed out and still haven't caught up with the acks
683
- if (timedOut && _stored != 0
684
- && waitFor >= _getLowestUnpersisted())
685
- {
686
- throw TimedOutException("Timed out waiting to flush publish store.");
687
- }
688
- }
689
- else
690
- {
691
- while (_stored != 0 && waitFor >= _getLowestUnpersisted())
692
- {
693
- // Still wake up every 1s so python can interrupt
694
- _blockStore.wait(1000);
695
- // Don't hold lock if possibly grabbing GIL
696
- BufferUnlock unlck(_blockStore);
697
- amps_invoke_waiting_function();
698
- }
699
- }
700
- }
701
-
702
- amps_uint64_t getLowestUnpersisted() const
703
- {
704
- BufferLock bufferGuard(_blockStore);
705
- return _getLowestUnpersisted();
706
- }
707
-
708
- amps_uint64_t getHighestUnpersisted() const
709
- {
710
- BufferLock bufferGuard(_blockStore);
711
- return _getHighestUnpersisted();
712
- }
713
-
714
- amps_uint64_t getLastPersisted(void)
715
- {
716
- BufferLock bufferGuard(_blockStore);
717
- return _getLastPersisted();
718
- }
719
-
720
- protected:
721
- static bool canResize(size_t requestedSize_, void* vpThis_)
722
- {
723
- return ((BlockPublishStore*)vpThis_)->callResizeHandler(requestedSize_);
724
- }
725
-
726
- amps_uint64_t _getLowestUnpersisted() const
727
- {
728
- // Assume the lock is held
729
- // If we don't have anything, return MAX
730
- if (!_blockStore.front())
731
- {
732
- return getUnsetSequence();
733
- }
734
- return _blockStore.front()->_sequence;
735
- }
736
-
737
- amps_uint64_t _getHighestUnpersisted() const
738
- {
739
- // Assume the lock is held
740
- // If we don't have anything, return MAX
741
- if (!_blockStore.back())
742
- {
743
- return getUnsetSequence();
744
- }
745
- return _blockStore.back()->_sequence;
746
- }
747
-
748
- amps_uint64_t _getLastPersisted(void)
749
- {
750
- // Assume the lock is held
751
- amps_uint64_t lastPersisted = (amps_uint64_t)0;
752
- Buffer* pBuffer = _blockStore.getBuffer();
753
- pBuffer->setPosition(_metadataBlock->_offset + 8);
754
- lastPersisted = pBuffer->getUint64();
755
- if (lastPersisted)
756
- {
757
- if (_lastSequence < lastPersisted)
758
- {
759
- _lastSequence = lastPersisted;
760
- }
761
- return lastPersisted;
762
- }
763
- if (_maxDiscarded)
764
- {
765
- lastPersisted = _maxDiscarded;
766
- }
767
- else
768
- {
769
- #ifdef _WIN32
770
- struct _timeb t;
771
- _ftime_s(&t);
772
- lastPersisted = (t.time * 1000 + t.millitm) * (amps_uint64_t)1000000;
773
- #else // not _WIN32
774
- struct timeval tv;
775
- gettimeofday(&tv, NULL);
776
- lastPersisted = (amps_uint64_t)((tv.tv_sec * 1000) + (tv.tv_usec / 1000))
777
- * (amps_uint64_t)1000000;
778
- #endif
779
- }
780
- if (_lastSequence > 2)
781
- {
782
- amps_uint64_t low = _getLowestUnpersisted();
783
- amps_uint64_t high = _getHighestUnpersisted();
784
- if (low != getUnsetSequence())
785
- {
786
- lastPersisted = low - 1;
787
- }
788
- if (high != getUnsetSequence() && _lastSequence <= high)
789
- {
790
- _lastSequence = high;
791
- }
792
- if (_lastSequence < lastPersisted)
793
- {
794
- lastPersisted = _lastSequence - 1;
795
- }
796
- }
797
- else
798
- {
799
- _lastSequence = lastPersisted;
800
- }
801
- pBuffer->setPosition(_metadataBlock->_offset
802
- + sizeof(amps_uint32_t) // blocks used
803
- + sizeof(amps_uint32_t)); // record length
804
- pBuffer->putUint64(lastPersisted);
805
- _metadataBlock->_sequence = lastPersisted;
806
- return lastPersisted;
807
- }
808
-
809
- void recover(void)
810
- {
811
- BufferLock bufferGuard(_blockStore);
812
- // Make sure the size isn't 0 and is a multiple of block size
813
- Buffer* pBuffer = _blockStore.getBuffer();
814
- size_t size = pBuffer->getSize();
815
- amps_uint32_t blockSize = getBlockSize();
816
- if (size == 0)
817
- {
818
- _blockStore.init();
819
- _metadataBlock = _blockStore.get(1);
820
- _metadataBlock->_sequence = (amps_uint64_t)0;
821
- pBuffer->setPosition(_metadataBlock->_offset);
822
- // Metadata block holds block size, block header size,
823
- // last discarded sequence, client version
824
- pBuffer->putUint32((amps_uint32_t)blockSize);
825
- pBuffer->putUint32((amps_uint32_t)getBlockHeaderSize());
826
- pBuffer->putUint64((amps_uint64_t)0);
827
- // Metadata blocks puts client version in CRC position
828
- pBuffer->putUint64((amps_uint64_t)VersionInfo::parseVersion(AMPS_CLIENT_VERSION));
829
- // No next in chain
830
- pBuffer->putUint64((amps_uint64_t)0);
831
- return;
832
- }
833
- size_t numBlocks = size / blockSize;
834
- if (size % blockSize > 0)
835
- {
836
- // We shouldn't ever be in here, since it requires starting with a
837
- // file that is not an even multiple of block size and we always
838
- // fix the size.
839
- numBlocks = size / blockSize;
840
- ++numBlocks;
841
- amps_uint32_t blockCount = 0;
842
- // We allocate all the Blocks at once below so delete allocated Block[]
843
- delete[] _blockStore.resizeBuffer(numBlocks * blockSize, &blockCount);
844
- // Resize can fail if resizeHandler is set and refuses the request
845
- // Since this is recovery, we need to simply fail in that case
846
- if (size > pBuffer->getSize() || numBlocks != (size_t)blockCount)
847
- {
848
- throw StoreException("Publish Store could not resize correctly during recovery, possibly due to resizeHandler refusing the request.");
849
- }
850
- size = pBuffer->getSize();
851
- }
852
-
853
- amps_uint64_t maxIdx = 0;
854
- amps_uint64_t minIdx = 0;
855
- size_t location = 0;
856
- BlockHeader blockHeader;
857
- // The blocks we create here all get their offset set in below loop
858
- Block* blocks = new Block[numBlocks];
859
- blocks[numBlocks - 1]._nextInList = 0;
860
- size_t blockNum = 0;
861
- _blockStore.addBlocks(blocks);
862
- _metadataBlock = blocks; // The first Block is metadata
863
- _metadataBlock->_nextInList = 0;
864
- pBuffer->setPosition(0);
865
- pBuffer->copyBytes((char*)&blockHeader, sizeof(BlockHeader));
866
- /* Metadata Block header fields
867
- * amps_uint32_t _blocksToWrite = BlockSize
868
- * amps_uint32_t _totalRemaining = BlockHeaderSize
869
- * amps_uint64_t _seq = last persisted sequence number
870
- * amps_uint64_t _crcVal = unused
871
- * amps_uint64_t _nextInChain = unused
872
- */
873
- if (blockHeader._blocksToWrite == 1) // Old store format?
874
- {
875
- /* Old format metadata block header fields
876
- * amps_uint32_t _blocksToWrite = 1
877
- * amps_uint32_t _totalRemaining = client version
878
- * amps_uint64_t _seq = last persisted sequence number
879
- * amps_uint64_t _crcVal = unused
880
- * amps_uint64_t _nextInChain = unused
881
- */
882
- // Readable old format starts with version 5.0.0.0
883
- if (blockHeader._totalRemaining >= 5000000)
884
- {
885
- // All recovery needs to be based on old format
886
- // so go do that instead.
887
- recoverOldFormat(blocks);
888
- return;
889
- }
890
- // Unreadable format, fail
891
- throw StoreException("Unrecognized format for Store. Can't recover.");
892
- }
893
- if (blockHeader._blocksToWrite == 0)
894
- {
895
- pBuffer->setPosition(0);
896
- pBuffer->putUint32((amps_uint32_t)blockSize);
897
- }
898
- else
899
- {
900
- blockSize = blockHeader._blocksToWrite;
901
- _blockStore.setBlockSize(blockSize);
902
- }
903
- if (blockHeader._totalRemaining == 0)
904
- {
905
- pBuffer->setPosition(sizeof(amps_uint32_t));
906
- pBuffer->putUint32((amps_uint32_t)getBlockHeaderSize());
907
- }
908
- else
909
- {
910
- _blockStore.setBlockHeaderSize(blockHeader._totalRemaining);
911
- }
912
- _metadataBlock->_sequence = blockHeader._seq;
913
- if (_metadataBlock->_sequence
914
- && _metadataBlock->_sequence < (amps_uint64_t)1000000)
915
- {
916
- pBuffer->setPosition(_metadataBlock->_offset
917
- + sizeof(amps_uint32_t) // BlockSize
918
- + sizeof(amps_uint32_t)); // BlockHeaderSize
919
- pBuffer->putUint64((amps_uint64_t)0);
920
- _metadataBlock->_sequence = 0;
921
- }
922
- else
923
- {
924
- // Set _maxDiscarded and _lastSequence
925
- _maxDiscarded = _metadataBlock->_sequence;
926
- _lastSequence = _maxDiscarded;
927
- }
928
- // This would be where to check the client version string
929
- // No checks currently
930
- location += blockSize;
931
- amps_uint32_t freeCount = 0;
932
- Block* firstFree = NULL;
933
- Block* endOfFreeList = NULL;
934
- // Used to create used list in order after recovery
935
- typedef std::map<amps_uint64_t, Block*> RecoverMap;
936
- RecoverMap recoveredBlocks;
937
- while (location < size)
938
- {
939
- // Get index and check if non-zero
940
- pBuffer->setPosition(location);
941
- pBuffer->copyBytes((char*)&blockHeader, sizeof(BlockHeader));
942
- if ((blockHeader._seq > 0 && blockHeader._totalRemaining < size) &&
943
- (!blockHeader._crcVal || recoveredBlocks.count(blockHeader._seq)))
944
- {
945
- // Block is part of a chain
946
- location += blockSize;
947
- continue;
948
- }
949
- Block* block = blocks[++blockNum].setOffset(location);
950
- bool recovered = false;
951
- if (blockHeader._seq > 0 && blockHeader._totalRemaining < size)
952
- {
953
- blockHeader._totalRemaining -= (amps_uint32_t)getBlockChainHeaderSize();
954
- block->_sequence = blockHeader._seq;
955
- // Track min and max
956
- if (maxIdx < blockHeader._seq)
957
- {
958
- maxIdx = blockHeader._seq;
959
- }
960
- if (minIdx > blockHeader._seq)
961
- {
962
- minIdx = blockHeader._seq;
963
- }
964
- // Save it in recovered blocks
965
- recoveredBlocks[blockHeader._seq] = block;
966
- // Set up the chain
967
- while (blockHeader._nextInChain != (amps_uint64_t)0)
968
- {
969
- Block* chain = blocks[++blockNum]
970
- .setOffset((size_t)blockHeader._nextInChain);
971
- chain->_nextInList = 0;
972
- pBuffer->setPosition((size_t)blockHeader._nextInChain
973
- + sizeof(amps_uint32_t) // blocks used
974
- + sizeof(amps_uint32_t) // record length
975
- + sizeof(amps_uint64_t) // seq
976
- + sizeof(amps_uint64_t)); // crc
977
- blockHeader._nextInChain = pBuffer->getUint64();
978
- block->_nextInChain = chain;
979
- block = chain;
980
- block->_sequence = blockHeader._seq;
981
- }
982
- recovered = true;
983
- }
984
- if (!recovered)
985
- {
986
- // Put this Block on the free list
987
- if (endOfFreeList)
988
- {
989
- endOfFreeList->_nextInList = block;
990
- }
991
- else
992
- {
993
- firstFree = block;
994
- }
995
- endOfFreeList = block;
996
- ++freeCount;
997
- }
998
- location += blockSize;
999
- }
1000
- if (endOfFreeList)
1001
- {
1002
- endOfFreeList->_nextInList = 0;
1003
- }
1004
- _blockStore.setFreeList(firstFree, freeCount);
1005
- if (maxIdx > _lastSequence)
1006
- {
1007
- _lastSequence = maxIdx;
1008
- }
1009
- if (minIdx > _maxDiscarded + 1)
1010
- {
1011
- _maxDiscarded = minIdx - 1;
1012
- }
1013
- if (_maxDiscarded > _metadataBlock->_sequence)
1014
- {
1015
- _metadataBlock->_sequence = _maxDiscarded;
1016
- pBuffer->setPosition(_metadataBlock->_offset + 8);
1017
- pBuffer->putUint64(_maxDiscarded);
1018
- }
1019
- Block* end = NULL;
1020
- AMPS_FETCH_ADD(&_stored, (long)(recoveredBlocks.size()));
1021
- for (RecoverMap::iterator i = recoveredBlocks.begin();
1022
- i != recoveredBlocks.end(); ++i)
1023
- {
1024
- if (end)
1025
- {
1026
- end->_nextInList = i->second;
1027
- }
1028
- else
1029
- {
1030
- _blockStore.setUsedList(i->second);
1031
- }
1032
- end = i->second;
1033
- }
1034
- if (end)
1035
- {
1036
- end->_nextInList = 0;
1037
- }
1038
- _blockStore.setEndOfUsedList(end);
1039
- }
1040
-
1041
- private:
1042
- // Lock should already be held
1043
- void replayOnto(Block* block_, StoreReplayer& replayer_)
1044
- {
1045
- // Read the header
1046
- size_t start = block_->_offset;
1047
- size_t position = start;
1048
- Buffer* pBuffer = _blockStore.getBuffer();
1049
- pBuffer->setPosition(position);
1050
- BlockHeader blockHeader;
1051
- pBuffer->copyBytes((char*)&blockHeader, sizeof(BlockHeader));
1052
- if (blockHeader._totalRemaining == 0)
1053
- {
1054
- // Queue acking sow_delete
1055
- return;
1056
- }
1057
- position += getBlockHeaderSize();
1058
- BlockChainHeader blockChainHeader;
1059
- pBuffer->copyBytes((char*)&blockChainHeader, sizeof(blockChainHeader));
1060
- if (blockChainHeader._operation == Message::Command::Unknown)
1061
- {
1062
- // Queue acking sow_delete
1063
- return;
1064
- }
1065
- blockChainHeader._ackTypes |= Message::AckType::Persisted;
1066
- position += getBlockChainHeaderSize();
1067
- blockHeader._totalRemaining -= (amps_uint32_t)getBlockChainHeaderSize();
1068
- pBuffer->setPosition(position);
1069
-
1070
- if (blockHeader._totalRemaining
1071
- < blockChainHeader._commandIdLen
1072
- + blockChainHeader._correlationIdLen
1073
- + blockChainHeader._expirationLen
1074
- + blockChainHeader._sowKeyLen
1075
- + blockChainHeader._topicLen)
1076
- {
1077
- std::ostringstream os;
1078
- os << "Corrupted message found with invalid lengths. "
1079
- << "Attempting to replay " << block_->_sequence
1080
- << ". Block sequence " << blockHeader._seq
1081
- << ", topic length " << blockChainHeader._topicLen
1082
- << ", data length " << blockHeader._totalRemaining
1083
- << ", command ID length " << blockChainHeader._commandIdLen
1084
- << ", correlation ID length " << blockChainHeader._correlationIdLen
1085
- << ", expiration length " << blockChainHeader._expirationLen
1086
- << ", sow key length " << blockChainHeader._sowKeyLen
1087
- << ", start " << start
1088
- << ", position " << position
1089
- << ", buffer size " << pBuffer->getSize();
1090
- throw StoreException(os.str());
1091
- }
1092
-
1093
- // Start prepping the message
1094
- _message.reset();
1095
- _message.setCommandEnum((Message::Command::Type)blockChainHeader._operation);
1096
- _message.setAckTypeEnum((unsigned)blockChainHeader._ackTypes
1097
- | Message::AckType::Persisted);
1098
- _message.setSequence(blockHeader._seq);
1099
- // Read the data and calculate the CRC
1100
- Block* current = block_;
1101
- size_t blockBytesRemaining = getBlockDataSize() - getBlockChainHeaderSize();
1102
- amps_uint64_t crcCalc = (amps_uint64_t)0ULL;
1103
- // Use tmpBuffers for any fields split across Block boundaries
1104
- char** tmpBuffers = (blockHeader._blocksToWrite > 1) ? new char* [blockHeader._blocksToWrite - 1] : 0;
1105
- size_t blockNum = 0;
1106
- if (blockChainHeader._commandIdLen > 0)
1107
- {
1108
- if (blockChainHeader._commandIdLen <= blockBytesRemaining)
1109
- {
1110
- _message.assignCommandId(pBuffer->getBytes(blockChainHeader._commandIdLen)._data,
1111
- blockChainHeader._commandIdLen);
1112
- blockBytesRemaining -= blockChainHeader._commandIdLen;
1113
- }
1114
- else
1115
- {
1116
- tmpBuffers[blockNum] = new char[blockChainHeader._commandIdLen]; // -V522
1117
- size_t totalLeft = blockChainHeader._commandIdLen;
1118
- size_t totalRead = 0;
1119
- size_t readLen = 0;
1120
- while (totalLeft)
1121
- {
1122
- readLen = blockBytesRemaining < totalLeft ?
1123
- blockBytesRemaining : totalLeft;
1124
- pBuffer->copyBytes(tmpBuffers[blockNum] + totalRead, readLen);
1125
- if (!(totalLeft -= readLen))
1126
- {
1127
- break;
1128
- }
1129
- if (!(current = current->_nextInChain))
1130
- {
1131
- break;
1132
- }
1133
- totalRead += readLen;
1134
- blockBytesRemaining = getBlockDataSize();
1135
- position = current->_offset + getBlockHeaderSize();
1136
- pBuffer->setPosition(position);
1137
- }
1138
- blockBytesRemaining -= readLen;
1139
- _message.assignCommandId(tmpBuffers[blockNum++], blockChainHeader._commandIdLen);
1140
- }
1141
- blockHeader._totalRemaining -= blockChainHeader._commandIdLen;
1142
- crcCalc = _crc(_message.getCommandId().data(),
1143
- blockChainHeader._commandIdLen, crcCalc);
1144
- }
1145
- if (blockChainHeader._correlationIdLen > 0)
1146
- {
1147
- if (blockChainHeader._correlationIdLen <= blockBytesRemaining)
1148
- {
1149
- _message.assignCorrelationId(
1150
- pBuffer->getBytes(blockChainHeader._correlationIdLen)._data,
1151
- blockChainHeader._correlationIdLen);
1152
- blockBytesRemaining -= blockChainHeader._correlationIdLen;
1153
- }
1154
- else
1155
- {
1156
- tmpBuffers[blockNum] = new char[blockChainHeader._correlationIdLen]; // -V522
1157
- size_t totalLeft = blockChainHeader._correlationIdLen;
1158
- size_t totalRead = 0;
1159
- size_t readLen = 0;
1160
- while (totalLeft)
1161
- {
1162
- readLen = blockBytesRemaining < totalLeft ?
1163
- blockBytesRemaining : totalLeft;
1164
- pBuffer->copyBytes(tmpBuffers[blockNum] + totalRead, readLen);
1165
- if (!(totalLeft -= readLen))
1166
- {
1167
- break;
1168
- }
1169
- if (!(current = current->_nextInChain))
1170
- {
1171
- break; // -V522
1172
- }
1173
- totalRead += readLen;
1174
- blockBytesRemaining = getBlockDataSize();
1175
- position = current->_offset + getBlockHeaderSize();
1176
- pBuffer->setPosition(position);
1177
- }
1178
- blockBytesRemaining -= readLen;
1179
- _message.assignCorrelationId(tmpBuffers[blockNum++], blockChainHeader._correlationIdLen);
1180
- }
1181
- blockHeader._totalRemaining -= blockChainHeader._correlationIdLen;
1182
- crcCalc = _crc(_message.getCorrelationId().data(),
1183
- blockChainHeader._correlationIdLen, crcCalc);
1184
- }
1185
- if (blockChainHeader._expirationLen > 0)
1186
- {
1187
- if (blockChainHeader._expirationLen <= blockBytesRemaining)
1188
- {
1189
- _message.assignExpiration(
1190
- pBuffer->getBytes(blockChainHeader._expirationLen)._data,
1191
- blockChainHeader._expirationLen);
1192
- blockBytesRemaining -= blockChainHeader._expirationLen;
1193
- }
1194
- else
1195
- {
1196
- tmpBuffers[blockNum] = new char[blockChainHeader._expirationLen]; // -V522
1197
- size_t totalLeft = blockChainHeader._expirationLen;
1198
- size_t totalRead = 0;
1199
- size_t readLen = 0;
1200
- while (totalLeft)
1201
- {
1202
- readLen = blockBytesRemaining < totalLeft ?
1203
- blockBytesRemaining : totalLeft;
1204
- pBuffer->copyBytes(tmpBuffers[blockNum] + totalRead, readLen);
1205
- if (!(totalLeft -= readLen))
1206
- {
1207
- break;
1208
- }
1209
- if (!(current = current->_nextInChain))
1210
- {
1211
- break;
1212
- }
1213
- totalRead += readLen;
1214
- blockBytesRemaining = getBlockDataSize();
1215
- position = current->_offset + getBlockHeaderSize();
1216
- pBuffer->setPosition(position);
1217
- }
1218
- blockBytesRemaining -= readLen;
1219
- _message.assignExpiration(tmpBuffers[blockNum++], blockChainHeader._expirationLen);
1220
- }
1221
- blockHeader._totalRemaining -= blockChainHeader._expirationLen;
1222
- crcCalc = _crc(_message.getExpiration().data(),
1223
- blockChainHeader._expirationLen, crcCalc);
1224
- }
1225
- if (blockChainHeader._sowKeyLen > 0)
1226
- {
1227
- if (blockChainHeader._sowKeyLen <= blockBytesRemaining)
1228
- {
1229
- _message.assignSowKey(pBuffer->getBytes(blockChainHeader._sowKeyLen)._data,
1230
- blockChainHeader._sowKeyLen);
1231
- blockBytesRemaining -= blockChainHeader._sowKeyLen;
1232
- }
1233
- else
1234
- {
1235
- tmpBuffers[blockNum] = new char[blockChainHeader._sowKeyLen]; // -V522
1236
- size_t totalLeft = blockChainHeader._sowKeyLen;
1237
- size_t totalRead = 0;
1238
- size_t readLen = 0;
1239
- while (totalLeft)
1240
- {
1241
- readLen = blockBytesRemaining < totalLeft ?
1242
- blockBytesRemaining : totalLeft;
1243
- pBuffer->copyBytes(tmpBuffers[blockNum] + totalRead, readLen);
1244
- if (!(totalLeft -= readLen))
1245
- {
1246
- break;
1247
- }
1248
- if (!(current = current->_nextInChain))
1249
- {
1250
- break;
1251
- }
1252
- totalRead += readLen;
1253
- blockBytesRemaining = getBlockDataSize();
1254
- position = current->_offset + getBlockHeaderSize();
1255
- pBuffer->setPosition(position);
1256
- }
1257
- blockBytesRemaining -= readLen;
1258
- _message.assignSowKey(tmpBuffers[blockNum++], blockChainHeader._sowKeyLen);
1259
- }
1260
- blockHeader._totalRemaining -= blockChainHeader._sowKeyLen;
1261
- crcCalc = _crc(_message.getSowKey().data(), blockChainHeader._sowKeyLen, crcCalc);
1262
- }
1263
- if (blockChainHeader._topicLen > 0)
1264
- {
1265
- if (blockChainHeader._topicLen <= blockBytesRemaining)
1266
- {
1267
- _message.assignTopic(pBuffer->getBytes(blockChainHeader._topicLen)._data,
1268
- blockChainHeader._topicLen);
1269
- blockBytesRemaining -= blockChainHeader._topicLen;
1270
- }
1271
- else
1272
- {
1273
- tmpBuffers[blockNum] = new char[blockChainHeader._topicLen]; // -V522
1274
- size_t totalLeft = blockChainHeader._topicLen;
1275
- size_t totalRead = 0;
1276
- size_t readLen = 0;
1277
- while (totalLeft)
1278
- {
1279
- readLen = blockBytesRemaining < totalLeft ?
1280
- blockBytesRemaining : totalLeft;
1281
- pBuffer->copyBytes(tmpBuffers[blockNum] + totalRead, readLen);
1282
- if (!(totalLeft -= readLen))
1283
- {
1284
- break;
1285
- }
1286
- if (!(current = current->_nextInChain))
1287
- {
1288
- break;
1289
- }
1290
- totalRead += readLen;
1291
- blockBytesRemaining = getBlockDataSize();
1292
- position = current->_offset + getBlockHeaderSize();
1293
- pBuffer->setPosition(position);
1294
- }
1295
- blockBytesRemaining -= readLen;
1296
- _message.assignTopic(tmpBuffers[blockNum++], blockChainHeader._topicLen);
1297
- }
1298
- blockHeader._totalRemaining -= blockChainHeader._topicLen;
1299
- crcCalc = _crc(_message.getTopic().data(), blockChainHeader._topicLen, crcCalc);
1300
- }
1301
- if (blockHeader._totalRemaining > 0)
1302
- {
1303
- if (blockHeader._totalRemaining <= blockBytesRemaining)
1304
- {
1305
- if (blockChainHeader._flag == -1 || blockChainHeader._flag == SOW_DELETE_DATA)
1306
- {
1307
- _message.assignData(
1308
- pBuffer->getBytes(blockHeader._totalRemaining)._data,
1309
- blockHeader._totalRemaining);
1310
- crcCalc = _crc(_message.getData().data(),
1311
- blockHeader._totalRemaining, crcCalc);
1312
- }
1313
- else if (blockChainHeader._flag == SOW_DELETE_FILTER)
1314
- {
1315
- _message.assignFilter(
1316
- pBuffer->getBytes(blockHeader._totalRemaining)._data,
1317
- blockHeader._totalRemaining);
1318
- crcCalc = _crc(_message.getFilter().data(),
1319
- blockHeader._totalRemaining, crcCalc);
1320
- }
1321
- else if (blockChainHeader._flag == SOW_DELETE_KEYS)
1322
- {
1323
- _message.assignSowKeys(
1324
- pBuffer->getBytes(blockHeader._totalRemaining)._data,
1325
- blockHeader._totalRemaining);
1326
- crcCalc = _crc(_message.getSowKeys().data(),
1327
- blockHeader._totalRemaining, crcCalc);
1328
- }
1329
- else if (blockChainHeader._flag == SOW_DELETE_BOOKMARK)
1330
- {
1331
- _message.assignBookmark(
1332
- pBuffer->getBytes(blockHeader._totalRemaining)._data,
1333
- blockHeader._totalRemaining);
1334
- crcCalc = _crc(_message.getBookmark().data(),
1335
- blockHeader._totalRemaining, crcCalc);
1336
- }
1337
- else if (blockChainHeader._flag == SOW_DELETE_BOOKMARK_CANCEL)
1338
- {
1339
- _message.assignBookmark(
1340
- pBuffer->getBytes(blockHeader._totalRemaining)._data,
1341
- blockHeader._totalRemaining);
1342
- crcCalc = _crc(_message.getBookmark().data(),
1343
- blockHeader._totalRemaining, crcCalc);
1344
- _message.assignOptions(AMPS_OPTIONS_CANCEL, 6);
1345
- }
1346
- }
1347
- else
1348
- {
1349
- tmpBuffers[blockNum] = new char[blockHeader._totalRemaining]; // -V522
1350
- size_t totalLeft = blockHeader._totalRemaining;
1351
- size_t totalRead = 0;
1352
- size_t readLen = 0;
1353
- while (totalLeft)
1354
- {
1355
- readLen = blockBytesRemaining < totalLeft ?
1356
- blockBytesRemaining : totalLeft;
1357
- pBuffer->copyBytes(tmpBuffers[blockNum] + totalRead, readLen);
1358
- if (!(totalLeft -= readLen))
1359
- {
1360
- break;
1361
- }
1362
- if (!(current = current->_nextInChain))
1363
- {
1364
- break;
1365
- }
1366
- totalRead += readLen;
1367
- blockBytesRemaining = getBlockDataSize();
1368
- position = current->_offset + getBlockHeaderSize();
1369
- pBuffer->setPosition(position);
1370
- }
1371
- position += readLen;
1372
- if (blockChainHeader._flag == -1 || blockChainHeader._flag == SOW_DELETE_DATA)
1373
- {
1374
- _message.assignData(tmpBuffers[blockNum], blockHeader._totalRemaining);
1375
- }
1376
- else if (blockChainHeader._flag == SOW_DELETE_FILTER)
1377
- {
1378
- _message.assignFilter(tmpBuffers[blockNum], blockHeader._totalRemaining);
1379
- }
1380
- else if (blockChainHeader._flag == SOW_DELETE_KEYS)
1381
- {
1382
- _message.assignSowKeys(tmpBuffers[blockNum], blockHeader._totalRemaining);
1383
- }
1384
- else if (blockChainHeader._flag == SOW_DELETE_BOOKMARK)
1385
- {
1386
- _message.assignBookmark(tmpBuffers[blockNum], blockHeader._totalRemaining);
1387
- }
1388
- else if (blockChainHeader._flag == SOW_DELETE_BOOKMARK_CANCEL)
1389
- {
1390
- _message.assignBookmark(tmpBuffers[blockNum], blockHeader._totalRemaining);
1391
- _message.assignOptions(AMPS_OPTIONS_CANCEL, 6);
1392
- }
1393
- crcCalc = _crc(tmpBuffers[blockNum++], blockHeader._totalRemaining, crcCalc); // -V595
1394
- }
1395
- }
1396
-
1397
- // Validate the crc and seq
1398
- if (crcCalc != blockHeader._crcVal || blockHeader._seq != block_->_sequence)
1399
- {
1400
- std::ostringstream os;
1401
- os << "Corrupted message found by CRC or sequence "
1402
- << "Attempting to replay " << block_->_sequence
1403
- << ". Block sequence " << blockHeader._seq
1404
- << ", expiration length " << blockChainHeader._expirationLen
1405
- << ", sowKey length " << blockChainHeader._sowKeyLen
1406
- << ", topic length " << blockChainHeader._topicLen
1407
- << ", data length " << blockHeader._totalRemaining
1408
- << ", command ID length " << blockChainHeader._commandIdLen
1409
- << ", correlation ID length " << blockChainHeader._correlationIdLen
1410
- << ", flag " << blockChainHeader._flag
1411
- << ", expected CRC " << blockHeader._crcVal
1412
- << ", actual CRC " << crcCalc
1413
- << ", start " << start
1414
- << ", position " << position
1415
- << ", buffer size " << pBuffer->getSize();
1416
- for (Block* block = block_; block; block = block->_nextInChain)
1417
- {
1418
- os << "\n BLOCK " << block->_offset;
1419
- }
1420
- if (tmpBuffers)
1421
- {
1422
- for (amps_uint32_t i = 0; i < blockNum; ++i)
1423
- {
1424
- delete[] tmpBuffers[i]; // -V522
1425
- }
1426
- delete[] tmpBuffers;
1427
- }
1428
- throw StoreException(os.str());
1429
- }
1430
- // Replay the message
1431
- replayer_.execute(_message);
1432
- // Free the buffer if allocated
1433
- if (tmpBuffers)
1434
- {
1435
- for (amps_uint32_t i = 0; i < blockNum; ++i)
1436
- {
1437
- delete[] tmpBuffers[i]; // -V522
1438
- }
1439
- delete[] tmpBuffers;
1440
- }
1441
- }
1442
-
1443
- // Lock should already be held
1444
- // Read an older format file and update it.
1445
- void recoverOldFormat(Block* blocks)
1446
- {
1447
- Buffer* pBuffer = _blockStore.getBuffer();
1448
- amps_uint64_t maxIdx = 0;
1449
- amps_uint64_t minIdx = 0;
1450
- size_t size = pBuffer->getSize();
1451
- size_t location = 0;
1452
- pBuffer->setPosition(location);
1453
- pBuffer->putUint32((amps_uint32_t)getBlockSize());
1454
- pBuffer->putUint32((amps_uint32_t)_blockStore.getBlockHeaderSize());
1455
- _metadataBlock->_sequence = pBuffer->getUint64();
1456
- if (_metadataBlock->_sequence < (amps_uint64_t)1000000)
1457
- {
1458
- pBuffer->setPosition(_metadataBlock->_offset + 8);
1459
- pBuffer->putUint64((amps_uint64_t)0);
1460
- _metadataBlock->_sequence = 0;
1461
- }
1462
- else
1463
- {
1464
- // Set _maxDiscarded and _lastSequence
1465
- _maxDiscarded = _metadataBlock->_sequence;
1466
- _lastSequence = _maxDiscarded;
1467
- }
1468
- // Write the current client version
1469
- pBuffer->putUint64((amps_uint64_t)VersionInfo::parseVersion(AMPS_CLIENT_VERSION));
1470
- // No next in chain
1471
- pBuffer->putUint64((amps_uint64_t)0);
1472
- // No checks currently
1473
- location += getBlockSize();
1474
- amps_uint32_t freeCount = 0;
1475
- Block* firstFree = NULL;
1476
- Block* endOfFreeList = NULL;
1477
- size_t blockSize = getBlockSize();
1478
- size_t numBlocks = size / blockSize;
1479
- size_t blockNum = 0;
1480
- // Used to create used list in order after recovery
1481
- typedef std::map<amps_uint64_t, Block*> RecoverMap;
1482
- RecoverMap recoveredBlocks;
1483
- RecoverMap growingBlocks;
1484
- amps_uint32_t growthBlocksNeeded = 0;
1485
- while (location < size)
1486
- {
1487
- // Get seq and check if non-zero
1488
- pBuffer->setPosition(location);
1489
- BlockHeader blockHeader;
1490
- pBuffer->copyBytes((char*)&blockHeader, sizeof(BlockHeader));
1491
- size_t blockCount = (size_t)blockHeader._blocksToWrite;
1492
- if (blockHeader._totalRemaining > 0 && blockHeader._seq > 0
1493
- && blockHeader._totalRemaining < size
1494
- && blockHeader._blocksToWrite < numBlocks
1495
- && (blockHeader._blocksToWrite * blockSize)
1496
- >= blockHeader._totalRemaining)
1497
- {
1498
- size_t oldFormatSize = blockHeader._totalRemaining;
1499
- // Old format total was storage bytes plus 64 bytes for block
1500
- // and chain headers.
1501
- blockHeader._totalRemaining -= 64;
1502
- // New format counts only chain header size
1503
- blockHeader._totalRemaining += getBlockChainHeaderSize();
1504
- // Get the rest of the header
1505
- BlockChainHeader chainHeader;
1506
- // Need to reset location to after OLD header:
1507
- // amps_uint32_t blocks, amps_uint32_t totalRemaining,
1508
- // amps_uint64_t seq, amps_uint64_t crc
1509
- pBuffer->setPosition(location + (sizeof(amps_uint32_t) * 2)
1510
- + (sizeof(amps_uint64_t) * 2) );
1511
- // Read old chain header which uses same order, but not
1512
- // as many bytes (everything is 32bit):
1513
- // operation, commandIdLen, correlationIdLen,
1514
- // expirationLen, sowKeyLen, topicLen, flag, ackTypes
1515
- pBuffer->copyBytes((char*)&chainHeader,
1516
- sizeof(amps_uint32_t) * 8);
1517
- // Check for garbage, likely indicating this is part of a chain
1518
- if ((chainHeader._commandIdLen + chainHeader._correlationIdLen
1519
- + chainHeader._expirationLen + chainHeader._sowKeyLen
1520
- + chainHeader._topicLen) > blockHeader._totalRemaining)
1521
- {
1522
- // Skip this block, can't be real data
1523
- location += getBlockSize();
1524
- continue;
1525
- }
1526
- // Check if data fits in current number of blocks
1527
- amps_uint32_t blocksNeeded = (blockHeader._totalRemaining
1528
- / getBlockDataSize())
1529
- + (blockHeader._totalRemaining
1530
- % getBlockDataSize()
1531
- ? 1 : 0);
1532
- if (blocksNeeded == blockHeader._blocksToWrite)
1533
- {
1534
- Block* first = blocks[++blockNum].setOffset(location);
1535
- first->_nextInList = 0;
1536
- first->_sequence = blockHeader._seq;
1537
- if (blockHeader._blocksToWrite > 1)
1538
- {
1539
- // CRC is only set on the first block
1540
- amps_uint64_t crcVal = blockHeader._crcVal;
1541
- blockHeader._crcVal = 0;
1542
- Block* current = 0;
1543
- // It fits, just need to adjust the block formats
1544
- // and set up the chain. Start with the last block
1545
- // and move data as needed starting at the end.
1546
- size_t currentBlockNum = blockNum
1547
- + blockHeader._blocksToWrite
1548
- - 1;
1549
- // Last item could wrap to beginning, but beginning is
1550
- // block 1, not 0, which is the metadata block.
1551
- if (currentBlockNum >= numBlocks)
1552
- {
1553
- currentBlockNum = currentBlockNum - numBlocks + 1;
1554
- }
1555
- if (currentBlockNum < blockNum)
1556
- {
1557
- Block* last = blocks[currentBlockNum]
1558
- .init(currentBlockNum, getBlockSize());
1559
- if ((current = firstFree) == last)
1560
- {
1561
- firstFree = firstFree->_nextInList; // -V522
1562
- if (!firstFree)
1563
- {
1564
- endOfFreeList = 0;
1565
- }
1566
- --freeCount;
1567
- }
1568
- else
1569
- {
1570
- while (current)
1571
- {
1572
- if (current->_nextInList == last)
1573
- {
1574
- current->_nextInList = last->_nextInList;
1575
- current = last;
1576
- --freeCount;
1577
- break;
1578
- }
1579
- current = current->_nextInList;
1580
- }
1581
- }
1582
- }
1583
- if (!current)
1584
- {
1585
- current = blocks[currentBlockNum]
1586
- .init(currentBlockNum, getBlockSize());
1587
- }
1588
- // Initially, the number of bytes in last block
1589
- size_t dataBytes = oldFormatSize % getBlockSize();
1590
- while (current != first)
1591
- {
1592
- current->_nextInList = 0;
1593
- current->_sequence = blockHeader._seq;
1594
- // Set _nextInChain on previous Block, will include first
1595
- if (--currentBlockNum < 1
1596
- || currentBlockNum > numBlocks)
1597
- {
1598
- currentBlockNum = numBlocks - 1;
1599
- }
1600
- Block* previous = blocks[currentBlockNum]
1601
- .init(currentBlockNum,
1602
- getBlockSize());
1603
- previous->_nextInChain = current;
1604
- // Shift to make room for a header in every block
1605
- // Not growing, so this won't write past the end.
1606
- // Shift amount accounts for a header added to each
1607
- // block after the first plus any change in the
1608
- // chain header size from 32, which is the old size.
1609
- size_t bytesToMove = --blockCount
1610
- * getBlockHeaderSize()
1611
- + (getBlockChainHeaderSize()
1612
- - 32);
1613
- pBuffer->copyBytes(current->_offset + bytesToMove,
1614
- current->_offset,
1615
- dataBytes);
1616
- dataBytes = getBlockSize();
1617
- if (bytesToMove > getBlockHeaderSize())
1618
- {
1619
- bytesToMove -= getBlockHeaderSize();
1620
- dataBytes -= bytesToMove;
1621
- pBuffer->copyBytes(current->_offset
1622
- + getBlockHeaderSize(),
1623
- previous->_offset
1624
- + dataBytes,
1625
- bytesToMove);
1626
- }
1627
- // Set next in chain for this block's header
1628
- blockHeader._nextInChain = (current->_nextInChain
1629
- ? current->_nextInChain->_offset
1630
- : (amps_uint64_t)0);
1631
- // Write the header for this block
1632
- pBuffer->setPosition(current->_offset);
1633
- pBuffer->putBytes((const char*)&blockHeader,
1634
- sizeof(BlockHeader));
1635
- if (firstFree == previous)
1636
- {
1637
- firstFree = firstFree->_nextInList;
1638
- if (!firstFree)
1639
- {
1640
- endOfFreeList = 0;
1641
- }
1642
- --freeCount;
1643
- }
1644
- else
1645
- {
1646
- current = firstFree;
1647
- while (current)
1648
- {
1649
- if (current->_nextInList == previous)
1650
- {
1651
- current->_nextInList = previous->_nextInList;
1652
- --freeCount;
1653
- break;
1654
- }
1655
- current = current->_nextInList;
1656
- }
1657
- }
1658
- current = previous;
1659
- }
1660
- blockNum += blockHeader._blocksToWrite - 1;
1661
- blockHeader._crcVal = crcVal;
1662
- }
1663
- // Move bytes for chain header expansion from 32 bytes
1664
- size_t bytesToMove = getBlockDataSize() - 32
1665
- - (getBlockChainHeaderSize() - 32);
1666
- pBuffer->copyBytes(first->_offset + getBlockHeaderSize()
1667
- + getBlockChainHeaderSize(),
1668
- first->_offset + getBlockHeaderSize() + 32,
1669
- bytesToMove);
1670
- // Rewrite the header and chain header for first Block.
1671
- pBuffer->setPosition(first->_offset);
1672
- blockHeader._nextInChain = (first->_nextInChain
1673
- ? first->_nextInChain->_offset
1674
- : (amps_uint64_t)0);
1675
- pBuffer->putBytes((const char*)&blockHeader,
1676
- sizeof(BlockHeader));
1677
- pBuffer->putBytes((const char*)&chainHeader,
1678
- sizeof(BlockChainHeader));
1679
- // Add first Block to recovered for building the used
1680
- // list later
1681
- recoveredBlocks[blockHeader._seq] = first;
1682
- }
1683
- else
1684
- {
1685
- // This will need at least one more Block due to a header in
1686
- // every Block. Check how many and save for later.
1687
- growingBlocks[blockHeader._seq] = blocks[++blockNum].setOffset(location);
1688
- growthBlocksNeeded += (blocksNeeded - blockHeader._blocksToWrite);
1689
- blockNum += blockHeader._blocksToWrite - 1;
1690
- }
1691
- // Track min and max
1692
- if (maxIdx < blockHeader._seq)
1693
- {
1694
- maxIdx = blockHeader._seq;
1695
- }
1696
- if (minIdx > blockHeader._seq)
1697
- {
1698
- minIdx = blockHeader._seq;
1699
- }
1700
- // Advance past read blocks
1701
- location += blockHeader._blocksToWrite * getBlockSize();
1702
- // Either we're exiting loop, or blockNum is in range
1703
- assert(location >= size || blockNum < numBlocks);
1704
- }
1705
- else
1706
- {
1707
- // Put this Block on the free list
1708
- Block* block = blocks[++blockNum].setOffset(location);
1709
- if (endOfFreeList)
1710
- {
1711
- endOfFreeList->_nextInList = block;
1712
- }
1713
- else
1714
- {
1715
- firstFree = block;
1716
- }
1717
- endOfFreeList = block;
1718
- ++freeCount;
1719
- location += blockSize;
1720
- }
1721
- }
1722
- for (RecoverMap::iterator i = growingBlocks.begin();
1723
- i != growingBlocks.end(); ++i)
1724
- {
1725
- Block* first = i->second;
1726
- pBuffer->setPosition(first->_offset);
1727
- BlockHeader blockHeader;
1728
- // Read an old BlockHeader, which is only 24 bytes.
1729
- // The bytes match current BlockHeader, and _nextInChain is 0.
1730
- pBuffer->copyBytes((char*)&blockHeader, 24);
1731
- // Old format total was storage bytes plus 64 bytes for block
1732
- // and chain headers.
1733
- blockHeader._totalRemaining -= 64;
1734
- // New format counts only chain header size
1735
- blockHeader._totalRemaining += getBlockChainHeaderSize();
1736
- if (freeCount < growthBlocksNeeded)
1737
- {
1738
- // We have to resize, let's try to do it once.
1739
- amps_uint32_t minBlocksRequired = growthBlocksNeeded - freeCount;
1740
- amps_uint32_t growthBlocks = _blockStore.getDefaultResizeBlocks();
1741
- if (growthBlocks < minBlocksRequired)
1742
- {
1743
- amps_uint32_t defaultBlocks = _blockStore.getDefaultResizeBlocks();
1744
- if (minBlocksRequired % defaultBlocks)
1745
- minBlocksRequired = (minBlocksRequired / defaultBlocks + 1)
1746
- * defaultBlocks;
1747
- growthBlocks = minBlocksRequired;
1748
- }
1749
- amps_uint32_t newBlocks = 0;
1750
- Block* addedBlocks = _blockStore.resizeBuffer(
1751
- pBuffer->getSize()
1752
- + growthBlocks * blockSize,
1753
- &newBlocks);
1754
- if (!addedBlocks)
1755
- {
1756
- throw StoreException("Failed to grow store buffer during recovery");
1757
- }
1758
- _blockStore.addBlocks(addedBlocks);
1759
- freeCount += newBlocks;
1760
- growthBlocksNeeded = (growthBlocksNeeded > freeCount)
1761
- ? growthBlocksNeeded - freeCount : 0;
1762
- if (endOfFreeList)
1763
- {
1764
- endOfFreeList->_nextInList = addedBlocks;
1765
- }
1766
- else
1767
- {
1768
- firstFree = addedBlocks;
1769
- }
1770
- endOfFreeList = &(addedBlocks[newBlocks - 1]);
1771
- endOfFreeList->_nextInList = 0;
1772
- }
1773
- expandBlocks(blocks, first->_offset, first, blockHeader,
1774
- &firstFree, &freeCount, pBuffer);
1775
- // Add first Block to recovered for building the used list later
1776
- recoveredBlocks[blockHeader._seq] = first;
1777
- if (!firstFree)
1778
- {
1779
- endOfFreeList = 0;
1780
- }
1781
- }
1782
- if (endOfFreeList)
1783
- {
1784
- endOfFreeList->_nextInList = 0;
1785
- }
1786
- _blockStore.setFreeList(firstFree, freeCount);
1787
- if (maxIdx > _lastSequence)
1788
- {
1789
- _lastSequence = maxIdx;
1790
- }
1791
- if (minIdx > _maxDiscarded + 1)
1792
- {
1793
- _maxDiscarded = minIdx - 1;
1794
- }
1795
- if (_maxDiscarded > _metadataBlock->_sequence)
1796
- {
1797
- _metadataBlock->_sequence = _maxDiscarded;
1798
- pBuffer->setPosition(_metadataBlock->_offset + 8);
1799
- pBuffer->putUint64(_maxDiscarded);
1800
- }
1801
- Block* end = NULL;
1802
- AMPS_FETCH_ADD(&_stored, (long)(recoveredBlocks.size()));
1803
- for (RecoverMap::iterator i = recoveredBlocks.begin();
1804
- i != recoveredBlocks.end(); ++i)
1805
- {
1806
- if (_blockStore.front())
1807
- {
1808
- end->_nextInList = i->second; // -V522
1809
- }
1810
- else
1811
- {
1812
- _blockStore.setUsedList(i->second);
1813
- }
1814
- end = i->second;
1815
- }
1816
- if (end)
1817
- {
1818
- end->_nextInList = 0;
1819
- }
1820
- _blockStore.setEndOfUsedList(end);
1821
- }
1822
-
1823
- // For recovering an old format store to current format when more Blocks
1824
- // are needed with the new format.
1825
- void expandBlocks(Block* blocks_, size_t location_, Block* first_,
1826
- BlockHeader blockHeader_,
1827
- Block** pFreeList_, amps_uint32_t* pFreeCount_,
1828
- Buffer* pBuffer_)
1829
- {
1830
- // First create the chain, then we'll fill in reverse
1831
- Block* current = first_;
1832
- // Old format total was storage bytes plus 64 bytes for block
1833
- // and chain headers.
1834
- amps_uint32_t oldTotalRemaining = blockHeader_._totalRemaining;
1835
- blockHeader_._totalRemaining -= 64;
1836
- // New format counts only chain header size
1837
- blockHeader_._totalRemaining += getBlockChainHeaderSize();
1838
- // Check how many Blocks needed and if we have enough free.
1839
- amps_uint32_t blocksNeeded = blockHeader_._totalRemaining
1840
- / getBlockDataSize()
1841
- + (blockHeader_._totalRemaining
1842
- % getBlockDataSize()
1843
- ? 1 : 0);
1844
- // Last data block size, remove bytes saved in first block
1845
- // then mod by block size.
1846
- const amps_uint32_t blockSize = getBlockSize();
1847
- // Old total remaining had all header included
1848
- size_t endBlockSize = oldTotalRemaining % blockSize;
1849
- if (!endBlockSize)
1850
- {
1851
- endBlockSize = blockSize;
1852
- }
1853
- size_t endOfData = 0;
1854
- // Hang on to CRC until first block is written
1855
- amps_uint64_t crcVal = blockHeader_._crcVal;
1856
- blockHeader_._crcVal = 0;
1857
-
1858
- std::stack<Block*> blocksUsed;
1859
- for (amps_uint32_t i = 1; i < blocksNeeded; ++i)
1860
- {
1861
- blocksUsed.push(current);
1862
- current->_sequence = blockHeader_._seq;
1863
- if (i >= blockHeader_._blocksToWrite)
1864
- {
1865
- if (i == blockHeader_._blocksToWrite)
1866
- {
1867
- endOfData = current->_offset + endBlockSize;
1868
- }
1869
- current->_nextInChain = *pFreeList_;
1870
- --(*pFreeCount_);
1871
- *pFreeList_ = (*pFreeList_)->_nextInList;
1872
- }
1873
- else
1874
- {
1875
- current->_nextInChain = current->_nextInList;
1876
- if (current->_nextInChain)
1877
- {
1878
- if (current->_offset + blockSize < pBuffer_->getSize())
1879
- {
1880
- current->_nextInChain->setOffset(current->_offset
1881
- + blockSize);
1882
- }
1883
- else
1884
- {
1885
- current->_nextInChain->setOffset(blockSize);
1886
- }
1887
- }
1888
- else
1889
- {
1890
- current->_nextInChain = blocks_[1].init(1, blockSize);
1891
- }
1892
- if (current->_nextInChain == *pFreeList_)
1893
- {
1894
- *pFreeList_ = (*pFreeList_)->_nextInList;
1895
- --(*pFreeCount_);
1896
- }
1897
- else
1898
- {
1899
- for (Block* free = *pFreeList_; free;
1900
- free = free->_nextInList)
1901
- {
1902
- if (free->_nextInList == current->_nextInChain)
1903
- {
1904
- free->_nextInList = free->_nextInList->_nextInList;
1905
- --(*pFreeCount_);
1906
- break;
1907
- }
1908
- }
1909
- }
1910
- }
1911
- current->_nextInList = 0;
1912
- current = current->_nextInChain;
1913
- }
1914
- // Make sure we write the correct number of blocks to write
1915
- blockHeader_._blocksToWrite = blocksNeeded;
1916
- // Finish setting up current
1917
- current->_nextInList = 0;
1918
- current->_sequence = blockHeader_._seq;
1919
- // Now shift data, starting at the last Block
1920
- // The total shift is for number of Blocks beyond the first
1921
- // times Block header size, since previous format only wrote
1922
- // the header in the first Block and had contiguous data,
1923
- // with only wrap from end to beginning of buffer possible.
1924
-
1925
- // First time through, this is bytes in last block. After,
1926
- // it will be block data size.
1927
- size_t dataBytes = blockHeader_._totalRemaining % getBlockDataSize();
1928
- while (current != first_)
1929
- {
1930
- size_t chunkBytesAvail = endOfData > location_
1931
- ? endOfData - location_
1932
- : endOfData - 2048;
1933
- if (chunkBytesAvail < dataBytes)
1934
- {
1935
- // Original was wrapped from end to start of buffer
1936
- // Need to copy what's left at start to end of Block,
1937
- // then start working from the end.
1938
- // This can ONLY occur during wrap because the first
1939
- // Block doesn't get moved in this loop.
1940
- pBuffer_->copyBytes(current->_offset
1941
- + getBlockSize()
1942
- - chunkBytesAvail,
1943
- getBlockSize(),
1944
- chunkBytesAvail);
1945
- chunkBytesAvail = dataBytes - chunkBytesAvail;
1946
- endOfData = pBuffer_->getSize() - chunkBytesAvail;
1947
- pBuffer_->copyBytes(current->_offset + getBlockHeaderSize(),
1948
- endOfData,
1949
- chunkBytesAvail);
1950
- }
1951
- else
1952
- {
1953
- endOfData -= dataBytes;
1954
- pBuffer_->copyBytes(current->_offset + getBlockHeaderSize(),
1955
- endOfData,
1956
- dataBytes);
1957
- }
1958
- // Set next in chain in block header
1959
- blockHeader_._nextInChain = (current->_nextInChain
1960
- ? current->_nextInChain->_offset
1961
- : (amps_uint64_t)0);
1962
- // Write the header for this block
1963
- pBuffer_->setPosition(current->_offset);
1964
- pBuffer_->putBytes((const char*)&blockHeader_, sizeof(BlockHeader));
1965
- current = blocksUsed.top();
1966
- blocksUsed.pop();
1967
- dataBytes = getBlockDataSize();
1968
- }
1969
- // Move bytes for chain header expansion from 32 bytes
1970
- pBuffer_->copyBytes(first_->_offset
1971
- + getBlockHeaderSize()
1972
- + getBlockChainHeaderSize(),
1973
- first_->_offset + getBlockHeaderSize() + 32,
1974
- getBlockDataSize() - getBlockChainHeaderSize());
1975
- // Set the CRC to indicate first block and set nextInChain
1976
- blockHeader_._crcVal = crcVal;
1977
- blockHeader_._nextInChain = first_->_nextInChain->_offset;
1978
- // Need to reset location to after OLD header:
1979
- // amps_uint32_t blocks, amps_uint32_t totalRemaining,
1980
- // amps_uint64_t seq, amps_uint64_t crc
1981
- pBuffer_->setPosition(location_ + (sizeof(amps_uint32_t) * 2)
1982
- + (sizeof(amps_uint64_t) * 2) );
1983
- // Read old chain header which uses same order, but not
1984
- // as many bytes (everything is 32bit):
1985
- // operation, commandIdLen, correlationIdLen,
1986
- // expirationLen, sowKeyLen, topicLen, flag, ackTypes
1987
- BlockChainHeader chainHeader;
1988
- pBuffer_->copyBytes((char*)&chainHeader,
1989
- sizeof(amps_uint32_t) * 8);
1990
- // Rewrite the header and chain header for first Block.
1991
- pBuffer_->setPosition(location_);
1992
- pBuffer_->putBytes((const char*)&blockHeader_, sizeof(BlockHeader));
1993
- pBuffer_->putBytes((const char*)&chainHeader, sizeof(BlockChainHeader));
1994
- }
1995
-
1996
- void chooseCRC(bool isFile)
1997
- {
1998
- if (!isFile)
1999
- {
2000
- _crc = noOpCRC;
2001
- return;
2002
- }
2003
-
2004
- #ifndef AMPS_SSE_42
2005
- _crc = AMPS::CRC<0>::crcNoSSE;
2006
- #else
2007
- if (AMPS::CRC<0>::isSSE42Enabled())
2008
- {
2009
- _crc = AMPS::CRC<0>::crc;
2010
- }
2011
- else
2012
- {
2013
- _crc = AMPS::CRC<0>::crcNoSSE;
2014
- }
2015
- #endif
2016
- }
2017
-
2018
- static amps_uint64_t noOpCRC(const char*, size_t, amps_uint64_t)
2019
- {
2020
- return 0;
2021
- }
2022
-
2023
- protected:
2024
- mutable BlockStore _blockStore;
2025
- private:
2026
- // Block used to hold metadata, currently:
2027
- // the last persisted
2028
- Block* _metadataBlock;
2029
- // Highest sequence that has been discarded
2030
- amps_uint64_t _maxDiscarded;
2031
- // Track the assigned sequence numbers
2032
- #if __cplusplus >= 201103L || _MSC_VER >= 1900
2033
- std::atomic<amps_uint64_t> _lastSequence;
2034
- #else
2035
- volatile amps_uint64_t _lastSequence;
2036
- #endif
2037
- // Track how many messages are stored
2038
- AMPS_ATOMIC_TYPE _stored;
2039
-
2040
- // Message used for doing replay
2041
- Message _message;
2042
-
2043
- typedef amps_uint64_t (*CRCFunction)(const char*, size_t, amps_uint64_t);
2044
-
2045
- // Function used to calculate the CRC if one is used
2046
- CRCFunction _crc;
2047
-
2048
- };
2049
-
2050
- }
2051
-
2052
- #endif
2053
-