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