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,34 @@
1
+ #ifndef LCB_HTTPAPI_H
2
+ #define LCB_HTTPAPI_H
3
+
4
+ /* This file contains the internal API for HTTP requests. This allows us to
5
+ * change the internals without exposing the object structure to the rest
6
+ * of the library
7
+ */
8
+
9
+ #ifdef __cplusplus
10
+ extern "C" {
11
+ #endif
12
+
13
+ void
14
+ lcb_htreq_setcb(lcb_http_request_t, lcb_RESPCALLBACK);
15
+
16
+ void
17
+ lcb_htreq_pause(lcb_http_request_t);
18
+
19
+ void
20
+ lcb_htreq_resume(lcb_http_request_t);
21
+
22
+ void
23
+ lcb_htreq_finish(lcb_t, lcb_http_request_t, lcb_error_t);
24
+
25
+ /* Prevents the callback from being invoked. This is different than a full
26
+ * destruction of the object. This is only called in lcb_destroy() to
27
+ * prevent dereferencing the instance itself.
28
+ */
29
+ void
30
+ lcb_htreq_block_callback(lcb_http_request_t);
31
+ #ifdef __cplusplus
32
+ }
33
+ #endif
34
+ #endif
@@ -0,0 +1,307 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2013 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
+ #include "internal.h"
18
+ #include "logging.h"
19
+ #include "settings.h"
20
+ #include "http-priv.h"
21
+ #include "http.h"
22
+ #include "ctx-log-inl.h"
23
+ #include "sllist.h"
24
+ #include <lcbio/ssl.h>
25
+
26
+ using namespace lcb::http;
27
+
28
+ #define LOGFMT "<%s:%s>"
29
+ #define LOGID(req) get_ctx_host((req)->ioctx), get_ctx_port((req)->ioctx)
30
+ #define LOGARGS(req, lvl) req->instance->settings, "http-io", LCB_LOG_##lvl, __FILE__, __LINE__
31
+
32
+ void
33
+ Request::assign_response_headers(const lcbht_RESPONSE *resp)
34
+ {
35
+ response_headers.clear();
36
+ response_headers_clist.clear();
37
+
38
+ sllist_node *curnode;
39
+ SLLIST_ITERBASIC(&resp->headers, curnode) {
40
+ lcbht_MIMEHDR *hdr = SLLIST_ITEM(curnode, lcbht_MIMEHDR, slnode);
41
+ response_headers.push_back(Header(hdr->key, hdr->value));
42
+ }
43
+
44
+ std::vector<Header>::const_iterator ii = response_headers.begin();
45
+ for (; ii != response_headers.end(); ++ii) {
46
+ response_headers_clist.push_back(ii->key.c_str());
47
+ response_headers_clist.push_back(ii->value.c_str());
48
+ }
49
+ response_headers_clist.push_back(NULL);
50
+ }
51
+
52
+ int
53
+ Request::handle_parse_chunked(const char *buf, unsigned nbuf)
54
+ {
55
+ int parse_state, oldstate, diff;
56
+ lcbht_RESPONSE *res = lcbht_get_response(parser);
57
+
58
+ do {
59
+ const char *rbody;
60
+ unsigned nused = -1, nbody = -1;
61
+ oldstate = res->state;
62
+
63
+ parse_state = lcbht_parse_ex(parser, buf, nbuf, &nused, &nbody, &rbody);
64
+ diff = oldstate ^ parse_state;
65
+
66
+ /* Got headers now for the first time */
67
+ if (diff & LCBHT_S_HEADER) {
68
+ assign_response_headers(res);
69
+ if (res->status >= 300 && res->status <= 400) {
70
+ const char *redir = lcbht_get_resphdr(res, "Location");
71
+ if (redir != NULL) {
72
+ pending_redirect.assign(redir);
73
+ return LCBHT_S_DONE;
74
+ }
75
+ }
76
+ }
77
+
78
+ if (parse_state & LCBHT_S_ERROR) {
79
+ /* nothing to do here */
80
+ return parse_state;
81
+ }
82
+
83
+ if (nbody) {
84
+ if (chunked) {
85
+ lcb_RESPHTTP htresp = { 0 };
86
+ init_resp(&htresp);
87
+ htresp.body = rbody;
88
+ htresp.nbody = nbody;
89
+ htresp.rc = LCB_SUCCESS;
90
+ passed_data = true;
91
+ callback(instance, LCB_CALLBACK_HTTP, (const lcb_RESPBASE *)&htresp);
92
+
93
+ } else {
94
+ lcb_string_append(&res->body, rbody, nbody);
95
+ }
96
+ }
97
+
98
+ buf += nused;
99
+ nbuf -= nused;
100
+ } while ((parse_state & LCBHT_S_DONE) == 0 && is_ongoing() && nbuf);
101
+
102
+ if ( (parse_state & LCBHT_S_DONE) && is_ongoing()) {
103
+ lcb_RESPHTTP resp = { 0 };
104
+ if (chunked) {
105
+ buf = NULL;
106
+ nbuf = 0;
107
+ } else {
108
+ buf = res->body.base;
109
+ nbuf = res->body.nused;
110
+ }
111
+
112
+ init_resp(&resp);
113
+ resp.rflags = LCB_RESP_F_FINAL;
114
+ resp.rc = LCB_SUCCESS;
115
+ resp.body = buf;
116
+ resp.nbody = nbuf;
117
+ passed_data = true;
118
+ callback(instance, LCB_CALLBACK_HTTP, (const lcb_RESPBASE*)&resp);
119
+ status |= Request::CBINVOKED;
120
+ }
121
+ return parse_state;
122
+ }
123
+
124
+ static void
125
+ io_read(lcbio_CTX *ctx, unsigned nr)
126
+ {
127
+ Request *req = reinterpret_cast<Request*>(lcbio_ctx_data(ctx));
128
+ lcb_t instance = req->instance;
129
+ /** this variable set to 0 (in progress), -1 (error), 1 (done) */
130
+ int rv = 0;
131
+ lcbio_CTXRDITER iter;
132
+ req->incref();
133
+
134
+ /** Delay the timer */
135
+ lcbio_timer_rearm(req->timer, req->timeout());
136
+
137
+ LCBIO_CTX_ITERFOR(ctx, &iter, nr) {
138
+ char *buf;
139
+ unsigned nbuf;
140
+ int parse_state;
141
+
142
+ buf = reinterpret_cast<char*>(lcbio_ctx_ribuf(&iter));
143
+ nbuf = lcbio_ctx_risize(&iter);
144
+ parse_state = req->handle_parse_chunked(buf, nbuf);
145
+
146
+ if ((parse_state & LCBHT_S_ERROR) || req->has_pending_redirect()) {
147
+ rv = -1;
148
+ break;
149
+ } else if (!req->is_ongoing()) {
150
+ rv = 1;
151
+ break;
152
+ }
153
+ }
154
+
155
+ if (rv == -1) {
156
+ // parse error or redirect
157
+ lcb_error_t err;
158
+ if (req->has_pending_redirect()) {
159
+ lcb_bootstrap_common(instance, LCB_BS_REFRESH_THROTTLE);
160
+ // Transfer control to redirect function()
161
+ lcb_log(LOGARGS(req, DEBUG), LOGFMT "Attempting redirect to %s", LOGID(req), req->pending_redirect.c_str());
162
+ req->redirect();
163
+ } else {
164
+ err = LCB_PROTOCOL_ERROR;
165
+ lcb_log(LOGARGS(req, ERR), LOGFMT "Got parser error while parsing HTTP stream", LOGID(req));
166
+ req->finish_or_retry(err);
167
+ }
168
+ } else if (rv == 1) {
169
+ // Complete
170
+ req->finish(LCB_SUCCESS);
171
+ } else {
172
+ // Pending
173
+ lcbio_ctx_rwant(ctx, req->paused ? 0 : 1);
174
+ lcbio_ctx_schedule(ctx);
175
+ }
176
+
177
+ req->decref();
178
+ }
179
+
180
+ void
181
+ Request::pause()
182
+ {
183
+ if (!paused) {
184
+ paused = true;
185
+ if (ioctx) {
186
+ lcbio_ctx_rwant(ioctx, 0);
187
+ lcbio_ctx_schedule(ioctx);
188
+ }
189
+ }
190
+ }
191
+
192
+ void
193
+ Request::resume()
194
+ {
195
+ if (!paused) {
196
+ return;
197
+ }
198
+
199
+ if (ioctx == NULL) {
200
+ return;
201
+ }
202
+ paused = false;
203
+ lcbio_ctx_rwant(ioctx, 1);
204
+ lcbio_ctx_schedule(ioctx);
205
+ }
206
+
207
+ static void
208
+ io_error(lcbio_CTX *ctx, lcb_error_t err)
209
+ {
210
+ Request *req = reinterpret_cast<Request*>(lcbio_ctx_data(ctx));
211
+ lcb_log(LOGARGS(req, ERR), LOGFMT "Got error while performing I/O on HTTP stream. Err=0x%x", LOGID(req), err);
212
+ req->finish_or_retry(err);
213
+ }
214
+
215
+ static void
216
+ request_timed_out(void *arg)
217
+ {
218
+ (reinterpret_cast<Request*>(arg))->finish(LCB_ETIMEDOUT);
219
+ }
220
+
221
+ static void
222
+ on_connected(lcbio_SOCKET *sock, void *arg, lcb_error_t err, lcbio_OSERR syserr)
223
+ {
224
+ Request *req = reinterpret_cast<Request*>(arg);
225
+ lcbio_CTXPROCS procs;
226
+ lcb_settings *settings = req->instance->settings;
227
+
228
+ LCBIO_CONNREQ_CLEAR(&req->creq);
229
+
230
+ if (err != LCB_SUCCESS) {
231
+ lcb_log(LOGARGS(req, ERR), "Connection to failed with Err=0x%x", err);
232
+ req->finish_or_retry(err);
233
+ return;
234
+ }
235
+
236
+ lcbio_sslify_if_needed(sock, settings);
237
+
238
+ procs.cb_err = io_error;
239
+ procs.cb_read = io_read;
240
+ req->ioctx = lcbio_ctx_new(sock, arg, &procs);
241
+ req->ioctx->subsys = "mgmt/capi";
242
+ lcbio_ctx_put(req->ioctx, &req->preamble[0], req->preamble.size());
243
+ if (!req->body.empty()) {
244
+ lcbio_ctx_put(req->ioctx, &req->body[0], req->body.size());
245
+ }
246
+ lcbio_ctx_rwant(req->ioctx, 1);
247
+ lcbio_ctx_schedule(req->ioctx);
248
+ (void)syserr;
249
+ }
250
+
251
+ lcb_error_t
252
+ Request::start_io(lcb_host_t& dest)
253
+ {
254
+ lcbio_MGR *pool = instance->http_sockpool;
255
+ lcbio_pMGRREQ poolreq;
256
+
257
+ poolreq = lcbio_mgr_get(pool, &dest, timeout(), on_connected, this);
258
+ if (!poolreq) {
259
+ return LCB_CONNECT_ERROR;
260
+ }
261
+
262
+ LCBIO_CONNREQ_MKPOOLED(&creq, poolreq);
263
+
264
+ if (!timer) {
265
+ timer = lcbio_timer_new(io, this, request_timed_out);
266
+ }
267
+
268
+ if (!lcbio_timer_armed(timer)) {
269
+ lcbio_timer_rearm(timer, timeout());
270
+ }
271
+
272
+ return LCB_SUCCESS;
273
+ }
274
+
275
+ static void
276
+ pool_close_cb(lcbio_SOCKET *sock, int reusable, void *arg)
277
+ {
278
+ int close_ok = *(int *)arg;
279
+
280
+ lcbio_ref(sock);
281
+ if (reusable && close_ok) {
282
+ lcbio_mgr_put(sock);
283
+ } else {
284
+ lcbio_mgr_discard(sock);
285
+ }
286
+ }
287
+
288
+ void
289
+ Request::close_io()
290
+ {
291
+ lcbio_connreq_cancel(&creq);
292
+
293
+ if (!ioctx) {
294
+ return;
295
+ }
296
+
297
+ int can_ka;
298
+
299
+ if (parser && is_data_request()) {
300
+ can_ka = lcbht_can_keepalive(parser);
301
+ } else {
302
+ can_ka = 0;
303
+ }
304
+
305
+ lcbio_ctx_close(ioctx, pool_close_cb, &can_ka);
306
+ ioctx = NULL;
307
+ }
@@ -0,0 +1,722 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2010-2013 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
+ #include "internal.h"
18
+ #include "connspec.h"
19
+ #include "logging.h"
20
+ #include "hostlist.h"
21
+ #include "http/http.h"
22
+ #include "bucketconfig/clconfig.h"
23
+ #include <lcbio/iotable.h>
24
+ #include <lcbio/ssl.h>
25
+ #define LOGARGS(obj,lvl) (obj)->settings, "instance", LCB_LOG_##lvl, __FILE__, __LINE__
26
+
27
+ static volatile unsigned int lcb_instance_index = 0;
28
+ using namespace lcb;
29
+
30
+ LIBCOUCHBASE_API
31
+ const char *lcb_get_version(lcb_uint32_t *version)
32
+ {
33
+ if (version != NULL) {
34
+ *version = (lcb_uint32_t)LCB_VERSION;
35
+ }
36
+
37
+ return LCB_VERSION_STRING;
38
+ }
39
+
40
+ const lcb_U32 lcb_version_g = LCB_VERSION;
41
+
42
+ LIBCOUCHBASE_API
43
+ void lcb_set_cookie(lcb_t instance, const void *cookie)
44
+ {
45
+ instance->cookie = cookie;
46
+ }
47
+
48
+ LIBCOUCHBASE_API
49
+ const void *lcb_get_cookie(lcb_t instance)
50
+ {
51
+ return instance->cookie;
52
+ }
53
+
54
+ void
55
+ lcb_st::add_bs_host(const char *host, int port, unsigned bstype)
56
+ {
57
+ const char *tname = NULL;
58
+ lcb::Hostlist* target;
59
+ if (bstype == LCB_CONFIG_TRANSPORT_CCCP) {
60
+ tname = "CCCP";
61
+ target = mc_nodes;
62
+ } else {
63
+ tname = "HTTP";
64
+ target = ht_nodes;
65
+ }
66
+ lcb_log(LOGARGS(this, DEBUG), "Adding host %s:%d to initial %s bootstrap list", host, port, tname);
67
+ target->add(host, port);
68
+ }
69
+
70
+ void
71
+ lcb_st::add_bs_host(const lcb::Spechost& host, int defl_http, int defl_cccp)
72
+ {
73
+ if (host.isTypeless()) {
74
+ add_bs_host(host.hostname.c_str(), defl_http, LCB_CONFIG_TRANSPORT_HTTP);
75
+ add_bs_host(host.hostname.c_str(), defl_cccp, LCB_CONFIG_TRANSPORT_CCCP);
76
+ return;
77
+ } else {
78
+ add_bs_host(host.hostname.c_str(), host.port,
79
+ host.isAnyHttp()
80
+ ? LCB_CONFIG_TRANSPORT_HTTP : LCB_CONFIG_TRANSPORT_CCCP);
81
+ }
82
+ }
83
+
84
+ void
85
+ lcb_st::populate_nodes(const Connspec& spec)
86
+ {
87
+ int has_ssl = settings->sslopts & LCB_SSL_ENABLED;
88
+ int defl_http, defl_cccp;
89
+
90
+ if (spec.default_port() == LCB_CONFIG_MCCOMPAT_PORT) {
91
+ defl_http = -1;
92
+ defl_cccp = LCB_CONFIG_MCCOMPAT_PORT;
93
+
94
+ } else if (has_ssl) {
95
+ defl_http = LCB_CONFIG_HTTP_SSL_PORT;
96
+ defl_cccp = LCB_CONFIG_MCD_SSL_PORT;
97
+ } else {
98
+ defl_http = LCB_CONFIG_HTTP_PORT;
99
+ defl_cccp = LCB_CONFIG_MCD_PORT;
100
+ }
101
+
102
+ for (size_t ii = 0; ii < spec.hosts().size(); ++ii) {
103
+ const Spechost &dh = spec.hosts()[ii];
104
+ add_bs_host(dh, defl_http, defl_cccp);
105
+ }
106
+ }
107
+
108
+ static lcb_error_t
109
+ init_providers(lcb_t obj, const Connspec &spec)
110
+ {
111
+ clconfig_provider *http, *cccp, *mcraw;
112
+ http = lcb_confmon_get_provider(obj->confmon, LCB_CLCONFIG_HTTP);
113
+ cccp = lcb_confmon_get_provider(obj->confmon, LCB_CLCONFIG_CCCP);
114
+ mcraw = lcb_confmon_get_provider(obj->confmon, LCB_CLCONFIG_MCRAW);
115
+
116
+ if (spec.default_port() == LCB_CONFIG_MCCOMPAT_PORT) {
117
+ lcb_confmon_set_provider_active(obj->confmon, LCB_CLCONFIG_MCRAW, 1);
118
+ mcraw->configure_nodes(mcraw, obj->mc_nodes);
119
+ return LCB_SUCCESS;
120
+ }
121
+
122
+ bool cccp_found = spec.is_bs_cccp();
123
+ bool http_found = spec.is_bs_http();
124
+ bool cccp_enabled = true, http_enabled = true;
125
+
126
+ if (cccp_found || http_found || spec.is_bs_file()) {
127
+ http_enabled = http_found;
128
+ cccp_enabled = cccp_found;
129
+
130
+ }
131
+
132
+ if (lcb_getenv_boolean("LCB_NO_CCCP")) {
133
+ cccp_enabled = false;
134
+ }
135
+ if (lcb_getenv_boolean("LCB_NO_HTTP")) {
136
+ http_enabled = false;
137
+ }
138
+ if (spec.is_bs_file()) {
139
+ cccp_found = false;
140
+ http_found = false;
141
+ }
142
+
143
+ if (cccp_enabled == 0 && http_enabled == 0) {
144
+ if (spec.is_bs_file()) {
145
+ /* If the 'file_only' provider is set, just assume something else
146
+ * will provide us with the config, and forget about it. */
147
+ clconfig_provider *prov = lcb_confmon_get_provider(obj->confmon, LCB_CLCONFIG_FILE);
148
+ if (prov && prov->enabled) {
149
+ return LCB_SUCCESS;
150
+ }
151
+ }
152
+ return LCB_BAD_ENVIRONMENT;
153
+ }
154
+
155
+ if (http_enabled) {
156
+ lcb_clconfig_http_enable(http);
157
+ lcb_clconfig_http_set_nodes(http, obj->ht_nodes);
158
+ } else {
159
+ lcb_confmon_set_provider_active(obj->confmon, LCB_CLCONFIG_HTTP, 0);
160
+ }
161
+
162
+ if (cccp_enabled && obj->type != LCB_TYPE_CLUSTER) {
163
+ lcb_clconfig_cccp_enable(cccp, obj);
164
+ lcb_clconfig_cccp_set_nodes(cccp, obj->mc_nodes);
165
+ } else {
166
+ lcb_confmon_set_provider_active(obj->confmon, LCB_CLCONFIG_CCCP, 0);
167
+ }
168
+ return LCB_SUCCESS;
169
+ }
170
+
171
+ static lcb_error_t
172
+ setup_ssl(lcb_t obj, const Connspec& params)
173
+ {
174
+ char optbuf[4096];
175
+ int env_policy = -1;
176
+ lcb_settings *settings = obj->settings;
177
+ lcb_error_t err = LCB_SUCCESS;
178
+
179
+ if (lcb_getenv_nonempty("LCB_SSL_CACERT", optbuf, sizeof optbuf)) {
180
+ lcb_log(LOGARGS(obj, INFO), "SSL CA certificate %s specified on environment", optbuf);
181
+ settings->certpath = strdup(optbuf);
182
+ }
183
+
184
+ if (lcb_getenv_nonempty("LCB_SSL_MODE", optbuf, sizeof optbuf)) {
185
+ if (sscanf(optbuf, "%d", &env_policy) != 1) {
186
+ lcb_log(LOGARGS(obj, ERR), "Invalid value for environment LCB_SSL. (%s)", optbuf);
187
+ return LCB_BAD_ENVIRONMENT;
188
+ } else {
189
+ lcb_log(LOGARGS(obj, INFO), "SSL modified from environment. Policy is 0x%x", env_policy);
190
+ settings->sslopts = env_policy;
191
+ }
192
+ }
193
+
194
+ if (settings->certpath == NULL && !params.certpath().empty()) {
195
+ settings->certpath = strdup(params.certpath().c_str());
196
+ }
197
+
198
+ if (env_policy == -1) {
199
+ settings->sslopts = params.sslopts();
200
+ }
201
+
202
+ if (settings->sslopts & LCB_SSL_ENABLED) {
203
+ if (! (settings->sslopts & LCB_SSL_NOGLOBALINIT)) {
204
+ lcbio_ssl_global_init();
205
+ } else {
206
+ lcb_log(LOGARGS(obj, INFO), "ssl=no_global_init. Not initializing openssl globals");
207
+ }
208
+ settings->ssl_ctx = lcbio_ssl_new(settings->certpath,
209
+ settings->sslopts & LCB_SSL_NOVERIFY, &err, settings);
210
+ if (!settings->ssl_ctx) {
211
+ return err;
212
+ }
213
+ }
214
+ return LCB_SUCCESS;
215
+ }
216
+
217
+ static lcb_error_t
218
+ apply_spec_options(lcb_t obj, const Connspec& params)
219
+ {
220
+ lcb_error_t err;
221
+ Connspec::Options::const_iterator ii = params.options().begin();
222
+ for (; ii != params.options().end(); ++ii) {
223
+ lcb_log(LOGARGS(obj, DEBUG), "Applying initial cntl %s=%s",
224
+ ii->first.c_str(), ii->second.c_str());
225
+
226
+ err = lcb_cntl_string(obj, ii->first.c_str(), ii->second.c_str());
227
+ if (err != LCB_SUCCESS) {
228
+ return err;
229
+ }
230
+ }
231
+ return LCB_SUCCESS;
232
+ }
233
+
234
+ static lcb_error_t
235
+ apply_env_options(lcb_t obj)
236
+ {
237
+ Connspec tmpspec;
238
+ const char *options = getenv("LCB_OPTIONS");
239
+
240
+ if (!options) {
241
+ return LCB_SUCCESS;
242
+ }
243
+
244
+ std::string tmp("couchbase://?");
245
+ tmp.append(options);
246
+ if (tmpspec.parse(tmp.c_str()) != LCB_SUCCESS) {
247
+ return LCB_BAD_ENVIRONMENT;
248
+ }
249
+ return apply_spec_options(obj, tmpspec);
250
+ }
251
+
252
+ lcb_error_t
253
+ lcb_init_providers2(lcb_t obj, const struct lcb_create_st2 *options)
254
+ {
255
+ Connspec params;
256
+ lcb_error_t err;
257
+ struct lcb_create_st cropts;
258
+ cropts.version = 2;
259
+ cropts.v.v2 = *options;
260
+ err = params.load(cropts);
261
+ if (err == LCB_SUCCESS) {
262
+ err = init_providers(obj, params);
263
+ }
264
+ return err;
265
+ }
266
+
267
+ lcb_error_t
268
+ lcb_reinit3(lcb_t obj, const char *connstr)
269
+ {
270
+ Connspec params;
271
+ lcb_error_t err;
272
+ const char *errmsg = NULL;
273
+ memset(&params, 0, sizeof params);
274
+ err = params.parse(connstr, &errmsg);
275
+
276
+ if (err != LCB_SUCCESS) {
277
+ lcb_log(LOGARGS(obj, ERROR), "Couldn't reinit: %s", errmsg);
278
+ }
279
+
280
+ if (params.sslopts() != LCBT_SETTING(obj, sslopts) ||
281
+ !params.certpath().empty()) {
282
+ lcb_log(LOGARGS(obj, WARN), "Ignoring SSL reinit options");
283
+ }
284
+
285
+ /* apply the options */
286
+ err = apply_spec_options(obj, params);
287
+ if (err != LCB_SUCCESS) {
288
+ goto GT_DONE;
289
+ }
290
+ obj->populate_nodes(params);
291
+ err = init_providers(obj, params);
292
+ if (err != LCB_SUCCESS) {
293
+ goto GT_DONE;
294
+ }
295
+
296
+ GT_DONE:
297
+ return err;
298
+ }
299
+
300
+ LIBCOUCHBASE_API
301
+ lcb_error_t lcb_create(lcb_t *instance,
302
+ const struct lcb_create_st *options)
303
+ {
304
+ Connspec spec;
305
+ struct lcb_io_opt_st *io_priv = NULL;
306
+ lcb_type_t type = LCB_TYPE_BUCKET;
307
+ lcb_t obj = NULL;
308
+ lcb_error_t err;
309
+ lcb_settings *settings;
310
+
311
+ if (options) {
312
+ io_priv = options->v.v0.io;
313
+ if (options->version > 0) {
314
+ type = options->v.v1.type;
315
+ }
316
+ err = spec.load(*options);
317
+ } else {
318
+ const char *errmsg;
319
+ err = spec.parse("couchbase://", &errmsg);
320
+ }
321
+ if (err != LCB_SUCCESS) {
322
+ goto GT_DONE;
323
+ }
324
+
325
+ if ((obj = (lcb_t)calloc(1, sizeof(*obj))) == NULL) {
326
+ err = LCB_CLIENT_ENOMEM;
327
+ goto GT_DONE;
328
+ }
329
+ if (!(settings = lcb_settings_new())) {
330
+ err = LCB_CLIENT_ENOMEM;
331
+ goto GT_DONE;
332
+ }
333
+
334
+ /* initialize the settings */
335
+ obj->type = type;
336
+ obj->settings = settings;
337
+
338
+ settings->bucket = strdup(spec.bucket().c_str());
339
+ if ((err = settings->auth->init(spec.username(), spec.bucket(),
340
+ spec.password(), type)) != LCB_SUCCESS) {
341
+ goto GT_DONE;
342
+ }
343
+
344
+ settings->logger = lcb_init_console_logger();
345
+ settings->iid = lcb_instance_index++;
346
+ if (spec.loglevel()) {
347
+ lcb_U32 val = spec.loglevel();
348
+ lcb_cntl(obj, LCB_CNTL_SET, LCB_CNTL_CONLOGGER_LEVEL, &val);
349
+ }
350
+
351
+ lcb_log(LOGARGS(obj, INFO), "Version=%s, Changeset=%s", lcb_get_version(NULL), LCB_VERSION_CHANGESET);
352
+ lcb_log(LOGARGS(obj, INFO), "Effective connection string: %s. Bucket=%s", spec.connstr().c_str(), settings->bucket);
353
+
354
+ if (io_priv == NULL) {
355
+ lcb_io_opt_t ops;
356
+ if ((err = lcb_create_io_ops(&ops, NULL)) != LCB_SUCCESS) {
357
+ goto GT_DONE;
358
+ }
359
+ io_priv = ops;
360
+ LCB_IOPS_BASEFLD(io_priv, need_cleanup) = 1;
361
+ }
362
+
363
+ obj->cmdq.cqdata = obj;
364
+ obj->iotable = lcbio_table_new(io_priv);
365
+ obj->memd_sockpool = lcbio_mgr_create(settings, obj->iotable);
366
+ obj->http_sockpool = lcbio_mgr_create(settings, obj->iotable);
367
+ obj->memd_sockpool->maxidle = 1;
368
+ obj->memd_sockpool->tmoidle = 10000000;
369
+ obj->http_sockpool->maxidle = 1;
370
+ obj->http_sockpool->tmoidle = 10000000;
371
+ obj->confmon = lcb_confmon_create(settings, obj->iotable);
372
+ obj->ht_nodes = hostlist_create();
373
+ obj->mc_nodes = hostlist_create();
374
+ obj->retryq = lcb_retryq_new(&obj->cmdq, obj->iotable, obj->settings);
375
+ obj->n1ql_cache = lcb_n1qlcache_create();
376
+ lcb_initialize_packet_handlers(obj);
377
+ lcb_aspend_init(&obj->pendops);
378
+
379
+ if ((err = setup_ssl(obj, spec)) != LCB_SUCCESS) {
380
+ goto GT_DONE;
381
+ }
382
+
383
+ if ((err = apply_spec_options(obj, spec)) != LCB_SUCCESS) {
384
+ goto GT_DONE;
385
+ }
386
+ if ((err = apply_env_options(obj)) != LCB_SUCCESS) {
387
+ goto GT_DONE;
388
+ }
389
+
390
+ obj->populate_nodes(spec);
391
+ err = init_providers(obj, spec);
392
+ if (err != LCB_SUCCESS) {
393
+ lcb_destroy(obj);
394
+ return err;
395
+ }
396
+
397
+ obj->last_error = err;
398
+ GT_DONE:
399
+ if (err != LCB_SUCCESS && obj) {
400
+ lcb_destroy(obj);
401
+ *instance = NULL;
402
+ } else {
403
+ *instance = obj;
404
+ }
405
+ return err;
406
+ }
407
+
408
+ typedef struct {
409
+ lcbio_pTABLE table;
410
+ lcbio_pTIMER timer;
411
+ int stopped;
412
+ } SYNCDTOR;
413
+
414
+ static void
415
+ sync_dtor_cb(void *arg)
416
+ {
417
+ SYNCDTOR *sd = (SYNCDTOR*)arg;
418
+ if (sd->table->refcount == 2) {
419
+ lcbio_timer_destroy(sd->timer);
420
+ IOT_STOP(sd->table);
421
+ sd->stopped = 1;
422
+ }
423
+ }
424
+
425
+ LIBCOUCHBASE_API
426
+ void lcb_destroy(lcb_t instance)
427
+ {
428
+ #define DESTROY(fn,fld) if(instance->fld){fn(instance->fld);instance->fld=NULL;}
429
+
430
+ lcb_size_t ii;
431
+ hashset_t hs;
432
+ lcb_ASPEND *po = &instance->pendops;
433
+
434
+ DESTROY(lcb_clconfig_decref, cur_configinfo);
435
+ instance->cmdq.config = NULL;
436
+
437
+ lcb_bootstrap_destroy(instance);
438
+ DESTROY(hostlist_destroy, ht_nodes);
439
+ DESTROY(hostlist_destroy, mc_nodes);
440
+ if ((hs = lcb_aspend_get(po, LCB_PENDTYPE_TIMER))) {
441
+ for (ii = 0; ii < hs->capacity; ++ii) {
442
+ if (hs->items[ii] > 1) {
443
+ lcb__timer_destroy_nowarn(instance, (lcb_timer_t)hs->items[ii]);
444
+ }
445
+ }
446
+ }
447
+
448
+ if ((hs = lcb_aspend_get(po, LCB_PENDTYPE_DURABILITY))) {
449
+ struct lcb_DURSET_st **dset_list;
450
+ lcb_size_t nitems = hashset_num_items(hs);
451
+ dset_list = (struct lcb_DURSET_st **)hashset_get_items(hs, NULL);
452
+ if (dset_list) {
453
+ for (ii = 0; ii < nitems; ii++) {
454
+ lcbdur_destroy(dset_list[ii]);
455
+ }
456
+ free(dset_list);
457
+ }
458
+ }
459
+
460
+ for (ii = 0; ii < LCBT_NSERVERS(instance); ++ii) {
461
+ mc_SERVER *server = LCBT_GET_SERVER(instance, ii);
462
+ mcserver_close(server);
463
+ }
464
+
465
+ if ((hs = lcb_aspend_get(po, LCB_PENDTYPE_HTTP))) {
466
+ for (ii = 0; ii < hs->capacity; ++ii) {
467
+ if (hs->items[ii] > 1) {
468
+ lcb_http_request_t htreq = (lcb_http_request_t)hs->items[ii];
469
+
470
+ /* Prevents lcb's globals from being modified during destruction */
471
+ lcb_htreq_block_callback(htreq);
472
+ lcb_htreq_finish(instance, htreq, LCB_ERROR);
473
+ }
474
+ }
475
+ }
476
+ DESTROY(lcb_retryq_destroy, retryq);
477
+ DESTROY(lcb_confmon_destroy, confmon);
478
+ DESTROY(lcbio_mgr_destroy, memd_sockpool);
479
+ DESTROY(lcbio_mgr_destroy, http_sockpool);
480
+ DESTROY(lcb_vbguess_destroy, vbguess);
481
+ DESTROY(lcb_n1qlcache_destroy, n1ql_cache);
482
+
483
+ mcreq_queue_cleanup(&instance->cmdq);
484
+ lcb_aspend_cleanup(po);
485
+
486
+ if (instance->iotable && instance->iotable->refcount > 1 &&
487
+ instance->settings && instance->settings->syncdtor) {
488
+ /* create an async object */
489
+ SYNCDTOR sd;
490
+ sd.table = instance->iotable;
491
+ sd.timer = lcbio_timer_new(instance->iotable, &sd, sync_dtor_cb);
492
+ sd.stopped = 0;
493
+ lcbio_async_signal(sd.timer);
494
+ lcb_log(LOGARGS(instance, WARN), "Running event loop to drain any pending I/O events");
495
+ do {
496
+ IOT_START(instance->iotable);
497
+ } while (!sd.stopped);
498
+ }
499
+
500
+ DESTROY(lcbio_table_unref, iotable);
501
+ DESTROY(lcb_settings_unref, settings);
502
+ DESTROY(lcb_histogram_destroy, kv_timings);
503
+ if (instance->scratch) {
504
+ delete instance->scratch;
505
+ instance->scratch = NULL;
506
+ }
507
+
508
+ free(instance->dcpinfo);
509
+ memset(instance, 0xff, sizeof(*instance));
510
+ free(instance);
511
+ #undef DESTROY
512
+ }
513
+
514
+ static void
515
+ destroy_cb(void *arg)
516
+ {
517
+ lcb_t instance = (lcb_t)arg;
518
+ lcbio_timer_destroy(instance->dtor_timer);
519
+ lcb_destroy(instance);
520
+ }
521
+
522
+ LIBCOUCHBASE_API
523
+ void
524
+ lcb_destroy_async(lcb_t instance, const void *arg)
525
+ {
526
+ instance->dtor_timer = lcbio_timer_new(instance->iotable, instance, destroy_cb);
527
+ instance->settings->dtorarg = (void *)arg;
528
+ lcbio_async_signal(instance->dtor_timer);
529
+ }
530
+
531
+ LIBCOUCHBASE_API
532
+ lcb_error_t lcb_connect(lcb_t instance)
533
+ {
534
+ lcb_error_t err = lcb_bootstrap_common(instance, LCB_BS_REFRESH_INITIAL);
535
+ if (err == LCB_SUCCESS) {
536
+ SYNCMODE_INTERCEPT(instance);
537
+ } else {
538
+ return err;
539
+ }
540
+ }
541
+
542
+ LIBCOUCHBASE_API
543
+ void *lcb_mem_alloc(lcb_size_t size)
544
+ {
545
+ return malloc(size);
546
+ }
547
+
548
+ LIBCOUCHBASE_API
549
+ void lcb_mem_free(void *ptr)
550
+ {
551
+ free(ptr);
552
+ }
553
+
554
+ LCB_INTERNAL_API
555
+ void lcb_run_loop(lcb_t instance)
556
+ {
557
+ IOT_START(instance->iotable);
558
+ }
559
+
560
+ LCB_INTERNAL_API
561
+ void lcb_stop_loop(lcb_t instance)
562
+ {
563
+ IOT_STOP(instance->iotable);
564
+ }
565
+
566
+ void
567
+ lcb_aspend_init(lcb_ASPEND *ops)
568
+ {
569
+ unsigned ii;
570
+ for (ii = 0; ii < LCB_PENDTYPE_MAX; ++ii) {
571
+ ops->items[ii] = hashset_create();
572
+ }
573
+ ops->count = 0;
574
+ }
575
+
576
+ void
577
+ lcb_aspend_add(lcb_ASPEND *ops, lcb_ASPENDTYPE type, const void *item)
578
+ {
579
+ ops->count++;
580
+ if (type == LCB_PENDTYPE_COUNTER) {
581
+ return;
582
+ }
583
+ hashset_add(ops->items[type], (void *)item);
584
+ }
585
+
586
+ void
587
+ lcb_aspend_del(lcb_ASPEND *ops, lcb_ASPENDTYPE type, const void *item)
588
+ {
589
+ if (type == LCB_PENDTYPE_COUNTER) {
590
+ ops->count--;
591
+ return;
592
+ }
593
+ if (hashset_remove(ops->items[type], (void *)item)) {
594
+ ops->count--;
595
+ }
596
+ }
597
+
598
+ void
599
+ lcb_aspend_cleanup(lcb_ASPEND *ops)
600
+ {
601
+ unsigned ii;
602
+ for (ii = 0; ii < LCB_PENDTYPE_MAX; ii++) {
603
+ hashset_destroy(ops->items[ii]);
604
+ }
605
+ }
606
+
607
+ LIBCOUCHBASE_API
608
+ void
609
+ lcb_sched_enter(lcb_t instance)
610
+ {
611
+ mcreq_sched_enter(&instance->cmdq);
612
+ }
613
+ LIBCOUCHBASE_API
614
+ void
615
+ lcb_sched_leave(lcb_t instance)
616
+ {
617
+ mcreq_sched_leave(&instance->cmdq, LCBT_SETTING(instance, sched_implicit_flush));
618
+ }
619
+ LIBCOUCHBASE_API
620
+ void
621
+ lcb_sched_fail(lcb_t instance)
622
+ {
623
+ mcreq_sched_fail(&instance->cmdq);
624
+ }
625
+
626
+ LIBCOUCHBASE_API
627
+ int
628
+ lcb_supports_feature(int n)
629
+ {
630
+ if (n == LCB_SUPPORTS_SNAPPY) {
631
+ #ifdef LCB_NO_SNAPPY
632
+ return 0;
633
+ #else
634
+ return 1;
635
+ #endif
636
+ }
637
+ if (n == LCB_SUPPORTS_SSL) {
638
+ return lcbio_ssl_supported();
639
+ } else {
640
+ return 0;
641
+ }
642
+ }
643
+
644
+
645
+ LCB_INTERNAL_API void lcb_loop_ref(lcb_t instance) {
646
+ lcb_aspend_add(&instance->pendops, LCB_PENDTYPE_COUNTER, NULL);
647
+ }
648
+ LCB_INTERNAL_API void lcb_loop_unref(lcb_t instance) {
649
+ lcb_aspend_del(&instance->pendops, LCB_PENDTYPE_COUNTER, NULL);
650
+ lcb_maybe_breakout(instance);
651
+ }
652
+
653
+ LIBCOUCHBASE_API
654
+ lcb_error_t lcb_enable_timings(lcb_t instance)
655
+ {
656
+ if (instance->kv_timings != NULL) {
657
+ return LCB_KEY_EEXISTS;
658
+ }
659
+ instance->kv_timings = lcb_histogram_create();
660
+ return instance->kv_timings == NULL ? LCB_CLIENT_ENOMEM : LCB_SUCCESS;
661
+ }
662
+
663
+ LIBCOUCHBASE_API
664
+ lcb_error_t lcb_disable_timings(lcb_t instance)
665
+ {
666
+ if (instance->kv_timings == NULL) {
667
+ return LCB_KEY_ENOENT;
668
+ }
669
+ lcb_histogram_destroy(instance->kv_timings);
670
+ instance->kv_timings = NULL;
671
+ return LCB_SUCCESS;
672
+ }
673
+
674
+ typedef struct {
675
+ lcb_t instance;
676
+ const void *real_cookie;
677
+ lcb_timings_callback real_cb;
678
+ } timings_wrapper;
679
+
680
+ static void
681
+ timings_wrapper_callback(const void *cookie, lcb_timeunit_t unit, lcb_U32 start,
682
+ lcb_U32 end, lcb_U32 val, lcb_U32 max)
683
+ {
684
+ const timings_wrapper *wrap = (const timings_wrapper*)cookie;
685
+ wrap->real_cb(wrap->instance, wrap->real_cookie, unit, start, end, val, max);
686
+ }
687
+
688
+ LIBCOUCHBASE_API
689
+ lcb_error_t
690
+ lcb_get_timings(lcb_t instance, const void *cookie, lcb_timings_callback cb)
691
+ {
692
+ timings_wrapper wrap;
693
+ wrap.instance = instance;
694
+ wrap.real_cookie = cookie;
695
+ wrap.real_cb = cb;
696
+
697
+ if (!instance->kv_timings) {
698
+ return LCB_KEY_ENOENT;
699
+ }
700
+ lcb_histogram_read(instance->kv_timings, &wrap, timings_wrapper_callback);
701
+ return LCB_SUCCESS;
702
+ }
703
+
704
+ LIBCOUCHBASE_API
705
+ const char *lcb_strerror(lcb_t instance, lcb_error_t error)
706
+ {
707
+ #define X(c, v, t, s) if (error == c) { return s; }
708
+ LCB_XERR(X)
709
+ #undef X
710
+
711
+ (void)instance;
712
+ return "Unknown error";
713
+ }
714
+
715
+ LIBCOUCHBASE_API
716
+ int lcb_get_errtype(lcb_error_t err)
717
+ {
718
+ #define X(c, v, t, s) if (err == c) { return t; }
719
+ LCB_XERR(X)
720
+ #undef X
721
+ return -1;
722
+ }