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,896 @@
1
+ # frozen_string_literal: true, encoding: ASCII-8BIT
2
+
3
+ require 'json'
4
+
5
+
6
+ # Not required on jruby - buckets are cleaned up by GC
7
+ unless defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
8
+ at_exit do
9
+ GC.start
10
+ connections = []
11
+ ObjectSpace.each_object(::MTLibcouchbase::Connection).each do |connection|
12
+ next unless connection.reactor.running?
13
+ connections << connection
14
+ begin
15
+ connection.destroy
16
+ rescue => e
17
+ end
18
+ end
19
+ sleep 2 if connections.length > 0
20
+ connections.each { |c| c.reactor.stop }
21
+ end
22
+ end
23
+
24
+
25
+ module MTLibcouchbase
26
+ Response = Struct.new(:callback, :key, :cas, :value, :metadata)
27
+ HttpResponse = Struct.new(:callback, :status, :headers, :body, :request)
28
+
29
+ class Connection
30
+ include Callbacks
31
+ define_callback function: :bootstrap_callback, params: [:pointer, Ext::ErrorT.native_type]
32
+
33
+ # This is common for all standard request types
34
+ define_callback function: :callback_get
35
+ define_callback function: :callback_unlock
36
+ define_callback function: :callback_store
37
+ define_callback function: :callback_storedur
38
+ define_callback function: :callback_counter
39
+ define_callback function: :callback_touch
40
+ define_callback function: :callback_remove
41
+ define_callback function: :callback_cbflush
42
+ define_callback function: :callback_http
43
+ define_callback function: :callback_sdlookup # subdoc lookup
44
+ define_callback function: :callback_sdmutate
45
+
46
+ # These are passed with the request
47
+ define_callback function: :viewquery_callback
48
+ define_callback function: :n1ql_callback
49
+ define_callback function: :fts_callback
50
+
51
+
52
+ Request = Struct.new(:cmd, :defer, :key, :value) do
53
+ # We need to hold a reference to c-strings so they are not GC'd
54
+ def ref(string)
55
+ @refs ||= []
56
+ str = FFI::MemoryPointer.from_string(string)
57
+ @refs << str
58
+ str
59
+ end
60
+ end
61
+
62
+
63
+ def initialize(hosts: Defaults.host, bucket: Defaults.bucket, username: Defaults.username, password: Defaults.password, thread: nil, **opts)
64
+ # build host string http://docs.couchbase.com/sdk-api/couchbase-c-client-2.5.6/group__lcb-init.html
65
+ hosts = Array(hosts).flatten.join(',')
66
+ connstr = "couchbase://#{hosts}/#{bucket}"
67
+ connstr = "#{connstr}?#{opts.map { |k, v| "#{k}=#{v}" }.join('&') }" unless opts.empty?
68
+
69
+ # It's good to know
70
+ @bucket = bucket
71
+
72
+ # Configure the event loop settings
73
+ @reactor = thread || ::MTLibuv::Reactor.current || ::MTLibuv::Reactor.new
74
+ @reactor.on_program_interrupt { destroy }
75
+ @io_ptr = FFI::MemoryPointer.new :pointer, 1
76
+
77
+ # Configure MTLibuv plugin
78
+ @io_opts = Ext::MTLibuv::UVOptions.new
79
+ @io_opts[:version] = 0
80
+ @io_opts[:loop] = @reactor.handle
81
+ @io_opts[:start_stop_noop] = 1 # We want to control the start and stopping of the loop
82
+
83
+ err = Ext::MTLibuv.create_libuv_io_opts(0, @io_ptr, @io_opts)
84
+ if err != :success
85
+ raise Error.lookup(err), 'failed to allocate IO plugin'
86
+ end
87
+
88
+ # Configure the connection to the database
89
+ @connection = Ext::CreateSt.new
90
+ @connection[:version] = 3
91
+ @connection[:v][:v3][:connstr] = FFI::MemoryPointer.from_string(connstr)
92
+ uname = (username && !username.to_s.empty?) ? username.to_s : bucket.to_s
93
+ @connection[:v][:v3][:username] = FFI::MemoryPointer.from_string(uname)
94
+ @connection[:v][:v3][:passwd] = FFI::MemoryPointer.from_string(password) if password
95
+ @connection[:v][:v3][:io] = @io_ptr.get_pointer(0)
96
+ @handle_ptr = FFI::MemoryPointer.new :pointer, 1
97
+ end
98
+
99
+
100
+ attr_reader :requests, :handle, :bucket, :reactor
101
+
102
+ def get_callback(cb)
103
+ callback(cb)
104
+ end
105
+
106
+
107
+ def connect(defer: nil, flush_enabled: false)
108
+ raise 'already connected' if @handle || @bootstrap_defer
109
+ @bootstrap_defer = defer || @reactor.defer
110
+ promise = @bootstrap_defer.promise
111
+
112
+ @reactor.schedule {
113
+ @flush_enabled = flush_enabled
114
+
115
+ @requests = {}
116
+
117
+ # Create a library handle
118
+ # the create call allocates the memory and updates our pointer
119
+ err = Ext.create(@handle_ptr, @connection)
120
+ if err != :success
121
+ @bootstrap_defer.reject(Error.lookup(err).new('failed to create instance'))
122
+ handle_destroyed
123
+ else
124
+ # We extract the pointer and create the handle structure
125
+ @ref = @handle_ptr.get_pointer(0).address
126
+ @handle = Ext::T.new @handle_ptr.get_pointer(0)
127
+
128
+ # Register the callbacks we are interested in
129
+ Ext.set_bootstrap_callback(@handle, callback(:bootstrap_callback))
130
+
131
+ Ext.install_callback3(@handle, Ext::CALLBACKTYPE[:callback_get], callback(:callback_get))
132
+ Ext.install_callback3(@handle, Ext::CALLBACKTYPE[:callback_unlock], callback(:callback_unlock))
133
+ Ext.install_callback3(@handle, Ext::CALLBACKTYPE[:callback_store], callback(:callback_store))
134
+ Ext.install_callback3(@handle, Ext::CALLBACKTYPE[:callback_storedur], callback(:callback_storedur))
135
+ Ext.install_callback3(@handle, Ext::CALLBACKTYPE[:callback_counter], callback(:callback_counter))
136
+ Ext.install_callback3(@handle, Ext::CALLBACKTYPE[:callback_touch], callback(:callback_touch))
137
+ Ext.install_callback3(@handle, Ext::CALLBACKTYPE[:callback_remove], callback(:callback_remove))
138
+ Ext.install_callback3(@handle, Ext::CALLBACKTYPE[:callback_http], callback(:callback_http))
139
+ Ext.install_callback3(@handle, Ext::CALLBACKTYPE[:callback_sdlookup], callback(:callback_sdlookup))
140
+ Ext.install_callback3(@handle, Ext::CALLBACKTYPE[:callback_sdmutate], callback(:callback_sdmutate))
141
+ Ext.install_callback3(@handle, Ext::CALLBACKTYPE[:callback_cbflush], callback(:callback_cbflush)) if @flush_enabled
142
+
143
+ # Configure safe retries
144
+ # LCB_RETRYOPT_CREATE = Proc.new { |mode, policy| ((mode << 16) | policy) }
145
+ # val = LCB_RETRYOPT_CREATE(LCB_RETRY_ON_SOCKERR, LCB_RETRY_CMDS_SAFE);
146
+ # ::MTLibcouchbase::Ext.cntl_setu32(handle, LCB_CNTL_RETRYMODE, val)
147
+ retry_config = (1 << 16) | 3
148
+ ::MTLibcouchbase::Ext.cntl_setu32(@handle, 0x24, (1 << 16) | 3)
149
+
150
+ # Connect to the database
151
+ err = Ext.connect(@handle)
152
+ if err != :success
153
+ @bootstrap_defer.reject(Error.lookup(err).new('failed to schedule connect'))
154
+ Ext.destroy(@handle)
155
+ handle_destroyed
156
+ end
157
+ end
158
+ }
159
+
160
+ promise
161
+ end
162
+
163
+ # http://docs.couchbase.com/sdk-api/couchbase-c-client-2.6.2/group__lcb-cntl.html
164
+ def configure(setting, value)
165
+ # Ensure it is thread safe
166
+ defer = @reactor.defer
167
+ @reactor.schedule {
168
+ if @handle
169
+ err = Ext.cntl_string(@handle, setting.to_s, value.to_s)
170
+ if err == :success
171
+ defer.resolve(self)
172
+ else
173
+ defer.reject(Error.lookup(err).new("failed to configure #{setting}=#{value}"))
174
+ end
175
+ else
176
+ defer.reject(RuntimeError.new('not connected'))
177
+ end
178
+ }
179
+
180
+ defer.promise
181
+ end
182
+
183
+ def destroy
184
+ return @destroy_defer.promise if @destroy_defer
185
+
186
+ # Ensure it is thread safe
187
+ defer = @reactor.defer
188
+ if @handle
189
+ @reactor.schedule {
190
+ if @destroy_defer.nil?
191
+ @destroy_defer = defer
192
+ Ext.destroy(@handle)
193
+ handle_destroyed
194
+ defer.resolve(nil)
195
+ else
196
+ defer.resolve(@destroy_defer.promise)
197
+ end
198
+ }
199
+ else
200
+ defer.resolve(nil)
201
+ end
202
+ defer.promise
203
+ end
204
+
205
+ def get_server_list
206
+ defer = @reactor.defer
207
+
208
+ # Ensure it is thread safe
209
+ @reactor.schedule {
210
+ if @handle
211
+ nodes = Ext.get_num_nodes(@handle)
212
+ list = []
213
+ count = 0
214
+
215
+ while count <= nodes
216
+ list << Ext.get_node(@handle, :node_data, count)
217
+ count += 1
218
+ end
219
+
220
+ defer.resolve(list.uniq)
221
+ else
222
+ defer.reject(RuntimeError.new('not connected'))
223
+ end
224
+ }
225
+
226
+ defer.promise
227
+ end
228
+
229
+ def get_num_replicas
230
+ defer = @reactor.defer
231
+
232
+ # Ensure it is thread safe
233
+ @reactor.schedule {
234
+ if @handle
235
+ defer.resolve(Ext.get_num_replicas(@handle))
236
+ else
237
+ defer.reject(RuntimeError.new('not connected'))
238
+ end
239
+ }
240
+
241
+ defer.promise
242
+ end
243
+
244
+ def get_num_nodes
245
+ defer = @reactor.defer
246
+
247
+ # Ensure it is thread safe
248
+ @reactor.schedule {
249
+ if @handle
250
+ defer.resolve(Ext.get_num_nodes(@handle))
251
+ else
252
+ defer.reject(RuntimeError.new('not connected'))
253
+ end
254
+ }
255
+
256
+ defer.promise
257
+ end
258
+
259
+ # http://docs.couchbase.com/sdk-api/couchbase-c-client-2.6.2/group__lcb-store.html
260
+ # http://docs.couchbase.com/sdk-api/couchbase-c-client-2.6.2/group__lcb-durability.html
261
+ def store(key, value,
262
+ defer: nil,
263
+ operation: :set,
264
+ expire_in: nil,
265
+ expire_at: nil,
266
+ ttl: nil,
267
+ persist_to: 0,
268
+ replicate_to: 0,
269
+ cas: nil,
270
+ flags: 0,
271
+ **opts)
272
+ raise 'not connected' unless @handle
273
+ defer ||= @reactor.defer
274
+
275
+ # Check if this should be a durable operation
276
+ durable = (persist_to | replicate_to) != 0
277
+ if durable
278
+ cmd = Ext::CMDSTOREDUR.new
279
+ cmd[:persist_to] = persist_to
280
+ cmd[:replicate_to] = replicate_to
281
+ else
282
+ cmd = Ext::CMDSTORE.new
283
+ end
284
+ cmd[:operation] = operation
285
+ cmd[:flags] = flags
286
+
287
+ str_value = begin
288
+ [value].to_json[1...-1]
289
+ rescue
290
+ [value.respond_to?(:to_str) ? value.to_str : value.to_s].to_json[1...-1]
291
+ end
292
+
293
+ req = Request.new(cmd, defer)
294
+ req.value = value
295
+ cmd_set_value(req, cmd, str_value)
296
+ key = cmd_set_key(req, cmd, key)
297
+
298
+ cmd[:cas] = cas if cas
299
+ expire_in ||= ttl
300
+ cmd[:exptime] = expire_in ? expires_in(expire_in) : expire_at.to_i
301
+
302
+ @reactor.schedule {
303
+ pointer = cmd.to_ptr
304
+ @requests[pointer.address] = req
305
+ check_error(key, defer, durable ? Ext.storedur3(@handle, pointer, cmd) : Ext.store3(@handle, pointer, cmd))
306
+ }
307
+
308
+ defer.promise
309
+ end
310
+
311
+ # http://docs.couchbase.com/sdk-api/couchbase-c-client-2.6.2/group__lcb-get.html
312
+ def get(key, defer: nil, lock: false, cas: nil, **opts)
313
+ raise 'not connected' unless @handle
314
+ defer ||= @reactor.defer
315
+
316
+ cmd = Ext::CMDGET.new
317
+ req = Request.new(cmd, defer)
318
+ key = cmd_set_key(req, cmd, key)
319
+ cmd[:cas] = cas if cas
320
+
321
+ # exptime == the lock expire time
322
+ if lock
323
+ time = lock == true ? 30 : lock.to_i
324
+ time = 30 if time > 30 || time < 0
325
+
326
+ # We only want to lock if time is between 1 and 30
327
+ if time > 0
328
+ cmd[:exptime] = time
329
+ cmd[:lock] = 1
330
+ end
331
+ end
332
+
333
+ @reactor.schedule {
334
+ pointer = cmd.to_ptr
335
+ @requests[pointer.address] = req
336
+ check_error key, defer, Ext.get3(@handle, pointer, cmd)
337
+ }
338
+
339
+ defer.promise
340
+ end
341
+
342
+ # http://docs.couchbase.com/sdk-api/couchbase-c-client-2.6.2/group__lcb-lock.html
343
+ def unlock(key, cas: , **opts)
344
+ raise 'not connected' unless @handle
345
+ defer ||= @reactor.defer
346
+
347
+ cmd = Ext::CMDBASE.new
348
+ req = Request.new(cmd, defer)
349
+ key = cmd_set_key(req, cmd, key)
350
+ cmd[:cas] = cas
351
+
352
+ @reactor.schedule {
353
+ pointer = cmd.to_ptr
354
+ @requests[pointer.address] = Request.new(cmd, defer, key)
355
+ check_error key, defer, Ext.unlock3(@handle, pointer, cmd)
356
+ }
357
+
358
+ defer.promise
359
+ end
360
+
361
+ # http://docs.couchbase.com/sdk-api/couchbase-c-client-2.6.2/group__lcb-remove.html
362
+ def remove(key, defer: nil, cas: nil, **opts)
363
+ raise 'not connected' unless @handle
364
+ defer ||= @reactor.defer
365
+
366
+ cmd = Ext::CMDBASE.new
367
+ req = Request.new(cmd, defer)
368
+ key = cmd_set_key(req, cmd, key)
369
+ cmd[:cas] = cas if cas
370
+
371
+ @reactor.schedule {
372
+ pointer = cmd.to_ptr
373
+ @requests[pointer.address] = req
374
+ check_error key, defer, Ext.remove3(@handle, pointer, cmd)
375
+ }
376
+
377
+ defer.promise
378
+ end
379
+
380
+ # http://docs.couchbase.com/sdk-api/couchbase-c-client-2.6.2/group__lcb-counter.html
381
+ def counter(key, delta: 1, initial: nil, expire_in: nil, ttl: nil, expire_at: nil, cas: nil, **opts)
382
+ raise 'not connected' unless @handle
383
+ defer ||= @reactor.defer
384
+
385
+ cmd = Ext::CMDCOUNTER.new
386
+ req = Request.new(cmd, defer)
387
+ key = cmd_set_key(req, cmd, key)
388
+
389
+ cmd[:cas] = cas if cas
390
+ expire_in ||= ttl
391
+ cmd[:exptime] = expire_in ? expires_in(expire_in) : expire_at.to_i
392
+ cmd[:delta] = delta
393
+ if initial
394
+ cmd[:initial] = initial
395
+ cmd[:create] = 1
396
+ end
397
+
398
+ @reactor.schedule {
399
+ pointer = cmd.to_ptr
400
+ @requests[pointer.address] = req
401
+ check_error key, defer, Ext.counter3(@handle, pointer, cmd)
402
+ }
403
+
404
+ defer.promise
405
+ end
406
+
407
+ # http://docs.couchbase.com/sdk-api/couchbase-c-client-2.6.2/group__lcb-touch.html
408
+ def touch(key, expire_in: nil, ttl: nil, expire_at: nil, cas: nil, **opts)
409
+ raise 'not connected' unless @handle
410
+ raise ArgumentError.new('requires either expire_in or expire_at to be set') unless expire_in || expire_at
411
+ defer ||= @reactor.defer
412
+
413
+ cmd = Ext::CMDBASE.new
414
+ req = Request.new(cmd, defer)
415
+ key = cmd_set_key(req, cmd, key)
416
+
417
+ cmd[:cas] = cas if cas
418
+ expire_in ||= ttl
419
+ cmd[:exptime] = expire_in ? expires_in(expire_in) : expire_at.to_i
420
+
421
+ @reactor.schedule {
422
+ pointer = cmd.to_ptr
423
+ @requests[pointer.address] = req
424
+ check_error key, defer, Ext.touch3(@handle, pointer, cmd)
425
+ }
426
+
427
+ defer.promise
428
+ end
429
+
430
+ def subdoc(request, expire_in: nil, ttl: nil, expire_at: nil, cas: nil, **opts)
431
+ raise 'not connected' unless @handle
432
+ defer ||= @reactor.defer
433
+
434
+ cmd = Ext::CMDSUBDOC.new
435
+ req = Request.new(cmd, defer, request.key, request)
436
+ key = cmd_set_key(req, cmd, request.key)
437
+
438
+ cmd[:multimode] = request.mode == :mutate ? Ext::CMDSUBDOC::SDMULTI_MODE_MUTATE : Ext::CMDSUBDOC::SDMULTI_MODE_LOOKUP
439
+ cmd[:specs], cmd[:nspecs] = request.to_specs_array
440
+
441
+ cmd[:cas] = cas if cas
442
+ expire_in ||= ttl
443
+ cmd[:exptime] = expire_in ? expires_in(expire_in) : expire_at.to_i
444
+
445
+ @reactor.schedule {
446
+ pointer = cmd.to_ptr
447
+ @requests[pointer.address] = req
448
+ check_error(key, defer, Ext.subdoc3(@handle, pointer, cmd), subdoc: true)
449
+ request.free_memory
450
+ }
451
+
452
+ defer.promise
453
+ end
454
+
455
+ # http://docs.couchbase.com/sdk-api/couchbase-c-client-2.6.2/group__lcb-flush.html
456
+ def flush(defer: nil)
457
+ raise 'not connected' unless @handle
458
+ raise 'flush not enabled' unless @flush_enabled
459
+ defer ||= @reactor.defer
460
+
461
+ cmd = Ext::CMDBASE.new
462
+
463
+ @reactor.schedule {
464
+ pointer = cmd.to_ptr
465
+ @requests[pointer.address] = Request.new(cmd, defer, :flush)
466
+ check_error :flush, defer, Ext.cbflush3(@handle, pointer, cmd)
467
+ }
468
+
469
+ defer.promise
470
+ end
471
+
472
+
473
+ CMDHTTP_F_STREAM = 1<<16 # Stream the response (not used, we're only making simple requests)
474
+ CMDHTTP_F_CASTMO = 1<<17 # If specified, the lcb_CMDHTTP::cas field becomes the timeout
475
+ CMDHTTP_F_NOUPASS = 1<<18 # If specified, do not inject authentication header into the request.
476
+ HttpBodyRequired = [:put, :post].freeze
477
+
478
+ # http://docs.couchbase.com/sdk-api/couchbase-c-client-2.6.2/group__lcb-http.html
479
+ def http(path,
480
+ type: :view,
481
+ method: :get,
482
+ body: nil,
483
+ content_type: 'application/json',
484
+ defer: nil,
485
+ timeout: nil,
486
+ username: nil,
487
+ password: nil,
488
+ no_auth: false,
489
+ **opts)
490
+ raise 'not connected' unless @handle
491
+ raise 'unsupported request type' unless Ext::HttpTypeT[type]
492
+ raise 'unsupported HTTP method' unless Ext::HttpMethodT[method]
493
+ body_content = if HttpBodyRequired.include? method
494
+ raise 'no HTTP body provided' unless body
495
+ if body.is_a? String
496
+ body
497
+ else
498
+ # This will raise an error if not valid json
499
+ JSON.generate([body])[1..-2]
500
+ end
501
+ end
502
+
503
+ defer ||= @reactor.defer
504
+
505
+ cmd = Ext::CMDHTTP.new
506
+ req = Request.new(cmd, defer)
507
+ req.value = {
508
+ path: path,
509
+ method: method,
510
+ body: body,
511
+ content_type: content_type,
512
+ type: type,
513
+ no_auth: no_auth
514
+ }
515
+ cmd_set_key(req, cmd, path)
516
+
517
+ if timeout
518
+ cmd[:cas] = timeout
519
+ cmd[:cmdflags] |= CMDHTTP_F_CASTMO
520
+ end
521
+ cmd[:cmdflags] |= CMDHTTP_F_NOUPASS if no_auth
522
+ cmd[:type] = type
523
+ cmd[:method] = method
524
+
525
+ if body_content
526
+ cmd[:body] = req.ref(body_content)
527
+ cmd[:nbody] = body_content.bytesize
528
+ end
529
+ cmd[:content_type] = req.ref(content_type) if content_type
530
+ cmd[:username] = req.ref(username) if username
531
+ cmd[:password] = req.ref(password) if password
532
+
533
+
534
+ @reactor.schedule {
535
+ pointer = cmd.to_ptr
536
+ @requests[pointer.address] = req
537
+ check_error path, defer, Ext.http3(@handle, pointer, cmd)
538
+ }
539
+
540
+ defer.promise
541
+ end
542
+
543
+ def query_view(design, view, **opts)
544
+ QueryView.new(self, @reactor, design, view, **opts)
545
+ end
546
+
547
+ def full_text_search(index, **opts)
548
+ opts[:indexName] = index
549
+ QueryFullText.new(self, @reactor, **opts)
550
+ end
551
+
552
+ def n1ql_query(n1ql, **opts)
553
+ QueryN1QL.new(self, @reactor, n1ql, **opts)
554
+ end
555
+
556
+ def parse_document(raw_string)
557
+ val = begin
558
+ JSON.parse("[#{raw_string}]", DECODE_OPTIONS)[0]
559
+ rescue
560
+ raw_string
561
+ end
562
+ val
563
+ end
564
+
565
+ private
566
+
567
+
568
+ def cmd_set_key(req, cmd, value)
569
+ key = value.to_s
570
+ cmd[:key][:type] = :kv_copy
571
+ str = req.ref(key)
572
+ req.key = value
573
+ cmd[:key][:contig][:bytes] = str
574
+ cmd[:key][:contig][:nbytes] = key.bytesize
575
+ key
576
+ end
577
+
578
+ def cmd_set_value(req, cmd, value)
579
+ val = value.to_s
580
+ cmd[:value][:vtype] = :kv_copy
581
+ str = req.ref(val)
582
+ cmd[:value][:u_buf][:contig][:bytes] = str
583
+ cmd[:value][:u_buf][:contig][:nbytes] = val.bytesize
584
+ end
585
+
586
+ # 30 days in seconds
587
+ MAX_EXPIRY = 2_592_000
588
+
589
+ def expires_in(time)
590
+ period = time.to_i
591
+ if period > MAX_EXPIRY
592
+ Time.now.to_i + period
593
+ else
594
+ period
595
+ end
596
+ end
597
+
598
+ def check_error(key, defer, err, subdoc: false)
599
+ if err != :success
600
+ error = Error.lookup(err).new("request not scheduled for #{key}")
601
+ backtrace = caller
602
+ error.set_backtrace backtrace
603
+ defer.reject error
604
+ end
605
+ end
606
+
607
+ def handle_destroyed
608
+ @bootstrap_defer = nil
609
+ @handle = nil
610
+
611
+ # TODO:: cleanup IO opts?
612
+ cleanup_callbacks
613
+
614
+ @requests.each_value do |req|
615
+ err = Error::Sockshutdown.new('handle destroyed')
616
+ if req.is_a? Request
617
+ req.defer.reject(err)
618
+ else
619
+ # this is a view, n1ql or full text query
620
+ req.error(err)
621
+ end
622
+ end
623
+ @requests = nil
624
+ end
625
+
626
+ def bootstrap_callback(handle, error_code)
627
+ error_name = Ext::ErrorT[error_code]
628
+
629
+ if error_code == Ext::ErrorT[:success]
630
+ @bootstrap_defer.resolve(self)
631
+ @bootstrap_defer = nil
632
+ else
633
+ @bootstrap_defer.reject(Error.lookup(error_code).new("bootstrap failed #{error_code}: #{error_name}"))
634
+ handle_destroyed
635
+ end
636
+ end
637
+
638
+ # ==================
639
+ # Response Callbacks
640
+ # ==================
641
+ DECODE_OPTIONS = {
642
+ symbolize_names: true
643
+ }.freeze
644
+
645
+ def callback_get(handle, type, response)
646
+ resp = Ext::RESPGET.new response
647
+ resp_callback_common(resp, :callback_get) do |req, cb|
648
+ raw_string = resp[:value].read_string(resp[:nvalue])
649
+ val = parse_document(raw_string)
650
+ Response.new(cb, req.key, resp[:cas], val, {flags: resp[:itmflags]})
651
+ end
652
+ end
653
+
654
+ def callback_store(handle, type, response)
655
+ resp = Ext::RESPSTORE.new response
656
+ resp_callback_common(resp, :callback_store) do |req, cb|
657
+ Response.new(cb, req.key, resp[:cas], req.value)
658
+ end
659
+ end
660
+
661
+ Durability = Struct.new(:nresponses, :exists_master, :persisted_master, :npersisted, :nreplicated, :error)
662
+
663
+ def callback_storedur(handle, type, response)
664
+ resp = Ext::RESPSTOREDUR.new response
665
+ resp_callback_common(resp, :callback_storedur) do |req, cb|
666
+ info = resp[:dur_resp]
667
+ dur = Durability.new(
668
+ info[:nresponses],
669
+ info[:exists_master],
670
+ info[:persisted_master],
671
+ info[:npersisted],
672
+ info[:nreplicated],
673
+ info[:rc]
674
+ )
675
+ Response.new(cb, req.key, resp[:cas], req.value, dur)
676
+ end
677
+ end
678
+
679
+ def callback_counter(handle, type, response)
680
+ resp = Ext::RESPCOUNTER.new response
681
+ resp_callback_common(resp, :callback_counter) do |req, cb|
682
+ Response.new(cb, req.key, resp[:cas], resp[:value])
683
+ end
684
+ end
685
+
686
+ def callback_touch(handle, type, response)
687
+ resp = Ext::RESPBASE.new response
688
+ resp_callback_common(resp, :callback_touch) do |req, cb|
689
+ Response.new(cb, req.key, resp[:cas])
690
+ end
691
+ end
692
+
693
+ def callback_remove(handle, type, response)
694
+ resp = Ext::RESPBASE.new response
695
+ resp_callback_common(resp, :callback_remove) do |req, cb|
696
+ Response.new(cb, req.key, resp[:cas])
697
+ end
698
+ end
699
+
700
+ def callback_unlock(handle, type, response)
701
+ resp = Ext::RESPBASE.new response
702
+ resp_callback_common(resp, :callback_unlock) do |req, cb|
703
+ Response.new(cb, req.key, resp[:cas])
704
+ end
705
+ end
706
+
707
+ def callback_sdlookup(handle, type, response)
708
+ resp = Ext::RESPSUBDOC.new response
709
+ resp_callback_common(resp, :callback_sdlookup) do |req, cb|
710
+ subdoc_common(resp, req, cb)
711
+ end
712
+ end
713
+
714
+ # Only counter returns a result
715
+ def callback_sdmutate(handle, type, response)
716
+ resp = Ext::RESPSUBDOC.new response
717
+ resp_callback_common(resp, :callback_sdmutate) do |req, cb|
718
+ subdoc_common(resp, req, cb)
719
+ end
720
+ end
721
+
722
+ def subdoc_common(resp, req, cb)
723
+ iterval = FFI::MemoryPointer.new(:ulong, 1)
724
+ cur_res = Ext::SDENTRY.new
725
+ values = []
726
+ index = 0
727
+
728
+ ignore = req.value.ignore
729
+ mutation = req.value.mode == :mutate
730
+
731
+ loop do
732
+ check = Ext.sdresult_next(resp, cur_res, iterval)
733
+ break if check == 0
734
+
735
+ if cur_res[:status] == :success
736
+ count = cur_res[:nvalue]
737
+ if count > 0
738
+ result = cur_res[:value].read_string(count)
739
+ else
740
+ result = true # success response
741
+ end
742
+ result = "[#{result}]"
743
+ values << JSON.parse(result, DECODE_OPTIONS)[0]
744
+ elsif cur_res[:status] == :subdoc_path_enoent && ignore[mutation ? cur_res[:index] : index]
745
+ values << nil
746
+ else
747
+ values << Error.lookup(cur_res[:status]).new("Subdoc #{cb} failed for #{req.key} index #{mutation ? cur_res[:index] : index}")
748
+ end
749
+
750
+ index += 1
751
+ end
752
+
753
+ # Return the single result instead of an array if single
754
+ is_single = (resp[:rflags] & Ext::RESPFLAGS[:resp_f_sdsingle]) > 0
755
+ if is_single
756
+ values = values.first
757
+ elsif values.empty? # multiple mutate arrays should return true (same as a single mutate)
758
+ values = true
759
+ end
760
+
761
+ Response.new(cb, req.key, resp[:cas], values)
762
+ end
763
+
764
+ def callback_cbflush(handle, type, response)
765
+ resp = Ext::RESPBASE.new response
766
+ resp_callback_common(resp, :callback_cbflush) do |req, cb|
767
+ Response.new(cb)
768
+ end
769
+ end
770
+
771
+ def callback_http(handle, type, response)
772
+ resp = Ext::RESPHTTP.new response
773
+ resp_callback_common(resp, :callback_http) do |req, cb|
774
+ headers = {}
775
+ head_ptr = resp[:headers]
776
+ if not head_ptr.null?
777
+ head_ptr.get_array_of_string(0).each_slice(2) do |key, value|
778
+ headers[key] = value
779
+ end
780
+ end
781
+ body = body_text(resp)
782
+
783
+ if (200...300).include? resp[:htstatus]
784
+ HttpResponse.new(cb, resp[:htstatus], headers, body, req.value)
785
+ else
786
+ err = Error::HttpResponseError.new "non success response for #{req.key}"
787
+ err.code = resp[:htstatus]
788
+ err.headers = headers
789
+ err.body = body
790
+ req.defer.reject(err)
791
+ end
792
+ end
793
+ end
794
+
795
+ def resp_callback_common(resp, callback)
796
+ req = @requests.delete(resp[:cookie].address)
797
+ if req
798
+ begin
799
+ # Errors will be provided in the response
800
+ if resp[:rc] == :success || resp[:rc] == :subdoc_multi_failure
801
+ req.defer.resolve(yield(req, callback))
802
+ else
803
+ lookup = resp[:rc]
804
+ req.defer.reject(Error.lookup(lookup).new("#{callback} failed for #{req.key} with #{lookup}"))
805
+ end
806
+ rescue => e
807
+ req.defer.reject(e)
808
+ end
809
+ else
810
+ @reactor.log IOError.new("received #{callback} for unknown request")
811
+ end
812
+ end
813
+ # ======================
814
+ # End Response Callbacks
815
+ # ======================
816
+
817
+ # http://docs.couchbase.com/sdk-api/couchbase-c-client-2.6.2/group__lcb-view-api.html
818
+ def viewquery_callback(handle, type, row)
819
+ row_data = Ext::RESPVIEWQUERY.new row
820
+ view = @requests[row_data[:cookie].address]
821
+
822
+ if row_data[:rc] == :success
823
+ if (row_data[:rflags] & Ext::RESPFLAGS[:resp_f_final]) > 0
824
+ # We can assume this is JSON
825
+ view.received_final(JSON.parse(row_data[:value].read_string(row_data[:nvalue]), DECODE_OPTIONS))
826
+ else
827
+ view.received(row_data)
828
+ end
829
+ else
830
+ error_klass = Error.lookup(row_data[:rc])
831
+ if error_klass == Error::HttpError
832
+ http_resp = row_data[:htresp]
833
+ view.error error_klass.new(body_text(http_resp))
834
+ else
835
+ view.error error_klass.new
836
+ end
837
+ end
838
+ end
839
+
840
+ # N1QL query response
841
+ # @see http://docs.couchbase.com/sdk-api/couchbase-c-client-2.6.2/group__lcb-n1ql-api.html
842
+ def n1ql_callback(handle, type, row)
843
+ query_callback_common Ext::RESPN1QL.new(row)
844
+ end
845
+
846
+ # Full text search
847
+ # @see http://docs.couchbase.com/sdk-api/couchbase-c-client-2.6.2/group__lcb-cbft-api.html
848
+ def fts_callback(handle, type, row)
849
+ query_callback_common Ext::RESPFTS.new(row)
850
+ end
851
+
852
+ # Common code to process both N1QL and FTS callbacks
853
+ def query_callback_common(row_data)
854
+ view = @requests[row_data[:cookie].address]
855
+
856
+ if row_data[:rc] == :success
857
+ value = JSON.parse(row_text(row_data), DECODE_OPTIONS)
858
+
859
+ if (row_data[:rflags] & Ext::RESPFLAGS[:resp_f_final]) > 0
860
+ # We can assume this is JSON
861
+ view.received_final(value)
862
+ else
863
+ view.received(value)
864
+ end
865
+ else
866
+ error_klass = Error.lookup(row_data[:rc])
867
+ if error_klass == Error::HttpError
868
+ http_resp = row_data[:htresp]
869
+ body_text = body_text(http_resp)
870
+ body_text = row_text(row_data) if body_text.empty?
871
+ view.error error_klass.new(body_text)
872
+ else
873
+ view.error error_klass.new
874
+ end
875
+ end
876
+ end
877
+
878
+ # Extracts the row content of a response
879
+ def row_text(row_data)
880
+ if row_data[:nrow] > 0
881
+ row_data[:row].read_string(row_data[:nrow])
882
+ else
883
+ ''
884
+ end
885
+ end
886
+
887
+ # Extracts the body content of a HTTP response
888
+ def body_text(http_resp)
889
+ if http_resp[:nbody] > 0
890
+ http_resp[:body].read_string(http_resp[:nbody])
891
+ else
892
+ ''
893
+ end
894
+ end
895
+ end
896
+ end