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,405 @@
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_CTXEASY_H
19
+ #define LCBIO_CTXEASY_H
20
+ #include "connect.h"
21
+ #include "rdb/rope.h"
22
+ #include "ringbuffer.h"
23
+
24
+ #ifdef __cplusplus
25
+ extern "C" {
26
+ #endif
27
+
28
+ /**
29
+ * @file
30
+ * This file contains routines for reading and writing from and to a socket
31
+ */
32
+
33
+ /**
34
+ * @ingroup lcbio
35
+ * @defgroup lcbio-ctx Reading/Writing Routines
36
+ *
37
+ * @details
38
+ *
39
+ * # Attaching
40
+ *
41
+ * A context is first _attached_ to a socket and a _user-defined_ data object.
42
+ * The idea is that the context is the broker which schedules I/O on behalf
43
+ * of the application to the socket, and then receives events from the socket,
44
+ * passing it along to user-defined data.
45
+ *
46
+ * To create a new context, invoke the lcbio_ctx_new() function. When you are done
47
+ * with it call the lcbio_ctx_close() function.
48
+ *
49
+ * # Reading
50
+ *
51
+ * Reading data is done through first requesting an amount of data to read
52
+ * and then reading the data from the buffers when the lcbio_CTXPROCS#cb_read
53
+ * handler is invoked.
54
+ *
55
+ * Requesting an amount of data to be read may be dependent on some current
56
+ * parsing context. In cases where the expected message size is known the pattern
57
+ * is to initially request the size of the header; once the header has been
58
+ * delivered to the application, the application should request the full
59
+ * header+body size, and so on.
60
+ *
61
+ * For streaming based protocols where the amount of data is not known ahead of
62
+ * time, requesting a single byte may be sufficient. Note that typically the
63
+ * read callback will be invoked with _more_ bytes than requested.
64
+ *
65
+ * Data is read from the network as one or more chunks to improve performance
66
+ * and increase flexibility. Because of this model, you must iterate over the
67
+ * data read _or_ employ the underlying <rdb/rope.h> API. For streaming data
68
+ * sockets where data may simply be copied to another buffer, use the iterator
69
+ * API presented here.
70
+ *
71
+ * @note The RDB interface requires you to explicitly advance the read
72
+ * cursor in addition to actually obtaining the data. This is handled within
73
+ * the iterator interface declared in this file (but of course must be done
74
+ * manually if employing RDB directly).
75
+ *
76
+ *
77
+ * # Writing
78
+ *
79
+ * Writing can be done through a simple lcbio_ctx_put() which simply copies data
80
+ * to an output buffer, or can be done through more efficient but complex means -
81
+ * see the lcbio_ctx_wwant() function.
82
+ *
83
+ * # Scheduling
84
+ *
85
+ * Any I/O **must always be scheduled**. For maximal efficiency the various
86
+ * read/write functions only set internal flags within the contexts to act
87
+ * as hints that the application intends to read and write data. However in
88
+ * order to actually perform these operations, kernel/OS calls are needed.
89
+ *
90
+ * To indicate that no subsequent I/O operations will be requested until the next
91
+ * event loop iteration, _and_ to apply/schedule any existing I/O within the
92
+ * current iteration, the lcbio_ctx_schedule() function should be called.
93
+ *
94
+ *
95
+ * @addtogroup lcbio-ctx
96
+ * @{ */
97
+
98
+ typedef struct lcbio_CTX *lcbio_pCTX;
99
+
100
+ /**
101
+ * @brief Handlers for I/O events
102
+ */
103
+ typedef struct {
104
+ /** Error handler invoked with the context and the received error */
105
+ void (*cb_err)(lcbio_pCTX, lcb_error_t);
106
+
107
+ /** Read handler invoked with the context and the number of bytes read */
108
+ void (*cb_read)(lcbio_pCTX, unsigned total);
109
+
110
+ /** Triggered by lcbio_ctx_wwant() */
111
+ void (*cb_flush_ready)(lcbio_pCTX);
112
+
113
+ /** Triggered when data has been flushed from lcbio_ctx_put_ex() */
114
+ void (*cb_flush_done)(lcbio_pCTX, unsigned requested, unsigned nflushed);
115
+ } lcbio_CTXPROCS;
116
+
117
+ /**
118
+ * Container buffer handle containing a backref to the original context.
119
+ * @private
120
+ */
121
+ typedef struct {
122
+ ringbuffer_t rb;
123
+ lcbio_pCTX parent;
124
+ } lcbio__EASYRB;
125
+
126
+ /**
127
+ * @brief Context for socket I/O
128
+ *
129
+ * The CTX structure represents an ownership of a socket. It provides routines
130
+ * for reading and writing from and to the socket, as well as associating
131
+ * application data with the socket.
132
+ */
133
+ typedef struct lcbio_CTX {
134
+ lcbio_SOCKET *sock; /**< Socket resource */
135
+ lcbio_pTABLE io; /**< Cached IO table */
136
+ void *data; /**< Associative pointer */
137
+ void *event; /**< event pointer for E-model I/O */
138
+ lcb_sockdata_t *sd; /**< cached SD for C-model I/O */
139
+ lcbio__EASYRB *output; /**< for lcbio_ctx_put() */
140
+ lcb_socket_t fd; /**< cached FD for E-model I/O */
141
+ char evactive; /**< watcher is active for E-model I/O */
142
+ char wwant; /**< flag for lcbio_ctx_put_ex */
143
+ char state; /**< internal state */
144
+ char entered; /**< inside event handler */
145
+ unsigned npending; /**< reference count on pending I/O */
146
+ unsigned rdwant; /**< number of remaining bytes to read */
147
+ lcb_error_t err; /**< pending error */
148
+ rdb_IOROPE ior; /**< for reads */
149
+ lcbio_pASYNC as_err; /**< async error handler */
150
+ lcbio_CTXPROCS procs; /**< callbacks */
151
+ const char *subsys; /**< Informational description of connection */
152
+ } lcbio_CTX;
153
+
154
+ /**@name Creating and Closing
155
+ *@{*/
156
+
157
+ /**
158
+ * Creates a new context object.
159
+ *
160
+ * The object remains valid until lcbio_ctx_close() is invoked.
161
+ *
162
+ * @param sock the underlying socket object. This function increments the
163
+ * socket's reference count.
164
+ * @param data user defined data to associate with context. The data may be
165
+ * obtained at a later point via lcbio_ctx_data()
166
+ *
167
+ * @param procs callback table
168
+ * @return a new context object.
169
+ */
170
+ lcbio_CTX *
171
+ lcbio_ctx_new(lcbio_SOCKET *sock, void *data, const lcbio_CTXPROCS *procs);
172
+
173
+
174
+ /**
175
+ * Callback invoked when the connection is about to be release
176
+ * @param sock the socket being released.
177
+ * @param releasable whether the socket may be reused
178
+ * @param arg an argument passed to the close() function.
179
+ *
180
+ * If you wish to reuse the socket (and reusable is true) then the socket's
181
+ * reference count should be incremented via lcbio_ref().
182
+ */
183
+ typedef void
184
+ (*lcbio_CTXCLOSE_cb)(lcbio_SOCKET *sock, int releasable, void *arg);
185
+
186
+ /**
187
+ * @brief Close the context object.
188
+ *
189
+ * This will invalidate any pending I/O operations
190
+ * and subsequent callbacks on the context will not be received. After calling
191
+ * this function, the pointer will be deemed invalid.
192
+ *
193
+ * @param ctx
194
+ * @param callback a callback to invoke (see above)
195
+ * @param arg argument passed to the callback
196
+ */
197
+ void
198
+ lcbio_ctx_close(lcbio_CTX *ctx, lcbio_CTXCLOSE_cb callback, void *arg);
199
+
200
+ typedef void (*lcbio_CTXDTOR_cb)(lcbio_pCTX);
201
+ void
202
+ lcbio_ctx_close_ex(lcbio_CTX *ctx, lcbio_CTXCLOSE_cb cb, void *cbarg,
203
+ lcbio_CTXDTOR_cb dtor, void *dtor_arg);
204
+ /**@}*/
205
+
206
+
207
+ /**@name Informational Routines
208
+ * @{*/
209
+
210
+ /**
211
+ * Get the data associated with the context. This is the pointer specified
212
+ * during the constructor
213
+ */
214
+ #define lcbio_ctx_data(ctx) (ctx)->data
215
+
216
+ /** Get the associated lcbio_SOCKET object */
217
+ #define lcbio_ctx_sock(ctx) (ctx)->sock
218
+
219
+ /** Dump a textual representation of the context to the screen */
220
+ void
221
+ lcbio_ctx_dump(lcbio_CTX *ctx, FILE *fp);
222
+
223
+ /**@}*/
224
+
225
+ /** Asynchronously trigger the error callback */
226
+ void
227
+ lcbio_ctx_senderr(lcbio_CTX *ctx, lcb_error_t err);
228
+
229
+
230
+ /**
231
+ * Schedule any pending I/O to be scheduled immediately. If data was requested
232
+ * via lcbio_ctx_rwant() then a request will be sent for reading. If data was
233
+ * requested to be flushed either via lcbio_ctx_put() or lcbio_ctx_wwant()
234
+ * then those will be scheduled as well.
235
+ *
236
+ * This call is a no-op if invoked from within the current handler, as this
237
+ * function is invoked implicitly after the I/O handler itself has returned.
238
+ *
239
+ * It is safe (though typically not efficient) to invoke this function
240
+ * multiple times. Each invocation may potentially involve system calls
241
+ * and buffer allocations, depending on the I/O plugin being used.
242
+ */
243
+ void
244
+ lcbio_ctx_schedule(lcbio_CTX *ctx);
245
+
246
+ /**
247
+ * @brief Add output data to the write buffer.
248
+ *
249
+ * The data added is copied to an internal buffer and flushed to the network
250
+ * when appropriate. If you wish to have more control over how the data is written
251
+ * then see the lcbio_ctx_wwant() function.
252
+ *
253
+ * @param ctx
254
+ * @param buf the buffer to write
255
+ * @param nbuf the size of the buffer to write
256
+ */
257
+ void
258
+ lcbio_ctx_put(lcbio_CTX *ctx, const void *buf, unsigned nbuf);
259
+
260
+ /**
261
+ * Invoke the lcbio_CTXPROCS#cb_flush_ready()
262
+ * callback when a flush may be invoked. Note that the
263
+ * callback may be invoked from within this function itself, or
264
+ * it may be invoked at some point later.
265
+ *
266
+ * In order to ensure that the callback is actually invoked (in
267
+ * cases where it is not invoked immediately), call lcbio_ctx_schedule()
268
+ * before returning to the loop.
269
+ *
270
+ * When the callback is invoked, you should call the lcbio_ctx_put_ex() function
271
+ * to actually enqueue the data to be written. The lcbio_ctx_put_ex() function
272
+ * should be called multiple times until either no write buffers remain
273
+ * or the function itself returns a false value. The lcbio_ctx_put_ex() function
274
+ * may either flush the data immediately or schedule for the data to be flushed
275
+ * depending on the I/O implementation and network conditions.
276
+ *
277
+ * Once the data is actually flushed to the socket's buffers, the
278
+ * lcbio_CTXPROCS#cb_flush_done() callback is invoked.
279
+ * This callback indicates the underlying buffers are no longer required and may
280
+ * be released or reused by the application. Note that the IOV array passed
281
+ * into lcbio_ctx_put_ex() is always _Conceptually_ copied (i.e.
282
+ * this may be a stack-based structure which does not need to remain valid
283
+ * outside the function call to lcbio_ctx_put_ex() itself).
284
+ *
285
+ * Additionally, note that the number of bytes flushed within the
286
+ * lcbio_CTXPROCS#cb_flush_done()
287
+ * callback may not equal the number of bytes initially placed inside the IOVs
288
+ * (i.e. it may be less). In this case the application is expected to update
289
+ * the IOV structures and the origin buffers appropriately.
290
+ *
291
+ * This model allows for efficient handling in both completion and event based
292
+ * environments.
293
+ *
294
+ * ### Implementation Notes
295
+ *
296
+ * For completion-based models, the lcbio_CTXPROCS#cb_flush_ready()
297
+ * callback is invoked immediately from the wwant() function, while the
298
+ * flush_done() is dependent on the actual completion of the write.
299
+ *
300
+ * For event-based models, the wwant flag is set inside the context and is then
301
+ * checked by the lcbio_ctx_schedule() function. When the event handler is invoked, the
302
+ * flush_ready() callback is invoked as well - typically in a loop until an
303
+ * `EWOULDBLOCK` is received on the socket itself.
304
+ */
305
+ void
306
+ lcbio_ctx_wwant(lcbio_CTX *ctx);
307
+
308
+ /**
309
+ * @brief Flush data from the lcbio_CTXPROCS#cb_flush_ready() callback
310
+ *
311
+ * This function is intended to be called from within the `cb_flush_ready`
312
+ * handler (see lcbio_ctx_wwant()).
313
+ *
314
+ * @param ctx
315
+ * @param iov the IOV array. The IOV array may point to a stack-based array
316
+ * @param niov number of elements in the array
317
+ * @param nb The total number of bytes described by all the elements of the
318
+ * array.
319
+ *
320
+ * @return nonzero if more data can be written (i.e. this function may be
321
+ * invoked again), zero otherwise.
322
+ */
323
+ int
324
+ lcbio_ctx_put_ex(lcbio_CTX *ctx, lcb_IOV *iov, unsigned niov, unsigned nb);
325
+
326
+ /**
327
+ * Require that the read callback not be invoked until at least `n`
328
+ * bytes are available within the buffer.
329
+ *
330
+ * @param ctx
331
+ * @param n the number of bytes required to be in the buffer before the
332
+ * callback should be invoked.
333
+ *
334
+ * @note
335
+ * Note that this flag does _not_ maintain state between successive callbacks.
336
+ * You must call this function each time you need more data as it is cleared
337
+ * before the invocation into the callback.
338
+ *
339
+ * @note
340
+ * This function sets the number of **total** bytes
341
+ * which must be available in the buffer before the callback is invoked. Thus
342
+ * you should set this to the total number of bytes needed, and **not** the
343
+ * number of remaining bytes that should be read.
344
+ */
345
+ void
346
+ lcbio_ctx_rwant(lcbio_CTX *ctx, unsigned n);
347
+
348
+
349
+ /** @private */
350
+ typedef struct {
351
+ unsigned remaining;
352
+ void *buf;
353
+ unsigned nbuf;
354
+ } lcbio_CTXRDITER;
355
+
356
+ /**
357
+ * Iterate over the read buffers
358
+ *
359
+ * @code{.c}
360
+ * static void read_callback(lcbio_CTX *ctx, void *arg, unsigned nb) {
361
+ * lcbio_CTXRDITER iter;
362
+ * LCBIO_CTX_ITERFOR(ctx, &iter, nb) {
363
+ * void *buf = lcbio_ctx_ribuf(&iter);
364
+ * unsigned nbuf = lcbio_ctx_risize(&iter);
365
+ * // do stuff with the buffer
366
+ * }
367
+ * }
368
+ * @endcode
369
+ *
370
+ * When each iteration is complete, the pointer returned by ctx_ribuf is
371
+ * no longer valid.
372
+ *
373
+ * @param ctx the context which contains the buffer
374
+ * @param[in,out] iter an empty iterator
375
+ * @param[in] nb the number of bytes to iterate over.
376
+ */
377
+ #define LCBIO_CTX_ITERFOR(ctx, iter, nb) \
378
+ for (lcbio_ctx_ristart(ctx, iter, nb); !lcbio_ctx_ridone(iter); \
379
+ lcbio_ctx_rinext(ctx, iter))
380
+
381
+ /** Obtains the buffer from the current iterator */
382
+ #define lcbio_ctx_ribuf(iter) ((iter)->buf)
383
+
384
+ /** Obtains the length of the buffer from the current iterator */
385
+ #define lcbio_ctx_risize(iter) ((iter)->nbuf)
386
+
387
+ void
388
+ lcbio_ctx_ristart(lcbio_CTX *ctx, lcbio_CTXRDITER *iter, unsigned nb);
389
+
390
+ void
391
+ lcbio_ctx_rinext(lcbio_CTX *ctx, lcbio_CTXRDITER *iter);
392
+
393
+ #define lcbio_ctx_ridone(iter) (!(iter)->remaining)
394
+
395
+ #define LCBIO_CTX_RSCHEDULE(ctx, nb) do { \
396
+ lcbio_ctx_rwant(ctx, nb); \
397
+ lcbio_ctx_schedule(ctx); \
398
+ } while (0)
399
+
400
+ #ifdef __cplusplus
401
+ }
402
+ #endif
403
+ #endif
404
+
405
+ /** @} */
@@ -0,0 +1,290 @@
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
+ #define LCB_IOPS_V12_NO_DEPRECATE
19
+ #include <stdlib.h>
20
+ #include <stdio.h>
21
+ #include <string.h>
22
+ #include "iotable.h"
23
+ #include "connect.h" /* prototypes for iotable functions */
24
+
25
+ #define GET_23_FIELD(iops, fld) ((iops)->version == 2 ? (iops)->v.v2.fld : (iops)->v.v3.fld)
26
+
27
+ struct W_1to3_st {
28
+ lcb_ioC_write2_callback callback;
29
+ void *udata;
30
+ unsigned int refcount;
31
+ unsigned int last_error;
32
+ };
33
+
34
+ static void
35
+ W_1to3_callback(lcb_sockdata_t *sd, lcb_io_writebuf_t *wb, int status)
36
+ {
37
+ struct W_1to3_st *ott = (struct W_1to3_st*)(void *)wb->buffer.root;
38
+ lcb_ioC_wbfree_fn wbfree;
39
+
40
+ wb->buffer.root = NULL;
41
+ wb->buffer.ringbuffer = NULL;
42
+
43
+ if (sd->parent->version >= 2) {
44
+ wbfree = GET_23_FIELD(sd->parent, iot->u_io.completion.wbfree);
45
+ } else {
46
+ wbfree = sd->parent->v.v1.release_writebuf;
47
+ }
48
+
49
+ wbfree(sd->parent, sd, wb);
50
+
51
+ if (status != 0 && ott->last_error == 0) {
52
+ ott->last_error = sd->parent->v.v0.error;
53
+ }
54
+
55
+ if (--ott->refcount == 0) {
56
+ ott->callback(sd, ott->last_error, ott->udata);
57
+ free(ott);
58
+ }
59
+ }
60
+
61
+ static int
62
+ W_1to3_write(lcb_io_opt_t iops,
63
+ lcb_sockdata_t *sd,
64
+ struct lcb_iovec_st *iov,
65
+ lcb_size_t niov,
66
+ void *uarg,
67
+ lcb_ioC_write2_callback cb)
68
+ {
69
+ unsigned int ii = 0;
70
+ struct W_1to3_st *ott;
71
+ lcb_ioC_write_fn start_write;
72
+ lcb_ioC_wballoc_fn wballoc;
73
+
74
+ /** Schedule IOV writes, two at a time... */
75
+ ott = malloc(sizeof(*ott));
76
+ ott->callback = cb;
77
+ ott->udata = uarg;
78
+ ott->refcount = 0;
79
+ ott->last_error = 0;
80
+
81
+ if (iops->version >= 2) {
82
+ start_write = GET_23_FIELD(iops, iot->u_io.completion.write);
83
+ wballoc = GET_23_FIELD(iops, iot->u_io.completion.wballoc);
84
+ } else {
85
+ start_write = iops->v.v1.start_write;
86
+ wballoc = iops->v.v1.create_writebuf;
87
+ }
88
+
89
+ while (ii < niov) {
90
+ int jj = 0;
91
+ lcb_io_writebuf_t *wb;
92
+
93
+ wb = wballoc(iops, sd);
94
+ wb->buffer.root = (char*)ott;
95
+ wb->buffer.ringbuffer = NULL;
96
+
97
+ for (jj = 0; jj < 2 && ii < niov; ii++, jj++) {
98
+ wb->buffer.iov[jj] = iov[ii];
99
+ }
100
+ ott->refcount++;
101
+ start_write(iops, sd, wb, W_1to3_callback);
102
+ }
103
+ return 0;
104
+ }
105
+
106
+ struct R_1to3_st {
107
+ lcb_ioC_read2_callback callback;
108
+ void *uarg;
109
+ };
110
+
111
+ static void
112
+ R_1to3_callback(lcb_sockdata_t *sd, lcb_ssize_t nread)
113
+ {
114
+ struct lcb_buf_info *bi = &sd->read_buffer;
115
+ struct R_1to3_st *st = (void *)bi->root;
116
+ bi->root = NULL;
117
+ st->callback(sd, nread, st->uarg);
118
+ free(st);
119
+ }
120
+
121
+ static int
122
+ R_1to3_read(lcb_io_opt_t io, lcb_sockdata_t *sd, lcb_IOV *iov, lcb_size_t niov,
123
+ void *uarg, lcb_ioC_read2_callback callback)
124
+ {
125
+ unsigned ii;
126
+ int rv;
127
+ struct R_1to3_st *st;
128
+ struct lcb_buf_info *bi = &sd->read_buffer;
129
+ lcb_ioC_read_fn rdstart;
130
+
131
+ st = calloc(1, sizeof(*st));
132
+ st->callback = callback;
133
+ st->uarg = uarg;
134
+
135
+ for (ii = 0; ii < 2 && ii < niov; ii++) {
136
+ bi->iov[ii] = iov[ii];
137
+ }
138
+
139
+ for (; ii < 2; ii++) {
140
+ bi->iov[ii].iov_base = NULL;
141
+ bi->iov[ii].iov_len = 0;
142
+ }
143
+
144
+
145
+ bi->root = (void *)st;
146
+ if (io->version >= 2) {
147
+ rdstart = GET_23_FIELD(io, iot->u_io.completion.read);
148
+ } else {
149
+ rdstart = io->v.v1.start_read;
150
+ }
151
+
152
+ rv = rdstart(io, sd, R_1to3_callback);
153
+ return rv;
154
+ }
155
+
156
+ static int dummy_bsd_chkclosed(lcb_io_opt_t io, lcb_socket_t s, int f) {
157
+ (void)io; (void)s; (void)f; return LCB_IO_SOCKCHECK_STATUS_UNKNOWN;
158
+ }
159
+ static int dummy_comp_chkclosed(lcb_io_opt_t io, lcb_sockdata_t* s, int f) {
160
+ (void)io; (void)s; (void)f; return LCB_IO_SOCKCHECK_STATUS_UNKNOWN;
161
+ }
162
+
163
+ static void
164
+ init_v23_table(lcbio_TABLE *table, lcb_io_opt_t io)
165
+ {
166
+ lcb_io_procs_fn fn = GET_23_FIELD(io, get_procs);
167
+ fn(LCB_IOPROCS_VERSION, &table->loop, &table->timer, &table->u_io.v0.io,
168
+ &table->u_io.v0.ev, &table->u_io.completion, &table->model);
169
+
170
+ table->p = io;
171
+ if (table->model == LCB_IOMODEL_COMPLETION) {
172
+ if (!table->u_io.completion.write2) {
173
+ table->u_io.completion.write2 = W_1to3_write;
174
+ }
175
+
176
+ if (!table->u_io.completion.read2) {
177
+ table->u_io.completion.read2 = R_1to3_read;
178
+ }
179
+ lcb_assert(table->u_io.completion.read2);
180
+ lcb_assert(table->u_io.completion.write2);
181
+ }
182
+
183
+ if (table->model == LCB_IOMODEL_COMPLETION && IOT_V1(table).is_closed == NULL) {
184
+ IOT_V1(table).is_closed = dummy_comp_chkclosed;
185
+ }
186
+
187
+ if (table->model == LCB_IOMODEL_EVENT && IOT_V0IO(table).is_closed == NULL) {
188
+ IOT_V0IO(table).is_closed = dummy_bsd_chkclosed;
189
+ }
190
+ }
191
+
192
+ lcbio_TABLE *
193
+ lcbio_table_new(lcb_io_opt_t io)
194
+ {
195
+ lcbio_TABLE *table = calloc(1, sizeof(*table));
196
+ table->p = io;
197
+ table->refcount = 1;
198
+
199
+ if (io->version == 2) {
200
+ io->v.v2.iot = table;
201
+ init_v23_table(table, io);
202
+ return table;
203
+
204
+ } else if (io->version == 3) {
205
+ /* V3 exists exclusively for back-compat. We need to use a few tricks to
206
+ * determine if we are really v3, or if we've been 'overidden' somehow.
207
+ *
208
+ * To do this, we treat the padding fields (specifically, the event
209
+ * scheduling parts of the padding fields) as sentinel values. The
210
+ * built-in plugins should initialize this to NULL. If a client
211
+ * (e.g. Python SDK) overrides this, the field will no longer be
212
+ * NULL and will be a sign that the event fields have been
213
+ * used by a non-getprocs-aware client.
214
+ */
215
+
216
+ io->v.v3.iot = table;
217
+ if (io->v.v0.create_event == NULL) {
218
+ init_v23_table(table, io);
219
+ return table;
220
+ }
221
+ }
222
+
223
+ table->timer.create = io->v.v0.create_timer;
224
+ table->timer.destroy = io->v.v0.destroy_timer;
225
+ table->timer.cancel = io->v.v0.delete_timer;
226
+ table->timer.schedule = io->v.v0.update_timer;
227
+ table->loop.start = io->v.v0.run_event_loop;
228
+ table->loop.stop = io->v.v0.stop_event_loop;
229
+
230
+ if (io->version == 0 || io->version == 3) {
231
+ lcb_ev_procs *ev = &table->u_io.v0.ev;
232
+ lcb_bsd_procs *bsd = &table->u_io.v0.io;
233
+
234
+ table->model = LCB_IOMODEL_EVENT;
235
+ ev->create = io->v.v0.create_event;
236
+ ev->destroy = io->v.v0.destroy_event;
237
+ ev->cancel = io->v.v0.delete_event;
238
+ ev->watch = io->v.v0.update_event;
239
+ bsd->socket0 = io->v.v0.socket;
240
+ bsd->connect0 = io->v.v0.connect;
241
+ bsd->close = io->v.v0.close;
242
+ bsd->recv = io->v.v0.recv;
243
+ bsd->recvv = io->v.v0.recvv;
244
+ bsd->send = io->v.v0.send;
245
+ bsd->sendv = io->v.v0.sendv;
246
+ bsd->is_closed = dummy_bsd_chkclosed;
247
+
248
+ } else {
249
+ lcb_completion_procs *cp = &table->u_io.completion;
250
+
251
+ table->model = LCB_IOMODEL_COMPLETION;
252
+ cp->socket = io->v.v1.create_socket;
253
+ cp->close = io->v.v1.close_socket;
254
+ cp->connect = io->v.v1.start_connect;
255
+ cp->read = io->v.v1.start_read;
256
+ cp->write = io->v.v1.start_write;
257
+ cp->wballoc = io->v.v1.create_writebuf;
258
+ cp->nameinfo = io->v.v1.get_nameinfo;
259
+ cp->write2 = W_1to3_write;
260
+ cp->read2 = R_1to3_read;
261
+ cp->is_closed = dummy_comp_chkclosed;
262
+ }
263
+
264
+ return table;
265
+ }
266
+
267
+ void
268
+ lcbio_table_unref(lcbio_TABLE *table)
269
+ {
270
+ if (--table->refcount) {
271
+ return;
272
+ }
273
+
274
+ if (table->dtor) {
275
+ table->dtor(table);
276
+ return;
277
+ }
278
+
279
+ if (table->p && table->p->v.v0.need_cleanup) {
280
+ lcb_destroy_io_ops(table->p);
281
+ }
282
+
283
+ free(table);
284
+ }
285
+
286
+ void
287
+ lcbio_table_ref(lcbio_TABLE *table)
288
+ {
289
+ ++table->refcount;
290
+ }