libcouchbase 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +35 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +24 -0
  8. data/README.md +389 -0
  9. data/Rakefile +75 -0
  10. data/ext/README.md +6 -0
  11. data/ext/Rakefile +20 -0
  12. data/ext/libcouchbase/.gitignore +130 -0
  13. data/ext/libcouchbase/.travis.yml +19 -0
  14. data/ext/libcouchbase/CMakeLists.txt +429 -0
  15. data/ext/libcouchbase/CONTRIBUTING.md +124 -0
  16. data/ext/libcouchbase/LICENSE +202 -0
  17. data/ext/libcouchbase/README.markdown +163 -0
  18. data/ext/libcouchbase/RELEASE_NOTES.markdown +2691 -0
  19. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +27 -0
  20. data/ext/libcouchbase/cmake/Modules/CopyPDB.cmake +42 -0
  21. data/ext/libcouchbase/cmake/Modules/DistScript.cmake +17 -0
  22. data/ext/libcouchbase/cmake/Modules/DownloadLcbDep.cmake +20 -0
  23. data/ext/libcouchbase/cmake/Modules/FindCouchbaseHdrHistogram.cmake +15 -0
  24. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibev.cmake +73 -0
  25. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +52 -0
  26. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +56 -0
  27. data/ext/libcouchbase/cmake/Modules/FindCouchbaseSnappy.cmake +11 -0
  28. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +29 -0
  29. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +133 -0
  30. data/ext/libcouchbase/cmake/Modules/GetPlatformCCInfo.cmake +45 -0
  31. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +70 -0
  32. data/ext/libcouchbase/cmake/config-cmake.h.in +60 -0
  33. data/ext/libcouchbase/cmake/configure +357 -0
  34. data/ext/libcouchbase/cmake/defs.mk.in +8 -0
  35. data/ext/libcouchbase/cmake/dtrace-instr-link.pl +38 -0
  36. data/ext/libcouchbase/cmake/source_files.cmake +73 -0
  37. data/ext/libcouchbase/configure.pl +1 -0
  38. data/ext/libcouchbase/contrib/cJSON/cJSON.c +624 -0
  39. data/ext/libcouchbase/contrib/cJSON/cJSON.h +158 -0
  40. data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +9 -0
  41. data/ext/libcouchbase/contrib/cbsasl/COPYING +202 -0
  42. data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +217 -0
  43. data/ext/libcouchbase/contrib/cbsasl/src/client.c +205 -0
  44. data/ext/libcouchbase/contrib/cbsasl/src/common.c +46 -0
  45. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.c +67 -0
  46. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.h +33 -0
  47. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.c +296 -0
  48. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.h +45 -0
  49. data/ext/libcouchbase/contrib/cbsasl/src/hash.c +573 -0
  50. data/ext/libcouchbase/contrib/cbsasl/src/hash.h +15 -0
  51. data/ext/libcouchbase/contrib/cbsasl/src/util.h +31 -0
  52. data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +2 -0
  53. data/ext/libcouchbase/contrib/cliopts/cliopts.c +747 -0
  54. data/ext/libcouchbase/contrib/cliopts/cliopts.h +493 -0
  55. data/ext/libcouchbase/contrib/genhash/genhash.c +372 -0
  56. data/ext/libcouchbase/contrib/genhash/genhash.h +235 -0
  57. data/ext/libcouchbase/contrib/gtest-1.7.0/CHANGES +157 -0
  58. data/ext/libcouchbase/contrib/gtest-1.7.0/CMakeLists.txt +252 -0
  59. data/ext/libcouchbase/contrib/gtest-1.7.0/CONTRIBUTORS +37 -0
  60. data/ext/libcouchbase/contrib/gtest-1.7.0/LICENSE +28 -0
  61. data/ext/libcouchbase/contrib/gtest-1.7.0/MINIFY.sh +15 -0
  62. data/ext/libcouchbase/contrib/gtest-1.7.0/README +435 -0
  63. data/ext/libcouchbase/contrib/gtest-1.7.0/cmake/internal_utils.cmake +227 -0
  64. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h +294 -0
  65. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-message.h +250 -0
  66. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h +1421 -0
  67. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump +487 -0
  68. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-printers.h +855 -0
  69. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-spi.h +232 -0
  70. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h +179 -0
  71. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h +259 -0
  72. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest.h +2291 -0
  73. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h +358 -0
  74. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_prod.h +58 -0
  75. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h +319 -0
  76. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h +206 -0
  77. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h +1158 -0
  78. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
  79. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h +5143 -0
  80. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
  81. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h +619 -0
  82. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h +1947 -0
  83. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h +167 -0
  84. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h +1012 -0
  85. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump +339 -0
  86. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h +3331 -0
  87. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump +297 -0
  88. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-all.cc +48 -0
  89. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-death-test.cc +1344 -0
  90. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-filepath.cc +382 -0
  91. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-internal-inl.h +1218 -0
  92. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-port.cc +805 -0
  93. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-printers.cc +363 -0
  94. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-test-part.cc +110 -0
  95. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-typed-test.cc +110 -0
  96. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest.cc +5015 -0
  97. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest_main.cc +38 -0
  98. data/ext/libcouchbase/contrib/http_parser/LICENSE-MIT +23 -0
  99. data/ext/libcouchbase/contrib/http_parser/README.md +178 -0
  100. data/ext/libcouchbase/contrib/http_parser/http_parser.c +2060 -0
  101. data/ext/libcouchbase/contrib/http_parser/http_parser.h +321 -0
  102. data/ext/libcouchbase/contrib/jsonsl/LICENSE +20 -0
  103. data/ext/libcouchbase/contrib/jsonsl/jsonsl.c +1452 -0
  104. data/ext/libcouchbase/contrib/jsonsl/jsonsl.h +971 -0
  105. data/ext/libcouchbase/contrib/lcb-jsoncpp/CMakeLists.txt +6 -0
  106. data/ext/libcouchbase/contrib/lcb-jsoncpp/LICENSE +55 -0
  107. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp-forwards.h +255 -0
  108. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +4892 -0
  109. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.h +1961 -0
  110. data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +8 -0
  111. data/ext/libcouchbase/contrib/snappy/COPYING +28 -0
  112. data/ext/libcouchbase/contrib/snappy/snappy-c.cc +90 -0
  113. data/ext/libcouchbase/contrib/snappy/snappy-c.h +138 -0
  114. data/ext/libcouchbase/contrib/snappy/snappy-internal.h +150 -0
  115. data/ext/libcouchbase/contrib/snappy/snappy-lcb-msvc.h +5 -0
  116. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +71 -0
  117. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.h +137 -0
  118. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.cc +42 -0
  119. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.h +491 -0
  120. data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +98 -0
  121. data/ext/libcouchbase/contrib/snappy/snappy.cc +1307 -0
  122. data/ext/libcouchbase/contrib/snappy/snappy.h +184 -0
  123. data/ext/libcouchbase/contrib/win32-defs/iocpdefs.h +133 -0
  124. data/ext/libcouchbase/contrib/win32-defs/mingwdefs.h +4396 -0
  125. data/ext/libcouchbase/contrib/win32-defs/win_stdint.h +258 -0
  126. data/ext/libcouchbase/example/CMakeLists.txt +37 -0
  127. data/ext/libcouchbase/example/README.markdown +47 -0
  128. data/ext/libcouchbase/example/db/db.c +167 -0
  129. data/ext/libcouchbase/example/db/vb.c +227 -0
  130. data/ext/libcouchbase/example/instancepool/main.cc +102 -0
  131. data/ext/libcouchbase/example/instancepool/pool.cc +102 -0
  132. data/ext/libcouchbase/example/instancepool/pool.h +69 -0
  133. data/ext/libcouchbase/example/libeventdirect/main.c +148 -0
  134. data/ext/libcouchbase/example/mcc/mcc.cc +246 -0
  135. data/ext/libcouchbase/example/minimal/minimal.c +130 -0
  136. data/ext/libcouchbase/example/observe/observe.c +146 -0
  137. data/ext/libcouchbase/example/subdoc/subdoc-multi.cc +132 -0
  138. data/ext/libcouchbase/example/subdoc/subdoc-simple.cc +191 -0
  139. data/ext/libcouchbase/example/tick/tick.c +119 -0
  140. data/ext/libcouchbase/example/views/views-example.cc +83 -0
  141. data/ext/libcouchbase/include/libcouchbase/_cxxwrap.h +150 -0
  142. data/ext/libcouchbase/include/libcouchbase/api-legacy.h +1689 -0
  143. data/ext/libcouchbase/include/libcouchbase/api3.h +2 -0
  144. data/ext/libcouchbase/include/libcouchbase/assert.h +44 -0
  145. data/ext/libcouchbase/include/libcouchbase/cbft.h +109 -0
  146. data/ext/libcouchbase/include/libcouchbase/cntl-private.h +356 -0
  147. data/ext/libcouchbase/include/libcouchbase/cntl.h +937 -0
  148. data/ext/libcouchbase/include/libcouchbase/configuration.h.in +23 -0
  149. data/ext/libcouchbase/include/libcouchbase/couchbase.h +3677 -0
  150. data/ext/libcouchbase/include/libcouchbase/deprecated.h +300 -0
  151. data/ext/libcouchbase/include/libcouchbase/error.h +595 -0
  152. data/ext/libcouchbase/include/libcouchbase/http.h +1 -0
  153. data/ext/libcouchbase/include/libcouchbase/iops.h +1050 -0
  154. data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +263 -0
  155. data/ext/libcouchbase/include/libcouchbase/kvbuf.h +132 -0
  156. data/ext/libcouchbase/include/libcouchbase/n1ql.h +364 -0
  157. data/ext/libcouchbase/include/libcouchbase/pktfwd.h +270 -0
  158. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +367 -0
  159. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr-inl.c +76 -0
  160. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr.h +199 -0
  161. data/ext/libcouchbase/include/libcouchbase/subdoc.h +312 -0
  162. data/ext/libcouchbase/include/libcouchbase/sysdefs.h +98 -0
  163. data/ext/libcouchbase/include/libcouchbase/vbucket.h +643 -0
  164. data/ext/libcouchbase/include/libcouchbase/views.h +298 -0
  165. data/ext/libcouchbase/include/libcouchbase/visibility.h +65 -0
  166. data/ext/libcouchbase/include/memcached/COPYING +30 -0
  167. data/ext/libcouchbase/include/memcached/README +10 -0
  168. data/ext/libcouchbase/include/memcached/protocol_binary.h +1916 -0
  169. data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
  170. data/ext/libcouchbase/packaging/README +7 -0
  171. data/ext/libcouchbase/packaging/abicheck/.gitignore +4 -0
  172. data/ext/libcouchbase/packaging/abicheck/Makefile +17 -0
  173. data/ext/libcouchbase/packaging/abicheck/README.md +27 -0
  174. data/ext/libcouchbase/packaging/abicheck/template.xml +3 -0
  175. data/ext/libcouchbase/packaging/deb/compat +1 -0
  176. data/ext/libcouchbase/packaging/deb/control +73 -0
  177. data/ext/libcouchbase/packaging/deb/copyright +10 -0
  178. data/ext/libcouchbase/packaging/deb/libcouchbase-dev.docs +3 -0
  179. data/ext/libcouchbase/packaging/deb/package.mk +31 -0
  180. data/ext/libcouchbase/packaging/deb/rules +46 -0
  181. data/ext/libcouchbase/packaging/deb/source/format +1 -0
  182. data/ext/libcouchbase/packaging/distinfo/README +1 -0
  183. data/ext/libcouchbase/packaging/distinfo/distinfo.cmake.in +4 -0
  184. data/ext/libcouchbase/packaging/dllversion.rc.in +39 -0
  185. data/ext/libcouchbase/packaging/libcouchbase.pc.in +10 -0
  186. data/ext/libcouchbase/packaging/nuget/libcouchbase.autopkg +76 -0
  187. data/ext/libcouchbase/packaging/parse-git-describe.pl +166 -0
  188. data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +108 -0
  189. data/ext/libcouchbase/packaging/rpm/package.mk +40 -0
  190. data/ext/libcouchbase/plugins/io/iocp/CMakeLists.txt +9 -0
  191. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.c +466 -0
  192. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.h +217 -0
  193. data/ext/libcouchbase/plugins/io/iocp/iocp_loop.c +295 -0
  194. data/ext/libcouchbase/plugins/io/iocp/iocp_timer.c +79 -0
  195. data/ext/libcouchbase/plugins/io/iocp/iocp_util.c +229 -0
  196. data/ext/libcouchbase/plugins/io/libev/CMakeLists.txt +29 -0
  197. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +65 -0
  198. data/ext/libcouchbase/plugins/io/libev/plugin-libev.c +289 -0
  199. data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +29 -0
  200. data/ext/libcouchbase/plugins/io/libevent/libevent_io_opts.h +67 -0
  201. data/ext/libcouchbase/plugins/io/libevent/plugin-libevent.c +292 -0
  202. data/ext/libcouchbase/plugins/io/libuv/CMakeLists.txt +42 -0
  203. data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +212 -0
  204. data/ext/libcouchbase/plugins/io/libuv/libuv_io_opts.h +118 -0
  205. data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +148 -0
  206. data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +648 -0
  207. data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +11 -0
  208. data/ext/libcouchbase/plugins/io/select/plugin-select.c +448 -0
  209. data/ext/libcouchbase/plugins/io/select/select_io_opts.h +39 -0
  210. data/ext/libcouchbase/src/README.md +103 -0
  211. data/ext/libcouchbase/src/aspend.h +106 -0
  212. data/ext/libcouchbase/src/auth.cc +74 -0
  213. data/ext/libcouchbase/src/auth.h +54 -0
  214. data/ext/libcouchbase/src/bootstrap.c +269 -0
  215. data/ext/libcouchbase/src/bootstrap.h +129 -0
  216. data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +495 -0
  217. data/ext/libcouchbase/src/bucketconfig/bc_file.c +347 -0
  218. data/ext/libcouchbase/src/bucketconfig/bc_http.c +630 -0
  219. data/ext/libcouchbase/src/bucketconfig/bc_http.h +82 -0
  220. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
  221. data/ext/libcouchbase/src/bucketconfig/clconfig.h +681 -0
  222. data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
  223. data/ext/libcouchbase/src/callbacks.c +378 -0
  224. data/ext/libcouchbase/src/cbft.cc +210 -0
  225. data/ext/libcouchbase/src/cntl.cc +847 -0
  226. data/ext/libcouchbase/src/config_static.h +159 -0
  227. data/ext/libcouchbase/src/connspec.cc +462 -0
  228. data/ext/libcouchbase/src/connspec.h +105 -0
  229. data/ext/libcouchbase/src/ctx-log-inl.h +27 -0
  230. data/ext/libcouchbase/src/dump.c +98 -0
  231. data/ext/libcouchbase/src/getconfig.c +100 -0
  232. data/ext/libcouchbase/src/gethrtime.c +109 -0
  233. data/ext/libcouchbase/src/handler.c +922 -0
  234. data/ext/libcouchbase/src/hashset.c +164 -0
  235. data/ext/libcouchbase/src/hashset.h +86 -0
  236. data/ext/libcouchbase/src/hashtable.c +75 -0
  237. data/ext/libcouchbase/src/hdr_timings.c +92 -0
  238. data/ext/libcouchbase/src/hostlist.cc +301 -0
  239. data/ext/libcouchbase/src/hostlist.h +171 -0
  240. data/ext/libcouchbase/src/http/http-priv.h +307 -0
  241. data/ext/libcouchbase/src/http/http.cc +633 -0
  242. data/ext/libcouchbase/src/http/http.h +34 -0
  243. data/ext/libcouchbase/src/http/http_io.cc +307 -0
  244. data/ext/libcouchbase/src/instance.cc +722 -0
  245. data/ext/libcouchbase/src/internal.h +244 -0
  246. data/ext/libcouchbase/src/iofactory.c +575 -0
  247. data/ext/libcouchbase/src/jsparse/parser.cc +519 -0
  248. data/ext/libcouchbase/src/jsparse/parser.h +173 -0
  249. data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
  250. data/ext/libcouchbase/src/lcbht/lcbht.h +199 -0
  251. data/ext/libcouchbase/src/lcbio/connect.c +557 -0
  252. data/ext/libcouchbase/src/lcbio/connect.h +364 -0
  253. data/ext/libcouchbase/src/lcbio/ctx.c +611 -0
  254. data/ext/libcouchbase/src/lcbio/ctx.h +405 -0
  255. data/ext/libcouchbase/src/lcbio/iotable.c +290 -0
  256. data/ext/libcouchbase/src/lcbio/iotable.h +84 -0
  257. data/ext/libcouchbase/src/lcbio/ioutils.c +350 -0
  258. data/ext/libcouchbase/src/lcbio/ioutils.h +203 -0
  259. data/ext/libcouchbase/src/lcbio/lcbio.h +51 -0
  260. data/ext/libcouchbase/src/lcbio/manager.c +584 -0
  261. data/ext/libcouchbase/src/lcbio/manager.h +156 -0
  262. data/ext/libcouchbase/src/lcbio/protoctx.c +84 -0
  263. data/ext/libcouchbase/src/lcbio/rw-inl.h +115 -0
  264. data/ext/libcouchbase/src/lcbio/ssl.h +149 -0
  265. data/ext/libcouchbase/src/lcbio/timer-ng.h +179 -0
  266. data/ext/libcouchbase/src/lcbio/timer.c +132 -0
  267. data/ext/libcouchbase/src/legacy.c +430 -0
  268. data/ext/libcouchbase/src/list.c +144 -0
  269. data/ext/libcouchbase/src/list.h +127 -0
  270. data/ext/libcouchbase/src/logging.c +244 -0
  271. data/ext/libcouchbase/src/logging.h +86 -0
  272. data/ext/libcouchbase/src/mc/compress.c +90 -0
  273. data/ext/libcouchbase/src/mc/compress.h +61 -0
  274. data/ext/libcouchbase/src/mc/forward.c +186 -0
  275. data/ext/libcouchbase/src/mc/forward.h +90 -0
  276. data/ext/libcouchbase/src/mc/iovcursor-inl.h +279 -0
  277. data/ext/libcouchbase/src/mc/iovcursor.h +66 -0
  278. data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +111 -0
  279. data/ext/libcouchbase/src/mc/mcreq.c +954 -0
  280. data/ext/libcouchbase/src/mc/mcreq.h +977 -0
  281. data/ext/libcouchbase/src/mcserver/mcserver.c +784 -0
  282. data/ext/libcouchbase/src/mcserver/mcserver.h +121 -0
  283. data/ext/libcouchbase/src/mcserver/negotiate.c +656 -0
  284. data/ext/libcouchbase/src/mcserver/negotiate.h +119 -0
  285. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +860 -0
  286. data/ext/libcouchbase/src/n1ql/n1ql-internal.h +22 -0
  287. data/ext/libcouchbase/src/n1ql/n1ql.cc +729 -0
  288. data/ext/libcouchbase/src/n1ql/params.cc +215 -0
  289. data/ext/libcouchbase/src/netbuf/netbuf-defs.h +89 -0
  290. data/ext/libcouchbase/src/netbuf/netbuf-mblock.h +235 -0
  291. data/ext/libcouchbase/src/netbuf/netbuf.c +929 -0
  292. data/ext/libcouchbase/src/netbuf/netbuf.h +452 -0
  293. data/ext/libcouchbase/src/newconfig.c +385 -0
  294. data/ext/libcouchbase/src/nodeinfo.cc +194 -0
  295. data/ext/libcouchbase/src/operations/cbflush.c +71 -0
  296. data/ext/libcouchbase/src/operations/counter.c +116 -0
  297. data/ext/libcouchbase/src/operations/durability-cas.c +224 -0
  298. data/ext/libcouchbase/src/operations/durability-seqno.c +157 -0
  299. data/ext/libcouchbase/src/operations/durability.c +668 -0
  300. data/ext/libcouchbase/src/operations/durability_internal.h +199 -0
  301. data/ext/libcouchbase/src/operations/get.c +409 -0
  302. data/ext/libcouchbase/src/operations/observe-seqno.c +96 -0
  303. data/ext/libcouchbase/src/operations/observe.c +340 -0
  304. data/ext/libcouchbase/src/operations/pktfwd.c +86 -0
  305. data/ext/libcouchbase/src/operations/remove.c +83 -0
  306. data/ext/libcouchbase/src/operations/stats.c +461 -0
  307. data/ext/libcouchbase/src/operations/store.c +360 -0
  308. data/ext/libcouchbase/src/operations/subdoc.cc +510 -0
  309. data/ext/libcouchbase/src/operations/touch.c +81 -0
  310. data/ext/libcouchbase/src/packetutils.c +60 -0
  311. data/ext/libcouchbase/src/packetutils.h +147 -0
  312. data/ext/libcouchbase/src/probes.d +211 -0
  313. data/ext/libcouchbase/src/rdb/bigalloc.c +225 -0
  314. data/ext/libcouchbase/src/rdb/bigalloc.h +73 -0
  315. data/ext/libcouchbase/src/rdb/chunkalloc.c +174 -0
  316. data/ext/libcouchbase/src/rdb/libcalloc.c +94 -0
  317. data/ext/libcouchbase/src/rdb/rope.c +419 -0
  318. data/ext/libcouchbase/src/rdb/rope.h +488 -0
  319. data/ext/libcouchbase/src/retrychk.c +113 -0
  320. data/ext/libcouchbase/src/retryq.c +424 -0
  321. data/ext/libcouchbase/src/retryq.h +157 -0
  322. data/ext/libcouchbase/src/ringbuffer.c +442 -0
  323. data/ext/libcouchbase/src/ringbuffer.h +100 -0
  324. data/ext/libcouchbase/src/settings.c +95 -0
  325. data/ext/libcouchbase/src/settings.h +188 -0
  326. data/ext/libcouchbase/src/simplestring.c +211 -0
  327. data/ext/libcouchbase/src/simplestring.h +228 -0
  328. data/ext/libcouchbase/src/sllist-inl.h +197 -0
  329. data/ext/libcouchbase/src/sllist.h +76 -0
  330. data/ext/libcouchbase/src/ssl/CMakeLists.txt +23 -0
  331. data/ext/libcouchbase/src/ssl/ssl_c.c +415 -0
  332. data/ext/libcouchbase/src/ssl/ssl_common.c +454 -0
  333. data/ext/libcouchbase/src/ssl/ssl_e.c +408 -0
  334. data/ext/libcouchbase/src/ssl/ssl_iot_common.h +180 -0
  335. data/ext/libcouchbase/src/ssobuf.h +82 -0
  336. data/ext/libcouchbase/src/strcodecs/base64.c +123 -0
  337. data/ext/libcouchbase/src/strcodecs/strcodecs.h +285 -0
  338. data/ext/libcouchbase/src/timings.c +208 -0
  339. data/ext/libcouchbase/src/trace.h +105 -0
  340. data/ext/libcouchbase/src/utilities.c +171 -0
  341. data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -0
  342. data/ext/libcouchbase/src/vbucket/aliases.h +35 -0
  343. data/ext/libcouchbase/src/vbucket/crc32.h +83 -0
  344. data/ext/libcouchbase/src/vbucket/hash.h +30 -0
  345. data/ext/libcouchbase/src/vbucket/json-inl.h +112 -0
  346. data/ext/libcouchbase/src/vbucket/ketama.c +66 -0
  347. data/ext/libcouchbase/src/vbucket/rfc1321/global.h +32 -0
  348. data/ext/libcouchbase/src/vbucket/rfc1321/md5.h +35 -0
  349. data/ext/libcouchbase/src/vbucket/rfc1321/md5c-inl.h +335 -0
  350. data/ext/libcouchbase/src/vbucket/vbucket.c +1543 -0
  351. data/ext/libcouchbase/src/views/docreq.c +194 -0
  352. data/ext/libcouchbase/src/views/docreq.h +83 -0
  353. data/ext/libcouchbase/src/views/viewreq.c +358 -0
  354. data/ext/libcouchbase/src/views/viewreq.h +36 -0
  355. data/ext/libcouchbase/src/wait.c +161 -0
  356. data/ext/libcouchbase/tests/CMakeLists.txt +140 -0
  357. data/ext/libcouchbase/tests/basic/t_base64.cc +81 -0
  358. data/ext/libcouchbase/tests/basic/t_ccbc103.cc +95 -0
  359. data/ext/libcouchbase/tests/basic/t_connstr.cc +404 -0
  360. data/ext/libcouchbase/tests/basic/t_creds.cc +32 -0
  361. data/ext/libcouchbase/tests/basic/t_ctlcodes.cc +92 -0
  362. data/ext/libcouchbase/tests/basic/t_hashset.cc +262 -0
  363. data/ext/libcouchbase/tests/basic/t_host.cc +198 -0
  364. data/ext/libcouchbase/tests/basic/t_jsparse.cc +137 -0
  365. data/ext/libcouchbase/tests/basic/t_jsparse.h +589 -0
  366. data/ext/libcouchbase/tests/basic/t_list.cc +155 -0
  367. data/ext/libcouchbase/tests/basic/t_logger.cc +65 -0
  368. data/ext/libcouchbase/tests/basic/t_misc.cc +24 -0
  369. data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +18 -0
  370. data/ext/libcouchbase/tests/basic/t_netbuf.cc +446 -0
  371. data/ext/libcouchbase/tests/basic/t_packet.cc +222 -0
  372. data/ext/libcouchbase/tests/basic/t_ringbuffer.cc +278 -0
  373. data/ext/libcouchbase/tests/basic/t_slist.cc +429 -0
  374. data/ext/libcouchbase/tests/basic/t_strerror.cc +64 -0
  375. data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
  376. data/ext/libcouchbase/tests/basic/t_urlencode.cc +132 -0
  377. data/ext/libcouchbase/tests/check-all.cc +608 -0
  378. data/ext/libcouchbase/tests/htparse/t_basic.cc +193 -0
  379. data/ext/libcouchbase/tests/ioserver/connection.cc +166 -0
  380. data/ext/libcouchbase/tests/ioserver/future.cc +50 -0
  381. data/ext/libcouchbase/tests/ioserver/ioserver.cc +104 -0
  382. data/ext/libcouchbase/tests/ioserver/ioserver.h +478 -0
  383. data/ext/libcouchbase/tests/ioserver/socket.cc +88 -0
  384. data/ext/libcouchbase/tests/ioserver/ssl_connection.cc +145 -0
  385. data/ext/libcouchbase/tests/ioserver/threads-pthreads.cc +119 -0
  386. data/ext/libcouchbase/tests/ioserver/threads-win32.cc +117 -0
  387. data/ext/libcouchbase/tests/ioserver/threads.h +66 -0
  388. data/ext/libcouchbase/tests/iotests/iotests.h +15 -0
  389. data/ext/libcouchbase/tests/iotests/mock-environment.cc +524 -0
  390. data/ext/libcouchbase/tests/iotests/mock-environment.h +385 -0
  391. data/ext/libcouchbase/tests/iotests/mock-unit-test.cc +67 -0
  392. data/ext/libcouchbase/tests/iotests/mock-unit-test.h +61 -0
  393. data/ext/libcouchbase/tests/iotests/serverparams.h +76 -0
  394. data/ext/libcouchbase/tests/iotests/t_arithmetic.cc +143 -0
  395. data/ext/libcouchbase/tests/iotests/t_behavior.cc +226 -0
  396. data/ext/libcouchbase/tests/iotests/t_configcache.cc +117 -0
  397. data/ext/libcouchbase/tests/iotests/t_confmon.cc +241 -0
  398. data/ext/libcouchbase/tests/iotests/t_durability.cc +1059 -0
  399. data/ext/libcouchbase/tests/iotests/t_forward.cc +110 -0
  400. data/ext/libcouchbase/tests/iotests/t_get.cc +512 -0
  401. data/ext/libcouchbase/tests/iotests/t_http.cc +438 -0
  402. data/ext/libcouchbase/tests/iotests/t_iops.cc +175 -0
  403. data/ext/libcouchbase/tests/iotests/t_lock.cc +275 -0
  404. data/ext/libcouchbase/tests/iotests/t_misc.cc +713 -0
  405. data/ext/libcouchbase/tests/iotests/t_mutate.cc +609 -0
  406. data/ext/libcouchbase/tests/iotests/t_n1ql.cc +270 -0
  407. data/ext/libcouchbase/tests/iotests/t_netfail.cc +654 -0
  408. data/ext/libcouchbase/tests/iotests/t_obseqno.cc +157 -0
  409. data/ext/libcouchbase/tests/iotests/t_regression.cc +321 -0
  410. data/ext/libcouchbase/tests/iotests/t_sched.cc +88 -0
  411. data/ext/libcouchbase/tests/iotests/t_serverops.cc +230 -0
  412. data/ext/libcouchbase/tests/iotests/t_smoke.cc +528 -0
  413. data/ext/libcouchbase/tests/iotests/t_subdoc.cc +822 -0
  414. data/ext/libcouchbase/tests/iotests/t_syncmode.cc +64 -0
  415. data/ext/libcouchbase/tests/iotests/t_views.cc +405 -0
  416. data/ext/libcouchbase/tests/iotests/testutil.cc +250 -0
  417. data/ext/libcouchbase/tests/iotests/testutil.h +163 -0
  418. data/ext/libcouchbase/tests/mc/mctest.h +119 -0
  419. data/ext/libcouchbase/tests/mc/pktmaker.h +101 -0
  420. data/ext/libcouchbase/tests/mc/t_alloc.cc +269 -0
  421. data/ext/libcouchbase/tests/mc/t_context.cc +100 -0
  422. data/ext/libcouchbase/tests/mc/t_flush.cc +185 -0
  423. data/ext/libcouchbase/tests/mc/t_forward.cc +239 -0
  424. data/ext/libcouchbase/tests/mc/t_ioflush.cc +102 -0
  425. data/ext/libcouchbase/tests/mc/t_iovcursor.cc +173 -0
  426. data/ext/libcouchbase/tests/mocksupport/procutil.c +305 -0
  427. data/ext/libcouchbase/tests/mocksupport/procutil.h +89 -0
  428. data/ext/libcouchbase/tests/mocksupport/server.c +391 -0
  429. data/ext/libcouchbase/tests/mocksupport/server.h +72 -0
  430. data/ext/libcouchbase/tests/mocksupport/timeout.c +69 -0
  431. data/ext/libcouchbase/tests/nonio_tests.cc +23 -0
  432. data/ext/libcouchbase/tests/rdb/rdbtest.h +133 -0
  433. data/ext/libcouchbase/tests/rdb/t_basic.cc +128 -0
  434. data/ext/libcouchbase/tests/rdb/t_bigalloc.cc +93 -0
  435. data/ext/libcouchbase/tests/rdb/t_refs.cc +112 -0
  436. data/ext/libcouchbase/tests/socktests/socktest.cc +347 -0
  437. data/ext/libcouchbase/tests/socktests/socktest.h +448 -0
  438. data/ext/libcouchbase/tests/socktests/t_basic.cc +143 -0
  439. data/ext/libcouchbase/tests/socktests/t_ctx.cc +73 -0
  440. data/ext/libcouchbase/tests/socktests/t_manager.cc +179 -0
  441. data/ext/libcouchbase/tests/socktests/t_putex.cc +256 -0
  442. data/ext/libcouchbase/tests/socktests/t_read.cc +187 -0
  443. data/ext/libcouchbase/tests/socktests/t_reentrant.cc +143 -0
  444. data/ext/libcouchbase/tests/socktests/t_ssl.cc +80 -0
  445. data/ext/libcouchbase/tests/socktests/t_write.cc +95 -0
  446. data/ext/libcouchbase/tests/start_mock.bat +15 -0
  447. data/ext/libcouchbase/tests/start_mock.sh +42 -0
  448. data/ext/libcouchbase/tests/unit_tests.cc +43 -0
  449. data/ext/libcouchbase/tests/vbucket/confdata/bad.json +101 -0
  450. data/ext/libcouchbase/tests/vbucket/confdata/full_25.json +363 -0
  451. data/ext/libcouchbase/tests/vbucket/confdata/memd_25.json +90 -0
  452. data/ext/libcouchbase/tests/vbucket/confdata/memd_30.json +1 -0
  453. data/ext/libcouchbase/tests/vbucket/confdata/memd_45.json +1 -0
  454. data/ext/libcouchbase/tests/vbucket/confdata/terse_25.json +291 -0
  455. data/ext/libcouchbase/tests/vbucket/confdata/terse_30.json +1 -0
  456. data/ext/libcouchbase/tests/vbucket/t_config.cc +341 -0
  457. data/ext/libcouchbase/tools/CMakeLists.txt +51 -0
  458. data/ext/libcouchbase/tools/cbc-handlers.h +462 -0
  459. data/ext/libcouchbase/tools/cbc-n1qlback.cc +439 -0
  460. data/ext/libcouchbase/tools/cbc-pillowfight.cc +822 -0
  461. data/ext/libcouchbase/tools/cbc.cc +1541 -0
  462. data/ext/libcouchbase/tools/common/histogram.cc +43 -0
  463. data/ext/libcouchbase/tools/common/histogram.h +23 -0
  464. data/ext/libcouchbase/tools/common/my_inttypes.h +22 -0
  465. data/ext/libcouchbase/tools/common/options.cc +420 -0
  466. data/ext/libcouchbase/tools/common/options.h +81 -0
  467. data/ext/libcouchbase/tools/docgen/docgen.h +469 -0
  468. data/ext/libcouchbase/tools/docgen/loc.h +210 -0
  469. data/ext/libcouchbase/tools/docgen/placeholders.h +211 -0
  470. data/ext/libcouchbase/tools/docgen/seqgen.h +94 -0
  471. data/lib/libcouchbase.rb +36 -0
  472. data/lib/libcouchbase/bucket.rb +819 -0
  473. data/lib/libcouchbase/callbacks.rb +72 -0
  474. data/lib/libcouchbase/connection.rb +790 -0
  475. data/lib/libcouchbase/design_docs.rb +86 -0
  476. data/lib/libcouchbase/error.rb +68 -0
  477. data/lib/libcouchbase/ext/libcouchbase.rb +1135 -0
  478. data/lib/libcouchbase/ext/libcouchbase/cmdbase.rb +23 -0
  479. data/lib/libcouchbase/ext/libcouchbase/cmdcounter.rb +36 -0
  480. data/lib/libcouchbase/ext/libcouchbase/cmdendure.rb +26 -0
  481. data/lib/libcouchbase/ext/libcouchbase/cmdfts.rb +24 -0
  482. data/lib/libcouchbase/ext/libcouchbase/cmdget.rb +30 -0
  483. data/lib/libcouchbase/ext/libcouchbase/cmdgetreplica.rb +49 -0
  484. data/lib/libcouchbase/ext/libcouchbase/cmdhttp.rb +58 -0
  485. data/lib/libcouchbase/ext/libcouchbase/cmdn1ql.rb +40 -0
  486. data/lib/libcouchbase/ext/libcouchbase/cmdobseqno.rb +33 -0
  487. data/lib/libcouchbase/ext/libcouchbase/cmdobserve.rb +30 -0
  488. data/lib/libcouchbase/ext/libcouchbase/cmdstore.rb +40 -0
  489. data/lib/libcouchbase/ext/libcouchbase/cmdstoredur.rb +45 -0
  490. data/lib/libcouchbase/ext/libcouchbase/cmdsubdoc.rb +49 -0
  491. data/lib/libcouchbase/ext/libcouchbase/cmdverbosity.rb +29 -0
  492. data/lib/libcouchbase/ext/libcouchbase/cmdviewquery.rb +61 -0
  493. data/lib/libcouchbase/ext/libcouchbase/contigbuf.rb +14 -0
  494. data/lib/libcouchbase/ext/libcouchbase/create_st.rb +15 -0
  495. data/lib/libcouchbase/ext/libcouchbase/create_st0.rb +23 -0
  496. data/lib/libcouchbase/ext/libcouchbase/create_st1.rb +26 -0
  497. data/lib/libcouchbase/ext/libcouchbase/create_st2.rb +32 -0
  498. data/lib/libcouchbase/ext/libcouchbase/create_st3.rb +26 -0
  499. data/lib/libcouchbase/ext/libcouchbase/crst_u.rb +20 -0
  500. data/lib/libcouchbase/ext/libcouchbase/durability_opts_st_v.rb +11 -0
  501. data/lib/libcouchbase/ext/libcouchbase/durability_opts_t.rb +14 -0
  502. data/lib/libcouchbase/ext/libcouchbase/durabilityopt_sv0.rb +63 -0
  503. data/lib/libcouchbase/ext/libcouchbase/enums.rb +991 -0
  504. data/lib/libcouchbase/ext/libcouchbase/fragbuf.rb +18 -0
  505. data/lib/libcouchbase/ext/libcouchbase/ftshandle.rb +7 -0
  506. data/lib/libcouchbase/ext/libcouchbase/histogram.rb +34 -0
  507. data/lib/libcouchbase/ext/libcouchbase/http_request_t.rb +7 -0
  508. data/lib/libcouchbase/ext/libcouchbase/keybuf.rb +20 -0
  509. data/lib/libcouchbase/ext/libcouchbase/multicmd_ctx.rb +30 -0
  510. data/lib/libcouchbase/ext/libcouchbase/mutation_token.rb +17 -0
  511. data/lib/libcouchbase/ext/libcouchbase/n1qlhandle.rb +7 -0
  512. data/lib/libcouchbase/ext/libcouchbase/n1qlparams.rb +7 -0
  513. data/lib/libcouchbase/ext/libcouchbase/respbase.rb +29 -0
  514. data/lib/libcouchbase/ext/libcouchbase/respcounter.rb +32 -0
  515. data/lib/libcouchbase/ext/libcouchbase/respendure.rb +49 -0
  516. data/lib/libcouchbase/ext/libcouchbase/respfts.rb +40 -0
  517. data/lib/libcouchbase/ext/libcouchbase/respget.rb +44 -0
  518. data/lib/libcouchbase/ext/libcouchbase/resphttp.rb +48 -0
  519. data/lib/libcouchbase/ext/libcouchbase/respmcversion.rb +38 -0
  520. data/lib/libcouchbase/ext/libcouchbase/respn1ql.rb +41 -0
  521. data/lib/libcouchbase/ext/libcouchbase/respobseqno.rb +52 -0
  522. data/lib/libcouchbase/ext/libcouchbase/respobserve.rb +41 -0
  523. data/lib/libcouchbase/ext/libcouchbase/respserverbase.rb +32 -0
  524. data/lib/libcouchbase/ext/libcouchbase/respstats.rb +38 -0
  525. data/lib/libcouchbase/ext/libcouchbase/respstore.rb +32 -0
  526. data/lib/libcouchbase/ext/libcouchbase/respstoredur.rb +38 -0
  527. data/lib/libcouchbase/ext/libcouchbase/respsubdoc.rb +35 -0
  528. data/lib/libcouchbase/ext/libcouchbase/respviewquery.rb +67 -0
  529. data/lib/libcouchbase/ext/libcouchbase/sdentry.rb +22 -0
  530. data/lib/libcouchbase/ext/libcouchbase/sdspec.rb +26 -0
  531. data/lib/libcouchbase/ext/libcouchbase/t.rb +7 -0
  532. data/lib/libcouchbase/ext/libcouchbase/valbuf.rb +22 -0
  533. data/lib/libcouchbase/ext/libcouchbase/valbuf_u_buf.rb +14 -0
  534. data/lib/libcouchbase/ext/libcouchbase/viewhandle.rb +7 -0
  535. data/lib/libcouchbase/ext/libcouchbase_iocp.rb +26 -0
  536. data/lib/libcouchbase/ext/libcouchbase_libuv.rb +18 -0
  537. data/lib/libcouchbase/ext/tasks.rb +87 -0
  538. data/lib/libcouchbase/n1ql.rb +73 -0
  539. data/lib/libcouchbase/query_full_text.rb +147 -0
  540. data/lib/libcouchbase/query_n1ql.rb +121 -0
  541. data/lib/libcouchbase/query_view.rb +129 -0
  542. data/lib/libcouchbase/results_fiber.rb +262 -0
  543. data/lib/libcouchbase/results_native.rb +211 -0
  544. data/lib/libcouchbase/version.rb +5 -0
  545. data/libcouchbase.gemspec +61 -0
  546. data/spec/bucket_spec.rb +270 -0
  547. data/spec/connection_spec.rb +277 -0
  548. data/spec/design_docs_spec.rb +23 -0
  549. data/spec/error_spec.rb +26 -0
  550. data/spec/fts_spec.rb +129 -0
  551. data/spec/n1ql_spec.rb +201 -0
  552. data/spec/results_libuv_spec.rb +229 -0
  553. data/spec/results_native_spec.rb +259 -0
  554. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/design.json +1 -0
  555. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/data-0000.cbb +0 -0
  556. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/failover.json +1 -0
  557. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/meta.json +1 -0
  558. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/seqno.json +1 -0
  559. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/snapshot_markers.json +1 -0
  560. data/spec/view_spec.rb +195 -0
  561. metadata +775 -0
@@ -0,0 +1,119 @@
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_MCSERVER_NEGOTIATE_H
19
+ #define LCB_MCSERVER_NEGOTIATE_H
20
+ #include <libcouchbase/couchbase.h>
21
+ #include <lcbio/lcbio.h>
22
+ #ifdef __cplusplus
23
+ extern "C" {
24
+ #endif
25
+
26
+ /**
27
+ * @file
28
+ * @brief SASL Negotiation routines
29
+ *
30
+ * @defgroup lcb-sasl Server/SASL Negotiation
31
+ * @details
32
+ * This module contains routines to initialize a server and authenticate it
33
+ * against a cluster. In the future this will also be used to handle things
34
+ * such as TLS negotiation and the HELLO command
35
+ * @addtogroup lcb-sasl
36
+ * @{
37
+ */
38
+
39
+ struct lcb_settings_st;
40
+ typedef struct mc_SESSREQ *mc_pSESSREQ;
41
+ typedef struct mc_SESSINFO *mc_pSESSINFO;
42
+
43
+ /**
44
+ * @brief Start negotiation on a connected socket
45
+ *
46
+ * This will start negotiation on the socket. Once complete (or an error has
47
+ * taken place) the `callback` will be invoked with the result.
48
+ *
49
+ * @param sock A connected socket to use. Its reference count will be increased
50
+ * @param settings A settings structure. Used for auth information as well as
51
+ * logging
52
+ * @param tmo Time in microseconds to wait until the negotiation is done
53
+ * @param callback A callback to invoke when a result has been received
54
+ * @param data User-defined pointer passed to the callback
55
+ * @return A new handle which may be cancelled via mc_sessreq_cancel(). As with
56
+ * other cancellable requests, once this handle is cancelled a callback will
57
+ * not be received for it, and once the callback is received the handle may not
58
+ * be cancelled as it will point to invalid memory.
59
+ *
60
+ * Once the socket has been negotiated successfuly, you may then use the
61
+ * mc_sess_get() function to query the socket about various negotiation aspects
62
+ *
63
+ * @code{.c}
64
+ * lcbio_CONNREQ creq;
65
+ * mc_pSASLREQ req;
66
+ * req = mc_sasl_start(sock, settings, tmo, callback, data);
67
+ * LCBIO_CONNREQ_MKGENERIC(req, mc_sasl_cancel);
68
+ * @endcode
69
+ *
70
+ * @see lcbio_connreq_cancel()
71
+ * @see LCBIO_CONNREQ_MKGENERIC
72
+ */
73
+ mc_pSESSREQ
74
+ mc_sessreq_start(
75
+ lcbio_SOCKET *sock, struct lcb_settings_st *settings,
76
+ uint32_t tmo, lcbio_CONNDONE_cb callback, void *data);
77
+
78
+ /**
79
+ * @brief Cancel a pending SASL negotiation request
80
+ * @param handle The handle to cancel
81
+ */
82
+ void
83
+ mc_sessreq_cancel(mc_pSESSREQ handle);
84
+
85
+ /**
86
+ * @brief Get an opaque handle representing the negotiated state of the socket
87
+ * @param sock The negotiated socket
88
+ * @return the `SASLINFO` structure if the socket is negotiated, or `NULL` if
89
+ * the socket has not been negotiated.
90
+ *
91
+ * @see mc_sasl_getmech()
92
+ */
93
+ mc_pSESSINFO
94
+ mc_sess_get(lcbio_SOCKET *sock);
95
+
96
+ /**
97
+ * @brief Get the mechanism employed for authentication
98
+ * @param info pointer retrieved via mc_sasl_get()
99
+ * @return A string indicating the mechanism used. This may be `PLAIN` or
100
+ * `CRAM-MD5`.
101
+ */
102
+ const char *
103
+ mc_sess_get_saslmech(mc_pSESSINFO info);
104
+
105
+ /**
106
+ * @brief Determine if a specific protocol feature is supported on the server
107
+ * @param info info pointer returned via mc_sasl_get()
108
+ * @param feature A feature ID
109
+ * @return true if supported, false otherwise
110
+ */
111
+ int
112
+ mc_sess_chkfeature(mc_pSESSINFO info, lcb_U16 feature);
113
+
114
+ /**@}*/
115
+
116
+ #ifdef __cplusplus
117
+ }
118
+ #endif
119
+ #endif
@@ -0,0 +1,860 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2016 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
+ #define NOMINMAX
18
+ #include <libcouchbase/ixmgmt.h>
19
+ #include <string>
20
+ #include <set>
21
+ #include <algorithm>
22
+
23
+ #include "contrib/lcb-jsoncpp/lcb-jsoncpp.h"
24
+ #include "lcbio/lcbio.h"
25
+ #include "lcbio/timer-ng.h"
26
+ #include "settings.h"
27
+ #include "internal.h"
28
+
29
+ #define LOGFMT "(mgreq=%p) "
30
+ #define LOGID(req) static_cast<const void*>(req)
31
+ #define LOGARGS(req, lvl) (req)->m_instance->settings, "ixmgmt", LCB_LOG_##lvl, __FILE__, __LINE__
32
+
33
+ using std::vector;
34
+ using std::string;
35
+
36
+ static const char *
37
+ ixtype_2_str(unsigned ixtype)
38
+ {
39
+ if (ixtype == LCB_N1XSPEC_T_GSI) {
40
+ return "gsi";
41
+ } else if (ixtype == LCB_N1XSPEC_T_VIEW) {
42
+ return "view";
43
+ } else {
44
+ return NULL;
45
+ }
46
+ }
47
+
48
+ struct IndexOpCtx {
49
+ lcb_N1XMGMTCALLBACK callback;
50
+ void *cookie;
51
+ };
52
+
53
+ struct ErrorSpec {
54
+ string msg;
55
+ unsigned code;
56
+ };
57
+
58
+ template <typename T> void my_delete(T p) {
59
+ delete p;
60
+ }
61
+
62
+ template <typename T> lcb_error_t
63
+ extract_n1ql_errors(const char *s, size_t n, T& err_out)
64
+ {
65
+ Json::Value jresp;
66
+ if (!Json::Reader().parse(s, s + n, jresp)) {
67
+ return LCB_PROTOCOL_ERROR;
68
+ }
69
+ if (jresp["status"].asString() == "success") {
70
+ return LCB_SUCCESS;
71
+ }
72
+
73
+ Json::Value& errors = jresp["errors"];
74
+ if (errors.isNull()) {
75
+ return LCB_SUCCESS;
76
+ } else if (!errors.isArray()) {
77
+ return LCB_PROTOCOL_ERROR;
78
+ }
79
+
80
+ if (errors.empty()) {
81
+ return LCB_SUCCESS;
82
+ }
83
+
84
+ for (Json::ArrayIndex ii = 0; ii < errors.size(); ++ii) {
85
+ const Json::Value& err = errors[ii];
86
+ if (!err.isObject()) {
87
+ continue; // expected an object!
88
+ }
89
+ ErrorSpec spec;
90
+ spec.msg = err["msg"].asString();
91
+ spec.code = err["code"].asUInt();
92
+ err_out.insert(err_out.end(), spec);
93
+ }
94
+ return LCB_ERROR;
95
+ }
96
+
97
+ static lcb_error_t
98
+ get_n1ql_error(const char *s, size_t n)
99
+ {
100
+ std::vector<ErrorSpec> dummy;
101
+ return extract_n1ql_errors(s, n, dummy);
102
+ }
103
+
104
+ // Called for generic operations and establishes existence or lack thereof
105
+ static void
106
+ cb_generic(lcb_t instance, int, const lcb_RESPN1QL *resp)
107
+ {
108
+ // Get the real cookie..
109
+ if (!(resp->rflags & LCB_RESP_F_FINAL)) {
110
+ return;
111
+ }
112
+
113
+ IndexOpCtx *ctx = reinterpret_cast<IndexOpCtx*>(resp->cookie);
114
+ lcb_RESPN1XMGMT w_resp = { 0 };
115
+ w_resp.cookie = ctx->cookie;
116
+
117
+ if ((w_resp.rc = resp->rc) == LCB_SUCCESS || resp->rc == LCB_HTTP_ERROR) {
118
+ // Check if the top-level N1QL response succeeded, and then
119
+ // descend to determine additional errors. This is primarily
120
+ // required to support EEXIST for GSI primary indexes
121
+
122
+ vector<ErrorSpec> errors;
123
+ lcb_error_t rc = extract_n1ql_errors(resp->row, resp->nrow, errors);
124
+ if (rc == LCB_ERROR) {
125
+ w_resp.rc = LCB_QUERY_ERROR;
126
+ for (size_t ii = 0; ii < errors.size(); ++ii) {
127
+ const std::string& msg = errors[ii].msg;
128
+ if (msg.find("already exist") != string::npos) {
129
+ w_resp.rc = LCB_KEY_EEXISTS; // Index entry already exists
130
+ } else if (msg.find("not found") != string::npos) {
131
+ w_resp.rc = LCB_KEY_ENOENT;
132
+ }
133
+ }
134
+ } else {
135
+ w_resp.rc = rc;
136
+ }
137
+ }
138
+
139
+ w_resp.inner = resp;
140
+ w_resp.specs = NULL;
141
+ w_resp.nspecs = 0;
142
+ ctx->callback(instance, LCB_CALLBACK_IXMGMT, &w_resp);
143
+ delete ctx;
144
+ }
145
+
146
+ /**
147
+ * Dispatch the actual operation using a N1QL query
148
+ * @param instance
149
+ * @param cookie User cookie
150
+ * @param u_callback User callback (to assign to new context)
151
+ * @param i_callback Internal callback to be invoked when N1QL response
152
+ * is done
153
+ * @param s N1QL request payload
154
+ * @param n N1QL request length
155
+ * @param obj Internal context. Created with new if NULL
156
+ * @return
157
+ *
158
+ * See other overload for passing just the query string w/o extra parameters
159
+ */
160
+ template <typename T> lcb_error_t
161
+ dispatch_common(lcb_t instance,
162
+ const void *cookie, lcb_N1XMGMTCALLBACK u_callback,
163
+ lcb_N1QLCALLBACK i_callback, const char *s, size_t n, T *obj)
164
+ {
165
+ lcb_error_t rc = LCB_SUCCESS;
166
+ bool our_alloc = false;
167
+ lcb_CMDN1QL cmd = { 0 };
168
+ struct { lcb_t m_instance; } ixwrap = { instance }; // For logging
169
+
170
+ if (obj == NULL) {
171
+ obj = new T();
172
+ our_alloc = true;
173
+ }
174
+
175
+ if (!(obj->callback = u_callback)) {
176
+ rc = LCB_EINVAL;
177
+ goto GT_ERROR;
178
+ }
179
+
180
+ obj->cookie = const_cast<void*>(cookie);
181
+
182
+ cmd.query = s;
183
+ cmd.nquery = n;
184
+ cmd.callback = i_callback;
185
+ lcb_log(LOGARGS(&ixwrap, DEBUG), LOGFMT "Issuing query %.*s", LOGID(obj), (int)n, s);
186
+ rc = lcb_n1ql_query(instance, obj, &cmd);
187
+
188
+ GT_ERROR:
189
+ if (rc != LCB_SUCCESS && our_alloc) {
190
+ delete obj;
191
+ }
192
+ return rc;
193
+ }
194
+
195
+ template <typename T> lcb_error_t
196
+ dispatch_common(lcb_t instance,
197
+ const void *cookie, lcb_N1XMGMTCALLBACK u_callback,
198
+ lcb_N1QLCALLBACK i_callback, const string& ss, T *obj = NULL)
199
+ {
200
+ Json::Value root;
201
+ root["statement"] = ss;
202
+ string reqbuf = Json::FastWriter().write(root);
203
+ return dispatch_common<T>(instance,
204
+ cookie, u_callback, i_callback,
205
+ reqbuf.c_str(), reqbuf.size()-1 /*newline*/, obj);
206
+ }
207
+
208
+
209
+ // Class to back the storage for the actual lcb_IXSPEC without doing too much
210
+ // mind-numbing buffer copies. Maybe this can be done via a macro instead?
211
+ class IndexSpec : public lcb_N1XSPEC {
212
+ public:
213
+ IndexSpec(const char *s, size_t n) {
214
+ memset(static_cast<lcb_N1XSPEC*>(this), 0, sizeof (lcb_N1XSPEC));
215
+ load_json(s, n);
216
+ }
217
+ inline IndexSpec(const lcb_N1XSPEC *spec);
218
+ static inline void to_key(const lcb_N1XSPEC *spec, std::string& out);
219
+ bool is_primary() const { return flags & LCB_N1XSPEC_F_PRIMARY; }
220
+ bool is_defer() const { return flags & LCB_N1XSPEC_F_DEFER; }
221
+ void ensure_keyspace(lcb_t instance) {
222
+ if (nkeyspace) {
223
+ return;
224
+ }
225
+ keyspace = LCBT_SETTING(instance, bucket);
226
+ nkeyspace = strlen(keyspace);
227
+ }
228
+
229
+ private:
230
+ // Load fields from a JSON string
231
+ inline void load_json(const char *s, size_t n);
232
+
233
+ // Load all fields
234
+ inline size_t load_fields(const Json::Value& root, bool do_copy);
235
+
236
+ size_t total_fields_size(const Json::Value& src) {
237
+ return load_fields(src, false);
238
+ }
239
+
240
+ // Load field from a JSON object
241
+ inline size_t load_json_field(
242
+ const Json::Value& root,
243
+ const char *name, const char **tgt_ptr, size_t *tgt_len, bool do_copy);
244
+
245
+ // Load field from another pointer
246
+ void load_field(const char **dest, const char *src, size_t n) {
247
+ m_buf.append(src, n);
248
+ if (n) {
249
+ *dest = &m_buf.c_str()[m_buf.size()-n];
250
+ } else {
251
+ *dest = NULL;
252
+ }
253
+ }
254
+
255
+ string m_buf;
256
+ IndexSpec(const IndexSpec&);
257
+ };
258
+
259
+ LIBCOUCHBASE_API
260
+ lcb_error_t
261
+ lcb_n1x_create(lcb_t instance, const void *cookie, const lcb_CMDN1XMGMT *cmd)
262
+ {
263
+ string ss;
264
+ IndexSpec spec(&cmd->spec);
265
+ spec.ensure_keyspace(instance);
266
+
267
+ ss = "CREATE";
268
+ if (spec.is_primary()) {
269
+ ss += " PRIMARY";
270
+ } else if (!spec.nname) {
271
+ return LCB_EMPTY_KEY;
272
+ }
273
+ ss.append(" INDEX");
274
+ if (spec.nname) {
275
+ ss.append(" `").append(spec.name, spec.nname).append("` ");
276
+ }
277
+ ss.append(" ON `").append(spec.keyspace, spec.nkeyspace).append("`");
278
+
279
+ if (!spec.is_primary()) {
280
+ if (!spec.nfields) {
281
+ return LCB_EMPTY_KEY;
282
+ }
283
+
284
+ // See if we can parse 'fields' properly. First, try to parse as
285
+ // JSON:
286
+ Json::Value fields_arr;
287
+ Json::Reader r;
288
+ if (!r.parse(spec.fields, spec.fields + spec.nfields, fields_arr)) {
289
+ // Invalid JSON!
290
+ return LCB_EINVAL;
291
+ }
292
+
293
+ ss.append(" (");
294
+ if (fields_arr.isArray()) {
295
+ if (!fields_arr.size()) {
296
+ return LCB_EMPTY_KEY;
297
+ }
298
+ for (size_t ii = 0; ii < fields_arr.size(); ++ii) {
299
+ static Json::Value empty;
300
+ const Json::Value& field = fields_arr.get(ii, empty);
301
+ if (!field.isString()) {
302
+ return LCB_EINVAL;
303
+ }
304
+ ss.append(field.asString());
305
+ if (ii != fields_arr.size()-1) {
306
+ ss.append(",");
307
+ }
308
+ }
309
+ } else if (fields_arr.isString()) {
310
+ std::string field_list = fields_arr.asString();
311
+ if (field_list.empty()) {
312
+ return LCB_EMPTY_KEY;
313
+ }
314
+ ss.append(field_list);
315
+ } else {
316
+ return LCB_EINVAL;
317
+ }
318
+ ss.append(") ");
319
+ }
320
+
321
+ if (spec.ncond) {
322
+ if (spec.is_primary()) {
323
+ return LCB_EINVAL;
324
+ }
325
+ ss.append(" WHERE ").append(spec.cond, spec.ncond).append(" ");
326
+ }
327
+
328
+ if (spec.ixtype) {
329
+ const char *ixtype = ixtype_2_str(spec.ixtype);
330
+ if (!ixtype) {
331
+ return LCB_EINVAL;
332
+ }
333
+ ss.append(" USING ").append(ixtype);
334
+ }
335
+
336
+ if (spec.is_defer()) {
337
+ ss.append(" WITH {\"defer_build\": true}");
338
+ }
339
+
340
+ return dispatch_common<IndexOpCtx>(instance, cookie, cmd->callback, cb_generic, ss);
341
+ }
342
+
343
+
344
+ class ListIndexCtx : public IndexOpCtx {
345
+ public:
346
+ vector<IndexSpec*> specs;
347
+
348
+ virtual void invoke(lcb_t instance, lcb_RESPN1XMGMT *resp) {
349
+ finish(instance, resp);
350
+ }
351
+
352
+ void finish(lcb_t instance, lcb_RESPN1XMGMT *resp = NULL) {
353
+ lcb_RESPN1XMGMT w_resp = { 0 };
354
+ if (resp == NULL) {
355
+ resp = &w_resp;
356
+ resp->rc = LCB_SUCCESS;
357
+ }
358
+ resp->cookie = cookie;
359
+ lcb_N1XSPEC **speclist = reinterpret_cast<lcb_N1XSPEC**>(&specs[0]);
360
+ resp->specs = speclist;
361
+ resp->nspecs = specs.size();
362
+ callback(instance, LCB_CALLBACK_IXMGMT, resp);
363
+ delete this;
364
+ }
365
+
366
+ virtual ~ListIndexCtx() {
367
+ for (size_t ii = 0; ii < specs.size(); ++ii) {
368
+ delete specs[ii];
369
+ }
370
+ specs.clear();
371
+ }
372
+ };
373
+
374
+ static void
375
+ cb_index_list(lcb_t instance, int, const lcb_RESPN1QL *resp)
376
+ {
377
+ ListIndexCtx *ctx = reinterpret_cast<ListIndexCtx *>(resp->cookie);
378
+ if (!(resp->rflags & LCB_RESP_F_FINAL)) {
379
+ ctx->specs.push_back(new IndexSpec(resp->row, resp->nrow));
380
+ return;
381
+ }
382
+
383
+ lcb_RESPN1XMGMT w_resp = { 0 };
384
+ if ((w_resp.rc = resp->rc) == LCB_SUCCESS) {
385
+ w_resp.rc = get_n1ql_error(resp->row, resp->nrow);
386
+ }
387
+ w_resp.inner = resp;
388
+ ctx->invoke(instance, &w_resp);
389
+ }
390
+
391
+ static lcb_error_t
392
+ do_index_list(lcb_t instance, const void *cookie, const lcb_CMDN1XMGMT *cmd,
393
+ ListIndexCtx *ctx)
394
+ {
395
+ string ss;
396
+ IndexSpec spec(&cmd->spec);
397
+ ss = "SELECT idx.* FROM system:indexes idx WHERE";
398
+
399
+ if (spec.flags & LCB_N1XSPEC_F_PRIMARY) {
400
+ ss.append(" is_primary=true AND");
401
+ }
402
+ if (spec.nkeyspace) {
403
+ ss.append(" keyspace_id=\"").append(spec.keyspace, spec.nkeyspace).append("\" AND");
404
+ }
405
+ if (spec.nnspace) {
406
+ ss.append(" namespace_id=\"").append(spec.nspace, spec.nnspace).append("\" AND");
407
+ }
408
+ if (spec.ixtype) {
409
+ const char *s_ixtype = ixtype_2_str(spec.ixtype);
410
+ if (s_ixtype == NULL) {
411
+ if (ctx != NULL) {
412
+ delete ctx;
413
+ }
414
+ return LCB_EINVAL;
415
+ }
416
+ ss.append(" using=\"").append(s_ixtype).append("\" AND");
417
+ }
418
+ if (spec.nname) {
419
+ ss.append(" name=\"").append(spec.name, spec.nname).append("\" AND");
420
+ }
421
+
422
+ // WHERE <.....> true
423
+ ss.append(" true");
424
+ ss.append(" ORDER BY is_primary DESC, name ASC");
425
+
426
+ return dispatch_common<ListIndexCtx>(instance,
427
+ cookie, cmd->callback, cb_index_list, ss, ctx);
428
+ }
429
+
430
+ LIBCOUCHBASE_API
431
+ lcb_error_t
432
+ lcb_n1x_list(lcb_t instance, const void *cookie, const lcb_CMDN1XMGMT *cmd)
433
+ {
434
+ return do_index_list(instance, cookie, cmd, NULL);
435
+ }
436
+
437
+ LIBCOUCHBASE_API
438
+ lcb_error_t
439
+ lcb_n1x_drop(lcb_t instance, const void *cookie, const lcb_CMDN1XMGMT *cmd)
440
+ {
441
+ string ss;
442
+ IndexSpec spec(&cmd->spec);
443
+ spec.ensure_keyspace(instance);
444
+
445
+ if (spec.nname) {
446
+ ss = "DROP INDEX";
447
+ ss.append(" `").append(spec.keyspace, spec.nkeyspace).append("`");
448
+ ss.append(".`").append(spec.name, spec.nname).append("`");
449
+ } else if (spec.flags & LCB_N1XSPEC_F_PRIMARY) {
450
+ ss = "DROP PRIMARY INDEX ON";
451
+ ss.append(" `").append(spec.keyspace, spec.nkeyspace).append("`");
452
+ } else {
453
+ return LCB_EMPTY_KEY;
454
+ }
455
+
456
+ if (spec.ixtype) {
457
+ const char *stype = ixtype_2_str(spec.ixtype);
458
+ if (!stype) {
459
+ return LCB_EINVAL;
460
+ }
461
+ ss.append(" USING ").append(stype);
462
+ }
463
+
464
+ return dispatch_common<IndexOpCtx>(instance, cookie, cmd->callback, cb_generic, ss);
465
+ }
466
+
467
+ class ListIndexCtx_BuildIndex : public ListIndexCtx {
468
+ public:
469
+ virtual inline void invoke(lcb_t instance, lcb_RESPN1XMGMT *resp);
470
+ inline lcb_error_t try_build(lcb_t instance);
471
+ };
472
+
473
+ static void
474
+ cb_build_submitted(lcb_t instance, int, const lcb_RESPN1QL *resp)
475
+ {
476
+ ListIndexCtx *ctx = reinterpret_cast<ListIndexCtx*>(resp->cookie);
477
+
478
+ if (resp->rflags & LCB_RESP_F_FINAL) {
479
+ lcb_RESPN1XMGMT w_resp = { 0 };
480
+ if ((w_resp.rc = resp->rc) == LCB_SUCCESS) {
481
+ w_resp.rc = get_n1ql_error(resp->row, resp->nrow);
482
+ }
483
+ ctx->finish(instance, &w_resp);
484
+ }
485
+ }
486
+
487
+ lcb_error_t
488
+ ListIndexCtx_BuildIndex::try_build(lcb_t instance)
489
+ {
490
+ vector<IndexSpec*> pending;
491
+ for (size_t ii = 0; ii < specs.size(); ++ii) {
492
+ IndexSpec* spec = specs[ii];
493
+ if (strncmp(spec->state, "pending", spec->nstate) == 0 ||
494
+ strncmp(spec->state, "deferred", spec->nstate) == 0) {
495
+ pending.push_back(spec);
496
+ }
497
+ }
498
+
499
+ if (pending.empty()) {
500
+ return LCB_KEY_ENOENT;
501
+ }
502
+
503
+ string ss;
504
+ ss = "BUILD INDEX ON `";
505
+
506
+ ss.append(pending[0]->keyspace, pending[0]->nkeyspace).append("`");
507
+ ss += '(';
508
+ for (size_t ii = 0; ii < pending.size(); ++ii) {
509
+ ss += '`';
510
+ ss.append(pending[ii]->name, pending[ii]->nname);
511
+ ss += '`';
512
+ if (ii+1 < pending.size()) {
513
+ ss += ',';
514
+ }
515
+ }
516
+ ss += ')';
517
+
518
+ lcb_error_t rc = dispatch_common<ListIndexCtx_BuildIndex>(
519
+ instance, cookie, callback, cb_build_submitted, ss,
520
+ this);
521
+
522
+ if (rc == LCB_SUCCESS) {
523
+ std::set<IndexSpec*> to_remove(specs.begin(), specs.end());
524
+ for (size_t ii = 0; ii < pending.size(); ++ii) {
525
+ to_remove.erase(pending[ii]);
526
+ }
527
+
528
+ std::for_each(to_remove.begin(), to_remove.end(), my_delete<IndexSpec*>);
529
+
530
+ specs = pending;
531
+ }
532
+ return rc;
533
+ }
534
+
535
+ void
536
+ ListIndexCtx_BuildIndex::invoke(lcb_t instance, lcb_RESPN1XMGMT *resp)
537
+ {
538
+ if (resp->rc == LCB_SUCCESS &&
539
+ (resp->rc = try_build(instance)) == LCB_SUCCESS) {
540
+ return;
541
+ }
542
+ finish(instance, resp);
543
+ }
544
+
545
+ LIBCOUCHBASE_API
546
+ lcb_error_t
547
+ lcb_n1x_startbuild(lcb_t instance, const void *cookie, const lcb_CMDN1XMGMT *cmd)
548
+ {
549
+ ListIndexCtx_BuildIndex *ctx = new ListIndexCtx_BuildIndex();
550
+ lcb_error_t rc = do_index_list(instance, cookie, cmd, ctx);
551
+ if (rc != LCB_SUCCESS) {
552
+ delete ctx;
553
+ }
554
+ return rc;
555
+ }
556
+
557
+ struct WatchIndexCtx : public IndexOpCtx {
558
+ // Interval timer
559
+ lcbio_pTIMER m_timer;
560
+ uint32_t m_interval;
561
+ uint64_t m_tsend;
562
+ lcb_t m_instance;
563
+ std::map<std::string,IndexSpec*> m_defspend;
564
+ std::vector<IndexSpec*> m_defsok;
565
+
566
+ inline void read_state(const lcb_RESPN1XMGMT *resp);
567
+ inline void reschedule();
568
+ inline lcb_error_t do_poll();
569
+ inline lcb_error_t load_defs(const lcb_CMDN1XWATCH *);
570
+ inline WatchIndexCtx(lcb_t, const void *, const lcb_CMDN1XWATCH*);
571
+ inline ~WatchIndexCtx();
572
+ inline void finish(lcb_error_t rc, const lcb_RESPN1XMGMT *);
573
+ };
574
+
575
+ static void
576
+ cb_watchix_tm(void *arg)
577
+ {
578
+ WatchIndexCtx *ctx = reinterpret_cast<WatchIndexCtx*>(arg);
579
+ uint64_t now = lcb_nstime();
580
+ if (now >= ctx->m_tsend) {
581
+ ctx->finish(LCB_ETIMEDOUT, NULL);
582
+ } else {
583
+ ctx->do_poll();
584
+ }
585
+ }
586
+
587
+ #define DEFAULT_WATCH_TIMEOUT LCB_S2US(30)
588
+ #define DEFAULT_WATCH_INTERVAL LCB_MS2US(500)
589
+
590
+ WatchIndexCtx::WatchIndexCtx(lcb_t instance, const void *cookie_, const lcb_CMDN1XWATCH *cmd)
591
+ : m_instance(instance)
592
+ {
593
+ uint64_t now = lcb_nstime();
594
+ uint32_t timeout = cmd->timeout ? cmd->timeout : DEFAULT_WATCH_TIMEOUT;
595
+ m_interval = cmd->interval ? cmd->interval : DEFAULT_WATCH_INTERVAL;
596
+ m_interval = std::min(m_interval, timeout);
597
+ m_tsend = now + LCB_US2NS(timeout);
598
+
599
+ this->callback = cmd->callback;
600
+ this->cookie = const_cast<void*>(cookie_);
601
+
602
+ m_timer = lcbio_timer_new(instance->iotable, this, cb_watchix_tm);
603
+ lcb_aspend_add(&instance->pendops, LCB_PENDTYPE_COUNTER, NULL);
604
+ }
605
+
606
+ WatchIndexCtx::~WatchIndexCtx()
607
+ {
608
+ if (m_timer) {
609
+ lcbio_timer_destroy(m_timer);
610
+ }
611
+ if (m_instance) {
612
+ lcb_aspend_del(&m_instance->pendops, LCB_PENDTYPE_COUNTER, NULL);
613
+ lcb_maybe_breakout(m_instance);
614
+ }
615
+
616
+ std::for_each(m_defsok.begin(), m_defsok.end(), my_delete<IndexSpec*>);
617
+ for (std::map<string,IndexSpec*>::iterator ii = m_defspend.begin();
618
+ ii != m_defspend.end(); ++ii) {
619
+ delete ii->second;
620
+ }
621
+ }
622
+
623
+ void
624
+ IndexSpec::to_key(const lcb_N1XSPEC* spec, std::string& s)
625
+ {
626
+ // Identity is:
627
+ // {keyspace,name,is_primary,type}
628
+ s.append(spec->nspace, spec->nnspace).append(" ");
629
+ s.append(spec->keyspace, spec->nkeyspace).append(" ");
630
+ s.append(spec->name, spec->nname).append(" ");
631
+ const char *type_s = ixtype_2_str(spec->ixtype);
632
+ if (!type_s) {
633
+ type_s = "<UNKNOWN>";
634
+ }
635
+ s.append(type_s);
636
+ }
637
+
638
+ void
639
+ WatchIndexCtx::read_state(const lcb_RESPN1XMGMT *resp)
640
+ {
641
+ // We examine the indexes here to see which ones have been completed
642
+ // Make them all into an std::map
643
+ if (resp->rc != LCB_SUCCESS) {
644
+ lcb_log(LOGARGS(this, INFO), LOGFMT "Error 0x%x while listing indexes. Rescheduling", LOGID(this), resp->rc);
645
+ reschedule();
646
+ return;
647
+ }
648
+
649
+ std::map<std::string, const lcb_N1XSPEC*> in_specs;
650
+ for (size_t ii = 0; ii < resp->nspecs; ++ii) {
651
+ std::string key;
652
+ IndexSpec::to_key(resp->specs[ii], key);
653
+ in_specs[key] = resp->specs[ii];
654
+ }
655
+
656
+ std::map<std::string, IndexSpec*>::iterator it_remain = m_defspend.begin();
657
+ while (it_remain != m_defspend.end()) {
658
+ // See if the index is 'online' yet!
659
+ std::map<std::string,const lcb_N1XSPEC*>::iterator res;
660
+ res = in_specs.find(it_remain->first);
661
+ if (res == in_specs.end()) {
662
+ lcb_log(LOGARGS(this, INFO), LOGFMT "Index [%s] not in cluster", LOGID(this), it_remain->first.c_str());
663
+ // We can't find our own index. Someone else deleted it. Bail!
664
+ finish(LCB_KEY_ENOENT, resp);
665
+ return;
666
+ }
667
+
668
+ std::string s_state(res->second->state, res->second->nstate);
669
+ if (s_state == "online") {
670
+ lcb_log(LOGARGS(this, DEBUG), LOGFMT "Index [%s] is ready", LOGID(this), it_remain->first.c_str());
671
+ m_defsok.push_back(it_remain->second);
672
+ m_defspend.erase(it_remain++);
673
+ } else {
674
+ ++it_remain;
675
+ }
676
+ }
677
+
678
+ if (m_defspend.empty()) {
679
+ finish(LCB_SUCCESS, resp);
680
+ } else {
681
+ reschedule();
682
+ }
683
+ }
684
+
685
+ lcb_error_t
686
+ WatchIndexCtx::load_defs(const lcb_CMDN1XWATCH *cmd)
687
+ {
688
+ for (size_t ii = 0; ii < cmd->nspec; ++ii) {
689
+ std::string key;
690
+ IndexSpec *extspec = new IndexSpec(cmd->specs[ii]);
691
+ IndexSpec::to_key(extspec, key);
692
+ m_defspend[key] = extspec;
693
+ }
694
+ if (m_defspend.empty()) {
695
+ return LCB_ENO_COMMANDS;
696
+ }
697
+ return LCB_SUCCESS;
698
+ }
699
+
700
+ void
701
+ WatchIndexCtx::finish(lcb_error_t rc, const lcb_RESPN1XMGMT *resp)
702
+ {
703
+ lcb_RESPN1XMGMT my_resp = { 0 };
704
+ my_resp.cookie = cookie;
705
+ my_resp.rc = rc;
706
+
707
+ if (resp) {
708
+ my_resp.inner = resp->inner;
709
+ }
710
+
711
+ lcb_N1XSPEC **speclist = reinterpret_cast<lcb_N1XSPEC**>(&m_defsok[0]);
712
+ my_resp.specs = speclist;
713
+ my_resp.nspecs = m_defsok.size();
714
+ callback(m_instance, LCB_CALLBACK_IXMGMT, &my_resp);
715
+ delete this;
716
+ }
717
+
718
+ void
719
+ WatchIndexCtx::reschedule()
720
+ {
721
+ // Next interval!
722
+ uint64_t now = lcb_nstime();
723
+ if (now + LCB_US2NS(m_interval) >= m_tsend) {
724
+ finish(LCB_ETIMEDOUT, NULL);
725
+ } else {
726
+ lcbio_timer_rearm(m_timer, m_interval);
727
+ }
728
+ }
729
+
730
+ static void
731
+ cb_watch_gotlist(lcb_t, int, const lcb_RESPN1XMGMT *resp)
732
+ {
733
+ WatchIndexCtx *ctx = reinterpret_cast<WatchIndexCtx*>(resp->cookie);
734
+ ctx->read_state(resp);
735
+ }
736
+
737
+ lcb_error_t
738
+ WatchIndexCtx::do_poll()
739
+ {
740
+ lcb_CMDN1XMGMT cmd;
741
+ memset(&cmd, 0, sizeof cmd);
742
+ cmd.callback = cb_watch_gotlist;
743
+ lcb_log(LOGARGS(this, DEBUG), LOGFMT "Will check for index readiness of %lu indexes. %lu completed", LOGID(this), m_defspend.size(), m_defsok.size());
744
+ return lcb_n1x_list(m_instance, this, &cmd);
745
+ }
746
+
747
+ LIBCOUCHBASE_API
748
+ lcb_error_t
749
+ lcb_n1x_watchbuild(lcb_t instance, const void *cookie, const lcb_CMDN1XWATCH *cmd)
750
+ {
751
+ WatchIndexCtx *ctx = new WatchIndexCtx(instance, cookie, cmd);
752
+ lcb_error_t rc;
753
+ if ((rc = ctx->load_defs(cmd)) != LCB_SUCCESS) {
754
+ delete ctx;
755
+ return rc;
756
+ }
757
+ if ((rc = ctx->do_poll()) != LCB_SUCCESS) {
758
+ delete ctx;
759
+ return rc;
760
+ }
761
+ return LCB_SUCCESS;
762
+ }
763
+
764
+ void
765
+ IndexSpec::load_json(const char *s, size_t n) {
766
+ Json::Value root;
767
+ // Set the JSON first!
768
+ m_buf.assign(s, n);
769
+ nrawjson = n;
770
+
771
+ if (!Json::Reader().parse(s, s + n, root)) {
772
+ rawjson = m_buf.c_str();
773
+ return;
774
+ }
775
+
776
+ m_buf.reserve(n + total_fields_size(root));
777
+ load_fields(root, true);
778
+
779
+ // Once all the fields are loaded, it's time to actually assign the
780
+ // rawjson field, which is simply the beginning of the buffer
781
+ rawjson = m_buf.c_str();
782
+
783
+ // Get the index type
784
+ string ixtype_s = root["using"].asString();
785
+ if (ixtype_s == "gsi") {
786
+ ixtype = LCB_N1XSPEC_T_GSI;
787
+ } else if (ixtype_s == "view") {
788
+ ixtype = LCB_N1XSPEC_T_VIEW;
789
+ }
790
+ if (root["is_primary"].asBool()) {
791
+ flags |= LCB_N1XSPEC_F_PRIMARY;
792
+ }
793
+ }
794
+
795
+ // IndexSpec stuff
796
+ IndexSpec::IndexSpec(const lcb_N1XSPEC *spec)
797
+ {
798
+ *static_cast<lcb_N1XSPEC*>(this) = *spec;
799
+ if (spec->nrawjson) {
800
+ load_json(spec->rawjson, spec->nrawjson);
801
+ return;
802
+ }
803
+ // Initialize the bufs
804
+ m_buf.reserve(nname + nkeyspace + nnspace + nstate + nfields + nrawjson + nstate + ncond);
805
+ load_field(&rawjson, spec->rawjson, nrawjson);
806
+ load_field(&name, spec->name, nname);
807
+ load_field(&keyspace, spec->keyspace, nkeyspace);
808
+ load_field(&nspace, spec->nspace, nnspace);
809
+ load_field(&state, spec->state, nstate);
810
+ load_field(&fields, spec->fields, nfields);
811
+ load_field(&cond, spec->cond, ncond);
812
+ }
813
+
814
+ size_t
815
+ IndexSpec::load_fields(const Json::Value& root, bool do_copy)
816
+ {
817
+ size_t size = 0;
818
+ size += load_json_field(root, "name", &name, &nname, do_copy);
819
+ size += load_json_field(root, "keyspace_id", &keyspace, &nkeyspace, do_copy);
820
+ size += load_json_field(root, "namespace_id", &nspace, &nnspace, do_copy);
821
+ size += load_json_field(root, "state", &state, &nstate, do_copy);
822
+ size += load_json_field(root, "index_key", &fields, &nfields, do_copy);
823
+ size += load_json_field(root, "condition", &cond, &ncond, do_copy);
824
+ return size;
825
+ }
826
+
827
+ size_t
828
+ IndexSpec::load_json_field(const Json::Value& root,
829
+ const char *name_, const char **tgt_ptr, size_t *tgt_len, bool do_copy)
830
+ {
831
+ size_t namelen = strlen(name_);
832
+ const Json::Value *val = root.find(name_, name_ + namelen);
833
+ size_t n = 0;
834
+
835
+ if (val == NULL) {
836
+ return 0;
837
+ }
838
+
839
+ if (val->isString()) {
840
+ const char *s_begin, *s_end;
841
+ if (val->getString(&s_begin, &s_end) && (n = s_end - s_begin) && do_copy) {
842
+ m_buf.insert(m_buf.end(), s_begin, s_end);
843
+ }
844
+ } else {
845
+ std::string frag = Json::FastWriter().write(*val);
846
+ n = frag.size();
847
+ if (do_copy) {
848
+ m_buf.append(frag);
849
+ }
850
+ }
851
+
852
+ if (n) {
853
+ *tgt_ptr = &(m_buf.c_str()[m_buf.size()-n]);
854
+ *tgt_len = n;
855
+ } else {
856
+ *tgt_ptr = NULL;
857
+ *tgt_len = 0;
858
+ }
859
+ return n;
860
+ }