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,364 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #ifndef LCBIO_CONNECTION_H
19
+ #define LCBIO_CONNECTION_H
20
+ #include <libcouchbase/couchbase.h>
21
+ #include "list.h"
22
+ #include "logging.h"
23
+ #include "settings.h"
24
+ #include "hostlist.h"
25
+ #ifdef __cplusplus
26
+ extern "C" {
27
+ #endif
28
+
29
+ /**
30
+ * @file
31
+ * This provides the core socket routines
32
+ */
33
+
34
+ /**
35
+ * @ingroup lcbio
36
+ * @defgroup lcbio-core Socket Module
37
+ * @brief Socket routines
38
+ * @addtogroup lcbio-core
39
+ * @{
40
+ */
41
+
42
+ struct lcbio_CONNSTART;
43
+ struct lcbio_MGRREQ;
44
+
45
+ /** @brief Pending connection request */
46
+ typedef struct lcbio_CONNSTART *lcbio_pCONNSTART;
47
+ typedef struct lcbio_MGRREQ *lcbio_pMGRREQ;
48
+ typedef struct lcbio_TABLE *lcbio_pTABLE;
49
+ typedef struct lcbio_TIMER *lcbio_pTIMER, *lcbio_pASYNC;
50
+
51
+ /**
52
+ * A type representing the underlying operating system's error type. On Unix
53
+ * this is typically an `int`, while on Windows this is a `DWORD`
54
+ */
55
+ #ifdef WIN32
56
+ typedef DWORD lcbio_OSERR;
57
+ #else
58
+ typedef int lcbio_OSERR;
59
+ #endif
60
+
61
+ /** @brief Information about a connected socket */
62
+ typedef struct {
63
+ unsigned naddr;
64
+ struct sockaddr_storage sa_remote;
65
+ struct sockaddr_storage sa_local;
66
+ lcb_host_t ep;
67
+ } lcbio_CONNINFO;
68
+
69
+
70
+ /** @brief Core socket structure */
71
+ typedef struct lcbio_SOCKET {
72
+ lcbio_pTABLE io;
73
+ lcb_settings *settings;
74
+ void *ctx;
75
+ lcbio_CONNINFO *info;
76
+ lcbio_OSERR last_error; /**< last OS error */
77
+ unsigned refcount; /**< refcount on socket */
78
+ union {
79
+ lcb_sockdata_t *sd;
80
+ lcb_socket_t fd;
81
+ } u;
82
+ lcb_list_t protos;
83
+ } lcbio_SOCKET;
84
+
85
+
86
+ /**
87
+ * @name Connecting and Destroying a Socket
88
+ * @{
89
+ */
90
+
91
+ /**
92
+ * Invoked when the connection result is ready
93
+ * @param s the socket to use. You should call lcbio_ref() on it. May be NULL
94
+ * in the case of an error
95
+ * @param arg user provided argument to the lcbio_connect() function
96
+ * @param err an error code (if connection is NULL)
97
+ * @param syserr the raw errno variable received.
98
+ */
99
+ typedef void (*lcbio_CONNDONE_cb)
100
+ (lcbio_SOCKET *s, void *arg, lcb_error_t err, lcbio_OSERR syserr);
101
+
102
+
103
+ /**
104
+ * Schedule a new connection to a remote endpoint.
105
+ *
106
+ * @param iot I/O table to use. The socket will increment the reference count of
107
+ * the table until the socket is destroyed.
108
+ * @param settings Settings structure. Used for logging
109
+ * @param dest the endpoint to connect to
110
+ * @param timeout number of time to wait for connection. The handler will be
111
+ * invoked with an error of `LCB_ETIMEDOUT` if a successful connection
112
+ * cannot be established in time.
113
+ * @param handler a handler to invoke with the result. The handler will always
114
+ * be invoked unless the request has been cancelled. You should inspect
115
+ * the socket and error code in the handler to see if the connection has
116
+ * been successful.
117
+ * @param arg the argument passed to the handler
118
+ * @return a request handle. The handle may be cancelled (to stop the pending
119
+ * connection attempt) before the handler is invoked.
120
+ * Once the handler is invoked, the returned handle is considered to
121
+ * be invalid; as such the following idiom should be employed:
122
+ *
123
+ *
124
+ * @code{.c}
125
+ * struct my_ctx {
126
+ * lcbio_SOCKET *sock;
127
+ * lcbio_pCONNSTART creq;
128
+ * }
129
+ *
130
+ * static void do_connect(void) {
131
+ * my_ctx *ctx;
132
+ * ctx->creq = lcbio_connect(iot, settings, dest, tmo, handler, ctx);
133
+ * // check errors..
134
+ * }
135
+ *
136
+ *
137
+ * static void handler(lcbio_SOCKET *s, void *arg, lcb_error_t err) {
138
+ * my_ctx *ctx = arg;
139
+ * ctx->creq = NULL;
140
+ * if (!(ctx->sock = s)) {
141
+ * ...
142
+ * }
143
+ * }
144
+ * @endcode
145
+ */
146
+ lcbio_pCONNSTART
147
+ lcbio_connect(lcbio_pTABLE iot,
148
+ lcb_settings *settings,
149
+ const lcb_host_t *dest,
150
+ uint32_t timeout,
151
+ lcbio_CONNDONE_cb handler, void *arg);
152
+
153
+ /**
154
+ * Wraps an existing socket descriptor into an lcbio_SOCKET structure
155
+ * @param iot
156
+ * @param settings
157
+ * @param fd The socket descriptor to wrap. This must refer to a _connected_
158
+ * socket (e.g. via `connect(2)` or `socketpair(2)`.
159
+ * @return A new socket object.
160
+ */
161
+ lcbio_SOCKET *
162
+ lcbio_wrap_fd(lcbio_pTABLE iot, lcb_settings *settings, lcb_socket_t fd);
163
+
164
+ /**
165
+ * Wraps `lcb_connect()` by traversing a list of hosts. This will cycle through
166
+ * each host in the list until a connection has been successful. Currently
167
+ * this will not intercept the handler but will catch any hostname lookup
168
+ * failures.
169
+ *
170
+ * @param iot
171
+ * @param settings
172
+ * @param hl The hostlist to traverse
173
+ * @param rollover If the hostlist position is at the end, this boolean parameter
174
+ * indicates whether the position should be reset
175
+ * @param timeout
176
+ * @param handler
177
+ * @param arg
178
+ * @see lcbio_connect()
179
+ */
180
+ lcbio_pCONNSTART
181
+ lcbio_connect_hl(lcbio_pTABLE iot, lcb_settings *settings,
182
+ hostlist_t hl, int rollover,
183
+ uint32_t timeout, lcbio_CONNDONE_cb handler, void *arg);
184
+
185
+
186
+ /**
187
+ * Cancel a pending connection attempt. Once the attempt is cancelled the
188
+ * handler will not be invoked and the CONNSTART object will be invalid.
189
+ * @param cs the handle returned from lcbio_connect()
190
+ */
191
+ void
192
+ lcbio_connect_cancel(lcbio_pCONNSTART cs);
193
+
194
+ /**
195
+ * Cancel any pending I/O on this socket. Outstanding callbacks for I/O (i.e.
196
+ * for completion-based reads and writes) will still be delivered with an error
197
+ * code. Outstanding callbacks for event-based I/O will not be invoked.
198
+ *
199
+ * This function does not modify the reference count of the socket directly
200
+ * but will clear any lcbio_PROTOCTX objects attached to it.
201
+ */
202
+ void
203
+ lcbio_shutdown(lcbio_SOCKET *);
204
+
205
+ /**
206
+ * Increment the reference count on the socket. When the socket is no longer
207
+ * needed, call lcbio_unref().
208
+ */
209
+ #define lcbio_ref(s) (s)->refcount++
210
+
211
+ /**
212
+ * Decrement the reference count on the socket. When the reference count hits
213
+ * zero, lcbio_shutdown() will be called.
214
+ */
215
+ #define lcbio_unref(s) if ( !--(s)->refcount ) { lcbio__destroy(s); }
216
+
217
+ /** @} */
218
+
219
+
220
+ /**
221
+ * @name Protocol Contexts
222
+ * @{
223
+ */
224
+
225
+ typedef enum {
226
+ LCBIO_PROTOCTX_SESSINFO = 1,
227
+ LCBIO_PROTOCTX_POOL,
228
+ LCBIO_PROTOCTX_HOSTINFO,
229
+ LCBIO_PROTOCTX_SSL,
230
+ LCBIO_PROTOCTX_MAX
231
+ } lcbio_PROTOID;
232
+
233
+
234
+
235
+ /**
236
+ * @brief Protocol-specific data attached to lcbio_SOCKET.
237
+ *
238
+ * A protocol context is an object which is bound to the actual low level
239
+ * socket connection rather than the logical socket owner. This is used for
240
+ * resources which operate on the TCP state (such as encryption or authentication)
241
+ * or which employ socket reuse (for things such as pooling).
242
+ */
243
+ typedef struct lcbio_PROTOCTX {
244
+ lcb_list_t ll;
245
+ lcbio_PROTOID id;
246
+ /** Called when the context is to be removed from the socket */
247
+ void (*dtor)(struct lcbio_PROTOCTX *);
248
+ } lcbio_PROTOCTX;
249
+
250
+ /**
251
+ * Attach an lcbio_PROTOCTX object to the socket. This object will remain
252
+ * part of the socket until lcbio_shutdown() is invoked, or the context itself
253
+ * is removed explicitly.
254
+ *
255
+ * @param socket the socket the context should be added to
256
+ * @param proto the object to be added. The protocol object should have its
257
+ * `id` and `dtor` fields initialized.
258
+ */
259
+ void
260
+ lcbio_protoctx_add(lcbio_SOCKET *socket, lcbio_PROTOCTX *proto);
261
+
262
+ /**
263
+ * Retrieve an existing protocol context by its ID
264
+ * @param socket The socket to query
265
+ * @param id The ID of the context
266
+ * @return the context, or NULL if not found
267
+ */
268
+ lcbio_PROTOCTX *
269
+ lcbio_protoctx_get(lcbio_SOCKET *socket, lcbio_PROTOID id);
270
+
271
+ /**
272
+ * Remove a protocol context by its ID
273
+ * @param socket socket from which to remove
274
+ * @param id The id of the context to remove
275
+ * @param call_dtor whether the destructor should be invoked
276
+ * @return the returned context, or NULL if not found
277
+ */
278
+ lcbio_PROTOCTX *
279
+ lcbio_protoctx_delid(lcbio_SOCKET *socket, lcbio_PROTOID id, int call_dtor);
280
+
281
+ /**
282
+ * Delete a protocol context by its pointer.
283
+ * @param socket The socket from which the context should be removed
284
+ * @param ctx The pointer to remove
285
+ * @param call_dtor Whether to invoke the destructor for the lcbio_PROTOCTX
286
+ */
287
+ void
288
+ lcbio_protoctx_delptr(lcbio_SOCKET *socket, lcbio_PROTOCTX *ctx, int call_dtor);
289
+
290
+ /** @private */
291
+ void
292
+ lcbio__protoctx_delall(lcbio_SOCKET *s);
293
+
294
+ /** @} */
295
+
296
+ /**
297
+ * Get the lcb_host_t pointer indicating the endpoint the socket is connected to.
298
+ * @param sock The socket
299
+ * @return a pointer to the host.
300
+ */
301
+ #define lcbio_get_host(sock) (&(sock)->info->ep)
302
+
303
+ /**
304
+ * @private
305
+ * Internal destroy function for when the refcount hits 0
306
+ */
307
+ void
308
+ lcbio__destroy(lcbio_SOCKET *s);
309
+
310
+ /**
311
+ * @name IO Table Functions
312
+ * @details
313
+ * These functions provide the user-facing API for dealing with the lcbio_TABLE
314
+ * structure. These functions only control its handling as an opaque object.
315
+ * The definition of the structure may be found in <lcbio/iotable.h> and contains
316
+ * more routines for actually using it.
317
+ *
318
+ * @{
319
+ */
320
+
321
+ /**
322
+ * Create a new table based on the input iops structure. The table itself retains
323
+ * ownership over the structure and will destroy it once the table itself has
324
+ * been destroyed.
325
+ * @param io An IOPS structure. See lcb_create_io_ops()
326
+ * @return A table with a reference count initialized to 1
327
+ */
328
+ lcbio_pTABLE
329
+ lcbio_table_new(lcb_io_opt_t io);
330
+
331
+ /** Increment the reference count on the lcbio_TABLE */
332
+ void
333
+ lcbio_table_unref(lcbio_pTABLE iot);
334
+
335
+ /** Decrement the reference count on the lcbio_TABLE */
336
+ void
337
+ lcbio_table_ref(lcbio_pTABLE iot);
338
+
339
+ /** @}*/
340
+
341
+ /** @name IO Status Codes
342
+ *@{ */
343
+ typedef enum {
344
+ LCBIO_COMPLETED = 0, /**< Operation has been completed */
345
+ LCBIO_PENDING, /**< Operation is partially completed */
346
+ LCBIO__SUCCESS_MAX, /**< Status codes higher than this value are errors */
347
+ LCBIO_IOERR, /**< An I/O error has been received */
348
+ LCBIO_INTERR, /**< An internal non-I/O error has been received */
349
+ LCBIO_SHUTDOWN /**< Socket was gracefully closed */
350
+ } lcbio_IOSTATUS;
351
+
352
+ #define LCBIO_WFLUSHED LCBIO_COMPLETED
353
+ #define LCBIO_CANREAD LCBIO_COMPLETED
354
+ #define LCBIO_IS_OK(s) ((s) < LCBIO__SUCCESS_MAX)
355
+ /** @} */
356
+
357
+ #ifdef __cplusplus
358
+ }
359
+ #endif
360
+ #endif
361
+
362
+ /**
363
+ * @}
364
+ */
@@ -0,0 +1,611 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "ctx.h"
19
+ #include "iotable.h"
20
+ #include "timer-ng.h"
21
+ #include "ioutils.h"
22
+ #include <stdio.h>
23
+ #include <lcbio/ssl.h>
24
+
25
+ #define CTX_FD(ctx) (ctx)->fd
26
+ #define CTX_SD(ctx) (ctx)->sd
27
+ #define CTX_IOT(ctx) (ctx)->io
28
+ #include "rw-inl.h"
29
+
30
+ #define LOGARGS(c, lvl) (c)->sock->settings, "ioctx", LCB_LOG_##lvl, __FILE__, __LINE__
31
+ static const lcb_host_t * get_ctx_host(const lcbio_CTX *ctx) {
32
+ static lcb_host_t host = { "NOHOST", "NOPORT" };
33
+ if (!ctx) { return &host; }
34
+ if (!ctx->sock) { return &host; }
35
+ if (!ctx->sock->info) { return &host; }
36
+ return &ctx->sock->info->ep;
37
+ }
38
+ #define CTX_LOGFMT "<%s:%s> (CTX=%p,%s) "
39
+ #define CTX_LOGID(ctx) get_ctx_host(ctx)->host, get_ctx_host(ctx)->port, (void*)ctx, ctx?ctx->subsys : ""
40
+
41
+ typedef enum {
42
+ ES_ACTIVE = 0,
43
+ ES_DETACHED
44
+ } easy_state;
45
+
46
+ static void
47
+ err_handler(void *cookie)
48
+ {
49
+ lcbio_CTX *ctx = (void *)cookie;
50
+ ctx->procs.cb_err(ctx, ctx->err);
51
+ }
52
+
53
+ static lcb_error_t
54
+ convert_lcberr(const lcbio_CTX *ctx, lcbio_IOSTATUS status)
55
+ {
56
+ const lcb_settings *settings = ctx->sock->settings;
57
+ lcbio_OSERR oserr = IOT_ERRNO(ctx->sock->io);
58
+
59
+ if (lcbio_ssl_check(ctx->sock)) {
60
+ lcb_error_t err = lcbio_ssl_get_error(ctx->sock);
61
+ if (err) {
62
+ return err;
63
+ }
64
+ }
65
+
66
+ if (status == LCBIO_SHUTDOWN) {
67
+ return lcbio_mklcberr(0, settings);
68
+ } else if (oserr != 0) {
69
+ return lcbio_mklcberr(oserr, settings);
70
+ } else {
71
+ return LCB_NETWORK_ERROR;
72
+ }
73
+ }
74
+
75
+ lcbio_CTX *
76
+ lcbio_ctx_new(lcbio_SOCKET *sock, void *data, const lcbio_CTXPROCS *procs)
77
+ {
78
+ lcbio_CTX *ctx = calloc(1, sizeof(*ctx));
79
+ ctx->sock = sock;
80
+ sock->ctx = ctx;
81
+ ctx->io = sock->io;
82
+ ctx->data = data;
83
+ ctx->procs = *procs;
84
+ ctx->state = ES_ACTIVE;
85
+ ctx->as_err = lcbio_timer_new(ctx->io, ctx, err_handler);
86
+ ctx->subsys = "unknown";
87
+
88
+ rdb_init(&ctx->ior, sock->settings->allocator_factory());
89
+ lcbio_ref(sock);
90
+
91
+ if (IOT_IS_EVENT(ctx->io)) {
92
+ ctx->event = IOT_V0EV(ctx->io).create(IOT_ARG(ctx->io));
93
+ ctx->fd = sock->u.fd;
94
+ } else {
95
+ ctx->sd = sock->u.sd;
96
+ }
97
+
98
+ ctx->procs = *procs;
99
+ ctx->state = ES_ACTIVE;
100
+
101
+ lcb_log(LOGARGS(ctx, DEBUG), CTX_LOGFMT "Pairing with SOCK=%p", CTX_LOGID(ctx), (void*)sock);
102
+ return ctx;
103
+ }
104
+
105
+ static void
106
+ free_ctx(lcbio_CTX *ctx)
107
+ {
108
+ rdb_cleanup(&ctx->ior);
109
+ lcbio_unref(ctx->sock);
110
+ if (ctx->output) {
111
+ ringbuffer_destruct(&ctx->output->rb);
112
+ free(ctx->output);
113
+ }
114
+ if (ctx->procs.cb_flush_ready) {
115
+ /* dtor */
116
+ ctx->procs.cb_flush_ready(ctx);
117
+ }
118
+ free(ctx);
119
+ }
120
+
121
+ static void
122
+ deactivate_watcher(lcbio_CTX *ctx)
123
+ {
124
+ if (ctx->evactive && ctx->event) {
125
+ IOT_V0EV(CTX_IOT(ctx)).cancel(
126
+ IOT_ARG(CTX_IOT(ctx)), CTX_FD(ctx), ctx->event);
127
+ ctx->evactive = 0;
128
+ }
129
+ }
130
+
131
+ void
132
+ lcbio_ctx_close_ex(lcbio_CTX *ctx, lcbio_CTXCLOSE_cb cb, void *arg,
133
+ lcbio_CTXDTOR_cb dtor, void *dtor_arg)
134
+ {
135
+ unsigned oldrc;
136
+ ctx->state = ES_DETACHED;
137
+ assert(ctx->sock);
138
+
139
+ if (ctx->event) {
140
+ deactivate_watcher(ctx);
141
+ IOT_V0EV(CTX_IOT(ctx)).destroy(IOT_ARG(CTX_IOT(ctx)), ctx->event);
142
+ ctx->event = NULL;
143
+ }
144
+
145
+ if (ctx->as_err) {
146
+ lcbio_timer_destroy(ctx->as_err);
147
+ ctx->as_err = NULL;
148
+ }
149
+
150
+ oldrc = ctx->sock->refcount;
151
+ lcb_log(LOGARGS(ctx, DEBUG), CTX_LOGFMT "Destroying. PND=%d,ENT=%d,SORC=%d", CTX_LOGID(ctx), (int)ctx->npending, (int)ctx->entered, oldrc);
152
+
153
+ if (cb) {
154
+ int reusable =
155
+ ctx->npending == 0 && /* no pending events */
156
+ ctx->err == LCB_SUCCESS && /* no socket errors */
157
+ ctx->rdwant == 0 && /* no expected input */
158
+ ctx->wwant == 0 && /* no expected output */
159
+ (ctx->output == NULL || ctx->output->rb.nbytes == 0);
160
+ cb(ctx->sock, reusable, arg);
161
+ }
162
+
163
+ if (oldrc == ctx->sock->refcount) {
164
+ lcbio_shutdown(ctx->sock);
165
+ }
166
+
167
+ if (ctx->output) {
168
+ ringbuffer_destruct(&ctx->output->rb);
169
+ free(ctx->output);
170
+ ctx->output = NULL;
171
+ }
172
+
173
+ ctx->fd = INVALID_SOCKET;
174
+ ctx->sd = NULL;
175
+
176
+ if (dtor) {
177
+ ctx->data = dtor_arg;
178
+ ctx->procs.cb_flush_ready = dtor;
179
+
180
+ } else {
181
+ ctx->procs.cb_flush_ready = NULL;
182
+ }
183
+
184
+ if (ctx->npending == 0 && ctx->entered == 0) {
185
+ free_ctx(ctx);
186
+ }
187
+ }
188
+
189
+ void
190
+ lcbio_ctx_close(lcbio_CTX *ctx, lcbio_CTXCLOSE_cb cb, void *arg)
191
+ {
192
+ lcbio_ctx_close_ex(ctx, cb, arg, NULL, NULL);
193
+ }
194
+
195
+ void
196
+ lcbio_ctx_put(lcbio_CTX *ctx, const void *buf, unsigned nbuf)
197
+ {
198
+ lcbio__EASYRB *erb = ctx->output;
199
+
200
+ if (!erb) {
201
+ ctx->output = erb = calloc(1, sizeof(*ctx->output));
202
+
203
+ if (!erb) {
204
+ lcbio_ctx_senderr(ctx, LCB_CLIENT_ENOMEM);
205
+ return;
206
+ }
207
+
208
+ erb->parent = ctx;
209
+
210
+ if (!ringbuffer_initialize(&erb->rb, nbuf)) {
211
+ lcbio_ctx_senderr(ctx, LCB_CLIENT_ENOMEM);
212
+ return;
213
+ }
214
+ }
215
+
216
+ if (!ringbuffer_ensure_capacity(&erb->rb, nbuf)) {
217
+ lcbio_ctx_senderr(ctx, LCB_CLIENT_ENOMEM);
218
+ return;
219
+ }
220
+
221
+ ringbuffer_write(&erb->rb, buf, nbuf);
222
+ }
223
+
224
+ void
225
+ lcbio_ctx_rwant(lcbio_CTX *ctx, unsigned n)
226
+ {
227
+ ctx->rdwant = n;
228
+ }
229
+
230
+ static void
231
+ set_iterbuf(lcbio_CTX *ctx, lcbio_CTXRDITER *iter)
232
+ {
233
+ if ((iter->nbuf = rdb_get_contigsize(&ctx->ior))) {
234
+ if (iter->nbuf > iter->remaining) {
235
+ iter->nbuf = iter->remaining;
236
+ }
237
+ iter->buf = rdb_get_consolidated(&ctx->ior, iter->nbuf);
238
+ } else {
239
+ iter->buf = NULL;
240
+ }
241
+ }
242
+
243
+ void
244
+ lcbio_ctx_ristart(lcbio_CTX *ctx, lcbio_CTXRDITER *iter, unsigned nb)
245
+ {
246
+ iter->remaining = nb;
247
+ set_iterbuf(ctx, iter);
248
+ }
249
+
250
+ void
251
+ lcbio_ctx_rinext(lcbio_CTX *ctx, lcbio_CTXRDITER *iter)
252
+ {
253
+ rdb_consumed(&ctx->ior, iter->nbuf);
254
+ iter->remaining -= iter->nbuf;
255
+ set_iterbuf(ctx, iter);
256
+ }
257
+
258
+ static int
259
+ E_free_detached(lcbio_CTX *ctx)
260
+ {
261
+ if (ctx->state == ES_DETACHED) {
262
+ free_ctx(ctx);
263
+ return 1;
264
+ }
265
+ return 0;
266
+ }
267
+
268
+ static void
269
+ invoke_read_cb(lcbio_CTX *ctx, unsigned nb)
270
+ {
271
+ ctx->rdwant = 0;
272
+ ctx->entered++;
273
+ ctx->procs.cb_read(ctx, nb);
274
+ ctx->entered--;
275
+ }
276
+
277
+ static void
278
+ E_handler(lcb_socket_t sock, short which, void *arg)
279
+ {
280
+ lcbio_CTX *ctx = arg;
281
+ lcbio_IOSTATUS status;
282
+ (void)sock;
283
+
284
+ if (which & LCB_READ_EVENT) {
285
+ unsigned nb;
286
+ status = lcbio_E_rdb_slurp(ctx, &ctx->ior);
287
+ nb = rdb_get_nused(&ctx->ior);
288
+
289
+ if (nb >= ctx->rdwant) {
290
+ invoke_read_cb(ctx, nb);
291
+ if (E_free_detached(ctx)) {
292
+ return;
293
+ }
294
+ }
295
+ if (!LCBIO_IS_OK(status)) {
296
+ lcb_error_t err = convert_lcberr(ctx, status);
297
+ lcbio_ctx_senderr(ctx, err);
298
+ return;
299
+ }
300
+ }
301
+
302
+ if (which & LCB_WRITE_EVENT) {
303
+ if (ctx->wwant) {
304
+ ctx->wwant = 0;
305
+ ctx->procs.cb_flush_ready(ctx);
306
+ if (ctx->err) {
307
+ return;
308
+ }
309
+ } else if (ctx->output) {
310
+ status = lcbio_E_rb_write(ctx, &ctx->output->rb);
311
+ if (!LCBIO_IS_OK(status)) {
312
+ deactivate_watcher(ctx);
313
+ ctx->err = convert_lcberr(ctx, status);
314
+ err_handler(ctx);
315
+ return;
316
+ }
317
+ }
318
+ }
319
+
320
+ lcbio_ctx_schedule(ctx);
321
+ }
322
+
323
+ static void
324
+ invoke_entered_errcb(lcbio_CTX *ctx, lcb_error_t err)
325
+ {
326
+ ctx->err = err;
327
+ ctx->entered++;
328
+ ctx->procs.cb_err(ctx, err);
329
+ ctx->entered--;
330
+ }
331
+
332
+ static void
333
+ Cw_handler(lcb_sockdata_t *sd, int status, void *arg)
334
+ {
335
+ lcbio__EASYRB *erb = arg;
336
+ lcbio_CTX *ctx = erb->parent;
337
+ (void)sd;
338
+
339
+ ctx->npending--;
340
+
341
+ if (!ctx->output) {
342
+ ctx->output = erb;
343
+ ringbuffer_reset(&erb->rb);
344
+
345
+ } else {
346
+ ringbuffer_destruct(&erb->rb);
347
+ free(erb);
348
+ }
349
+
350
+ if (ctx->state == ES_ACTIVE && status) {
351
+ invoke_entered_errcb(ctx, convert_lcberr(ctx, LCBIO_IOERR));
352
+ }
353
+
354
+ if (ctx->state != ES_ACTIVE && ctx->npending == 0) {
355
+ free_ctx(ctx);
356
+ }
357
+ }
358
+
359
+ static void C_schedule(lcbio_CTX *ctx);
360
+
361
+ static void
362
+ Cr_handler(lcb_sockdata_t *sd, lcb_ssize_t nr, void *arg)
363
+ {
364
+ lcbio_CTX *ctx = arg;
365
+ sd->is_reading = 0;
366
+ ctx->npending--;
367
+
368
+ if (ctx->state == ES_ACTIVE) {
369
+ if (nr > 0) {
370
+ unsigned total;
371
+ rdb_rdend(&ctx->ior, nr);
372
+ total = rdb_get_nused(&ctx->ior);
373
+ if (total >= ctx->rdwant) {
374
+ invoke_read_cb(ctx, total);
375
+ }
376
+
377
+ lcbio_ctx_schedule(ctx);
378
+ } else {
379
+ lcb_error_t err =
380
+ convert_lcberr(ctx, nr ? LCBIO_SHUTDOWN : LCBIO_IOERR);
381
+ ctx->rdwant = 0;
382
+ invoke_entered_errcb(ctx, err);
383
+ }
384
+ }
385
+
386
+ if (ctx->state != ES_ACTIVE && ctx->npending == 0) {
387
+ free_ctx(ctx);
388
+ }
389
+ }
390
+
391
+ static void
392
+ C_schedule(lcbio_CTX *ctx)
393
+ {
394
+ lcbio_TABLE *io = ctx->io;
395
+ lcb_sockdata_t *sd = CTX_SD(ctx);
396
+ int rv;
397
+
398
+ if (ctx->output && ctx->output->rb.nbytes) {
399
+ /** Schedule a write */
400
+ lcb_IOV iov[2];
401
+ unsigned niov;
402
+
403
+ ringbuffer_get_iov(&ctx->output->rb, RINGBUFFER_READ, iov);
404
+ niov = iov[1].iov_len ? 2 : 1;
405
+ rv = IOT_V1(io).write2(IOT_ARG(io), sd, iov, niov, ctx->output, Cw_handler);
406
+ if (rv) {
407
+ lcbio_ctx_senderr(ctx, convert_lcberr(ctx, LCBIO_IOERR));
408
+ return;
409
+ } else {
410
+ ctx->output = NULL;
411
+ ctx->npending++;
412
+ }
413
+ }
414
+
415
+ if (ctx->wwant) {
416
+ ctx->wwant = 0;
417
+ ctx->procs.cb_flush_ready(ctx);
418
+ }
419
+
420
+ if (ctx->rdwant && sd->is_reading == 0) {
421
+ lcb_IOV iov[RWINL_IOVSIZE];
422
+ unsigned ii;
423
+ unsigned niov = rdb_rdstart(&ctx->ior, (nb_IOV *)iov, RWINL_IOVSIZE);
424
+
425
+ assert(niov);
426
+ for (ii = 0; ii < niov; ++ii) {
427
+ assert(iov[ii].iov_len);
428
+ }
429
+
430
+ rv = IOT_V1(io).read2(IOT_ARG(io), sd, iov, niov, ctx, Cr_handler);
431
+ if (rv) {
432
+ lcbio_ctx_senderr(ctx, convert_lcberr(ctx, LCBIO_IOERR));
433
+
434
+ } else {
435
+ sd->is_reading = 1;
436
+ ctx->npending++;
437
+ }
438
+ }
439
+ }
440
+
441
+ static void
442
+ E_schedule(lcbio_CTX *ctx)
443
+ {
444
+ lcbio_TABLE *io = ctx->io;
445
+ short which = 0;
446
+
447
+ if (ctx->rdwant) {
448
+ which |= LCB_READ_EVENT;
449
+ }
450
+ if (ctx->wwant || (ctx->output && ctx->output->rb.nbytes)) {
451
+ which |= LCB_WRITE_EVENT;
452
+ }
453
+
454
+ if (!which) {
455
+ deactivate_watcher(ctx);
456
+ return;
457
+ }
458
+
459
+ IOT_V0EV(io).watch(IOT_ARG(io), CTX_FD(ctx), ctx->event, which, ctx, E_handler);
460
+ ctx->evactive = 1;
461
+ }
462
+
463
+ void
464
+ lcbio_ctx_schedule(lcbio_CTX *ctx)
465
+ {
466
+ if (ctx->entered || ctx->err || ctx->state != ES_ACTIVE) {
467
+ /* don't schedule events on i/o errors or on entered state */
468
+ return;
469
+ }
470
+ if (IOT_IS_EVENT(ctx->io)) {
471
+ E_schedule(ctx);
472
+ } else {
473
+ C_schedule(ctx);
474
+ }
475
+ }
476
+
477
+ /** Extended function used for write-on-callback mode */
478
+ static int
479
+ E_put_ex(lcbio_CTX *ctx, lcb_IOV *iov, unsigned niov, unsigned nb)
480
+ {
481
+ lcb_ssize_t nw;
482
+ lcbio_TABLE *iot = ctx->io;
483
+ lcb_socket_t fd = CTX_FD(ctx);
484
+
485
+ GT_WRITE_AGAIN:
486
+ nw = IOT_V0IO(iot).sendv(IOT_ARG(iot), fd, iov,
487
+ niov <= RWINL_IOVSIZE ? niov : RWINL_IOVSIZE);
488
+ if (nw > 0) {
489
+ ctx->procs.cb_flush_done(ctx, nb, nw);
490
+ return 1;
491
+
492
+ } else if (nw == -1) {
493
+ switch (IOT_ERRNO(iot)) {
494
+ case EINTR:
495
+ /* jump back to retry */
496
+ goto GT_WRITE_AGAIN;
497
+
498
+ case C_EAGAIN:
499
+ case EWOULDBLOCK:
500
+ nw = 0;
501
+ /* indicate zero bytes were written, but don't send an error */
502
+ goto GT_WRITE0;
503
+ default:
504
+ /* pretend all the bytes were written and deliver an error during
505
+ * the next event loop iteration. */
506
+ nw = nb;
507
+ lcbio_ctx_senderr(ctx, convert_lcberr(ctx, LCBIO_IOERR));
508
+ goto GT_WRITE0;
509
+ }
510
+ } else {
511
+ /* connection closed. pretend everything was written and send an error */
512
+ nw = nb;
513
+ lcbio_ctx_senderr(ctx, convert_lcberr(ctx, LCBIO_SHUTDOWN));
514
+ goto GT_WRITE0;
515
+ }
516
+
517
+ GT_WRITE0:
518
+ ctx->procs.cb_flush_done(ctx, nb, nw);
519
+ return 0;
520
+ }
521
+
522
+ static void
523
+ Cw_ex_handler(lcb_sockdata_t *sd, int status, void *wdata)
524
+ {
525
+ lcbio_CTX *ctx = ((lcbio_SOCKET *)sd->lcbconn)->ctx;
526
+ unsigned nflushed = (uintptr_t)wdata;
527
+ ctx->npending--;
528
+
529
+ ctx->entered = 1;
530
+ ctx->procs.cb_flush_done(ctx, nflushed, nflushed);
531
+ ctx->entered = 0;
532
+
533
+ if (ctx->state == ES_ACTIVE && status) {
534
+ invoke_entered_errcb(ctx, convert_lcberr(ctx, LCBIO_IOERR));
535
+ }
536
+ if (ctx->state != ES_ACTIVE && !ctx->npending) {
537
+ free_ctx(ctx);
538
+ }
539
+ }
540
+
541
+ static int
542
+ C_put_ex(lcbio_CTX *ctx, lcb_IOV *iov, unsigned niov, unsigned nb)
543
+ {
544
+ lcbio_TABLE *iot = ctx->io;
545
+ lcb_sockdata_t *sd = CTX_SD(ctx);
546
+ int status = IOT_V1(iot).write2(IOT_ARG(iot),
547
+ sd, iov, niov, (void *)(uintptr_t)nb, Cw_ex_handler);
548
+ if (status) {
549
+ /** error! */
550
+ lcbio_OSERR saverr = IOT_ERRNO(iot);
551
+ ctx->procs.cb_flush_done(ctx, nb, nb);
552
+ lcbio_ctx_senderr(ctx, lcbio_mklcberr(saverr, ctx->sock->settings));
553
+ return 0;
554
+ } else {
555
+ ctx->npending++;
556
+ return 1;
557
+ }
558
+ }
559
+
560
+ int
561
+ lcbio_ctx_put_ex(lcbio_CTX *ctx, lcb_IOV *iov, unsigned niov, unsigned nb)
562
+ {
563
+ lcbio_TABLE *iot = ctx->io;
564
+ if (IOT_IS_EVENT(iot)) {
565
+ return E_put_ex(ctx, iov, niov, nb);
566
+ } else {
567
+ return C_put_ex(ctx, iov, niov, nb);
568
+ }
569
+ }
570
+
571
+ void
572
+ lcbio_ctx_wwant(lcbio_CTX *ctx)
573
+ {
574
+ if ((IOT_IS_EVENT(ctx->io)) == 0 && ctx->entered == 0) {
575
+ ctx->procs.cb_flush_ready(ctx);
576
+ } else {
577
+ ctx->wwant = 1;
578
+ }
579
+ }
580
+
581
+ void
582
+ lcbio_ctx_senderr(lcbio_CTX *ctx, lcb_error_t err)
583
+ {
584
+ if (ctx->err == LCB_SUCCESS) {
585
+ ctx->err = err;
586
+ }
587
+ deactivate_watcher(ctx);
588
+ lcbio_async_signal(ctx->as_err);
589
+ }
590
+
591
+ void
592
+ lcbio_ctx_dump(lcbio_CTX *ctx, FILE *fp)
593
+ {
594
+ fprintf(fp, "IOCTX=%p. SUBSYS=%s\n", (void*)ctx, ctx->subsys);
595
+ fprintf(fp, " Pending=%d\n", ctx->npending);
596
+ fprintf(fp, " ReqRead=%d\n", ctx->rdwant);
597
+ fprintf(fp, " WantWrite=%d\n", ctx->wwant);
598
+ fprintf(fp, " Entered=%d\n", ctx->entered);
599
+ fprintf(fp, " Active=%d\n", ctx->state == ES_ACTIVE);
600
+ fprintf(fp, " SOCKET=%p\n", (void*)ctx->sock);
601
+ fprintf(fp, " Model=%s\n", ctx->io->model == LCB_IOMODEL_EVENT ? "Event" : "Completion");
602
+ if (IOT_IS_EVENT(ctx->io)) {
603
+ fprintf(fp, " FD=%d\n", ctx->sock->u.fd);
604
+ fprintf(fp, " Watcher Active=%d\n", ctx->evactive);
605
+ } else {
606
+ fprintf(fp, " SD=%p\n", (void *)ctx->sock->u.sd);
607
+ fprintf(fp, " Reading=%d\n", ctx->sock->u.sd->is_reading);
608
+ }
609
+ fprintf(fp, " WILL DUMP IOR/READBUF INFO:\n");
610
+ rdb_dump(&ctx->ior, fp);
611
+ }