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,105 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #ifndef LCB_CONNSPEC_H
19
+ #define LCB_CONNSPEC_H
20
+
21
+ #include <libcouchbase/couchbase.h>
22
+ #include "config.h"
23
+ #include <string>
24
+ #include <vector>
25
+ #include <set>
26
+
27
+ namespace lcb {
28
+ struct Spechost {
29
+ Spechost() : port(0), type(0) {}
30
+ lcb_U16 port;
31
+ short type;
32
+ std::string hostname;
33
+ bool isSSL() const { return type == LCB_CONFIG_MCD_SSL_PORT || type == LCB_CONFIG_HTTP_SSL_PORT; }
34
+ bool isHTTPS() const { return type == LCB_CONFIG_HTTP_SSL_PORT; }
35
+ bool isHTTP() const { return type == LCB_CONFIG_HTTP_PORT; }
36
+ bool isMCD() const { return type == LCB_CONFIG_MCD_PORT; }
37
+ bool isMCDS() const { return type == LCB_CONFIG_MCD_SSL_PORT; }
38
+ bool isTypeless() const { return type == 0 ; }
39
+
40
+ bool isAnyMcd() const {
41
+ return isMCD() || isMCDS() || type == LCB_CONFIG_MCCOMPAT_PORT;
42
+ }
43
+ bool isAnyHttp() const {
44
+ return isHTTP() || isHTTPS();
45
+ }
46
+ };
47
+
48
+ #define LCB_CONNSPEC_F_FILEONLY (1<<4)
49
+
50
+ class LCB_CLASS_EXPORT Connspec {
51
+ public:
52
+ typedef std::vector<std::pair<std::string,std::string> > Options;
53
+ Connspec() : m_sslopts(0), m_implicit_port(0), m_loglevel(0), m_flags(0) {}
54
+
55
+ lcb_error_t parse(const char *connstr, const char **errmsg = NULL);
56
+ lcb_error_t load(const lcb_create_st&);
57
+
58
+ bool has_bsmode(int mode) const {
59
+ return m_transports.find(mode) != m_transports.end();
60
+ }
61
+ bool is_bs_udef() const {
62
+ return !m_transports.empty() || (m_flags & LCB_CONNSPEC_F_FILEONLY);
63
+ }
64
+ bool is_bs_http() const { return has_bsmode(LCB_CONFIG_TRANSPORT_HTTP); }
65
+ bool is_bs_cccp() const { return has_bsmode(LCB_CONFIG_TRANSPORT_CCCP); }
66
+ bool is_bs_file() const { return m_flags & LCB_CONNSPEC_F_FILEONLY; }
67
+ uint16_t default_port() const { return m_implicit_port; }
68
+ const std::vector<Spechost>& hosts() const { return m_hosts; }
69
+ const std::string& bucket() const { return m_bucket; }
70
+ const std::string& username() const { return m_username; }
71
+ const std::string& password() const { return m_password; }
72
+ const std::string& certpath() const { return m_certpath; }
73
+ unsigned sslopts() const { return m_sslopts; }
74
+ const Options& options() const { return m_ctlopts; }
75
+ unsigned loglevel() const { return m_loglevel; }
76
+ const std::string& connstr() const { return m_connstr; }
77
+ private:
78
+ Options m_ctlopts;
79
+ std::string m_bucket;
80
+ std::string m_username;
81
+ std::string m_password;
82
+ std::string m_certpath;
83
+ std::string m_connstr;
84
+ unsigned m_sslopts; /**< SSL Options */
85
+ std::vector<Spechost> m_hosts;
86
+ lcb_U16 m_implicit_port; /**< Implicit port, based on scheme */
87
+ int m_loglevel; /* cached loglevel */
88
+
89
+ inline lcb_error_t parse_options(
90
+ const char *options, const char *optend, const char **errmsg);
91
+ inline lcb_error_t parse_hosts(
92
+ const char *hostbegin, const char *hostend, const char **errmsg);
93
+
94
+ std::set<int> m_transports;
95
+ unsigned m_flags; /**< Internal flags */
96
+ };
97
+
98
+ #define LCB_SPECSCHEME_RAW "couchbase+explicit://"
99
+ #define LCB_SPECSCHEME_MCD "couchbase://"
100
+ #define LCB_SPECSCHEME_MCD_SSL "couchbases://"
101
+ #define LCB_SPECSCHEME_HTTP "http://"
102
+ #define LCB_SPECSCHEME_HTTP_SSL "https-internal://"
103
+ #define LCB_SPECSCHEME_MCCOMPAT "memcached://"
104
+ } // namespace
105
+ #endif
@@ -0,0 +1,27 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /* small utility for retrieving host/port information from the CTX */
19
+ static const char* get__ctx_hostinfo(const lcbio_CTX *ctx, int is_host)
20
+ {
21
+ if (ctx == NULL || ctx->sock == NULL || ctx->sock->info == NULL) {
22
+ return is_host ? "NOHOST" : "NOPORT";
23
+ }
24
+ return is_host ? ctx->sock->info->ep.host : ctx->sock->info->ep.port;
25
+ }
26
+ static const char *get_ctx_host(const lcbio_CTX *ctx) { return get__ctx_hostinfo(ctx, 1); }
27
+ static const char *get_ctx_port(const lcbio_CTX *ctx) { return get__ctx_hostinfo(ctx, 0); }
@@ -0,0 +1,98 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "internal.h"
19
+ #include "bucketconfig/clconfig.h"
20
+ #include "list.h"
21
+ #include "mc/mcreq.h"
22
+ #include "retryq.h"
23
+
24
+ LIBCOUCHBASE_API
25
+ void
26
+ lcb_dump(lcb_t instance, FILE *fp, lcb_U32 flags)
27
+ {
28
+ unsigned ii;
29
+
30
+ if (!fp) {
31
+ fp = stderr;
32
+ }
33
+ fprintf(fp, "Dumping state for lcb_t=%p\n", (void*)instance);
34
+ fprintf(fp, "Settings=%p\n", (void*)instance->settings);
35
+
36
+ if (instance->cur_configinfo) {
37
+ clconfig_info *cfg = instance->cur_configinfo;
38
+ fprintf(fp, "Current VBC=%p\n", (void*)cfg->vbc);
39
+ fprintf(fp, "Config RevID=%d\n", cfg->vbc->revid);
40
+ if (flags & LCB_DUMP_VBCONFIG) {
41
+ char *cfgdump = lcbvb_save_json(cfg->vbc);
42
+ fprintf(fp, "=== CLUSTER CONFIG BEGIN ===\n");
43
+ fprintf(fp, "%s", cfgdump);
44
+ free(cfgdump);
45
+ fprintf(fp, "\n");
46
+ fprintf(fp, "=== CLUSTER CONFIG END ===\n");
47
+ } else {
48
+ fprintf(fp, "=== NOT DUMPING CLUSTER CONFIG. LCB_DUMP_VBCONFIG not passed\n");
49
+ }
50
+ } else {
51
+ fprintf(fp, "NO CLUSTER CONFIG\n");
52
+ }
53
+ fprintf(fp,"Retry queue has items: %s\n", lcb_retryq_empty(instance->retryq) ? "No" : "Yes");
54
+ if (flags & LCB_DUMP_PKTINFO) {
55
+ fprintf(fp, "=== BEGIN RETRY QUEUE DUMP ===\n");
56
+ lcb_retryq_dump(instance->retryq, fp, NULL);
57
+ fprintf(fp, "=== END RETRY QUEUE DUMP ===\n");
58
+ } else {
59
+ fprintf(fp, "=== NOT DUMPING PACKET INFO. LCB_DUMP_PKTINFO not passed\n");
60
+ }
61
+
62
+ fprintf(fp, "=== BEGIN PIPELINE DUMP ===\n");
63
+ for (ii = 0; ii < instance->cmdq.npipelines; ii++) {
64
+ mc_SERVER *server;
65
+ mc_PIPELINE *pl = instance->cmdq.pipelines[ii];
66
+
67
+ server = (mc_SERVER *)pl;
68
+ fprintf(fp, "** [%u] SERVER %s:%s\n", ii, server->curhost->host, server->curhost->port);
69
+ if (server->connctx) {
70
+ fprintf(fp, "** == BEGIN SOCKET INFO\n");
71
+ lcbio_ctx_dump(server->connctx, fp);
72
+ fprintf(fp, "** == END SOCKET INFO\n");
73
+ } else if (server->connreq.u.p_generic) {
74
+ fprintf(fp, "** == STILL CONNECTING\n");
75
+ } else {
76
+ fprintf(fp, "** == NOT CONNECTED\n");
77
+ }
78
+ if (flags & LCB_DUMP_BUFINFO) {
79
+ fprintf(fp, "** == DUMPING NETBUF INFO (For packet network data)\n");
80
+ netbuf_dump_status(&pl->nbmgr, fp);
81
+ fprintf(fp, "** == DUMPING NETBUF INFO (For packet structures)\n");
82
+ netbuf_dump_status(&pl->reqpool, fp);
83
+ } else {
84
+ fprintf(fp, "** == NOT DUMPING NETBUF INFO. LCB_DUMP_BUFINFO not passed\n");
85
+ }
86
+ if (flags & LCB_DUMP_PKTINFO) {
87
+ mcreq_dump_chain(pl, fp, NULL);
88
+ } else {
89
+ fprintf(fp, "** == NOT DUMPING PACKETS. LCB_DUMP_PKTINFO not passed\n");
90
+ }
91
+ fprintf(fp, "\n\n");
92
+ }
93
+ fprintf(fp, "=== END PIPELINE DUMP ===\n");
94
+
95
+ fprintf(fp, "=== BEGIN CONFMON DUMP ===\n");
96
+ lcb_confmon_dump(instance->confmon, fp);
97
+ fprintf(fp, "=== END CONFMON DUMP ===\n");
98
+ }
@@ -0,0 +1,100 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "internal.h"
19
+ #include <bucketconfig/clconfig.h>
20
+ LCB_INTERNAL_API
21
+ mc_SERVER *
22
+ lcb_find_server_by_host(lcb_t instance, const lcb_host_t *host)
23
+ {
24
+ mc_CMDQUEUE *cq = &instance->cmdq;
25
+ unsigned ii;
26
+ for (ii = 0; ii < cq->npipelines; ii++) {
27
+ mc_SERVER *server = (mc_SERVER *)cq->pipelines[ii];
28
+ if (lcb_host_equals(server->curhost, host)) {
29
+ return server;
30
+ }
31
+ }
32
+ return NULL;
33
+ }
34
+
35
+ LCB_INTERNAL_API
36
+ mc_SERVER *
37
+ lcb_find_server_by_index(lcb_t instance, int ix)
38
+ {
39
+ mc_CMDQUEUE *cq = &instance->cmdq;
40
+ if (ix < 0 || ix >= (int)cq->npipelines) {
41
+ return NULL;
42
+ }
43
+ return (mc_SERVER *)cq->pipelines[ix];
44
+ }
45
+
46
+ static void
47
+ ext_callback_proxy(mc_PIPELINE *pl, mc_PACKET *req, lcb_error_t rc,
48
+ const void *resdata)
49
+ {
50
+ mc_SERVER *server = (mc_SERVER *)pl;
51
+ mc_REQDATAEX *rd = req->u_rdata.exdata;
52
+ const packet_info *res = resdata;
53
+
54
+ lcb_cccp_update2(rd->cookie, rc, res->payload, PACKET_NBODY(res),
55
+ server->curhost);
56
+ free(rd);
57
+ }
58
+
59
+ static mc_REQDATAPROCS procs = { ext_callback_proxy };
60
+
61
+ LCB_INTERNAL_API
62
+ lcb_error_t
63
+ lcb_getconfig(lcb_t instance, const void *cookie, mc_SERVER *server)
64
+ {
65
+ lcb_error_t err;
66
+ mc_CMDQUEUE *cq = &instance->cmdq;
67
+ mc_PIPELINE *pipeline = (mc_PIPELINE *)server;
68
+ mc_PACKET *packet;
69
+ mc_REQDATAEX *rd;
70
+
71
+ protocol_binary_request_header hdr;
72
+ packet = mcreq_allocate_packet(pipeline);
73
+ if (!packet) {
74
+ return LCB_CLIENT_ENOMEM;
75
+ }
76
+
77
+ err = mcreq_reserve_header(pipeline, packet, 24);
78
+ if (err != LCB_SUCCESS) {
79
+ mcreq_release_packet(pipeline, packet);
80
+ return err;
81
+ }
82
+
83
+ rd = calloc(1, sizeof(*rd));
84
+ rd->procs = &procs;
85
+ rd->cookie = cookie;
86
+ rd->start = gethrtime();
87
+ packet->u_rdata.exdata = rd;
88
+ packet->flags |= MCREQ_F_REQEXT;
89
+
90
+ memset(&hdr, 0, sizeof(hdr));
91
+ hdr.request.opaque = packet->opaque;
92
+ hdr.request.magic = PROTOCOL_BINARY_REQ;
93
+ hdr.request.opcode = PROTOCOL_BINARY_CMD_GET_CLUSTER_CONFIG;
94
+ memcpy(SPAN_BUFFER(&packet->kh_span), hdr.bytes, sizeof(hdr.bytes));
95
+
96
+ mcreq_sched_enter(cq);
97
+ mcreq_sched_add(pipeline, packet);
98
+ mcreq_sched_leave(cq, 1);
99
+ return LCB_SUCCESS;
100
+ }
@@ -0,0 +1,109 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2011-2012 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "config.h"
19
+ #include "settings.h"
20
+ #include <libcouchbase/couchbase.h>
21
+
22
+ #ifndef HAVE_GETHRTIME
23
+
24
+ #include <stdlib.h>
25
+ #include <time.h>
26
+ #if defined(__MACH__) && defined(__APPLE__)
27
+ #include <mach/mach_time.h>
28
+ #endif
29
+
30
+ #ifdef __linux__
31
+ #undef HAVE_CLOCK_GETTIME
32
+ #define HAVE_CLOCK_GETTIME 1
33
+ #endif
34
+
35
+ #define CLOCK_START_OFFSET (LCB_S2NS(3600 * 24))
36
+
37
+ hrtime_t gethrtime(void)
38
+ {
39
+ #ifdef __APPLE__
40
+
41
+ /* Most things expect a pretty large timestamp - even though a smaller one
42
+ * may be perfectly valid. Initialize the default with an offset of one day,
43
+ * in nanoseconds
44
+ */
45
+
46
+ /* Use the various mach stuff:
47
+ * https://developer.apple.com/library/mac/qa/qa1398/_index.html */
48
+
49
+ static uint64_t start = 0;
50
+ uint64_t now ;
51
+ static mach_timebase_info_data_t tmbi;
52
+
53
+ if (start == 0) {
54
+ start = mach_absolute_time();
55
+ mach_timebase_info(&tmbi);
56
+ }
57
+
58
+ now = mach_absolute_time();
59
+ return ((now - start) * tmbi.numer / tmbi.denom) + CLOCK_START_OFFSET;
60
+
61
+ #elif defined(HAVE_CLOCK_GETTIME)
62
+ struct timespec tm;
63
+ lcb_assert(clock_gettime(CLOCK_MONOTONIC, &tm) != -1);
64
+ return (((hrtime_t)tm.tv_sec) * 1000000000) + (hrtime_t)tm.tv_nsec;
65
+ #elif defined(HAVE_GETTIMEOFDAY)
66
+
67
+ hrtime_t ret;
68
+ struct timeval tv;
69
+ if (gettimeofday(&tv, NULL) == -1) {
70
+ return -1;
71
+ }
72
+
73
+ ret = (hrtime_t)tv.tv_sec * 1000000000;
74
+ ret += (hrtime_t)tv.tv_usec * 1000;
75
+ return ret;
76
+ #elif defined(HAVE_QUERYPERFORMANCECOUNTER)
77
+ double ret;
78
+ // To fix the potential race condition for the local static variable,
79
+ // gethrtime should be called in a global static variable first.
80
+ // It will guarantee the local static variable will be initialized
81
+ // before any thread calls the function.
82
+ static LARGE_INTEGER pf = { 0 };
83
+ static double freq;
84
+ LARGE_INTEGER currtime;
85
+
86
+ if (pf.QuadPart == 0) {
87
+ lcb_assert(QueryPerformanceFrequency(&pf));
88
+ lcb_assert(pf.QuadPart != 0);
89
+ freq = 1.0e9 / (double)pf.QuadPart;
90
+ }
91
+
92
+ QueryPerformanceCounter(&currtime);
93
+
94
+ ret = (double)currtime.QuadPart * freq ;
95
+ return (hrtime_t)ret + CLOCK_START_OFFSET;
96
+ #else
97
+ #error "I don't know how to build a highres clock..."
98
+ #endif
99
+ }
100
+ #endif /* HAVE_GETHRTIME */
101
+
102
+ /* Symbol usable so other subsystems can get the same idea of time the library
103
+ * has. This will also allow us to stop shipping the 'gethrtime' file around.
104
+ */
105
+
106
+ LCB_INTERNAL_API
107
+ lcb_U64 lcb_nstime(void) {
108
+ return gethrtime();
109
+ }
@@ -0,0 +1,922 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "internal.h"
19
+ #include "packetutils.h"
20
+ #include "mc/mcreq.h"
21
+ #include "mc/compress.h"
22
+ #include "trace.h"
23
+
24
+ /** Define a compound response structure for use with mutation tokens */
25
+ #define MK_RESPACK(dstname, srcname) \
26
+ typedef struct { srcname resp; lcb_MUTATION_TOKEN mt; } dstname
27
+ MK_RESPACK(respack_STORE, lcb_RESPSTORE);
28
+ MK_RESPACK(respack_COUNTER, lcb_RESPCOUNTER);
29
+ MK_RESPACK(respack_REMOVE, lcb_RESPREMOVE);
30
+ MK_RESPACK(respack_SUBDOC, lcb_RESPSUBDOC);
31
+
32
+ LIBCOUCHBASE_API
33
+ lcb_error_t
34
+ lcb_errmap_default(lcb_t instance, lcb_uint16_t in)
35
+ {
36
+ (void)instance;
37
+
38
+ switch (in) {
39
+ case PROTOCOL_BINARY_RESPONSE_NOT_MY_VBUCKET:
40
+ return LCB_ETIMEDOUT;
41
+ case PROTOCOL_BINARY_RESPONSE_AUTH_CONTINUE:
42
+ return LCB_AUTH_CONTINUE;
43
+ case PROTOCOL_BINARY_RESPONSE_EBUSY:
44
+ return LCB_EBUSY;
45
+ case PROTOCOL_BINARY_RESPONSE_ETMPFAIL:
46
+ return LCB_ETMPFAIL;
47
+
48
+ case PROTOCOL_BINARY_RESPONSE_EINTERNAL:
49
+ default:
50
+ fprintf(stderr, "COUCHBASE: Unhandled memcached status=0x%x\n", in);
51
+ return LCB_UNKNOWN_MEMCACHED_ERROR;
52
+ }
53
+ }
54
+
55
+ static lcb_error_t
56
+ map_error(lcb_t instance, int in)
57
+ {
58
+ (void)instance;
59
+ switch (in) {
60
+ case PROTOCOL_BINARY_RESPONSE_SUCCESS:
61
+ return LCB_SUCCESS;
62
+ case PROTOCOL_BINARY_RESPONSE_KEY_ENOENT:
63
+ return LCB_KEY_ENOENT;
64
+ case PROTOCOL_BINARY_RESPONSE_E2BIG:
65
+ return LCB_E2BIG;
66
+ case PROTOCOL_BINARY_RESPONSE_ENOMEM:
67
+ return LCB_ENOMEM;
68
+ case PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS:
69
+ return LCB_KEY_EEXISTS;
70
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_ENOENT:
71
+ return LCB_SUBDOC_PATH_ENOENT;
72
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_MISMATCH:
73
+ return LCB_SUBDOC_PATH_MISMATCH;
74
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_EINVAL:
75
+ return LCB_SUBDOC_PATH_EINVAL;
76
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_E2BIG:
77
+ return LCB_SUBDOC_PATH_E2BIG;
78
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_DOC_E2DEEP:
79
+ return LCB_SUBDOC_DOC_E2DEEP;
80
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_VALUE_ETOODEEP:
81
+ return LCB_SUBDOC_VALUE_E2DEEP;
82
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_VALUE_CANTINSERT:
83
+ return LCB_SUBDOC_VALUE_CANTINSERT;
84
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_DOC_NOTJSON:
85
+ return LCB_SUBDOC_DOC_NOTJSON;
86
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_NUM_ERANGE:
87
+ return LCB_SUBDOC_NUM_ERANGE;
88
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_DELTA_ERANGE:
89
+ return LCB_SUBDOC_BAD_DELTA;
90
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_EEXISTS:
91
+ return LCB_SUBDOC_PATH_EEXISTS;
92
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_MULTI_PATH_FAILURE:
93
+ return LCB_SUBDOC_MULTI_FAILURE;
94
+ case PROTOCOL_BINARY_RESPONSE_EINVAL:
95
+ return LCB_EINVAL_MCD;
96
+ case PROTOCOL_BINARY_RESPONSE_NOT_STORED:
97
+ return LCB_NOT_STORED;
98
+ case PROTOCOL_BINARY_RESPONSE_DELTA_BADVAL:
99
+ return LCB_DELTA_BADVAL;
100
+ case PROTOCOL_BINARY_RESPONSE_AUTH_ERROR:
101
+ return LCB_AUTH_ERROR;
102
+ case PROTOCOL_BINARY_RESPONSE_ERANGE:
103
+ return LCB_ERANGE;
104
+ case PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND:
105
+ return LCB_UNKNOWN_COMMAND;
106
+ case PROTOCOL_BINARY_RESPONSE_NOT_SUPPORTED:
107
+ return LCB_NOT_SUPPORTED;
108
+ default:
109
+ if (instance != NULL) {
110
+ return instance->callbacks.errmap(instance, in);
111
+ } else {
112
+ return lcb_errmap_default(NULL, in);
113
+ }
114
+ }
115
+ }
116
+
117
+ static lcb_RESPCALLBACK
118
+ find_callback(lcb_t instance, lcb_CALLBACKTYPE type)
119
+ {
120
+ lcb_RESPCALLBACK cb = instance->callbacks.v3callbacks[type];
121
+ if (!cb) {
122
+ cb = lcb_find_callback(instance, type);
123
+ }
124
+ return cb;
125
+ }
126
+
127
+
128
+ /**
129
+ * This file contains the mapping of various protocol response codes for
130
+ * a given command. Each handler receives the following parameters:
131
+ *
132
+ * @param pipeline the pipeline (or "Server") upon which the request was sent
133
+ * (and response was received)
134
+ *
135
+ * @param request the original request (including associated data). The request
136
+ * may be used to determine additional information about it, such as the
137
+ * user-defined "Cookie", number of related requests remaining, and more.
138
+ *
139
+ * @param response the response which was received. This is an opaque
140
+ * representation of a memcached response packet
141
+ *
142
+ * @param immerr in the case of an abnormal failure (i.e. network failure) the
143
+ * handler will be invoked with this callback set to a non-success value. The
144
+ * 'info' structure will still contain a valid (albeit empty and cryptic)
145
+ * header. If the user depends on special data being found in the payload then
146
+ * the handler must check that this variable is set to LCB_SUCCESS before
147
+ * continuing. Also note that a negative reply may also be present within
148
+ * the response itself; however this is not the purpose of this parameter.
149
+ *
150
+ * @return request status
151
+ * The return value should indicate whether outstanding responses remain
152
+ * to be received for this request, or if this request is deemed to be
153
+ * satisfied.
154
+ */
155
+
156
+ #define MK_ERROR(root, resp, response, imm) do { \
157
+ if (imm) { \
158
+ (resp)->rc = imm; \
159
+ (resp)->rflags |= LCB_RESP_F_CLIENTGEN; \
160
+ } else if (PACKET_STATUS(response) == PROTOCOL_BINARY_RESPONSE_SUCCESS) { \
161
+ (resp)->rc = LCB_SUCCESS; \
162
+ } else { \
163
+ (resp)->rc = map_error(root, PACKET_STATUS(response)); \
164
+ } \
165
+ } while (0);
166
+
167
+ static void
168
+ init_resp3(lcb_t instance, const packet_info *mc_resp, const mc_PACKET *req,
169
+ lcb_error_t immerr, lcb_RESPBASE *resp)
170
+ {
171
+ MK_ERROR(instance, resp, mc_resp, immerr);
172
+ resp->cas = PACKET_CAS(mc_resp);
173
+ resp->cookie = (void *)MCREQ_PKT_COOKIE(req);
174
+ mcreq_get_key(req, &resp->key, &resp->nkey);
175
+ }
176
+
177
+ /**
178
+ * Handles the propagation and population of the 'mutation token' information.
179
+ * @param mc_resp The response packet
180
+ * @param req The request packet (used to get the vBucket)
181
+ * @param tgt Pointer to mutation token which should be populated.
182
+ */
183
+ static void
184
+ handle_mutation_token(lcb_t instance, const packet_info *mc_resp,
185
+ const mc_PACKET *req, lcb_MUTATION_TOKEN *stok)
186
+ {
187
+ const char *sbuf;
188
+ uint16_t vbid;
189
+
190
+ if (PACKET_EXTLEN(mc_resp) == 0) {
191
+ return; /* No extras */
192
+ }
193
+
194
+ if (!instance->dcpinfo && LCBT_SETTING(instance, dur_mutation_tokens)) {
195
+ size_t nvb = LCBT_VBCONFIG(instance)->nvb;
196
+ if (nvb) {
197
+ instance->dcpinfo = calloc(nvb, sizeof(*instance->dcpinfo));
198
+ }
199
+ }
200
+
201
+ sbuf = PACKET_BODY(mc_resp);
202
+ vbid = mcreq_get_vbucket(req);
203
+ stok->vbid_ = vbid;
204
+ memcpy(&stok->uuid_, sbuf, 8);
205
+ memcpy(&stok->seqno_, sbuf + 8, 8);
206
+
207
+ stok->uuid_ = lcb_ntohll(stok->uuid_);
208
+ stok->seqno_ = lcb_ntohll(stok->seqno_);
209
+
210
+ if (instance->dcpinfo) {
211
+ instance->dcpinfo[vbid] = *stok;
212
+ }
213
+ }
214
+
215
+ #define MK_RESPKEY3(resp, req) do { \
216
+ mcreq_get_key(req, &(resp)->key, &(resp)->nkey); \
217
+ } while (0);
218
+
219
+
220
+ static void
221
+ invoke_callback3(const mc_PACKET *pkt,
222
+ lcb_t instance,lcb_CALLBACKTYPE cbtype, lcb_RESPBASE * resp)
223
+ {
224
+ if (!(pkt->flags & MCREQ_F_INVOKED)) {
225
+ resp->cookie = (void *)MCREQ_PKT_COOKIE(pkt);
226
+ if ((pkt->flags & MCREQ_F_PRIVCALLBACK) == 0) {
227
+ find_callback(instance, cbtype)(instance, cbtype, resp);
228
+ } else {
229
+ (*(lcb_RESPCALLBACK*)resp->cookie)(instance, cbtype, resp);
230
+ }
231
+ }
232
+ }
233
+ #define INVOKE_CALLBACK3(req, res_, instance, type) { \
234
+ invoke_callback3(req, instance, type, (lcb_RESPBASE *)res_); \
235
+ }
236
+
237
+ /**
238
+ * Optionally decompress an incoming payload.
239
+ * @param o The instance
240
+ * @param resp The response received
241
+ * @param[out] bytes pointer to the final payload
242
+ * @param[out] nbytes pointer to the size of the final payload
243
+ * @param[out] freeptr pointer to free. This should be initialized to `NULL`.
244
+ * If temporary dynamic storage is required this will be set to the allocated
245
+ * pointer upon return. Otherwise it will be set to NULL. In any case it must
246
+ */
247
+ static void
248
+ maybe_decompress(lcb_t o,
249
+ const packet_info *respkt, lcb_RESPGET *rescmd, void **freeptr)
250
+ {
251
+ lcb_U8 dtype = 0;
252
+ if (!PACKET_NVALUE(respkt)) {
253
+ return;
254
+ }
255
+
256
+ if (PACKET_DATATYPE(respkt) & PROTOCOL_BINARY_DATATYPE_JSON) {
257
+ dtype = LCB_VALUE_F_JSON;
258
+ }
259
+
260
+ if (PACKET_DATATYPE(respkt) & PROTOCOL_BINARY_DATATYPE_COMPRESSED) {
261
+ if (LCBT_SETTING(o, compressopts) & LCB_COMPRESS_IN) {
262
+ /* if we inflate, we don't set the flag */
263
+ mcreq_inflate_value(
264
+ PACKET_VALUE(respkt), PACKET_NVALUE(respkt),
265
+ &rescmd->value, &rescmd->nvalue, freeptr);
266
+
267
+ } else {
268
+ /* user doesn't want inflation. signal it's compressed */
269
+ dtype |= LCB_VALUE_F_SNAPPYCOMP;
270
+ }
271
+ }
272
+ rescmd->datatype = dtype;
273
+ }
274
+
275
+ static void
276
+ H_get(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
277
+ lcb_error_t immerr)
278
+ {
279
+ lcb_t o;
280
+ lcb_RESPGET resp = { 0 };
281
+ void *freeptr = NULL;
282
+
283
+ o = pipeline->parent->cqdata;
284
+ init_resp3(o, response, request, immerr, (lcb_RESPBASE *)&resp);
285
+ resp.rflags |= LCB_RESP_F_FINAL;
286
+
287
+ if (resp.rc == LCB_SUCCESS) {
288
+ const protocol_binary_response_getq *getq =
289
+ PACKET_EPHEMERAL_START(response);
290
+ resp.datatype = PACKET_DATATYPE(response);
291
+ resp.itmflags = ntohl(getq->message.body.flags);
292
+ resp.value = PACKET_VALUE(response);
293
+ resp.nvalue = PACKET_NVALUE(response);
294
+ resp.bufh = response->bufh;
295
+ }
296
+
297
+ maybe_decompress(o, response, &resp, &freeptr);
298
+ TRACE_GET_END(response, &resp);
299
+ INVOKE_CALLBACK3(request, &resp, o, LCB_CALLBACK_GET);
300
+ free(freeptr);
301
+ }
302
+
303
+ static void
304
+ H_getreplica(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
305
+ lcb_error_t immerr)
306
+ {
307
+ lcb_RESPGET resp = { 0 };
308
+ lcb_t instance = pipeline->parent->cqdata;
309
+ void *freeptr = NULL;
310
+ mc_REQDATAEX *rd = request->u_rdata.exdata;
311
+
312
+ init_resp3(instance, response, request, immerr, (lcb_RESPBASE *)&resp);
313
+
314
+ if (resp.rc == LCB_SUCCESS) {
315
+ const protocol_binary_response_get *get = PACKET_EPHEMERAL_START(response);
316
+ resp.itmflags = ntohl(get->message.body.flags);
317
+ resp.datatype = PACKET_DATATYPE(response);
318
+ resp.value = PACKET_VALUE(response);
319
+ resp.nvalue = PACKET_NVALUE(response);
320
+ resp.bufh = response->bufh;
321
+ }
322
+
323
+ maybe_decompress(instance, response, &resp, &freeptr);
324
+ rd->procs->handler(pipeline, request, resp.rc, &resp);
325
+ free(freeptr);
326
+ }
327
+
328
+ static void
329
+ H_subdoc(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
330
+ lcb_error_t immerr)
331
+ {
332
+ lcb_t o;
333
+ respack_SUBDOC w = { { 0 } };
334
+ int cbtype;
335
+ o = pipeline->parent->cqdata;
336
+ init_resp3(o, response, request, immerr, (lcb_RESPBASE *)&w.resp);
337
+ w.resp.rflags |= LCB_RESP_F_FINAL;
338
+
339
+ /* For mutations, add the mutation token */
340
+ switch (PACKET_OPCODE(response)) {
341
+ case PROTOCOL_BINARY_CMD_SUBDOC_GET:
342
+ case PROTOCOL_BINARY_CMD_SUBDOC_EXISTS:
343
+ case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_LOOKUP:
344
+ cbtype = LCB_CALLBACK_SDLOOKUP;
345
+ break;
346
+
347
+ default:
348
+ handle_mutation_token(o, response, request, &w.mt);
349
+ w.resp.rflags |= LCB_RESP_F_EXTDATA;
350
+ cbtype = LCB_CALLBACK_SDMUTATE;
351
+ break;
352
+ }
353
+
354
+ if (PACKET_OPCODE(response) == PROTOCOL_BINARY_CMD_SUBDOC_MULTI_LOOKUP ||
355
+ PACKET_OPCODE(response) == PROTOCOL_BINARY_CMD_SUBDOC_MULTI_MUTATION) {
356
+ if (w.resp.rc == LCB_SUCCESS || w.resp.rc == LCB_SUBDOC_MULTI_FAILURE) {
357
+ w.resp.responses = response;
358
+ }
359
+ } else {
360
+ /* Single response */
361
+ w.resp.rflags |= LCB_RESP_F_SDSINGLE;
362
+ if (w.resp.rc == LCB_SUCCESS) {
363
+ w.resp.responses = response;
364
+ } else if (LCB_EIFSUBDOC(w.resp.rc)) {
365
+ w.resp.responses = response;
366
+ w.resp.rc = LCB_SUBDOC_MULTI_FAILURE;
367
+ }
368
+ }
369
+ INVOKE_CALLBACK3(request, &w.resp, o, cbtype);
370
+ }
371
+
372
+ static int
373
+ sdlookup_next(const packet_info *response, lcb_SDENTRY *ent, size_t *iter)
374
+ {
375
+ const char *buf;
376
+ lcb_U16 rc;
377
+ lcb_U32 vlen;
378
+
379
+ if (*iter == PACKET_NVALUE(response)) {
380
+ return 0;
381
+ }
382
+
383
+ buf = PACKET_VALUE(response);
384
+ buf += *iter;
385
+
386
+ memcpy(&rc, buf, 2);
387
+ memcpy(&vlen, buf + 2, 4);
388
+
389
+ rc = ntohs(rc);
390
+ vlen = ntohl(vlen);
391
+
392
+ ent->status = map_error(NULL, rc);
393
+ ent->nvalue = vlen;
394
+
395
+ if (ent->status == LCB_SUCCESS) {
396
+ ent->value = buf + 6;
397
+ } else {
398
+ ent->value = NULL;
399
+ ent->nvalue = 0;
400
+ }
401
+
402
+ *iter += (6 + vlen);
403
+ return 1;
404
+ }
405
+
406
+ static int
407
+ sdmutate_next(const packet_info *response, lcb_SDENTRY *ent, size_t *iter)
408
+ {
409
+ const char *buf, *buf_end;
410
+ lcb_U16 rc;
411
+ lcb_U32 vlen;
412
+
413
+ if (*iter == PACKET_NVALUE(response)) {
414
+ return 0;
415
+ }
416
+
417
+ buf_end = (const char *)PACKET_VALUE(response) + PACKET_NVALUE(response);
418
+ buf = ((const char *)(PACKET_VALUE(response))) + *iter;
419
+
420
+ #define ADVANCE_BUF(sz) \
421
+ buf += sz; \
422
+ *iter += sz; \
423
+ assert(buf <= buf_end); \
424
+
425
+ /* Index */
426
+ ent->index = *(lcb_U8*)buf;
427
+ ADVANCE_BUF(1);
428
+
429
+ /* Status */
430
+ memcpy(&rc, buf, 2);
431
+ ADVANCE_BUF(2);
432
+
433
+ rc = ntohs(rc);
434
+ ent->status = map_error(NULL, rc);
435
+
436
+ if (rc == PROTOCOL_BINARY_RESPONSE_SUCCESS) {
437
+ memcpy(&vlen, buf, 4);
438
+ ADVANCE_BUF(4);
439
+
440
+ vlen = ntohl(vlen);
441
+ ent->nvalue = vlen;
442
+ ent->value = buf;
443
+ ADVANCE_BUF(vlen);
444
+
445
+ } else {
446
+ ent->value = NULL;
447
+ ent->nvalue = 0;
448
+ }
449
+
450
+ return 1;
451
+ #undef ADVANCE_BUF
452
+ }
453
+
454
+ LIBCOUCHBASE_API
455
+ int
456
+ lcb_sdresult_next(const lcb_RESPSUBDOC *resp, lcb_SDENTRY *ent, size_t *iter)
457
+ {
458
+ size_t iter_s = 0;
459
+ const packet_info *response = (const packet_info*)resp->responses;
460
+ if (!response) {
461
+ return 0;
462
+ }
463
+ if (!iter) {
464
+ /* Single response */
465
+ iter = &iter_s;
466
+ }
467
+
468
+ switch (PACKET_OPCODE(response)) {
469
+ case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_LOOKUP:
470
+ return sdlookup_next(response, ent, iter);
471
+ case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_MUTATION:
472
+ return sdmutate_next(response, ent, iter);
473
+ default:
474
+ if (*iter) {
475
+ return 0;
476
+ }
477
+ *iter = 1;
478
+
479
+ if (resp->rc == LCB_SUCCESS || resp->rc == LCB_SUBDOC_MULTI_FAILURE) {
480
+ ent->status = map_error(NULL, PACKET_STATUS(response));
481
+ ent->value = PACKET_VALUE(response);
482
+ ent->nvalue = PACKET_NVALUE(response);
483
+ ent->index = 0;
484
+ return 1;
485
+ } else {
486
+ return 0;
487
+ }
488
+ }
489
+ }
490
+
491
+ static void
492
+ H_delete(mc_PIPELINE *pipeline, mc_PACKET *packet, packet_info *response,
493
+ lcb_error_t immerr)
494
+ {
495
+ lcb_t root = pipeline->parent->cqdata;
496
+ respack_REMOVE w = { { 0 } };
497
+ w.resp.rflags |= LCB_RESP_F_EXTDATA | LCB_RESP_F_FINAL;
498
+ init_resp3(root, response, packet, immerr, (lcb_RESPBASE *)&w.resp);
499
+ handle_mutation_token(root, response, packet, &w.mt);
500
+ TRACE_REMOVE_END(response, &w.resp);
501
+ INVOKE_CALLBACK3(packet, &w.resp, root, LCB_CALLBACK_REMOVE);
502
+ }
503
+
504
+ static void
505
+ H_observe(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
506
+ lcb_error_t immerr)
507
+ {
508
+ lcb_t root = pipeline->parent->cqdata;
509
+ uint32_t ttp;
510
+ uint32_t ttr;
511
+ lcb_size_t pos;
512
+ lcbvb_CONFIG* config;
513
+ const char *end, *ptr;
514
+ mc_REQDATAEX *rd = request->u_rdata.exdata;
515
+ lcb_RESPOBSERVE resp = { 0 };
516
+ MK_ERROR(root, &resp, response, immerr);
517
+
518
+ if (resp.rc != LCB_SUCCESS) {
519
+ if (! (request->flags & MCREQ_F_INVOKED)) {
520
+ rd->procs->handler(pipeline, request, resp.rc, NULL);
521
+ }
522
+ return;
523
+ }
524
+
525
+ /** The CAS field is split into TTP/TTR values */
526
+ ptr = (char *)&response->res.response.cas;
527
+ memcpy(&ttp, ptr, sizeof(ttp));
528
+ memcpy(&ttr, ptr + sizeof(ttp), sizeof(ttp));
529
+
530
+ ttp = ntohl(ttp);
531
+ ttr = ntohl(ttr);
532
+
533
+ /** Actual payload sequence of (vb, nkey, key). Repeats multiple times */
534
+ ptr = response->payload;
535
+ end = (char *)ptr + PACKET_NBODY(response);
536
+ config = pipeline->parent->config;
537
+
538
+ for (pos = 0; ptr < end; pos++) {
539
+ lcb_cas_t cas;
540
+ lcb_uint8_t obs;
541
+ lcb_uint16_t nkey, vb;
542
+ const char *key;
543
+
544
+ memcpy(&vb, ptr, sizeof(vb));
545
+ vb = ntohs(vb);
546
+ ptr += sizeof(vb);
547
+ memcpy(&nkey, ptr, sizeof(nkey));
548
+ nkey = ntohs(nkey);
549
+ ptr += sizeof(nkey);
550
+ key = (const char *)ptr;
551
+ ptr += nkey;
552
+ obs = *((lcb_uint8_t *)ptr);
553
+ ptr += sizeof(obs);
554
+ memcpy(&cas, ptr, sizeof(cas));
555
+ ptr += sizeof(cas);
556
+
557
+ resp.key = key;
558
+ resp.nkey = nkey;
559
+ resp.cas = lcb_ntohll(cas);
560
+ resp.status = obs;
561
+ resp.ismaster = pipeline->index == lcbvb_vbmaster(config, vb);
562
+ resp.ttp = 0;
563
+ resp.ttr = 0;
564
+ TRACE_OBSERVE_PROGRESS(response, &resp);
565
+ if (! (request->flags & MCREQ_F_INVOKED)) {
566
+ rd->procs->handler(pipeline, request, resp.rc, &resp);
567
+ }
568
+ }
569
+ TRACE_OBSERVE_END(response);
570
+ }
571
+
572
+ static void
573
+ H_observe_seqno(mc_PIPELINE *pipeline, mc_PACKET *request,
574
+ packet_info *response, lcb_error_t immerr)
575
+ {
576
+ lcb_t root = pipeline->parent->cqdata;
577
+ lcb_RESPOBSEQNO resp = { 0 };
578
+ init_resp3(root, response, request, immerr, (lcb_RESPBASE*)&resp);
579
+
580
+ resp.server_index = pipeline->index;
581
+
582
+ if (resp.rc == LCB_SUCCESS) {
583
+ const lcb_U8 *data = PACKET_BODY(response);
584
+ int is_failover = *data != 0;
585
+
586
+ data++;
587
+ #define COPY_ADV(dstfld, n, conv_fn) \
588
+ memcpy(&resp.dstfld, data, n); \
589
+ data += n; \
590
+ resp.dstfld = conv_fn(resp.dstfld);
591
+
592
+ COPY_ADV(vbid, 2, ntohs);
593
+ COPY_ADV(cur_uuid, 8, lcb_ntohll);
594
+ COPY_ADV(persisted_seqno, 8, lcb_ntohll);
595
+ COPY_ADV(mem_seqno, 8, lcb_ntohll);
596
+ if (is_failover) {
597
+ COPY_ADV(old_uuid, 8, lcb_ntohll);
598
+ COPY_ADV(old_seqno, 8, lcb_ntohll);
599
+ }
600
+ #undef COPY_ADV
601
+
602
+ /* Get the server for this command. Note that since this is a successful
603
+ * operation, the server is never a dummy */
604
+ }
605
+ INVOKE_CALLBACK3(request, &resp, root, LCB_CALLBACK_OBSEQNO);
606
+ }
607
+
608
+ static void
609
+ H_store(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
610
+ lcb_error_t immerr)
611
+ {
612
+ lcb_t root = pipeline->parent->cqdata;
613
+ respack_STORE w = { { 0 } };
614
+ lcb_U8 opcode;
615
+ init_resp3(root, response, request, immerr, (lcb_RESPBASE*)&w.resp);
616
+ if (!immerr) {
617
+ opcode = PACKET_OPCODE(response);
618
+ } else {
619
+ protocol_binary_request_header hdr;
620
+ mcreq_read_hdr(request, &hdr);
621
+ opcode = hdr.request.opcode;
622
+ }
623
+ if (opcode == PROTOCOL_BINARY_CMD_ADD) {
624
+ w.resp.op = LCB_ADD;
625
+ } else if (opcode == PROTOCOL_BINARY_CMD_REPLACE) {
626
+ w.resp.op = LCB_REPLACE;
627
+ } else if (opcode == PROTOCOL_BINARY_CMD_APPEND) {
628
+ w.resp.op = LCB_APPEND;
629
+ } else if (opcode == PROTOCOL_BINARY_CMD_PREPEND) {
630
+ w.resp.op = LCB_PREPEND;
631
+ } else if (opcode == PROTOCOL_BINARY_CMD_SET) {
632
+ w.resp.op = LCB_SET;
633
+ }
634
+ w.resp.rflags |= LCB_RESP_F_EXTDATA | LCB_RESP_F_FINAL;
635
+ handle_mutation_token(root, response, request, &w.mt);
636
+ TRACE_STORE_END(response, &w.resp);
637
+ if (request->flags & MCREQ_F_REQEXT) {
638
+ request->u_rdata.exdata->procs->handler(pipeline, request, immerr, &w.resp);
639
+ } else {
640
+ INVOKE_CALLBACK3(request, &w.resp, root, LCB_CALLBACK_STORE);
641
+ }
642
+ }
643
+
644
+ static void
645
+ H_arithmetic(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
646
+ lcb_error_t immerr)
647
+ {
648
+ lcb_t root = pipeline->parent->cqdata;
649
+ respack_COUNTER w = { { 0 } };
650
+ init_resp3(root, response, request, immerr, (lcb_RESPBASE*)&w.resp);
651
+
652
+ if (w.resp.rc == LCB_SUCCESS) {
653
+ memcpy(&w.resp.value, PACKET_VALUE(response), sizeof(w.resp.value));
654
+ w.resp.value = lcb_ntohll(w.resp.value);
655
+ w.resp.rflags |= LCB_RESP_F_EXTDATA;
656
+ handle_mutation_token(root, response, request, &w.mt);
657
+ }
658
+ w.resp.rflags |= LCB_RESP_F_FINAL;
659
+ w.resp.cas = PACKET_CAS(response);
660
+ TRACE_ARITHMETIC_END(response, &w.resp);
661
+ INVOKE_CALLBACK3(request, &w.resp, root, LCB_CALLBACK_COUNTER);
662
+ }
663
+
664
+ static void
665
+ H_stats(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
666
+ lcb_error_t immerr)
667
+ {
668
+ lcb_t root = pipeline->parent->cqdata;
669
+ lcb_RESPSTATS resp = { 0 };
670
+ mc_REQDATAEX *exdata;
671
+
672
+ MK_ERROR(root, &resp, response, immerr);
673
+ resp.version = 0;
674
+
675
+ exdata = request->u_rdata.exdata;
676
+ if (resp.rc != LCB_SUCCESS || PACKET_NKEY(response) == 0) {
677
+ /* Call the handler without a response, this indicates that this server
678
+ * has finished responding */
679
+ exdata->procs->handler(pipeline, request, resp.rc, NULL);
680
+ return;
681
+ }
682
+
683
+ if ((resp.nkey = PACKET_NKEY(response))) {
684
+ resp.key = PACKET_KEY(response);
685
+ if ((resp.value = PACKET_VALUE(response))) {
686
+ resp.nvalue = PACKET_NVALUE(response);
687
+ }
688
+ }
689
+
690
+ exdata->procs->handler(pipeline, request, resp.rc, &resp);
691
+ }
692
+
693
+ static void
694
+ H_verbosity(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
695
+ lcb_error_t immerr)
696
+ {
697
+ lcb_t root = pipeline->parent->cqdata;
698
+ lcb_RESPBASE dummy = { 0 };
699
+ mc_REQDATAEX *exdata = request->u_rdata.exdata;
700
+ MK_ERROR(root, &dummy, response, immerr);
701
+
702
+ exdata->procs->handler(pipeline, request, dummy.rc, NULL);
703
+ }
704
+
705
+ static void
706
+ H_version(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
707
+ lcb_error_t immerr)
708
+ {
709
+ lcb_t root = pipeline->parent->cqdata;
710
+ lcb_RESPMCVERSION resp = { 0 };
711
+ mc_REQDATAEX *exdata = request->u_rdata.exdata;
712
+
713
+ MK_ERROR(root, &resp, response, immerr);
714
+
715
+ if (PACKET_NBODY(response)) {
716
+ resp.mcversion = response->payload;
717
+ resp.nversion = PACKET_NBODY(response);
718
+ }
719
+
720
+
721
+ exdata->procs->handler(pipeline, request, resp.rc, &resp);
722
+ }
723
+
724
+ static void
725
+ H_touch(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
726
+ lcb_error_t immerr)
727
+ {
728
+ lcb_t root = pipeline->parent->cqdata;
729
+ lcb_RESPTOUCH resp = { 0 };
730
+ init_resp3(root, response, request, immerr, &resp);
731
+ resp.rflags |= LCB_RESP_F_FINAL;
732
+ TRACE_TOUCH_END(response, &resp);
733
+ INVOKE_CALLBACK3(request, &resp, root, LCB_CALLBACK_TOUCH);
734
+ }
735
+
736
+ static void
737
+ H_flush(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
738
+ lcb_error_t immerr)
739
+ {
740
+ lcb_t root = pipeline->parent->cqdata;
741
+ lcb_RESPFLUSH resp = { 0 };
742
+ mc_REQDATAEX *exdata = request->u_rdata.exdata;
743
+ MK_ERROR(root, &resp, response, immerr);
744
+ exdata->procs->handler(pipeline, request, resp.rc, &resp);
745
+ }
746
+
747
+ static void
748
+ H_unlock(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
749
+ lcb_error_t immerr)
750
+ {
751
+ lcb_t root = pipeline->parent->cqdata;
752
+ lcb_RESPUNLOCK resp = { 0 };
753
+ init_resp3(root, response, request, immerr, &resp);
754
+ resp.rflags |= LCB_RESP_F_FINAL;
755
+ TRACE_UNLOCK_END(response, &resp);
756
+ INVOKE_CALLBACK3(request, &resp, root, LCB_CALLBACK_UNLOCK);
757
+ }
758
+
759
+ static void
760
+ H_config(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
761
+ lcb_error_t immerr)
762
+ {
763
+ /** We just jump to the normal config handler */
764
+ lcb_RESPBASE dummy;
765
+ mc_REQDATAEX *exdata = request->u_rdata.exdata;
766
+ MK_ERROR(pipeline->parent->cqdata, &dummy, response, immerr);
767
+
768
+ exdata->procs->handler(pipeline, request, dummy.rc, response);
769
+ }
770
+
771
+ static void
772
+ record_metrics(mc_PIPELINE *pipeline, mc_PACKET *req, packet_info *res)
773
+ {
774
+ lcb_t instance = pipeline->parent->cqdata;
775
+ if (instance->kv_timings) {
776
+ lcb_histogram_record(instance->kv_timings,
777
+ gethrtime() - MCREQ_PKT_RDATA(req)->start);
778
+ }
779
+ (void)res;
780
+ }
781
+
782
+ static void
783
+ dispatch_ufwd_error(mc_PIPELINE *pipeline, mc_PACKET *req, lcb_error_t immerr)
784
+ {
785
+ lcb_PKTFWDRESP resp = { 0 };
786
+ lcb_t instance = ((mc_SERVER*)pipeline)->instance;
787
+ assert(immerr != LCB_SUCCESS);
788
+ resp.version = 0;
789
+ instance->callbacks.pktfwd(instance, MCREQ_PKT_COOKIE(req), immerr, &resp);
790
+ }
791
+
792
+ int
793
+ mcreq_dispatch_response(
794
+ mc_PIPELINE *pipeline, mc_PACKET *req, packet_info *res,
795
+ lcb_error_t immerr)
796
+ {
797
+ record_metrics(pipeline, req, res);
798
+
799
+ if (req->flags & MCREQ_F_UFWD) {
800
+ dispatch_ufwd_error(pipeline, req, immerr);
801
+ return 0;
802
+ }
803
+
804
+
805
+ #define INVOKE_OP(handler) \
806
+ handler(pipeline, req, res, immerr); \
807
+ return 0; \
808
+ break;
809
+
810
+ switch (PACKET_OPCODE(res)) {
811
+ case PROTOCOL_BINARY_CMD_GETQ:
812
+ case PROTOCOL_BINARY_CMD_GATQ:
813
+ case PROTOCOL_BINARY_CMD_GET:
814
+ case PROTOCOL_BINARY_CMD_GAT:
815
+ case PROTOCOL_BINARY_CMD_GET_LOCKED:
816
+ INVOKE_OP(H_get);
817
+
818
+ case PROTOCOL_BINARY_CMD_ADD:
819
+ case PROTOCOL_BINARY_CMD_REPLACE:
820
+ case PROTOCOL_BINARY_CMD_SET:
821
+ case PROTOCOL_BINARY_CMD_APPEND:
822
+ case PROTOCOL_BINARY_CMD_PREPEND:
823
+ INVOKE_OP(H_store);
824
+
825
+ case PROTOCOL_BINARY_CMD_INCREMENT:
826
+ case PROTOCOL_BINARY_CMD_DECREMENT:
827
+ INVOKE_OP(H_arithmetic);
828
+
829
+ case PROTOCOL_BINARY_CMD_SUBDOC_GET:
830
+ case PROTOCOL_BINARY_CMD_SUBDOC_EXISTS:
831
+ case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_ADD_UNIQUE:
832
+ case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_PUSH_FIRST:
833
+ case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_PUSH_LAST:
834
+ case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_INSERT:
835
+ case PROTOCOL_BINARY_CMD_SUBDOC_DICT_ADD:
836
+ case PROTOCOL_BINARY_CMD_SUBDOC_DICT_UPSERT:
837
+ case PROTOCOL_BINARY_CMD_SUBDOC_REPLACE:
838
+ case PROTOCOL_BINARY_CMD_SUBDOC_DELETE:
839
+ case PROTOCOL_BINARY_CMD_SUBDOC_COUNTER:
840
+ case PROTOCOL_BINARY_CMD_SUBDOC_GET_COUNT:
841
+ case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_LOOKUP:
842
+ case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_MUTATION:
843
+ INVOKE_OP(H_subdoc);
844
+
845
+ case PROTOCOL_BINARY_CMD_OBSERVE:
846
+ INVOKE_OP(H_observe);
847
+
848
+ case PROTOCOL_BINARY_CMD_GET_REPLICA:
849
+ INVOKE_OP(H_getreplica);
850
+
851
+ case PROTOCOL_BINARY_CMD_UNLOCK_KEY:
852
+ INVOKE_OP(H_unlock);
853
+
854
+ case PROTOCOL_BINARY_CMD_DELETE:
855
+ INVOKE_OP(H_delete);
856
+
857
+ case PROTOCOL_BINARY_CMD_TOUCH:
858
+ INVOKE_OP(H_touch);
859
+
860
+ case PROTOCOL_BINARY_CMD_OBSERVE_SEQNO:
861
+ INVOKE_OP(H_observe_seqno);
862
+
863
+ case PROTOCOL_BINARY_CMD_STAT:
864
+ INVOKE_OP(H_stats);
865
+
866
+ case PROTOCOL_BINARY_CMD_FLUSH:
867
+ INVOKE_OP(H_flush);
868
+
869
+ case PROTOCOL_BINARY_CMD_VERSION:
870
+ INVOKE_OP(H_version);
871
+
872
+ case PROTOCOL_BINARY_CMD_VERBOSITY:
873
+ INVOKE_OP(H_verbosity);
874
+
875
+ #if 0
876
+ case PROTOCOL_BINARY_CMD_NOOP:
877
+ INVOKE_OP(H_noop);
878
+ #endif
879
+
880
+ case PROTOCOL_BINARY_CMD_GET_CLUSTER_CONFIG:
881
+ INVOKE_OP(H_config);
882
+
883
+ default:
884
+ fprintf(stderr, "COUCHBASE: Received unknown opcode=0x%x\n", PACKET_OPCODE(res));
885
+ return -1;
886
+ }
887
+ }
888
+
889
+ const lcb_MUTATION_TOKEN *
890
+ lcb_resp_get_mutation_token(int cbtype, const lcb_RESPBASE *rb)
891
+ {
892
+ const lcb_MUTATION_TOKEN *ss = NULL;
893
+ if ((rb->rflags & LCB_RESP_F_EXTDATA) == 0) {
894
+ return NULL;
895
+ }
896
+
897
+ switch (cbtype) {
898
+ case LCB_CALLBACK_STORE:
899
+ ss = &((const respack_STORE*)rb)->mt;
900
+ break;
901
+
902
+ case LCB_CALLBACK_COUNTER:
903
+ ss = &((const respack_COUNTER*)rb)->mt;
904
+ break;
905
+
906
+ case LCB_CALLBACK_REMOVE:
907
+ ss = &((const respack_REMOVE*)rb)->mt;
908
+ break;
909
+
910
+ case LCB_CALLBACK_SDMUTATE:
911
+ ss = &((const respack_SUBDOC*)rb)->mt;
912
+ break;
913
+
914
+ default:
915
+ return NULL;
916
+ }
917
+
918
+ if (ss->uuid_ == 0 && ss->seqno_ == 0) {
919
+ return NULL;
920
+ }
921
+ return ss;
922
+ }