libcouchbase 0.0.1

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 (561) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +35 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +24 -0
  8. data/README.md +389 -0
  9. data/Rakefile +75 -0
  10. data/ext/README.md +6 -0
  11. data/ext/Rakefile +20 -0
  12. data/ext/libcouchbase/.gitignore +130 -0
  13. data/ext/libcouchbase/.travis.yml +19 -0
  14. data/ext/libcouchbase/CMakeLists.txt +429 -0
  15. data/ext/libcouchbase/CONTRIBUTING.md +124 -0
  16. data/ext/libcouchbase/LICENSE +202 -0
  17. data/ext/libcouchbase/README.markdown +163 -0
  18. data/ext/libcouchbase/RELEASE_NOTES.markdown +2691 -0
  19. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +27 -0
  20. data/ext/libcouchbase/cmake/Modules/CopyPDB.cmake +42 -0
  21. data/ext/libcouchbase/cmake/Modules/DistScript.cmake +17 -0
  22. data/ext/libcouchbase/cmake/Modules/DownloadLcbDep.cmake +20 -0
  23. data/ext/libcouchbase/cmake/Modules/FindCouchbaseHdrHistogram.cmake +15 -0
  24. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibev.cmake +73 -0
  25. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +52 -0
  26. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +56 -0
  27. data/ext/libcouchbase/cmake/Modules/FindCouchbaseSnappy.cmake +11 -0
  28. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +29 -0
  29. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +133 -0
  30. data/ext/libcouchbase/cmake/Modules/GetPlatformCCInfo.cmake +45 -0
  31. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +70 -0
  32. data/ext/libcouchbase/cmake/config-cmake.h.in +60 -0
  33. data/ext/libcouchbase/cmake/configure +357 -0
  34. data/ext/libcouchbase/cmake/defs.mk.in +8 -0
  35. data/ext/libcouchbase/cmake/dtrace-instr-link.pl +38 -0
  36. data/ext/libcouchbase/cmake/source_files.cmake +73 -0
  37. data/ext/libcouchbase/configure.pl +1 -0
  38. data/ext/libcouchbase/contrib/cJSON/cJSON.c +624 -0
  39. data/ext/libcouchbase/contrib/cJSON/cJSON.h +158 -0
  40. data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +9 -0
  41. data/ext/libcouchbase/contrib/cbsasl/COPYING +202 -0
  42. data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +217 -0
  43. data/ext/libcouchbase/contrib/cbsasl/src/client.c +205 -0
  44. data/ext/libcouchbase/contrib/cbsasl/src/common.c +46 -0
  45. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.c +67 -0
  46. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.h +33 -0
  47. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.c +296 -0
  48. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.h +45 -0
  49. data/ext/libcouchbase/contrib/cbsasl/src/hash.c +573 -0
  50. data/ext/libcouchbase/contrib/cbsasl/src/hash.h +15 -0
  51. data/ext/libcouchbase/contrib/cbsasl/src/util.h +31 -0
  52. data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +2 -0
  53. data/ext/libcouchbase/contrib/cliopts/cliopts.c +747 -0
  54. data/ext/libcouchbase/contrib/cliopts/cliopts.h +493 -0
  55. data/ext/libcouchbase/contrib/genhash/genhash.c +372 -0
  56. data/ext/libcouchbase/contrib/genhash/genhash.h +235 -0
  57. data/ext/libcouchbase/contrib/gtest-1.7.0/CHANGES +157 -0
  58. data/ext/libcouchbase/contrib/gtest-1.7.0/CMakeLists.txt +252 -0
  59. data/ext/libcouchbase/contrib/gtest-1.7.0/CONTRIBUTORS +37 -0
  60. data/ext/libcouchbase/contrib/gtest-1.7.0/LICENSE +28 -0
  61. data/ext/libcouchbase/contrib/gtest-1.7.0/MINIFY.sh +15 -0
  62. data/ext/libcouchbase/contrib/gtest-1.7.0/README +435 -0
  63. data/ext/libcouchbase/contrib/gtest-1.7.0/cmake/internal_utils.cmake +227 -0
  64. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h +294 -0
  65. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-message.h +250 -0
  66. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h +1421 -0
  67. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump +487 -0
  68. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-printers.h +855 -0
  69. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-spi.h +232 -0
  70. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h +179 -0
  71. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h +259 -0
  72. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest.h +2291 -0
  73. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h +358 -0
  74. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_prod.h +58 -0
  75. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h +319 -0
  76. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h +206 -0
  77. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h +1158 -0
  78. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
  79. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h +5143 -0
  80. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
  81. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h +619 -0
  82. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h +1947 -0
  83. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h +167 -0
  84. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h +1012 -0
  85. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump +339 -0
  86. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h +3331 -0
  87. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump +297 -0
  88. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-all.cc +48 -0
  89. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-death-test.cc +1344 -0
  90. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-filepath.cc +382 -0
  91. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-internal-inl.h +1218 -0
  92. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-port.cc +805 -0
  93. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-printers.cc +363 -0
  94. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-test-part.cc +110 -0
  95. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-typed-test.cc +110 -0
  96. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest.cc +5015 -0
  97. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest_main.cc +38 -0
  98. data/ext/libcouchbase/contrib/http_parser/LICENSE-MIT +23 -0
  99. data/ext/libcouchbase/contrib/http_parser/README.md +178 -0
  100. data/ext/libcouchbase/contrib/http_parser/http_parser.c +2060 -0
  101. data/ext/libcouchbase/contrib/http_parser/http_parser.h +321 -0
  102. data/ext/libcouchbase/contrib/jsonsl/LICENSE +20 -0
  103. data/ext/libcouchbase/contrib/jsonsl/jsonsl.c +1452 -0
  104. data/ext/libcouchbase/contrib/jsonsl/jsonsl.h +971 -0
  105. data/ext/libcouchbase/contrib/lcb-jsoncpp/CMakeLists.txt +6 -0
  106. data/ext/libcouchbase/contrib/lcb-jsoncpp/LICENSE +55 -0
  107. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp-forwards.h +255 -0
  108. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +4892 -0
  109. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.h +1961 -0
  110. data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +8 -0
  111. data/ext/libcouchbase/contrib/snappy/COPYING +28 -0
  112. data/ext/libcouchbase/contrib/snappy/snappy-c.cc +90 -0
  113. data/ext/libcouchbase/contrib/snappy/snappy-c.h +138 -0
  114. data/ext/libcouchbase/contrib/snappy/snappy-internal.h +150 -0
  115. data/ext/libcouchbase/contrib/snappy/snappy-lcb-msvc.h +5 -0
  116. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +71 -0
  117. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.h +137 -0
  118. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.cc +42 -0
  119. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.h +491 -0
  120. data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +98 -0
  121. data/ext/libcouchbase/contrib/snappy/snappy.cc +1307 -0
  122. data/ext/libcouchbase/contrib/snappy/snappy.h +184 -0
  123. data/ext/libcouchbase/contrib/win32-defs/iocpdefs.h +133 -0
  124. data/ext/libcouchbase/contrib/win32-defs/mingwdefs.h +4396 -0
  125. data/ext/libcouchbase/contrib/win32-defs/win_stdint.h +258 -0
  126. data/ext/libcouchbase/example/CMakeLists.txt +37 -0
  127. data/ext/libcouchbase/example/README.markdown +47 -0
  128. data/ext/libcouchbase/example/db/db.c +167 -0
  129. data/ext/libcouchbase/example/db/vb.c +227 -0
  130. data/ext/libcouchbase/example/instancepool/main.cc +102 -0
  131. data/ext/libcouchbase/example/instancepool/pool.cc +102 -0
  132. data/ext/libcouchbase/example/instancepool/pool.h +69 -0
  133. data/ext/libcouchbase/example/libeventdirect/main.c +148 -0
  134. data/ext/libcouchbase/example/mcc/mcc.cc +246 -0
  135. data/ext/libcouchbase/example/minimal/minimal.c +130 -0
  136. data/ext/libcouchbase/example/observe/observe.c +146 -0
  137. data/ext/libcouchbase/example/subdoc/subdoc-multi.cc +132 -0
  138. data/ext/libcouchbase/example/subdoc/subdoc-simple.cc +191 -0
  139. data/ext/libcouchbase/example/tick/tick.c +119 -0
  140. data/ext/libcouchbase/example/views/views-example.cc +83 -0
  141. data/ext/libcouchbase/include/libcouchbase/_cxxwrap.h +150 -0
  142. data/ext/libcouchbase/include/libcouchbase/api-legacy.h +1689 -0
  143. data/ext/libcouchbase/include/libcouchbase/api3.h +2 -0
  144. data/ext/libcouchbase/include/libcouchbase/assert.h +44 -0
  145. data/ext/libcouchbase/include/libcouchbase/cbft.h +109 -0
  146. data/ext/libcouchbase/include/libcouchbase/cntl-private.h +356 -0
  147. data/ext/libcouchbase/include/libcouchbase/cntl.h +937 -0
  148. data/ext/libcouchbase/include/libcouchbase/configuration.h.in +23 -0
  149. data/ext/libcouchbase/include/libcouchbase/couchbase.h +3677 -0
  150. data/ext/libcouchbase/include/libcouchbase/deprecated.h +300 -0
  151. data/ext/libcouchbase/include/libcouchbase/error.h +595 -0
  152. data/ext/libcouchbase/include/libcouchbase/http.h +1 -0
  153. data/ext/libcouchbase/include/libcouchbase/iops.h +1050 -0
  154. data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +263 -0
  155. data/ext/libcouchbase/include/libcouchbase/kvbuf.h +132 -0
  156. data/ext/libcouchbase/include/libcouchbase/n1ql.h +364 -0
  157. data/ext/libcouchbase/include/libcouchbase/pktfwd.h +270 -0
  158. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +367 -0
  159. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr-inl.c +76 -0
  160. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr.h +199 -0
  161. data/ext/libcouchbase/include/libcouchbase/subdoc.h +312 -0
  162. data/ext/libcouchbase/include/libcouchbase/sysdefs.h +98 -0
  163. data/ext/libcouchbase/include/libcouchbase/vbucket.h +643 -0
  164. data/ext/libcouchbase/include/libcouchbase/views.h +298 -0
  165. data/ext/libcouchbase/include/libcouchbase/visibility.h +65 -0
  166. data/ext/libcouchbase/include/memcached/COPYING +30 -0
  167. data/ext/libcouchbase/include/memcached/README +10 -0
  168. data/ext/libcouchbase/include/memcached/protocol_binary.h +1916 -0
  169. data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
  170. data/ext/libcouchbase/packaging/README +7 -0
  171. data/ext/libcouchbase/packaging/abicheck/.gitignore +4 -0
  172. data/ext/libcouchbase/packaging/abicheck/Makefile +17 -0
  173. data/ext/libcouchbase/packaging/abicheck/README.md +27 -0
  174. data/ext/libcouchbase/packaging/abicheck/template.xml +3 -0
  175. data/ext/libcouchbase/packaging/deb/compat +1 -0
  176. data/ext/libcouchbase/packaging/deb/control +73 -0
  177. data/ext/libcouchbase/packaging/deb/copyright +10 -0
  178. data/ext/libcouchbase/packaging/deb/libcouchbase-dev.docs +3 -0
  179. data/ext/libcouchbase/packaging/deb/package.mk +31 -0
  180. data/ext/libcouchbase/packaging/deb/rules +46 -0
  181. data/ext/libcouchbase/packaging/deb/source/format +1 -0
  182. data/ext/libcouchbase/packaging/distinfo/README +1 -0
  183. data/ext/libcouchbase/packaging/distinfo/distinfo.cmake.in +4 -0
  184. data/ext/libcouchbase/packaging/dllversion.rc.in +39 -0
  185. data/ext/libcouchbase/packaging/libcouchbase.pc.in +10 -0
  186. data/ext/libcouchbase/packaging/nuget/libcouchbase.autopkg +76 -0
  187. data/ext/libcouchbase/packaging/parse-git-describe.pl +166 -0
  188. data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +108 -0
  189. data/ext/libcouchbase/packaging/rpm/package.mk +40 -0
  190. data/ext/libcouchbase/plugins/io/iocp/CMakeLists.txt +9 -0
  191. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.c +466 -0
  192. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.h +217 -0
  193. data/ext/libcouchbase/plugins/io/iocp/iocp_loop.c +295 -0
  194. data/ext/libcouchbase/plugins/io/iocp/iocp_timer.c +79 -0
  195. data/ext/libcouchbase/plugins/io/iocp/iocp_util.c +229 -0
  196. data/ext/libcouchbase/plugins/io/libev/CMakeLists.txt +29 -0
  197. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +65 -0
  198. data/ext/libcouchbase/plugins/io/libev/plugin-libev.c +289 -0
  199. data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +29 -0
  200. data/ext/libcouchbase/plugins/io/libevent/libevent_io_opts.h +67 -0
  201. data/ext/libcouchbase/plugins/io/libevent/plugin-libevent.c +292 -0
  202. data/ext/libcouchbase/plugins/io/libuv/CMakeLists.txt +42 -0
  203. data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +212 -0
  204. data/ext/libcouchbase/plugins/io/libuv/libuv_io_opts.h +118 -0
  205. data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +148 -0
  206. data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +648 -0
  207. data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +11 -0
  208. data/ext/libcouchbase/plugins/io/select/plugin-select.c +448 -0
  209. data/ext/libcouchbase/plugins/io/select/select_io_opts.h +39 -0
  210. data/ext/libcouchbase/src/README.md +103 -0
  211. data/ext/libcouchbase/src/aspend.h +106 -0
  212. data/ext/libcouchbase/src/auth.cc +74 -0
  213. data/ext/libcouchbase/src/auth.h +54 -0
  214. data/ext/libcouchbase/src/bootstrap.c +269 -0
  215. data/ext/libcouchbase/src/bootstrap.h +129 -0
  216. data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +495 -0
  217. data/ext/libcouchbase/src/bucketconfig/bc_file.c +347 -0
  218. data/ext/libcouchbase/src/bucketconfig/bc_http.c +630 -0
  219. data/ext/libcouchbase/src/bucketconfig/bc_http.h +82 -0
  220. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
  221. data/ext/libcouchbase/src/bucketconfig/clconfig.h +681 -0
  222. data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
  223. data/ext/libcouchbase/src/callbacks.c +378 -0
  224. data/ext/libcouchbase/src/cbft.cc +210 -0
  225. data/ext/libcouchbase/src/cntl.cc +847 -0
  226. data/ext/libcouchbase/src/config_static.h +159 -0
  227. data/ext/libcouchbase/src/connspec.cc +462 -0
  228. data/ext/libcouchbase/src/connspec.h +105 -0
  229. data/ext/libcouchbase/src/ctx-log-inl.h +27 -0
  230. data/ext/libcouchbase/src/dump.c +98 -0
  231. data/ext/libcouchbase/src/getconfig.c +100 -0
  232. data/ext/libcouchbase/src/gethrtime.c +109 -0
  233. data/ext/libcouchbase/src/handler.c +922 -0
  234. data/ext/libcouchbase/src/hashset.c +164 -0
  235. data/ext/libcouchbase/src/hashset.h +86 -0
  236. data/ext/libcouchbase/src/hashtable.c +75 -0
  237. data/ext/libcouchbase/src/hdr_timings.c +92 -0
  238. data/ext/libcouchbase/src/hostlist.cc +301 -0
  239. data/ext/libcouchbase/src/hostlist.h +171 -0
  240. data/ext/libcouchbase/src/http/http-priv.h +307 -0
  241. data/ext/libcouchbase/src/http/http.cc +633 -0
  242. data/ext/libcouchbase/src/http/http.h +34 -0
  243. data/ext/libcouchbase/src/http/http_io.cc +307 -0
  244. data/ext/libcouchbase/src/instance.cc +722 -0
  245. data/ext/libcouchbase/src/internal.h +244 -0
  246. data/ext/libcouchbase/src/iofactory.c +575 -0
  247. data/ext/libcouchbase/src/jsparse/parser.cc +519 -0
  248. data/ext/libcouchbase/src/jsparse/parser.h +173 -0
  249. data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
  250. data/ext/libcouchbase/src/lcbht/lcbht.h +199 -0
  251. data/ext/libcouchbase/src/lcbio/connect.c +557 -0
  252. data/ext/libcouchbase/src/lcbio/connect.h +364 -0
  253. data/ext/libcouchbase/src/lcbio/ctx.c +611 -0
  254. data/ext/libcouchbase/src/lcbio/ctx.h +405 -0
  255. data/ext/libcouchbase/src/lcbio/iotable.c +290 -0
  256. data/ext/libcouchbase/src/lcbio/iotable.h +84 -0
  257. data/ext/libcouchbase/src/lcbio/ioutils.c +350 -0
  258. data/ext/libcouchbase/src/lcbio/ioutils.h +203 -0
  259. data/ext/libcouchbase/src/lcbio/lcbio.h +51 -0
  260. data/ext/libcouchbase/src/lcbio/manager.c +584 -0
  261. data/ext/libcouchbase/src/lcbio/manager.h +156 -0
  262. data/ext/libcouchbase/src/lcbio/protoctx.c +84 -0
  263. data/ext/libcouchbase/src/lcbio/rw-inl.h +115 -0
  264. data/ext/libcouchbase/src/lcbio/ssl.h +149 -0
  265. data/ext/libcouchbase/src/lcbio/timer-ng.h +179 -0
  266. data/ext/libcouchbase/src/lcbio/timer.c +132 -0
  267. data/ext/libcouchbase/src/legacy.c +430 -0
  268. data/ext/libcouchbase/src/list.c +144 -0
  269. data/ext/libcouchbase/src/list.h +127 -0
  270. data/ext/libcouchbase/src/logging.c +244 -0
  271. data/ext/libcouchbase/src/logging.h +86 -0
  272. data/ext/libcouchbase/src/mc/compress.c +90 -0
  273. data/ext/libcouchbase/src/mc/compress.h +61 -0
  274. data/ext/libcouchbase/src/mc/forward.c +186 -0
  275. data/ext/libcouchbase/src/mc/forward.h +90 -0
  276. data/ext/libcouchbase/src/mc/iovcursor-inl.h +279 -0
  277. data/ext/libcouchbase/src/mc/iovcursor.h +66 -0
  278. data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +111 -0
  279. data/ext/libcouchbase/src/mc/mcreq.c +954 -0
  280. data/ext/libcouchbase/src/mc/mcreq.h +977 -0
  281. data/ext/libcouchbase/src/mcserver/mcserver.c +784 -0
  282. data/ext/libcouchbase/src/mcserver/mcserver.h +121 -0
  283. data/ext/libcouchbase/src/mcserver/negotiate.c +656 -0
  284. data/ext/libcouchbase/src/mcserver/negotiate.h +119 -0
  285. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +860 -0
  286. data/ext/libcouchbase/src/n1ql/n1ql-internal.h +22 -0
  287. data/ext/libcouchbase/src/n1ql/n1ql.cc +729 -0
  288. data/ext/libcouchbase/src/n1ql/params.cc +215 -0
  289. data/ext/libcouchbase/src/netbuf/netbuf-defs.h +89 -0
  290. data/ext/libcouchbase/src/netbuf/netbuf-mblock.h +235 -0
  291. data/ext/libcouchbase/src/netbuf/netbuf.c +929 -0
  292. data/ext/libcouchbase/src/netbuf/netbuf.h +452 -0
  293. data/ext/libcouchbase/src/newconfig.c +385 -0
  294. data/ext/libcouchbase/src/nodeinfo.cc +194 -0
  295. data/ext/libcouchbase/src/operations/cbflush.c +71 -0
  296. data/ext/libcouchbase/src/operations/counter.c +116 -0
  297. data/ext/libcouchbase/src/operations/durability-cas.c +224 -0
  298. data/ext/libcouchbase/src/operations/durability-seqno.c +157 -0
  299. data/ext/libcouchbase/src/operations/durability.c +668 -0
  300. data/ext/libcouchbase/src/operations/durability_internal.h +199 -0
  301. data/ext/libcouchbase/src/operations/get.c +409 -0
  302. data/ext/libcouchbase/src/operations/observe-seqno.c +96 -0
  303. data/ext/libcouchbase/src/operations/observe.c +340 -0
  304. data/ext/libcouchbase/src/operations/pktfwd.c +86 -0
  305. data/ext/libcouchbase/src/operations/remove.c +83 -0
  306. data/ext/libcouchbase/src/operations/stats.c +461 -0
  307. data/ext/libcouchbase/src/operations/store.c +360 -0
  308. data/ext/libcouchbase/src/operations/subdoc.cc +510 -0
  309. data/ext/libcouchbase/src/operations/touch.c +81 -0
  310. data/ext/libcouchbase/src/packetutils.c +60 -0
  311. data/ext/libcouchbase/src/packetutils.h +147 -0
  312. data/ext/libcouchbase/src/probes.d +211 -0
  313. data/ext/libcouchbase/src/rdb/bigalloc.c +225 -0
  314. data/ext/libcouchbase/src/rdb/bigalloc.h +73 -0
  315. data/ext/libcouchbase/src/rdb/chunkalloc.c +174 -0
  316. data/ext/libcouchbase/src/rdb/libcalloc.c +94 -0
  317. data/ext/libcouchbase/src/rdb/rope.c +419 -0
  318. data/ext/libcouchbase/src/rdb/rope.h +488 -0
  319. data/ext/libcouchbase/src/retrychk.c +113 -0
  320. data/ext/libcouchbase/src/retryq.c +424 -0
  321. data/ext/libcouchbase/src/retryq.h +157 -0
  322. data/ext/libcouchbase/src/ringbuffer.c +442 -0
  323. data/ext/libcouchbase/src/ringbuffer.h +100 -0
  324. data/ext/libcouchbase/src/settings.c +95 -0
  325. data/ext/libcouchbase/src/settings.h +188 -0
  326. data/ext/libcouchbase/src/simplestring.c +211 -0
  327. data/ext/libcouchbase/src/simplestring.h +228 -0
  328. data/ext/libcouchbase/src/sllist-inl.h +197 -0
  329. data/ext/libcouchbase/src/sllist.h +76 -0
  330. data/ext/libcouchbase/src/ssl/CMakeLists.txt +23 -0
  331. data/ext/libcouchbase/src/ssl/ssl_c.c +415 -0
  332. data/ext/libcouchbase/src/ssl/ssl_common.c +454 -0
  333. data/ext/libcouchbase/src/ssl/ssl_e.c +408 -0
  334. data/ext/libcouchbase/src/ssl/ssl_iot_common.h +180 -0
  335. data/ext/libcouchbase/src/ssobuf.h +82 -0
  336. data/ext/libcouchbase/src/strcodecs/base64.c +123 -0
  337. data/ext/libcouchbase/src/strcodecs/strcodecs.h +285 -0
  338. data/ext/libcouchbase/src/timings.c +208 -0
  339. data/ext/libcouchbase/src/trace.h +105 -0
  340. data/ext/libcouchbase/src/utilities.c +171 -0
  341. data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -0
  342. data/ext/libcouchbase/src/vbucket/aliases.h +35 -0
  343. data/ext/libcouchbase/src/vbucket/crc32.h +83 -0
  344. data/ext/libcouchbase/src/vbucket/hash.h +30 -0
  345. data/ext/libcouchbase/src/vbucket/json-inl.h +112 -0
  346. data/ext/libcouchbase/src/vbucket/ketama.c +66 -0
  347. data/ext/libcouchbase/src/vbucket/rfc1321/global.h +32 -0
  348. data/ext/libcouchbase/src/vbucket/rfc1321/md5.h +35 -0
  349. data/ext/libcouchbase/src/vbucket/rfc1321/md5c-inl.h +335 -0
  350. data/ext/libcouchbase/src/vbucket/vbucket.c +1543 -0
  351. data/ext/libcouchbase/src/views/docreq.c +194 -0
  352. data/ext/libcouchbase/src/views/docreq.h +83 -0
  353. data/ext/libcouchbase/src/views/viewreq.c +358 -0
  354. data/ext/libcouchbase/src/views/viewreq.h +36 -0
  355. data/ext/libcouchbase/src/wait.c +161 -0
  356. data/ext/libcouchbase/tests/CMakeLists.txt +140 -0
  357. data/ext/libcouchbase/tests/basic/t_base64.cc +81 -0
  358. data/ext/libcouchbase/tests/basic/t_ccbc103.cc +95 -0
  359. data/ext/libcouchbase/tests/basic/t_connstr.cc +404 -0
  360. data/ext/libcouchbase/tests/basic/t_creds.cc +32 -0
  361. data/ext/libcouchbase/tests/basic/t_ctlcodes.cc +92 -0
  362. data/ext/libcouchbase/tests/basic/t_hashset.cc +262 -0
  363. data/ext/libcouchbase/tests/basic/t_host.cc +198 -0
  364. data/ext/libcouchbase/tests/basic/t_jsparse.cc +137 -0
  365. data/ext/libcouchbase/tests/basic/t_jsparse.h +589 -0
  366. data/ext/libcouchbase/tests/basic/t_list.cc +155 -0
  367. data/ext/libcouchbase/tests/basic/t_logger.cc +65 -0
  368. data/ext/libcouchbase/tests/basic/t_misc.cc +24 -0
  369. data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +18 -0
  370. data/ext/libcouchbase/tests/basic/t_netbuf.cc +446 -0
  371. data/ext/libcouchbase/tests/basic/t_packet.cc +222 -0
  372. data/ext/libcouchbase/tests/basic/t_ringbuffer.cc +278 -0
  373. data/ext/libcouchbase/tests/basic/t_slist.cc +429 -0
  374. data/ext/libcouchbase/tests/basic/t_strerror.cc +64 -0
  375. data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
  376. data/ext/libcouchbase/tests/basic/t_urlencode.cc +132 -0
  377. data/ext/libcouchbase/tests/check-all.cc +608 -0
  378. data/ext/libcouchbase/tests/htparse/t_basic.cc +193 -0
  379. data/ext/libcouchbase/tests/ioserver/connection.cc +166 -0
  380. data/ext/libcouchbase/tests/ioserver/future.cc +50 -0
  381. data/ext/libcouchbase/tests/ioserver/ioserver.cc +104 -0
  382. data/ext/libcouchbase/tests/ioserver/ioserver.h +478 -0
  383. data/ext/libcouchbase/tests/ioserver/socket.cc +88 -0
  384. data/ext/libcouchbase/tests/ioserver/ssl_connection.cc +145 -0
  385. data/ext/libcouchbase/tests/ioserver/threads-pthreads.cc +119 -0
  386. data/ext/libcouchbase/tests/ioserver/threads-win32.cc +117 -0
  387. data/ext/libcouchbase/tests/ioserver/threads.h +66 -0
  388. data/ext/libcouchbase/tests/iotests/iotests.h +15 -0
  389. data/ext/libcouchbase/tests/iotests/mock-environment.cc +524 -0
  390. data/ext/libcouchbase/tests/iotests/mock-environment.h +385 -0
  391. data/ext/libcouchbase/tests/iotests/mock-unit-test.cc +67 -0
  392. data/ext/libcouchbase/tests/iotests/mock-unit-test.h +61 -0
  393. data/ext/libcouchbase/tests/iotests/serverparams.h +76 -0
  394. data/ext/libcouchbase/tests/iotests/t_arithmetic.cc +143 -0
  395. data/ext/libcouchbase/tests/iotests/t_behavior.cc +226 -0
  396. data/ext/libcouchbase/tests/iotests/t_configcache.cc +117 -0
  397. data/ext/libcouchbase/tests/iotests/t_confmon.cc +241 -0
  398. data/ext/libcouchbase/tests/iotests/t_durability.cc +1059 -0
  399. data/ext/libcouchbase/tests/iotests/t_forward.cc +110 -0
  400. data/ext/libcouchbase/tests/iotests/t_get.cc +512 -0
  401. data/ext/libcouchbase/tests/iotests/t_http.cc +438 -0
  402. data/ext/libcouchbase/tests/iotests/t_iops.cc +175 -0
  403. data/ext/libcouchbase/tests/iotests/t_lock.cc +275 -0
  404. data/ext/libcouchbase/tests/iotests/t_misc.cc +713 -0
  405. data/ext/libcouchbase/tests/iotests/t_mutate.cc +609 -0
  406. data/ext/libcouchbase/tests/iotests/t_n1ql.cc +270 -0
  407. data/ext/libcouchbase/tests/iotests/t_netfail.cc +654 -0
  408. data/ext/libcouchbase/tests/iotests/t_obseqno.cc +157 -0
  409. data/ext/libcouchbase/tests/iotests/t_regression.cc +321 -0
  410. data/ext/libcouchbase/tests/iotests/t_sched.cc +88 -0
  411. data/ext/libcouchbase/tests/iotests/t_serverops.cc +230 -0
  412. data/ext/libcouchbase/tests/iotests/t_smoke.cc +528 -0
  413. data/ext/libcouchbase/tests/iotests/t_subdoc.cc +822 -0
  414. data/ext/libcouchbase/tests/iotests/t_syncmode.cc +64 -0
  415. data/ext/libcouchbase/tests/iotests/t_views.cc +405 -0
  416. data/ext/libcouchbase/tests/iotests/testutil.cc +250 -0
  417. data/ext/libcouchbase/tests/iotests/testutil.h +163 -0
  418. data/ext/libcouchbase/tests/mc/mctest.h +119 -0
  419. data/ext/libcouchbase/tests/mc/pktmaker.h +101 -0
  420. data/ext/libcouchbase/tests/mc/t_alloc.cc +269 -0
  421. data/ext/libcouchbase/tests/mc/t_context.cc +100 -0
  422. data/ext/libcouchbase/tests/mc/t_flush.cc +185 -0
  423. data/ext/libcouchbase/tests/mc/t_forward.cc +239 -0
  424. data/ext/libcouchbase/tests/mc/t_ioflush.cc +102 -0
  425. data/ext/libcouchbase/tests/mc/t_iovcursor.cc +173 -0
  426. data/ext/libcouchbase/tests/mocksupport/procutil.c +305 -0
  427. data/ext/libcouchbase/tests/mocksupport/procutil.h +89 -0
  428. data/ext/libcouchbase/tests/mocksupport/server.c +391 -0
  429. data/ext/libcouchbase/tests/mocksupport/server.h +72 -0
  430. data/ext/libcouchbase/tests/mocksupport/timeout.c +69 -0
  431. data/ext/libcouchbase/tests/nonio_tests.cc +23 -0
  432. data/ext/libcouchbase/tests/rdb/rdbtest.h +133 -0
  433. data/ext/libcouchbase/tests/rdb/t_basic.cc +128 -0
  434. data/ext/libcouchbase/tests/rdb/t_bigalloc.cc +93 -0
  435. data/ext/libcouchbase/tests/rdb/t_refs.cc +112 -0
  436. data/ext/libcouchbase/tests/socktests/socktest.cc +347 -0
  437. data/ext/libcouchbase/tests/socktests/socktest.h +448 -0
  438. data/ext/libcouchbase/tests/socktests/t_basic.cc +143 -0
  439. data/ext/libcouchbase/tests/socktests/t_ctx.cc +73 -0
  440. data/ext/libcouchbase/tests/socktests/t_manager.cc +179 -0
  441. data/ext/libcouchbase/tests/socktests/t_putex.cc +256 -0
  442. data/ext/libcouchbase/tests/socktests/t_read.cc +187 -0
  443. data/ext/libcouchbase/tests/socktests/t_reentrant.cc +143 -0
  444. data/ext/libcouchbase/tests/socktests/t_ssl.cc +80 -0
  445. data/ext/libcouchbase/tests/socktests/t_write.cc +95 -0
  446. data/ext/libcouchbase/tests/start_mock.bat +15 -0
  447. data/ext/libcouchbase/tests/start_mock.sh +42 -0
  448. data/ext/libcouchbase/tests/unit_tests.cc +43 -0
  449. data/ext/libcouchbase/tests/vbucket/confdata/bad.json +101 -0
  450. data/ext/libcouchbase/tests/vbucket/confdata/full_25.json +363 -0
  451. data/ext/libcouchbase/tests/vbucket/confdata/memd_25.json +90 -0
  452. data/ext/libcouchbase/tests/vbucket/confdata/memd_30.json +1 -0
  453. data/ext/libcouchbase/tests/vbucket/confdata/memd_45.json +1 -0
  454. data/ext/libcouchbase/tests/vbucket/confdata/terse_25.json +291 -0
  455. data/ext/libcouchbase/tests/vbucket/confdata/terse_30.json +1 -0
  456. data/ext/libcouchbase/tests/vbucket/t_config.cc +341 -0
  457. data/ext/libcouchbase/tools/CMakeLists.txt +51 -0
  458. data/ext/libcouchbase/tools/cbc-handlers.h +462 -0
  459. data/ext/libcouchbase/tools/cbc-n1qlback.cc +439 -0
  460. data/ext/libcouchbase/tools/cbc-pillowfight.cc +822 -0
  461. data/ext/libcouchbase/tools/cbc.cc +1541 -0
  462. data/ext/libcouchbase/tools/common/histogram.cc +43 -0
  463. data/ext/libcouchbase/tools/common/histogram.h +23 -0
  464. data/ext/libcouchbase/tools/common/my_inttypes.h +22 -0
  465. data/ext/libcouchbase/tools/common/options.cc +420 -0
  466. data/ext/libcouchbase/tools/common/options.h +81 -0
  467. data/ext/libcouchbase/tools/docgen/docgen.h +469 -0
  468. data/ext/libcouchbase/tools/docgen/loc.h +210 -0
  469. data/ext/libcouchbase/tools/docgen/placeholders.h +211 -0
  470. data/ext/libcouchbase/tools/docgen/seqgen.h +94 -0
  471. data/lib/libcouchbase.rb +36 -0
  472. data/lib/libcouchbase/bucket.rb +819 -0
  473. data/lib/libcouchbase/callbacks.rb +72 -0
  474. data/lib/libcouchbase/connection.rb +790 -0
  475. data/lib/libcouchbase/design_docs.rb +86 -0
  476. data/lib/libcouchbase/error.rb +68 -0
  477. data/lib/libcouchbase/ext/libcouchbase.rb +1135 -0
  478. data/lib/libcouchbase/ext/libcouchbase/cmdbase.rb +23 -0
  479. data/lib/libcouchbase/ext/libcouchbase/cmdcounter.rb +36 -0
  480. data/lib/libcouchbase/ext/libcouchbase/cmdendure.rb +26 -0
  481. data/lib/libcouchbase/ext/libcouchbase/cmdfts.rb +24 -0
  482. data/lib/libcouchbase/ext/libcouchbase/cmdget.rb +30 -0
  483. data/lib/libcouchbase/ext/libcouchbase/cmdgetreplica.rb +49 -0
  484. data/lib/libcouchbase/ext/libcouchbase/cmdhttp.rb +58 -0
  485. data/lib/libcouchbase/ext/libcouchbase/cmdn1ql.rb +40 -0
  486. data/lib/libcouchbase/ext/libcouchbase/cmdobseqno.rb +33 -0
  487. data/lib/libcouchbase/ext/libcouchbase/cmdobserve.rb +30 -0
  488. data/lib/libcouchbase/ext/libcouchbase/cmdstore.rb +40 -0
  489. data/lib/libcouchbase/ext/libcouchbase/cmdstoredur.rb +45 -0
  490. data/lib/libcouchbase/ext/libcouchbase/cmdsubdoc.rb +49 -0
  491. data/lib/libcouchbase/ext/libcouchbase/cmdverbosity.rb +29 -0
  492. data/lib/libcouchbase/ext/libcouchbase/cmdviewquery.rb +61 -0
  493. data/lib/libcouchbase/ext/libcouchbase/contigbuf.rb +14 -0
  494. data/lib/libcouchbase/ext/libcouchbase/create_st.rb +15 -0
  495. data/lib/libcouchbase/ext/libcouchbase/create_st0.rb +23 -0
  496. data/lib/libcouchbase/ext/libcouchbase/create_st1.rb +26 -0
  497. data/lib/libcouchbase/ext/libcouchbase/create_st2.rb +32 -0
  498. data/lib/libcouchbase/ext/libcouchbase/create_st3.rb +26 -0
  499. data/lib/libcouchbase/ext/libcouchbase/crst_u.rb +20 -0
  500. data/lib/libcouchbase/ext/libcouchbase/durability_opts_st_v.rb +11 -0
  501. data/lib/libcouchbase/ext/libcouchbase/durability_opts_t.rb +14 -0
  502. data/lib/libcouchbase/ext/libcouchbase/durabilityopt_sv0.rb +63 -0
  503. data/lib/libcouchbase/ext/libcouchbase/enums.rb +991 -0
  504. data/lib/libcouchbase/ext/libcouchbase/fragbuf.rb +18 -0
  505. data/lib/libcouchbase/ext/libcouchbase/ftshandle.rb +7 -0
  506. data/lib/libcouchbase/ext/libcouchbase/histogram.rb +34 -0
  507. data/lib/libcouchbase/ext/libcouchbase/http_request_t.rb +7 -0
  508. data/lib/libcouchbase/ext/libcouchbase/keybuf.rb +20 -0
  509. data/lib/libcouchbase/ext/libcouchbase/multicmd_ctx.rb +30 -0
  510. data/lib/libcouchbase/ext/libcouchbase/mutation_token.rb +17 -0
  511. data/lib/libcouchbase/ext/libcouchbase/n1qlhandle.rb +7 -0
  512. data/lib/libcouchbase/ext/libcouchbase/n1qlparams.rb +7 -0
  513. data/lib/libcouchbase/ext/libcouchbase/respbase.rb +29 -0
  514. data/lib/libcouchbase/ext/libcouchbase/respcounter.rb +32 -0
  515. data/lib/libcouchbase/ext/libcouchbase/respendure.rb +49 -0
  516. data/lib/libcouchbase/ext/libcouchbase/respfts.rb +40 -0
  517. data/lib/libcouchbase/ext/libcouchbase/respget.rb +44 -0
  518. data/lib/libcouchbase/ext/libcouchbase/resphttp.rb +48 -0
  519. data/lib/libcouchbase/ext/libcouchbase/respmcversion.rb +38 -0
  520. data/lib/libcouchbase/ext/libcouchbase/respn1ql.rb +41 -0
  521. data/lib/libcouchbase/ext/libcouchbase/respobseqno.rb +52 -0
  522. data/lib/libcouchbase/ext/libcouchbase/respobserve.rb +41 -0
  523. data/lib/libcouchbase/ext/libcouchbase/respserverbase.rb +32 -0
  524. data/lib/libcouchbase/ext/libcouchbase/respstats.rb +38 -0
  525. data/lib/libcouchbase/ext/libcouchbase/respstore.rb +32 -0
  526. data/lib/libcouchbase/ext/libcouchbase/respstoredur.rb +38 -0
  527. data/lib/libcouchbase/ext/libcouchbase/respsubdoc.rb +35 -0
  528. data/lib/libcouchbase/ext/libcouchbase/respviewquery.rb +67 -0
  529. data/lib/libcouchbase/ext/libcouchbase/sdentry.rb +22 -0
  530. data/lib/libcouchbase/ext/libcouchbase/sdspec.rb +26 -0
  531. data/lib/libcouchbase/ext/libcouchbase/t.rb +7 -0
  532. data/lib/libcouchbase/ext/libcouchbase/valbuf.rb +22 -0
  533. data/lib/libcouchbase/ext/libcouchbase/valbuf_u_buf.rb +14 -0
  534. data/lib/libcouchbase/ext/libcouchbase/viewhandle.rb +7 -0
  535. data/lib/libcouchbase/ext/libcouchbase_iocp.rb +26 -0
  536. data/lib/libcouchbase/ext/libcouchbase_libuv.rb +18 -0
  537. data/lib/libcouchbase/ext/tasks.rb +87 -0
  538. data/lib/libcouchbase/n1ql.rb +73 -0
  539. data/lib/libcouchbase/query_full_text.rb +147 -0
  540. data/lib/libcouchbase/query_n1ql.rb +121 -0
  541. data/lib/libcouchbase/query_view.rb +129 -0
  542. data/lib/libcouchbase/results_fiber.rb +262 -0
  543. data/lib/libcouchbase/results_native.rb +211 -0
  544. data/lib/libcouchbase/version.rb +5 -0
  545. data/libcouchbase.gemspec +61 -0
  546. data/spec/bucket_spec.rb +270 -0
  547. data/spec/connection_spec.rb +277 -0
  548. data/spec/design_docs_spec.rb +23 -0
  549. data/spec/error_spec.rb +26 -0
  550. data/spec/fts_spec.rb +129 -0
  551. data/spec/n1ql_spec.rb +201 -0
  552. data/spec/results_libuv_spec.rb +229 -0
  553. data/spec/results_native_spec.rb +259 -0
  554. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/design.json +1 -0
  555. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/data-0000.cbb +0 -0
  556. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/failover.json +1 -0
  557. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/meta.json +1 -0
  558. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/seqno.json +1 -0
  559. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/snapshot_markers.json +1 -0
  560. data/spec/view_spec.rb +195 -0
  561. metadata +775 -0
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true, encoding: ASCII-8BIT
2
+
3
+ require 'libuv'
4
+
5
+ module Libcouchbase
6
+ require 'libcouchbase/ext/libcouchbase'
7
+ require 'libcouchbase/error'
8
+ require 'libcouchbase/callbacks'
9
+ require 'libcouchbase/connection'
10
+
11
+ class Results
12
+ include Enumerable
13
+
14
+ # streams results as they are returned from the database
15
+ #
16
+ # unlike other operations, such as each, the results are not stored
17
+ # for later use and are discarded as soon as possible to save memory
18
+ #
19
+ # @yieldparam [Object] value the value of the current row
20
+ def stream; end
21
+
22
+ attr_reader :complete_result_set, :query_in_progress
23
+ attr_reader :query_completed, :metadata
24
+ end
25
+
26
+ autoload :N1QL, 'libcouchbase/n1ql'
27
+ autoload :Bucket, 'libcouchbase/bucket'
28
+ autoload :QueryView, 'libcouchbase/query_view'
29
+ autoload :QueryN1QL, 'libcouchbase/query_n1ql'
30
+ autoload :QueryFullText, 'libcouchbase/query_full_text'
31
+ autoload :DesignDoc, 'libcouchbase/design_docs'
32
+ autoload :DesignDocs, 'libcouchbase/design_docs'
33
+ autoload :ResultsEM, 'libcouchbase/results_fiber'
34
+ autoload :ResultsLibuv, 'libcouchbase/results_fiber'
35
+ autoload :ResultsNative, 'libcouchbase/results_native'
36
+ end
@@ -0,0 +1,819 @@
1
+ # frozen_string_literal: true, encoding: ASCII-8BIT
2
+
3
+ require 'forwardable'
4
+ require 'thread'
5
+
6
+
7
+ module Libcouchbase
8
+ class Bucket
9
+ extend Forwardable
10
+
11
+ # Finalizer done right
12
+ # http://www.mikeperham.com/2010/02/24/the-trouble-with-ruby-finalizers/
13
+ def self.finalize(connection)
14
+ proc { connection.destroy }
15
+ end
16
+
17
+ def initialize(**options)
18
+ @connection = Connection.new(**options)
19
+ connect
20
+
21
+ # This obtains the connections reactor
22
+ @reactor = reactor
23
+ @quiet = true
24
+
25
+ # clean up the connection once this object is garbage collected
26
+ ObjectSpace.define_finalizer( self, self.class.finalize(@connection) )
27
+ end
28
+
29
+
30
+ attr_reader :connection
31
+ attr_accessor :quiet
32
+ def_delegators :@connection, :bucket, :reactor
33
+
34
+
35
+ # Obtain an object stored in Couchbase by given key.
36
+ #
37
+ # @param keys [String, Symbol, Array] One or several keys to fetch
38
+ # @param options [Hash] Options for operation.
39
+ # @option options [Integer] :lock time to lock this key for. Max time 30s
40
+ # @option options [true, false] :extended (false) If set to +true+, the
41
+ # operation will return a +Libcouchbase::Result+, otherwise (by default)
42
+ # it returns just the value.
43
+ # @option options [true, false] :quiet (self.quiet) If set to +true+, the
44
+ # operation won't raise error for missing key, it will return +nil+.
45
+ # Otherwise it will raise a not found error.
46
+ # @option options [Symbol] :format the value should be stored as.
47
+ # Defaults to :document
48
+ # @option options [true, false] :assemble_hash (false) Assemble Hash for
49
+ # results.
50
+ #
51
+ # @return [Object, Array, Hash, Libcouchbase::Result] the value(s)
52
+ #
53
+ # @raise [Libcouchbase::Error::KeyExists] if the key already exists on the server
54
+ # with a different CAS value to that provided
55
+ # @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
56
+ # @raise [Libouchbase::Error::NetworkError] if there was a communication issue
57
+ # @raise [Libcouchbase::Error::KeyNotFound] if the key doesn't exists
58
+ #
59
+ # @example Get single value in quiet mode (the default)
60
+ # c.get("foo") #=> the associated value or nil
61
+ #
62
+ # @example Use alternative hash-like syntax
63
+ # c["foo"] #=> the associated value or nil
64
+ #
65
+ # @example Get single value in verbose mode
66
+ # c.get("missing-foo", quiet: false) #=> raises Libcouchbase::Error::NotFound
67
+ #
68
+ # @example Get multiple keys
69
+ # c.get("foo", "bar", "baz") #=> [val1, val2, val3]
70
+ #
71
+ # @example Get multiple keys with assembing result into the Hash
72
+ # c.get("foo", "bar", "baz", assemble_hash: true)
73
+ # #=> {"foo" => val1, "bar" => val2, "baz" => val3}
74
+ #
75
+ # @example Get and lock key using default timeout
76
+ # c.get("foo", lock: true) # This locks for the maximum time of 30 seconds
77
+ #
78
+ # @example Get and lock key using custom timeout
79
+ # c.get("foo", lock: 3)
80
+ #
81
+ # @example Get and lock multiple keys using custom timeout
82
+ # c.get("foo", "bar", lock: 3)
83
+ def get(*keys, extended: false, async: false, quiet: @quiet, assemble_hash: false, **opts)
84
+ if keys.length == 1
85
+ promise = @connection.get(keys[0], **opts)
86
+
87
+ if not extended
88
+ promise = promise.then(proc { |resp|
89
+ resp.value
90
+ })
91
+ end
92
+
93
+ if quiet
94
+ promise = promise.catch { |err|
95
+ if err.is_a? Libcouchbase::Error::KeyNotFound
96
+ nil
97
+ else
98
+ ::Libuv::Q.reject(@reactor, err)
99
+ end
100
+ }
101
+ end
102
+
103
+ if assemble_hash
104
+ promise = promise.then(proc { |val|
105
+ hash = defined?(::HashWithIndifferentAccess) ? ::HashWithIndifferentAccess.new : {}
106
+ hash[keys[0]] = val
107
+ hash
108
+ })
109
+ end
110
+
111
+ result(promise, async)
112
+ else
113
+ promises = keys.collect { |key|
114
+ @connection.get(key, **opts)
115
+ }
116
+
117
+ if quiet
118
+ promises.map! { |prom|
119
+ prom.catch { |err|
120
+ if err.is_a? Libcouchbase::Error::KeyNotFound
121
+ nil
122
+ else
123
+ ::Libuv::Q.reject(@reactor, err)
124
+ end
125
+ }
126
+ }
127
+ end
128
+
129
+ result(@reactor.all(*promises).then(proc { |results|
130
+ if not extended
131
+ # Check if resp nil as might have been a quiet request
132
+ results.collect! { |resp| resp.value if resp }
133
+ end
134
+
135
+ if assemble_hash
136
+ hash = defined?(::HashWithIndifferentAccess) ? ::HashWithIndifferentAccess.new : {}
137
+ keys.each_with_index do |key, index|
138
+ hash[key] = results[index]
139
+ end
140
+ hash
141
+ else
142
+ results
143
+ end
144
+ }), async)
145
+ end
146
+ end
147
+ alias_method :[], :get
148
+
149
+ # Add the item to the database, but fail if the object exists already
150
+ #
151
+ # @param key [String, Symbol] Key used to reference the value.
152
+ # @param value [Object] Value to be stored
153
+ # @param options [Hash] Options for operation.
154
+ # @option options [Integer] :ttl Expiry time for key in seconds
155
+ # @option options [Integer] :expire_in Expiry time for key in seconds
156
+ # @option options [Integer, Time] :expire_at Unix epoc or time at which a key
157
+ # should expire
158
+ # @option options [Symbol] :format the value should be stored as.
159
+ # @option options [Integer] :cas The CAS value for an object. This value is
160
+ # created on the server and is guaranteed to be unique for each value of
161
+ # a given key. This value is used to provide simple optimistic
162
+ # concurrency control when multiple clients or threads try to update an
163
+ # item simultaneously.
164
+ # @option options [Integer] :persist_to persist to a number of nodes before returing
165
+ # a result. Use -1 to persist to the maximum number of nodes
166
+ # @option options [Integer] :replicate_to replicate to a number of nodes before
167
+ # returning a result. Use -1 to replicate to the maximum number of nodes
168
+ #
169
+ # @return [Libcouchbase::Result] this includes the CAS value of the object.
170
+ #
171
+ # @raise [Libcouchbase::Error::KeyExists] if the key already exists on the server
172
+ # @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
173
+ # @raise [Libouchbase::Error::NetworkError] if there was a communication issue
174
+ #
175
+ # @example Store the key which will be expired in 2 seconds using relative TTL.
176
+ # c.add("foo", "bar", expire_in: 2)
177
+ #
178
+ # @example Store the key which will be expired in 2 seconds using absolute TTL.
179
+ # c.add(:foo, :bar, expire_at: Time.now.to_i + 2)
180
+ #
181
+ # @example Force JSON document format for value
182
+ # c.add("foo", {"bar" => "baz"}, format: :document)
183
+ #
184
+ # @example Set application specific flags (note that it will be OR-ed with format flags)
185
+ # c.add("foo", "bar", flags: 0x1000)
186
+ #
187
+ # @example Ensure that the key will be persisted at least on the one node
188
+ # c.add("foo", "bar", persist_to: 1)
189
+ def add(key, value, async: false, **opts)
190
+ result @connection.store(key, value, **AddDefaults.merge(opts)), async
191
+ end
192
+ AddDefaults = {operation: :add}.freeze
193
+
194
+ # Unconditionally store the object in the Couchbase
195
+ #
196
+ # @param key [String, Symbol] Key used to reference the value.
197
+ # @param value [Object] Value to be stored
198
+ # @param options [Hash] Options for operation.
199
+ # @option options [Integer] :ttl Expiry time for key in seconds
200
+ # @option options [Integer] :expire_in Expiry time for key in seconds
201
+ # @option options [Integer, Time] :expire_at Unix epoc or time at which a key
202
+ # should expire
203
+ # @option options [Symbol] :format the value should be stored as.
204
+ # @option options [Integer] :cas The CAS value for an object. This value is
205
+ # created on the server and is guaranteed to be unique for each value of
206
+ # a given key. This value is used to provide simple optimistic
207
+ # concurrency control when multiple clients or threads try to update an
208
+ # item simultaneously.
209
+ # @option options [Integer] :persist_to persist to a number of nodes before returing
210
+ # a result. Use -1 to persist to the maximum number of nodes
211
+ # @option options [Integer] :replicate_to replicate to a number of nodes before
212
+ # returning a result. Use -1 to replicate to the maximum number of nodes
213
+ #
214
+ # @return [Libcouchbase::Result] this includes the CAS value of the object.
215
+ #
216
+ # @raise [Libcouchbase::Error::KeyExists] if the key already exists on the server
217
+ # with a different CAS value to that provided
218
+ # @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
219
+ # @raise [Libouchbase::Error::NetworkError] if there was a communication issue
220
+ #
221
+ # @example Store the key which will be expired in 2 seconds using relative TTL.
222
+ # c.set("foo", "bar", expire_in: 2)
223
+ #
224
+ # @example Store the key which will be expired in 2 seconds using absolute TTL.
225
+ # c.set(:foo, :bar, expire_at: Time.now.to_i + 2)
226
+ #
227
+ # @example Force JSON document format for value
228
+ # c.set("foo", {"bar" => "baz"}, format: :document)
229
+ #
230
+ # @example Use hash-like syntax to store the value
231
+ # c[:foo] = {bar: :baz}
232
+ #
233
+ # @example Set application specific flags (note that it will be OR-ed with format flags)
234
+ # c.set("foo", "bar", flags: 0x1000)
235
+ #
236
+ # @example Perform optimistic locking by specifying last known CAS version
237
+ # c.set("foo", "bar", cas: 8835713818674332672)
238
+ #
239
+ # @example Ensure that the key will be persisted at least on the one node
240
+ # c.set("foo", "bar", persist_to: 1)
241
+ def set(key, value, async: false, **opts)
242
+ # default operation is set
243
+ result @connection.store(key, value, **opts), async
244
+ end
245
+ alias_method :[]=, :set
246
+
247
+ # Replace the existing object in the database
248
+ #
249
+ # @param key [String, Symbol] Key used to reference the value.
250
+ # @param value [Object] Value to be stored
251
+ # @param options [Hash] Options for operation.
252
+ # @option options [Integer] :ttl Expiry time for key in seconds
253
+ # @option options [Integer] :expire_in Expiry time for key in seconds
254
+ # @option options [Integer, Time] :expire_at Unix epoc or time at which a key
255
+ # should expire
256
+ # @option options [Symbol] :format the value should be stored as.
257
+ # @option options [Integer] :cas The CAS value for an object. This value is
258
+ # created on the server and is guaranteed to be unique for each value of
259
+ # a given key. This value is used to provide simple optimistic
260
+ # concurrency control when multiple clients or threads try to update an
261
+ # item simultaneously.
262
+ # @option options [Integer] :persist_to persist to a number of nodes before returing
263
+ # a result. Use -1 to persist to the maximum number of nodes
264
+ # @option options [Integer] :replicate_to replicate to a number of nodes before
265
+ # returning a result. Use -1 to replicate to the maximum number of nodes
266
+ #
267
+ # @return [Libcouchbase::Result] this includes the CAS value of the object.
268
+ #
269
+ # @raise [Libcouchbase::Error::KeyExists] if the key already exists on the server
270
+ # with a different CAS value to that provided
271
+ # @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
272
+ # @raise [Libouchbase::Error::NetworkError] if there was a communication issue
273
+ # @raise [Libcouchbase::Error::KeyNotFound] if the key doesn't exists
274
+ #
275
+ # @example Store the key which will be expired in 2 seconds using relative TTL.
276
+ # c.replace("foo", "bar", expire_in: 2)
277
+ #
278
+ # @example Store the key which will be expired in 2 seconds using absolute TTL.
279
+ # c.replace(:foo, :bar, expire_at: Time.now.to_i + 2)
280
+ #
281
+ # @example Force JSON document format for value
282
+ # c.replace("foo", {"bar" => "baz"}, format: :document)
283
+ #
284
+ # @example Set application specific flags (note that it will be OR-ed with format flags)
285
+ # c.replace("foo", "bar", flags: 0x1000)
286
+ #
287
+ # @example Ensure that the key will be persisted at least on the one node
288
+ # c.replace("foo", "bar", persist_to: 1)
289
+ def replace(key, value, async: false, **opts)
290
+ result @connection.store(key, value, **ReplaceDefaults.merge(opts)), async
291
+ end
292
+ ReplaceDefaults = {operation: :replace}.freeze
293
+
294
+ # Append this object to the existing object
295
+ #
296
+ # @note This operation is kind of data-aware from server point of view.
297
+ # This mean that the server treats value as binary stream and just
298
+ # perform concatenation, therefore it won't work with +:marshal+ and
299
+ # +:document+ formats, because of lack of knowledge how to merge values
300
+ # in these formats.
301
+ #
302
+ # @param key [String, Symbol] Key used to reference the value.
303
+ # @param value [Object] Value to be appended
304
+ # @param options [Hash] Options for operation.
305
+ # @option options [Integer] :cas The CAS value for an object. This value is
306
+ # created on the server and is guaranteed to be unique for each value of
307
+ # a given key. This value is used to provide simple optimistic
308
+ # concurrency control when multiple clients or threads try to update an
309
+ # item simultaneously.
310
+ # @option options [Integer] :persist_to persist to a number of nodes before returing
311
+ # a result. Use -1 to persist to the maximum number of nodes
312
+ # @option options [Integer] :replicate_to replicate to a number of nodes before
313
+ # returning a result. Use -1 to replicate to the maximum number of nodes
314
+ #
315
+ # @return [Libcouchbase::Result] this includes the CAS value of the object.
316
+ #
317
+ # @raise [Libcouchbase::Error::KeyExists] if the key already exists on the server
318
+ # with a different CAS value to that provided
319
+ # @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
320
+ # @raise [Libouchbase::Error::NetworkError] if there was a communication issue
321
+ # @raise [Libcouchbase::Error::KeyNotFound] if the key doesn't exists
322
+ #
323
+ # @example Simple append
324
+ # c.set(:foo, "aaa", format: :plain)
325
+ # c.append(:foo, "bbb")
326
+ # c.get("foo") #=> "aaabbb"
327
+ #
328
+ # @example Using optimistic locking. The operation will fail on CAS mismatch
329
+ # resp = c.set("foo", "aaa", format: :plain)
330
+ # c.append("foo", "bbb", cas: resp.cas)
331
+ #
332
+ # @example Ensure that the key will be persisted at least on the one node
333
+ # c.append("foo", "bar", persist_to: 1)
334
+ def append(key, value, async: false, **opts)
335
+ result @connection.store(key, value, **AppendDefaults.merge(opts)), async
336
+ end
337
+ AppendDefaults = {operation: :append}.freeze
338
+
339
+ # Prepend this object to the existing object
340
+ #
341
+ # @note This operation is kind of data-aware from server point of view.
342
+ # This mean that the server treats value as binary stream and just
343
+ # perform concatenation, therefore it won't work with +:marshal+ and
344
+ # +:document+ formats, because of lack of knowledge how to merge values
345
+ # in these formats.
346
+ #
347
+ # @param key [String, Symbol] Key used to reference the value.
348
+ # @param value [Object] Value to be appended
349
+ # @param options [Hash] Options for operation.
350
+ # @option options [Integer] :cas The CAS value for an object. This value is
351
+ # created on the server and is guaranteed to be unique for each value of
352
+ # a given key. This value is used to provide simple optimistic
353
+ # concurrency control when multiple clients or threads try to update an
354
+ # item simultaneously.
355
+ # @option options [Integer] :persist_to persist to a number of nodes before returing
356
+ # a result. Use -1 to persist to the maximum number of nodes
357
+ # @option options [Integer] :replicate_to replicate to a number of nodes before
358
+ # returning a result. Use -1 to replicate to the maximum number of nodes
359
+ #
360
+ # @return [Libcouchbase::Result] this includes the CAS value of the object.
361
+ #
362
+ # @raise [Libcouchbase::Error::KeyExists] if the key already exists on the server
363
+ # with a different CAS value to that provided
364
+ # @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
365
+ # @raise [Libouchbase::Error::NetworkError] if there was a communication issue
366
+ # @raise [Libcouchbase::Error::KeyNotFound] if the key doesn't exists
367
+ #
368
+ # @example Simple prepend
369
+ # c.set(:foo, "aaa", format: :plain)
370
+ # c.prepend(:foo, "bbb")
371
+ # c.get("foo") #=> "bbbaaa"
372
+ #
373
+ # @example Using optimistic locking. The operation will fail on CAS mismatch
374
+ # resp = c.set("foo", "aaa", format: :plain)
375
+ # c.prepend("foo", "bbb", cas: resp.cas)
376
+ #
377
+ # @example Ensure that the key will be persisted at least on the one node
378
+ # c.prepend("foo", "bar", persist_to: 1)
379
+ def prepend(key, value, async: false, **opts)
380
+ result @connection.store(key, value, **PrependDefaults.merge(opts)), async
381
+ end
382
+ PrependDefaults = {operation: :prepend}.freeze
383
+
384
+ # Increment the value of an existing numeric key
385
+ #
386
+ # The increment method allow you to increase or decrease a given stored
387
+ # integer value. Updating the value of a key if it can be parsed to an integer.
388
+ # The update operation occurs on the server and is provided at the protocol
389
+ # level. This simplifies what would otherwise be a two-stage get and set
390
+ # operation.
391
+ #
392
+ # @param key [String, Symbol] Key used to reference the value.
393
+ # @param by [Integer] Integer (up to 64 bits) value to increment or decrement
394
+ # @param options [Hash] Options for operation.
395
+ # @option options [true, false] :create (false) If set to +true+, it will
396
+ # initialize the key with zero value and zero flags (use +:initial+
397
+ # option to set another initial value). Note: it won't increment the
398
+ # missing value.
399
+ # @option options [Integer] :initial (0) Integer (up to 64 bits) value for
400
+ # missing key initialization. This option imply +:create+ option is +true+
401
+ # @option options [Integer] :ttl Expiry time for key in seconds
402
+ # @option options [Integer] :expire_in Expiry time for key in seconds
403
+ # @option options [Integer, Time] :expire_at Unix epoc or time at which a key
404
+ # should expire
405
+ # @option options [true, false] :extended (false) If set to +true+, the
406
+ # operation will return a +Libcouchbase::Result+, otherwise (by default)
407
+ # it returns just the value.
408
+ #
409
+ # @return [Integer] the actual value of the key.
410
+ #
411
+ # @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
412
+ # @raise [Libouchbase::Error::NetworkError] if there was a communication issue
413
+ # @raise [Libcouchbase::Error::KeyNotFound] if the key doesn't exists
414
+ # @raise [Libcouchbase::Error::DeltaBadval] if the key contains non-numeric value
415
+ #
416
+ # @example Increment key by one
417
+ # c.incr(:foo)
418
+ #
419
+ # @example Increment key by 50
420
+ # c.incr("foo", 50)
421
+ #
422
+ # @example Increment key by one <b>OR</b> initialize with zero
423
+ # c.incr("foo", create: true) #=> will return old+1 or 0
424
+ #
425
+ # @example Increment key by one <b>OR</b> initialize with three
426
+ # c.incr("foo", 50, initial: 3) #=> will return old+50 or 3
427
+ #
428
+ # @example Increment key and get its CAS value
429
+ # resp = c.incr("foo", :extended => true)
430
+ # resp.cas #=> 12345
431
+ # resp.value #=> 2
432
+ def incr(key, by = 1, create: false, extended: false, async: false, **opts)
433
+ opts[:delta] ||= by
434
+ opts[:initial] = 0 if create
435
+ promise = @connection.counter(key, **opts)
436
+ if not extended
437
+ promise = promise.then { |resp| resp.value }
438
+ end
439
+ result promise, async
440
+ end
441
+
442
+ # Decrement the value of an existing numeric key
443
+ #
444
+ # Helper method, see incr
445
+ def decr(key, by = 1, **opts)
446
+ incr(key, -by, **opts)
447
+ end
448
+
449
+ # Delete the specified key
450
+ #
451
+ # @param key [String, Symbol] Key used to reference the value.
452
+ # @param options [Hash] Options for operation.
453
+ # @option options [Integer] :cas The CAS value for an object. This value is
454
+ # created on the server and is guaranteed to be unique for each value of
455
+ # a given key. This value is used to provide simple optimistic
456
+ # concurrency control when multiple clients or threads try to modify an
457
+ # item simultaneously.
458
+ # @option options [true, false] :quiet (self.quiet) If set to +true+, the
459
+ # operation won't raise error for missing key, it will return +nil+.
460
+ # Otherwise it will raise error.
461
+ #
462
+ # @return [true, false] the result of the operation.
463
+ #
464
+ # @raise [Libcouchbase::Error::KeyExists] if the key already exists on the server
465
+ # with a different CAS value to that provided
466
+ # @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
467
+ # @raise [Libouchbase::Error::NetworkError] if there was a communication issue
468
+ # @raise [Libcouchbase::Error::KeyNotFound] if the key doesn't exists
469
+ #
470
+ # @example Delete the key in quiet mode (default)
471
+ # c.set("foo", "bar")
472
+ # c.delete("foo") #=> true
473
+ # c.delete("foo") #=> false
474
+ #
475
+ # @example Delete the key verbosely
476
+ # c.set("foo", "bar")
477
+ # c.delete("foo", quiet: false) #=> true
478
+ # c.delete("foo", quiet: true) #=> nil (default behaviour)
479
+ # c.delete("foo", quiet: false) #=> will raise Libcouchbase::Error::KeyNotFound
480
+ #
481
+ # @example Delete the key with version check
482
+ # res = c.set("foo", "bar") #=> #<struct Libcouchbase::Response callback=:callback_set, key="foo", cas=1975457268957184, value="bar", metadata={:format=>:document, :flags=>0}>
483
+ # c.delete("foo", cas: 123456) #=> will raise Libcouchbase::Error::KeyExists
484
+ # c.delete("foo", cas: res.cas) #=> true
485
+ def delete(key, async: false, quiet: @quiet, **opts)
486
+ promise = @connection.remove(key, **opts).then { true }
487
+ if quiet
488
+ promise = promise.catch { |error|
489
+ if error.is_a? Libcouchbase::Error::KeyNotFound
490
+ false
491
+ else
492
+ ::Libuv::Q.reject(@reactor, error)
493
+ end
494
+ }
495
+ end
496
+ result promise, async
497
+ end
498
+
499
+ # Delete contents of the bucket
500
+ #
501
+ # @see http://docs.couchbase.com/admin/admin/REST/rest-bucket-flush.html
502
+ #
503
+ # @raise [Libcouchbase::Error::HttpError] in case of an error is
504
+ # encountered.
505
+ #
506
+ # @return [Libcouchbase::Response]
507
+ #
508
+ # @example Simple flush the bucket
509
+ # c.flush
510
+ def flush(async: false)
511
+ result @connection.flush, async
512
+ end
513
+
514
+ # Touch a key, changing its CAS and optionally setting a timeout
515
+ def touch(async: false, **opts)
516
+ result @connection.touch(**opts), async
517
+ end
518
+
519
+ # Fetch design docs stored in current bucket
520
+ #
521
+ # @return [Libcouchbase::DesignDocs]
522
+ def design_docs(**opts)
523
+ DesignDocs.new(self, @connection, method(:result), **opts)
524
+ end
525
+
526
+ # Returns an enumerable for the results in a view.
527
+ #
528
+ # Results are lazily loaded when an operation is performed on the enum
529
+ #
530
+ # @return [Libcouchbase::Results]
531
+ def view(design, view, include_docs: true, is_spatial: false, **opts, &row_modifier)
532
+ view = @connection.query_view(design, view, **ViewDefaults.merge(opts))
533
+ view.include_docs = include_docs
534
+ view.is_spatial = is_spatial
535
+
536
+ current = ::Libuv::Reactor.current
537
+
538
+ if current && current.running?
539
+ ResultsLibuv.new(view, current, &row_modifier)
540
+ elsif Object.const_defined?(:EventMachine) && EM.reactor_thread?
541
+ ResultsEM.new(view, &row_modifier)
542
+ else
543
+ ResultsNative.new(view, &row_modifier)
544
+ end
545
+ end
546
+ ViewDefaults = {
547
+ on_error: :stop,
548
+ stale: false
549
+ }
550
+
551
+ # Returns an enumerable for the results in a full text search.
552
+ #
553
+ # Results are lazily loaded when an operation is performed on the enum
554
+ #
555
+ # @return [Libcouchbase::Results]
556
+ def full_text_search(index, query, **opts, &row_modifier)
557
+ if query.is_a? Hash
558
+ opts[:query] = query
559
+ else
560
+ opts[:query] = {query: query}
561
+ end
562
+ fts = @connection.full_text_search(index, **FtsDefaults.merge(opts))
563
+
564
+ current = ::Libuv::Reactor.current
565
+ if current && current.running?
566
+ ResultsLibuv.new(fts, current, &row_modifier)
567
+ elsif Object.const_defined?(:EventMachine) && EM.reactor_thread?
568
+ ResultsEM.new(fts, &row_modifier)
569
+ else
570
+ ResultsNative.new(fts, &row_modifier)
571
+ end
572
+ end
573
+ FtsDefaults = {
574
+ include_docs: true,
575
+ size: 10000, # Max result size
576
+ from: 0,
577
+ explain: false
578
+ }
579
+
580
+ # Returns an n1ql query builder.
581
+ #
582
+ # @return [Libcouchbase::N1QL]
583
+ def n1ql(**options)
584
+ N1QL.new(self, **options)
585
+ end
586
+
587
+ # Update or create design doc with supplied views
588
+ #
589
+ # @see http://docs.couchbase.com/admin/admin/REST/rest-ddocs-create.html
590
+ #
591
+ # @param [Hash, IO, String] data The source object containing JSON
592
+ # encoded design document.
593
+ def save_design_doc(data, id = nil, async: false)
594
+ attrs = case data
595
+ when String
596
+ JSON.parse(data, Connection::DECODE_OPTIONS)
597
+ when IO
598
+ JSON.parse(data.read, Connection::DECODE_OPTIONS)
599
+ when Hash
600
+ data
601
+ else
602
+ raise ArgumentError, "Document should be Hash, String or IO instance"
603
+ end
604
+ attrs[:language] ||= :javascript
605
+
606
+ id ||= attrs.delete(:_id)
607
+ id = id.sub(/^_design\//, '')
608
+
609
+ result @connection.http("/_design/#{id}",
610
+ method: :put,
611
+ body: attrs,
612
+ type: :view
613
+ ), async
614
+ end
615
+
616
+ # Delete design doc with given id and optional revision.
617
+ #
618
+ # @see http://docs.couchbase.com/admin/admin/REST/rest-ddocs-delete.html
619
+ #
620
+ # @param [String, Symbol] id ID of the design doc
621
+ # @param [String] rev Optional revision
622
+ def delete_design_doc(id, rev = nil, async: false)
623
+ id = id.sub(/^_design\//, '')
624
+ rev = "?rev=#{rev}" if rev
625
+ result @connection.http("/_design/#{id}#{rev}", method: :delete, type: :view), async
626
+ end
627
+
628
+ # Compare and swap value.
629
+ #
630
+ # Reads a key's value from the server and yields it to a block. Replaces
631
+ # the key's value with the result of the block as long as the key hasn't
632
+ # been updated in the meantime, otherwise raises
633
+ # {Libcouchbase::Error::KeyExists}.
634
+ #
635
+ # Setting the +:retry+ option to a positive number will cause this method
636
+ # to rescue the {Libcouchbase::Error::KeyExists} error that happens when
637
+ # an update collision is detected, and automatically get a fresh copy
638
+ # of the value and retry the block. This will repeat as long as there
639
+ # continues to be conflicts, up to the maximum number of retries specified.
640
+ #
641
+ # @param [String, Symbol] key
642
+ #
643
+ # @param [Hash] options the options for "swap" part
644
+ # @option options [Fixnum] :retry (0) maximum number of times to autmatically retry upon update collision
645
+ #
646
+ # @yieldparam [Object] value existing value
647
+ # @yieldreturn [Object] new value.
648
+ #
649
+ # @raise [Couchbase::Error::KeyExists] if the key was updated before the the
650
+ # code in block has been completed (the CAS value has been changed).
651
+ # @raise [ArgumentError] if the block is missing
652
+ #
653
+ # @example Implement append to JSON encoded value
654
+ #
655
+ # c.set(:foo, {bar: 1})
656
+ # c.cas(:foo) do |val|
657
+ # val[:baz] = 2
658
+ # val
659
+ # end
660
+ # c.get(:foo) #=> {bar: 1, baz: 2}
661
+ #
662
+ # @return [Libcouchbase::Response] the transaction details including the new CAS
663
+ def compare_and_swap(key, **opts)
664
+ retries = opts.delete(:retry) || 0
665
+ begin
666
+ current = result(@connection.get(key))
667
+ new_value = yield current.value, opts
668
+ opts[:cas] = current.cas
669
+
670
+ set(key, new_value, **opts)
671
+ rescue Libcouchbase::Error::KeyExists
672
+ retries -= 1
673
+ retry if retries >= 0
674
+ raise
675
+ end
676
+ end
677
+ alias_method :cas, :compare_and_swap
678
+
679
+ # The numbers of the replicas for each node in the cluster
680
+ # @return [Integer]
681
+ def get_num_replicas
682
+ result @connection.get_num_replicas
683
+ end
684
+
685
+ # The numbers of nodes in the cluster
686
+ # @return [Integer]
687
+ def get_num_nodes
688
+ result @connection.get_num_nodes
689
+ end
690
+
691
+ # Waits for all the async operations to complete and returns the results
692
+ #
693
+ # @return [Array]
694
+ def wait_results(*results)
695
+ result ::Libuv::Q.all(@reactor, *results.flatten)
696
+ end
697
+
698
+
699
+ protected
700
+
701
+
702
+ def result(promise, async = false)
703
+ return promise if async
704
+
705
+ current = ::Libuv::Reactor.current
706
+ if current && current.running?
707
+ co promise
708
+ elsif Object.const_defined?(:EventMachine) && EM.reactor_thread?
709
+ # Assume this is being run in em-synchrony
710
+ f = Fiber.current
711
+ error = nil
712
+ response = nil
713
+
714
+ @connection.reactor.next_tick do
715
+ begin
716
+ response = co(promise)
717
+ rescue => e
718
+ error = e
719
+ end
720
+
721
+ EM.next_tick {
722
+ f.resume
723
+ }
724
+ end
725
+
726
+ Fiber.yield
727
+
728
+ raise error if error
729
+ response
730
+ else
731
+ request = Mutex.new
732
+ result = ConditionVariable.new
733
+ error = nil
734
+ response = nil
735
+
736
+ request.synchronize {
737
+ @connection.reactor.next_tick do
738
+ begin
739
+ response = co(promise)
740
+ rescue => e
741
+ error = e
742
+ end
743
+
744
+ # Odds are we won't actually block here
745
+ request.synchronize {
746
+ result.signal
747
+ }
748
+ end
749
+ result.wait(request)
750
+ }
751
+
752
+ raise error if error
753
+ response
754
+ end
755
+ end
756
+
757
+ def connect
758
+ if @connection.reactor.running?
759
+ # We don't need to start a reactor so we use the regular helper
760
+ result(@connection.connect)
761
+ elsif Object.const_defined?(:EventMachine) && EM.reactor_thread?
762
+ start_reactor_and_em_connect
763
+ else
764
+ start_reactor_and_connect
765
+ end
766
+ end
767
+
768
+ # This blocks on the current thread
769
+ def start_reactor_and_connect
770
+ connecting = Mutex.new
771
+ result = ConditionVariable.new
772
+ error = nil
773
+
774
+ connecting.synchronize {
775
+ Thread.new do
776
+ @connection.reactor.run do
777
+ begin
778
+ co @connection.connect
779
+ rescue => e
780
+ error = e
781
+ end
782
+
783
+ # Odds are we won't actually block here
784
+ connecting.synchronize {
785
+ result.signal
786
+ }
787
+ end
788
+ end
789
+ result.wait(connecting)
790
+ }
791
+
792
+ raise error if error
793
+ end
794
+
795
+ # Assume this is being run in em-synchrony
796
+ def start_reactor_and_em_connect
797
+ f = Fiber.current
798
+ error = nil
799
+
800
+ Thread.new do
801
+ @connection.reactor.run do
802
+ begin
803
+ co @connection.connect
804
+ rescue => e
805
+ error = e
806
+ end
807
+
808
+ EM.next_tick {
809
+ f.resume
810
+ }
811
+ end
812
+ end
813
+
814
+ Fiber.yield
815
+
816
+ raise error if error
817
+ end
818
+ end
819
+ end