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,199 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #ifndef LCB_HTTP_H
19
+ #define LCB_HTTP_H
20
+
21
+ #include <libcouchbase/couchbase.h>
22
+ #include "simplestring.h"
23
+ #include "sllist.h"
24
+ struct lcb_settings_st;
25
+
26
+ #ifdef __cplusplus
27
+ extern "C" {
28
+ #endif
29
+
30
+
31
+ /**
32
+ * @file
33
+ * HTTP Response parsing.
34
+ *
35
+ * This file provides HTTP/1.0 compatible response parsing semantics, supporting
36
+ * the Content-Length header.
37
+ *
38
+ * Specifically this may be used to parse incoming HTTP streams into a single
39
+ * body.
40
+ */
41
+
42
+ /** Response state */
43
+ typedef enum {
44
+ LCBHT_S_HTSTATUS = 1 << 0, /**< Have HTTP status */
45
+ LCBHT_S_HEADER = 1 << 1, /**< Have HTTP header */
46
+ LCBHT_S_BODY = 1 << 2, /**< Have HTTP body */
47
+ LCBHT_S_DONE = 1 << 3, /**< Have a full message */
48
+
49
+ /**Have a parse error. Note this is not the same as a HTTP error */
50
+ LCBHT_S_ERROR = 1 << 4
51
+ } lcbht_RESPSTATE;
52
+
53
+ typedef struct {
54
+ sllist_node slnode; /**< Next header in list */
55
+ const char *key;
56
+ const char *value;
57
+ lcb_string buf_; /**< Storage for the key and value */
58
+ } lcbht_MIMEHDR;
59
+
60
+ typedef struct {
61
+ unsigned short status; /**< HTTP Status code */
62
+ lcbht_RESPSTATE state;
63
+ sllist_root headers; /**< List of response headers */
64
+ lcb_string body; /**< Body */
65
+ } lcbht_RESPONSE;
66
+
67
+ typedef struct lcbht_PARSER *lcbht_pPARSER;
68
+
69
+ /**
70
+ * Initialize the parser object
71
+ * @param settings the settings structure used for logging
72
+ * @return a new parser object
73
+ */
74
+ lcbht_pPARSER
75
+ lcbht_new(struct lcb_settings_st *settings);
76
+
77
+ /** Free the parser object */
78
+ void
79
+ lcbht_free(lcbht_pPARSER);
80
+
81
+ void
82
+ lcbht_reset(lcbht_pPARSER);
83
+
84
+ /**
85
+ * Parse incoming data into a message
86
+ * @param parser The parser
87
+ * @param data Pointer to new data
88
+ * @param ndata Size of the data
89
+ *
90
+ * @return The current state of the parser. If `state & LCBHT_S_DONE` then
91
+ * the current response should be handled before continuing.
92
+ * If `state & LCBHT_S_ERROR` then there was an error parsing the contents
93
+ * as it violated the HTTP protocol.
94
+ */
95
+ lcbht_RESPSTATE
96
+ lcbht_parse(lcbht_pPARSER parser, const void *data, unsigned ndata);
97
+
98
+ /**
99
+ * Parse incoming data without buffering
100
+ * @param parser The parser to use
101
+ * @param data The data to parse
102
+ * @param ndata Length of the data
103
+ * @param[out] nused How much of the data was actually consumed
104
+ * @param[out] nbody Size of the body pointer
105
+ * @param[out] pbody a pointer for the body
106
+ *
107
+ * @return See lcbht_set_bufmode for the meaning of this value
108
+ *
109
+ * @note It is not an error if `pbody` is NULL. It may mean that the parse state
110
+ * is still within the headers and there is no body to parse yet.
111
+ *
112
+ * This function is intended to be used in a loop, until there is no input
113
+ * remaining. The use of the `nused` pointer is to determine by how much the
114
+ * `data` pointer should be incremented (and the `ndata` decremented) for the
115
+ * next call. When this function returns with a non-error status, `pbody`
116
+ * will contain a pointer to a buffer of data (but see note above) which can
117
+ * then be processed by the application.
118
+ *
119
+ * @code{.c}
120
+ * char **body, *input;
121
+ * unsigned inlen = get_input_len(), nused, bodylen;
122
+ * lcbht_RESPSTATE res;
123
+ * do {
124
+ * res = lcbht_parse_ex(parser, input, inlen, &nused, &nbody, &body);
125
+ * if (res & LCBHT_S_ERROR) {
126
+ * // handle error
127
+ * break;
128
+ * }
129
+ * if (nbody) {
130
+ * // handle body
131
+ * }
132
+ * input += nused;
133
+ * inlen -= nused;
134
+ * } while (!(res & LCBHT_S_DONE));
135
+ * @endcode
136
+ */
137
+ lcbht_RESPSTATE
138
+ lcbht_parse_ex(lcbht_pPARSER parser, const void *data, unsigned ndata,
139
+ unsigned *nused, unsigned *nbody, const char **pbody);
140
+
141
+
142
+ /**
143
+ * Obtain the current response being processed.
144
+ * @param parser The parser
145
+ * @return a pointer to a response object. The response object is only valid
146
+ * until the next call into another parser API
147
+ */
148
+ lcbht_RESPONSE *
149
+ lcbht_get_response(lcbht_pPARSER parser);
150
+
151
+ /**
152
+ * Determine whether HTTP/1.1 keepalive is enabled on the connection
153
+ * @param parser The parser
154
+ * @return true if keepalive is enabled, false otherwise.
155
+ */
156
+ int
157
+ lcbht_can_keepalive(lcbht_pPARSER parser);
158
+
159
+ /**
160
+ * Clear the response object
161
+ * @param resp the response to clear
162
+ */
163
+ void
164
+ lcbht_clear_response(lcbht_RESPONSE *resp);
165
+
166
+ /**
167
+ * Get a header value for a key
168
+ * @param response The response
169
+ * @param key The key to look up
170
+ * @return A string containing the value. If the header has no value then the
171
+ * empty string will be returned. If the header does not exist NULL will be
172
+ * returned.
173
+ */
174
+ const char *
175
+ lcbht_get_resphdr(const lcbht_RESPONSE *response, const char *key);
176
+
177
+ /**
178
+ * Return a list of headers
179
+ * @param response The response
180
+ * @return A list of headers. Iterate over this value like so:
181
+ * @code{.c}
182
+ * char **hdrlist = lcbht_make_resphdrlist(response);
183
+ * for (char **cur = hdrlist; *cur; cur += 2) {
184
+ * char *key = cur[0];
185
+ * char *value = cur[1];
186
+ * // do something
187
+ * free(key);
188
+ * free(value);
189
+ * }
190
+ * free(hdrlist);
191
+ * @endcode
192
+ */
193
+ char **
194
+ lcbht_make_resphdrlist(lcbht_RESPONSE *response);
195
+
196
+ #ifdef __cplusplus
197
+ }
198
+ #endif
199
+ #endif
@@ -0,0 +1,557 @@
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 "config.h"
19
+ #include "connect.h"
20
+ #include "ioutils.h"
21
+ #include "iotable.h"
22
+ #include "settings.h"
23
+ #include "timer-ng.h"
24
+ #include <errno.h>
25
+
26
+ /* win32 lacks EAI_SYSTEM */
27
+ #ifndef EAI_SYSTEM
28
+ #define EAI_SYSTEM 0
29
+ #endif
30
+ #define LOGARGS(conn, lvl) conn->settings, "connection", LCB_LOG_##lvl, __FILE__, __LINE__
31
+ static const lcb_host_t *get_loghost(lcbio_SOCKET *s) {
32
+ static lcb_host_t host = { "NOHOST", "NOPORT" };
33
+ if (!s) { return &host; }
34
+ if (!s->info) { return &host; }
35
+ return &s->info->ep;
36
+ }
37
+
38
+ /** Format string arguments for %p%s:%s */
39
+ #define CSLOGID(sock) get_loghost(sock)->host, get_loghost(sock)->port, (void*)s
40
+ #define CSLOGFMT "<%s:%s> (SOCK=%p) "
41
+
42
+ typedef enum {
43
+ CS_PENDING = 0,
44
+ CS_CANCELLED,
45
+ CS_TIMEDOUT,
46
+ CS_CONNECTED,
47
+ CS_ERROR
48
+ } connect_state;
49
+
50
+ typedef struct lcbio_CONNSTART {
51
+ lcbio_CONNDONE_cb handler;
52
+ lcbio_SOCKET *sock;
53
+ lcbio_OSERR syserr;
54
+ void *arg;
55
+ void *event;
56
+ short ev_active; /* whether the event pointer is active (Event only) */
57
+ short in_uhandler; /* Whether we're inside the user-defined handler */
58
+ struct addrinfo *ai_root;
59
+ struct addrinfo *ai;
60
+ connect_state state;
61
+ lcb_error_t pending;
62
+ lcbio_ASYNC *async;
63
+ char *hoststr;
64
+ } lcbio_CONNSTART;
65
+
66
+ static void
67
+ cs_unwatch(lcbio_CONNSTART *cs)
68
+ {
69
+ lcbio_SOCKET *s = cs->sock;
70
+ if (s && cs->ev_active) {
71
+ lcb_assert(s->u.fd != INVALID_SOCKET);
72
+ IOT_V0EV(s->io).cancel(IOT_ARG(s->io), s->u.fd, cs->event);
73
+ cs->ev_active = 0;
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Handler invoked to deliver final status for a connection. This will invoke
79
+ * the user supplied callback with the relevant status (if it has not been
80
+ * cancelled) and then free the CONNSTART object.
81
+ */
82
+ static void
83
+ cs_handler(void *cookie)
84
+ {
85
+ lcbio_CONNSTART *cs = cookie;
86
+ lcb_error_t err;
87
+ lcbio_SOCKET *s = cs->sock;
88
+
89
+ if (s && cs->event) {
90
+ cs_unwatch(cs);
91
+ IOT_V0EV(s->io).destroy(IOT_ARG(s->io), cs->event);
92
+ }
93
+
94
+ if (cs->state == CS_PENDING) {
95
+ /* state was not changed since initial scheduling */
96
+ err = LCB_ETIMEDOUT;
97
+ } else if (cs->state == CS_CONNECTED) {
98
+ /* clear pending error */
99
+ err = LCB_SUCCESS;
100
+ } else {
101
+ if (s != NULL && cs->pending == LCB_CONNECT_ERROR) {
102
+ err = lcbio_mklcberr(cs->syserr, s->settings);
103
+ } else {
104
+ err = cs->pending;
105
+ }
106
+ }
107
+
108
+ if (cs->state == CS_CANCELLED) {
109
+ /* ignore everything. Clean up resources */
110
+ goto GT_DTOR;
111
+ }
112
+
113
+ if (s) {
114
+ lcbio__load_socknames(s);
115
+ if (err == LCB_SUCCESS) {
116
+ lcb_log(LOGARGS(s, INFO), CSLOGFMT "Connected ", CSLOGID(s));
117
+
118
+ if (s->settings->tcp_nodelay) {
119
+ lcb_error_t ndrc = lcbio_disable_nagle(s);
120
+ if (ndrc != LCB_SUCCESS) {
121
+ lcb_log(LOGARGS(s, INFO), CSLOGFMT "Couldn't set TCP_NODELAY", CSLOGID(s));
122
+ } else {
123
+ lcb_log(LOGARGS(s, DEBUG), CSLOGFMT "Successfuly set TCP_NODELAY", CSLOGID(s));
124
+ }
125
+ }
126
+ } else {
127
+ lcb_log(LOGARGS(s, ERR), CSLOGFMT "Failed: lcb_err=0x%x, os_errno=%u", CSLOGID(s), err, cs->syserr);
128
+ }
129
+ }
130
+
131
+ /** Handler section */
132
+ cs->in_uhandler = 1;
133
+ cs->handler(err == LCB_SUCCESS ? s : NULL, cs->arg, err, cs->syserr);
134
+
135
+ GT_DTOR:
136
+ if (cs->async) {
137
+ lcbio_timer_destroy(cs->async);
138
+ }
139
+ if (cs->sock) {
140
+ lcbio_unref(cs->sock);
141
+ }
142
+ if (cs->ai_root) {
143
+ freeaddrinfo(cs->ai_root);
144
+ }
145
+ free(cs);
146
+ }
147
+
148
+ static void
149
+ cs_state_signal(lcbio_CONNSTART *cs, connect_state state, lcb_error_t err)
150
+ {
151
+ if (cs->state != CS_PENDING) {
152
+ /** State already set */
153
+ return;
154
+ }
155
+
156
+
157
+ if (state == CS_CONNECTED) {
158
+ /* clear last errors if we're successful */
159
+ cs->pending = LCB_SUCCESS;
160
+ } else if (cs->pending == LCB_SUCCESS) {
161
+ /* set error code only if previous code was not a failure */
162
+ cs->pending = err;
163
+ }
164
+
165
+ cs->state = state;
166
+ lcbio_async_signal(cs->async);
167
+ }
168
+
169
+ /** Cancels and mutes any pending event */
170
+ void
171
+ lcbio_connect_cancel(lcbio_pCONNSTART cs)
172
+ {
173
+ if (cs->in_uhandler) {
174
+ /* already inside user-defined handler */
175
+ return;
176
+ }
177
+ cs->state = CS_CANCELLED;
178
+ cs_handler(cs);
179
+ }
180
+
181
+
182
+ static int
183
+ ensure_sock(lcbio_CONNSTART *cs)
184
+ {
185
+ lcbio_SOCKET *s = cs->sock;
186
+ lcbio_TABLE *io = s->io;
187
+ int errtmp = 0;
188
+
189
+ if (cs->ai == NULL) {
190
+ return -1;
191
+ }
192
+
193
+ if (IOT_IS_EVENT(io)) {
194
+ if (s->u.fd != INVALID_SOCKET) {
195
+ /* already have one? */
196
+ return 0;
197
+ }
198
+
199
+ while (s->u.fd == INVALID_SOCKET && cs->ai != NULL) {
200
+ s->u.fd = lcbio_E_ai2sock(io, &cs->ai, &errtmp);
201
+ if (s->u.fd != INVALID_SOCKET) {
202
+ return 0;
203
+ }
204
+ }
205
+ } else {
206
+ if (s->u.sd) {
207
+ return 0;
208
+ }
209
+
210
+ while (s->u.sd == NULL && cs->ai != NULL) {
211
+ s->u.sd = lcbio_C_ai2sock(io, &cs->ai, &errtmp);
212
+ if (s->u.sd) {
213
+ s->u.sd->lcbconn = (void *) cs->sock;
214
+ s->u.sd->parent = IOT_ARG(io);
215
+ return 0;
216
+ }
217
+ }
218
+ }
219
+
220
+ if (cs->ai == NULL) {
221
+ lcbio_mksyserr(IOT_ERRNO(io), &cs->syserr);
222
+ return -1;
223
+ }
224
+ return 0;
225
+ }
226
+
227
+ static void
228
+ destroy_cursock(lcbio_CONNSTART *cs)
229
+ {
230
+ lcbio_SOCKET *s = cs->sock;
231
+ lcbio_TABLE *iot = s->io;
232
+ if (cs->ai) {
233
+ cs->ai = cs->ai->ai_next;
234
+ }
235
+
236
+ if (!cs->ai) {
237
+ return;
238
+ }
239
+
240
+ if (IOT_IS_EVENT(iot)) {
241
+ if (cs->ev_active) {
242
+ lcb_assert(s->u.fd != INVALID_SOCKET);
243
+ IOT_V0EV(iot).cancel(IOT_ARG(iot), s->u.fd, cs->event);
244
+ cs->ev_active = 0;
245
+ }
246
+ IOT_V0IO(iot).close(IOT_ARG(iot), s->u.fd);
247
+ s->u.fd = INVALID_SOCKET;
248
+ } else {
249
+ if (s->u.sd) {
250
+ IOT_V1(iot).close(IOT_ARG(iot), s->u.sd);
251
+ s->u.sd = NULL;
252
+ }
253
+ }
254
+ }
255
+
256
+ static void
257
+ E_connect(lcb_socket_t sock, short events, void *arg)
258
+ {
259
+ lcbio_CONNSTART *cs = arg;
260
+ lcbio_SOCKET *s = cs->sock;
261
+ lcbio_TABLE *io = s->io;
262
+ int retry_once = 0;
263
+ lcbio_CSERR connstatus;
264
+
265
+ (void)sock;
266
+
267
+ lcb_log(LOGARGS(s, TRACE), CSLOGFMT "Got event handler for new connection", CSLOGID(s));
268
+
269
+ GT_NEXTSOCK:
270
+ if (ensure_sock(cs) == -1) {
271
+ cs_state_signal(cs, CS_ERROR, LCB_CONNECT_ERROR);
272
+ return;
273
+ }
274
+
275
+ if (events & LCB_ERROR_EVENT) {
276
+ socklen_t errlen = sizeof(int);
277
+ int sockerr = 0;
278
+ lcb_log(LOGARGS(s, TRACE), CSLOGFMT "Received ERROR_EVENT", CSLOGID(s));
279
+ getsockopt(s->u.fd, SOL_SOCKET, SO_ERROR, (char *)&sockerr, &errlen);
280
+ lcbio_mksyserr(sockerr, &cs->syserr);
281
+ destroy_cursock(cs);
282
+ goto GT_NEXTSOCK;
283
+
284
+ } else {
285
+ int rv = 0;
286
+ struct addrinfo *ai = cs->ai;
287
+
288
+ GT_CONNECT:
289
+ rv = IOT_V0IO(io).connect0(
290
+ IOT_ARG(io), s->u.fd, ai->ai_addr, (unsigned)ai->ai_addrlen);
291
+
292
+ if (rv == 0) {
293
+ cs_unwatch(cs);
294
+ cs_state_signal(cs, CS_CONNECTED, LCB_SUCCESS);
295
+ return;
296
+ }
297
+ }
298
+
299
+ connstatus = lcbio_mkcserr(IOT_ERRNO(io));
300
+ lcbio_mksyserr(IOT_ERRNO(io), &cs->syserr);
301
+
302
+
303
+ switch (connstatus) {
304
+
305
+ case LCBIO_CSERR_INTR:
306
+ goto GT_CONNECT;
307
+
308
+ case LCBIO_CSERR_CONNECTED:
309
+ cs_unwatch(cs);
310
+ cs_state_signal(cs, CS_CONNECTED, LCB_SUCCESS);
311
+ return;
312
+
313
+ case LCBIO_CSERR_BUSY:
314
+ lcb_log(LOGARGS(s, TRACE), CSLOGFMT "Scheduling asynchronous watch for socket.", CSLOGID(s));
315
+ IOT_V0EV(io).watch(
316
+ IOT_ARG(io), s->u.fd, cs->event, LCB_WRITE_EVENT, cs, E_connect);
317
+ cs->ev_active = 1;
318
+ return;
319
+
320
+ case LCBIO_CSERR_EINVAL:
321
+ if (!retry_once) {
322
+ retry_once = 1;
323
+ goto GT_CONNECT;
324
+ }
325
+ /* fallthrough */
326
+
327
+ case LCBIO_CSERR_EFAIL:
328
+ default:
329
+ /* close the current socket and try again */
330
+ lcb_log(LOGARGS(s, TRACE), CSLOGFMT "connect() failed. os_error=%d [%s]", CSLOGID(s), IOT_ERRNO(io), strerror(IOT_ERRNO(io)));
331
+ destroy_cursock(cs);
332
+ goto GT_NEXTSOCK;
333
+ }
334
+ }
335
+
336
+ static void C_connect(lcbio_CONNSTART *cs);
337
+
338
+ static void
339
+ C_conncb(lcb_sockdata_t *sock, int status)
340
+ {
341
+ lcbio_SOCKET *s = (void *)sock->lcbconn;
342
+ lcbio_CONNSTART *cs = (void *)s->ctx;
343
+
344
+ lcb_log(LOGARGS(s, TRACE), CSLOGFMT "Received completion handler. Status=%d. errno=%d", CSLOGID(s), status, IOT_ERRNO(s->io));
345
+
346
+ if (!--s->refcount) {
347
+ lcbio__destroy(s);
348
+ return;
349
+ }
350
+
351
+ if (!status) {
352
+ if (cs->state == CS_PENDING) {
353
+ cs->state = CS_CONNECTED;
354
+ }
355
+ cs_handler(cs);
356
+ } else {
357
+ lcbio_mksyserr(IOT_ERRNO(s->io), &cs->syserr);
358
+ destroy_cursock(cs);
359
+ C_connect(cs);
360
+ }
361
+ }
362
+
363
+ static void
364
+ C_connect(lcbio_CONNSTART *cs)
365
+ {
366
+ int rv;
367
+ lcbio_SOCKET *s = cs->sock;
368
+ int retry_once = 0;
369
+ lcbio_CSERR status;
370
+ lcbio_TABLE *io = s->io;
371
+
372
+ GT_NEXTSOCK:
373
+ if (ensure_sock(cs) != 0) {
374
+ lcbio_mksyserr(IOT_ERRNO(io), &cs->syserr);
375
+ cs_state_signal(cs, CS_ERROR, LCB_CONNECT_ERROR);
376
+ return;
377
+ }
378
+
379
+ GT_CONNECT:
380
+ rv = IOT_V1(io).connect(IOT_ARG(io), s->u.sd, cs->ai->ai_addr,
381
+ (unsigned)cs->ai->ai_addrlen, C_conncb);
382
+ if (rv == 0) {
383
+ lcbio_ref(s);
384
+ return;
385
+ }
386
+
387
+ lcbio_mksyserr(IOT_ERRNO(io), &cs->syserr);
388
+ status = lcbio_mkcserr(IOT_ERRNO(io));
389
+ switch (status) {
390
+
391
+ case LCBIO_CSERR_INTR:
392
+ goto GT_CONNECT;
393
+
394
+ case LCBIO_CSERR_CONNECTED:
395
+ cs_state_signal(cs, CS_CONNECTED, LCB_SUCCESS);
396
+ return;
397
+
398
+ case LCBIO_CSERR_BUSY:
399
+ return;
400
+
401
+ case LCBIO_CSERR_EINVAL:
402
+ if (!retry_once) {
403
+ retry_once = 1;
404
+ goto GT_CONNECT;
405
+ }
406
+ /* fallthrough */
407
+
408
+ case LCBIO_CSERR_EFAIL:
409
+ default:
410
+ destroy_cursock(cs);
411
+ goto GT_NEXTSOCK;
412
+ }
413
+ }
414
+
415
+ struct lcbio_CONNSTART *
416
+ lcbio_connect(lcbio_TABLE *iot, lcb_settings *settings, const lcb_host_t *dest,
417
+ uint32_t timeout, lcbio_CONNDONE_cb handler, void *arg)
418
+ {
419
+ lcbio_SOCKET *s;
420
+ lcbio_CONNSTART *ret;
421
+ struct addrinfo hints;
422
+ int rv;
423
+
424
+ s = calloc(1, sizeof(*s));
425
+ ret = calloc(1, sizeof(*ret));
426
+
427
+ /** Initialize the socket first */
428
+ s->io = iot;
429
+ s->settings = settings;
430
+ s->ctx = ret;
431
+ s->refcount = 1;
432
+ s->info = calloc(1, sizeof(*s->info));
433
+ s->info->ep = *dest;
434
+ lcbio_table_ref(s->io);
435
+ lcb_settings_ref(s->settings);
436
+ lcb_list_init(&s->protos);
437
+
438
+ if (IOT_IS_EVENT(iot)) {
439
+ s->u.fd = INVALID_SOCKET;
440
+ ret->event = IOT_V0EV(iot).create(IOT_ARG(iot));
441
+ }
442
+
443
+ /** Initialize the connstart structure */
444
+ ret->handler = handler;
445
+ ret->arg = arg;
446
+ ret->sock = s;
447
+ ret->async = lcbio_timer_new(iot, ret, cs_handler);
448
+
449
+ lcbio_timer_rearm(ret->async, timeout);
450
+ lcb_log(LOGARGS(s, INFO), CSLOGFMT "Starting. Timeout=%uus", CSLOGID(s), timeout);
451
+
452
+ /** Hostname lookup: */
453
+ memset(&hints, 0, sizeof(hints));
454
+ hints.ai_flags = AI_PASSIVE;
455
+ hints.ai_socktype = SOCK_STREAM;
456
+ if (settings->ipv6 == LCB_IPV6_DISABLED) {
457
+ hints.ai_family = AF_INET;
458
+ } else if (settings->ipv6 == LCB_IPV6_ONLY) {
459
+ hints.ai_family = AF_INET6;
460
+ } else {
461
+ hints.ai_family = AF_UNSPEC;
462
+ }
463
+
464
+ if ((rv = getaddrinfo(dest->host, dest->port, &hints, &ret->ai_root))) {
465
+ const char *errstr = rv != EAI_SYSTEM ? gai_strerror(rv) : "";
466
+ lcb_log(LOGARGS(s, ERR), CSLOGFMT "Couldn't look up %s (%s) [EAI=%d]", CSLOGID(s), dest->host, errstr, rv);
467
+ cs_state_signal(ret, CS_ERROR, LCB_UNKNOWN_HOST);
468
+ } else {
469
+ ret->ai = ret->ai_root;
470
+
471
+ /** Figure out how to connect */
472
+ if (IOT_IS_EVENT(iot)) {
473
+ E_connect(-1, LCB_WRITE_EVENT, ret);
474
+ } else {
475
+ C_connect(ret);
476
+ }
477
+ }
478
+ return ret;
479
+ }
480
+
481
+ lcbio_CONNSTART *
482
+ lcbio_connect_hl(lcbio_TABLE *iot, lcb_settings *settings,
483
+ hostlist_t hl, int rollover, uint32_t timeout,
484
+ lcbio_CONNDONE_cb handler, void *arg)
485
+ {
486
+ const lcb_host_t *cur;
487
+ unsigned ii, hlmax;
488
+ ii = 0;
489
+ hlmax = hostlist_size(hl);
490
+
491
+ while ( (cur = hostlist_shift_next(hl, rollover)) && ii++ < hlmax) {
492
+ lcbio_CONNSTART *ret = lcbio_connect(
493
+ iot, settings, cur, timeout, handler, arg);
494
+ if (ret) {
495
+ return ret;
496
+ }
497
+ }
498
+
499
+ return NULL;
500
+ }
501
+
502
+ lcbio_SOCKET *
503
+ lcbio_wrap_fd(lcbio_pTABLE iot, lcb_settings *settings, lcb_socket_t fd)
504
+ {
505
+ lcbio_SOCKET *ret = calloc(1, sizeof(*ret));
506
+ lcbio_CONNDONE_cb *ci = calloc(1, sizeof(*ci));
507
+
508
+ if (ret == NULL || ci == NULL) {
509
+ free(ret);
510
+ free(ci);
511
+ return NULL;
512
+ }
513
+
514
+ assert(iot->model = LCB_IOMODEL_EVENT);
515
+
516
+ lcb_list_init(&ret->protos);
517
+ ret->settings = settings;
518
+ ret->io = iot;
519
+ ret->refcount = 1;
520
+ ret->u.fd = fd;
521
+
522
+ lcbio_table_ref(ret->io);
523
+ lcb_settings_ref(ret->settings);
524
+ lcbio__load_socknames(ret);
525
+ return ret;
526
+ }
527
+
528
+ void
529
+ lcbio_shutdown(lcbio_SOCKET *s)
530
+ {
531
+ lcbio_TABLE *io = s->io;
532
+
533
+ lcbio__protoctx_delall(s);
534
+ if (IOT_IS_EVENT(io)) {
535
+ if (s->u.fd != INVALID_SOCKET) {
536
+ IOT_V0IO(io).close(IOT_ARG(io), s->u.fd);
537
+ s->u.fd = INVALID_SOCKET;
538
+ }
539
+ } else {
540
+ if (s->u.sd) {
541
+ IOT_V1(io).close(IOT_ARG(io), s->u.sd);
542
+ s->u.sd = NULL;
543
+ }
544
+ }
545
+ }
546
+
547
+ void
548
+ lcbio__destroy(lcbio_SOCKET *s)
549
+ {
550
+ lcbio_shutdown(s);
551
+ if (s->info) {
552
+ free(s->info);
553
+ }
554
+ lcbio_table_unref(s->io);
555
+ lcb_settings_unref(s->settings);
556
+ free(s);
557
+ }