mt-libcouchbase 1.4.0

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 (707) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +38 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +24 -0
  8. data/README.md +445 -0
  9. data/Rakefile +76 -0
  10. data/ext/README.md +6 -0
  11. data/ext/Rakefile +19 -0
  12. data/ext/libcouchbase/.gitignore +132 -0
  13. data/ext/libcouchbase/CMakeLists.txt +455 -0
  14. data/ext/libcouchbase/CONTRIBUTING.md +105 -0
  15. data/ext/libcouchbase/LICENSE +202 -0
  16. data/ext/libcouchbase/README.markdown +195 -0
  17. data/ext/libcouchbase/RELEASE_NOTES.markdown +3523 -0
  18. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +52 -0
  19. data/ext/libcouchbase/cmake/Modules/CopyPDB.cmake +42 -0
  20. data/ext/libcouchbase/cmake/Modules/DistScript.cmake +17 -0
  21. data/ext/libcouchbase/cmake/Modules/DownloadLcbDep.cmake +18 -0
  22. data/ext/libcouchbase/cmake/Modules/FindCouchbaseHdrHistogram.cmake +15 -0
  23. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibev.cmake +73 -0
  24. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +54 -0
  25. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +57 -0
  26. data/ext/libcouchbase/cmake/Modules/FindProfiler.cmake +16 -0
  27. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +49 -0
  28. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +142 -0
  29. data/ext/libcouchbase/cmake/Modules/GetPlatformCCInfo.cmake +45 -0
  30. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +70 -0
  31. data/ext/libcouchbase/cmake/config-cmake.h.in +80 -0
  32. data/ext/libcouchbase/cmake/configure +355 -0
  33. data/ext/libcouchbase/cmake/defs.mk.in +6 -0
  34. data/ext/libcouchbase/cmake/dtrace-instr-link.pl +51 -0
  35. data/ext/libcouchbase/cmake/libcouchbase.stp.in +829 -0
  36. data/ext/libcouchbase/cmake/source_files.cmake +104 -0
  37. data/ext/libcouchbase/contrib/cJSON/cJSON.c +1022 -0
  38. data/ext/libcouchbase/contrib/cJSON/cJSON.h +158 -0
  39. data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +25 -0
  40. data/ext/libcouchbase/contrib/cbsasl/COPYING +202 -0
  41. data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +259 -0
  42. data/ext/libcouchbase/contrib/cbsasl/src/client.c +419 -0
  43. data/ext/libcouchbase/contrib/cbsasl/src/common.c +50 -0
  44. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.c +67 -0
  45. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.h +33 -0
  46. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.c +296 -0
  47. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.h +45 -0
  48. data/ext/libcouchbase/contrib/cbsasl/src/hash.c +573 -0
  49. data/ext/libcouchbase/contrib/cbsasl/src/hash.h +15 -0
  50. data/ext/libcouchbase/contrib/cbsasl/src/scram-sha/scram_utils.c +500 -0
  51. data/ext/libcouchbase/contrib/cbsasl/src/scram-sha/scram_utils.h +99 -0
  52. data/ext/libcouchbase/contrib/cbsasl/src/util.h +31 -0
  53. data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +2 -0
  54. data/ext/libcouchbase/contrib/cliopts/cliopts.c +938 -0
  55. data/ext/libcouchbase/contrib/cliopts/cliopts.h +610 -0
  56. data/ext/libcouchbase/contrib/genhash/genhash.c +371 -0
  57. data/ext/libcouchbase/contrib/genhash/genhash.h +241 -0
  58. data/ext/libcouchbase/contrib/gtest-1.7.0/CHANGES +157 -0
  59. data/ext/libcouchbase/contrib/gtest-1.7.0/CMakeLists.txt +252 -0
  60. data/ext/libcouchbase/contrib/gtest-1.7.0/CONTRIBUTORS +37 -0
  61. data/ext/libcouchbase/contrib/gtest-1.7.0/LICENSE +28 -0
  62. data/ext/libcouchbase/contrib/gtest-1.7.0/MINIFY.sh +15 -0
  63. data/ext/libcouchbase/contrib/gtest-1.7.0/README +435 -0
  64. data/ext/libcouchbase/contrib/gtest-1.7.0/cmake/internal_utils.cmake +227 -0
  65. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h +294 -0
  66. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-message.h +250 -0
  67. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h +1421 -0
  68. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump +487 -0
  69. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-printers.h +855 -0
  70. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-spi.h +232 -0
  71. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h +179 -0
  72. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h +259 -0
  73. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest.h +2291 -0
  74. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h +358 -0
  75. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_prod.h +58 -0
  76. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h +319 -0
  77. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h +206 -0
  78. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h +1158 -0
  79. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
  80. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h +5143 -0
  81. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
  82. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h +619 -0
  83. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h +1947 -0
  84. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h +167 -0
  85. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h +1012 -0
  86. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump +339 -0
  87. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h +3331 -0
  88. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump +297 -0
  89. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-all.cc +48 -0
  90. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-death-test.cc +1344 -0
  91. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-filepath.cc +382 -0
  92. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-internal-inl.h +1218 -0
  93. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-port.cc +805 -0
  94. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-printers.cc +363 -0
  95. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-test-part.cc +110 -0
  96. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-typed-test.cc +110 -0
  97. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest.cc +5015 -0
  98. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest_main.cc +38 -0
  99. data/ext/libcouchbase/contrib/http_parser/LICENSE-MIT +23 -0
  100. data/ext/libcouchbase/contrib/http_parser/README.md +178 -0
  101. data/ext/libcouchbase/contrib/http_parser/http_parser.c +2060 -0
  102. data/ext/libcouchbase/contrib/http_parser/http_parser.h +321 -0
  103. data/ext/libcouchbase/contrib/jsonsl/LICENSE +20 -0
  104. data/ext/libcouchbase/contrib/jsonsl/jsonsl.c +1452 -0
  105. data/ext/libcouchbase/contrib/jsonsl/jsonsl.h +971 -0
  106. data/ext/libcouchbase/contrib/lcb-jsoncpp/CMakeLists.txt +6 -0
  107. data/ext/libcouchbase/contrib/lcb-jsoncpp/LICENSE +55 -0
  108. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp-forwards.h +255 -0
  109. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +4893 -0
  110. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.h +1961 -0
  111. data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +7 -0
  112. data/ext/libcouchbase/contrib/snappy/COPYING +28 -0
  113. data/ext/libcouchbase/contrib/snappy/snappy-c.cc +90 -0
  114. data/ext/libcouchbase/contrib/snappy/snappy-c.h +138 -0
  115. data/ext/libcouchbase/contrib/snappy/snappy-internal.h +150 -0
  116. data/ext/libcouchbase/contrib/snappy/snappy-lcb-msvc.h +5 -0
  117. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +75 -0
  118. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.h +137 -0
  119. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.cc +42 -0
  120. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.h +491 -0
  121. data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +100 -0
  122. data/ext/libcouchbase/contrib/snappy/snappy.cc +1312 -0
  123. data/ext/libcouchbase/contrib/snappy/snappy.h +184 -0
  124. data/ext/libcouchbase/contrib/win32-defs/iocpdefs.h +133 -0
  125. data/ext/libcouchbase/contrib/win32-defs/mingwdefs.h +4396 -0
  126. data/ext/libcouchbase/contrib/win32-defs/win_stdint.h +258 -0
  127. data/ext/libcouchbase/doc/Doxyfile +2495 -0
  128. data/ext/libcouchbase/doc/DoxygenLayout.xml +109 -0
  129. data/ext/libcouchbase/doc/Makefile +44 -0
  130. data/ext/libcouchbase/doc/apiattr.h +117 -0
  131. data/ext/libcouchbase/doc/cbc-n1qlback.markdown +88 -0
  132. data/ext/libcouchbase/doc/cbc-pillowfight.markdown +296 -0
  133. data/ext/libcouchbase/doc/cbc-subdoc.markdown +299 -0
  134. data/ext/libcouchbase/doc/cbc.markdown +763 -0
  135. data/ext/libcouchbase/doc/cbcrc.markdown +52 -0
  136. data/ext/libcouchbase/doc/common-additional-options.markdown +82 -0
  137. data/ext/libcouchbase/doc/common-options.markdown +71 -0
  138. data/ext/libcouchbase/doc/environment.h +93 -0
  139. data/ext/libcouchbase/doc/example/threads.c +77 -0
  140. data/ext/libcouchbase/doc/footer.html +22 -0
  141. data/ext/libcouchbase/doc/genman.sh +25 -0
  142. data/ext/libcouchbase/doc/header.html +52 -0
  143. data/ext/libcouchbase/doc/intro.h +130 -0
  144. data/ext/libcouchbase/doc/mainpage.h +136 -0
  145. data/ext/libcouchbase/doc/man/cbc-admin.1 +1 -0
  146. data/ext/libcouchbase/doc/man/cbc-bucket-create.1 +1 -0
  147. data/ext/libcouchbase/doc/man/cbc-bucket-delete.1 +1 -0
  148. data/ext/libcouchbase/doc/man/cbc-cat.1 +1 -0
  149. data/ext/libcouchbase/doc/man/cbc-connstr.1 +1 -0
  150. data/ext/libcouchbase/doc/man/cbc-cp.1 +1 -0
  151. data/ext/libcouchbase/doc/man/cbc-create.1 +1 -0
  152. data/ext/libcouchbase/doc/man/cbc-decr.1 +1 -0
  153. data/ext/libcouchbase/doc/man/cbc-flush.1 +1 -0
  154. data/ext/libcouchbase/doc/man/cbc-hash.1 +1 -0
  155. data/ext/libcouchbase/doc/man/cbc-incr.1 +1 -0
  156. data/ext/libcouchbase/doc/man/cbc-lock.1 +1 -0
  157. data/ext/libcouchbase/doc/man/cbc-mcflush.1 +1 -0
  158. data/ext/libcouchbase/doc/man/cbc-mcversion.1 +1 -0
  159. data/ext/libcouchbase/doc/man/cbc-n1ql.1 +1 -0
  160. data/ext/libcouchbase/doc/man/cbc-n1qlback.1 +198 -0
  161. data/ext/libcouchbase/doc/man/cbc-observe.1 +1 -0
  162. data/ext/libcouchbase/doc/man/cbc-pillowfight.1 +499 -0
  163. data/ext/libcouchbase/doc/man/cbc-ping.1 +1 -0
  164. data/ext/libcouchbase/doc/man/cbc-rm.1 +1 -0
  165. data/ext/libcouchbase/doc/man/cbc-role-list.1 +1 -0
  166. data/ext/libcouchbase/doc/man/cbc-stats.1 +1 -0
  167. data/ext/libcouchbase/doc/man/cbc-subdoc.1 +494 -0
  168. data/ext/libcouchbase/doc/man/cbc-unlock.1 +1 -0
  169. data/ext/libcouchbase/doc/man/cbc-user-delete.1 +1 -0
  170. data/ext/libcouchbase/doc/man/cbc-user-list.1 +1 -0
  171. data/ext/libcouchbase/doc/man/cbc-user-upsert.1 +1 -0
  172. data/ext/libcouchbase/doc/man/cbc-verbosity.1 +1 -0
  173. data/ext/libcouchbase/doc/man/cbc-version.1 +1 -0
  174. data/ext/libcouchbase/doc/man/cbc-view.1 +1 -0
  175. data/ext/libcouchbase/doc/man/cbc-watch.1 +1 -0
  176. data/ext/libcouchbase/doc/man/cbc.1 +1035 -0
  177. data/ext/libcouchbase/doc/man/cbcrc.4 +71 -0
  178. data/ext/libcouchbase/doc/style.css +1162 -0
  179. data/ext/libcouchbase/example/CMakeLists.txt +52 -0
  180. data/ext/libcouchbase/example/README.markdown +47 -0
  181. data/ext/libcouchbase/example/analytics/.gitignore +1 -0
  182. data/ext/libcouchbase/example/analytics/analytics.c +158 -0
  183. data/ext/libcouchbase/example/analytics/build-queries.rb +34 -0
  184. data/ext/libcouchbase/example/analytics/cJSON.c +1 -0
  185. data/ext/libcouchbase/example/analytics/cJSON.h +1 -0
  186. data/ext/libcouchbase/example/analytics/queries/00-show-dataverse.json +5 -0
  187. data/ext/libcouchbase/example/analytics/queries/01-setup-dataset-breweries.json +6 -0
  188. data/ext/libcouchbase/example/analytics/queries/02-setup-dataset-beers.json +6 -0
  189. data/ext/libcouchbase/example/analytics/queries/03-initiate-shadow.json +6 -0
  190. data/ext/libcouchbase/example/analytics/queries/04-list-datasets.json +7 -0
  191. data/ext/libcouchbase/example/analytics/queries/05-count-breweries.json +5 -0
  192. data/ext/libcouchbase/example/analytics/queries/06-first-brewery.json +6 -0
  193. data/ext/libcouchbase/example/analytics/queries/07-key-based-lookup.json +6 -0
  194. data/ext/libcouchbase/example/analytics/queries/08-exact-match-lookup.json +7 -0
  195. data/ext/libcouchbase/example/analytics/queries/09-exact-match-lookup-different-shape.json +6 -0
  196. data/ext/libcouchbase/example/analytics/queries/10-other-query-filters.json +6 -0
  197. data/ext/libcouchbase/example/analytics/queries/11-equijoin.json +9 -0
  198. data/ext/libcouchbase/example/analytics/queries/12-equijoin-select-star.json +10 -0
  199. data/ext/libcouchbase/example/analytics/queries/13-ansi-join.json +8 -0
  200. data/ext/libcouchbase/example/analytics/queries/14-join-select-values.json +8 -0
  201. data/ext/libcouchbase/example/analytics/queries/15-nested-outer-join.json +7 -0
  202. data/ext/libcouchbase/example/analytics/queries/16-theta-join.json +8 -0
  203. data/ext/libcouchbase/example/analytics/queries/17-existential-quantification.json +9 -0
  204. data/ext/libcouchbase/example/analytics/queries/18-universal-quantification.json +7 -0
  205. data/ext/libcouchbase/example/analytics/queries/19-simple-aggregation.json +6 -0
  206. data/ext/libcouchbase/example/analytics/queries/20-simple-aggregation-unwrapped-value.json +6 -0
  207. data/ext/libcouchbase/example/analytics/queries/21-simple-aggregation-explicit.json +6 -0
  208. data/ext/libcouchbase/example/analytics/queries/22-grouping-and-aggregation.json +6 -0
  209. data/ext/libcouchbase/example/analytics/queries/23-grouping-and-aggregation-with-hint.json +7 -0
  210. data/ext/libcouchbase/example/analytics/queries/24-grouping-and-limits.json +7 -0
  211. data/ext/libcouchbase/example/analytics/queries/25-named-parameters.json +7 -0
  212. data/ext/libcouchbase/example/analytics/queries/26-positional-parameters.json +7 -0
  213. data/ext/libcouchbase/example/analytics/queries.h +113 -0
  214. data/ext/libcouchbase/example/crypto/.gitignore +2 -0
  215. data/ext/libcouchbase/example/crypto/Makefile +13 -0
  216. data/ext/libcouchbase/example/crypto/common_provider.c +26 -0
  217. data/ext/libcouchbase/example/crypto/common_provider.h +33 -0
  218. data/ext/libcouchbase/example/crypto/openssl_symmetric_decrypt.c +144 -0
  219. data/ext/libcouchbase/example/crypto/openssl_symmetric_encrypt.c +146 -0
  220. data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.c +271 -0
  221. data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.h +29 -0
  222. data/ext/libcouchbase/example/db/db.c +171 -0
  223. data/ext/libcouchbase/example/db/vb.c +227 -0
  224. data/ext/libcouchbase/example/fts/.gitignore +1 -0
  225. data/ext/libcouchbase/example/fts/build-queries.rb +33 -0
  226. data/ext/libcouchbase/example/fts/fts.c +142 -0
  227. data/ext/libcouchbase/example/fts/queries/00-simple-text-query.json +12 -0
  228. data/ext/libcouchbase/example/fts/queries/01-simple-text-query-on-non-default-index.json +9 -0
  229. data/ext/libcouchbase/example/fts/queries/02-simple-text-query-on-stored-field.json +13 -0
  230. data/ext/libcouchbase/example/fts/queries/03-match-query-with-facet.json +19 -0
  231. data/ext/libcouchbase/example/fts/queries/04-docid-query.json +11 -0
  232. data/ext/libcouchbase/example/fts/queries/05-unanalyzed-term-query-with-fuzziness-level-of-0.json +13 -0
  233. data/ext/libcouchbase/example/fts/queries/06-unanalyzed-term-query-with-fuzziness-level-of-2.json +14 -0
  234. data/ext/libcouchbase/example/fts/queries/07-match-phrase-query.json +13 -0
  235. data/ext/libcouchbase/example/fts/queries/08-phrase-query.json +16 -0
  236. data/ext/libcouchbase/example/fts/queries/09-query-string-query.json +9 -0
  237. data/ext/libcouchbase/example/fts/queries/10-conjunction-query.json +21 -0
  238. data/ext/libcouchbase/example/fts/queries/11-wild-card-query.json +13 -0
  239. data/ext/libcouchbase/example/fts/queries/12-numeric-range-query.json +11 -0
  240. data/ext/libcouchbase/example/fts/queries/13-regexp-query.json +13 -0
  241. data/ext/libcouchbase/example/fts/queries.h +61 -0
  242. data/ext/libcouchbase/example/instancepool/main.cc +112 -0
  243. data/ext/libcouchbase/example/instancepool/pool.cc +102 -0
  244. data/ext/libcouchbase/example/instancepool/pool.h +69 -0
  245. data/ext/libcouchbase/example/libeventdirect/main.c +222 -0
  246. data/ext/libcouchbase/example/mcc/mcc.cc +246 -0
  247. data/ext/libcouchbase/example/minimal/.gitignore +1 -0
  248. data/ext/libcouchbase/example/minimal/minimal.c +132 -0
  249. data/ext/libcouchbase/example/minimal/query.c +185 -0
  250. data/ext/libcouchbase/example/observe/durability.c +102 -0
  251. data/ext/libcouchbase/example/observe/observe.c +159 -0
  252. data/ext/libcouchbase/example/subdoc/subdoc-multi.cc +143 -0
  253. data/ext/libcouchbase/example/subdoc/subdoc-simple.cc +201 -0
  254. data/ext/libcouchbase/example/subdoc/subdoc-xattrs.c +286 -0
  255. data/ext/libcouchbase/example/tick/tick.c +119 -0
  256. data/ext/libcouchbase/example/tracing/.gitignore +2 -0
  257. data/ext/libcouchbase/example/tracing/Makefile +8 -0
  258. data/ext/libcouchbase/example/tracing/cJSON.c +1 -0
  259. data/ext/libcouchbase/example/tracing/cJSON.h +1 -0
  260. data/ext/libcouchbase/example/tracing/tracing.c +439 -0
  261. data/ext/libcouchbase/example/tracing/views.c +444 -0
  262. data/ext/libcouchbase/example/users/README +48 -0
  263. data/ext/libcouchbase/example/users/users.c +147 -0
  264. data/ext/libcouchbase/example/views/views-example.cc +83 -0
  265. data/ext/libcouchbase/include/libcouchbase/_cxxwrap.h +150 -0
  266. data/ext/libcouchbase/include/libcouchbase/api-legacy.h +1689 -0
  267. data/ext/libcouchbase/include/libcouchbase/api3.h +2 -0
  268. data/ext/libcouchbase/include/libcouchbase/assert.h +44 -0
  269. data/ext/libcouchbase/include/libcouchbase/auth.h +297 -0
  270. data/ext/libcouchbase/include/libcouchbase/cbft.h +151 -0
  271. data/ext/libcouchbase/include/libcouchbase/cntl-private.h +319 -0
  272. data/ext/libcouchbase/include/libcouchbase/cntl.h +1418 -0
  273. data/ext/libcouchbase/include/libcouchbase/configuration.h.in +29 -0
  274. data/ext/libcouchbase/include/libcouchbase/couchbase.h +4089 -0
  275. data/ext/libcouchbase/include/libcouchbase/crypto.h +306 -0
  276. data/ext/libcouchbase/include/libcouchbase/deprecated.h +312 -0
  277. data/ext/libcouchbase/include/libcouchbase/error.h +680 -0
  278. data/ext/libcouchbase/include/libcouchbase/http.h +1 -0
  279. data/ext/libcouchbase/include/libcouchbase/iops.h +1053 -0
  280. data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +263 -0
  281. data/ext/libcouchbase/include/libcouchbase/kvbuf.h +137 -0
  282. data/ext/libcouchbase/include/libcouchbase/metrics.h +79 -0
  283. data/ext/libcouchbase/include/libcouchbase/n1ql.h +539 -0
  284. data/ext/libcouchbase/include/libcouchbase/pktfwd.h +270 -0
  285. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +370 -0
  286. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr-inl.c +76 -0
  287. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr.h +199 -0
  288. data/ext/libcouchbase/include/libcouchbase/subdoc.h +347 -0
  289. data/ext/libcouchbase/include/libcouchbase/sysdefs.h +98 -0
  290. data/ext/libcouchbase/include/libcouchbase/tracing.h +437 -0
  291. data/ext/libcouchbase/include/libcouchbase/vbucket.h +680 -0
  292. data/ext/libcouchbase/include/libcouchbase/views.h +357 -0
  293. data/ext/libcouchbase/include/libcouchbase/visibility.h +66 -0
  294. data/ext/libcouchbase/include/memcached/COPYING +30 -0
  295. data/ext/libcouchbase/include/memcached/README +10 -0
  296. data/ext/libcouchbase/include/memcached/protocol_binary.h +885 -0
  297. data/ext/libcouchbase/packaging/README +7 -0
  298. data/ext/libcouchbase/packaging/abicheck/.gitignore +4 -0
  299. data/ext/libcouchbase/packaging/abicheck/Makefile +17 -0
  300. data/ext/libcouchbase/packaging/abicheck/README.md +27 -0
  301. data/ext/libcouchbase/packaging/abicheck/template.xml +3 -0
  302. data/ext/libcouchbase/packaging/deb/compat +1 -0
  303. data/ext/libcouchbase/packaging/deb/control +72 -0
  304. data/ext/libcouchbase/packaging/deb/copyright +10 -0
  305. data/ext/libcouchbase/packaging/deb/libcouchbase-dev.docs +3 -0
  306. data/ext/libcouchbase/packaging/deb/package.mk +31 -0
  307. data/ext/libcouchbase/packaging/deb/rules +46 -0
  308. data/ext/libcouchbase/packaging/deb/source/format +1 -0
  309. data/ext/libcouchbase/packaging/distinfo/README +1 -0
  310. data/ext/libcouchbase/packaging/distinfo/distinfo.cmake.in +4 -0
  311. data/ext/libcouchbase/packaging/dllversion.rc.in +39 -0
  312. data/ext/libcouchbase/packaging/libcouchbase.pc.in +10 -0
  313. data/ext/libcouchbase/packaging/nuget/libcouchbase.autopkg +76 -0
  314. data/ext/libcouchbase/packaging/parse-git-describe.pl +166 -0
  315. data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +101 -0
  316. data/ext/libcouchbase/packaging/rpm/package.mk +40 -0
  317. data/ext/libcouchbase/plugins/io/iocp/CMakeLists.txt +9 -0
  318. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.c +467 -0
  319. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.h +217 -0
  320. data/ext/libcouchbase/plugins/io/iocp/iocp_loop.c +295 -0
  321. data/ext/libcouchbase/plugins/io/iocp/iocp_timer.c +79 -0
  322. data/ext/libcouchbase/plugins/io/iocp/iocp_util.c +229 -0
  323. data/ext/libcouchbase/plugins/io/libev/CMakeLists.txt +31 -0
  324. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +66 -0
  325. data/ext/libcouchbase/plugins/io/libev/plugin-libev.c +289 -0
  326. data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +31 -0
  327. data/ext/libcouchbase/plugins/io/libevent/libevent_io_opts.h +67 -0
  328. data/ext/libcouchbase/plugins/io/libevent/plugin-libevent.c +292 -0
  329. data/ext/libcouchbase/plugins/io/libuv/CMakeLists.txt +44 -0
  330. data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +218 -0
  331. data/ext/libcouchbase/plugins/io/libuv/libuv_io_opts.h +118 -0
  332. data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +155 -0
  333. data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +709 -0
  334. data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +13 -0
  335. data/ext/libcouchbase/plugins/io/select/plugin-select.c +451 -0
  336. data/ext/libcouchbase/plugins/io/select/select_io_opts.h +39 -0
  337. data/ext/libcouchbase/src/README.md +101 -0
  338. data/ext/libcouchbase/src/aspend.h +105 -0
  339. data/ext/libcouchbase/src/auth-priv.h +85 -0
  340. data/ext/libcouchbase/src/auth.cc +146 -0
  341. data/ext/libcouchbase/src/bootstrap.cc +263 -0
  342. data/ext/libcouchbase/src/bootstrap.h +149 -0
  343. data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +450 -0
  344. data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
  345. data/ext/libcouchbase/src/bucketconfig/bc_http.cc +527 -0
  346. data/ext/libcouchbase/src/bucketconfig/bc_http.h +107 -0
  347. data/ext/libcouchbase/src/bucketconfig/bc_static.cc +150 -0
  348. data/ext/libcouchbase/src/bucketconfig/clconfig.h +700 -0
  349. data/ext/libcouchbase/src/bucketconfig/confmon.cc +403 -0
  350. data/ext/libcouchbase/src/callbacks.c +380 -0
  351. data/ext/libcouchbase/src/cbft.cc +253 -0
  352. data/ext/libcouchbase/src/cntl.cc +1057 -0
  353. data/ext/libcouchbase/src/config_static.h +176 -0
  354. data/ext/libcouchbase/src/connspec.cc +555 -0
  355. data/ext/libcouchbase/src/connspec.h +155 -0
  356. data/ext/libcouchbase/src/crypto.cc +399 -0
  357. data/ext/libcouchbase/src/ctx-log-inl.h +44 -0
  358. data/ext/libcouchbase/src/dns-srv.cc +146 -0
  359. data/ext/libcouchbase/src/dump.cc +103 -0
  360. data/ext/libcouchbase/src/errmap.cc +173 -0
  361. data/ext/libcouchbase/src/errmap.h +271 -0
  362. data/ext/libcouchbase/src/getconfig.cc +72 -0
  363. data/ext/libcouchbase/src/gethrtime.c +109 -0
  364. data/ext/libcouchbase/src/handler.cc +1101 -0
  365. data/ext/libcouchbase/src/hashtable.c +75 -0
  366. data/ext/libcouchbase/src/hdr_timings.c +92 -0
  367. data/ext/libcouchbase/src/hostlist.cc +293 -0
  368. data/ext/libcouchbase/src/hostlist.h +160 -0
  369. data/ext/libcouchbase/src/http/http-priv.h +326 -0
  370. data/ext/libcouchbase/src/http/http.cc +672 -0
  371. data/ext/libcouchbase/src/http/http.h +1 -0
  372. data/ext/libcouchbase/src/http/http_io.cc +316 -0
  373. data/ext/libcouchbase/src/instance.cc +917 -0
  374. data/ext/libcouchbase/src/internal.h +285 -0
  375. data/ext/libcouchbase/src/iofactory.c +575 -0
  376. data/ext/libcouchbase/src/jsparse/parser.cc +445 -0
  377. data/ext/libcouchbase/src/jsparse/parser.h +159 -0
  378. data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
  379. data/ext/libcouchbase/src/lcbht/lcbht.h +210 -0
  380. data/ext/libcouchbase/src/lcbio/connect.cc +603 -0
  381. data/ext/libcouchbase/src/lcbio/connect.h +400 -0
  382. data/ext/libcouchbase/src/lcbio/ctx.c +658 -0
  383. data/ext/libcouchbase/src/lcbio/ctx.h +405 -0
  384. data/ext/libcouchbase/src/lcbio/iotable.c +290 -0
  385. data/ext/libcouchbase/src/lcbio/iotable.h +169 -0
  386. data/ext/libcouchbase/src/lcbio/ioutils.cc +356 -0
  387. data/ext/libcouchbase/src/lcbio/ioutils.h +144 -0
  388. data/ext/libcouchbase/src/lcbio/lcbio.h +51 -0
  389. data/ext/libcouchbase/src/lcbio/manager.cc +579 -0
  390. data/ext/libcouchbase/src/lcbio/manager.h +195 -0
  391. data/ext/libcouchbase/src/lcbio/protoctx.c +84 -0
  392. data/ext/libcouchbase/src/lcbio/rw-inl.h +137 -0
  393. data/ext/libcouchbase/src/lcbio/ssl.h +159 -0
  394. data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
  395. data/ext/libcouchbase/src/lcbio/timer-ng.h +179 -0
  396. data/ext/libcouchbase/src/lcbio/timer.c +132 -0
  397. data/ext/libcouchbase/src/legacy.c +431 -0
  398. data/ext/libcouchbase/src/list.c +144 -0
  399. data/ext/libcouchbase/src/list.h +127 -0
  400. data/ext/libcouchbase/src/logging.c +244 -0
  401. data/ext/libcouchbase/src/logging.h +88 -0
  402. data/ext/libcouchbase/src/mc/compress.cc +171 -0
  403. data/ext/libcouchbase/src/mc/compress.h +56 -0
  404. data/ext/libcouchbase/src/mc/forward.c +186 -0
  405. data/ext/libcouchbase/src/mc/forward.h +90 -0
  406. data/ext/libcouchbase/src/mc/iovcursor-inl.h +279 -0
  407. data/ext/libcouchbase/src/mc/iovcursor.h +66 -0
  408. data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +115 -0
  409. data/ext/libcouchbase/src/mc/mcreq.c +983 -0
  410. data/ext/libcouchbase/src/mc/mcreq.h +1015 -0
  411. data/ext/libcouchbase/src/mcserver/mcserver.cc +1055 -0
  412. data/ext/libcouchbase/src/mcserver/mcserver.h +221 -0
  413. data/ext/libcouchbase/src/mcserver/negotiate.cc +757 -0
  414. data/ext/libcouchbase/src/mcserver/negotiate.h +128 -0
  415. data/ext/libcouchbase/src/mctx-helper.h +62 -0
  416. data/ext/libcouchbase/src/metrics.cc +132 -0
  417. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +857 -0
  418. data/ext/libcouchbase/src/n1ql/n1ql-internal.h +22 -0
  419. data/ext/libcouchbase/src/n1ql/n1ql.cc +830 -0
  420. data/ext/libcouchbase/src/n1ql/params.cc +260 -0
  421. data/ext/libcouchbase/src/netbuf/netbuf-defs.h +89 -0
  422. data/ext/libcouchbase/src/netbuf/netbuf-mblock.h +235 -0
  423. data/ext/libcouchbase/src/netbuf/netbuf.c +929 -0
  424. data/ext/libcouchbase/src/netbuf/netbuf.h +452 -0
  425. data/ext/libcouchbase/src/newconfig.cc +365 -0
  426. data/ext/libcouchbase/src/nodeinfo.cc +184 -0
  427. data/ext/libcouchbase/src/operations/cbflush.cc +63 -0
  428. data/ext/libcouchbase/src/operations/counter.cc +117 -0
  429. data/ext/libcouchbase/src/operations/durability-cas.cc +251 -0
  430. data/ext/libcouchbase/src/operations/durability-seqno.cc +170 -0
  431. data/ext/libcouchbase/src/operations/durability.cc +668 -0
  432. data/ext/libcouchbase/src/operations/durability_internal.h +306 -0
  433. data/ext/libcouchbase/src/operations/get.cc +409 -0
  434. data/ext/libcouchbase/src/operations/observe-seqno.cc +94 -0
  435. data/ext/libcouchbase/src/operations/observe.cc +367 -0
  436. data/ext/libcouchbase/src/operations/ping.cc +496 -0
  437. data/ext/libcouchbase/src/operations/pktfwd.cc +86 -0
  438. data/ext/libcouchbase/src/operations/remove.cc +84 -0
  439. data/ext/libcouchbase/src/operations/stats.cc +459 -0
  440. data/ext/libcouchbase/src/operations/store.cc +358 -0
  441. data/ext/libcouchbase/src/operations/subdoc.cc +614 -0
  442. data/ext/libcouchbase/src/operations/touch.cc +84 -0
  443. data/ext/libcouchbase/src/packetutils.h +388 -0
  444. data/ext/libcouchbase/src/probes.d +182 -0
  445. data/ext/libcouchbase/src/rdb/bigalloc.c +225 -0
  446. data/ext/libcouchbase/src/rdb/bigalloc.h +73 -0
  447. data/ext/libcouchbase/src/rdb/chunkalloc.c +174 -0
  448. data/ext/libcouchbase/src/rdb/libcalloc.c +94 -0
  449. data/ext/libcouchbase/src/rdb/rope.c +419 -0
  450. data/ext/libcouchbase/src/rdb/rope.h +488 -0
  451. data/ext/libcouchbase/src/retrychk.cc +113 -0
  452. data/ext/libcouchbase/src/retryq.cc +458 -0
  453. data/ext/libcouchbase/src/retryq.h +170 -0
  454. data/ext/libcouchbase/src/ringbuffer.c +442 -0
  455. data/ext/libcouchbase/src/ringbuffer.h +100 -0
  456. data/ext/libcouchbase/src/rnd.cc +61 -0
  457. data/ext/libcouchbase/src/rnd.h +39 -0
  458. data/ext/libcouchbase/src/settings.c +125 -0
  459. data/ext/libcouchbase/src/settings.h +273 -0
  460. data/ext/libcouchbase/src/sllist-inl.h +197 -0
  461. data/ext/libcouchbase/src/sllist.h +76 -0
  462. data/ext/libcouchbase/src/ssl/CMakeLists.txt +11 -0
  463. data/ext/libcouchbase/src/ssl/ssl_c.c +442 -0
  464. data/ext/libcouchbase/src/ssl/ssl_common.c +478 -0
  465. data/ext/libcouchbase/src/ssl/ssl_e.c +421 -0
  466. data/ext/libcouchbase/src/ssl/ssl_iot_common.h +182 -0
  467. data/ext/libcouchbase/src/strcodecs/base64.c +307 -0
  468. data/ext/libcouchbase/src/strcodecs/strcodecs.h +302 -0
  469. data/ext/libcouchbase/src/timings.c +207 -0
  470. data/ext/libcouchbase/src/trace.h +117 -0
  471. data/ext/libcouchbase/src/tracing/span.cc +421 -0
  472. data/ext/libcouchbase/src/tracing/threshold_logging_tracer.cc +213 -0
  473. data/ext/libcouchbase/src/tracing/tracer.cc +53 -0
  474. data/ext/libcouchbase/src/tracing/tracing-internal.h +198 -0
  475. data/ext/libcouchbase/src/utilities.c +176 -0
  476. data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -0
  477. data/ext/libcouchbase/src/vbucket/aliases.h +35 -0
  478. data/ext/libcouchbase/src/vbucket/crc32.h +83 -0
  479. data/ext/libcouchbase/src/vbucket/hash.h +30 -0
  480. data/ext/libcouchbase/src/vbucket/json-inl.h +112 -0
  481. data/ext/libcouchbase/src/vbucket/ketama.c +66 -0
  482. data/ext/libcouchbase/src/vbucket/rfc1321/global.h +32 -0
  483. data/ext/libcouchbase/src/vbucket/rfc1321/md5.h +35 -0
  484. data/ext/libcouchbase/src/vbucket/rfc1321/md5c-inl.h +335 -0
  485. data/ext/libcouchbase/src/vbucket/vbucket.c +1735 -0
  486. data/ext/libcouchbase/src/views/docreq.cc +213 -0
  487. data/ext/libcouchbase/src/views/docreq.h +94 -0
  488. data/ext/libcouchbase/src/views/viewreq.cc +381 -0
  489. data/ext/libcouchbase/src/views/viewreq.h +87 -0
  490. data/ext/libcouchbase/src/wait.cc +156 -0
  491. data/ext/libcouchbase/tests/CMakeLists.txt +149 -0
  492. data/ext/libcouchbase/tests/basic/t_base64.cc +109 -0
  493. data/ext/libcouchbase/tests/basic/t_ccbc103.cc +95 -0
  494. data/ext/libcouchbase/tests/basic/t_connstr.cc +456 -0
  495. data/ext/libcouchbase/tests/basic/t_creds.cc +96 -0
  496. data/ext/libcouchbase/tests/basic/t_ctlcodes.cc +92 -0
  497. data/ext/libcouchbase/tests/basic/t_host.cc +210 -0
  498. data/ext/libcouchbase/tests/basic/t_jsparse.cc +82 -0
  499. data/ext/libcouchbase/tests/basic/t_jsparse.h +589 -0
  500. data/ext/libcouchbase/tests/basic/t_list.cc +155 -0
  501. data/ext/libcouchbase/tests/basic/t_logger.cc +65 -0
  502. data/ext/libcouchbase/tests/basic/t_misc.cc +24 -0
  503. data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +17 -0
  504. data/ext/libcouchbase/tests/basic/t_netbuf.cc +446 -0
  505. data/ext/libcouchbase/tests/basic/t_packet.cc +215 -0
  506. data/ext/libcouchbase/tests/basic/t_ringbuffer.cc +278 -0
  507. data/ext/libcouchbase/tests/basic/t_scram.cc +514 -0
  508. data/ext/libcouchbase/tests/basic/t_slist.cc +429 -0
  509. data/ext/libcouchbase/tests/basic/t_strerror.cc +64 -0
  510. data/ext/libcouchbase/tests/basic/t_urlencode.cc +132 -0
  511. data/ext/libcouchbase/tests/check-all.cc +612 -0
  512. data/ext/libcouchbase/tests/htparse/t_basic.cc +173 -0
  513. data/ext/libcouchbase/tests/ioserver/connection.cc +166 -0
  514. data/ext/libcouchbase/tests/ioserver/future.cc +50 -0
  515. data/ext/libcouchbase/tests/ioserver/ioserver.cc +117 -0
  516. data/ext/libcouchbase/tests/ioserver/ioserver.h +478 -0
  517. data/ext/libcouchbase/tests/ioserver/socket.cc +88 -0
  518. data/ext/libcouchbase/tests/ioserver/ssl_connection.cc +145 -0
  519. data/ext/libcouchbase/tests/ioserver/threads-pthreads.cc +119 -0
  520. data/ext/libcouchbase/tests/ioserver/threads-win32.cc +117 -0
  521. data/ext/libcouchbase/tests/ioserver/threads.h +66 -0
  522. data/ext/libcouchbase/tests/iotests/iotests.h +15 -0
  523. data/ext/libcouchbase/tests/iotests/mock-environment.cc +632 -0
  524. data/ext/libcouchbase/tests/iotests/mock-environment.h +480 -0
  525. data/ext/libcouchbase/tests/iotests/mock-unit-test.cc +67 -0
  526. data/ext/libcouchbase/tests/iotests/mock-unit-test.h +61 -0
  527. data/ext/libcouchbase/tests/iotests/serverparams.h +76 -0
  528. data/ext/libcouchbase/tests/iotests/t_arithmetic.cc +143 -0
  529. data/ext/libcouchbase/tests/iotests/t_behavior.cc +220 -0
  530. data/ext/libcouchbase/tests/iotests/t_configcache.cc +117 -0
  531. data/ext/libcouchbase/tests/iotests/t_confmon.cc +223 -0
  532. data/ext/libcouchbase/tests/iotests/t_durability.cc +1108 -0
  533. data/ext/libcouchbase/tests/iotests/t_eerrs.cc +121 -0
  534. data/ext/libcouchbase/tests/iotests/t_errmap.cc +181 -0
  535. data/ext/libcouchbase/tests/iotests/t_forward.cc +118 -0
  536. data/ext/libcouchbase/tests/iotests/t_get.cc +512 -0
  537. data/ext/libcouchbase/tests/iotests/t_http.cc +438 -0
  538. data/ext/libcouchbase/tests/iotests/t_iops.cc +175 -0
  539. data/ext/libcouchbase/tests/iotests/t_lock.cc +274 -0
  540. data/ext/libcouchbase/tests/iotests/t_misc.cc +777 -0
  541. data/ext/libcouchbase/tests/iotests/t_mutate.cc +609 -0
  542. data/ext/libcouchbase/tests/iotests/t_n1ql.cc +270 -0
  543. data/ext/libcouchbase/tests/iotests/t_netfail.cc +778 -0
  544. data/ext/libcouchbase/tests/iotests/t_obseqno.cc +156 -0
  545. data/ext/libcouchbase/tests/iotests/t_regression.cc +321 -0
  546. data/ext/libcouchbase/tests/iotests/t_sched.cc +87 -0
  547. data/ext/libcouchbase/tests/iotests/t_serverops.cc +231 -0
  548. data/ext/libcouchbase/tests/iotests/t_smoke.cc +528 -0
  549. data/ext/libcouchbase/tests/iotests/t_snappy.cc +316 -0
  550. data/ext/libcouchbase/tests/iotests/t_subdoc.cc +857 -0
  551. data/ext/libcouchbase/tests/iotests/t_syncmode.cc +64 -0
  552. data/ext/libcouchbase/tests/iotests/t_views.cc +417 -0
  553. data/ext/libcouchbase/tests/iotests/testutil.cc +251 -0
  554. data/ext/libcouchbase/tests/iotests/testutil.h +163 -0
  555. data/ext/libcouchbase/tests/mc/mctest.h +119 -0
  556. data/ext/libcouchbase/tests/mc/pktmaker.h +101 -0
  557. data/ext/libcouchbase/tests/mc/t_alloc.cc +269 -0
  558. data/ext/libcouchbase/tests/mc/t_context.cc +100 -0
  559. data/ext/libcouchbase/tests/mc/t_flush.cc +185 -0
  560. data/ext/libcouchbase/tests/mc/t_forward.cc +239 -0
  561. data/ext/libcouchbase/tests/mc/t_ioflush.cc +102 -0
  562. data/ext/libcouchbase/tests/mc/t_iovcursor.cc +173 -0
  563. data/ext/libcouchbase/tests/mocksupport/procutil.c +305 -0
  564. data/ext/libcouchbase/tests/mocksupport/procutil.h +89 -0
  565. data/ext/libcouchbase/tests/mocksupport/server.c +391 -0
  566. data/ext/libcouchbase/tests/mocksupport/server.h +72 -0
  567. data/ext/libcouchbase/tests/mocksupport/timeout.c +69 -0
  568. data/ext/libcouchbase/tests/nonio_tests.cc +23 -0
  569. data/ext/libcouchbase/tests/rdb/rdbtest.h +133 -0
  570. data/ext/libcouchbase/tests/rdb/t_basic.cc +128 -0
  571. data/ext/libcouchbase/tests/rdb/t_bigalloc.cc +93 -0
  572. data/ext/libcouchbase/tests/rdb/t_refs.cc +112 -0
  573. data/ext/libcouchbase/tests/socktests/socktest.cc +344 -0
  574. data/ext/libcouchbase/tests/socktests/socktest.h +447 -0
  575. data/ext/libcouchbase/tests/socktests/t_basic.cc +143 -0
  576. data/ext/libcouchbase/tests/socktests/t_ctx.cc +73 -0
  577. data/ext/libcouchbase/tests/socktests/t_manager.cc +159 -0
  578. data/ext/libcouchbase/tests/socktests/t_putex.cc +256 -0
  579. data/ext/libcouchbase/tests/socktests/t_read.cc +187 -0
  580. data/ext/libcouchbase/tests/socktests/t_reentrant.cc +143 -0
  581. data/ext/libcouchbase/tests/socktests/t_ssl.cc +80 -0
  582. data/ext/libcouchbase/tests/socktests/t_write.cc +95 -0
  583. data/ext/libcouchbase/tests/start_mock.bat +15 -0
  584. data/ext/libcouchbase/tests/start_mock.sh +42 -0
  585. data/ext/libcouchbase/tests/unit_tests.cc +43 -0
  586. data/ext/libcouchbase/tests/vbucket/confdata/bad.json +101 -0
  587. data/ext/libcouchbase/tests/vbucket/confdata/full_25.json +363 -0
  588. data/ext/libcouchbase/tests/vbucket/confdata/ketama_expected.json +2562 -0
  589. data/ext/libcouchbase/tests/vbucket/confdata/map_node_present_nodesext_missing_nodes.json +94 -0
  590. data/ext/libcouchbase/tests/vbucket/confdata/memd_25.json +90 -0
  591. data/ext/libcouchbase/tests/vbucket/confdata/memd_30.json +1 -0
  592. data/ext/libcouchbase/tests/vbucket/confdata/memd_45.json +1 -0
  593. data/ext/libcouchbase/tests/vbucket/confdata/memd_ketama_config.json +31 -0
  594. data/ext/libcouchbase/tests/vbucket/confdata/terse_25.json +291 -0
  595. data/ext/libcouchbase/tests/vbucket/confdata/terse_30.json +1 -0
  596. data/ext/libcouchbase/tests/vbucket/t_config.cc +386 -0
  597. data/ext/libcouchbase/tools/CMakeLists.txt +80 -0
  598. data/ext/libcouchbase/tools/cbc-handlers.h +636 -0
  599. data/ext/libcouchbase/tools/cbc-n1qlback.cc +496 -0
  600. data/ext/libcouchbase/tools/cbc-pillowfight.cc +1230 -0
  601. data/ext/libcouchbase/tools/cbc-proxy.cc +534 -0
  602. data/ext/libcouchbase/tools/cbc-subdoc.cc +825 -0
  603. data/ext/libcouchbase/tools/cbc.cc +1928 -0
  604. data/ext/libcouchbase/tools/common/histogram.cc +44 -0
  605. data/ext/libcouchbase/tools/common/histogram.h +23 -0
  606. data/ext/libcouchbase/tools/common/options.cc +451 -0
  607. data/ext/libcouchbase/tools/common/options.h +90 -0
  608. data/ext/libcouchbase/tools/docgen/docgen.h +495 -0
  609. data/ext/libcouchbase/tools/docgen/loc.h +211 -0
  610. data/ext/libcouchbase/tools/docgen/placeholders.h +211 -0
  611. data/ext/libcouchbase/tools/docgen/seqgen.h +122 -0
  612. data/ext/libcouchbase/tools/extract-packets.rb +110 -0
  613. data/ext/libcouchbase/tools/linenoise/linenoise.c +1199 -0
  614. data/ext/libcouchbase/tools/linenoise/linenoise.h +73 -0
  615. data/lib/mt-libcouchbase/bucket.rb +825 -0
  616. data/lib/mt-libcouchbase/callbacks.rb +69 -0
  617. data/lib/mt-libcouchbase/connection.rb +896 -0
  618. data/lib/mt-libcouchbase/design_docs.rb +92 -0
  619. data/lib/mt-libcouchbase/error.rb +68 -0
  620. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdbase.rb +23 -0
  621. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdcounter.rb +36 -0
  622. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdendure.rb +26 -0
  623. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdfts.rb +24 -0
  624. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdget.rb +30 -0
  625. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdgetreplica.rb +49 -0
  626. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdhttp.rb +58 -0
  627. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdn1ql.rb +40 -0
  628. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdobseqno.rb +33 -0
  629. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdobserve.rb +30 -0
  630. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdstore.rb +40 -0
  631. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdstoredur.rb +45 -0
  632. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdsubdoc.rb +61 -0
  633. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdverbosity.rb +29 -0
  634. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdviewquery.rb +61 -0
  635. data/lib/mt-libcouchbase/ext/mt-libcouchbase/contigbuf.rb +14 -0
  636. data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st.rb +15 -0
  637. data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st0.rb +23 -0
  638. data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st1.rb +26 -0
  639. data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st2.rb +32 -0
  640. data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st3.rb +26 -0
  641. data/lib/mt-libcouchbase/ext/mt-libcouchbase/crst_u.rb +20 -0
  642. data/lib/mt-libcouchbase/ext/mt-libcouchbase/durability_opts_st_v.rb +11 -0
  643. data/lib/mt-libcouchbase/ext/mt-libcouchbase/durability_opts_t.rb +14 -0
  644. data/lib/mt-libcouchbase/ext/mt-libcouchbase/durabilityopt_sv0.rb +63 -0
  645. data/lib/mt-libcouchbase/ext/mt-libcouchbase/enums.rb +1007 -0
  646. data/lib/mt-libcouchbase/ext/mt-libcouchbase/fragbuf.rb +18 -0
  647. data/lib/mt-libcouchbase/ext/mt-libcouchbase/ftshandle.rb +7 -0
  648. data/lib/mt-libcouchbase/ext/mt-libcouchbase/histogram.rb +34 -0
  649. data/lib/mt-libcouchbase/ext/mt-libcouchbase/http_request_t.rb +7 -0
  650. data/lib/mt-libcouchbase/ext/mt-libcouchbase/keybuf.rb +20 -0
  651. data/lib/mt-libcouchbase/ext/mt-libcouchbase/multicmd_ctx.rb +30 -0
  652. data/lib/mt-libcouchbase/ext/mt-libcouchbase/mutation_token.rb +17 -0
  653. data/lib/mt-libcouchbase/ext/mt-libcouchbase/n1qlhandle.rb +7 -0
  654. data/lib/mt-libcouchbase/ext/mt-libcouchbase/n1qlparams.rb +7 -0
  655. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respbase.rb +29 -0
  656. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respcounter.rb +32 -0
  657. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respendure.rb +49 -0
  658. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respfts.rb +40 -0
  659. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respget.rb +44 -0
  660. data/lib/mt-libcouchbase/ext/mt-libcouchbase/resphttp.rb +48 -0
  661. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respmcversion.rb +38 -0
  662. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respn1ql.rb +41 -0
  663. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respobseqno.rb +52 -0
  664. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respobserve.rb +41 -0
  665. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respserverbase.rb +32 -0
  666. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respstats.rb +38 -0
  667. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respstore.rb +32 -0
  668. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respstoredur.rb +38 -0
  669. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respsubdoc.rb +35 -0
  670. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respviewquery.rb +67 -0
  671. data/lib/mt-libcouchbase/ext/mt-libcouchbase/sdentry.rb +22 -0
  672. data/lib/mt-libcouchbase/ext/mt-libcouchbase/sdspec.rb +31 -0
  673. data/lib/mt-libcouchbase/ext/mt-libcouchbase/t.rb +7 -0
  674. data/lib/mt-libcouchbase/ext/mt-libcouchbase/valbuf.rb +22 -0
  675. data/lib/mt-libcouchbase/ext/mt-libcouchbase/valbuf_u_buf.rb +14 -0
  676. data/lib/mt-libcouchbase/ext/mt-libcouchbase/viewhandle.rb +7 -0
  677. data/lib/mt-libcouchbase/ext/mt-libcouchbase.rb +1175 -0
  678. data/lib/mt-libcouchbase/ext/mt-libcouchbase_libuv.rb +22 -0
  679. data/lib/mt-libcouchbase/ext/tasks.rb +39 -0
  680. data/lib/mt-libcouchbase/n1ql.rb +80 -0
  681. data/lib/mt-libcouchbase/query_full_text.rb +147 -0
  682. data/lib/mt-libcouchbase/query_n1ql.rb +123 -0
  683. data/lib/mt-libcouchbase/query_view.rb +135 -0
  684. data/lib/mt-libcouchbase/results_fiber.rb +281 -0
  685. data/lib/mt-libcouchbase/results_native.rb +220 -0
  686. data/lib/mt-libcouchbase/subdoc_request.rb +139 -0
  687. data/lib/mt-libcouchbase/version.rb +5 -0
  688. data/lib/mt-libcouchbase.rb +40 -0
  689. data/mt-libcouchbase.gemspec +68 -0
  690. data/spec/bucket_spec.rb +290 -0
  691. data/spec/connection_spec.rb +257 -0
  692. data/spec/design_docs_spec.rb +31 -0
  693. data/spec/error_spec.rb +26 -0
  694. data/spec/fts_spec.rb +135 -0
  695. data/spec/n1ql_spec.rb +260 -0
  696. data/spec/results_libuv_spec.rb +244 -0
  697. data/spec/results_native_spec.rb +259 -0
  698. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/design.json +1 -0
  699. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/data-0000.cbb +0 -0
  700. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/failover.json +1 -0
  701. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/meta.json +1 -0
  702. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/seqno.json +1 -0
  703. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/snapshot_markers.json +1 -0
  704. data/spec/subdoc_spec.rb +192 -0
  705. data/spec/view_spec.rb +201 -0
  706. data/windows_build.md +36 -0
  707. metadata +873 -0
@@ -0,0 +1,1101 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "internal.h"
19
+ #include "packetutils.h"
20
+ #include "mc/mcreq.h"
21
+ #include "mc/compress.h"
22
+ #include "trace.h"
23
+
24
+ #define LOGARGS(obj, lvl) (obj)->settings, "handler", LCB_LOG_##lvl, __FILE__, __LINE__
25
+
26
+ using lcb::MemcachedResponse;
27
+
28
+ template <typename T>
29
+ class ResponsePack {
30
+ public:
31
+ T resp;
32
+ lcb_MUTATION_TOKEN mt;
33
+ const char *value;
34
+ lcb_SIZE nvalue;
35
+ char *err_ref;
36
+ char *err_ctx;
37
+
38
+ ~ResponsePack() {
39
+ free(err_ref);
40
+ free(err_ctx);
41
+ }
42
+
43
+ static const lcb_MUTATION_TOKEN*
44
+ get_mt(const lcb_RESPBASE *rb) {
45
+ const ResponsePack *rp = reinterpret_cast<const ResponsePack*>(rb);
46
+ return &rp->mt;
47
+ }
48
+
49
+ static const char*
50
+ get_err_ctx(const lcb_RESPBASE *rb) {
51
+ const ResponsePack *rp = reinterpret_cast<const ResponsePack*>(rb);
52
+ if (rp->resp.rflags & LCB_RESP_F_ERRINFO) {
53
+ if (rp->err_ctx) {
54
+ return rp->err_ctx;
55
+ } else {
56
+ parse_enhanced_error(rp);
57
+ return rp->err_ctx;
58
+ }
59
+ }
60
+ return NULL;
61
+ }
62
+
63
+ static const char*
64
+ get_err_ref(const lcb_RESPBASE *rb) {
65
+ const ResponsePack *rp = reinterpret_cast<const ResponsePack*>(rb);
66
+ if (rp->resp.rflags & LCB_RESP_F_ERRINFO) {
67
+ if (rp->err_ref) {
68
+ return rp->err_ref;
69
+ } else {
70
+ parse_enhanced_error(rp);
71
+ return rp->err_ref;
72
+ }
73
+ }
74
+ return NULL;
75
+ }
76
+
77
+ private:
78
+
79
+ static void
80
+ parse_enhanced_error(const ResponsePack *rp) {
81
+ ResponsePack *mrp = const_cast<ResponsePack *>(rp);
82
+ lcb_error_t rc = MemcachedResponse::parse_enhanced_error(mrp->value, mrp->nvalue, &mrp->err_ref, &mrp->err_ctx);
83
+ if (rc != LCB_SUCCESS) {
84
+ mrp->resp.rflags &= ~LCB_RESP_F_ERRINFO;
85
+ }
86
+ }
87
+ };
88
+
89
+ LIBCOUCHBASE_API
90
+ lcb_error_t
91
+ lcb_errmap_default(lcb_t instance, lcb_uint16_t in)
92
+ {
93
+ switch (in) {
94
+ case PROTOCOL_BINARY_RESPONSE_NOT_MY_VBUCKET:
95
+ return LCB_ETIMEDOUT;
96
+ case PROTOCOL_BINARY_RESPONSE_AUTH_CONTINUE:
97
+ return LCB_AUTH_CONTINUE;
98
+ case PROTOCOL_BINARY_RESPONSE_EBUSY:
99
+ return LCB_EBUSY;
100
+ case PROTOCOL_BINARY_RESPONSE_ETMPFAIL:
101
+ return LCB_ETMPFAIL;
102
+
103
+ case PROTOCOL_BINARY_RESPONSE_EINTERNAL:
104
+ default:
105
+ if (instance) {
106
+ lcb_log(LOGARGS(instance, ERROR), "Got unhandled memcached error 0x%X", in);
107
+ } else {
108
+ fprintf(stderr, "COUCHBASE: Unhandled memcached status=0x%x\n", in);
109
+ }
110
+ return LCB_UNKNOWN_MEMCACHED_ERROR;
111
+ }
112
+ }
113
+
114
+ static lcb_error_t
115
+ map_error(lcb_t instance, int in)
116
+ {
117
+ switch (in) {
118
+ case PROTOCOL_BINARY_RESPONSE_SUCCESS:
119
+ return LCB_SUCCESS;
120
+ case PROTOCOL_BINARY_RESPONSE_KEY_ENOENT:
121
+ return LCB_KEY_ENOENT;
122
+ case PROTOCOL_BINARY_RESPONSE_E2BIG:
123
+ return LCB_E2BIG;
124
+ case PROTOCOL_BINARY_RESPONSE_ENOMEM:
125
+ return LCB_ENOMEM;
126
+ case PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS:
127
+ return LCB_KEY_EEXISTS;
128
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_ENOENT:
129
+ return LCB_SUBDOC_PATH_ENOENT;
130
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_MISMATCH:
131
+ return LCB_SUBDOC_PATH_MISMATCH;
132
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_EINVAL:
133
+ return LCB_SUBDOC_PATH_EINVAL;
134
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_E2BIG:
135
+ return LCB_SUBDOC_PATH_E2BIG;
136
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_DOC_E2DEEP:
137
+ return LCB_SUBDOC_DOC_E2DEEP;
138
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_VALUE_ETOODEEP:
139
+ return LCB_SUBDOC_VALUE_E2DEEP;
140
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_VALUE_CANTINSERT:
141
+ return LCB_SUBDOC_VALUE_CANTINSERT;
142
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_DOC_NOTJSON:
143
+ return LCB_SUBDOC_DOC_NOTJSON;
144
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_NUM_ERANGE:
145
+ return LCB_SUBDOC_NUM_ERANGE;
146
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_DELTA_ERANGE:
147
+ return LCB_SUBDOC_BAD_DELTA;
148
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_EEXISTS:
149
+ return LCB_SUBDOC_PATH_EEXISTS;
150
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_MULTI_PATH_FAILURE:
151
+ return LCB_SUBDOC_MULTI_FAILURE;
152
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_INVALID_COMBO:
153
+ return LCB_SUBDOC_INVALID_COMBO;
154
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_SUCCESS_DELETED:
155
+ return LCB_SUBDOC_SUCCESS_DELETED;
156
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_INVALID_FLAG_COMBO:
157
+ return LCB_SUBDOC_XATTR_INVALID_FLAG_COMBO;
158
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_INVALID_KEY_COMBO:
159
+ return LCB_SUBDOC_XATTR_INVALID_KEY_COMBO;
160
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_UNKNOWN_MACRO:
161
+ return LCB_SUBDOC_XATTR_UNKNOWN_MACRO;
162
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_UNKNOWN_VATTR:
163
+ return LCB_SUBDOC_XATTR_UNKNOWN_VATTR;
164
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_CANT_MODIFY_VATTR:
165
+ return LCB_SUBDOC_XATTR_CANT_MODIFY_VATTR;
166
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_MULTI_PATH_FAILURE_DELETED:
167
+ return LCB_SUBDOC_MULTI_PATH_FAILURE_DELETED;
168
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_INVALID_XATTR_ORDER:
169
+ return LCB_SUBDOC_INVALID_XATTR_ORDER;
170
+ case PROTOCOL_BINARY_RESPONSE_EINVAL:
171
+ return LCB_EINVAL_MCD;
172
+ case PROTOCOL_BINARY_RESPONSE_NOT_STORED:
173
+ return LCB_NOT_STORED;
174
+ case PROTOCOL_BINARY_RESPONSE_DELTA_BADVAL:
175
+ return LCB_DELTA_BADVAL;
176
+ case PROTOCOL_BINARY_RESPONSE_AUTH_ERROR:
177
+ return LCB_AUTH_ERROR;
178
+ case PROTOCOL_BINARY_RESPONSE_ERANGE:
179
+ return LCB_ERANGE;
180
+ case PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND:
181
+ return LCB_UNKNOWN_COMMAND;
182
+ case PROTOCOL_BINARY_RESPONSE_NOT_SUPPORTED:
183
+ return LCB_NOT_SUPPORTED;
184
+ case PROTOCOL_BINARY_RESPONSE_EACCESS:
185
+ return LCB_NOT_AUTHORIZED;
186
+ case PROTOCOL_BINARY_RESPONSE_UNKNOWN_COLLECTION:
187
+ return LCB_EINVAL;
188
+ default:
189
+ if (instance != NULL) {
190
+ return instance->callbacks.errmap(instance, in);
191
+ } else {
192
+ return lcb_errmap_default(NULL, in);
193
+ }
194
+ }
195
+ }
196
+
197
+ static lcb_RESPCALLBACK
198
+ find_callback(lcb_t instance, lcb_CALLBACKTYPE type)
199
+ {
200
+ lcb_RESPCALLBACK cb = instance->callbacks.v3callbacks[type];
201
+ if (!cb) {
202
+ cb = lcb_find_callback(instance, type);
203
+ }
204
+ return cb;
205
+ }
206
+
207
+
208
+ /**
209
+ * This file contains the mapping of various protocol response codes for
210
+ * a given command. Each handler receives the following parameters:
211
+ *
212
+ * @param pipeline the pipeline (or "Server") upon which the request was sent
213
+ * (and response was received)
214
+ *
215
+ * @param request the original request (including associated data). The request
216
+ * may be used to determine additional information about it, such as the
217
+ * user-defined "Cookie", number of related requests remaining, and more.
218
+ *
219
+ * @param response the response which was received. This is an opaque
220
+ * representation of a memcached response packet
221
+ *
222
+ * @param immerr in the case of an abnormal failure (i.e. network failure) the
223
+ * handler will be invoked with this callback set to a non-success value. The
224
+ * 'info' structure will still contain a valid (albeit empty and cryptic)
225
+ * header. If the user depends on special data being found in the payload then
226
+ * the handler must check that this variable is set to LCB_SUCCESS before
227
+ * continuing. Also note that a negative reply may also be present within
228
+ * the response itself; however this is not the purpose of this parameter.
229
+ *
230
+ * @return request status
231
+ * The return value should indicate whether outstanding responses remain
232
+ * to be received for this request, or if this request is deemed to be
233
+ * satisfied.
234
+ */
235
+
236
+ template <typename T>
237
+ void make_error(lcb_t instance, T* resp,
238
+ const MemcachedResponse *response, lcb_error_t imm) {
239
+ if (imm) {
240
+ resp->rc = imm;
241
+ resp->rflags |= LCB_RESP_F_CLIENTGEN;
242
+ } else if (response->status() == PROTOCOL_BINARY_RESPONSE_SUCCESS) {
243
+ resp->rc = LCB_SUCCESS;
244
+ } else {
245
+ resp->rc = map_error(instance, response->status());
246
+ }
247
+ }
248
+
249
+ template <typename T>
250
+ void handle_error_info(const MemcachedResponse* mc_resp, ResponsePack<T>* rp)
251
+ {
252
+ if (mc_resp->status() != PROTOCOL_BINARY_RESPONSE_SUCCESS
253
+ && mc_resp->datatype() & PROTOCOL_BINARY_DATATYPE_JSON
254
+ && mc_resp->vallen() > 0) {
255
+ rp->resp.rflags |= LCB_RESP_F_ERRINFO;
256
+ rp->value = mc_resp->value();
257
+ rp->nvalue = mc_resp->vallen();
258
+ }
259
+ }
260
+
261
+ template <typename T>
262
+ void init_resp(lcb_t instance, const MemcachedResponse* mc_resp,
263
+ const mc_PACKET *req, lcb_error_t immerr, T *resp) {
264
+ make_error(instance, resp, mc_resp, immerr);
265
+ resp->cas = mc_resp->cas();
266
+ resp->cookie = const_cast<void*>(MCREQ_PKT_COOKIE(req));
267
+ mcreq_get_key(req, &resp->key, &resp->nkey);
268
+ }
269
+
270
+ /**
271
+ * Handles the propagation and population of the 'mutation token' information.
272
+ * @param mc_resp The response packet
273
+ * @param req The request packet (used to get the vBucket)
274
+ * @param tgt Pointer to mutation token which should be populated.
275
+ */
276
+ static void
277
+ handle_mutation_token(lcb_t instance, const MemcachedResponse *mc_resp,
278
+ const mc_PACKET *req, lcb_MUTATION_TOKEN *stok)
279
+ {
280
+ const char *sbuf;
281
+ uint16_t vbid;
282
+ if (mc_resp->extlen() == 0) {
283
+ return; /* No extras */
284
+ }
285
+
286
+ if (!instance->dcpinfo && LCBT_SETTING(instance, dur_mutation_tokens)) {
287
+ size_t nvb = LCBT_VBCONFIG(instance)->nvb;
288
+ if (nvb) {
289
+ instance->dcpinfo = new lcb_MUTATION_TOKEN[nvb];
290
+ memset(instance->dcpinfo, 0, sizeof(*instance->dcpinfo) * nvb);
291
+ }
292
+ }
293
+
294
+ sbuf = mc_resp->ext();
295
+ vbid = mcreq_get_vbucket(req);
296
+ stok->vbid_ = vbid;
297
+ memcpy(&stok->uuid_, sbuf, 8);
298
+ memcpy(&stok->seqno_, sbuf + 8, 8);
299
+
300
+ stok->uuid_ = lcb_ntohll(stok->uuid_);
301
+ stok->seqno_ = lcb_ntohll(stok->seqno_);
302
+
303
+ if (instance->dcpinfo) {
304
+ instance->dcpinfo[vbid] = *stok;
305
+ }
306
+ }
307
+
308
+ static lcb_t get_instance(mc_PIPELINE *pipeline) {
309
+ return reinterpret_cast<lcb_t>(pipeline->parent->cqdata);
310
+ }
311
+
312
+ template <typename T>
313
+ void invoke_callback(const mc_PACKET *pkt,
314
+ lcb_t instance, T* resp, lcb_CALLBACKTYPE cbtype)
315
+ {
316
+ if (!(pkt->flags & MCREQ_F_INVOKED)) {
317
+ resp->cookie = const_cast<void*>(MCREQ_PKT_COOKIE(pkt));
318
+ const lcb_RESPBASE *base = reinterpret_cast<const lcb_RESPBASE*>(resp);
319
+ if ((pkt->flags & MCREQ_F_PRIVCALLBACK) == 0) {
320
+ find_callback(instance, cbtype)(instance, cbtype, base);
321
+ } else {
322
+ (*(lcb_RESPCALLBACK*)resp->cookie)(instance, cbtype, base);
323
+ }
324
+ }
325
+ }
326
+
327
+ template <typename T>
328
+ void invoke_callback(const mc_PACKET *pkt, mc_PIPELINE *pipeline, T *resp,
329
+ lcb_CALLBACKTYPE cbtype)
330
+ {
331
+ invoke_callback(pkt, get_instance(pipeline), cbtype, resp);
332
+ }
333
+
334
+ /**
335
+ * Optionally decompress an incoming payload.
336
+ * @param o The instance
337
+ * @param resp The response received
338
+ * @param[out] bytes pointer to the final payload
339
+ * @param[out] nbytes pointer to the size of the final payload
340
+ * @param[out] freeptr pointer to free. This should be initialized to `NULL`.
341
+ * If temporary dynamic storage is required this will be set to the allocated
342
+ * pointer upon return. Otherwise it will be set to NULL. In any case it must
343
+ */
344
+ static void
345
+ maybe_decompress(lcb_t o,
346
+ const MemcachedResponse* respkt, lcb_RESPGET *rescmd, void **freeptr)
347
+ {
348
+ lcb_U8 dtype = 0;
349
+ if (!respkt->vallen()) {
350
+ return;
351
+ }
352
+
353
+ if (respkt->datatype() & PROTOCOL_BINARY_DATATYPE_JSON) {
354
+ dtype = LCB_VALUE_F_JSON;
355
+ }
356
+
357
+ if (respkt->datatype() & PROTOCOL_BINARY_DATATYPE_COMPRESSED) {
358
+ if (LCBT_SETTING(o, compressopts) & LCB_COMPRESS_IN) {
359
+ /* if we inflate, we don't set the flag */
360
+ mcreq_inflate_value(
361
+ respkt->value(), respkt->vallen(),
362
+ &rescmd->value, &rescmd->nvalue, freeptr);
363
+
364
+ } else {
365
+ /* user doesn't want inflation. signal it's compressed */
366
+ dtype |= LCB_VALUE_F_SNAPPYCOMP;
367
+ }
368
+ }
369
+ rescmd->datatype = dtype;
370
+ }
371
+
372
+ static void
373
+ H_get(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse* response,
374
+ lcb_error_t immerr)
375
+ {
376
+ ResponsePack<lcb_RESPGET> w = {{ 0 }};
377
+ lcb_RESPGET& resp = w.resp;
378
+
379
+ lcb_t o = get_instance(pipeline);
380
+ init_resp(o, response, request, immerr, &resp);
381
+ handle_error_info(response, &w);
382
+ resp.rflags |= LCB_RESP_F_FINAL;
383
+
384
+ if (resp.rc == LCB_SUCCESS) {
385
+ resp.datatype = response->datatype();
386
+ resp.value = response->value();
387
+ resp.nvalue = response->vallen();
388
+ resp.bufh = response->bufseg();
389
+ if (response->extlen() == sizeof(uint32_t)) {
390
+ memcpy(&resp.itmflags, response->ext(), sizeof(uint32_t));
391
+ resp.itmflags = ntohl(resp.itmflags);
392
+ }
393
+ }
394
+
395
+ void *freeptr = NULL;
396
+ maybe_decompress(o, response, &resp, &freeptr);
397
+ LCBTRACE_KV_FINISH(pipeline, request, response);
398
+ TRACE_GET_END(o, request, response, &resp);
399
+ invoke_callback(request, o, &resp, LCB_CALLBACK_GET);
400
+ free(freeptr);
401
+ }
402
+
403
+ static void
404
+ H_getreplica(mc_PIPELINE *pipeline, mc_PACKET *request,
405
+ MemcachedResponse *response, lcb_error_t immerr)
406
+ {
407
+ ResponsePack<lcb_RESPGET> w = {{ 0 }};
408
+ lcb_RESPGET& resp = w.resp;
409
+ lcb_t instance = get_instance(pipeline);
410
+ void *freeptr = NULL;
411
+ mc_REQDATAEX *rd = request->u_rdata.exdata;
412
+
413
+ init_resp(instance, response, request, immerr, &resp);
414
+ handle_error_info(response, &w);
415
+
416
+ if (resp.rc == LCB_SUCCESS) {
417
+ resp.datatype = response->datatype();
418
+ resp.value = response->value();
419
+ resp.nvalue = response->vallen();
420
+ resp.bufh = response->bufseg();
421
+ if (response->extlen() == sizeof(uint32_t)) {
422
+ memcpy(&resp.itmflags, response->ext(), sizeof(uint32_t));
423
+ resp.itmflags = ntohl(resp.itmflags);
424
+ }
425
+ }
426
+
427
+ maybe_decompress(instance, response, &resp, &freeptr);
428
+ rd->procs->handler(pipeline, request, resp.rc, &resp);
429
+ free(freeptr);
430
+ }
431
+
432
+ static void
433
+ H_subdoc(mc_PIPELINE *pipeline, mc_PACKET *request,
434
+ MemcachedResponse *response, lcb_error_t immerr)
435
+ {
436
+ lcb_t o = get_instance(pipeline);
437
+ ResponsePack<lcb_RESPSUBDOC> w = {{ 0 }};
438
+ lcb_CALLBACKTYPE cbtype;
439
+ init_resp(o, response, request, immerr, &w.resp);
440
+ w.resp.rflags |= LCB_RESP_F_FINAL;
441
+
442
+ /* For mutations, add the mutation token */
443
+ switch (response->opcode()) {
444
+ case PROTOCOL_BINARY_CMD_SUBDOC_GET:
445
+ case PROTOCOL_BINARY_CMD_SUBDOC_EXISTS:
446
+ case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_LOOKUP:
447
+ cbtype = LCB_CALLBACK_SDLOOKUP;
448
+ break;
449
+
450
+ default:
451
+ handle_mutation_token(o, response, request, &w.mt);
452
+ w.resp.rflags |= LCB_RESP_F_EXTDATA;
453
+ cbtype = LCB_CALLBACK_SDMUTATE;
454
+ break;
455
+ }
456
+
457
+ if (response->opcode() == PROTOCOL_BINARY_CMD_SUBDOC_MULTI_LOOKUP ||
458
+ response->opcode() == PROTOCOL_BINARY_CMD_SUBDOC_MULTI_MUTATION) {
459
+ if (w.resp.rc == LCB_SUCCESS || w.resp.rc == LCB_SUBDOC_MULTI_FAILURE) {
460
+ w.resp.responses = response;
461
+ } else {
462
+ handle_error_info(response, &w);
463
+ }
464
+ } else {
465
+ /* Single response */
466
+ w.resp.rflags |= LCB_RESP_F_SDSINGLE;
467
+ if (w.resp.rc == LCB_SUCCESS) {
468
+ w.resp.responses = response;
469
+ } else if (LCB_EIFSUBDOC(w.resp.rc)) {
470
+ w.resp.responses = response;
471
+ w.resp.rc = LCB_SUBDOC_MULTI_FAILURE;
472
+ } else {
473
+ handle_error_info(response, &w);
474
+ }
475
+ }
476
+ invoke_callback(request, o, &w.resp, cbtype);
477
+ }
478
+
479
+ static int
480
+ sdlookup_next(const MemcachedResponse *response, lcb_SDENTRY *ent, size_t *iter)
481
+ {
482
+ const char *buf;
483
+ uint16_t rc;
484
+ uint32_t vlen;
485
+
486
+ if (*iter == response->vallen()) {
487
+ return 0;
488
+ }
489
+
490
+ buf = response->value();
491
+ buf += *iter;
492
+
493
+ memcpy(&rc, buf, 2);
494
+ memcpy(&vlen, buf + 2, 4);
495
+
496
+ rc = ntohs(rc);
497
+ vlen = ntohl(vlen);
498
+
499
+ ent->status = map_error(NULL, rc);
500
+ ent->nvalue = vlen;
501
+
502
+ if (ent->status == LCB_SUCCESS) {
503
+ ent->value = buf + 6;
504
+ } else {
505
+ ent->value = NULL;
506
+ ent->nvalue = 0;
507
+ }
508
+
509
+ *iter += (6 + vlen);
510
+ return 1;
511
+ }
512
+
513
+ static int
514
+ sdmutate_next(const MemcachedResponse *response, lcb_SDENTRY *ent, size_t *iter)
515
+ {
516
+ const char *buf, *buf_end;
517
+ uint16_t rc;
518
+ uint32_t vlen;
519
+
520
+ if (*iter == response->vallen()) {
521
+ return 0;
522
+ }
523
+
524
+ buf_end = (const char *)response->value() + response->vallen();
525
+ buf = ((const char *)(response->value())) + *iter;
526
+
527
+ #define ADVANCE_BUF(sz) \
528
+ buf += sz; \
529
+ *iter += sz; \
530
+ assert(buf <= buf_end); \
531
+
532
+ /* Index */
533
+ ent->index = *(lcb_U8*)buf;
534
+ ADVANCE_BUF(1);
535
+
536
+ /* Status */
537
+ memcpy(&rc, buf, 2);
538
+ ADVANCE_BUF(2);
539
+
540
+ rc = ntohs(rc);
541
+ ent->status = map_error(NULL, rc);
542
+
543
+ if (rc == PROTOCOL_BINARY_RESPONSE_SUCCESS) {
544
+ memcpy(&vlen, buf, 4);
545
+ ADVANCE_BUF(4);
546
+
547
+ vlen = ntohl(vlen);
548
+ ent->nvalue = vlen;
549
+ ent->value = buf;
550
+ ADVANCE_BUF(vlen);
551
+
552
+ } else {
553
+ ent->value = NULL;
554
+ ent->nvalue = 0;
555
+ }
556
+
557
+ (void)buf_end;
558
+ return 1;
559
+ #undef ADVANCE_BUF
560
+ }
561
+
562
+ LIBCOUCHBASE_API
563
+ int
564
+ lcb_sdresult_next(const lcb_RESPSUBDOC *resp, lcb_SDENTRY *ent, size_t *iter)
565
+ {
566
+ size_t iter_s = 0;
567
+ const MemcachedResponse *response =
568
+ reinterpret_cast<const MemcachedResponse*>(resp->responses);
569
+ if (!response) {
570
+ return 0;
571
+ }
572
+ if (!iter) {
573
+ /* Single response */
574
+ iter = &iter_s;
575
+ }
576
+
577
+ switch (response->opcode()) {
578
+ case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_LOOKUP:
579
+ return sdlookup_next(response, ent, iter);
580
+ case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_MUTATION:
581
+ return sdmutate_next(response, ent, iter);
582
+ default:
583
+ if (*iter) {
584
+ return 0;
585
+ }
586
+ *iter = 1;
587
+
588
+ if (resp->rc == LCB_SUCCESS || resp->rc == LCB_SUBDOC_MULTI_FAILURE) {
589
+ ent->status = map_error(NULL, response->status());
590
+ ent->value = response->value();
591
+ ent->nvalue = response->vallen();
592
+ ent->index = 0;
593
+ return 1;
594
+ } else {
595
+ return 0;
596
+ }
597
+ }
598
+ }
599
+
600
+ static void
601
+ H_delete(mc_PIPELINE *pipeline, mc_PACKET *packet, MemcachedResponse *response,
602
+ lcb_error_t immerr)
603
+ {
604
+ lcb_t root = get_instance(pipeline);
605
+ ResponsePack<lcb_RESPREMOVE> w = { { 0 } };
606
+ w.resp.rflags |= LCB_RESP_F_EXTDATA | LCB_RESP_F_FINAL;
607
+ init_resp(root, response, packet, immerr, &w.resp);
608
+ handle_error_info(response, &w);
609
+ handle_mutation_token(root, response, packet, &w.mt);
610
+ LCBTRACE_KV_FINISH(pipeline, packet, response);
611
+ TRACE_REMOVE_END(root, packet, response, &w.resp);
612
+ invoke_callback(packet, root, &w.resp, LCB_CALLBACK_REMOVE);
613
+ }
614
+
615
+ static void
616
+ H_observe(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse *response,
617
+ lcb_error_t immerr)
618
+ {
619
+ lcb_t root = get_instance(pipeline);
620
+ uint32_t ttp;
621
+ uint32_t ttr;
622
+ size_t pos;
623
+ lcbvb_CONFIG* config;
624
+ const char *end, *ptr;
625
+ mc_REQDATAEX *rd = request->u_rdata.exdata;
626
+ lcb_RESPOBSERVE resp = { 0 };
627
+ make_error(root, &resp, response, immerr);
628
+
629
+ if (resp.rc != LCB_SUCCESS) {
630
+ if (! (request->flags & MCREQ_F_INVOKED)) {
631
+ rd->procs->handler(pipeline, request, resp.rc, NULL);
632
+ }
633
+ return;
634
+ }
635
+
636
+ /** The CAS field is split into TTP/TTR values */
637
+ uint64_t tmpcas = lcb_htonll(response->cas());
638
+ ptr = reinterpret_cast<char*>(&tmpcas);
639
+ memcpy(&ttp, ptr, sizeof(ttp));
640
+ memcpy(&ttr, ptr + sizeof(ttp), sizeof(ttp));
641
+
642
+ ttp = ntohl(ttp);
643
+ ttr = ntohl(ttr);
644
+
645
+ /** Actual payload sequence of (vb, nkey, key). Repeats multiple times */
646
+ ptr = response->value();
647
+ end = ptr + response->vallen();
648
+ config = pipeline->parent->config;
649
+
650
+ for (pos = 0; ptr < end; pos++) {
651
+ uint64_t cas;
652
+ uint8_t obs;
653
+ uint16_t nkey, vb;
654
+ const char *key;
655
+
656
+ memcpy(&vb, ptr, sizeof(vb));
657
+ vb = ntohs(vb);
658
+ ptr += sizeof(vb);
659
+ memcpy(&nkey, ptr, sizeof(nkey));
660
+ nkey = ntohs(nkey);
661
+ ptr += sizeof(nkey);
662
+ key = (const char *)ptr;
663
+ ptr += nkey;
664
+ obs = *((lcb_uint8_t *)ptr);
665
+ ptr += sizeof(obs);
666
+ memcpy(&cas, ptr, sizeof(cas));
667
+ ptr += sizeof(cas);
668
+
669
+ resp.key = key;
670
+ resp.nkey = nkey;
671
+ resp.cas = lcb_ntohll(cas);
672
+ resp.status = obs;
673
+ resp.ismaster = pipeline->index == lcbvb_vbmaster(config, vb);
674
+ resp.ttp = ttp;
675
+ resp.ttr = ttr;
676
+ TRACE_OBSERVE_PROGRESS(root, request, response, &resp);
677
+ LCBTRACE_KV_FINISH(pipeline, request, response);
678
+ if (! (request->flags & MCREQ_F_INVOKED)) {
679
+ rd->procs->handler(pipeline, request, resp.rc, &resp);
680
+ }
681
+ }
682
+ }
683
+
684
+ static void
685
+ H_observe_seqno(mc_PIPELINE *pipeline, mc_PACKET *request,
686
+ MemcachedResponse *response, lcb_error_t immerr) {
687
+ lcb_t root = get_instance(pipeline);
688
+ lcb_RESPOBSEQNO resp = { 0 };
689
+ init_resp(root, response, request, immerr, &resp);
690
+
691
+ resp.server_index = pipeline->index;
692
+
693
+ if (resp.rc == LCB_SUCCESS) {
694
+ const uint8_t *data = reinterpret_cast<const uint8_t *>(response->value());
695
+ bool is_failover = *data != 0;
696
+
697
+ data++;
698
+ #define COPY_ADV(dstfld, n, conv_fn) \
699
+ memcpy(&resp.dstfld, data, n); \
700
+ data += n; \
701
+ resp.dstfld = conv_fn(resp.dstfld);
702
+
703
+ COPY_ADV(vbid, 2, ntohs);
704
+ COPY_ADV(cur_uuid, 8, lcb_ntohll);
705
+ COPY_ADV(persisted_seqno, 8, lcb_ntohll);
706
+ COPY_ADV(mem_seqno, 8, lcb_ntohll);
707
+ if (is_failover) {
708
+ COPY_ADV(old_uuid, 8, lcb_ntohll);
709
+ COPY_ADV(old_seqno, 8, lcb_ntohll);
710
+ }
711
+ #undef COPY_ADV
712
+
713
+ /* Get the server for this command. Note that since this is a successful
714
+ * operation, the server is never a dummy */
715
+ }
716
+ LCBTRACE_KV_FINISH(pipeline, request, response);
717
+ invoke_callback(request, root, &resp, LCB_CALLBACK_OBSEQNO);
718
+ }
719
+
720
+ static void
721
+ H_store(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse *response,
722
+ lcb_error_t immerr)
723
+ {
724
+ lcb_t root = get_instance(pipeline);
725
+ ResponsePack<lcb_RESPSTORE> w = { { 0 } };
726
+ uint8_t opcode;
727
+ init_resp(root, response, request, immerr, &w.resp);
728
+ handle_error_info(response, &w);
729
+ if (!immerr) {
730
+ opcode = response->opcode();
731
+ } else {
732
+ protocol_binary_request_header hdr;
733
+ mcreq_read_hdr(request, &hdr);
734
+ opcode = hdr.request.opcode;
735
+ }
736
+ if (opcode == PROTOCOL_BINARY_CMD_ADD) {
737
+ w.resp.op = LCB_ADD;
738
+ } else if (opcode == PROTOCOL_BINARY_CMD_REPLACE) {
739
+ w.resp.op = LCB_REPLACE;
740
+ } else if (opcode == PROTOCOL_BINARY_CMD_APPEND) {
741
+ w.resp.op = LCB_APPEND;
742
+ } else if (opcode == PROTOCOL_BINARY_CMD_PREPEND) {
743
+ w.resp.op = LCB_PREPEND;
744
+ } else if (opcode == PROTOCOL_BINARY_CMD_SET) {
745
+ w.resp.op = LCB_SET;
746
+ }
747
+ w.resp.rflags |= LCB_RESP_F_EXTDATA | LCB_RESP_F_FINAL;
748
+ handle_mutation_token(root, response, request, &w.mt);
749
+ TRACE_STORE_END(root, request, response, &w.resp);
750
+ if (request->flags & MCREQ_F_REQEXT) {
751
+ LCBTRACE_KV_COMPLETE(pipeline, request, response);
752
+ request->u_rdata.exdata->procs->handler(pipeline, request, immerr, &w.resp);
753
+ } else {
754
+ LCBTRACE_KV_FINISH(pipeline, request, response);
755
+ invoke_callback(request, root, &w.resp, LCB_CALLBACK_STORE);
756
+ }
757
+ }
758
+
759
+ static void
760
+ H_arithmetic(mc_PIPELINE *pipeline, mc_PACKET *request,
761
+ MemcachedResponse *response, lcb_error_t immerr)
762
+ {
763
+ lcb_t root = get_instance(pipeline);
764
+ ResponsePack<lcb_RESPCOUNTER> w = { { 0 } };
765
+ init_resp(root, response, request, immerr, &w.resp);
766
+
767
+ if (w.resp.rc == LCB_SUCCESS) {
768
+ memcpy(&w.resp.value, response->value(), sizeof(w.resp.value));
769
+ w.resp.value = lcb_ntohll(w.resp.value);
770
+ w.resp.rflags |= LCB_RESP_F_EXTDATA;
771
+ handle_mutation_token(root, response, request, &w.mt);
772
+ } else {
773
+ handle_error_info(response, &w);
774
+ }
775
+ w.resp.rflags |= LCB_RESP_F_FINAL;
776
+ w.resp.cas = response->cas();
777
+ LCBTRACE_KV_FINISH(pipeline, request, response);
778
+ TRACE_ARITHMETIC_END(root, request, response, &w.resp);
779
+ invoke_callback(request, root, &w.resp, LCB_CALLBACK_COUNTER);
780
+ }
781
+
782
+ static void
783
+ H_stats(mc_PIPELINE *pipeline, mc_PACKET *request,
784
+ MemcachedResponse *response, lcb_error_t immerr)
785
+ {
786
+ lcb_t root = get_instance(pipeline);
787
+ lcb_RESPSTATS resp = { 0 };
788
+ mc_REQDATAEX *exdata;
789
+
790
+ make_error(root, &resp, response, immerr);
791
+ resp.version = 0;
792
+
793
+ exdata = request->u_rdata.exdata;
794
+ if (resp.rc != LCB_SUCCESS || response->keylen() == 0) {
795
+ /* Call the handler without a response, this indicates that this server
796
+ * has finished responding */
797
+ exdata->procs->handler(pipeline, request, resp.rc, NULL);
798
+ return;
799
+ }
800
+
801
+ if ((resp.nkey = response->keylen())) {
802
+ resp.key = response->key();
803
+ if ((resp.value = response->value())) {
804
+ resp.nvalue = response->vallen();
805
+ }
806
+ }
807
+
808
+ exdata->procs->handler(pipeline, request, resp.rc, &resp);
809
+ }
810
+
811
+ static void
812
+ H_verbosity(mc_PIPELINE *pipeline, mc_PACKET *request,
813
+ MemcachedResponse *response, lcb_error_t immerr)
814
+ {
815
+ lcb_t root = get_instance(pipeline);
816
+ lcb_RESPBASE dummy = { 0 };
817
+ mc_REQDATAEX *exdata = request->u_rdata.exdata;
818
+ make_error(root, &dummy, response, immerr);
819
+
820
+ exdata->procs->handler(pipeline, request, dummy.rc, NULL);
821
+ }
822
+
823
+ static void
824
+ H_version(mc_PIPELINE *pipeline, mc_PACKET *request,
825
+ MemcachedResponse *response, lcb_error_t immerr)
826
+ {
827
+ lcb_t root = get_instance(pipeline);
828
+ lcb_RESPMCVERSION resp = { 0 };
829
+ mc_REQDATAEX *exdata = request->u_rdata.exdata;
830
+
831
+ make_error(root, &resp, response, immerr);
832
+
833
+ if (response->vallen()) {
834
+ resp.mcversion = response->value();
835
+ resp.nversion = response->vallen();
836
+ }
837
+
838
+
839
+ exdata->procs->handler(pipeline, request, resp.rc, &resp);
840
+ }
841
+
842
+ static void
843
+ H_noop(mc_PIPELINE *pipeline, mc_PACKET *request,
844
+ MemcachedResponse *response, lcb_error_t immerr)
845
+ {
846
+ lcb_t root = get_instance(pipeline);
847
+ lcb_RESPNOOP resp = { 0 };
848
+ mc_REQDATAEX *exdata = request->u_rdata.exdata;
849
+
850
+ make_error(root, &resp, response, immerr);
851
+
852
+ exdata->procs->handler(pipeline, request, resp.rc, &resp);
853
+ }
854
+
855
+ static void
856
+ H_touch(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse *response,
857
+ lcb_error_t immerr)
858
+ {
859
+ lcb_t root = get_instance(pipeline);
860
+ ResponsePack<lcb_RESPTOUCH> w = {{ 0 }};
861
+ lcb_RESPTOUCH& resp = w.resp;
862
+ init_resp(root, response, request, immerr, &resp);
863
+ handle_error_info(response, &w);
864
+ resp.rflags |= LCB_RESP_F_FINAL;
865
+ LCBTRACE_KV_FINISH(pipeline, request, response);
866
+ TRACE_TOUCH_END(root, request, response, &resp);
867
+ invoke_callback(request, root, &resp, LCB_CALLBACK_TOUCH);
868
+ }
869
+
870
+ static void
871
+ H_flush(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse *response,
872
+ lcb_error_t immerr)
873
+ {
874
+ lcb_t root = get_instance(pipeline);
875
+ lcb_RESPFLUSH resp = { 0 };
876
+ mc_REQDATAEX *exdata = request->u_rdata.exdata;
877
+ make_error(root, &resp, response, immerr);
878
+ exdata->procs->handler(pipeline, request, resp.rc, &resp);
879
+ }
880
+
881
+ static void
882
+ H_unlock(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse *response,
883
+ lcb_error_t immerr)
884
+ {
885
+ lcb_t root = get_instance(pipeline);
886
+ ResponsePack<lcb_RESPUNLOCK> w = {{ 0 }};
887
+ lcb_RESPUNLOCK& resp = w.resp;
888
+ init_resp(root, response, request, immerr, &resp);
889
+ handle_error_info(response, &w);
890
+ resp.rflags |= LCB_RESP_F_FINAL;
891
+ LCBTRACE_KV_FINISH(pipeline, request, response);
892
+ TRACE_UNLOCK_END(root, request, response, &resp);
893
+ invoke_callback(request, root, &resp, LCB_CALLBACK_UNLOCK);
894
+ }
895
+
896
+ static void
897
+ H_config(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse *response,
898
+ lcb_error_t immerr)
899
+ {
900
+ /** We just jump to the normal config handler */
901
+ lcb_RESPBASE dummy = {0};
902
+ mc_REQDATAEX *exdata = request->u_rdata.exdata;
903
+ make_error(get_instance(pipeline), &dummy, response, immerr);
904
+
905
+ exdata->procs->handler(pipeline, request, dummy.rc, response);
906
+ }
907
+
908
+ static void
909
+ record_metrics(mc_PIPELINE *pipeline, mc_PACKET *req, MemcachedResponse *)
910
+ {
911
+ lcb_t instance = get_instance(pipeline);
912
+ if (
913
+ #ifdef HAVE_DTRACE
914
+ 1
915
+ #else
916
+ instance->kv_timings
917
+ #endif
918
+ ) {
919
+ MCREQ_PKT_RDATA(req)->dispatch = gethrtime();
920
+ }
921
+ if (instance->kv_timings) {
922
+ lcb_histogram_record(instance->kv_timings, MCREQ_PKT_RDATA(req)->dispatch - MCREQ_PKT_RDATA(req)->start);
923
+ }
924
+ }
925
+
926
+ static void
927
+ dispatch_ufwd_error(mc_PIPELINE *pipeline, mc_PACKET *req, lcb_error_t immerr)
928
+ {
929
+ lcb_PKTFWDRESP resp = { 0 };
930
+ lcb_t instance = static_cast<lcb::Server*>(pipeline)->get_instance();
931
+ assert(immerr != LCB_SUCCESS);
932
+ resp.version = 0;
933
+ instance->callbacks.pktfwd(instance, MCREQ_PKT_COOKIE(req), immerr, &resp);
934
+ }
935
+
936
+ int
937
+ mcreq_dispatch_response(
938
+ mc_PIPELINE *pipeline, mc_PACKET *req, MemcachedResponse *res,
939
+ lcb_error_t immerr)
940
+ {
941
+ record_metrics(pipeline, req, res);
942
+
943
+ if (req->flags & MCREQ_F_UFWD) {
944
+ dispatch_ufwd_error(pipeline, req, immerr);
945
+ return 0;
946
+ }
947
+
948
+
949
+ #define INVOKE_OP(handler) \
950
+ handler(pipeline, req, res, immerr); \
951
+ return 0; \
952
+ break;
953
+
954
+ switch (res->opcode()) {
955
+ case PROTOCOL_BINARY_CMD_GET:
956
+ case PROTOCOL_BINARY_CMD_GAT:
957
+ case PROTOCOL_BINARY_CMD_GET_LOCKED:
958
+ INVOKE_OP(H_get);
959
+
960
+ case PROTOCOL_BINARY_CMD_ADD:
961
+ case PROTOCOL_BINARY_CMD_REPLACE:
962
+ case PROTOCOL_BINARY_CMD_SET:
963
+ case PROTOCOL_BINARY_CMD_APPEND:
964
+ case PROTOCOL_BINARY_CMD_PREPEND:
965
+ INVOKE_OP(H_store);
966
+
967
+ case PROTOCOL_BINARY_CMD_INCREMENT:
968
+ case PROTOCOL_BINARY_CMD_DECREMENT:
969
+ INVOKE_OP(H_arithmetic);
970
+
971
+ case PROTOCOL_BINARY_CMD_SUBDOC_GET:
972
+ case PROTOCOL_BINARY_CMD_SUBDOC_EXISTS:
973
+ case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_ADD_UNIQUE:
974
+ case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_PUSH_FIRST:
975
+ case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_PUSH_LAST:
976
+ case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_INSERT:
977
+ case PROTOCOL_BINARY_CMD_SUBDOC_DICT_ADD:
978
+ case PROTOCOL_BINARY_CMD_SUBDOC_DICT_UPSERT:
979
+ case PROTOCOL_BINARY_CMD_SUBDOC_REPLACE:
980
+ case PROTOCOL_BINARY_CMD_SUBDOC_DELETE:
981
+ case PROTOCOL_BINARY_CMD_SUBDOC_COUNTER:
982
+ case PROTOCOL_BINARY_CMD_SUBDOC_GET_COUNT:
983
+ case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_LOOKUP:
984
+ case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_MUTATION:
985
+ INVOKE_OP(H_subdoc);
986
+
987
+ case PROTOCOL_BINARY_CMD_OBSERVE:
988
+ INVOKE_OP(H_observe);
989
+
990
+ case PROTOCOL_BINARY_CMD_GET_REPLICA:
991
+ INVOKE_OP(H_getreplica);
992
+
993
+ case PROTOCOL_BINARY_CMD_UNLOCK_KEY:
994
+ INVOKE_OP(H_unlock);
995
+
996
+ case PROTOCOL_BINARY_CMD_DELETE:
997
+ INVOKE_OP(H_delete);
998
+
999
+ case PROTOCOL_BINARY_CMD_TOUCH:
1000
+ INVOKE_OP(H_touch);
1001
+
1002
+ case PROTOCOL_BINARY_CMD_OBSERVE_SEQNO:
1003
+ INVOKE_OP(H_observe_seqno);
1004
+
1005
+ case PROTOCOL_BINARY_CMD_STAT:
1006
+ INVOKE_OP(H_stats);
1007
+
1008
+ case PROTOCOL_BINARY_CMD_FLUSH:
1009
+ INVOKE_OP(H_flush);
1010
+
1011
+ case PROTOCOL_BINARY_CMD_VERSION:
1012
+ INVOKE_OP(H_version);
1013
+
1014
+ case PROTOCOL_BINARY_CMD_VERBOSITY:
1015
+ INVOKE_OP(H_verbosity);
1016
+
1017
+ case PROTOCOL_BINARY_CMD_NOOP:
1018
+ INVOKE_OP(H_noop);
1019
+
1020
+ case PROTOCOL_BINARY_CMD_GET_CLUSTER_CONFIG:
1021
+ INVOKE_OP(H_config);
1022
+
1023
+ default:
1024
+ fprintf(stderr, "COUCHBASE: Received unknown opcode=0x%x\n", res->opcode());
1025
+ return -1;
1026
+ }
1027
+ }
1028
+
1029
+ const lcb_MUTATION_TOKEN *
1030
+ lcb_resp_get_mutation_token(int cbtype, const lcb_RESPBASE *rb)
1031
+ {
1032
+ const lcb_MUTATION_TOKEN *ss = NULL;
1033
+ if ((rb->rflags & LCB_RESP_F_EXTDATA) == 0) {
1034
+ return NULL;
1035
+ }
1036
+
1037
+ switch (cbtype) {
1038
+ case LCB_CALLBACK_STORE:
1039
+ ss = ResponsePack<lcb_RESPSTORE>::get_mt(rb);
1040
+ break;
1041
+
1042
+ case LCB_CALLBACK_COUNTER:
1043
+ ss = ResponsePack<lcb_RESPCOUNTER>::get_mt(rb);
1044
+ break;
1045
+
1046
+ case LCB_CALLBACK_REMOVE:
1047
+ ss = ResponsePack<lcb_RESPREMOVE>::get_mt(rb);
1048
+ break;
1049
+
1050
+ case LCB_CALLBACK_SDMUTATE:
1051
+ ss = ResponsePack<lcb_RESPSUBDOC>::get_mt(rb);
1052
+ break;
1053
+
1054
+ default:
1055
+ return NULL;
1056
+ }
1057
+
1058
+ if (ss->uuid_ == 0 && ss->seqno_ == 0) {
1059
+ return NULL;
1060
+ }
1061
+ return ss;
1062
+ }
1063
+
1064
+ #define ERRINFO_CALLBACKS(X) \
1065
+ X(LCB_CALLBACK_GET, lcb_RESPGET) \
1066
+ X(LCB_CALLBACK_STORE, lcb_RESPSTORE) \
1067
+ X(LCB_CALLBACK_COUNTER, lcb_RESPCOUNTER) \
1068
+ X(LCB_CALLBACK_TOUCH, lcb_RESPTOUCH) \
1069
+ X(LCB_CALLBACK_REMOVE, lcb_RESPREMOVE) \
1070
+ X(LCB_CALLBACK_UNLOCK, lcb_RESPUNLOCK) \
1071
+ X(LCB_CALLBACK_SDLOOKUP, lcb_RESPSUBDOC) \
1072
+ X(LCB_CALLBACK_SDMUTATE, lcb_RESPSUBDOC) \
1073
+
1074
+
1075
+ LIBCOUCHBASE_API
1076
+ const char *
1077
+ lcb_resp_get_error_context(int cbtype, const lcb_RESPBASE *rb)
1078
+ {
1079
+ if ((rb->rflags & LCB_RESP_F_ERRINFO) == 0) {
1080
+ return NULL;
1081
+ }
1082
+
1083
+ #define X(CBTYPE, RESP) if (cbtype == CBTYPE) { return ResponsePack<RESP>::get_err_ctx(rb); }
1084
+ ERRINFO_CALLBACKS(X);
1085
+ #undef X
1086
+ return NULL;
1087
+ }
1088
+
1089
+ LIBCOUCHBASE_API
1090
+ const char *
1091
+ lcb_resp_get_error_ref(int cbtype, const lcb_RESPBASE *rb)
1092
+ {
1093
+ if ((rb->rflags & LCB_RESP_F_ERRINFO) == 0) {
1094
+ return NULL;
1095
+ }
1096
+
1097
+ #define X(CBTYPE, RESP) if (cbtype == CBTYPE) { return ResponsePack<RESP>::get_err_ref(rb); }
1098
+ ERRINFO_CALLBACKS(X);
1099
+ #undef X
1100
+ return NULL;
1101
+ }