amps-python-client 5.3.4.1__zip → 5.3.4.3__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 (918) hide show
  1. amps-python-client-5.3.4.3/LICENSE +168 -0
  2. amps-python-client-5.3.4.3/PKG-INFO +112 -0
  3. amps-python-client-5.3.4.3/docs/command-reference/doctrees/chapters/ack-messages.doctree +0 -0
  4. amps-python-client-5.3.4.3/docs/command-reference/doctrees/chapters/content-messages.doctree +0 -0
  5. amps-python-client-5.3.4.3/docs/command-reference/doctrees/chapters/intro.doctree +0 -0
  6. amps-python-client-5.3.4.3/docs/command-reference/doctrees/chapters/logon.doctree +0 -0
  7. amps-python-client-5.3.4.3/docs/command-reference/doctrees/chapters/protocol-reference.doctree +0 -0
  8. amps-python-client-5.3.4.3/docs/command-reference/doctrees/chapters/publishing.doctree +0 -0
  9. amps-python-client-5.3.4.3/docs/command-reference/doctrees/chapters/query-delimiters.doctree +0 -0
  10. amps-python-client-5.3.4.3/docs/command-reference/doctrees/chapters/query-subscribe.doctree +0 -0
  11. amps-python-client-5.3.4.3/docs/command-reference/doctrees/chapters/removing.doctree +0 -0
  12. amps-python-client-5.3.4.3/docs/command-reference/doctrees/chapters/utilities.doctree +0 -0
  13. amps-python-client-5.3.4.3/docs/command-reference/doctrees/environment.pickle +0 -0
  14. amps-python-client-5.3.4.3/docs/command-reference/doctrees/index.doctree +0 -0
  15. amps-python-client-5.3.4.3/docs/command-reference/html/.buildinfo +4 -0
  16. amps-python-client-5.3.4.3/docs/command-reference/html/_sources/chapters/ack-messages.rst.txt +8 -0
  17. amps-python-client-5.3.4.3/docs/command-reference/html/_sources/chapters/content-messages.rst.txt +8 -0
  18. amps-python-client-5.3.4.3/docs/command-reference/html/_sources/chapters/intro.rst.txt +8 -0
  19. amps-python-client-5.3.4.3/docs/command-reference/html/_sources/chapters/logon.rst.txt +8 -0
  20. amps-python-client-5.3.4.3/docs/command-reference/html/_sources/chapters/protocol-reference.rst.txt +8 -0
  21. amps-python-client-5.3.4.3/docs/command-reference/html/_sources/chapters/publishing.rst.txt +8 -0
  22. amps-python-client-5.3.4.3/docs/command-reference/html/_sources/chapters/query-delimiters.rst.txt +8 -0
  23. amps-python-client-5.3.4.3/docs/command-reference/html/_sources/chapters/query-subscribe.rst.txt +8 -0
  24. amps-python-client-5.3.4.3/docs/command-reference/html/_sources/chapters/removing.rst.txt +8 -0
  25. amps-python-client-5.3.4.3/docs/command-reference/html/_sources/chapters/utilities.rst.txt +8 -0
  26. amps-python-client-5.3.4.3/docs/command-reference/html/_sources/index.rst.txt +36 -0
  27. amps-python-client-5.3.4.3/docs/command-reference/html/_static/custom.css +161 -0
  28. amps-python-client-5.3.4.3/docs/command-reference/html/chapters/ack-messages.html +95 -0
  29. amps-python-client-5.3.4.3/docs/command-reference/html/chapters/content-messages.html +95 -0
  30. amps-python-client-5.3.4.3/docs/command-reference/html/chapters/intro.html +95 -0
  31. amps-python-client-5.3.4.3/docs/command-reference/html/chapters/logon.html +95 -0
  32. amps-python-client-5.3.4.3/docs/command-reference/html/chapters/protocol-reference.html +93 -0
  33. amps-python-client-5.3.4.3/docs/command-reference/html/chapters/publishing.html +95 -0
  34. amps-python-client-5.3.4.3/docs/command-reference/html/chapters/query-delimiters.html +95 -0
  35. amps-python-client-5.3.4.3/docs/command-reference/html/chapters/query-subscribe.html +95 -0
  36. amps-python-client-5.3.4.3/docs/command-reference/html/chapters/removing.html +95 -0
  37. amps-python-client-5.3.4.3/docs/command-reference/html/chapters/utilities.html +95 -0
  38. amps-python-client-5.3.4.3/docs/command-reference/html/genindex.html +97 -0
  39. amps-python-client-5.3.4.3/docs/command-reference/html/index.html +98 -0
  40. amps-python-client-5.3.4.3/docs/command-reference/html/objects.inv +6 -0
  41. amps-python-client-5.3.4.3/docs/command-reference/html/search.html +107 -0
  42. amps-python-client-5.3.4.3/docs/command-reference/html/searchindex.js +1 -0
  43. amps-python-client-5.3.4.3/docs/html/.buildinfo +4 -0
  44. amps-python-client-5.3.4.3/docs/html/code.html +6851 -0
  45. amps-python-client-5.3.4.3/docs/html/genindex.html +1363 -0
  46. amps-python-client-5.3.4.3/docs/html/index.html +131 -0
  47. amps-python-client-5.3.4.3/docs/html/objects.inv +0 -0
  48. amps-python-client-5.3.4.3/docs/html/py-modindex.html +111 -0
  49. amps-python-client-5.3.4.3/docs/html/search.html +107 -0
  50. amps-python-client-5.3.4.3/docs/html/searchindex.js +1 -0
  51. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/advanced-topics.doctree +0 -0
  52. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/cpp-compiler-list.doctree +0 -0
  53. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/cpp-feature-table.doctree +0 -0
  54. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/creating-commands.doctree +0 -0
  55. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/deltas.doctree +0 -0
  56. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/error-handling.doctree +0 -0
  57. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/exceptions.doctree +0 -0
  58. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/first-program.doctree +0 -0
  59. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/high-availability.doctree +0 -0
  60. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/installing.doctree +0 -0
  61. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/introduction.doctree +0 -0
  62. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/moving-from-python-lite.doctree +0 -0
  63. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/performance-tips.doctree +0 -0
  64. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/queues.doctree +0 -0
  65. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/sow.doctree +0 -0
  66. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/subscriptions.doctree +0 -0
  67. amps-python-client-5.3.4.3/docs/python/doctrees/chapters/utilities.doctree +0 -0
  68. amps-python-client-5.3.4.3/docs/python/doctrees/environment.pickle +0 -0
  69. amps-python-client-5.3.4.3/docs/python/doctrees/index.doctree +0 -0
  70. amps-python-client-5.3.4.3/docs/python/html/.buildinfo +4 -0
  71. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/advanced-topics.rst.txt +398 -0
  72. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/cpp-feature-table.rst.txt +26 -0
  73. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/creating-commands.rst.txt +159 -0
  74. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/deltas.rst.txt +79 -0
  75. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/error-handling.rst.txt +481 -0
  76. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/exceptions.rst.txt +123 -0
  77. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/first-program.rst.txt +168 -0
  78. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/high-availability.rst.txt +879 -0
  79. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/installing.rst.txt +184 -0
  80. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/introduction.rst.txt +50 -0
  81. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/moving-from-python-lite.rst.txt +32 -0
  82. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/performance-tips.rst.txt +432 -0
  83. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/queues.rst.txt +282 -0
  84. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/sow.rst.txt +294 -0
  85. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/subscriptions.rst.txt +374 -0
  86. amps-python-client-5.3.4.3/docs/python/html/_sources/chapters/utilities.rst.txt +214 -0
  87. amps-python-client-5.3.4.3/docs/python/html/_static/custom.css +161 -0
  88. amps-python-client-5.3.4.3/docs/python/html/chapters/advanced-topics.html +447 -0
  89. amps-python-client-5.3.4.3/docs/python/html/chapters/cpp-compiler-list.html +92 -0
  90. amps-python-client-5.3.4.3/docs/python/html/chapters/cpp-feature-table.html +156 -0
  91. amps-python-client-5.3.4.3/docs/python/html/chapters/creating-commands.html +2882 -0
  92. amps-python-client-5.3.4.3/docs/python/html/chapters/deltas.html +169 -0
  93. amps-python-client-5.3.4.3/docs/python/html/chapters/error-handling.html +745 -0
  94. amps-python-client-5.3.4.3/docs/python/html/chapters/exceptions.html +266 -0
  95. amps-python-client-5.3.4.3/docs/python/html/chapters/first-program.html +526 -0
  96. amps-python-client-5.3.4.3/docs/python/html/chapters/high-availability.html +1017 -0
  97. amps-python-client-5.3.4.3/docs/python/html/chapters/installing.html +264 -0
  98. amps-python-client-5.3.4.3/docs/python/html/chapters/introduction.html +245 -0
  99. amps-python-client-5.3.4.3/docs/python/html/chapters/moving-from-python-lite.html +118 -0
  100. amps-python-client-5.3.4.3/docs/python/html/chapters/performance-tips.html +499 -0
  101. amps-python-client-5.3.4.3/docs/python/html/chapters/queues.html +352 -0
  102. amps-python-client-5.3.4.3/docs/python/html/chapters/sow.html +383 -0
  103. amps-python-client-5.3.4.3/docs/python/html/chapters/subscriptions.html +535 -0
  104. amps-python-client-5.3.4.3/docs/python/html/chapters/utilities.html +302 -0
  105. amps-python-client-5.3.4.3/docs/python/html/genindex.html +351 -0
  106. amps-python-client-5.3.4.3/docs/python/html/index.html +382 -0
  107. amps-python-client-5.3.4.3/docs/python/html/objects.inv +0 -0
  108. amps-python-client-5.3.4.3/docs/python/html/search.html +107 -0
  109. amps-python-client-5.3.4.3/docs/python/html/searchindex.js +1 -0
  110. amps-python-client-5.3.4.3/docs/python-quickstart/doctrees/chapters/crankitup.doctree +0 -0
  111. amps-python-client-5.3.4.3/docs/python-quickstart/doctrees/chapters/equipment.doctree +0 -0
  112. amps-python-client-5.3.4.3/docs/python-quickstart/doctrees/environment.pickle +0 -0
  113. amps-python-client-5.3.4.3/docs/python-quickstart/doctrees/index.doctree +0 -0
  114. amps-python-client-5.3.4.3/docs/python-quickstart/html/.buildinfo +4 -0
  115. amps-python-client-5.3.4.3/docs/python-quickstart/html/_static/custom.css +161 -0
  116. amps-python-client-5.3.4.3/docs/python-quickstart/html/chapters/crankitup.html +271 -0
  117. amps-python-client-5.3.4.3/docs/python-quickstart/html/chapters/equipment.html +105 -0
  118. amps-python-client-5.3.4.3/docs/python-quickstart/html/genindex.html +97 -0
  119. amps-python-client-5.3.4.3/docs/python-quickstart/html/index.html +381 -0
  120. amps-python-client-5.3.4.3/docs/python-quickstart/html/objects.inv +0 -0
  121. amps-python-client-5.3.4.3/docs/python-quickstart/html/search.html +107 -0
  122. amps-python-client-5.3.4.3/docs/python-quickstart/html/searchindex.js +1 -0
  123. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/acks.doctree +0 -0
  124. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/actions.doctree +0 -0
  125. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/amps-statistics.doctree +0 -0
  126. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/amps_expressions.doctree +0 -0
  127. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/amps_functions.doctree +0 -0
  128. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/auxiliary_modules.doctree +0 -0
  129. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/config-file-shortcuts.doctree +0 -0
  130. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/conflated_topics.doctree +0 -0
  131. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/constructing-fields.doctree +0 -0
  132. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/daemon.doctree +0 -0
  133. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/delta.doctree +0 -0
  134. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/distribution.doctree +0 -0
  135. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/enrichment.doctree +0 -0
  136. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/events.doctree +0 -0
  137. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/file_format_versions.doctree +0 -0
  138. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/glossary.doctree +0 -0
  139. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/ha.doctree +0 -0
  140. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/installing_and_starting.doctree +0 -0
  141. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/intro.doctree +0 -0
  142. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/logging.doctree +0 -0
  143. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/messageTypes.doctree +0 -0
  144. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/monitoring.doctree +0 -0
  145. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/oof.doctree +0 -0
  146. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/operation.doctree +0 -0
  147. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/pub_sub.doctree +0 -0
  148. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/queues.doctree +0 -0
  149. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/replication.doctree +0 -0
  150. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/securing.doctree +0 -0
  151. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/sow.doctree +0 -0
  152. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/sow_queries.doctree +0 -0
  153. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/spark.doctree +0 -0
  154. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/transports.doctree +0 -0
  155. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/troubleshooting.doctree +0 -0
  156. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/txlog.doctree +0 -0
  157. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/usecases.doctree +0 -0
  158. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/utilities.doctree +0 -0
  159. amps-python-client-5.3.4.3/docs/user-guide/doctrees/chapters/views.doctree +0 -0
  160. amps-python-client-5.3.4.3/docs/user-guide/doctrees/environment.pickle +0 -0
  161. amps-python-client-5.3.4.3/docs/user-guide/doctrees/index.doctree +0 -0
  162. amps-python-client-5.3.4.3/docs/user-guide/html/.buildinfo +4 -0
  163. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/acks.rst.txt +8 -0
  164. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/actions.rst.txt +8 -0
  165. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/amps-statistics.rst.txt +8 -0
  166. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/amps_expressions.rst.txt +8 -0
  167. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/amps_functions.rst.txt +8 -0
  168. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/auxiliary_modules.rst.txt +8 -0
  169. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/config-file-shortcuts.rst.txt +8 -0
  170. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/conflated_topics.rst.txt +8 -0
  171. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/constructing-fields.rst.txt +8 -0
  172. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/daemon.rst.txt +8 -0
  173. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/delta.rst.txt +8 -0
  174. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/distribution.rst.txt +8 -0
  175. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/enrichment.rst.txt +8 -0
  176. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/events.rst.txt +8 -0
  177. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/file_format_versions.rst.txt +8 -0
  178. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/glossary.rst.txt +8 -0
  179. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/ha.rst.txt +8 -0
  180. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/installing_and_starting.rst.txt +8 -0
  181. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/intro.rst.txt +8 -0
  182. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/logging.rst.txt +8 -0
  183. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/messageTypes.rst.txt +8 -0
  184. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/monitoring.rst.txt +8 -0
  185. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/oof.rst.txt +8 -0
  186. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/operation.rst.txt +8 -0
  187. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/pub_sub.rst.txt +8 -0
  188. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/queues.rst.txt +8 -0
  189. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/replication.rst.txt +8 -0
  190. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/securing.rst.txt +8 -0
  191. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/sow.rst.txt +8 -0
  192. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/sow_queries.rst.txt +8 -0
  193. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/transports.rst.txt +8 -0
  194. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/troubleshooting.rst.txt +8 -0
  195. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/txlog.rst.txt +8 -0
  196. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/usecases.rst.txt +8 -0
  197. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/utilities.rst.txt +8 -0
  198. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/chapters/views.rst.txt +8 -0
  199. amps-python-client-5.3.4.3/docs/user-guide/html/_sources/index.rst.txt +62 -0
  200. amps-python-client-5.3.4.3/docs/user-guide/html/_static/custom.css +161 -0
  201. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/acks.html +94 -0
  202. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/actions.html +94 -0
  203. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/amps-statistics.html +94 -0
  204. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/amps_expressions.html +94 -0
  205. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/amps_functions.html +94 -0
  206. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/auxiliary_modules.html +94 -0
  207. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/config-file-shortcuts.html +94 -0
  208. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/conflated_topics.html +94 -0
  209. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/constructing-fields.html +94 -0
  210. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/daemon.html +94 -0
  211. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/delta.html +94 -0
  212. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/distribution.html +94 -0
  213. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/enrichment.html +94 -0
  214. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/events.html +94 -0
  215. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/file_format_versions.html +94 -0
  216. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/glossary.html +92 -0
  217. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/ha.html +94 -0
  218. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/installing_and_starting.html +94 -0
  219. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/intro.html +94 -0
  220. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/logging.html +94 -0
  221. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/messageTypes.html +94 -0
  222. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/monitoring.html +94 -0
  223. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/oof.html +94 -0
  224. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/operation.html +94 -0
  225. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/pub_sub.html +94 -0
  226. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/queues.html +94 -0
  227. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/replication.html +94 -0
  228. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/securing.html +94 -0
  229. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/sow.html +94 -0
  230. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/sow_queries.html +94 -0
  231. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/spark.html +819 -0
  232. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/transports.html +94 -0
  233. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/troubleshooting.html +94 -0
  234. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/txlog.html +94 -0
  235. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/usecases.html +94 -0
  236. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/utilities.html +94 -0
  237. amps-python-client-5.3.4.3/docs/user-guide/html/chapters/views.html +94 -0
  238. amps-python-client-5.3.4.3/docs/user-guide/html/genindex.html +133 -0
  239. amps-python-client-5.3.4.3/docs/user-guide/html/index.html +96 -0
  240. amps-python-client-5.3.4.3/docs/user-guide/html/objects.inv +0 -0
  241. amps-python-client-5.3.4.3/docs/user-guide/html/search.html +106 -0
  242. amps-python-client-5.3.4.3/docs/user-guide/html/searchindex.js +1 -0
  243. amps-python-client-5.3.4.3/include/ampspy_bookmarkstore.hpp +63 -0
  244. amps-python-client-5.3.4.3/include/ampspy_compat.h +63 -0
  245. amps-python-client-5.3.4.3/include/ampspy_defs.hpp +181 -0
  246. amps-python-client-5.3.4.3/include/ampspy_recoverypointadapter.hpp +52 -0
  247. amps-python-client-5.3.4.3/include/ampspy_shims.hpp +113 -0
  248. amps-python-client-5.3.4.3/include/ampspy_type_object.hpp +242 -0
  249. amps-python-client-5.3.4.3/include/ampspy_types.hpp +1139 -0
  250. amps-python-client-5.3.4.3/include/ampspyver.h +30 -0
  251. amps-python-client-5.3.4.3/index.html +66 -0
  252. amps-python-client-5.3.4.3/samples/AMPSConsolePublisher.py +59 -0
  253. amps-python-client-5.3.4.3/samples/AMPSConsoleSubscriber.py +63 -0
  254. amps-python-client-5.3.4.3/samples/AMPSFIXBuilderPublisher.py +71 -0
  255. amps-python-client-5.3.4.3/samples/AMPSFIXShredderSubscriber.py +69 -0
  256. amps-python-client-5.3.4.3/samples/AMPSNVFIXBuilderPublisher.py +71 -0
  257. amps-python-client-5.3.4.3/samples/AMPSNVFIXShredderSubscriber.py +67 -0
  258. amps-python-client-5.3.4.3/samples/AMPSPublishForReplay.py +81 -0
  259. amps-python-client-5.3.4.3/samples/AMPSQueueConsumer.py +69 -0
  260. amps-python-client-5.3.4.3/samples/AMPSQueuePublisher.py +59 -0
  261. amps-python-client-5.3.4.3/samples/AMPSSOWConsolePublisher.py +67 -0
  262. amps-python-client-5.3.4.3/samples/AMPSSOWConsoleSubscriber.py +77 -0
  263. amps-python-client-5.3.4.3/samples/AMPSSOWandSubscribeConsoleSubscriber.py +79 -0
  264. amps-python-client-5.3.4.3/samples/AMPSSOWandSubscribeWithOOF.py +108 -0
  265. amps-python-client-5.3.4.3/samples/AMPSSubscribeForReplay.py +128 -0
  266. amps-python-client-5.3.4.3/samples/AMPSUpdateForOOF.py +123 -0
  267. amps-python-client-5.3.4.3/samples/CompositeMessagePublisher.py +84 -0
  268. amps-python-client-5.3.4.3/samples/CompositeMessageSubscriber.py +87 -0
  269. amps-python-client-5.3.4.3/samples/RandomServerChooser.py +66 -0
  270. amps-python-client-5.3.4.3/samples/sample.xml +335 -0
  271. amps-python-client-5.3.4.3/setup.py +210 -0
  272. amps-python-client-5.3.4.3/setup_amps.py +94 -0
  273. amps-python-client-5.3.4.3/src/ampspy_shims.cpp +214 -0
  274. amps-python-client-5.3.4.3/src/ampspy_type_object.cpp +495 -0
  275. amps-python-client-5.3.4.3/src/authenticator.cpp +128 -0
  276. amps-python-client-5.3.4.3/src/bookmarkstore.cpp +246 -0
  277. amps-python-client-5.3.4.3/src/client.cpp +2648 -0
  278. amps-python-client-5.3.4.3/src/client_docs.h +1210 -0
  279. amps-python-client-5.3.4.3/src/cmessagehandler.cpp +161 -0
  280. amps-python-client-5.3.4.3/src/command.cpp +164 -0
  281. amps-python-client-5.3.4.3/src/command_docs.h +274 -0
  282. amps-python-client-5.3.4.3/src/compositemessagebuilder.cpp +113 -0
  283. amps-python-client-5.3.4.3/src/compositemessageparser.cpp +151 -0
  284. amps-python-client-5.3.4.3/src/conflatingrecoverypointadapter.cpp +197 -0
  285. amps-python-client-5.3.4.3/src/cpp/include/amps/BlockPublishStore.hpp +2050 -0
  286. amps-python-client-5.3.4.3/src/cpp/include/amps/BlockStore.hpp +674 -0
  287. amps-python-client-5.3.4.3/src/cpp/include/amps/BookmarkStore.hpp +542 -0
  288. amps-python-client-5.3.4.3/src/cpp/include/amps/Buffer.hpp +214 -0
  289. amps-python-client-5.3.4.3/src/cpp/include/amps/CompositeMessageBuilder.hpp +174 -0
  290. amps-python-client-5.3.4.3/src/cpp/include/amps/CompositeMessageParser.hpp +151 -0
  291. amps-python-client-5.3.4.3/src/cpp/include/amps/DefaultServerChooser.hpp +162 -0
  292. amps-python-client-5.3.4.3/src/cpp/include/amps/Field.hpp +723 -0
  293. amps-python-client-5.3.4.3/src/cpp/include/amps/HAClient.hpp +370 -0
  294. amps-python-client-5.3.4.3/src/cpp/include/amps/HAClientImpl.hpp +460 -0
  295. amps-python-client-5.3.4.3/src/cpp/include/amps/HybridPublishStore.hpp +481 -0
  296. amps-python-client-5.3.4.3/src/cpp/include/amps/LoggedBookmarkStore.hpp +1256 -0
  297. amps-python-client-5.3.4.3/src/cpp/include/amps/MMapBookmarkStore.hpp +1283 -0
  298. amps-python-client-5.3.4.3/src/cpp/include/amps/MMapStoreBuffer.hpp +297 -0
  299. amps-python-client-5.3.4.3/src/cpp/include/amps/MemoryBookmarkStore.hpp +1628 -0
  300. amps-python-client-5.3.4.3/src/cpp/include/amps/MemoryPublishStore.hpp +66 -0
  301. amps-python-client-5.3.4.3/src/cpp/include/amps/MemoryStoreBuffer.hpp +247 -0
  302. amps-python-client-5.3.4.3/src/cpp/include/amps/MemorySubscriptionManager.hpp +850 -0
  303. amps-python-client-5.3.4.3/src/cpp/include/amps/Message.hpp +1827 -0
  304. amps-python-client-5.3.4.3/src/cpp/include/amps/MessageRouter.hpp +647 -0
  305. amps-python-client-5.3.4.3/src/cpp/include/amps/PublishStore.hpp +158 -0
  306. amps-python-client-5.3.4.3/src/cpp/include/amps/ReconnectDelayStrategy.hpp +106 -0
  307. amps-python-client-5.3.4.3/src/cpp/include/amps/ReconnectDelayStrategyImpl.hpp +317 -0
  308. amps-python-client-5.3.4.3/src/cpp/include/amps/RecoveryPoint.hpp +323 -0
  309. amps-python-client-5.3.4.3/src/cpp/include/amps/RecoveryPointAdapter.hpp +501 -0
  310. amps-python-client-5.3.4.3/src/cpp/include/amps/RingBookmarkStore.hpp +669 -0
  311. amps-python-client-5.3.4.3/src/cpp/include/amps/SOWRecoveryPointAdapter.hpp +494 -0
  312. amps-python-client-5.3.4.3/src/cpp/include/amps/ServerChooser.hpp +156 -0
  313. amps-python-client-5.3.4.3/src/cpp/include/amps/ServerChooserImpl.hpp +95 -0
  314. amps-python-client-5.3.4.3/src/cpp/include/amps/amps.h +815 -0
  315. amps-python-client-5.3.4.3/src/cpp/include/amps/amps_impl.h +220 -0
  316. amps-python-client-5.3.4.3/src/cpp/include/amps/amps_ssl.h +78 -0
  317. amps-python-client-5.3.4.3/src/cpp/include/amps/ampscrc.hpp +208 -0
  318. amps-python-client-5.3.4.3/src/cpp/include/amps/ampsplusplus.hpp +8846 -0
  319. amps-python-client-5.3.4.3/src/cpp/include/amps/ampsuri.h +84 -0
  320. amps-python-client-5.3.4.3/src/cpp/include/amps/ampsver.h +41 -0
  321. amps-python-client-5.3.4.3/src/cpp/include/amps/ampsver.h.in +41 -0
  322. amps-python-client-5.3.4.3/src/cpp/include/amps/constants.hpp +194 -0
  323. amps-python-client-5.3.4.3/src/cpp/include/amps/util.hpp +1722 -0
  324. amps-python-client-5.3.4.3/src/cpp/src/amps_protocol.c +693 -0
  325. amps-python-client-5.3.4.3/src/cpp/src/amps_ssl.c +565 -0
  326. amps-python-client-5.3.4.3/src/cpp/src/atfork.c +484 -0
  327. amps-python-client-5.3.4.3/src/cpp/src/client.c +498 -0
  328. amps-python-client-5.3.4.3/src/cpp/src/message.c +837 -0
  329. amps-python-client-5.3.4.3/src/cpp/src/message_generated.h +611 -0
  330. amps-python-client-5.3.4.3/src/cpp/src/tcp.c +1683 -0
  331. amps-python-client-5.3.4.3/src/cpp/src/tcps.c +2005 -0
  332. amps-python-client-5.3.4.3/src/cpp/src/transports.c +129 -0
  333. amps-python-client-5.3.4.3/src/cpp/src/unix.c +1063 -0
  334. amps-python-client-5.3.4.3/src/cpp/src/uri.c +301 -0
  335. amps-python-client-5.3.4.3/src/exponentialdelaystrategy.cpp +131 -0
  336. amps-python-client-5.3.4.3/src/failedwritehandler.cpp +116 -0
  337. amps-python-client-5.3.4.3/src/fixbuilder.cpp +146 -0
  338. amps-python-client-5.3.4.3/src/fixeddelaystrategy.cpp +115 -0
  339. amps-python-client-5.3.4.3/src/fixshredder.cpp +105 -0
  340. amps-python-client-5.3.4.3/src/fixshredder_docs.h +38 -0
  341. amps-python-client-5.3.4.3/src/haclient.cpp +691 -0
  342. amps-python-client-5.3.4.3/src/haclient_docs.h +200 -0
  343. amps-python-client-5.3.4.3/src/hybridpublishstore.cpp +137 -0
  344. amps-python-client-5.3.4.3/src/hybridpublishstore_docs.h +31 -0
  345. amps-python-client-5.3.4.3/src/memorybookmarkstore.cpp +373 -0
  346. amps-python-client-5.3.4.3/src/memorybookmarkstore_docs.h +39 -0
  347. amps-python-client-5.3.4.3/src/memorypublishstore.cpp +160 -0
  348. amps-python-client-5.3.4.3/src/memorypublishstore_docs.h +32 -0
  349. amps-python-client-5.3.4.3/src/message.cpp +765 -0
  350. amps-python-client-5.3.4.3/src/message_docs.h +306 -0
  351. amps-python-client-5.3.4.3/src/messagestream.cpp +630 -0
  352. amps-python-client-5.3.4.3/src/messagestream_docs.h +45 -0
  353. amps-python-client-5.3.4.3/src/mmapbookmarkstore.cpp +422 -0
  354. amps-python-client-5.3.4.3/src/nvfixbuilder.cpp +160 -0
  355. amps-python-client-5.3.4.3/src/nvfixbuilder_docs.h +35 -0
  356. amps-python-client-5.3.4.3/src/nvfixshredder.cpp +99 -0
  357. amps-python-client-5.3.4.3/src/nvfixshredder_docs.h +43 -0
  358. amps-python-client-5.3.4.3/src/publishstore.cpp +183 -0
  359. amps-python-client-5.3.4.3/src/raw_wrapper.cpp +765 -0
  360. amps-python-client-5.3.4.3/src/reason.cpp +71 -0
  361. amps-python-client-5.3.4.3/src/recoverypoint.cpp +135 -0
  362. amps-python-client-5.3.4.3/src/recoverypointadapter.cpp +171 -0
  363. amps-python-client-5.3.4.3/src/ringbookmarkstore.cpp +360 -0
  364. amps-python-client-5.3.4.3/src/serverchooser.cpp +245 -0
  365. amps-python-client-5.3.4.3/src/serverchooser_docs.h +41 -0
  366. amps-python-client-5.3.4.3/src/sowrecoverypointadapter.cpp +248 -0
  367. amps-python-client-5.3.4.3/src/store.cpp +62 -0
  368. amps-python-client-5.3.4.3/src/versioninfo.cpp +175 -0
  369. amps-python-client-5.3.4.1/LICENSE +0 -157
  370. amps-python-client-5.3.4.1/PKG-INFO +0 -112
  371. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/ack-messages.doctree +0 -0
  372. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/content-messages.doctree +0 -0
  373. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/intro.doctree +0 -0
  374. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/logon.doctree +0 -0
  375. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/protocol-reference.doctree +0 -0
  376. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/publishing.doctree +0 -0
  377. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/query-delimiters.doctree +0 -0
  378. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/query-subscribe.doctree +0 -0
  379. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/removing.doctree +0 -0
  380. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/utilities.doctree +0 -0
  381. amps-python-client-5.3.4.1/docs/command-reference/doctrees/environment.pickle +0 -0
  382. amps-python-client-5.3.4.1/docs/command-reference/doctrees/index.doctree +0 -0
  383. amps-python-client-5.3.4.1/docs/command-reference/html/.buildinfo +0 -4
  384. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/ack-messages.rst.txt +0 -32
  385. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/content-messages.rst.txt +0 -27
  386. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/intro.rst.txt +0 -43
  387. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/logon.rst.txt +0 -231
  388. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/protocol-reference.rst.txt +0 -1474
  389. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/publishing.rst.txt +0 -25
  390. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/query-delimiters.rst.txt +0 -12
  391. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/query-subscribe.rst.txt +0 -23
  392. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/removing.rst.txt +0 -6
  393. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/utilities.rst.txt +0 -13
  394. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/index.rst.txt +0 -56
  395. amps-python-client-5.3.4.1/docs/command-reference/html/_static/custom.css +0 -192
  396. amps-python-client-5.3.4.1/docs/command-reference/html/_static/custom.css.backup +0 -161
  397. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/ack-messages.html +0 -417
  398. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/content-messages.html +0 -417
  399. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/intro.html +0 -126
  400. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/logon.html +0 -295
  401. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/protocol-reference.html +0 -1190
  402. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/publishing.html +0 -436
  403. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/query-delimiters.html +0 -173
  404. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/query-subscribe.html +0 -2123
  405. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/removing.html +0 -299
  406. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/utilities.html +0 -287
  407. amps-python-client-5.3.4.1/docs/command-reference/html/genindex.html +0 -97
  408. amps-python-client-5.3.4.1/docs/command-reference/html/index.html +0 -138
  409. amps-python-client-5.3.4.1/docs/command-reference/html/objects.inv +0 -0
  410. amps-python-client-5.3.4.1/docs/command-reference/html/search.html +0 -107
  411. amps-python-client-5.3.4.1/docs/command-reference/html/searchindex.js +0 -1
  412. amps-python-client-5.3.4.1/docs/html/.buildinfo +0 -4
  413. amps-python-client-5.3.4.1/docs/html/code.html +0 -6503
  414. amps-python-client-5.3.4.1/docs/html/genindex.html +0 -1361
  415. amps-python-client-5.3.4.1/docs/html/index.html +0 -131
  416. amps-python-client-5.3.4.1/docs/html/objects.inv +0 -0
  417. amps-python-client-5.3.4.1/docs/html/py-modindex.html +0 -111
  418. amps-python-client-5.3.4.1/docs/html/search.html +0 -107
  419. amps-python-client-5.3.4.1/docs/html/searchindex.js +0 -1
  420. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/advanced-topics.doctree +0 -0
  421. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/cpp-compiler-list.doctree +0 -0
  422. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/cpp-feature-table.doctree +0 -0
  423. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/creating-commands.doctree +0 -0
  424. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/deltas.doctree +0 -0
  425. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/error-handling.doctree +0 -0
  426. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/exceptions.doctree +0 -0
  427. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/first-program.doctree +0 -0
  428. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/high-availability.doctree +0 -0
  429. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/installing.doctree +0 -0
  430. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/introduction.doctree +0 -0
  431. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/moving-from-python-lite.doctree +0 -0
  432. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/performance-tips.doctree +0 -0
  433. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/queues.doctree +0 -0
  434. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/sow.doctree +0 -0
  435. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/subscriptions.doctree +0 -0
  436. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/utilities.doctree +0 -0
  437. amps-python-client-5.3.4.1/docs/python/doctrees/environment.pickle +0 -0
  438. amps-python-client-5.3.4.1/docs/python/doctrees/index.doctree +0 -0
  439. amps-python-client-5.3.4.1/docs/python/html/.buildinfo +0 -4
  440. amps-python-client-5.3.4.1/docs/python/html/_images/caution.svg +0 -25
  441. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/advanced-topics.rst.txt +0 -398
  442. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/cpp-feature-table.rst.txt +0 -26
  443. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/creating-commands.rst.txt +0 -159
  444. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/deltas.rst.txt +0 -79
  445. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/error-handling.rst.txt +0 -482
  446. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/exceptions.rst.txt +0 -128
  447. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/first-program.rst.txt +0 -142
  448. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/high-availability.rst.txt +0 -876
  449. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/installing.rst.txt +0 -184
  450. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/introduction.rst.txt +0 -50
  451. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/moving-from-python-lite.rst.txt +0 -32
  452. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/performance-tips.rst.txt +0 -434
  453. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/queues.rst.txt +0 -282
  454. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/sow.rst.txt +0 -292
  455. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/subscriptions.rst.txt +0 -374
  456. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/utilities.rst.txt +0 -214
  457. amps-python-client-5.3.4.1/docs/python/html/_static/custom.css +0 -192
  458. amps-python-client-5.3.4.1/docs/python/html/_static/custom.css.backup +0 -161
  459. amps-python-client-5.3.4.1/docs/python/html/chapters/advanced-topics.html +0 -447
  460. amps-python-client-5.3.4.1/docs/python/html/chapters/cpp-compiler-list.html +0 -92
  461. amps-python-client-5.3.4.1/docs/python/html/chapters/cpp-feature-table.html +0 -156
  462. amps-python-client-5.3.4.1/docs/python/html/chapters/creating-commands.html +0 -2837
  463. amps-python-client-5.3.4.1/docs/python/html/chapters/deltas.html +0 -169
  464. amps-python-client-5.3.4.1/docs/python/html/chapters/error-handling.html +0 -746
  465. amps-python-client-5.3.4.1/docs/python/html/chapters/exceptions.html +0 -272
  466. amps-python-client-5.3.4.1/docs/python/html/chapters/first-program.html +0 -499
  467. amps-python-client-5.3.4.1/docs/python/html/chapters/high-availability.html +0 -1014
  468. amps-python-client-5.3.4.1/docs/python/html/chapters/installing.html +0 -264
  469. amps-python-client-5.3.4.1/docs/python/html/chapters/introduction.html +0 -245
  470. amps-python-client-5.3.4.1/docs/python/html/chapters/moving-from-python-lite.html +0 -118
  471. amps-python-client-5.3.4.1/docs/python/html/chapters/performance-tips.html +0 -499
  472. amps-python-client-5.3.4.1/docs/python/html/chapters/queues.html +0 -352
  473. amps-python-client-5.3.4.1/docs/python/html/chapters/sow.html +0 -381
  474. amps-python-client-5.3.4.1/docs/python/html/chapters/subscriptions.html +0 -535
  475. amps-python-client-5.3.4.1/docs/python/html/chapters/utilities.html +0 -302
  476. amps-python-client-5.3.4.1/docs/python/html/genindex.html +0 -351
  477. amps-python-client-5.3.4.1/docs/python/html/index.html +0 -380
  478. amps-python-client-5.3.4.1/docs/python/html/objects.inv +0 -0
  479. amps-python-client-5.3.4.1/docs/python/html/search.html +0 -107
  480. amps-python-client-5.3.4.1/docs/python/html/searchindex.js +0 -1
  481. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/chapters/crankitup.doctree +0 -0
  482. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/chapters/equipment.doctree +0 -0
  483. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/environment.pickle +0 -0
  484. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/index.doctree +0 -0
  485. amps-python-client-5.3.4.1/docs/python-quickstart/html/.buildinfo +0 -4
  486. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/custom.css +0 -192
  487. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/custom.css.backup +0 -161
  488. amps-python-client-5.3.4.1/docs/python-quickstart/html/chapters/crankitup.html +0 -271
  489. amps-python-client-5.3.4.1/docs/python-quickstart/html/chapters/equipment.html +0 -105
  490. amps-python-client-5.3.4.1/docs/python-quickstart/html/genindex.html +0 -97
  491. amps-python-client-5.3.4.1/docs/python-quickstart/html/index.html +0 -382
  492. amps-python-client-5.3.4.1/docs/python-quickstart/html/objects.inv +0 -0
  493. amps-python-client-5.3.4.1/docs/python-quickstart/html/search.html +0 -107
  494. amps-python-client-5.3.4.1/docs/python-quickstart/html/searchindex.js +0 -1
  495. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/acks.doctree +0 -0
  496. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/actions.doctree +0 -0
  497. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps-statistics.doctree +0 -0
  498. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps_expressions.doctree +0 -0
  499. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps_functions.doctree +0 -0
  500. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/auxiliary_modules.doctree +0 -0
  501. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/config-file-shortcuts.doctree +0 -0
  502. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/conflated_topics.doctree +0 -0
  503. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/constructing-fields.doctree +0 -0
  504. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/daemon.doctree +0 -0
  505. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/delta.doctree +0 -0
  506. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/distribution.doctree +0 -0
  507. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/enrichment.doctree +0 -0
  508. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/events.doctree +0 -0
  509. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/file_format_versions.doctree +0 -0
  510. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/glossary.doctree +0 -0
  511. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/ha.doctree +0 -0
  512. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/installing_and_starting.doctree +0 -0
  513. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/intro.doctree +0 -0
  514. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/logging.doctree +0 -0
  515. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/messageTypes.doctree +0 -0
  516. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/monitoring.doctree +0 -0
  517. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/oof.doctree +0 -0
  518. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/operation.doctree +0 -0
  519. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/pub_sub.doctree +0 -0
  520. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/queues.doctree +0 -0
  521. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/replication.doctree +0 -0
  522. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/securing.doctree +0 -0
  523. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/sow.doctree +0 -0
  524. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/sow_queries.doctree +0 -0
  525. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/spark.doctree +0 -0
  526. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/transports.doctree +0 -0
  527. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/troubleshooting.doctree +0 -0
  528. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/txlog.doctree +0 -0
  529. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/usecases.doctree +0 -0
  530. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/utilities.doctree +0 -0
  531. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/views.doctree +0 -0
  532. amps-python-client-5.3.4.1/docs/user-guide/doctrees/environment.pickle +0 -0
  533. amps-python-client-5.3.4.1/docs/user-guide/doctrees/index.doctree +0 -0
  534. amps-python-client-5.3.4.1/docs/user-guide/html/.buildinfo +0 -4
  535. amps-python-client-5.3.4.1/docs/user-guide/html/_images/AMPS-Queues-Intro.svg +0 -1330
  536. amps-python-client-5.3.4.1/docs/user-guide/html/_images/GeoRepl.png +0 -0
  537. amps-python-client-5.3.4.1/docs/user-guide/html/_images/HA_async_ack.png +0 -0
  538. amps-python-client-5.3.4.1/docs/user-guide/html/_images/HA_sync_ack.png +0 -0
  539. amps-python-client-5.3.4.1/docs/user-guide/html/_images/Hot-Hot-Replication.png +0 -0
  540. amps-python-client-5.3.4.1/docs/user-guide/html/_images/MessageOrdering.svg +0 -235
  541. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF5.png +0 -0
  542. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF6.png +0 -0
  543. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF7.png +0 -0
  544. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF8.png +0 -0
  545. amps-python-client-5.3.4.1/docs/user-guide/html/_images/PubSub1.svg +0 -1
  546. amps-python-client-5.3.4.1/docs/user-guide/html/_images/PubSub2.svg +0 -1
  547. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWAndSubscribeAndReplace.svg +0 -684
  548. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWQuery1.svg +0 -402
  549. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWQuery2.svg +0 -505
  550. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig1.svg +0 -1
  551. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig2.svg +0 -1
  552. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig3.svg +0 -1
  553. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig4.svg +0 -1
  554. amps-python-client-5.3.4.1/docs/user-guide/html/_images/caution.png +0 -0
  555. amps-python-client-5.3.4.1/docs/user-guide/html/_images/caution.svg +0 -25
  556. amps-python-client-5.3.4.1/docs/user-guide/html/_images/chicago_group.png +0 -0
  557. amps-python-client-5.3.4.1/docs/user-guide/html/_images/delta_original_messages.png +0 -0
  558. amps-python-client-5.3.4.1/docs/user-guide/html/_images/delta_update_message.png +0 -0
  559. amps-python-client-5.3.4.1/docs/user-guide/html/_images/important.png +0 -0
  560. amps-python-client-5.3.4.1/docs/user-guide/html/_images/important.svg +0 -25
  561. amps-python-client-5.3.4.1/docs/user-guide/html/_images/inline_view_conflation.svg +0 -1
  562. amps-python-client-5.3.4.1/docs/user-guide/html/_images/paginated_subs_pub.png +0 -0
  563. amps-python-client-5.3.4.1/docs/user-guide/html/_images/paginated_subs_sub.png +0 -0
  564. amps-python-client-5.3.4.1/docs/user-guide/html/_images/queue_usage_overview.svg +0 -627
  565. amps-python-client-5.3.4.1/docs/user-guide/html/_images/replication_hub.png +0 -0
  566. amps-python-client-5.3.4.1/docs/user-guide/html/_images/replication_scenario_with_ha.png +0 -0
  567. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_overview_1.svg +0 -248
  568. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_overview_2.svg +0 -183
  569. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_update_sequence.svg +0 -1
  570. amps-python-client-5.3.4.1/docs/user-guide/html/_images/tip.png +0 -0
  571. amps-python-client-5.3.4.1/docs/user-guide/html/_images/tip.svg +0 -31
  572. amps-python-client-5.3.4.1/docs/user-guide/html/_images/warning.png +0 -0
  573. amps-python-client-5.3.4.1/docs/user-guide/html/_images/warning.svg +0 -23
  574. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/acks.rst.txt +0 -232
  575. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/actions.rst.txt +0 -111
  576. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps-statistics.rst.txt +0 -358
  577. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps_expressions.rst.txt +0 -83
  578. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps_functions.rst.txt +0 -11
  579. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/auxiliary_modules.rst.txt +0 -86
  580. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/config-file-shortcuts.rst.txt +0 -9
  581. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/conflated_topics.rst.txt +0 -111
  582. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/constructing-fields.rst.txt +0 -269
  583. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/daemon.rst.txt +0 -232
  584. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/delta.rst.txt +0 -556
  585. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/distribution.rst.txt +0 -186
  586. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/enrichment.rst.txt +0 -191
  587. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/events.rst.txt +0 -39
  588. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/file_format_versions.rst.txt +0 -203
  589. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/glossary.rst.txt +0 -101
  590. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/ha.rst.txt +0 -465
  591. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/installing_and_starting.rst.txt +0 -23
  592. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/intro.rst.txt +0 -116
  593. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/logging.rst.txt +0 -34
  594. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/messageTypes.rst.txt +0 -1398
  595. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/monitoring.rst.txt +0 -326
  596. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/oof.rst.txt +0 -312
  597. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/operation.rst.txt +0 -27
  598. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/pub_sub.rst.txt +0 -49
  599. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/queues.rst.txt +0 -1351
  600. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/replication.rst.txt +0 -1228
  601. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/securing.rst.txt +0 -657
  602. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/sow.rst.txt +0 -57
  603. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/sow_queries.rst.txt +0 -25
  604. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/transports.rst.txt +0 -291
  605. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/troubleshooting.rst.txt +0 -517
  606. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/txlog.rst.txt +0 -62
  607. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/usecases.rst.txt +0 -21
  608. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/utilities.rst.txt +0 -62
  609. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/views.rst.txt +0 -175
  610. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/index.rst.txt +0 -110
  611. amps-python-client-5.3.4.1/docs/user-guide/html/_static/custom.css +0 -192
  612. amps-python-client-5.3.4.1/docs/user-guide/html/_static/custom.css.backup +0 -161
  613. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/acks.html +0 -289
  614. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/actions.html +0 -3782
  615. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps-statistics.html +0 -439
  616. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps_expressions.html +0 -1552
  617. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps_functions.html +0 -1626
  618. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/auxiliary_modules.html +0 -2548
  619. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/config-file-shortcuts.html +0 -508
  620. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/conflated_topics.html +0 -328
  621. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/constructing-fields.html +0 -447
  622. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/daemon.html +0 -295
  623. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/delta.html +0 -609
  624. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/distribution.html +0 -246
  625. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/enrichment.html +0 -264
  626. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/events.html +0 -449
  627. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/file_format_versions.html +0 -229
  628. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/glossary.html +0 -215
  629. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/ha.html +0 -978
  630. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/installing_and_starting.html +0 -357
  631. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/intro.html +0 -572
  632. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/logging.html +0 -972
  633. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/messageTypes.html +0 -1280
  634. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/monitoring.html +0 -718
  635. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/oof.html +0 -341
  636. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/operation.html +0 -1515
  637. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/pub_sub.html +0 -934
  638. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/queues.html +0 -1767
  639. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/replication.html +0 -1777
  640. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/securing.html +0 -697
  641. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/sow.html +0 -1038
  642. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/sow_queries.html +0 -621
  643. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/spark.html +0 -819
  644. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/transports.html +0 -352
  645. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/troubleshooting.html +0 -530
  646. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/txlog.html +0 -1013
  647. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/usecases.html +0 -288
  648. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/utilities.html +0 -133
  649. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/views.html +0 -1120
  650. amps-python-client-5.3.4.1/docs/user-guide/html/genindex.html +0 -1261
  651. amps-python-client-5.3.4.1/docs/user-guide/html/index.html +0 -163
  652. amps-python-client-5.3.4.1/docs/user-guide/html/objects.inv +0 -0
  653. amps-python-client-5.3.4.1/docs/user-guide/html/search.html +0 -106
  654. amps-python-client-5.3.4.1/docs/user-guide/html/searchindex.js +0 -1
  655. amps-python-client-5.3.4.1/include/ampspy_bookmarkstore.hpp +0 -63
  656. amps-python-client-5.3.4.1/include/ampspy_compat.h +0 -63
  657. amps-python-client-5.3.4.1/include/ampspy_defs.hpp +0 -181
  658. amps-python-client-5.3.4.1/include/ampspy_recoverypointadapter.hpp +0 -52
  659. amps-python-client-5.3.4.1/include/ampspy_shims.hpp +0 -113
  660. amps-python-client-5.3.4.1/include/ampspy_type_object.hpp +0 -242
  661. amps-python-client-5.3.4.1/include/ampspy_types.hpp +0 -1139
  662. amps-python-client-5.3.4.1/include/ampspyver.h +0 -30
  663. amps-python-client-5.3.4.1/index.html +0 -66
  664. amps-python-client-5.3.4.1/samples/AMPSConsolePublisher.py +0 -59
  665. amps-python-client-5.3.4.1/samples/AMPSConsoleSubscriber.py +0 -63
  666. amps-python-client-5.3.4.1/samples/AMPSFIXBuilderPublisher.py +0 -71
  667. amps-python-client-5.3.4.1/samples/AMPSFIXShredderSubscriber.py +0 -69
  668. amps-python-client-5.3.4.1/samples/AMPSNVFIXBuilderPublisher.py +0 -71
  669. amps-python-client-5.3.4.1/samples/AMPSNVFIXShredderSubscriber.py +0 -67
  670. amps-python-client-5.3.4.1/samples/AMPSPublishForReplay.py +0 -81
  671. amps-python-client-5.3.4.1/samples/AMPSQueueConsumer.py +0 -69
  672. amps-python-client-5.3.4.1/samples/AMPSQueuePublisher.py +0 -59
  673. amps-python-client-5.3.4.1/samples/AMPSSOWConsolePublisher.py +0 -67
  674. amps-python-client-5.3.4.1/samples/AMPSSOWConsoleSubscriber.py +0 -77
  675. amps-python-client-5.3.4.1/samples/AMPSSOWandSubscribeConsoleSubscriber.py +0 -79
  676. amps-python-client-5.3.4.1/samples/AMPSSOWandSubscribeWithOOF.py +0 -108
  677. amps-python-client-5.3.4.1/samples/AMPSSubscribeForReplay.py +0 -128
  678. amps-python-client-5.3.4.1/samples/AMPSUpdateForOOF.py +0 -123
  679. amps-python-client-5.3.4.1/samples/CompositeMessagePublisher.py +0 -84
  680. amps-python-client-5.3.4.1/samples/CompositeMessageSubscriber.py +0 -87
  681. amps-python-client-5.3.4.1/samples/RandomServerChooser.py +0 -41
  682. amps-python-client-5.3.4.1/samples/sample.xml +0 -335
  683. amps-python-client-5.3.4.1/setup.py +0 -209
  684. amps-python-client-5.3.4.1/setup_amps.py +0 -94
  685. amps-python-client-5.3.4.1/src/ampspy_shims.cpp +0 -203
  686. amps-python-client-5.3.4.1/src/ampspy_type_object.cpp +0 -484
  687. amps-python-client-5.3.4.1/src/authenticator.cpp +0 -128
  688. amps-python-client-5.3.4.1/src/bookmarkstore.cpp +0 -238
  689. amps-python-client-5.3.4.1/src/client.cpp +0 -2430
  690. amps-python-client-5.3.4.1/src/client_docs.h +0 -956
  691. amps-python-client-5.3.4.1/src/cmessagehandler.cpp +0 -151
  692. amps-python-client-5.3.4.1/src/command.cpp +0 -164
  693. amps-python-client-5.3.4.1/src/command_docs.h +0 -194
  694. amps-python-client-5.3.4.1/src/compositemessagebuilder.cpp +0 -111
  695. amps-python-client-5.3.4.1/src/compositemessageparser.cpp +0 -146
  696. amps-python-client-5.3.4.1/src/conflatingrecoverypointadapter.cpp +0 -194
  697. amps-python-client-5.3.4.1/src/cpp/include/amps/BlockPublishStore.hpp +0 -2053
  698. amps-python-client-5.3.4.1/src/cpp/include/amps/BlockStore.hpp +0 -677
  699. amps-python-client-5.3.4.1/src/cpp/include/amps/BookmarkStore.hpp +0 -542
  700. amps-python-client-5.3.4.1/src/cpp/include/amps/Buffer.hpp +0 -214
  701. amps-python-client-5.3.4.1/src/cpp/include/amps/CompositeMessageBuilder.hpp +0 -174
  702. amps-python-client-5.3.4.1/src/cpp/include/amps/CompositeMessageParser.hpp +0 -151
  703. amps-python-client-5.3.4.1/src/cpp/include/amps/DefaultServerChooser.hpp +0 -162
  704. amps-python-client-5.3.4.1/src/cpp/include/amps/Field.hpp +0 -719
  705. amps-python-client-5.3.4.1/src/cpp/include/amps/HAClient.hpp +0 -370
  706. amps-python-client-5.3.4.1/src/cpp/include/amps/HAClientImpl.hpp +0 -460
  707. amps-python-client-5.3.4.1/src/cpp/include/amps/HybridPublishStore.hpp +0 -481
  708. amps-python-client-5.3.4.1/src/cpp/include/amps/LoggedBookmarkStore.hpp +0 -1255
  709. amps-python-client-5.3.4.1/src/cpp/include/amps/MMapBookmarkStore.hpp +0 -1283
  710. amps-python-client-5.3.4.1/src/cpp/include/amps/MMapStoreBuffer.hpp +0 -290
  711. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryBookmarkStore.hpp +0 -1622
  712. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryPublishStore.hpp +0 -66
  713. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryStoreBuffer.hpp +0 -244
  714. amps-python-client-5.3.4.1/src/cpp/include/amps/MemorySubscriptionManager.hpp +0 -850
  715. amps-python-client-5.3.4.1/src/cpp/include/amps/Message.hpp +0 -1819
  716. amps-python-client-5.3.4.1/src/cpp/include/amps/MessageRouter.hpp +0 -618
  717. amps-python-client-5.3.4.1/src/cpp/include/amps/PublishStore.hpp +0 -158
  718. amps-python-client-5.3.4.1/src/cpp/include/amps/ReconnectDelayStrategy.hpp +0 -106
  719. amps-python-client-5.3.4.1/src/cpp/include/amps/ReconnectDelayStrategyImpl.hpp +0 -317
  720. amps-python-client-5.3.4.1/src/cpp/include/amps/RecoveryPoint.hpp +0 -323
  721. amps-python-client-5.3.4.1/src/cpp/include/amps/RecoveryPointAdapter.hpp +0 -501
  722. amps-python-client-5.3.4.1/src/cpp/include/amps/RingBookmarkStore.hpp +0 -669
  723. amps-python-client-5.3.4.1/src/cpp/include/amps/SOWRecoveryPointAdapter.hpp +0 -490
  724. amps-python-client-5.3.4.1/src/cpp/include/amps/ServerChooser.hpp +0 -145
  725. amps-python-client-5.3.4.1/src/cpp/include/amps/ServerChooserImpl.hpp +0 -95
  726. amps-python-client-5.3.4.1/src/cpp/include/amps/amps.h +0 -775
  727. amps-python-client-5.3.4.1/src/cpp/include/amps/amps_impl.h +0 -204
  728. amps-python-client-5.3.4.1/src/cpp/include/amps/amps_ssl.h +0 -78
  729. amps-python-client-5.3.4.1/src/cpp/include/amps/ampscrc.hpp +0 -210
  730. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsplusplus.hpp +0 -8817
  731. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsuri.h +0 -84
  732. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsver.h +0 -41
  733. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsver.h.in +0 -41
  734. amps-python-client-5.3.4.1/src/cpp/include/amps/constants.hpp +0 -194
  735. amps-python-client-5.3.4.1/src/cpp/include/amps/util.hpp +0 -1692
  736. amps-python-client-5.3.4.1/src/cpp/src/amps_protocol.c +0 -688
  737. amps-python-client-5.3.4.1/src/cpp/src/amps_ssl.c +0 -489
  738. amps-python-client-5.3.4.1/src/cpp/src/atfork.c +0 -446
  739. amps-python-client-5.3.4.1/src/cpp/src/client.c +0 -483
  740. amps-python-client-5.3.4.1/src/cpp/src/message.c +0 -837
  741. amps-python-client-5.3.4.1/src/cpp/src/message_generated.h +0 -611
  742. amps-python-client-5.3.4.1/src/cpp/src/tcp.c +0 -1489
  743. amps-python-client-5.3.4.1/src/cpp/src/tcps.c +0 -1894
  744. amps-python-client-5.3.4.1/src/cpp/src/transports.c +0 -123
  745. amps-python-client-5.3.4.1/src/cpp/src/unix.c +0 -984
  746. amps-python-client-5.3.4.1/src/cpp/src/uri.c +0 -301
  747. amps-python-client-5.3.4.1/src/exponentialdelaystrategy.cpp +0 -137
  748. amps-python-client-5.3.4.1/src/failedwritehandler.cpp +0 -116
  749. amps-python-client-5.3.4.1/src/fixbuilder.cpp +0 -146
  750. amps-python-client-5.3.4.1/src/fixeddelaystrategy.cpp +0 -114
  751. amps-python-client-5.3.4.1/src/fixshredder.cpp +0 -105
  752. amps-python-client-5.3.4.1/src/fixshredder_docs.h +0 -38
  753. amps-python-client-5.3.4.1/src/haclient.cpp +0 -691
  754. amps-python-client-5.3.4.1/src/haclient_docs.h +0 -132
  755. amps-python-client-5.3.4.1/src/hybridpublishstore.cpp +0 -137
  756. amps-python-client-5.3.4.1/src/hybridpublishstore_docs.h +0 -31
  757. amps-python-client-5.3.4.1/src/memorybookmarkstore.cpp +0 -373
  758. amps-python-client-5.3.4.1/src/memorybookmarkstore_docs.h +0 -39
  759. amps-python-client-5.3.4.1/src/memorypublishstore.cpp +0 -160
  760. amps-python-client-5.3.4.1/src/memorypublishstore_docs.h +0 -32
  761. amps-python-client-5.3.4.1/src/message.cpp +0 -765
  762. amps-python-client-5.3.4.1/src/message_docs.h +0 -306
  763. amps-python-client-5.3.4.1/src/messagestream.cpp +0 -623
  764. amps-python-client-5.3.4.1/src/messagestream_docs.h +0 -45
  765. amps-python-client-5.3.4.1/src/mmapbookmarkstore.cpp +0 -422
  766. amps-python-client-5.3.4.1/src/nvfixbuilder.cpp +0 -160
  767. amps-python-client-5.3.4.1/src/nvfixbuilder_docs.h +0 -33
  768. amps-python-client-5.3.4.1/src/nvfixshredder.cpp +0 -99
  769. amps-python-client-5.3.4.1/src/nvfixshredder_docs.h +0 -39
  770. amps-python-client-5.3.4.1/src/publishstore.cpp +0 -183
  771. amps-python-client-5.3.4.1/src/raw_wrapper.cpp +0 -756
  772. amps-python-client-5.3.4.1/src/reason.cpp +0 -71
  773. amps-python-client-5.3.4.1/src/recoverypoint.cpp +0 -135
  774. amps-python-client-5.3.4.1/src/recoverypointadapter.cpp +0 -171
  775. amps-python-client-5.3.4.1/src/ringbookmarkstore.cpp +0 -360
  776. amps-python-client-5.3.4.1/src/serverchooser.cpp +0 -245
  777. amps-python-client-5.3.4.1/src/serverchooser_docs.h +0 -39
  778. amps-python-client-5.3.4.1/src/sowrecoverypointadapter.cpp +0 -248
  779. amps-python-client-5.3.4.1/src/store.cpp +0 -62
  780. amps-python-client-5.3.4.1/src/versioninfo.cpp +0 -175
  781. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/HISTORY +0 -0
  782. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/README.md +0 -0
  783. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/ajax-loader.gif +0 -0
  784. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/alabaster.css +0 -0
  785. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/basic.css +0 -0
  786. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/comment-bright.png +0 -0
  787. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/comment-close.png +0 -0
  788. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/comment.png +0 -0
  789. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/doctools.js +0 -0
  790. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/down-pressed.png +0 -0
  791. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/down.png +0 -0
  792. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/file.png +0 -0
  793. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/flag_logo.png +0 -0
  794. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/flag_logo.svg +0 -0
  795. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/jquery-3.1.0.js +0 -0
  796. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/jquery.js +0 -0
  797. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/minus.png +0 -0
  798. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/plus.png +0 -0
  799. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/pygments.css +0 -0
  800. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/searchtools.js +0 -0
  801. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/underscore-1.3.1.js +0 -0
  802. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/underscore.js +0 -0
  803. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/up-pressed.png +0 -0
  804. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/up.png +0 -0
  805. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/command-reference/html/_static/websupport.js +0 -0
  806. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_sources/code.rst.txt +0 -0
  807. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_sources/index.rst.txt +0 -0
  808. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/ajax-loader.gif +0 -0
  809. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/basic.css +0 -0
  810. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/classic.css +0 -0
  811. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/comment-bright.png +0 -0
  812. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/comment-close.png +0 -0
  813. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/comment.png +0 -0
  814. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/default.css +0 -0
  815. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/doctools.js +0 -0
  816. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/down-pressed.png +0 -0
  817. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/down.png +0 -0
  818. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/file.png +0 -0
  819. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/jquery-3.1.0.js +0 -0
  820. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/jquery.js +0 -0
  821. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/minus.png +0 -0
  822. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/plus.png +0 -0
  823. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/pygments.css +0 -0
  824. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/searchtools.js +0 -0
  825. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/sidebar.js +0 -0
  826. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/underscore-1.3.1.js +0 -0
  827. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/underscore.js +0 -0
  828. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/up-pressed.png +0 -0
  829. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/up.png +0 -0
  830. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/html/_static/websupport.js +0 -0
  831. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_images/caution.png +0 -0
  832. {amps-python-client-5.3.4.1/docs/command-reference → amps-python-client-5.3.4.3/docs/python}/html/_images/caution.svg +0 -0
  833. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_images/connection_string.svg +0 -0
  834. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_images/important.png +0 -0
  835. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_images/important.svg +0 -0
  836. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_images/tip.png +0 -0
  837. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_images/tip.svg +0 -0
  838. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_images/warning.png +0 -0
  839. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_sources/chapters/cpp-compiler-list.rst.txt +0 -0
  840. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_sources/index.rst.txt +0 -0
  841. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/ajax-loader.gif +0 -0
  842. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/alabaster.css +0 -0
  843. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/basic.css +0 -0
  844. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/comment-bright.png +0 -0
  845. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/comment-close.png +0 -0
  846. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/comment.png +0 -0
  847. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/doctools.js +0 -0
  848. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/down-pressed.png +0 -0
  849. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/down.png +0 -0
  850. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/file.png +0 -0
  851. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/flag_logo.png +0 -0
  852. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/flag_logo.svg +0 -0
  853. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/jquery-3.1.0.js +0 -0
  854. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/jquery.js +0 -0
  855. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/minus.png +0 -0
  856. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/plus.png +0 -0
  857. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/pygments.css +0 -0
  858. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/searchtools.js +0 -0
  859. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/underscore-1.3.1.js +0 -0
  860. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/underscore.js +0 -0
  861. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/up-pressed.png +0 -0
  862. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/up.png +0 -0
  863. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python/html/_static/websupport.js +0 -0
  864. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_sources/chapters/crankitup.rst.txt +0 -0
  865. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_sources/chapters/equipment.rst.txt +0 -0
  866. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_sources/index.rst.txt +0 -0
  867. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/ajax-loader.gif +0 -0
  868. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/alabaster.css +0 -0
  869. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/basic.css +0 -0
  870. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/comment-bright.png +0 -0
  871. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/comment-close.png +0 -0
  872. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/comment.png +0 -0
  873. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/doctools.js +0 -0
  874. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/down-pressed.png +0 -0
  875. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/down.png +0 -0
  876. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/file.png +0 -0
  877. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/flag_logo.png +0 -0
  878. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/flag_logo.svg +0 -0
  879. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/jquery-3.1.0.js +0 -0
  880. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/jquery.js +0 -0
  881. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/minus.png +0 -0
  882. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/plus.png +0 -0
  883. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/pygments.css +0 -0
  884. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/searchtools.js +0 -0
  885. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/underscore-1.3.1.js +0 -0
  886. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/underscore.js +0 -0
  887. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/up-pressed.png +0 -0
  888. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/up.png +0 -0
  889. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/python-quickstart/html/_static/websupport.js +0 -0
  890. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/resources/custom.css +0 -0
  891. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/resources/flag_logo.svg +0 -0
  892. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_sources/chapters/spark.rst.txt +0 -0
  893. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/ajax-loader.gif +0 -0
  894. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/alabaster.css +0 -0
  895. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/basic.css +0 -0
  896. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/comment-bright.png +0 -0
  897. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/comment-close.png +0 -0
  898. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/comment.png +0 -0
  899. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/doctools.js +0 -0
  900. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/down-pressed.png +0 -0
  901. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/down.png +0 -0
  902. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/file.png +0 -0
  903. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/flag_logo.png +0 -0
  904. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/flag_logo.svg +0 -0
  905. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/jquery-3.1.0.js +0 -0
  906. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/jquery.js +0 -0
  907. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/minus.png +0 -0
  908. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/plus.png +0 -0
  909. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/pygments.css +0 -0
  910. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/searchtools.js +0 -0
  911. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/underscore-1.3.1.js +0 -0
  912. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/underscore.js +0 -0
  913. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/up-pressed.png +0 -0
  914. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/up.png +0 -0
  915. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/docs/user-guide/html/_static/websupport.js +0 -0
  916. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/src/cpp/include/amps/amps_generated.h +0 -0
  917. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/src/cpp/src/amps_protocol_generated.h +0 -0
  918. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.3}/src/cpp/src/makefile +0 -0
@@ -0,0 +1,2648 @@
1
+ ///////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // Copyright (c) 2010-2024 60East Technologies Inc., All Rights Reserved.
4
+ //
5
+ // This computer software is owned by 60East Technologies Inc. and is
6
+ // protected by U.S. copyright laws and other laws and by international
7
+ // treaties. This computer software is furnished by 60East Technologies
8
+ // Inc. pursuant to a written license agreement and may be used, copied,
9
+ // transmitted, and stored only in accordance with the terms of such
10
+ // license agreement and with the inclusion of the above copyright notice.
11
+ // This computer software or any other copies thereof may not be provided
12
+ // or otherwise made available to any other person.
13
+ //
14
+ // U.S. Government Restricted Rights. This computer software: (a) was
15
+ // developed at private expense and is in all respects the proprietary
16
+ // information of 60East Technologies Inc.; (b) was not developed with
17
+ // government funds; (c) is a trade secret of 60East Technologies Inc.
18
+ // for all purposes of the Freedom of Information Act; and (d) is a
19
+ // commercial item and thus, pursuant to Section 12.212 of the Federal
20
+ // Acquisition Regulations (FAR) and DFAR Supplement Section 227.7202,
21
+ // Government's use, duplication or disclosure of the computer software
22
+ // is subject to the restrictions set forth by 60East Technologies Inc..
23
+ //
24
+ ////////////////////////////////////////////////////////////////////////////
25
+
26
+ #define PY_SSIZE_T_CLEAN 1
27
+ #include <Python.h>
28
+ #include <amps/ampsplusplus.hpp>
29
+ #include <amps/util.hpp>
30
+ #include <ampspy_types.hpp>
31
+ #include <ampspy_defs.hpp>
32
+ #include <algorithm>
33
+ #include <set>
34
+ #include <sstream>
35
+ #include "client_docs.h"
36
+ #include <stddef.h>
37
+ #include <ampspy_bookmarkstore.hpp>
38
+ #include <ampspy_type_object.hpp>
39
+
40
+ using namespace AMPS;
41
+ namespace ampspy
42
+ {
43
+
44
+ namespace client
45
+ {
46
+
47
+ AMPSDLL ampspy::ampspy_type_object client_type;
48
+
49
+ namespace connection_state_listener
50
+ {
51
+ const long ORIGINAL_VERSION = 5020100;
52
+ const long VERSION_522 = 5020200;
53
+ const long EXTENDED_STATES = 5020200;
54
+
55
+ ampspy::ampspy_type_object connection_state_listener_type;
56
+
57
+ void add_types(void)
58
+ {
59
+ connection_state_listener_type.setName("AMPS.ConnectionStateListener")
60
+ .setDoc("\nAMPS ConnectionStateListener type used to determine the new connection state.\n")
61
+ .createType()
62
+ .addStatic("STATE_DISCONNECTED",
63
+ PyInt_FromLong((long)AMPS::ConnectionStateListener::Disconnected))
64
+ .addStatic("STATE_SHUTDOWN",
65
+ PyInt_FromLong((long)AMPS::ConnectionStateListener::Shutdown))
66
+ .addStatic("STATE_CONNECTED",
67
+ PyInt_FromLong((long)AMPS::ConnectionStateListener::Connected))
68
+ .addStatic("STATE_LOGGED_ON",
69
+ PyInt_FromLong((long)AMPS::ConnectionStateListener::LoggedOn))
70
+ .addStatic("STATE_PUBLISH_REPLAYED",
71
+ PyInt_FromLong((long)AMPS::ConnectionStateListener::PublishReplayed))
72
+ .addStatic("STATE_HEARTBEAT_INITIATED",
73
+ PyInt_FromLong((long)AMPS::ConnectionStateListener::HeartbeatInitiated))
74
+ .addStatic("STATE_RESUBSCRIBED",
75
+ PyInt_FromLong((long)AMPS::ConnectionStateListener::Resubscribed))
76
+ .addStatic("STATE_UNKNOWN",
77
+ PyInt_FromLong((long)AMPS::ConnectionStateListener::UNKNOWN))
78
+ .addStatic("ORIGINAL_VERSION", PyInt_FromLong(ORIGINAL_VERSION))
79
+ .addStatic("VERSION_522", PyInt_FromLong(VERSION_522))
80
+ .addStatic("EXTENDED_STATES", PyInt_FromLong(EXTENDED_STATES));
81
+ }
82
+
83
+ } //namespace connection_state_listener
84
+
85
+ class SimpleMutex
86
+ {
87
+ // Not implemented.
88
+ SimpleMutex& operator=(const SimpleMutex& rhs);
89
+ SimpleMutex(const SimpleMutex& rhs);
90
+ #ifdef _WIN32
91
+ CRITICAL_SECTION _lock;
92
+ public:
93
+ SimpleMutex()
94
+ {
95
+ InitializeCriticalSection(&_lock);
96
+ }
97
+ ~SimpleMutex()
98
+ {
99
+ DeleteCriticalSection(&_lock);
100
+ }
101
+ void acquireRead()
102
+ {
103
+ EnterCriticalSection(&_lock);
104
+ }
105
+ void releaseRead()
106
+ {
107
+ LeaveCriticalSection(&_lock);
108
+ }
109
+ #else
110
+ pthread_mutex_t _lock;
111
+ pthread_cond_t _condition;
112
+ public:
113
+ SimpleMutex()
114
+ {
115
+ pthread_mutexattr_t attr;
116
+ pthread_mutexattr_init(&attr);
117
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
118
+ pthread_mutex_init(&_lock, &attr);
119
+ pthread_mutexattr_destroy(&attr);
120
+ }
121
+ ~SimpleMutex()
122
+ {
123
+ pthread_mutex_destroy(&_lock);
124
+ }
125
+ void acquireRead()
126
+ {
127
+ pthread_mutex_lock(&_lock);
128
+ }
129
+ void releaseRead()
130
+ {
131
+ pthread_mutex_unlock(&_lock);
132
+ }
133
+ #endif
134
+ };
135
+ static SimpleMutex _createdHandlersLock;
136
+ static std::set<void*> _createdHandlers;
137
+
138
+ AMPSDLL void amps_python_client_atfork_prepare(void)
139
+ {
140
+ _createdHandlersLock.acquireRead();
141
+ }
142
+ AMPSDLL void amps_python_client_atfork_parent(void)
143
+ {
144
+ _createdHandlersLock.releaseRead();
145
+ }
146
+ AMPSDLL void amps_python_client_atfork_child(void)
147
+ {
148
+ // Memset the old and reinitialize a new one on top of it.
149
+ // It is not safe to release the child lock here; you'll likely get EPERM.
150
+ _createdHandlersLock.~SimpleMutex();
151
+ new (&_createdHandlersLock) SimpleMutex();
152
+ }
153
+
154
+ class TransportFilter : public AMPS::ConnectionStateListener
155
+ {
156
+ public:
157
+ TransportFilter(PyObject* handler_)
158
+ : _handler(handler_),
159
+ _remain(0)
160
+ {
161
+ Py_INCREF(_handler);
162
+ }
163
+ ~TransportFilter()
164
+ {
165
+ Py_XDECREF(_handler);
166
+ _handler = NULL;
167
+ }
168
+
169
+ PyObject* getHandler(void) const
170
+ {
171
+ return _handler;
172
+ }
173
+
174
+ void connectionStateChanged(AMPS::ConnectionStateListener::State newState_);
175
+ static void filter(const unsigned char* data_, size_t len_, short direction_,
176
+ void* vpThis_);
177
+ #if PY_MAJOR_VERSION >= 3 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 7)
178
+ // This will use a MemoryView instead of a string so the bytes can be modified
179
+ static void filterModifiable(const unsigned char* data_, size_t len_,
180
+ short direction_, void* vpThis_);
181
+ #endif
182
+
183
+ private:
184
+ PyObject* _handler;
185
+ size_t _remain;
186
+ };
187
+
188
+ struct AMPSDLL callback_info
189
+ {
190
+ callback_info(obj* client_, PyObject* handler_)
191
+ : _client(client_),
192
+ _handler(handler_)
193
+ {
194
+ assert(client_->pClient);
195
+ Py_INCREF(_handler);
196
+ }
197
+ ~callback_info()
198
+ {
199
+ Py_CLEAR(_handler);
200
+ }
201
+
202
+ void release(void)
203
+ {
204
+ _client = NULL;
205
+ Py_CLEAR(_handler);
206
+ _handler = NULL;
207
+ }
208
+
209
+ PyObject* getHandler(void) const
210
+ {
211
+ return _handler;
212
+ }
213
+
214
+ obj* getClient(void) const
215
+ {
216
+ return _client;
217
+ }
218
+
219
+ static void add(void* vpInfo_);
220
+ static void destroy(void* vpInfo_);
221
+
222
+ private:
223
+ obj* _client;
224
+ PyObject* _handler;
225
+ callback_info(const callback_info&);
226
+ void operator=(const callback_info&);
227
+ };
228
+
229
+ void callback_info::destroy(void* vpInfo_)
230
+ {
231
+ callback_info* pInfo = (callback_info*)vpInfo_;
232
+ if (!pInfo->getClient())
233
+ {
234
+ LOCKGIL;
235
+ delete pInfo;
236
+ return;
237
+ }
238
+ callback_infos* pInfos = pInfo->getClient()->callbackInfos;
239
+ // If pInfos is null, this will be deleted in the client destroy function.
240
+ if (pInfos && pInfo->getHandler())
241
+ {
242
+ callback_infos::iterator i = std::find(pInfos->begin(), pInfos->end(),
243
+ pInfo);
244
+ if (i != pInfos->end())
245
+ {
246
+ pInfos->erase(i);
247
+ }
248
+ LOCKGIL;
249
+ delete pInfo;
250
+ }
251
+ }
252
+
253
+ void callback_info::add(void* vpInfo_)
254
+ {
255
+ callback_info* pInfo = (callback_info*)vpInfo_;
256
+ // If Client is null we're done
257
+ if (pInfo->getClient())
258
+ {
259
+ callback_infos* pInfos = pInfo->getClient()->callbackInfos; // -V826
260
+ // If pInfos is not null, add it
261
+ if (pInfos)
262
+ {
263
+ pInfos->push_back(pInfo);
264
+ }
265
+ }
266
+ }
267
+
268
+ void _initializeInternals(obj* self)
269
+ {
270
+ self->disconnectHandler = NULL;
271
+ self->callbackInfos = new callback_infos();
272
+ self->weakreflist = NULL;
273
+ self->connectionStateListeners = new connection_state_listeners();
274
+
275
+ self->message = (ampspy::message::obj*)_PyObject_New(
276
+ ampspy::message::message_type);
277
+ self->message->isOwned = false;
278
+ assert(self->message);
279
+ self->message_args = Py_BuildValue("(O)", self->message);
280
+ assert(self->message_args);
281
+
282
+ self->transportFilter = NULL;
283
+ self->threadCreatedCallback = NULL;
284
+ }
285
+
286
+ // def __init__(self, name):
287
+ int _ctor(obj* self, PyObject* args, PyObject* kwds)
288
+ {
289
+ const char* clientName;
290
+ if (!PyArg_ParseTuple(args, "s", &clientName))
291
+ {
292
+ return -1; // must have a client name
293
+ }
294
+ self->pClient = new Client(clientName);
295
+ _initializeInternals(self);
296
+ return 0;
297
+ }
298
+
299
+ static std::shared_ptr<AMPS::ExceptionListener> g_UnsetExceptionListener =
300
+ std::make_shared<AMPS::ExceptionListener>();
301
+
302
+ static void _clear(obj* self)
303
+ {
304
+ // IMPORTANT
305
+ // We aren't supplying our own tp_alloc or tp_free, so Python is already
306
+ // calling PyObject_GC_Track and PyObject_GC_UnTrack for us. However,
307
+ // it is very important to untrack ourselves before we unlock the GIL
308
+ // below. If we unlock the GIL prior to untracking, it results in self --
309
+ // with zero references -- being potentially processed by python gc,
310
+ // resulting in a double delete and memory corruption inside the gc.
311
+ // By removing it here, we assure GC that we don't need it to track
312
+ // us any more. See the big comment in python's Modules/gcmodule.c:
313
+ // update_refs() for more information.
314
+ PyObject_GC_UnTrack(self);
315
+
316
+ AMPS::Client* pClient = (AMPS::Client*)AMPSPY_IEX_GET(&self->pClient,
317
+ (AMPS::Client*)0);
318
+ callback_infos* pCallbackInfos = (callback_infos*)AMPSPY_IEX_GET(
319
+ &self->callbackInfos, (callback_infos*)0); // -V826
320
+ connection_state_listeners* listeners = (connection_state_listeners*)
321
+ AMPSPY_IEX_GET(&self->connectionStateListeners, (connection_state_listeners*)0);
322
+ // We don't want to invoke the exception handler again, but we can't reset
323
+ // in case the receive thread is already in its exceptionThrown method. The
324
+ // GIL isn't locked until inside the PyExceptionListener.
325
+ if (self->exceptionHandler)
326
+ {
327
+ ((PyExceptionListener*)(self->exceptionHandler.get()))->set(NULL);
328
+ }
329
+ // Unset any Python objects listening for client events, then delete the
330
+ // client. The Python objects should all still exist at this point in case
331
+ // the reader thread was already at the point of invoking one.
332
+ if (pClient)
333
+ {
334
+ UnlockGIL __unlock__;
335
+ ((AMPS::Client*)pClient)->setExceptionListener(g_UnsetExceptionListener);
336
+ ((AMPS::Client*)pClient)->setTransportFilterFunction(NULL, 0);
337
+ ((AMPS::Client*)pClient)->clearConnectionStateListeners();
338
+ delete pClient;
339
+ }
340
+ // Clear Python connection state listeners
341
+ if (listeners)
342
+ {
343
+ for (connection_state_listeners::iterator i = listeners->begin();
344
+ i != listeners->end(); ++i)
345
+ {
346
+ delete i->second;
347
+ i->second = 0;
348
+ }
349
+ delete listeners;
350
+ }
351
+ // Clear Python message callbacks from created wrappers
352
+ if (pCallbackInfos)
353
+ {
354
+ AMPS::Lock<SimpleMutex> l(_createdHandlersLock);
355
+ for (callback_infos::iterator i = pCallbackInfos->begin();
356
+ i != pCallbackInfos->end(); ++i)
357
+ {
358
+ _createdHandlers.erase(*i);
359
+ }
360
+ }
361
+ // Release Python transport filter
362
+ delete self->transportFilter;
363
+ // Release Python exception handler
364
+ if (self->exceptionHandler)
365
+ {
366
+ self->exceptionHandler.reset();
367
+ }
368
+ // Release Python disconnect handler
369
+ Py_CLEAR(self->disconnectHandler);
370
+ // Release Python message callbacks
371
+ if (pCallbackInfos)
372
+ {
373
+ for (callback_infos::iterator i = pCallbackInfos->begin();
374
+ i != pCallbackInfos->end(); ++i)
375
+ {
376
+ callback_info* pCallbackInfo = *i;
377
+ delete pCallbackInfo;
378
+ }
379
+ delete pCallbackInfos;
380
+ }
381
+ }
382
+
383
+ AMPSDLL void destructor(PyObject* self_)
384
+ {
385
+ obj* self = (obj*)self_;
386
+ if (self->weakreflist)
387
+ {
388
+ PyObject_ClearWeakRefs((PyObject*) self);
389
+ }
390
+ _clear(self);
391
+ shims::free(self_);
392
+ }
393
+
394
+ static bool messageHandlerSupplied(PyObject* args, PyObject* kwargs)
395
+ {
396
+ return (kwargs != NULL && PyDict_GetItemString(kwargs, "on_message") != NULL)
397
+ || (PyTuple_Size(args) > 0 &&
398
+ ( PyCallable_Check(PyTuple_GET_ITEM(args, 0))
399
+ || cmessagehandler::isCHandler(PyTuple_GET_ITEM(args, 0))));
400
+ }
401
+
402
+ static ampspy::messagestream::obj* createMessageStream(obj* pythonClient_,
403
+ AMPS::Client* pClient_,
404
+ bool isSow_,
405
+ bool isStats_,
406
+ bool sendCompleted_ = true)
407
+ {
408
+ ampspy::messagestream::obj* messagestream = (ampspy::messagestream::obj*)
409
+ PyObject_CallObject(ampspy::messagestream::messagestream_type, NULL);
410
+ messagestream->internalInit((PyObject*)pythonClient_, pClient_, isSow_,
411
+ isStats_, sendCompleted_);
412
+ return messagestream;
413
+ }
414
+ static ampspy::messagestream::obj* createNoopMessageStream(void)
415
+ {
416
+ ampspy::messagestream::obj* messagestream = (ampspy::messagestream::obj*)
417
+ PyObject_CallObject(ampspy::messagestream::messagestream_type, NULL);
418
+ return messagestream;
419
+ }
420
+
421
+ class ConnectionStateListenerWrapperV521 : public AMPS::ConnectionStateListener
422
+ {
423
+ PyObject* _listener;
424
+ public:
425
+ ConnectionStateListenerWrapperV521(PyObject* listener_)
426
+ : _listener(listener_)
427
+ {
428
+ Py_INCREF(listener_);
429
+ }
430
+ ~ConnectionStateListenerWrapperV521()
431
+ {
432
+ try
433
+ {
434
+ LOCKGIL;
435
+ Py_CLEAR(_listener);
436
+ }
437
+ catch (...) { }
438
+ }
439
+ void connectionStateChanged(State newState_)
440
+ {
441
+ LOCKGIL;
442
+ PyObject_CallObject(_listener, Py_BuildValue("(O)",
443
+ (newState_ == AMPS::ConnectionStateListener::Disconnected ||
444
+ newState_ == AMPS::ConnectionStateListener::Shutdown) ? Py_False : Py_True));
445
+ }
446
+ };
447
+
448
+ class ConnectionStateListenerWrapper : public AMPS::ConnectionStateListener
449
+ {
450
+ PyObject* _listener;
451
+ public:
452
+ ConnectionStateListenerWrapper(PyObject* listener_)
453
+ : _listener(listener_)
454
+ {
455
+ Py_INCREF(listener_);
456
+ }
457
+ ~ConnectionStateListenerWrapper()
458
+ {
459
+ LOCKGIL;
460
+ Py_CLEAR(_listener);
461
+ }
462
+ void connectionStateChanged(State newState_)
463
+ {
464
+ LOCKGIL;
465
+ PyObject_CallObject(_listener, Py_BuildValue("(O)",
466
+ PyInt_FromLong((long)newState_)));
467
+ }
468
+ };
469
+
470
+
471
+ static PyObject* add_connection_state_listener(obj* self, PyObject* args)
472
+ {
473
+ PyObject* callable;
474
+ int version = connection_state_listener::ORIGINAL_VERSION;
475
+ if (!PyArg_ParseTuple(args, "O|I", &callable, &version))
476
+ {
477
+ return NULL;
478
+ }
479
+ if (!PyCallable_Check(callable))
480
+ {
481
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a callable");
482
+ return NULL;
483
+ }
484
+ ConnectionStateListener* wrap = NULL;
485
+ if (version >= connection_state_listener::VERSION_522)
486
+ {
487
+ wrap = new ConnectionStateListenerWrapper(callable);
488
+ }
489
+ else
490
+ {
491
+ wrap = new ConnectionStateListenerWrapperV521(callable);
492
+ }
493
+ (*((connection_state_listeners*)self->connectionStateListeners))[callable] =
494
+ wrap;
495
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->addConnectionStateListener(
496
+ wrap));
497
+ }
498
+
499
+ static PyObject* remove_connection_state_listener(obj* self, PyObject* args)
500
+ {
501
+ PyObject* callable;
502
+ if (!PyArg_ParseTuple(args, "O", &callable))
503
+ {
504
+ return NULL;
505
+ }
506
+ if (!PyCallable_Check(callable))
507
+ {
508
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a callable");
509
+ return NULL;
510
+ }
511
+ connection_state_listeners::iterator it = ((connection_state_listeners*)
512
+ self->connectionStateListeners)->find(callable);
513
+ if (it != ((connection_state_listeners*)self->connectionStateListeners)->end())
514
+ {
515
+ {
516
+ UnlockGIL __unlock__;
517
+ ((AMPS::Client*)(self->pClient))->removeConnectionStateListener(
518
+ it->second); // so the client doesn't call it again
519
+ }
520
+ delete it->second; // will remove the reference to the underlying python object.
521
+ ((connection_state_listeners*)self->connectionStateListeners)->erase(it);
522
+ }
523
+ NONE;
524
+ }
525
+
526
+
527
+ // def connect(self, uri):
528
+ static PyObject* connect(obj* self, PyObject* args)
529
+ {
530
+ const char* uri;
531
+ if (!PyArg_ParseTuple(args, "s", &uri))
532
+ {
533
+ return NULL;
534
+ }
535
+ if (strlen(uri) > 3 && uri[0] == 't' && uri[1] == 'c' && uri[2] == 'p'
536
+ && uri[3] == 's')
537
+ {
538
+ PyObject* initResult = ssl_init_internal(NULL);
539
+ if (initResult == NULL)
540
+ {
541
+ return NULL;
542
+ }
543
+ else
544
+ {
545
+ Py_DECREF(initResult);
546
+ }
547
+ }
548
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->connect(uri));
549
+ }
550
+
551
+ // def logon(self, timeout=0, authenticator=DefaultAuthenticator(), options=""):
552
+ static PyObject* logon(obj* self, PyObject* args, PyObject* kw)
553
+ {
554
+ static const char* kwargs[] = { "timeout", "authenticator", "options", NULL };
555
+ int timeout = 0;
556
+ PyObject* auth = NULL;
557
+ const char* options = NULL;
558
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "|IOs", (char**)kwargs, &timeout,
559
+ &auth, &options))
560
+ {
561
+ return NULL;
562
+ }
563
+ PyAuthenticator bridge(auth);
564
+ if (auth)
565
+ {
566
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->logon(timeout,
567
+ bridge,
568
+ options));
569
+ }
570
+ else
571
+ {
572
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->logon(options,
573
+ timeout));
574
+ }
575
+
576
+ }
577
+
578
+ static PyObject* setName(obj* self, PyObject* args)
579
+ {
580
+ const char* name;
581
+ if (!PyArg_ParseTuple(args, "s", &name))
582
+ {
583
+ return NULL;
584
+ }
585
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setName(name));
586
+ }
587
+
588
+ // def name(self):
589
+ // def get_name(self):
590
+ // def getName(self):
591
+ static PyObject* getName(obj* self, PyObject* args)
592
+ {
593
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->getName());
594
+ }
595
+
596
+ // def get_name_hash(self):
597
+ static PyObject* get_name_hash(obj* self, PyObject* args)
598
+ {
599
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->getNameHash());
600
+ }
601
+
602
+ // def get_name_hash_value(self):
603
+ static PyObject* get_name_hash_value(obj* self, PyObject* args)
604
+ {
605
+ CALL_RETURN_UINT64_T(((AMPS::Client*)(self->pClient))->getNameHashValue());
606
+ }
607
+
608
+ // def get_logon_correlation_data(self):
609
+ static PyObject* get_logon_correlation_data(obj* self, PyObject* args)
610
+ {
611
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->getLogonCorrelationData());
612
+ }
613
+
614
+ // def set_logon_correlation_data(self, data):
615
+ static PyObject* set_logon_correlation_data(obj* self, PyObject* args)
616
+ {
617
+ const char* logonData;
618
+ if (!PyArg_ParseTuple(args, "s", &logonData))
619
+ {
620
+ return NULL;
621
+ }
622
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setLogonCorrelationData(
623
+ logonData));
624
+ }
625
+
626
+ // def uri(self):
627
+ // def get_uri(self):
628
+ // def getUri(self):
629
+ static PyObject* getURI(obj* self, PyObject* args)
630
+ {
631
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->getURI());
632
+ }
633
+
634
+ // def get_server_version(self):
635
+ static PyObject* get_server_version(obj* self, PyObject* args)
636
+ {
637
+ CALL_RETURN_SIZE_T(((AMPS::Client*)(self->pClient))->getServerVersion());
638
+ }
639
+
640
+ // def get_server_version_info(self):
641
+ static PyObject* get_server_version_info(obj* self, PyObject* args)
642
+ {
643
+ PyObject* returnVal = NULL;
644
+ versioninfo::obj* versionInfo = (versioninfo::obj*)PyObject_New(
645
+ versioninfo::obj,
646
+ versioninfo::versioninfo_type);
647
+ versionInfo->pVersionInfo = new VersionInfo(((AMPS::Client*)(
648
+ self->pClient))->getServerVersionInfo());
649
+ returnVal = (PyObject*)versionInfo;
650
+ return returnVal;
651
+ }
652
+
653
+ // def convert_version_to_number(self, version_string)
654
+ static PyObject* convert_version_to_number(obj* self, PyObject* args)
655
+ {
656
+ char* versionStr;
657
+ if (!PyArg_ParseTuple(args, "s", &versionStr))
658
+ {
659
+ return NULL;
660
+ }
661
+ CALL_RETURN_SIZE_T(((AMPS::Client*)(self->pClient))->convertVersionToNumber(
662
+ versionStr));
663
+ }
664
+
665
+ // def disconnect(self):
666
+ // def close(self):
667
+ static PyObject* disconnect(obj* self, PyObject* args)
668
+ {
669
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->disconnect());
670
+ }
671
+
672
+ // def publish(self, topic, data, expiration=None):
673
+ static PyObject* publish(obj* self, PyObject* args, PyObject* kw)
674
+ {
675
+ static const char* kwlist[] = { "topic", "data", "expiration", NULL };
676
+ const char* topic, *data;
677
+ Py_ssize_t topicLength, dataLength;
678
+ unsigned long expiration = 0;
679
+ PyObject* expire = NULL;
680
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#s#|O", (char**)kwlist,
681
+ &topic, &topicLength, &data, &dataLength, &expire))
682
+ {
683
+ return NULL;
684
+ }
685
+ #if PY_MAJOR_VERSION >= 3
686
+ if (!expire || !PyLong_Check(expire) ||
687
+ (expiration = PyLong_AsUnsignedLong(expire)) == (unsigned long) - 1)
688
+ #else
689
+ if (!expire || !PyInt_Check(expire) ||
690
+ (expiration = PyInt_AsUnsignedLongMask(expire)) == (unsigned long) - 1)
691
+ #endif
692
+ {
693
+ CALL_RETURN_UINT64_T(((AMPS::Client*)(self->pClient))->publish(topic,
694
+ topicLength,
695
+ data,
696
+ dataLength));
697
+ }
698
+ else
699
+ {
700
+ CALL_RETURN_UINT64_T(((AMPS::Client*)(self->pClient))->publish(topic,
701
+ topicLength, data, dataLength, expiration));
702
+ }
703
+ }
704
+
705
+ // def delta_publish(self, topic, data, expiration=None):
706
+ // def deltaPublish(self, topic, data, expiration=None):
707
+ static PyObject* delta_publish(obj* self, PyObject* args, PyObject* kw)
708
+ {
709
+ static const char* kwlist[] = { "topic", "data", "expiration", NULL };
710
+ const char* topic, *data;
711
+ Py_ssize_t topicLength, dataLength;
712
+ unsigned long expiration = 0;
713
+ PyObject* expire = NULL;
714
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#s#|O", (char**)kwlist,
715
+ &topic, &topicLength, &data, &dataLength, &expire))
716
+ {
717
+ return NULL;
718
+ }
719
+ #if PY_MAJOR_VERSION >= 3
720
+ if (!expire || !PyLong_Check(expire) ||
721
+ (expiration = PyLong_AsUnsignedLong(expire)) == (unsigned long) - 1)
722
+ #else
723
+ if (!expire || !PyInt_Check(expire) ||
724
+ (expiration = PyInt_AsUnsignedLongMask(expire)) == (unsigned long) - 1)
725
+ #endif
726
+ {
727
+ CALL_RETURN_UINT64_T(((AMPS::Client*)(self->pClient))->deltaPublish(topic,
728
+ topicLength,
729
+ data,
730
+ dataLength));
731
+ }
732
+ else
733
+ {
734
+ CALL_RETURN_UINT64_T(((AMPS::Client*)(self->pClient))->deltaPublish(topic,
735
+ topicLength,
736
+ data,
737
+ dataLength,
738
+ expiration));
739
+ }
740
+ }
741
+
742
+ // def unsubscribe(self, sub_id=None):
743
+ static PyObject* unsubscribe(obj* self, PyObject* args)
744
+ {
745
+ const char* subid = NULL;
746
+ if (!PyArg_ParseTuple(args, "|s", &subid))
747
+ {
748
+ return NULL;
749
+ }
750
+ if (subid)
751
+ {
752
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->unsubscribe(subid));
753
+ }
754
+ else
755
+ {
756
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->unsubscribe());
757
+ }
758
+ }
759
+ // def allocate_message(self):
760
+ // def allocateMessage(self):
761
+ static PyObject* allocate_message(obj* self, PyObject* args)
762
+ {
763
+ PyObject* o = PyObject_CallObject(ampspy::message::message_type, NULL);
764
+
765
+ return o;
766
+ }
767
+
768
+ // callback function for AMPS messages
769
+ //
770
+ // Each client has a single Message object we use for reading and
771
+ // callbacks, so we don't need to initialize a new python object
772
+ // each time. The void pointer points to a callback_info structure
773
+ // that contains a pointer to the client, and a pointer to the
774
+ // python callable we should call.
775
+ //
776
+ // In this function, we just make sure the python Message object
777
+ // points to the AMPS::Message that was passed in, and then
778
+ // we invoke the user callback with the pre-built tuple argument.
779
+ void callback_message(const Message& message, void* vp)
780
+ {
781
+ // most likely messageObject already points to &message based on the way
782
+ // the C++ client works, but we do make a new one on reconnect.
783
+ callback_info* ci = (callback_info*)vp;
784
+ assert(ci);
785
+ LOCKGIL;
786
+ obj* pClient = ci->getClient();
787
+ if (!pClient || !(ci->getHandler()) || !(pClient->message) ||
788
+ !(pClient->message_args))
789
+ {
790
+ return;
791
+ }
792
+ // message_args is a tuple object around message.
793
+ // see the line that looks like this:
794
+ // self->message_args = Py_BuildValue("(O)", self->message);
795
+ // above.
796
+ pClient->message->pMessage = (Message*)&message;
797
+ PyObject* result = PyObject_Call(ci->getHandler(), pClient->message_args,
798
+ (PyObject*)NULL);
799
+ if (result == NULL)
800
+ {
801
+ if (PyErr_ExceptionMatches(PyExc_SystemExit))
802
+ {
803
+ ampspy::unhandled_exception();
804
+ }
805
+ else
806
+ {
807
+ // translate amps py exception into amps cpp, throw
808
+ exc::throwError();
809
+ }
810
+ }
811
+ else
812
+ {
813
+ Py_DECREF(result);
814
+ }
815
+ }
816
+
817
+ static AMPS::MessageHandler createMessageHandler(obj* self, PyObject* handler)
818
+ {
819
+ if (cmessagehandler::isCHandler(handler))
820
+ {
821
+ return cmessagehandler::getMessageHandler(handler);
822
+ }
823
+ else
824
+ {
825
+ callback_info* ci = new callback_info(self, handler);
826
+ {
827
+ UNLOCKGIL;
828
+ ((AMPS::Client*)(self->pClient))->deferredExecution(callback_info::add, ci);
829
+ }
830
+ AMPS::Lock<SimpleMutex> l(_createdHandlersLock);
831
+ _createdHandlers.insert((void*)ci);
832
+ return AMPS::MessageHandler(&callback_message, ci);
833
+ }
834
+ }
835
+
836
+ AMPSDLL void* copy_route(void* vpCbInfo_)
837
+ {
838
+ // The GIL should not be locked entering this function
839
+ // If it's not one created here, don't copy it
840
+ if (!vpCbInfo_)
841
+ {
842
+ return NULL;
843
+ }
844
+ else
845
+ {
846
+ AMPS::Lock<SimpleMutex> l(_createdHandlersLock);
847
+ if (!_createdHandlers.count(vpCbInfo_))
848
+ {
849
+ return NULL;
850
+ }
851
+ }
852
+ callback_info* pCbInfo = (callback_info*)vpCbInfo_;
853
+ callback_info* retVal = 0;
854
+ {
855
+ LOCKGIL;
856
+ retVal = new callback_info(pCbInfo->getClient(),
857
+ pCbInfo->getHandler());
858
+ }
859
+ ((AMPS::Client*)pCbInfo->getClient()->pClient)->deferredExecution(
860
+ callback_info::add, retVal);
861
+ AMPS::Lock<SimpleMutex> l(_createdHandlersLock);
862
+ _createdHandlers.insert((void*)retVal);
863
+ return (void*)retVal;
864
+ }
865
+
866
+ AMPSDLL void remove_route(void* vpData_)
867
+ {
868
+ // The GIL should not be locked entering this function
869
+ // If it's not one created here, don't do anything
870
+ if (!vpData_)
871
+ {
872
+ return;
873
+ }
874
+ else
875
+ {
876
+ AMPS::Lock<SimpleMutex> l(_createdHandlersLock);
877
+ if (!_createdHandlers.erase(vpData_))
878
+ {
879
+ return;
880
+ }
881
+ }
882
+ callback_info* pInfo = (callback_info*)vpData_;
883
+ obj* pClientObj = pInfo->getClient();
884
+ if (!pInfo->getHandler() || !pClientObj ||
885
+ !((AMPS::Client*)pClientObj->pClient) ||
886
+ !((AMPS::Client*)pClientObj->pClient)->isValid())
887
+ {
888
+ callback_info::destroy(vpData_);
889
+ return;
890
+ }
891
+ ((AMPS::Client*)pClientObj->pClient)->deferredExecution(callback_info::destroy,
892
+ vpData_);
893
+ }
894
+
895
+ static bool isCallback(PyObject* handler)
896
+ {
897
+ if (handler)
898
+ {
899
+ return cmessagehandler::isCHandler(handler) || PyCallable_Check(handler);
900
+ }
901
+ return false;
902
+ }
903
+ // def send(self, message, message_handler=None, timeout=None):
904
+ static PyObject* send(obj* self, PyObject* args, PyObject* kw)
905
+ {
906
+ static const char* kwlist[] = { "message", "message_handler", "timeout", NULL };
907
+ ampspy::message::obj* message;
908
+ PyObject* handler = NULL;
909
+ int timeout = 0;
910
+
911
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "O!|Oi", (char**)kwlist,
912
+ ampspy::message::message_type.pPyObject(),
913
+ &message, &handler, &timeout))
914
+ {
915
+ return NULL;
916
+ }
917
+ if (isCallback(handler))
918
+ {
919
+ AMPS::MessageHandler messageHandler =
920
+ createMessageHandler(self, handler);
921
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->send(messageHandler,
922
+ *(message->pMessage),
923
+ timeout));
924
+ }
925
+ else
926
+ {
927
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->send(*(message->pMessage)));
928
+ }
929
+ }
930
+
931
+ // def add_message_handler(self, command_id, message_handler, requested_acks,
932
+ //is_subscribe):
933
+ static PyObject* add_message_handler(obj* self, PyObject* args, PyObject* kw)
934
+ {
935
+ static const char* kwlist[] = { "command_id", "message_handler",
936
+ "requested_acks", "is_subscribe", NULL
937
+ };
938
+ const char* cmd_id = NULL;
939
+ PyObject* handler = NULL;
940
+ const char* acks = NULL;
941
+ int isSubscribe = 0;
942
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "sOsi", (char**)kwlist, &cmd_id,
943
+ &handler, &acks, &isSubscribe))
944
+ {
945
+ return NULL;
946
+ }
947
+ unsigned ackType = 0;
948
+ for (const char* current = acks; current != NULL;
949
+ current = strchr(current, ','))
950
+ {
951
+ // Advance after the , if on one, make sure still valid
952
+ if (*current == ',' && *(++current) == '\0')
953
+ {
954
+ break;
955
+ }
956
+ switch (current[1])
957
+ {
958
+ case 'e': //AckTypeConstants<0>::Lengths[Message::AckType::Received]:
959
+ if (current[0] == 'r')
960
+ {
961
+ ackType |= Message::AckType::Received;
962
+ }
963
+ else if (current[0] == 'p')
964
+ {
965
+ ackType |= Message::AckType::Persisted;
966
+ }
967
+ break;
968
+ case 'a':
969
+ ackType |= Message::AckType::Parsed;
970
+ break;
971
+ case 'r':
972
+ ackType |= Message::AckType::Processed;
973
+ break;
974
+ case 'o':
975
+ ackType |= Message::AckType::Completed;
976
+ break;
977
+ case 't':
978
+ ackType |= Message::AckType::Stats;
979
+ break;
980
+ default:
981
+ break;
982
+ }
983
+ }
984
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, handler);
985
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->addMessageHandler(cmd_id,
986
+ msgHandler,
987
+ ackType,
988
+ isSubscribe != 0));
989
+ }
990
+
991
+ // def remove_message_handler(self, command_id)
992
+ static PyObject* remove_message_handler(obj* self, PyObject* args)
993
+ {
994
+ const char* cmd_id = NULL;
995
+ if (!PyArg_ParseTuple(args, "s", &cmd_id))
996
+ {
997
+ return NULL;
998
+ }
999
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->removeMessageHandler(
1000
+ cmd_id));
1001
+ }
1002
+
1003
+ // def bookmarkSubscribe(self, on_message, topic, bookmark, filter=None,
1004
+ //sub_id=None, options=None, timeout=0):
1005
+ static PyObject* bookmark_subscribe(obj* self, PyObject* args, PyObject* kw)
1006
+ {
1007
+ static const char* kwlist[] = {"on_message", "topic", "bookmark", "filter", "sub_id", "options", "timeout", NULL};
1008
+ static const char* kwlist_2[] = {"topic", "bookmark", "filter", "sub_id", "options", "timeout", NULL};
1009
+ const char* topic = NULL, *filter = NULL, *bookmark = NULL, *sub_id = NULL,
1010
+ *options = NULL;
1011
+ int timeout = 0;
1012
+ PyObject* handler;
1013
+ if (messageHandlerSupplied(args, kw))
1014
+ {
1015
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "Oss|zssi", (char**)kwlist,
1016
+ &handler, &topic, &bookmark, &filter,
1017
+ &sub_id, &options, &timeout))
1018
+ {
1019
+ return NULL;
1020
+ }
1021
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, handler);
1022
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->bookmarkSubscribe(
1023
+ msgHandler,
1024
+ topic, timeout, bookmark, filter ? filter : "",
1025
+ options ? options : "", sub_id ? sub_id : ""));
1026
+ }
1027
+ else
1028
+ {
1029
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "ss|zssi", (char**)kwlist_2,
1030
+ &topic, &bookmark, &filter, &sub_id,
1031
+ &options, &timeout))
1032
+ {
1033
+ return NULL;
1034
+ }
1035
+ AMPSPyReference<ampspy::messagestream::obj> messageStream = createMessageStream(
1036
+ self, self->pClient, false, false);
1037
+ Command command("subscribe");
1038
+ command.setTopic(topic).setBookmark(bookmark).setTimeout(timeout);
1039
+ if (filter)
1040
+ {
1041
+ command.setFilter(filter);
1042
+ }
1043
+ if (options)
1044
+ {
1045
+ command.setOptions(options);
1046
+ }
1047
+ if (sub_id)
1048
+ {
1049
+ command.setSubId(sub_id);
1050
+ }
1051
+ CALL_AND_CAPTURE_RETURN_VALUE(((AMPS::Client*)(
1052
+ self->pClient))->executeAsyncNoResubscribe(
1053
+ command,
1054
+ messageStream->messageHandler()),
1055
+ messageStream->commandId());
1056
+ if (messageStream->commandId().empty())
1057
+ {
1058
+ messageStream.release();
1059
+ return (PyObject*)createNoopMessageStream();
1060
+ }
1061
+ else if (sub_id)
1062
+ {
1063
+ messageStream->subId() = sub_id;
1064
+ }
1065
+ return messageStream.release();
1066
+ }
1067
+ }
1068
+
1069
+ static std::string optionsFor(const char* userOptions_, PyObject* oofEnabled_,
1070
+ PyObject* sendEmpties_ = NULL)
1071
+ {
1072
+ std::ostringstream optsOstr;
1073
+ if (oofEnabled_ && PyObject_IsTrue(oofEnabled_) == 1)
1074
+ {
1075
+ optsOstr << "oof";
1076
+ }
1077
+ if (sendEmpties_ && PyObject_IsTrue(sendEmpties_) == 0)
1078
+ {
1079
+ if (optsOstr.tellp() > 0)
1080
+ {
1081
+ optsOstr << ",";
1082
+ }
1083
+ optsOstr << "no_empties";
1084
+ }
1085
+ if (userOptions_)
1086
+ {
1087
+ if (optsOstr.tellp() > 0)
1088
+ {
1089
+ optsOstr << ",";
1090
+ }
1091
+ optsOstr << userOptions_;
1092
+ }
1093
+ return optsOstr.str();
1094
+
1095
+ }
1096
+
1097
+ //def sowAndDeltaSubscribe(self, on_message, topic, filter=None,
1098
+ // batch_size=10, oof_enabled=False, send_empties=False,
1099
+ // timeout=0, top_n=AMPS_DEFAULT_TOP_N, order_by="",
1100
+ // options=""):
1101
+ static PyObject* sow_and_delta_subscribe(obj* self, PyObject* args,
1102
+ PyObject* kw)
1103
+ {
1104
+ static const char* kwlist[] = {"on_message", "topic", "filter", "batch_size", "oof_enabled", "send_empties", "timeout", "top_n", "order_by", "options", NULL};
1105
+ static const char* kwlist_2[] = {"topic", "filter", "batch_size", "oof_enabled", "send_empties", "timeout", "top_n", "order_by", "options", NULL};
1106
+ const char* topic = NULL, *filter = NULL;
1107
+ const char* orderBy = NULL;
1108
+ const char* options = NULL;
1109
+ PyObject* oofEnabled = Py_None, *sendEmpties = Py_None;
1110
+ int batch_size = 10, timeout = 0, topN = AMPS_DEFAULT_TOP_N;
1111
+ if (messageHandlerSupplied(args, kw))
1112
+ {
1113
+ PyObject* handler;
1114
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "Os|ziOOiizz", (char**)kwlist,
1115
+ &handler, &topic, &filter, &batch_size,
1116
+ &oofEnabled, &sendEmpties,
1117
+ &timeout, &topN, &orderBy, &options))
1118
+ {
1119
+ return NULL;
1120
+ }
1121
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, handler);
1122
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->sowAndDeltaSubscribe(
1123
+ msgHandler,
1124
+ topic, filter ? filter : "", orderBy ? orderBy : "",
1125
+ batch_size, topN,
1126
+ optionsFor(options, oofEnabled, sendEmpties), timeout));
1127
+ }
1128
+ else
1129
+ {
1130
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ziOOiizz", (char**)kwlist_2,
1131
+ &topic, &filter, &batch_size, &oofEnabled,
1132
+ &sendEmpties, &timeout, &topN, &orderBy,
1133
+ &options))
1134
+ {
1135
+ return NULL;
1136
+ }
1137
+ AMPSPyReference<ampspy::messagestream::obj> messageStream = createMessageStream(
1138
+ self, self->pClient, false, false);
1139
+ Command command("sow_and_delta_subscribe");
1140
+ command.setTopic(topic).setBatchSize(batch_size).setTimeout(timeout);
1141
+ if (filter)
1142
+ {
1143
+ command.setFilter(filter);
1144
+ }
1145
+ std::string optionsStr = optionsFor(options, oofEnabled, sendEmpties);
1146
+ if (optionsStr.length())
1147
+ {
1148
+ command.setOptions(optionsStr);
1149
+ }
1150
+ if (orderBy)
1151
+ {
1152
+ command.setOrderBy(orderBy);
1153
+ }
1154
+ if (topN > 0)
1155
+ {
1156
+ command.setTopN(topN);
1157
+ }
1158
+ CALL_AND_CAPTURE_RETURN_VALUE(((AMPS::Client*)(
1159
+ self->pClient))->executeAsyncNoResubscribe(
1160
+ command,
1161
+ messageStream->messageHandler()),
1162
+ messageStream->commandId());
1163
+ if (messageStream->commandId().empty())
1164
+ {
1165
+ messageStream.release();
1166
+ return (PyObject*)createNoopMessageStream();
1167
+ }
1168
+ return messageStream.release();
1169
+ }
1170
+
1171
+ }
1172
+
1173
+ // def sow_and_subscribe(self, on_message, topic, filter, batch_size=10,
1174
+ //batch_size=10, oof_enabled=False,
1175
+ //timeout=0, top_n = AMPS_DEFAULT_TOP_N,
1176
+ //order_by="", bookmark="", options=""):
1177
+ // def sowAndSubscribe(self, on_message, topic, filter,
1178
+ //batch_size=10, oof_enabled=False,
1179
+ //timeout=0, top_n = AMPS_DEFAULT_TOP_N,
1180
+ //order_by="", bookmark="", options=""):
1181
+ static PyObject* sow_and_subscribe(obj* self, PyObject* args, PyObject* kw)
1182
+ {
1183
+ static const char* kwlist[] = {"on_message", "topic", "filter", "batch_size", "oof_enabled", "timeout", "top_n", "order_by", "bookmark", "options", NULL};
1184
+ static const char* kwlist_2[] = {"topic", "filter", "batch_size", "oof_enabled", "timeout", "top_n", "order_by", "bookmark", "options", NULL};
1185
+ const char* topic = NULL, *filter = NULL;
1186
+ const char* orderBy = NULL;
1187
+ const char* bookmark = NULL;
1188
+ const char* options = NULL;
1189
+ int batch_size = 10, timeout = 0, topN = AMPS_DEFAULT_TOP_N;
1190
+ PyObject* oof_enabled = Py_None;
1191
+ if (messageHandlerSupplied(args, kw))
1192
+ {
1193
+ PyObject* handler;
1194
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "Os|ziOiizzz", (char**)kwlist,
1195
+ &handler, &topic, &filter, &batch_size,
1196
+ &oof_enabled, &timeout, &topN, &orderBy,
1197
+ &bookmark, &options))
1198
+ {
1199
+ return NULL;
1200
+ }
1201
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, handler);
1202
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->sowAndSubscribe(msgHandler,
1203
+ topic, filter ? filter : "", orderBy ? orderBy : "", bookmark ? bookmark : "",
1204
+ batch_size, topN, optionsFor(options, oof_enabled), timeout));
1205
+ }
1206
+ else
1207
+ {
1208
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ziOiizzz",
1209
+ (char**)kwlist_2, &topic, &filter,
1210
+ &batch_size, &oof_enabled, &timeout,
1211
+ &topN, &orderBy, &bookmark, &options))
1212
+ {
1213
+ return NULL;
1214
+ }
1215
+ AMPSPyReference<ampspy::messagestream::obj> messageStream = createMessageStream(
1216
+ self, self->pClient, false, false);
1217
+ Command command("sow_and_subscribe");
1218
+ command.setTopic(topic).setBatchSize(batch_size).setTimeout(timeout);
1219
+ if (filter)
1220
+ {
1221
+ command.setFilter(filter);
1222
+ }
1223
+ std::string optionsStr = optionsFor(options, oof_enabled);
1224
+ if (optionsStr.length())
1225
+ {
1226
+ command.setOptions(optionsStr);
1227
+ }
1228
+ if (orderBy)
1229
+ {
1230
+ command.setOrderBy(orderBy);
1231
+ }
1232
+ if (bookmark)
1233
+ {
1234
+ command.setBookmark(bookmark);
1235
+ }
1236
+ if (topN > 0)
1237
+ {
1238
+ command.setTopN(topN);
1239
+ }
1240
+ CALL_AND_CAPTURE_RETURN_VALUE(((AMPS::Client*)(
1241
+ self->pClient))->executeAsyncNoResubscribe(
1242
+ command,
1243
+ messageStream->messageHandler()),
1244
+ messageStream->commandId());
1245
+ if (messageStream->commandId().empty())
1246
+ {
1247
+ messageStream.release();
1248
+ return (PyObject*)createNoopMessageStream();
1249
+ }
1250
+ return messageStream.release();
1251
+ }
1252
+ }
1253
+
1254
+ // def sow(self, on_message, topic, filter, batch_size=10, timeout=0, top_n=AMPS_DEFAULT_TOP_N, order_by=None, bookmark=None, options=None):
1255
+ static PyObject* sow(obj* self, PyObject* args, PyObject* kw)
1256
+ {
1257
+ static const char* kwlist[] = {"on_message", "topic", "filter", "batch_size", "timeout", "top_n", "order_by", "bookmark", "options", NULL};
1258
+ static const char* kwlist_2[] = {"topic", "filter", "batch_size", "timeout", "top_n", "order_by", "bookmark", "options", NULL};
1259
+ const char* topic = NULL, *filter = NULL;
1260
+ const char* orderBy = NULL;
1261
+ const char* bookmark = NULL;
1262
+ const char* options = NULL;
1263
+ int batch_size = 10, timeout = 0, topN = AMPS_DEFAULT_TOP_N;
1264
+ PyObject* handler = NULL;
1265
+ if (messageHandlerSupplied(args, kw))
1266
+ {
1267
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "Os|ziiizzz", (char**)kwlist,
1268
+ &handler, &topic, &filter, &batch_size,
1269
+ &timeout, &topN, &orderBy, &bookmark,
1270
+ &options))
1271
+ {
1272
+ return NULL;
1273
+ }
1274
+ }
1275
+ else
1276
+ {
1277
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ziiizzz", (char**)kwlist_2,
1278
+ &topic, &filter, &batch_size, &timeout,
1279
+ &topN, &orderBy, &bookmark, &options))
1280
+ {
1281
+ return NULL;
1282
+ }
1283
+ }
1284
+ if (handler == NULL)
1285
+ {
1286
+ AMPSPyReference<ampspy::messagestream::obj > messagestream =
1287
+ createMessageStream(self, self->pClient, true, false, false);
1288
+ AMPS::Command cmd("sow");
1289
+ cmd.setTopic(topic).setBatchSize(batch_size);
1290
+ if (filter)
1291
+ {
1292
+ cmd.setFilter(filter);
1293
+ }
1294
+ if (orderBy)
1295
+ {
1296
+ cmd.setOrderBy(orderBy);
1297
+ }
1298
+ if (bookmark)
1299
+ {
1300
+ cmd.setBookmark(bookmark);
1301
+ }
1302
+ if (topN != AMPS_DEFAULT_TOP_N)
1303
+ {
1304
+ cmd.setTopN(topN);
1305
+ }
1306
+ if (options)
1307
+ {
1308
+ cmd.setOptions(options);
1309
+ }
1310
+ if (timeout)
1311
+ {
1312
+ cmd.setTimeout(timeout);
1313
+ }
1314
+ cmd.addAckType("completed");
1315
+ CALL_AND_CAPTURE_RETURN_VALUE(((AMPS::Client*)(self->pClient))->executeAsync(
1316
+ cmd, messagestream->messageHandler()),
1317
+ messagestream->commandId());
1318
+
1319
+ return messagestream.release();
1320
+ }
1321
+ else
1322
+ {
1323
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, handler);
1324
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->sow(msgHandler,
1325
+ topic, filter ? filter : "", orderBy ? orderBy : "",
1326
+ bookmark ? bookmark : "", batch_size, topN,
1327
+ options ? options : "", timeout));
1328
+ }
1329
+ }
1330
+ // def subscribe(self, on_message, topic, filter=None, options=None, timeout=0, sub_id=None):
1331
+ static PyObject* subscribe(obj* self, PyObject* args, PyObject* kw)
1332
+ {
1333
+ static const char* kwlist[] = { "on_message", "topic", "filter", "options", "timeout", "sub_id", NULL };
1334
+ static const char* kwlist_2[] = { "topic", "filter", "options", "timeout", "sub_id", NULL };
1335
+ const char* topic = NULL, *filter = NULL, *options = NULL, *sub_id = NULL;
1336
+ int timeout = 0;
1337
+ if (messageHandlerSupplied(args, kw))
1338
+ {
1339
+ PyObject* handler;
1340
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "Os|zsis", (char**)kwlist,
1341
+ &handler, &topic, &filter, &options,
1342
+ &timeout, &sub_id))
1343
+ {
1344
+ return NULL;
1345
+ }
1346
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, handler);
1347
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->subscribe(msgHandler,
1348
+ topic, timeout,
1349
+ filter ? filter : "",
1350
+ options ? options : "",
1351
+ sub_id ? sub_id : ""));
1352
+ }
1353
+ else
1354
+ {
1355
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s|zsis", (char**)kwlist_2,
1356
+ &topic, &filter, &options,
1357
+ &timeout, &sub_id))
1358
+ {
1359
+ return NULL;
1360
+ }
1361
+ AMPSPyReference<ampspy::messagestream::obj> messageStream = createMessageStream(
1362
+ self, self->pClient, false, false);
1363
+ Command command("subscribe");
1364
+ command.setTopic(topic).setTimeout(timeout);
1365
+ if (filter)
1366
+ {
1367
+ command.setFilter(filter);
1368
+ }
1369
+ if (options)
1370
+ {
1371
+ command.setOptions(options);
1372
+ }
1373
+ if (sub_id)
1374
+ {
1375
+ command.setSubId(sub_id);
1376
+ }
1377
+ CALL_AND_CAPTURE_RETURN_VALUE(((AMPS::Client*)(
1378
+ self->pClient))->executeAsyncNoResubscribe(
1379
+ command,
1380
+ messageStream->messageHandler()),
1381
+ messageStream->commandId());
1382
+ if (messageStream->commandId().empty())
1383
+ {
1384
+ messageStream.release();
1385
+ return (PyObject*)createNoopMessageStream();
1386
+ }
1387
+ else if (sub_id)
1388
+ {
1389
+ messageStream->subId() = sub_id;
1390
+ }
1391
+ return messageStream.release();
1392
+ }
1393
+ }
1394
+
1395
+ // def deltaSubscribe(self, on_message, topic, filter=None, options=0, timeout=0):
1396
+ // def delta_subscribe(self, on_message, topic, filter=None, options=0, timeout=0):
1397
+ static PyObject* delta_subscribe(obj* self, PyObject* args, PyObject* kw)
1398
+ {
1399
+ static const char* kwlist[] = { "on_message", "topic", "filter", "options", "timeout", "sub_id", NULL };
1400
+ static const char* kwlist_2[] = { "topic", "filter", "options", "timeout", "sub_id", NULL };
1401
+ const char* topic = NULL, *filter = NULL, *options = NULL, *sub_id = NULL;
1402
+ int timeout = 0;
1403
+ if (messageHandlerSupplied(args, kw))
1404
+ {
1405
+ PyObject* handler;
1406
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "Os|zsis", (char**)kwlist,
1407
+ &handler, &topic, &filter, &options,
1408
+ &timeout, &sub_id))
1409
+ {
1410
+ return NULL;
1411
+ }
1412
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, handler);
1413
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->deltaSubscribe(msgHandler,
1414
+ topic, timeout, filter ? filter : "",
1415
+ options ? options : "", sub_id ? sub_id : ""));
1416
+ }
1417
+ else
1418
+ {
1419
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s|zsis", (char**)kwlist_2,
1420
+ &topic, &filter, &options,
1421
+ &timeout, &sub_id))
1422
+ {
1423
+ return NULL;
1424
+ }
1425
+ AMPSPyReference<ampspy::messagestream::obj> messageStream = createMessageStream(
1426
+ self, self->pClient, false, false);
1427
+ Command command("delta_subscribe");
1428
+ command.setTopic(topic).setTimeout(timeout);
1429
+ if (filter)
1430
+ {
1431
+ command.setFilter(filter);
1432
+ }
1433
+ if (options)
1434
+ {
1435
+ command.setOptions(options);
1436
+ }
1437
+ if (sub_id)
1438
+ {
1439
+ command.setSubId(sub_id);
1440
+ }
1441
+ CALL_AND_CAPTURE_RETURN_VALUE(((AMPS::Client*)(
1442
+ self->pClient))->executeAsyncNoResubscribe(
1443
+ command,
1444
+ messageStream->messageHandler()),
1445
+ messageStream->commandId());
1446
+ if (messageStream->commandId().empty())
1447
+ {
1448
+ messageStream.release();
1449
+ return (PyObject*)createNoopMessageStream();
1450
+ }
1451
+ else if (sub_id)
1452
+ {
1453
+ messageStream->subId() = sub_id;
1454
+ }
1455
+ return messageStream.release();
1456
+ }
1457
+ }
1458
+
1459
+
1460
+ // def sowDelete(self, on_message, topic, filter=None, options=0, timeout=0):
1461
+ // def sow_delete(self, on_message, topic, filter=None, options=0, timeout=0):
1462
+ static PyObject* sow_delete(obj* self, PyObject* args, PyObject* kw)
1463
+ {
1464
+ static const char* kwlist[] = { "on_message", "topic", "filter", "timeout", NULL };
1465
+ static const char* kwlist_2[] = { "topic", "filter", "timeout", NULL };
1466
+ const char* topic, *filter_ = "";
1467
+ int timeout_ = 0;
1468
+ PyObject* handler;
1469
+ if (messageHandlerSupplied(args, kw))
1470
+ {
1471
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "Oss|i", (char**)kwlist,
1472
+ &handler, &topic, &filter_, &timeout_))
1473
+ {
1474
+ return NULL;
1475
+ }
1476
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, handler);
1477
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->sowDelete(msgHandler,
1478
+ topic,
1479
+ filter_,
1480
+ timeout_));
1481
+ }
1482
+ else
1483
+ {
1484
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "ss|i", (char**)kwlist_2,
1485
+ &topic, &filter_, &timeout_))
1486
+ {
1487
+ return NULL;
1488
+ }
1489
+ try
1490
+ {
1491
+ AMPS::Message resultMessage;
1492
+ {
1493
+ UNLOCKGIL;
1494
+ resultMessage = ((AMPS::Client*)(self->pClient))->sowDelete(topic,
1495
+ filter_,
1496
+ timeout_);
1497
+ }
1498
+ message::obj* message = (message::obj*)allocate_message(self, NULL);
1499
+ message::setCppMessage(message, resultMessage);
1500
+ return (PyObject*)message;
1501
+ } DISPATCH_EXCEPTION
1502
+ }
1503
+ }
1504
+
1505
+ // def sowDelete(self, on_message, topic, filter=None, options=0, timeout=0):
1506
+ // def sow_delete(self, on_message, topic, filter=None, options=0, timeout=0):
1507
+ static PyObject* sow_delete_by_keys(obj* self, PyObject* args, PyObject* kw)
1508
+ {
1509
+ static const char* kwlist[] = { "on_message", "topic", "keys", "timeout", NULL };
1510
+ static const char* kwlist_2[] = {"topic", "keys", "timeout", NULL };
1511
+ const char* topic, *keys = "";
1512
+ int timeout_ = 0;
1513
+ PyObject* on_message;
1514
+ if (messageHandlerSupplied(args, kw))
1515
+ {
1516
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "Oss|i", (char**)kwlist,
1517
+ &on_message, &topic, &keys, &timeout_))
1518
+ {
1519
+ return NULL;
1520
+ }
1521
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, on_message);
1522
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->sowDeleteByKeys(msgHandler,
1523
+ topic,
1524
+ keys,
1525
+ timeout_));
1526
+ }
1527
+ else
1528
+ {
1529
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s|si", (char**)kwlist_2,
1530
+ &topic, &keys, &timeout_))
1531
+ {
1532
+ return NULL;
1533
+ }
1534
+ try
1535
+ {
1536
+ AMPS::Message resultMessage;
1537
+ {
1538
+ UNLOCKGIL;
1539
+ resultMessage = ((AMPS::Client*)(self->pClient))->sowDeleteByKeys(topic,
1540
+ keys,
1541
+ timeout_);
1542
+ }
1543
+ message::obj* message = (message::obj*)allocate_message(self, NULL);
1544
+ message::setCppMessage(message, resultMessage);
1545
+ return (PyObject*)message;
1546
+ }
1547
+ DISPATCH_EXCEPTION
1548
+ }
1549
+ }
1550
+
1551
+ // def sowDelete(self, on_message, topic, data, options=0, timeout=0):
1552
+ // def sow_delete(self, on_message, topic, data, options=0, timeout=0):
1553
+ static PyObject* sow_delete_by_data(obj* self, PyObject* args, PyObject* kw)
1554
+ {
1555
+ static const char* kwlist[] = { "on_message", "topic", "data", "timeout", NULL };
1556
+ static const char* kwlist_2[] = {"topic", "data", "timeout", NULL };
1557
+ const char* topic, *data = "";
1558
+ Py_ssize_t dataLen = 0;
1559
+ int timeout_ = 0;
1560
+ if (messageHandlerSupplied(args, kw))
1561
+ {
1562
+ PyObject* on_message;
1563
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "Oss#|i", (char**)kwlist,
1564
+ &on_message, &topic, &data, &dataLen,
1565
+ &timeout_))
1566
+ {
1567
+ return NULL;
1568
+ }
1569
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, on_message);
1570
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->sowDeleteByData(msgHandler,
1571
+ topic,
1572
+ std::string(data, dataLen),
1573
+ timeout_));
1574
+ }
1575
+ else
1576
+ {
1577
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "ss#|i", (char**)kwlist_2,
1578
+ &topic, &data, &dataLen, &timeout_))
1579
+ {
1580
+ return NULL;
1581
+ }
1582
+ try
1583
+ {
1584
+ AMPS::Message resultMessage;
1585
+ {
1586
+ UNLOCKGIL;
1587
+ resultMessage = ((AMPS::Client*)(self->pClient))->sowDeleteByData(topic,
1588
+ std::string(data, dataLen), timeout_);
1589
+ }
1590
+ message::obj* message = (message::obj*)allocate_message(self, NULL);
1591
+ message::setCppMessage(message, resultMessage);
1592
+ return (PyObject*) message;
1593
+ } DISPATCH_EXCEPTION
1594
+ }
1595
+ }
1596
+
1597
+ // def set_heartbeat(self, interval_seconds, timeout_seconds=None):
1598
+ static PyObject* set_heartbeat(obj* self, PyObject* args, PyObject* kw)
1599
+ {
1600
+ static const char* kwlist[] = { "interval_seconds", "timeout_seconds", NULL };
1601
+ int interval_seconds = 0, timeout_seconds = -1;
1602
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "i|i", (char**)kwlist,
1603
+ &interval_seconds, &timeout_seconds))
1604
+ {
1605
+ return NULL;
1606
+ }
1607
+ if (timeout_seconds == -1)
1608
+ {
1609
+ timeout_seconds = interval_seconds * 2;
1610
+ }
1611
+
1612
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setHeartbeat(
1613
+ interval_seconds, timeout_seconds));
1614
+ }
1615
+
1616
+ // Deprecated
1617
+ // def start_timer(self)
1618
+ static PyObject* start_timer(obj* self, PyObject* args)
1619
+ {
1620
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->startTimer());
1621
+ }
1622
+
1623
+ // Deprecated
1624
+ // def stop_timer(self)
1625
+ static PyObject* stop_timer(obj* self, PyObject* args)
1626
+ {
1627
+ PyObject* callable;
1628
+ if (!PyArg_ParseTuple(args, "O", &callable))
1629
+ {
1630
+ return NULL;
1631
+ }
1632
+ if (isCallback(callable))
1633
+ {
1634
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, callable);
1635
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->stopTimer(msgHandler));
1636
+ }
1637
+ else
1638
+ {
1639
+ PyErr_SetString(PyExc_TypeError, "argument to stop_timer must be callable.");
1640
+ return NULL;
1641
+ }
1642
+ }
1643
+
1644
+ void
1645
+ call_disconnect_handler(Client& cli, void* vp)
1646
+ {
1647
+ LOCKGIL;
1648
+ obj* c = (obj*) vp;
1649
+
1650
+ PyObject* args = Py_BuildValue("(O)", c);
1651
+ PyObject_Call(c->disconnectHandler, args, (PyObject*)NULL);
1652
+ Py_DECREF(args);
1653
+ if (PyErr_Occurred())
1654
+ {
1655
+ if (PyErr_ExceptionMatches(PyExc_SystemExit))
1656
+ {
1657
+ ampspy::unhandled_exception();
1658
+ }
1659
+ throw AMPSException("The disconnect handler threw an exception",
1660
+ AMPS_E_CONNECTION);
1661
+ }
1662
+ }
1663
+
1664
+ // def set_disconnect_handler(self, client_disconnect_handler):
1665
+ // def setDisconnectHandler(self, client_disconnect_handler):
1666
+ static PyObject* set_disconnect_handler(obj* self, PyObject* args)
1667
+ {
1668
+ Client& client = *(self->pClient);
1669
+ PyObject* callable;
1670
+ if (!PyArg_ParseTuple(args, "O", &callable))
1671
+ {
1672
+ return NULL;
1673
+ }
1674
+ if (!PyCallable_Check(callable) && callable != Py_None)
1675
+ {
1676
+ PyErr_SetString(PyExc_TypeError, "argument must be callable.");
1677
+ return NULL;
1678
+ }
1679
+ if (self->disconnectHandler)
1680
+ {
1681
+ Py_DECREF(self->disconnectHandler);
1682
+ }
1683
+ if (callable == Py_None)
1684
+ {
1685
+ self->disconnectHandler = NULL;
1686
+ AMPS::DisconnectHandler no_handler;
1687
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setDisconnectHandler(
1688
+ no_handler));
1689
+ }
1690
+ else
1691
+ {
1692
+ Py_INCREF(callable);
1693
+ self->disconnectHandler = callable;
1694
+ CALL_RETURN_NONE(client.setDisconnectHandler(AMPS::DisconnectHandler(
1695
+ call_disconnect_handler, self)));
1696
+ }
1697
+ }
1698
+ // def set_unhandled_message_handler(self, message_handler):
1699
+ // def setUnhandledMessageHandler(self, message_handler):
1700
+ static PyObject* set_last_chance_message_handler(obj* self, PyObject* args)
1701
+ {
1702
+ PyObject* callable;
1703
+ if (!PyArg_ParseTuple(args, "O", &callable))
1704
+ {
1705
+ return NULL;
1706
+ }
1707
+ if (isCallback(callable))
1708
+ {
1709
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, callable);
1710
+ CALL_RETURN_NONE(
1711
+ ((AMPS::Client*)(self->pClient))->setLastChanceMessageHandler(msgHandler));
1712
+ }
1713
+ else
1714
+ {
1715
+ if (callable == Py_None)
1716
+ {
1717
+ AMPS::MessageHandler no_handler;
1718
+ CALL_RETURN_NONE(
1719
+ ((AMPS::Client*)(self->pClient))->setLastChanceMessageHandler(no_handler));
1720
+ }
1721
+ else
1722
+ {
1723
+ PyErr_SetString(PyExc_TypeError, "argument must be callable.");
1724
+ return NULL;
1725
+ }
1726
+ }
1727
+ }
1728
+
1729
+ // def set_duplicate_message_handler(self, message_handler):
1730
+ // def setDuplicateMessageHandler(self, message_handler):
1731
+ static PyObject* set_duplicate_message_handler(obj* self, PyObject* args)
1732
+ {
1733
+ PyObject* callable;
1734
+ if (!PyArg_ParseTuple(args, "O", &callable))
1735
+ {
1736
+ return NULL;
1737
+ }
1738
+ if (isCallback(callable))
1739
+ {
1740
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, callable);
1741
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setDuplicateMessageHandler(
1742
+ msgHandler));
1743
+ }
1744
+ else
1745
+ {
1746
+ if (callable == Py_None)
1747
+ {
1748
+ AMPS::MessageHandler no_handler;
1749
+ CALL_RETURN_NONE(
1750
+ ((AMPS::Client*)(self->pClient))->setDuplicateMessageHandler(no_handler));
1751
+ }
1752
+ PyErr_SetString(PyExc_TypeError, "argument must be callable.");
1753
+ return NULL;
1754
+ }
1755
+ }
1756
+
1757
+ static PyObject* get_duplicate_message_handler(obj* self, PyObject* args)
1758
+ {
1759
+ AMPS::MessageHandler handler = ((AMPS::Client*)(
1760
+ self->pClient))->getDuplicateMessageHandler();
1761
+ if (handler.function() == callback_message)
1762
+ {
1763
+ callback_info* pCallbackInfo =
1764
+ reinterpret_cast<callback_info*>(handler.userData());
1765
+ if (pCallbackInfo)
1766
+ {
1767
+ PyObject* handler = pCallbackInfo->getHandler();
1768
+ if (handler)
1769
+ {
1770
+ Py_INCREF(handler);
1771
+ return handler;
1772
+ }
1773
+ }
1774
+ }
1775
+ NONE;
1776
+ }
1777
+
1778
+ // def set_exception_listener(self, exception_listener):
1779
+ // def setExceptionListener(self, exception_listener):
1780
+ static PyObject* set_exception_listener(obj* self, PyObject* args)
1781
+ {
1782
+ PyObject* callable;
1783
+ if (!PyArg_ParseTuple(args, "O", &callable))
1784
+ {
1785
+ return NULL;
1786
+ }
1787
+ if (!PyCallable_Check(callable) && callable != Py_None)
1788
+ {
1789
+ PyErr_SetString(PyExc_TypeError, "argument must be callable.");
1790
+ return NULL;
1791
+ }
1792
+ if (callable == Py_None)
1793
+ {
1794
+ self->exceptionHandler = std::make_shared<PyExceptionListener>();
1795
+ }
1796
+ else
1797
+ {
1798
+ self->exceptionHandler = std::make_shared<PyExceptionListener>(callable);
1799
+ }
1800
+ CALL_RETURN_NONE(
1801
+ ((AMPS::Client*)(self->pClient))->setExceptionListener( self->exceptionHandler )
1802
+ );
1803
+ }
1804
+
1805
+ static PyObject* get_exception_listener(obj* self, PyObject* args)
1806
+ {
1807
+ if (self->exceptionHandler)
1808
+ {
1809
+ PyObject* object = (PyObject*) ((PyExceptionListener*)(
1810
+ self->exceptionHandler.get()))->callable();
1811
+ if (object)
1812
+ {
1813
+ Py_INCREF(object);
1814
+ return object;
1815
+ }
1816
+ }
1817
+ NONE;
1818
+ }
1819
+
1820
+ // def publish_flush(self, timeout=0):
1821
+ static PyObject* publish_flush(obj* self, PyObject* args, PyObject* kw)
1822
+ {
1823
+ static const char* kwlist[] = { "timeout", "ack_type", NULL };
1824
+ long timeout = 0;
1825
+ unsigned long ackType = AMPS::Message::AckType::Processed;
1826
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "|lk", (char**)kwlist, &timeout,
1827
+ &ackType))
1828
+ {
1829
+ return NULL;
1830
+ }
1831
+ CALL_RETURN_NONE(
1832
+ ((AMPS::Client*)(self->pClient))->publishFlush(timeout, ackType)
1833
+ );
1834
+ }
1835
+
1836
+ static size_t _getUnpersistedCount(AMPS::Client& client)
1837
+ {
1838
+ Store store = client.getPublishStore();
1839
+ if (store.isValid())
1840
+ {
1841
+ return store.unpersistedCount();
1842
+ }
1843
+ else
1844
+ {
1845
+ return 0;
1846
+ }
1847
+ }
1848
+
1849
+ static PyObject* get_unpersisted_count(obj* self, PyObject* args)
1850
+ {
1851
+ AMPS::Client& client = *(AMPS::Client*)(self->pClient);
1852
+ // Want to unlock GIL for all client calls and have exception safety
1853
+ CALL_RETURN_SIZE_T(_getUnpersistedCount(client));
1854
+ }
1855
+
1856
+ static PyObject* get_error_on_publish_gap(obj* self, PyObject* args)
1857
+ {
1858
+ CALL_RETURN_BOOL(((AMPS::Client*)(
1859
+ self->pClient))->getPublishStore().getErrorOnPublishGap());
1860
+ }
1861
+
1862
+ static PyObject* set_error_on_publish_gap(obj* self, PyObject* args)
1863
+ {
1864
+ PyObject* value = NULL;
1865
+ if (!PyArg_ParseTuple(args, "O!", &PyBool_Type, &value))
1866
+ {
1867
+ return NULL;
1868
+ }
1869
+ CALL_RETURN_NONE(((AMPS::Client*)(
1870
+ self->pClient))->getPublishStore().setErrorOnPublishGap(value == Py_True));
1871
+ }
1872
+
1873
+ static PyObject* set_bookmark_store(obj* self, PyObject* args)
1874
+ {
1875
+ PyObject* pBookmarkStore;
1876
+ if (!PyArg_ParseTuple(args, "O", &pBookmarkStore))
1877
+ {
1878
+ return NULL;
1879
+ }
1880
+
1881
+ if (pBookmarkStore == Py_None)
1882
+ {
1883
+ // Unset the bookmark store.
1884
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setBookmarkStore(
1885
+ BookmarkStore()));
1886
+ }
1887
+ else if (ampspy::mmapbookmarkstore::mmapbookmarkstore_type.isInstanceOf(
1888
+ pBookmarkStore))
1889
+ {
1890
+ // A C++ bookmark store implementation; set it directly.
1891
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setBookmarkStore(*((
1892
+ ampspy::mmapbookmarkstore::obj*)pBookmarkStore)->impl));
1893
+ }
1894
+ else if (ampspy::memorybookmarkstore::memorybookmarkstore_type.isInstanceOf(
1895
+ pBookmarkStore))
1896
+ {
1897
+ // A C++ bookmark store implementation; set it directly.
1898
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setBookmarkStore(*((
1899
+ ampspy::memorybookmarkstore::obj*)pBookmarkStore)->impl));
1900
+ }
1901
+ else
1902
+ {
1903
+ // Assume this is a python object that implements the required bookmark
1904
+ // store methods. If it does not, the first missing method will result in
1905
+ // an exception.
1906
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setBookmarkStore(
1907
+ new ampspy::bookmarkstore::wrapper(pBookmarkStore)));
1908
+ }
1909
+ }
1910
+
1911
+ static PyObject* set_publish_store(obj* self, PyObject* args)
1912
+ {
1913
+ PyObject* store;
1914
+ if (!PyArg_ParseTuple(args, "O", &store))
1915
+ {
1916
+ return NULL;
1917
+ }
1918
+ if (ampspy::publishstore::publishstore_type.isInstanceOf(store))
1919
+ {
1920
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setPublishStore(((
1921
+ ampspy::publishstore::obj*)store)->impl));
1922
+ }
1923
+ else if (ampspy::memorypublishstore::memorypublishstore_type.isInstanceOf(store)
1924
+ || ampspy::hybridpublishstore::hybridpublishstore_type.isInstanceOf(store))
1925
+ {
1926
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setPublishStore(*((
1927
+ ampspy::memorypublishstore::obj*)store)->impl));
1928
+ }
1929
+ else if (store == Py_None)
1930
+ {
1931
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setPublishStore(Store()));
1932
+ }
1933
+ else
1934
+ {
1935
+ PyErr_SetString(PyExc_TypeError,
1936
+ "argument must be one of AMPS.PublishStore, AMPS.MemoryPublishStore, AMPS.HybridPublishStore, or None.");
1937
+ return NULL;
1938
+ }
1939
+ }
1940
+
1941
+ static PyObject* set_failed_write_handler(obj* self, PyObject* args)
1942
+ {
1943
+ PyObject* handler = NULL;
1944
+ if (!PyArg_ParseTuple(args, "O", &handler))
1945
+ {
1946
+ return NULL;
1947
+ }
1948
+
1949
+ if (handler == Py_None)
1950
+ {
1951
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setFailedWriteHandler(NULL));
1952
+ }
1953
+ else
1954
+ {
1955
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setFailedWriteHandler(
1956
+ new PyFailedWriteHandler(handler)));
1957
+ }
1958
+ }
1959
+
1960
+ static PyObject* execute_async(obj* self, PyObject* args, PyObject* kw)
1961
+ {
1962
+ static const char* kwlist[] = { "command", "on_message", NULL };
1963
+ PyObject* on_message = NULL;
1964
+ command::obj* command;
1965
+
1966
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "O!|O", (char**)kwlist,
1967
+ command::command_type.pPyObject(), &command, &on_message))
1968
+ {
1969
+ return NULL;
1970
+ }
1971
+ if (on_message == NULL || on_message == Py_None)
1972
+ {
1973
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->executeAsync(
1974
+ command->command, AMPS::MessageHandler()));
1975
+ }
1976
+
1977
+ if (!isCallback(on_message))
1978
+ {
1979
+ PyErr_SetString(PyExc_TypeError, "on_message must be callable");
1980
+ return NULL;
1981
+ }
1982
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, on_message);
1983
+ CALL_RETURN_STRING(((AMPS::Client*)(self->pClient))->executeAsync(
1984
+ command->command, msgHandler));
1985
+ }
1986
+
1987
+ static PyObject* execute(obj* self, PyObject* args)
1988
+ {
1989
+ command::obj* pyCommand;
1990
+ if (!PyArg_ParseTuple(args, "O!", command::command_type.pPyObject(),
1991
+ &pyCommand))
1992
+ {
1993
+ return NULL;
1994
+ }
1995
+ AMPS::Command& command = pyCommand->command;
1996
+ AMPS::Message& message = command.getMessage();
1997
+ const Message::Command::Type commandType = message.getCommandEnum();
1998
+ unsigned requestedAcks = message.getAckTypeEnum();
1999
+ // A Command returning no data and no acks needs an empty MessageStream
2000
+ if ((commandType & Message::Command::NoDataCommands)
2001
+ && (requestedAcks == Message::AckType::Persisted
2002
+ || requestedAcks == Message::AckType::None))
2003
+ {
2004
+ try
2005
+ {
2006
+ UnlockGIL unlockGuard;
2007
+ ((AMPS::Client*)(self->pClient))->executeAsync(command,
2008
+ AMPS::MessageHandler());
2009
+ } DISPATCH_EXCEPTION;
2010
+ return (PyObject*)createNoopMessageStream();
2011
+ }
2012
+
2013
+ const bool isStats = command.hasStatsAck();
2014
+ const bool isSow = command.isSow();
2015
+ const bool sendCompleted = !isSow ||
2016
+ (requestedAcks & AMPS::Message::AckType::Completed);
2017
+ AMPSPyReference<messagestream::obj> messageStream = createMessageStream(self,
2018
+ self->pClient, isSow, isStats, sendCompleted);
2019
+ if (isSow)
2020
+ {
2021
+ if (!sendCompleted)
2022
+ {
2023
+ command.addAckType("completed");
2024
+ }
2025
+ if (requestedAcks)
2026
+ {
2027
+ messageStream->setAcksOnly(requestedAcks | AMPS::Message::AckType::Completed);
2028
+ }
2029
+ }
2030
+ else if (!command.isSubscribe())
2031
+ {
2032
+ messageStream->setAcksOnly( (commandType == Message::Command::Publish
2033
+ || commandType == Message::Command::DeltaPublish
2034
+ || commandType == Message::Command::SOWDelete)
2035
+ ? requestedAcks & ~Message::AckType::Persisted
2036
+ : requestedAcks);
2037
+ }
2038
+
2039
+ CALL_AND_CAPTURE_RETURN_VALUE(
2040
+ ((AMPS::Client*)(self->pClient))->executeAsyncNoResubscribe(command,
2041
+ messageStream->messageHandler()),
2042
+ messageStream->commandId());
2043
+ if (command.isSubscribe())
2044
+ {
2045
+ if (messageStream->commandId().empty())
2046
+ {
2047
+ messageStream.release();
2048
+ return (PyObject*)createNoopMessageStream();
2049
+ }
2050
+ std::string subId = message.getSubscriptionId();
2051
+ if (subId != messageStream->commandId())
2052
+ {
2053
+ messageStream->subId() = subId;
2054
+ }
2055
+ }
2056
+ std::string queryId = message.getQueryID();
2057
+ if (!queryId.empty() && queryId != messageStream->commandId()
2058
+ && queryId != messageStream->subId())
2059
+ {
2060
+ messageStream->queryId() = queryId;
2061
+ }
2062
+ return messageStream.release();
2063
+ }
2064
+
2065
+ void TransportFilter::connectionStateChanged(
2066
+ AMPS::ConnectionStateListener::State newState_)
2067
+ {
2068
+ if (newState_ == AMPS::ConnectionStateListener::Disconnected)
2069
+ {
2070
+ _remain = 0;
2071
+ }
2072
+ }
2073
+
2074
+ void TransportFilter::filter(const unsigned char* data_, size_t len_,
2075
+ short direction_, void* vpThis_)
2076
+ {
2077
+ TransportFilter* pSelf = (TransportFilter*)vpThis_;
2078
+ try
2079
+ {
2080
+ LOCKGIL;
2081
+ #if PY_MAJOR_VERSION >= 3
2082
+ PyObject_CallObject(pSelf->_handler,
2083
+ Py_BuildValue("(y#O)", data_, len_,
2084
+ (direction_ ? Py_True : Py_False)));
2085
+ #else
2086
+ PyObject_CallObject(pSelf->_handler,
2087
+ Py_BuildValue("(s#O)", data_, len_,
2088
+ (direction_ ? Py_True : Py_False)));
2089
+ #endif
2090
+ }
2091
+ catch (...) { } // -V565 this is a C callback function, so exceptions must not bubble up.
2092
+ }
2093
+ #if PY_MAJOR_VERSION >= 3 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 7)
2094
+ void TransportFilter::filterModifiable(const unsigned char* data_, size_t len_,
2095
+ short direction_, void* vpThis_)
2096
+ {
2097
+ TransportFilter* pSelf = (TransportFilter*)vpThis_;
2098
+ // Break up the bytes into discrete messages
2099
+ size_t processed = 0;
2100
+ unsigned char* start = const_cast<unsigned char*>(data_);
2101
+ size_t length = len_;
2102
+
2103
+ while (processed < length)
2104
+ {
2105
+ size_t sz = length;
2106
+ if (direction_)
2107
+ {
2108
+ if (pSelf->_remain)
2109
+ {
2110
+ start = (unsigned char*)(data_ - pSelf->_remain);
2111
+ length += pSelf->_remain;
2112
+ pSelf->_remain = (size_t)0;
2113
+ }
2114
+ if (length - processed < 4)
2115
+ {
2116
+ break;
2117
+ }
2118
+ unsigned int len = *(unsigned int*)start;
2119
+ sz = (size_t)ntohl(len);
2120
+ if (sz == 0)
2121
+ {
2122
+ break;
2123
+ }
2124
+ if (length - processed < 4 + sz)
2125
+ {
2126
+ break;
2127
+ }
2128
+ start = (unsigned char*)(start + 4);
2129
+ processed += 4;
2130
+ }
2131
+ try
2132
+ {
2133
+ LOCKGIL;
2134
+ #if PY_MAJOR_VERSION >= 3
2135
+ // PyBUF_WRITE currently not in limited API because it's in cpython/object.h, however, it is
2136
+ // added to the stable API in 3.11 and has been stable since 2.6 and 3.0
2137
+ #ifndef PyBUF_WRITE
2138
+ #define PyBUF_WRITE 0x200
2139
+ #endif
2140
+ PyObject* data = PyMemoryView_FromMemory((char*)start, (Py_ssize_t)sz,
2141
+ PyBUF_WRITE);
2142
+ PyObject_CallObject(pSelf->_handler,
2143
+ Py_BuildValue("(OO)", data,
2144
+ (direction_ ? Py_True : Py_False)));
2145
+ #else
2146
+ Py_ssize_t shape[] = { (Py_ssize_t)sz };
2147
+ Py_buffer buf;
2148
+ buf.buf = start;
2149
+ buf.obj = NULL;
2150
+ buf.len = (Py_ssize_t) sz;
2151
+ buf.itemsize = 1;
2152
+ buf.readonly = 0;
2153
+ buf.ndim = 1;
2154
+ buf.format = NULL;
2155
+ buf.shape = shape;
2156
+ buf.strides = NULL;
2157
+ buf.suboffsets = NULL;
2158
+ buf.smalltable[0] = (Py_ssize_t)sz;
2159
+ buf.smalltable[1] = 1;
2160
+ buf.internal = NULL;
2161
+ PyObject* data = PyMemoryView_FromBuffer(&buf);
2162
+ PyObject_CallObject(pSelf->_handler, Py_BuildValue("(OO)", data,
2163
+ (direction_ ? Py_True : Py_False)));
2164
+ #endif
2165
+ }
2166
+ catch (...) { } // -V565 this is a C callback function, so exceptions must not bubble up.
2167
+ processed += sz;
2168
+ start = (unsigned char*)(start + sz);
2169
+ }
2170
+ if (processed < length)
2171
+ {
2172
+ pSelf->_remain = length - processed;
2173
+ }
2174
+ }
2175
+ #endif
2176
+
2177
+ static PyObject* set_transport_filter(obj* self, PyObject* args)
2178
+ {
2179
+ PyObject* filterCallback = NULL;
2180
+ PyObject* modifiable = NULL;
2181
+ if (!PyArg_ParseTuple(args, "O|O!", &filterCallback, &PyBool_Type,
2182
+ &modifiable))
2183
+ {
2184
+ return NULL;
2185
+ }
2186
+ if (filterCallback == Py_None)
2187
+ {
2188
+ // Note: set the filter back to NULL before losing a reference to it.
2189
+ {
2190
+ // seperate scopes due to CALL_AND_RETURN_ON_FAIL jump label reuse
2191
+ CALL_AND_RETURN_ON_FAIL(((AMPS::Client*)(
2192
+ self->pClient))->setTransportFilterFunction(NULL,
2193
+ 0));
2194
+ }
2195
+ {
2196
+ CALL_AND_RETURN_ON_FAIL(((AMPS::Client*)(
2197
+ self->pClient))->
2198
+ removeConnectionStateListener(self->transportFilter));
2199
+ }
2200
+ delete self->transportFilter;
2201
+ self->transportFilter = NULL;
2202
+ }
2203
+ else
2204
+ {
2205
+ if (!PyCallable_Check(filterCallback))
2206
+ {
2207
+ PyErr_SetString(PyExc_TypeError, "argument must be callable or None");
2208
+ return NULL;
2209
+ }
2210
+
2211
+ TransportFilter* transportFilter = new TransportFilter(filterCallback);
2212
+ #if PY_MAJOR_VERSION >= 3 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 7)
2213
+ // Replace the filter that we will use before losing the reference to
2214
+ // the old one.
2215
+ if (modifiable && modifiable == Py_True)
2216
+ {
2217
+ // safe to attempt to erase a non-existant key, but not NULL
2218
+ if (self->transportFilter)
2219
+ {
2220
+ CALL_AND_RETURN_ON_FAIL(((AMPS::Client*)(
2221
+ self->pClient))->
2222
+ removeConnectionStateListener(self->transportFilter));
2223
+ }
2224
+ {
2225
+ // seperate scopes due to CALL_AND_RETURN_ON_FAIL jump label reuse
2226
+ CALL_AND_RETURN_ON_FAIL(((AMPS::Client*)(
2227
+ self->pClient))->
2228
+ addConnectionStateListener(transportFilter));
2229
+ }
2230
+ {
2231
+ CALL_AND_RETURN_ON_FAIL(((AMPS::Client*)(
2232
+ self->pClient))->
2233
+ setTransportFilterFunction(TransportFilter::filterModifiable,
2234
+ transportFilter));
2235
+ }
2236
+ }
2237
+ else
2238
+ #endif
2239
+ {
2240
+ CALL_AND_RETURN_ON_FAIL(((AMPS::Client*)(
2241
+ self->pClient))->
2242
+ setTransportFilterFunction(TransportFilter::filter,
2243
+ transportFilter));
2244
+ }
2245
+ delete self->transportFilter;
2246
+ self->transportFilter = transportFilter;
2247
+ }
2248
+ NONE;
2249
+ }
2250
+
2251
+ static amps_result thread_created_callback(AMPS_THREAD_T, void* void_callable_)
2252
+ {
2253
+ PyObject* callable = (PyObject*)void_callable_;
2254
+ try
2255
+ {
2256
+ LOCKGIL;
2257
+ PyObject_CallObject(callable, NULL);
2258
+ return AMPS_E_OK;
2259
+ }
2260
+ catch (...)
2261
+ {
2262
+ // this is a C callback function, so exceptions must not bubble up.
2263
+ return AMPS_E_RETRY;
2264
+ }
2265
+ }
2266
+
2267
+ static PyObject* set_thread_created_callback(obj* self, PyObject* args)
2268
+ {
2269
+ PyObject* threadCreatedCallback = NULL;
2270
+ if (!PyArg_ParseTuple(args, "O", &threadCreatedCallback))
2271
+ {
2272
+ return NULL;
2273
+ }
2274
+ if (threadCreatedCallback == Py_None)
2275
+ {
2276
+ // Note: set the filter back to NULL before losing a reference to it.
2277
+ CALL_AND_RETURN_ON_FAIL(((AMPS::Client*)(
2278
+ self->pClient))->setThreadCreatedCallback(NULL, 0));
2279
+ Py_XDECREF(self->threadCreatedCallback);
2280
+ }
2281
+ else
2282
+ {
2283
+ if (!PyCallable_Check(threadCreatedCallback))
2284
+ {
2285
+ PyErr_SetString(PyExc_TypeError, "argument must be callable or None");
2286
+ return NULL;
2287
+ }
2288
+
2289
+ // Replace the filter that we will use before losing the reference to the old one.
2290
+ CALL_AND_RETURN_ON_FAIL(((AMPS::Client*)(
2291
+ self->pClient))->
2292
+ setThreadCreatedCallback(thread_created_callback,
2293
+ threadCreatedCallback));
2294
+ Py_XDECREF(self->threadCreatedCallback);
2295
+ self->threadCreatedCallback = threadCreatedCallback;
2296
+ Py_INCREF(self->threadCreatedCallback);
2297
+ }
2298
+ NONE;
2299
+ }
2300
+
2301
+
2302
+ static PyObject* ack(obj* self, PyObject* args)
2303
+ {
2304
+ char* topic = NULL;
2305
+ char* bookmark = NULL;
2306
+ char* options = NULL;
2307
+ char* opts = NULL;
2308
+ Py_ssize_t topicLen = 0;
2309
+ Py_ssize_t bookmarkLen = 0;
2310
+ PyObject* message = NULL;
2311
+
2312
+ if (PyArg_ParseTuple(args, "O|s", &message, &options) &&
2313
+ message->ob_type == message::message_type.pPyTypeObject())
2314
+ {
2315
+ AMPS::Message* pMessage = ((ampspy::message::obj*)message)->pMessage;
2316
+ if (pMessage)
2317
+ {
2318
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->ack(*pMessage, options));
2319
+ }
2320
+ PyErr_SetString(PyExc_TypeError, "This Message is not acknowledgeable.");
2321
+ return NULL;
2322
+ }
2323
+ else if (PyArg_ParseTuple(args, "s#s#|s", &topic, &topicLen, &bookmark,
2324
+ &bookmarkLen, &opts))
2325
+ {
2326
+ Message::Field topicField(topic, topicLen);
2327
+ Message::Field bookmarkField(bookmark, bookmarkLen);
2328
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->ack(topicField,
2329
+ bookmarkField, opts));
2330
+ }
2331
+ else
2332
+ {
2333
+ PyErr_SetString(PyExc_TypeError,
2334
+ "argument must be AMPS.Message or topic and bookmark string.");
2335
+ return NULL;
2336
+ }
2337
+
2338
+ }
2339
+
2340
+ static PyObject* set_auto_ack(obj* self, PyObject* args)
2341
+ {
2342
+ PyObject* value = NULL;
2343
+ if (!PyArg_ParseTuple(args, "O!", &PyBool_Type, &value))
2344
+ {
2345
+ return NULL;
2346
+ }
2347
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setAutoAck(
2348
+ value == Py_True));
2349
+ }
2350
+
2351
+ static PyObject* get_auto_ack(obj* self, PyObject* args)
2352
+ {
2353
+ CALL_RETURN_BOOL(((AMPS::Client*)(self->pClient))->getAutoAck());
2354
+ }
2355
+
2356
+ static PyObject* set_ack_timeout(obj* self, PyObject* args)
2357
+ {
2358
+ unsigned long value = 0;
2359
+ if (!PyArg_ParseTuple(args, "k", &value))
2360
+ {
2361
+ return NULL;
2362
+ }
2363
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setAckTimeout(value));
2364
+ }
2365
+
2366
+ static PyObject* get_ack_timeout(obj* self, PyObject* args)
2367
+ {
2368
+ CALL_RETURN_SIZE_T(((AMPS::Client*)(self->pClient))->getAckTimeout());
2369
+ }
2370
+
2371
+ static PyObject* set_retry_on_disconnect(obj* self, PyObject* args)
2372
+ {
2373
+ PyObject* value = NULL;
2374
+ if (!PyArg_ParseTuple(args, "O!", &PyBool_Type, &value))
2375
+ {
2376
+ return NULL;
2377
+ }
2378
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setRetryOnDisconnect(
2379
+ value == Py_True));
2380
+ }
2381
+
2382
+ static PyObject* get_retry_on_disconnect(obj* self, PyObject* args)
2383
+ {
2384
+ CALL_RETURN_BOOL(((AMPS::Client*)(self->pClient))->getRetryOnDisconnect());
2385
+ }
2386
+
2387
+ static PyObject* set_ack_batch_size(obj* self, PyObject* args)
2388
+ {
2389
+ unsigned long value = 0;
2390
+ if (!PyArg_ParseTuple(args, "k", &value))
2391
+ {
2392
+ return NULL;
2393
+ }
2394
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setAckBatchSize(value));
2395
+ }
2396
+
2397
+ static PyObject* get_ack_batch_size(obj* self, PyObject* args)
2398
+ {
2399
+ CALL_RETURN_SIZE_T(((AMPS::Client*)(self->pClient))->getAckBatchSize());
2400
+ }
2401
+
2402
+ static PyObject* set_default_max_depth(obj* self, PyObject* args)
2403
+ {
2404
+ unsigned long value = 0;
2405
+ if (!PyArg_ParseTuple(args, "k", &value))
2406
+ {
2407
+ return NULL;
2408
+ }
2409
+ CALL_RETURN_NONE(((AMPS::Client*)(self->pClient))->setDefaultMaxDepth((
2410
+ unsigned)value));
2411
+ }
2412
+
2413
+ static PyObject* get_default_max_depth(obj* self, PyObject* args)
2414
+ {
2415
+ CALL_RETURN_SIZE_T(((AMPS::Client*)(self->pClient))->getDefaultMaxDepth());
2416
+ }
2417
+
2418
+ // def set_global_command_type_message_handler(self, command, message_handler)
2419
+ static PyObject* set_global_command_type_message_handler(obj* self,
2420
+ PyObject* args,
2421
+ PyObject* kw)
2422
+ {
2423
+ static const char* kwlist[] = { "command", "message_handler", NULL};
2424
+ const char* cmd = NULL;
2425
+ PyObject* handler = NULL;
2426
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "sO", (char**)kwlist, &cmd,
2427
+ &handler))
2428
+ {
2429
+ return NULL;
2430
+ }
2431
+ AMPS::MessageHandler msgHandler = createMessageHandler(self, handler);
2432
+ CALL_RETURN_NONE(((AMPS::Client*)(
2433
+ self->pClient))->setGlobalCommandTypeMessageHandler(cmd,
2434
+ msgHandler));
2435
+ }
2436
+
2437
+ ///
2438
+ /// This method is used by python internals for garbage collection.
2439
+ ///
2440
+ static int
2441
+ traverse(obj* self, visitproc visit, void* arg)
2442
+ {
2443
+ if (self->disconnectHandler)
2444
+ {
2445
+ Py_VISIT(self->disconnectHandler); //-V547
2446
+ }
2447
+ if (self->exceptionHandler)
2448
+ {
2449
+ volatile PyObject* callable = ((PyExceptionListener*)(
2450
+ self->exceptionHandler.get()))->callable();
2451
+ if (callable)
2452
+ {
2453
+ Py_VISIT(callable);
2454
+ }
2455
+ }
2456
+ if (self->transportFilter)
2457
+ {
2458
+ Py_VISIT(self->transportFilter->getHandler()); //-V547
2459
+ }
2460
+ if (self->threadCreatedCallback)
2461
+ {
2462
+ Py_VISIT(self->threadCreatedCallback); // -V547
2463
+ }
2464
+
2465
+ {
2466
+ AMPS::Lock<SimpleMutex> l(_createdHandlersLock);
2467
+ if ((callback_infos*)self->callbackInfos)
2468
+ {
2469
+ for (callback_infos::iterator i = ((callback_infos*)
2470
+ self->callbackInfos)->begin(),
2471
+ e = ((callback_infos*)self->callbackInfos)->end();
2472
+ i != e; ++i)
2473
+ {
2474
+ PyObject* handler = (*i)->getHandler();
2475
+ Py_VISIT(handler);
2476
+ }
2477
+ }
2478
+ }
2479
+ if ((connection_state_listeners*)self->connectionStateListeners)
2480
+ {
2481
+ typedef connection_state_listeners::iterator conn_state_itr;
2482
+ for (conn_state_itr i = ((connection_state_listeners*)
2483
+ self->connectionStateListeners)->begin(),
2484
+ e = ((connection_state_listeners*)self->connectionStateListeners)->end();
2485
+ i != e; ++i)
2486
+ {
2487
+ Py_VISIT(i->first);
2488
+ }
2489
+ }
2490
+ return 0;
2491
+ }
2492
+
2493
+ static PyObject* get_as_parameter(obj* self, PyObject* args)
2494
+ {
2495
+ return PyLong_FromVoidPtr(self->pClient);
2496
+ }
2497
+
2498
+ static ampspy::ampspy_type_object bookmarks_type;
2499
+
2500
+ void add_types(PyObject* module_)
2501
+ {
2502
+ connection_state_listener::add_types();
2503
+ bookmarks_type.setName("Bookmarks")
2504
+ .setDoc(bookmark_class_doc)
2505
+ .createType()
2506
+ .addStatic("EPOCH", PyString_FromString("0"))
2507
+ .addStatic("MOST_RECENT", PyString_FromString("recent"))
2508
+ .addStatic("NOW", PyString_FromString("0|1|"));
2509
+
2510
+ client_type.setName("AMPS.Client")
2511
+ .setBasicSize(sizeof(obj))
2512
+ .setBaseType()
2513
+ .setDoc(client_class_doc)
2514
+ .setConstructorFunction((void*)_ctor)
2515
+ .setDestructorFunction((void*)destructor)
2516
+ .setHaveGC()
2517
+ .setTraverseFunction((void*)traverse)
2518
+ .setClearFunction((void*)_clear)
2519
+ .setWeakListOffset(sizeof(PyObject))
2520
+ .notCopyable()
2521
+ .addMethod("connect", connect, connect_doc)
2522
+ .addKeywordMethod("logon", logon, logon_doc)
2523
+ .addMethod("execute", execute, execute_doc)
2524
+ .addKeywordMethod("execute_async", execute_async, execute_async_doc)
2525
+ .addMethod("name", getName, name_doc)
2526
+ .addMethod("getName", getName, getName_doc)
2527
+ .addMethod("get_name", getName, get_name_doc)
2528
+ .addMethod("get_name_hash", get_name_hash, get_name_hash_doc)
2529
+ .addMethod("get_name_hash_value", get_name_hash_value, get_name_hash_value_doc)
2530
+ .addMethod("setName", setName, setName_doc)
2531
+ .addMethod("set_name", setName, set_name_doc)
2532
+ .addMethod("get_logon_correlation_data", get_logon_correlation_data,
2533
+ get_logon_correlation_data_doc)
2534
+ .addMethod("set_logon_correlation_data", set_logon_correlation_data,
2535
+ set_logon_correlation_data_doc)
2536
+ .addMethod("get_server_version", get_server_version, get_server_version_doc)
2537
+ .addMethod("get_server_version_info", get_server_version_info,
2538
+ get_server_version_info_doc)
2539
+ .addMethod("convert_version_to_number", convert_version_to_number,
2540
+ convert_version_to_number_doc)
2541
+ .addMethod("get_unpersisted_count", get_unpersisted_count,
2542
+ get_unpersisted_count_doc)
2543
+ .addKeywordMethod("get_uri", getURI, get_uri_doc)
2544
+ .addMethod("disconnect", disconnect, disconnect_doc)
2545
+ .addMethod("close", disconnect, close_doc)
2546
+ .addKeywordMethod("publish", publish, publish_doc)
2547
+ .addKeywordMethod("delta_publish", delta_publish, delta_publish_doc)
2548
+ .addKeywordMethod("deltaPublish", delta_publish, deltaPublish_doc)
2549
+ .addMethod("unsubscribe", unsubscribe, unsubscribe_doc)
2550
+ .addKeywordMethod("send", send, send_doc)
2551
+ .addKeywordMethod("add_message_handler", add_message_handler,
2552
+ add_message_handler_doc)
2553
+ .addMethod("remove_message_handler", remove_message_handler,
2554
+ remove_message_handler_doc)
2555
+ .addMethod("allocate_message", allocate_message, allocate_message_doc)
2556
+ .addMethod("allocateMessage", allocate_message, allocateMessage_doc)
2557
+ .addKeywordMethod("subscribe", subscribe, subscribe_doc)
2558
+ .addKeywordMethod("bookmark_subscribe", bookmark_subscribe,
2559
+ bookmark_subscribe_doc)
2560
+ .addKeywordMethod("sow", sow, sow_doc)
2561
+ .addKeywordMethod("sow_and_subscribe", sow_and_subscribe, sow_and_subscribe_doc)
2562
+ .addKeywordMethod("sowAndSubscribe", sow_and_subscribe, sowAndSubscribe_doc )
2563
+ .addKeywordMethod("sow_and_delta_subscribe", sow_and_delta_subscribe,
2564
+ sow_and_delta_subscribe_doc)
2565
+ .addKeywordMethod("sowAndDeltaSubscribe", sow_and_delta_subscribe,
2566
+ sowAndDeltaSubscribe_doc )
2567
+ .addKeywordMethod("sow_delete", sow_delete, sow_delete_doc)
2568
+ .addKeywordMethod("sowDelete", sow_delete, sowDelete_doc )
2569
+ .addKeywordMethod("sow_delete_by_keys", sow_delete_by_keys,
2570
+ sow_delete_by_keys_doc)
2571
+ .addKeywordMethod("sow_delete_by_data", sow_delete_by_data,
2572
+ sow_delete_by_data_doc)
2573
+ .addKeywordMethod("delta_subscribe", delta_subscribe, delta_subscribe_doc)
2574
+ .addKeywordMethod("deltaSubscribe", delta_subscribe, deltaSubscribe_doc )
2575
+ .addKeywordMethod("bookmark_subscribe", bookmark_subscribe,
2576
+ bookmark_subscribe_doc)
2577
+ .addKeywordMethod("set_heartbeat", set_heartbeat, set_heartbeat_doc)
2578
+ .addMethod("start_timer", start_timer, start_timer_doc)
2579
+ .addMethod("stop_timer", stop_timer, stop_timer_doc)
2580
+ .addMethod("set_disconnect_handler", set_disconnect_handler,
2581
+ set_disconnect_handler_doc)
2582
+ .addMethod("setOnDisconnectHandler", set_disconnect_handler,
2583
+ setOnDisconnectHandler_doc )
2584
+ .addMethod("setDisconnectHandler", set_disconnect_handler,
2585
+ setDisconnectHandler_doc )
2586
+ .addMethod("set_exception_listener", set_exception_listener,
2587
+ set_exception_listener_doc)
2588
+ .addMethod("setExceptionListener", set_exception_listener,
2589
+ setExceptionListener_doc )
2590
+ .addMethod("get_exception_listener", get_exception_listener,
2591
+ get_exception_listener_doc)
2592
+ .addMethod("set_last_chance_message_handler", set_last_chance_message_handler,
2593
+ set_last_chance_message_handler_doc )
2594
+ .addMethod("set_unhandled_message_handler", set_last_chance_message_handler,
2595
+ set_unhandled_message_handler_doc )
2596
+ .addMethod("setUnhandledMessageHandler", set_last_chance_message_handler,
2597
+ setUnhandledMessageHandler_doc )
2598
+ .addMethod("set_duplicate_message_handler", set_duplicate_message_handler,
2599
+ set_duplicate_message_handler_doc)
2600
+ .addMethod("get_duplicate_message_handler", get_duplicate_message_handler,
2601
+ get_duplicate_message_handler_doc)
2602
+ .addKeywordMethod("publish_flush", publish_flush, publish_flush_doc)
2603
+ .addKeywordMethod("flush", publish_flush, flush_doc )
2604
+ .addMethod("set_bookmark_store", set_bookmark_store, set_bookmark_store_doc)
2605
+ .addMethod("set_publish_store", set_publish_store, set_publish_store_doc)
2606
+ .addMethod("set_failed_write_handler", set_failed_write_handler,
2607
+ set_failed_write_handler_doc)
2608
+ .addMethod("add_connection_state_listener", add_connection_state_listener,
2609
+ add_connection_state_listener_doc)
2610
+ .addMethod("remove_connection_state_listener", remove_connection_state_listener,
2611
+ remove_connection_state_listener_doc)
2612
+ .addMethod("set_transport_filter", set_transport_filter,
2613
+ set_transport_filter_doc)
2614
+ .addMethod("set_thread_created_callback", set_thread_created_callback,
2615
+ set_thread_created_callback_doc)
2616
+ .addMethod("ack", ack, ack_doc)
2617
+ .addMethod("set_ack_batch_size", set_ack_batch_size, set_ack_batch_size_doc)
2618
+ .addMethod("get_ack_batch_size", get_ack_batch_size, get_ack_batch_size_doc)
2619
+ .addMethod("set_auto_ack", set_auto_ack, set_auto_ack_doc)
2620
+ .addMethod("get_auto_ack", get_auto_ack, get_auto_ack_doc)
2621
+ .addMethod("set_ack_timeout", set_ack_timeout, set_ack_timeout_doc)
2622
+ .addMethod("get_ack_timeout", get_ack_timeout, get_ack_timeout_doc)
2623
+ .addMethod("set_retry_on_disconnect", set_retry_on_disconnect,
2624
+ set_retry_on_disconnect_doc)
2625
+ .addMethod("get_retry_on_disconnect", get_retry_on_disconnect,
2626
+ get_retry_on_disconnect_doc)
2627
+ .addMethod("set_default_max_depth", set_default_max_depth,
2628
+ set_default_max_depth_doc)
2629
+ .addMethod("get_default_max_depth", get_default_max_depth,
2630
+ get_default_max_depth_doc)
2631
+ .addMethod("set_error_on_publish_gap", set_error_on_publish_gap,
2632
+ set_error_on_publish_gap_doc)
2633
+ .addMethod("get_error_on_publish_gap", get_error_on_publish_gap,
2634
+ get_error_on_publish_gap_doc)
2635
+ .addKeywordMethod("set_global_command_type_message_handler",
2636
+ set_global_command_type_message_handler,
2637
+ set_global_command_type_message_handler_doc)
2638
+ .addGetter("_as_parameter_", (void*)get_as_parameter,
2639
+ "Underlying Client pointer for use with foreign functions and the ctypes module.")
2640
+ .createType()
2641
+ .registerType("Client", module_)
2642
+ .addStatic("Bookmarks", bookmarks_type)
2643
+ .addStatic("ConnectionStateListener",
2644
+ connection_state_listener::connection_state_listener_type);
2645
+ }
2646
+
2647
+ } // namespace client
2648
+ } // namespace ampspy