libcouchbase 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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