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,244 @@
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
+ #ifndef LIBCOUCHBASE_INTERNAL_H
18
+ #define LIBCOUCHBASE_INTERNAL_H 1
19
+
20
+ /* System/Standard includes */
21
+ #include "config.h"
22
+ #include <errno.h>
23
+ #include <stddef.h>
24
+ #include <stdio.h>
25
+ #include <stdlib.h>
26
+ #include <string.h>
27
+ #include <sys/types.h>
28
+ #include <sys/stat.h>
29
+ #include <ctype.h>
30
+
31
+ /* Global Project Dependencies/Includes */
32
+ #include <memcached/protocol_binary.h>
33
+ #include <libcouchbase/couchbase.h>
34
+ #include <libcouchbase/vbucket.h>
35
+ #include <libcouchbase/api3.h>
36
+ #include <libcouchbase/pktfwd.h>
37
+
38
+ /* Internal dependencies */
39
+ #include <lcbio/lcbio.h>
40
+ #include <strcodecs/strcodecs.h>
41
+ #include "mcserver/mcserver.h"
42
+ #include "mc/mcreq.h"
43
+ #include "settings.h"
44
+
45
+ /* lcb_t-specific includes */
46
+ #include "retryq.h"
47
+ #include "aspend.h"
48
+ #include "bootstrap.h"
49
+
50
+ /* n1ql cache */
51
+ #include "n1ql/n1ql-internal.h"
52
+
53
+ #include "hostlist.h"
54
+
55
+ #ifdef __cplusplus
56
+ namespace lcb {
57
+ class Connspec;
58
+ struct Spechost;
59
+ }
60
+ extern "C" {
61
+ #endif
62
+
63
+ struct lcb_string_st;
64
+
65
+ struct lcb_callback_st {
66
+ lcb_RESPCALLBACK v3callbacks[LCB_CALLBACK__MAX];
67
+ lcb_get_callback get;
68
+ lcb_store_callback store;
69
+ lcb_arithmetic_callback arithmetic;
70
+ lcb_observe_callback observe;
71
+ lcb_remove_callback remove;
72
+ lcb_stat_callback stat;
73
+ lcb_version_callback version;
74
+ lcb_touch_callback touch;
75
+ lcb_flush_callback flush;
76
+ lcb_error_callback error;
77
+ lcb_http_complete_callback http_complete;
78
+ lcb_http_data_callback http_data;
79
+ lcb_unlock_callback unlock;
80
+ lcb_configuration_callback configuration;
81
+ lcb_verbosity_callback verbosity;
82
+ lcb_durability_callback durability;
83
+ lcb_errmap_callback errmap;
84
+ lcb_bootstrap_callback bootstrap;
85
+ lcb_pktfwd_callback pktfwd;
86
+ lcb_pktflushed_callback pktflushed;
87
+ };
88
+
89
+ struct lcb_confmon_st;
90
+ struct lcb_BOOTSTRAP;
91
+ struct lcb_GUESSVB_st;
92
+
93
+ #ifdef __cplusplus
94
+ #include <string>
95
+ typedef std::string* lcb_pSCRATCHBUF;
96
+ #else
97
+ typedef struct lcb_SCRATCHBUF* lcb_pSCRATCHBUF;
98
+ #endif
99
+
100
+ struct lcb_st {
101
+ mc_CMDQUEUE cmdq; /**< Base command queue object */
102
+ const void *cookie; /**< User defined pointer */
103
+ struct lcb_confmon_st *confmon; /**< Cluster config manager */
104
+ hostlist_t mc_nodes; /**< List of current memcached endpoints */
105
+ hostlist_t ht_nodes; /**< List of current management endpoints */
106
+ struct clconfig_info_st *cur_configinfo; /**< Pointer to current config */
107
+ struct lcb_BOOTSTRAP *bootstrap; /**< Bootstrapping state */
108
+ struct lcb_callback_st callbacks; /**< Callback table */
109
+ lcb_HISTOGRAM *kv_timings; /**< Histogram object (for timing) */
110
+ lcb_ASPEND pendops; /**< Pending asynchronous requests */
111
+ int wait; /**< Are we in lcb_wait() ?*/
112
+ lcbio_MGR *memd_sockpool; /**< Connection pool for memcached connections */
113
+ lcbio_MGR *http_sockpool; /**< Connection pool for capi connections */
114
+ lcb_error_t last_error; /**< Seldom used. Mainly for bootstrap */
115
+ lcb_settings *settings; /**< User settings */
116
+ lcbio_pTABLE iotable; /**< IO Routine table */
117
+ lcb_RETRYQ *retryq; /**< Retry queue for failed operations */
118
+ lcb_pSCRATCHBUF scratch; /**< Generic buffer space */
119
+ struct lcb_GUESSVB_st *vbguess; /**< Heuristic masters for vbuckets */
120
+ lcb_N1QLCACHE *n1ql_cache;
121
+ lcb_MUTATION_TOKEN *dcpinfo; /**< Mapping of known vbucket to {uuid,seqno} info */
122
+ lcbio_pTIMER dtor_timer; /**< Asynchronous destruction timer */
123
+ int type; /**< Type of connection */
124
+
125
+ #ifdef __cplusplus
126
+ lcb_settings* getSettings() { return settings; }
127
+ lcbio_pTABLE getIOT() { return iotable; }
128
+ inline void add_bs_host(const char *host, int port, unsigned bstype);
129
+ inline void add_bs_host(const lcb::Spechost& host, int defl_http, int defl_cccp);
130
+ inline void populate_nodes(const lcb::Connspec&);
131
+ #endif
132
+ };
133
+
134
+ #define LCBT_VBCONFIG(instance) (instance)->cmdq.config
135
+ #define LCBT_NSERVERS(instance) (instance)->cmdq.npipelines
136
+ #define LCBT_NDATASERVERS(instance) LCBVB_NDATASERVERS(LCBT_VBCONFIG(instance))
137
+ #define LCBT_NREPLICAS(instance) LCBVB_NREPLICAS(LCBT_VBCONFIG(instance))
138
+ #define LCBT_GET_SERVER(instance, ix) (mc_SERVER *)(instance)->cmdq.pipelines[ix]
139
+ #define LCBT_SETTING(instance, name) (instance)->settings->name
140
+
141
+ void lcb_initialize_packet_handlers(lcb_t instance);
142
+
143
+ LCB_INTERNAL_API
144
+ void lcb_maybe_breakout(lcb_t instance);
145
+
146
+ struct clconfig_info_st;
147
+ void lcb_update_vbconfig(lcb_t instance, struct clconfig_info_st *config);
148
+ /**
149
+ * Hashtable wrappers
150
+ */
151
+ genhash_t *lcb_hashtable_nc_new(lcb_size_t est);
152
+ genhash_t *lcb_hashtable_szt_new(lcb_size_t est);
153
+
154
+ struct lcb_DURSET_st;
155
+ void lcbdur_destroy(struct lcb_DURSET_st *dset);
156
+ void lcbdur_maybe_schedfail(struct lcb_DURSET_st *dset);
157
+
158
+ lcb_error_t lcb_iops_cntl_handler(int mode, lcb_t instance, int cmd, void *arg);
159
+
160
+ /**
161
+ * These two routines define portable ways to get environment variables
162
+ * on various platforms.
163
+ *
164
+ * They are mainly useful for Windows compatibility.
165
+ */
166
+ LCB_INTERNAL_API
167
+ int lcb_getenv_nonempty(const char *key, char *buf, lcb_size_t len);
168
+ LCB_INTERNAL_API
169
+ int lcb_getenv_boolean(const char *key);
170
+ LCB_INTERNAL_API
171
+ int lcb_getenv_nonempty_multi(char *buf, lcb_size_t nbuf, ...);
172
+ int lcb_getenv_boolean_multi(const char *key, ...);
173
+ LCB_INTERNAL_API
174
+ const char *lcb_get_tmpdir(void);
175
+
176
+ /**
177
+ * Initialize the socket subsystem. For windows, this initializes Winsock.
178
+ * On Unix, this does nothing
179
+ */
180
+ LCB_INTERNAL_API
181
+ lcb_error_t lcb_initialize_socket_subsystem(void);
182
+
183
+ lcb_error_t lcb_init_providers2(lcb_t obj,
184
+ const struct lcb_create_st2 *e_options);
185
+ lcb_error_t lcb_reinit3(lcb_t obj, const char *connstr);
186
+
187
+
188
+ LCB_INTERNAL_API
189
+ mc_SERVER *
190
+ lcb_find_server_by_host(lcb_t instance, const lcb_host_t *host);
191
+
192
+
193
+ LCB_INTERNAL_API
194
+ mc_SERVER *
195
+ lcb_find_server_by_index(lcb_t instance, int ix);
196
+
197
+ LCB_INTERNAL_API
198
+ lcb_error_t
199
+ lcb_getconfig(lcb_t instance, const void *cookie, mc_SERVER *server);
200
+
201
+ int
202
+ lcb_should_retry(lcb_settings *settings, mc_PACKET *pkt, lcb_error_t err);
203
+
204
+ lcb_error_t
205
+ lcb__synchandler_return(lcb_t instance);
206
+
207
+ lcb_RESPCALLBACK
208
+ lcb_find_callback(lcb_t instance, lcb_CALLBACKTYPE cbtype);
209
+
210
+ /* These two functions exist to allow the tests to keep the loop alive while
211
+ * scheduling other operations asynchronously */
212
+
213
+ LCB_INTERNAL_API void lcb_loop_ref(lcb_t instance);
214
+ LCB_INTERNAL_API void lcb_loop_unref(lcb_t instance);
215
+
216
+ /* To suppress compiler warnings */
217
+ LCB_INTERNAL_API void lcb__timer_destroy_nowarn(lcb_t instance, lcb_timer_t timer);
218
+
219
+ #define SYNCMODE_INTERCEPT(o) \
220
+ if (LCBT_SETTING(o, syncmode) == LCB_ASYNCHRONOUS) { \
221
+ return LCB_SUCCESS; \
222
+ } else { \
223
+ return lcb__synchandler_return(o); \
224
+ }
225
+
226
+
227
+ #define MAYBE_SCHEDLEAVE(o) \
228
+ if (!o->cmdq.ctxenter) { \
229
+ lcb_sched_leave(o); \
230
+ }
231
+
232
+ #define LCB_SCHED_ADD(instance, pl, pkt) \
233
+ mcreq_sched_add(pl, pkt); \
234
+ MAYBE_SCHEDLEAVE(instance)
235
+
236
+ void lcb_vbguess_newconfig(lcb_t instance, lcbvb_CONFIG *cfg, struct lcb_GUESSVB_st *guesses);
237
+ int lcb_vbguess_remap(lcb_t instance, int vbid, int bad);
238
+ #define lcb_vbguess_destroy(p) free(p)
239
+
240
+ #ifdef __cplusplus
241
+ }
242
+ #endif
243
+
244
+ #endif
@@ -0,0 +1,575 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2011-2012 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #define LCB_IOPS_V12_NO_DEPRECATE 1 /* For Ruby */
19
+
20
+ #include "internal.h"
21
+ #include "plugins/io/select/select_io_opts.h"
22
+ #include <libcouchbase/plugins/io/bsdio-inl.c>
23
+
24
+ #ifdef LCB_EMBED_PLUGIN_LIBEVENT
25
+ LIBCOUCHBASE_API lcb_error_t lcb_create_libevent_io_opts(int, lcb_io_opt_t*,void*);
26
+ #endif
27
+
28
+ typedef lcb_error_t (*create_func_t)(int version, lcb_io_opt_t *io, void *cookie);
29
+
30
+
31
+ #ifdef _WIN32
32
+ LIBCOUCHBASE_API
33
+ lcb_error_t lcb_iocp_new_iops(int, lcb_io_opt_t *, void *);
34
+ #define DEFAULT_IOPS LCB_IO_OPS_WINIOCP
35
+ #else
36
+ #define DEFAULT_IOPS LCB_IO_OPS_LIBEVENT
37
+ #endif
38
+
39
+
40
+ typedef struct {
41
+ /** The "base" name of the plugin */
42
+ const char *base;
43
+
44
+ /** Corresponding type */
45
+ lcb_io_ops_type_t iotype;
46
+
47
+ /** Filename */
48
+ const char *soname;
49
+
50
+ /** Symbol used to initialize the plugin */
51
+ const char *symbol;
52
+
53
+ /** Function to create the iops (if builtin) */
54
+ create_func_t create;
55
+
56
+ /** Static buffers if reading from the environment */
57
+ char s_soname[PATH_MAX];
58
+ char s_symbol[256];
59
+ } plugin_info;
60
+
61
+
62
+ #ifdef __APPLE__
63
+ #define PLUGIN_SO(NAME) "libcouchbase_"NAME".dylib"
64
+ #elif defined(_WIN32)
65
+ /** Trailing period intentional. See docs for LoadLibrary */
66
+ #if (_DEBUG && _MSC_VER)
67
+ #define PLUGIN_SO(NAME) "libcouchbase_"NAME"_d.dll."
68
+ #else
69
+ #define PLUGIN_SO(NAME) "libcouchbase_"NAME".dll."
70
+ #endif /* _DEBUG */
71
+ #else
72
+ #define PLUGIN_SO(NAME) "libcouchbase_"NAME".so"
73
+ #endif
74
+
75
+ #define PLUGIN_SYMBOL(NAME) "lcb_create_"NAME"_io_opts"
76
+
77
+ #define BUILTIN_CORE(name, type, create) \
78
+ { name, type, NULL, NULL, create, { 0 }, { 0 } }
79
+
80
+ #define BUILTIN_DL(name, type) \
81
+ { name, type, PLUGIN_SO(name), PLUGIN_SYMBOL(name), NULL, { 0 }, { 0 } }
82
+
83
+ static plugin_info builtin_plugins[] = {
84
+ BUILTIN_CORE("select", LCB_IO_OPS_SELECT, lcb_create_select_io_opts),
85
+ BUILTIN_CORE("winsock", LCB_IO_OPS_WINSOCK, lcb_create_select_io_opts),
86
+
87
+ #ifdef _WIN32
88
+ BUILTIN_CORE("iocp", LCB_IO_OPS_WINIOCP, lcb_iocp_new_iops),
89
+ #endif
90
+
91
+ #ifdef LCB_EMBED_PLUGIN_LIBEVENT
92
+ BUILTIN_CORE("libevent", LCB_IO_OPS_LIBEVENT, lcb_create_libevent_io_opts),
93
+ #else
94
+ BUILTIN_DL("libevent", LCB_IO_OPS_LIBEVENT),
95
+ #endif
96
+
97
+ BUILTIN_DL("libev", LCB_IO_OPS_LIBEV),
98
+ BUILTIN_DL("libuv", LCB_IO_OPS_LIBUV),
99
+
100
+ { NULL, LCB_IO_OPS_INVALID, NULL, NULL, NULL, { 0 }, { 0 } }
101
+ };
102
+
103
+ /**
104
+ * Checks the environment for plugin information.
105
+ * Returns:
106
+ * 1 information found and valid
107
+ * 0 not found
108
+ * -1 error
109
+ */
110
+ static int get_env_plugin_info(plugin_info *info)
111
+ {
112
+
113
+ plugin_info *cur = NULL;
114
+ memset(info, 0, sizeof(*info));
115
+
116
+ if (!lcb_getenv_nonempty_multi(info->s_soname, sizeof(info->s_soname),
117
+ "LIBCOUCHBASE_EVENT_PLUGIN_NAME", "LCB_IOPS_NAME", NULL)) {
118
+ return 0;
119
+ }
120
+
121
+ for (cur = builtin_plugins; cur->base; cur++) {
122
+ if (strlen(cur->base) != strlen(info->s_soname)) {
123
+ continue;
124
+ }
125
+
126
+ if (strcmp(cur->base, info->s_soname) == 0) {
127
+ memcpy(info, cur, sizeof(*cur));
128
+ return 1;
129
+ }
130
+ }
131
+
132
+ if (!lcb_getenv_nonempty_multi(info->s_symbol, sizeof(info->s_symbol),
133
+ "LIBCOUCHBASE_EVENT_PLUGIN_SYMBOL", "LCB_IOPS_SYMBOL", NULL)) {
134
+ return -1;
135
+ }
136
+
137
+ info->soname = info->s_soname;
138
+ info->symbol = info->s_symbol;
139
+ return 1;
140
+ }
141
+
142
+ static plugin_info *find_plugin_info(lcb_io_ops_type_t iotype)
143
+ {
144
+ plugin_info *cur;
145
+
146
+ if (iotype == LCB_IO_OPS_DEFAULT) {
147
+ iotype = DEFAULT_IOPS;
148
+ }
149
+
150
+ for (cur = builtin_plugins; cur->base; cur++) {
151
+ if (cur->iotype == iotype) {
152
+ return cur;
153
+ }
154
+ }
155
+ return NULL;
156
+ }
157
+
158
+ static void options_from_info(struct lcb_create_io_ops_st *opts,
159
+ const plugin_info *info)
160
+ {
161
+ void *cookie;
162
+
163
+ switch (opts->version) {
164
+ case 0:
165
+ cookie = opts->v.v0.cookie;
166
+ break;
167
+ case 1:
168
+ cookie = opts->v.v1.cookie;
169
+ break;
170
+ case 2:
171
+ cookie = opts->v.v2.cookie;
172
+ break;
173
+ default:
174
+ lcb_assert("unknown options version" && 0);
175
+ cookie = NULL;
176
+ }
177
+
178
+ if (info->create) {
179
+ opts->version = 2;
180
+ opts->v.v2.create = info->create;
181
+ opts->v.v2.cookie = cookie;
182
+ return;
183
+ }
184
+
185
+ opts->version = 1;
186
+ opts->v.v1.sofile = info->soname;
187
+ opts->v.v1.symbol = info->symbol;
188
+ opts->v.v1.cookie = cookie;
189
+ }
190
+
191
+ static lcb_error_t create_v2(lcb_io_opt_t *io,
192
+ const struct lcb_create_io_ops_st *options);
193
+
194
+ struct plugin_st {
195
+ void *dlhandle;
196
+ union {
197
+ create_func_t create;
198
+ void *voidptr;
199
+ } func;
200
+ };
201
+
202
+ #ifndef _WIN32
203
+ static lcb_error_t get_create_func(const char *image,
204
+ const char *symbol,
205
+ struct plugin_st *plugin,
206
+ int do_warn)
207
+ {
208
+ void *dlhandle = dlopen(image, RTLD_NOW | RTLD_LOCAL);
209
+ if (dlhandle == NULL) {
210
+ if (do_warn) {
211
+ fprintf(stderr,
212
+ "[libcouchbase] dlopen of %s failed with '%s'\n",
213
+ image, dlerror());
214
+ }
215
+ return LCB_DLOPEN_FAILED;
216
+ }
217
+
218
+ memset(plugin, 0, sizeof(*plugin));
219
+ plugin->func.create = NULL;
220
+ plugin->func.voidptr = dlsym(dlhandle, symbol);
221
+
222
+ if (plugin->func.voidptr == NULL) {
223
+ if (do_warn) {
224
+ fprintf(stderr,
225
+ "[libcouchbase] dlsym (%s) -> (%s) failed: %s\n",
226
+ image, symbol, dlerror());
227
+ }
228
+ dlclose(dlhandle);
229
+ dlhandle = NULL;
230
+ return LCB_DLSYM_FAILED;
231
+
232
+ } else {
233
+ plugin->dlhandle = dlhandle;
234
+ }
235
+ return LCB_SUCCESS;
236
+ }
237
+
238
+ static void close_dlhandle(void *handle)
239
+ {
240
+ dlclose(handle);
241
+ }
242
+ #else
243
+ static lcb_error_t get_create_func(const char *image,
244
+ const char *symbol,
245
+ struct plugin_st *plugin,
246
+ int do_warn)
247
+ {
248
+ HMODULE hLibrary = LoadLibrary(image);
249
+ FARPROC hFunction;
250
+
251
+ memset(plugin, 0, sizeof(*plugin));
252
+
253
+ if (!hLibrary) {
254
+ if (do_warn) {
255
+ fprintf(stderr, "LoadLibrary of %s failed with code %d\n",
256
+ image, (int)GetLastError());
257
+ }
258
+ return LCB_DLOPEN_FAILED;
259
+ }
260
+
261
+ hFunction = GetProcAddress(hLibrary, symbol);
262
+ if (!hFunction) {
263
+ if (do_warn) {
264
+ fprintf(stderr, "GetProcAddress (%s) -> (%s) failed with code %d\n",
265
+ image, symbol, (int)GetLastError());
266
+ }
267
+ FreeLibrary(hLibrary);
268
+ return LCB_DLSYM_FAILED;
269
+ }
270
+
271
+ plugin->func.create = (create_func_t)hFunction;
272
+ plugin->dlhandle = hLibrary;
273
+ return LCB_SUCCESS;
274
+ }
275
+
276
+ static void close_dlhandle(void *handle)
277
+ {
278
+ FreeLibrary((HMODULE)handle);
279
+ }
280
+ #endif
281
+
282
+ static int want_dl_debug = 0; /* global variable */
283
+ static lcb_error_t create_v1(lcb_io_opt_t *io,
284
+ const struct lcb_create_io_ops_st *options);
285
+
286
+ LIBCOUCHBASE_API
287
+ lcb_error_t lcb_destroy_io_ops(lcb_io_opt_t io)
288
+ {
289
+ if (io) {
290
+ void *dlhandle = io->dlhandle;
291
+ if (io->destructor) {
292
+ io->destructor(io);
293
+ }
294
+ if (dlhandle) {
295
+ close_dlhandle(dlhandle);
296
+ }
297
+ }
298
+
299
+ return LCB_SUCCESS;
300
+ }
301
+
302
+ /**
303
+ * Note, the 'pi' is just a context variable to ensure the pointers copied
304
+ * to the options are valid. It is *not* meant to be inspected.
305
+ */
306
+ static lcb_error_t generate_options(plugin_info *pi,
307
+ const struct lcb_create_io_ops_st *user,
308
+ struct lcb_create_io_ops_st *ours,
309
+ lcb_io_ops_type_t *type)
310
+ {
311
+ if (user) {
312
+ memcpy(ours, user, sizeof(*user));
313
+
314
+ } else {
315
+ memset(ours, 0, sizeof(*ours));
316
+ ours->version = 0;
317
+ ours->v.v0.type = LCB_IO_OPS_DEFAULT;
318
+ }
319
+
320
+ if (ours->version > 0) {
321
+ if (type) {
322
+ *type = LCB_IO_OPS_INVALID;
323
+ }
324
+ /* we don't handle non-v0 options */
325
+ return LCB_SUCCESS;
326
+ }
327
+
328
+ if (ours->v.v0.type == LCB_IO_OPS_DEFAULT) {
329
+ int rv;
330
+ memset(pi, 0, sizeof(*pi));
331
+
332
+ rv = get_env_plugin_info(pi);
333
+ if (rv > 0) {
334
+ options_from_info(ours, pi);
335
+
336
+ if (type) {
337
+ *type = pi->iotype;
338
+ }
339
+
340
+ } else if (rv < 0) {
341
+ return LCB_BAD_ENVIRONMENT;
342
+
343
+ } else {
344
+ plugin_info *pip = find_plugin_info(LCB_IO_OPS_DEFAULT);
345
+ lcb_assert(pip);
346
+
347
+ if (type) {
348
+ *type = pip->iotype;
349
+ }
350
+
351
+ options_from_info(ours, pip);
352
+
353
+ /* if the plugin is dynamically loadable, we need to
354
+ * fallback to select(2) plugin in case we cannot find the
355
+ * create function */
356
+ if (ours->version == 1) {
357
+ struct plugin_st plugin;
358
+ int want_debug;
359
+ lcb_error_t ret;
360
+
361
+ if (lcb_getenv_boolean_multi("LIBCOUCHBASE_DLOPEN_DEBUG",
362
+ "LCB_DLOPEN_DEBUG", NULL)) {
363
+ want_debug = 1;
364
+ } else {
365
+ want_debug = want_dl_debug;
366
+ }
367
+ ret = get_create_func(ours->v.v1.sofile, ours->v.v1.symbol, &plugin, want_debug);
368
+ if (ret != LCB_SUCCESS) {
369
+ if (type) {
370
+ *type = LCB_IO_OPS_SELECT;
371
+ }
372
+ ours->version = 2;
373
+ ours->v.v2.create = lcb_create_select_io_opts;
374
+ ours->v.v2.cookie = NULL;
375
+ }
376
+ }
377
+ }
378
+ return LCB_SUCCESS;
379
+
380
+ } else {
381
+ /** Not default, ignore environment */
382
+ plugin_info *pip = find_plugin_info(ours->v.v0.type);
383
+ if (!pip) {
384
+ return LCB_NOT_SUPPORTED;
385
+ }
386
+ options_from_info(ours, pip);
387
+ if (type) {
388
+ *type = pip->iotype;
389
+ }
390
+ return LCB_SUCCESS;
391
+ }
392
+ }
393
+
394
+ LIBCOUCHBASE_API
395
+ lcb_error_t lcb_create_io_ops(lcb_io_opt_t *io,
396
+ const struct lcb_create_io_ops_st *io_opts)
397
+ {
398
+
399
+ struct lcb_create_io_ops_st options;
400
+ lcb_error_t err;
401
+ plugin_info pi;
402
+ memset(&options, 0, sizeof(options));
403
+
404
+ err = lcb_initialize_socket_subsystem();
405
+ if (err != LCB_SUCCESS) {
406
+ return err;
407
+ }
408
+
409
+ err = generate_options(&pi, io_opts, &options, NULL);
410
+ if (err != LCB_SUCCESS) {
411
+ return err;
412
+ }
413
+
414
+ if (options.version == 1) {
415
+ err = create_v1(io, &options);
416
+ } else if (options.version == 2) {
417
+ err = create_v2(io, &options);
418
+ } else {
419
+ return LCB_NOT_SUPPORTED;
420
+ }
421
+
422
+ if (err != LCB_SUCCESS) {
423
+ return err;
424
+ }
425
+ /*XXX:
426
+ * This block of code here because the Ruby SDK relies on undocumented
427
+ * functionality of older versions of libcouchbase in which its send/recv
428
+ * functions assert that the number of IOV elements passed is always going
429
+ * to be 2.
430
+ *
431
+ * This works around the issue by patching the send/recv functions of
432
+ * the ruby implementation at load-time.
433
+ *
434
+ * This block of code will go away once the Ruby SDK is fixed and a released
435
+ * version has been out for enough time that it won't break common existing
436
+ * deployments.
437
+ */
438
+ if (io_opts && io_opts->version == 1 && io_opts->v.v1.symbol != NULL) {
439
+ if (strstr(io_opts->v.v1.symbol, "cb_create_ruby")) {
440
+ wire_lcb_bsd_impl(*io);
441
+ }
442
+ }
443
+ return LCB_SUCCESS;
444
+ }
445
+
446
+ static lcb_error_t create_v1(lcb_io_opt_t *io,
447
+ const struct lcb_create_io_ops_st *options)
448
+ {
449
+ struct plugin_st plugin;
450
+ int want_debug;
451
+ lcb_error_t ret;
452
+
453
+ if (lcb_getenv_boolean_multi("LIBCOUCHBASE_DLOPEN_DEBUG",
454
+ "LCB_DLOPEN_DEBUG", NULL)) {
455
+ want_debug = 1;
456
+ } else {
457
+ want_debug = want_dl_debug;
458
+ }
459
+ ret = get_create_func(options->v.v1.sofile,
460
+ options->v.v1.symbol, &plugin, want_debug);
461
+ if (ret != LCB_SUCCESS) {
462
+ /* try to look up the symbol in the current image */
463
+ lcb_error_t ret2 = get_create_func(NULL, options->v.v1.symbol, &plugin, want_debug);
464
+ if (ret2 != LCB_SUCCESS) {
465
+ #ifndef _WIN32
466
+ char path[PATH_MAX];
467
+ /* try to look up the so-file in the libdir */
468
+ snprintf(path, PATH_MAX, "%s/%s", LCB_LIBDIR, options->v.v1.sofile);
469
+ ret2 = get_create_func(path, options->v.v1.symbol, &plugin, want_debug);
470
+ #endif
471
+ if (ret2 != LCB_SUCCESS) {
472
+ /* return original error to allow caller to fix it */
473
+ return ret;
474
+ }
475
+ }
476
+ }
477
+
478
+ ret = plugin.func.create(0, io, options->v.v1.cookie);
479
+ if (ret != LCB_SUCCESS) {
480
+ if (options->v.v1.sofile != NULL) {
481
+ close_dlhandle(plugin.dlhandle);
482
+ }
483
+ return LCB_CLIENT_ENOMEM;
484
+ } else {
485
+ lcb_io_opt_t iop = *io;
486
+ iop->dlhandle = plugin.dlhandle;
487
+ /* check if plugin selected compatible version */
488
+ if (iop->version < 0 || iop->version > 3) {
489
+ lcb_destroy_io_ops(iop);
490
+ return LCB_PLUGIN_VERSION_MISMATCH;
491
+ }
492
+ }
493
+
494
+ return LCB_SUCCESS;
495
+ }
496
+
497
+ static lcb_error_t create_v2(lcb_io_opt_t *io,
498
+ const struct lcb_create_io_ops_st *options)
499
+ {
500
+ lcb_error_t ret;
501
+
502
+ ret = options->v.v2.create(0, io, options->v.v2.cookie);
503
+ if (ret != LCB_SUCCESS) {
504
+ return ret;
505
+ } else {
506
+ lcb_io_opt_t iop = *io;
507
+ /* check if plugin selected compatible version */
508
+ if (iop->version < 0 || iop->version > 3) {
509
+ lcb_destroy_io_ops(iop);
510
+ return LCB_PLUGIN_VERSION_MISMATCH;
511
+ }
512
+ }
513
+
514
+ return LCB_SUCCESS;
515
+ }
516
+
517
+ lcb_error_t lcb_iops_cntl_handler(int mode,
518
+ lcb_t instance, int cmd, void *arg)
519
+ {
520
+ (void)instance;
521
+
522
+ switch (cmd) {
523
+ case LCB_CNTL_IOPS_DEFAULT_TYPES: {
524
+ struct lcb_create_io_ops_st options;
525
+ struct lcb_cntl_iops_info_st *info = arg;
526
+ lcb_error_t err;
527
+ plugin_info pi;
528
+
529
+ memset(&options, 0, sizeof(options));
530
+ if (mode != LCB_CNTL_GET) {
531
+ return LCB_NOT_SUPPORTED;
532
+ }
533
+
534
+ if (info->version != 0) {
535
+ return LCB_EINVAL;
536
+ }
537
+
538
+ info->v.v0.os_default = DEFAULT_IOPS;
539
+
540
+ err = generate_options(&pi,
541
+ info->v.v0.options,
542
+ &options,
543
+ &info->v.v0.effective);
544
+
545
+ if (err != LCB_SUCCESS) {
546
+ return LCB_ERROR;
547
+ }
548
+
549
+ return LCB_SUCCESS;
550
+ }
551
+
552
+ case LCB_CNTL_IOPS_DLOPEN_DEBUG: {
553
+ int *usr = arg;
554
+ if (mode == LCB_CNTL_SET) {
555
+ want_dl_debug = *usr;
556
+ } else {
557
+ *usr = want_dl_debug;
558
+ }
559
+ return LCB_SUCCESS;
560
+ }
561
+
562
+ default:
563
+ return LCB_EINVAL;
564
+
565
+ }
566
+
567
+ }
568
+
569
+ /* In-library wrapper version */
570
+ LIBCOUCHBASE_API
571
+ void
572
+ lcb_iops_wire_bsd_impl2(lcb_bsd_procs *procs, int version)
573
+ {
574
+ wire_lcb_bsd_impl2(procs, version);
575
+ }