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 @@
1
+ /* Nothing to see here */
@@ -0,0 +1,1050 @@
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 LIBCOUCHBASE_COUCHBASE_H
19
+ #error "include libcouchbase/couchbase.h first"
20
+ #endif
21
+
22
+ #ifndef LCB_IOPS_H
23
+ #define LCB_IOPS_H
24
+
25
+ /**
26
+ * @file
27
+ * @brief Public I/O integration interface
28
+ * @details
29
+ *
30
+ * This file provides the public I/O interface for integrating with external
31
+ * event loops.
32
+ */
33
+
34
+ /**
35
+ * @ingroup lcbio lcb-public-api
36
+ * @defgroup lcb-io-plugin-api Network I/O
37
+ * @details
38
+ *
39
+ * I/O Integration comes in two flavors:
40
+ *
41
+ * @par (E)vent/Poll Based Integration
42
+ * This system is based upon the interfaces exposed by the `poll(2)` and
43
+ * `select(2)` calls found in POSIX-based systems and are wrapped by systems
44
+ * such as _libevent_ and _libev_. At their core is the notion that a socket
45
+ * may be polled for readiness (either readiness for reading or readiness
46
+ * for writing). When a socket is deemed ready, a callback is invoked indicating
47
+ * which events took place.
48
+ *
49
+ *
50
+ * @par (C)ompletion/Operation/Buffer Based Integration
51
+ * This system is based upon the interfaces exposed in the Win32 API where
52
+ * I/O is done in terms of operations which are awaiting _completion_. As such
53
+ * buffers are passed into the core, and the application is notified when the
54
+ * operation on those buffers (either read into a buffer, or write from a buffer)
55
+ * has been completed.
56
+ *
57
+ *
58
+ * @addtogroup lcb-io-plugin-api
59
+ * @{
60
+ */
61
+
62
+ #ifdef __cplusplus
63
+ extern "C" {
64
+ #endif
65
+
66
+ /** @brief Type representing the native socket type of the operating system */
67
+ #ifdef _WIN32
68
+ typedef SOCKET lcb_socket_t;
69
+ #else
70
+ typedef int lcb_socket_t;
71
+ #endif
72
+
73
+ struct sockaddr;
74
+
75
+ #ifndef _WIN32
76
+ /** Defined if the lcb_IOV structure conforms to `struct iovec` */
77
+ #define LCB_IOV_LAYOUT_UIO
78
+ typedef struct lcb_iovec_st {
79
+ void *iov_base;
80
+ size_t iov_len;
81
+ } lcb_IOV;
82
+ #else
83
+ /** Defined if the lcb_IOV structure conforms to `WSABUF` */
84
+ #define LCB_IOV_LAYOUT_WSABUF
85
+ typedef struct lcb_iovec_st {
86
+ ULONG iov_len;
87
+ void *iov_base;
88
+ } lcb_IOV;
89
+ #endif
90
+
91
+ #if defined(LIBCOUCHBASE_INTERNAL) && !defined(LCB_IOPS_V12_NO_DEPRECATE)
92
+ #define LCB__IOPS_CONCAT2(X, Y) X ## Y
93
+ #define LCB__IOPS_CONCAT(X, Y) LCB__IOPS_CONCAT2(X, Y)
94
+ #define LCB_IOPS_DEPRECATED(X) void (*LCB__IOPS_CONCAT(lcb__iops__dummy, __LINE__))(void)
95
+ #else
96
+ #define LCB_IOPS_DEPRECATED(X) X
97
+ #endif
98
+
99
+ /** @brief structure describing a connected socket's endpoints */
100
+ struct lcb_nameinfo_st {
101
+ struct {
102
+ struct sockaddr *name;
103
+ int *len;
104
+ } local;
105
+
106
+ struct {
107
+ struct sockaddr *name;
108
+ int *len;
109
+ } remote;
110
+ };
111
+
112
+ /**
113
+ * @struct lcb_IOV
114
+ * @brief structure indicating a buffer and its size
115
+ *
116
+ * @details
117
+ * This is compatible with a `struct iovec` on Unix and a `WSABUF` structure
118
+ * on Windows. It has an `iov_base` field which is the base pointer and an
119
+ * `iov_len` field which is the length of the buffer.
120
+ */
121
+
122
+ typedef struct lcb_io_opt_st* lcb_io_opt_t;
123
+
124
+ /**
125
+ * @brief Callback invoked for all poll-like events
126
+ *
127
+ * @param sock the socket associated with the event
128
+ * @param events the events which activated this callback. This is set of bits
129
+ * comprising of LCB_READ_EVENT, LCB_WRITE_EVENT, and LCB_ERROR_EVENT
130
+ * @param uarg a user-defined pointer passed to the
131
+ * lcb_ioE_event_watch_fn routine.
132
+ */
133
+ typedef void (*lcb_ioE_callback)
134
+ (lcb_socket_t sock, short events, void *uarg);
135
+
136
+ /**@name Timer Callbacks
137
+ *@{*/
138
+
139
+ /**
140
+ * @brief Create a new timer object.
141
+ *
142
+ * @param iops the io structure
143
+ * @return an opaque timer handle. The timer shall remain inactive and shall
144
+ * be destroyed via the lcb_io_timer_destroy_fn routine.
145
+ */
146
+ typedef void *(*lcb_io_timer_create_fn)
147
+ (lcb_io_opt_t iops);
148
+
149
+ /**
150
+ * @brief Destroy a timer handler
151
+ *
152
+ * Destroy a timer previously created with lcb_io_timer_create_fn
153
+ * @param iops the io structure
154
+ * @param timer the opaque handle
155
+ * The timer must have already been cancelled via lcb_io_timer_cancel_fn
156
+ */
157
+ typedef void (*lcb_io_timer_destroy_fn)
158
+ (lcb_io_opt_t iops, void *timer);
159
+
160
+ /**
161
+ * @brief Cancel a pending timer callback
162
+ *
163
+ * Cancel and unregister a pending timer. If the timer has already
164
+ * fired, this does nothing. If the timer has not yet fired, the callback
165
+ * shall not be delivered.
166
+ *
167
+ * @param iops the I/O structure
168
+ * @param timer the timer to cancel.
169
+ */
170
+ typedef void (*lcb_io_timer_cancel_fn)
171
+ (lcb_io_opt_t iops, void *timer);
172
+
173
+ /**
174
+ * @brief Schedule a callback to be invoked within a given interval.
175
+ *
176
+ * Schedule a timer to be fired within usec microseconds from now
177
+ * @param iops the I/O structure
178
+ * @param timer a timer previously created with timer_create
179
+ * @param usecs the timer interval
180
+ * @param uarg the user-defined pointer to be passed in the callback
181
+ * @param callback the callback to invoke
182
+ */
183
+ typedef int (*lcb_io_timer_schedule_fn)
184
+ (lcb_io_opt_t iops, void *timer,
185
+ lcb_U32 usecs,
186
+ void *uarg,
187
+ lcb_ioE_callback callback);
188
+
189
+ /**@}*/
190
+
191
+
192
+ /**@name Event Handle Callbacks
193
+ * @{*/
194
+
195
+ /**
196
+ * @brief Create a new event handle.
197
+ *
198
+ * An event object may be used to monitor a socket for given I/O readiness events
199
+ * @param iops the I/O structure.
200
+ * @return a new event handle.
201
+ * The handle may then be associated with a
202
+ * socket and watched (via lcb_ioE_event_watch_fn) for I/O readiness.
203
+ */
204
+ typedef void *(*lcb_ioE_event_create_fn)
205
+ (lcb_io_opt_t iops);
206
+
207
+ /**
208
+ * @brief Destroy an event handle
209
+ *
210
+ * Destroy an event object. The object must not be active.
211
+ * @param iops the I/O structure
212
+ * @param event the event to free
213
+ */
214
+ typedef void (*lcb_ioE_event_destroy_fn)
215
+ (lcb_io_opt_t iops, void *event);
216
+
217
+ /**
218
+ * @deprecated lcb_ioE_event_watch_fn() should be used with `0` for events
219
+ * @brief Cancel pending callbacks and unwatch a handle.
220
+ *
221
+ * @param iops the I/O structure
222
+ * @param sock the socket associated with the event
223
+ * @param event the opaque event object
224
+ *
225
+ * This function may be called multiple times and shall not fail even if the
226
+ * event is already inactive.
227
+ */
228
+ typedef void (*lcb_ioE_event_cancel_fn)
229
+ (lcb_io_opt_t iops, lcb_socket_t sock, void *event);
230
+
231
+
232
+ /** Data is available for reading */
233
+ #define LCB_READ_EVENT 0x02
234
+ /** Data can be written */
235
+ #define LCB_WRITE_EVENT 0x04
236
+ /** Exceptional condition ocurred on socket */
237
+ #define LCB_ERROR_EVENT 0x08
238
+ #define LCB_RW_EVENT (LCB_READ_EVENT|LCB_WRITE_EVENT)
239
+
240
+ /**
241
+ * Associate an event with a socket, requesting notification when one of
242
+ * the events specified in 'flags' becomes available on the socket.
243
+ *
244
+ * @param iops the IO context
245
+ * @param socket the socket to watch
246
+ * @param event the event to associate with the socket. If this parameter is
247
+ * @param evflags a bitflag of events to watch. This is one of LCB_READ_EVENT,
248
+ * LCB_WRITE_EVENT, or LCB_RW_EVENT.
249
+ * If this value is `0` then existing events shall be cancelled on the
250
+ * socket.
251
+ *
252
+ * Note that the callback may _also_ receive LCB_ERROR_EVENT but this cannot
253
+ * be requested as an event to watch for.
254
+ *
255
+ * @param uarg a user defined pointer to be passed to the callback
256
+ * @param callback the callback to invoke when one of the events becomes
257
+ * ready.
258
+ *
259
+ * @attention
260
+ * It shall be legal to call this routine multiple times without having to call
261
+ * the lcb_ioE_event_cancel_fn(). The cancel function should in fact be implemented
262
+ * via passing a `0` to the `evflags` parameter, effectively clearing the
263
+ * event.
264
+ */
265
+ typedef int (*lcb_ioE_event_watch_fn)
266
+ (lcb_io_opt_t iops,
267
+ lcb_socket_t socket,
268
+ void *event,
269
+ short evflags,
270
+ void *uarg,
271
+ lcb_ioE_callback callback);
272
+
273
+ /**@}*/
274
+
275
+ /**@name BSD-API I/O Routines
276
+ * @{*/
277
+
278
+ /**
279
+ * @brief Receive data into a single buffer
280
+ * @see `recv(2)` socket API call.
281
+ */
282
+ typedef lcb_SSIZE (*lcb_ioE_recv_fn)
283
+ (lcb_io_opt_t iops, lcb_socket_t sock, void *target_buf,
284
+ lcb_SIZE buflen, int _unused_flags);
285
+
286
+ /** @brief Send data from a single buffer.
287
+ * @see `send(2)` on POSIX
288
+ */
289
+ typedef lcb_SSIZE (*lcb_ioE_send_fn)
290
+ (lcb_io_opt_t iops, lcb_socket_t sock, const void *srcbuf,
291
+ lcb_SIZE buflen, int _ignored);
292
+
293
+ /**@brief Read data into a series of buffers.
294
+ * @see the `recvmsg(2)` function on POSIX */
295
+ typedef lcb_SSIZE (*lcb_ioE_recvv_fn)
296
+ (lcb_io_opt_t iops, lcb_socket_t sock, lcb_IOV *iov, lcb_SIZE niov);
297
+
298
+ /**@brief Write data from multiple buffers.
299
+ * @see the `sendmsg(2)` function on POSIX */
300
+ typedef lcb_SSIZE (*lcb_ioE_sendv_fn)
301
+ (lcb_io_opt_t iops, lcb_socket_t sock, lcb_IOV *iov, lcb_SIZE niov);
302
+
303
+ /**@brief Create a new socket.
304
+ * @see `socket(2)` on POSIX */
305
+ typedef lcb_socket_t (*lcb_ioE_socket_fn)
306
+ (lcb_io_opt_t iops, int domain, int type, int protocol);
307
+
308
+ /**@brief Connect a created socket
309
+ * @see `connect(2)` on POSIX */
310
+ typedef int (*lcb_ioE_connect_fn)
311
+ (lcb_io_opt_t iops,
312
+ lcb_socket_t sock,
313
+ const struct sockaddr *dst,
314
+ unsigned int addrlen);
315
+
316
+ /** @private */
317
+ typedef int (*lcb_ioE_bind_fn)
318
+ (lcb_io_opt_t iops,
319
+ lcb_socket_t sock,
320
+ const struct sockaddr *srcaddr,
321
+ unsigned int addrlen);
322
+
323
+ /** @private */
324
+ typedef int (*lcb_ioE_listen_fn)
325
+ (lcb_io_opt_t iops,
326
+ lcb_socket_t bound_sock,
327
+ unsigned int queuelen);
328
+
329
+ /** @private */
330
+ typedef lcb_socket_t (*lcb_ioE_accept_fn)
331
+ (lcb_io_opt_t iops,
332
+ lcb_socket_t lsnsock);
333
+
334
+ /** @brief Close a socket
335
+ * @see `close(2)` and `shutdown(2)` */
336
+ typedef void (*lcb_ioE_close_fn)
337
+ (lcb_io_opt_t iops, lcb_socket_t sock);
338
+
339
+
340
+ /**
341
+ * While checking the socket, treat pending data as an _erorr_.
342
+ * This flag will be _missing_ if the socket participates in a protocol
343
+ * where unsolicited data is possible.
344
+ *
345
+ * Currently Couchbase does not provide such a protocol (at least not one where
346
+ * sockets are placed in a pool), but it may in the future.
347
+ *
348
+ * This may be passed as a `flags` option to lcb_ioE_chkclosed_fn
349
+ */
350
+ #define LCB_IO_SOCKCHECK_PEND_IS_ERROR 1
351
+
352
+ #define LCB_IO_SOCKCHECK_STATUS_CLOSED 1
353
+ #define LCB_IO_SOCKCHECK_STATUS_OK 0
354
+ #define LCB_IO_SOCKCHECK_STATUS_UNKNOWN -1
355
+
356
+ /**@brief Check if a socket has been closed or not. This is used to check
357
+ * a socket's state after a period of inactivity.
358
+ *
359
+ *
360
+ * @param iops The iops
361
+ * @param sock The socket to check
362
+ * @param flags A bit set of options.
363
+ * @return A value greater than 0 if the socket _is_ closed, 0 if the socket
364
+ * has not been closed, or a negative number, if the status could not be
365
+ * determined within the given constraints (for example, if `flags` did not
366
+ * specify `LCB_IO_SOCKCHECK_PEND_IS_ERROR`, and the implementation does not
367
+ * have a way to check status otherwise.
368
+ *
369
+ * @since 2.4.4
370
+ */
371
+ typedef int (*lcb_ioE_chkclosed_fn)
372
+ (lcb_io_opt_t iops, lcb_socket_t sock, int flags);
373
+
374
+
375
+ /** For use with `io{E,C}_cntl_fn`, indicates the setting should be retrieved */
376
+ #define LCB_IO_CNTL_GET 0
377
+ /** For use with lcb_io{E,C}_cntl_fn`, indicates the setting should be modified */
378
+ #define LCB_IO_CNTL_SET 1
379
+
380
+ /** Disable Nagle's algorithm (use an int) */
381
+ #define LCB_IO_CNTL_TCP_NODELAY 1
382
+
383
+ /**
384
+ * @brief Execute a specificied operation on a socket.
385
+ * @param iops The iops
386
+ * @param sock The socket
387
+ * @param mode The mode, can be @ref LCB_IO_CNTL_GET or @ref LCB_IO_CNTL_SET
388
+ * @param option The option to access
389
+ * @param[in,out] arg the argument for the option
390
+ * @return zero on success, nonzero on failure.
391
+ */
392
+ typedef int (*lcb_ioE_cntl_fn)
393
+ (lcb_io_opt_t iops, lcb_socket_t sock, int mode, int option, void *arg);
394
+ /**@}*/
395
+
396
+
397
+ struct ringbuffer_st;
398
+ struct lcb_connection_st;
399
+ struct lcbio_SOCKET;
400
+
401
+ /** @deprecated Ringbuffers are no longer used this way by the library for I/O */
402
+ struct lcb_buf_info {
403
+ char *root;
404
+ lcb_SIZE size;
405
+ struct ringbuffer_st *ringbuffer;
406
+ struct lcb_iovec_st iov[2];
407
+ };
408
+
409
+ /**
410
+ * @brief Socket handle for completion-based I/O
411
+ *
412
+ * The sockdata structure is analoguous to an `lcb_socket_t` returned by
413
+ * the E-model I/O.
414
+ */
415
+ typedef struct lcb_sockdata_st {
416
+ lcb_socket_t socket; /**< System socket, for informational purposes */
417
+ lcb_io_opt_t parent; /**< Parent I/O context */
418
+ struct lcbio_SOCKET *lcbconn; /**< Internal socket equivalent */
419
+ int closed; /**< @deprecated No longer used by the library */
420
+ int is_reading; /**< Internally used by lcbio */
421
+ struct lcb_buf_info read_buffer; /**< @deprecated No longer used by the library */
422
+ } lcb_sockdata_t;
423
+
424
+ /** @deprecated */
425
+ typedef struct lcb_io_writebuf_st {
426
+ struct lcb_io_opt_st *parent;
427
+ struct lcb_buf_info buffer;
428
+ } lcb_io_writebuf_t;
429
+
430
+ /**@name Completion Routines
431
+ * @{*/
432
+
433
+ /**
434
+ * @brief Create a completion socket handle
435
+ *
436
+ * Create an opaque socket handle
437
+ * @param iops the IO context
438
+ * @param domain socket address family, e.g. AF_INET
439
+ * @param type the transport type, e.g. SOCK_STREAM
440
+ * @param protocol the IP protocol, e.g. IPPROTO_TCP
441
+ * @return a socket pointer or NULL on failure.
442
+ */
443
+ typedef lcb_sockdata_t* (*lcb_ioC_socket_fn)
444
+ (lcb_io_opt_t iops, int domain, int type, int protocol);
445
+
446
+ /**
447
+ * @brief Callback to be invoked upon a connection result.
448
+ * Callback invoked for a connection result.
449
+ * @param socket the socket which is being connected
450
+ * @param status the status. 0 for success, nonzero on failure
451
+ */
452
+ typedef void (*lcb_io_connect_cb)(lcb_sockdata_t *socket, int status);
453
+
454
+ /**
455
+ * @brief Request a connection for a socket
456
+ * @param iops the IO context
457
+ * @param sd the socket pointer
458
+ * @param dst the address to connect to
459
+ * @param naddr the size of the address len, e.g. sizeof(struct sockaddr_in)
460
+ * @param callback the callback to invoke when the connection status is determined
461
+ * @return 0 on success, nonzero if a connection could not be scheduled.
462
+ */
463
+ typedef int (*lcb_ioC_connect_fn)
464
+ (lcb_io_opt_t iops, lcb_sockdata_t *sd,
465
+ const struct sockaddr *dst,
466
+ unsigned int naddr,
467
+ lcb_io_connect_cb callback);
468
+
469
+ /**
470
+ * @brief Callback invoked when a new client connection has been established
471
+ * @param sd_server the server listen socket
472
+ * @param sd_client the new client socket
473
+ * @param status if there was an error accepting (in this case, sd_client is NULL
474
+ */
475
+ typedef void (lcb_ioC_serve_callback)
476
+ (lcb_sockdata_t *sd_server,
477
+ lcb_sockdata_t *sd_client,
478
+ int status);
479
+
480
+ /**
481
+ * Specify that the socket start accepting connections. This should be called
482
+ * on a newly created non-connected socket
483
+ * @param iops the I/O context
484
+ * @param server_socket the socket used to listen with
485
+ * @param sockaddr the local address for listening
486
+ * @param callback the callback to invoke for each new connection
487
+ */
488
+ typedef int (*lcb_ioC_serve_fn)
489
+ (lcb_io_opt_t iops,
490
+ lcb_sockdata_t *server_socket,
491
+ const struct sockaddr *listen_addr,
492
+ lcb_ioC_serve_callback callback);
493
+
494
+ /**
495
+ * @brief Request address information on a connected socket
496
+ * @param iops the I/O context
497
+ * @param sock the socket from which to retrieve information
498
+ * @param ni a nameinfo structure to populate with the relevant details
499
+ */
500
+ typedef int (*lcb_ioC_nameinfo_fn)
501
+ (lcb_io_opt_t iops,
502
+ lcb_sockdata_t *sock,
503
+ struct lcb_nameinfo_st *ni);
504
+
505
+ /**@deprecated*/
506
+ typedef void (*lcb_ioC_read_callback)(lcb_sockdata_t *sd, lcb_SSIZE nread);
507
+ #define lcb_io_read_cb lcb_ioC_read_callback
508
+ /**@deprecated See lcb_ioC_read2_fn(). Wrapped if not implemented*/
509
+ typedef int (*lcb_ioC_read_fn)(lcb_io_opt_t,lcb_sockdata_t*,lcb_ioC_read_callback);
510
+ /**@deprecated See lcb_ioC_write2_fn(). Wrapped if not implemented*/
511
+ typedef lcb_io_writebuf_t* (*lcb_ioC_wballoc_fn)(lcb_io_opt_t,lcb_sockdata_t *);
512
+ /**@deprecated See lcb_ioC_write2_fn(). Wrapped if not implemented */
513
+ typedef void (*lcb_ioC_wbfree_fn)(lcb_io_opt_t,lcb_sockdata_t*,lcb_io_writebuf_t*);
514
+ /**@deprecated See lcb_ioC_write2_fn(). This will be wrapped if not implemented */
515
+ typedef void (*lcb_ioC_write_callback)(lcb_sockdata_t*,lcb_io_writebuf_t*,int);
516
+ #define lcb_io_write_cb lcb_ioC_write_callback
517
+
518
+ /**@deprecated*/
519
+ typedef int (*lcb_ioC_write_fn)
520
+ (lcb_io_opt_t,lcb_sockdata_t*,lcb_io_writebuf_t*,lcb_ioC_write_callback);
521
+
522
+
523
+ /**
524
+ * @brief Callback received when a buffer has been flushed
525
+ * @param sd the socket
526
+ * @param status nonzero on error
527
+ * @param arg the opaque handle passed in the write2 call
528
+ */
529
+ typedef void (*lcb_ioC_write2_callback)
530
+ (lcb_sockdata_t *sd,
531
+ int status,
532
+ void *arg);
533
+
534
+ /**
535
+ * @brief Schedule a flush of a series of buffers to the network
536
+ *
537
+ * @param iops the I/O context
538
+ * @param sd the socket on which to send
539
+ * @param iov an array of IOV structures.
540
+ * The buffers pointed to by the IOVs themselves (i.e. `iov->iov_len`)
541
+ * **must** not be freed or modified until the callback has been invoked.
542
+ * The storage for the IOVs themselves (i.e. the array passed in `iov`)
543
+ * is copied internally to the implementation.
544
+ *
545
+ * @param niov the number of IOV structures within the array
546
+ * @param uarg an opaque pointer to be passed in the callback
547
+ * @param callback the callback to invoke. This will be called when the buffers
548
+ * passed have either been completely flushed (and are no longer required)
549
+ * or when an error has taken place.
550
+ */
551
+ typedef int (*lcb_ioC_write2_fn)
552
+ (lcb_io_opt_t iops,
553
+ lcb_sockdata_t *sd,
554
+ lcb_IOV *iov,
555
+ lcb_SIZE niov,
556
+ void *uarg,
557
+ lcb_ioC_write2_callback callback);
558
+
559
+
560
+ /**
561
+ * @brief Callback invoked when a read has been completed
562
+ * @param sd the socket
563
+ * @param nread number of bytes read, or -1 on error
564
+ * @param arg user provided argument for callback.
565
+ */
566
+ typedef void (*lcb_ioC_read2_callback)
567
+ (lcb_sockdata_t *sd, lcb_SSIZE nread, void *arg);
568
+ /**
569
+ * @brief Schedule a read from the network
570
+ * @param iops the I/O context
571
+ * @param sd the socket on which to read
572
+ * @param iov an array of IOV structures
573
+ * @param niov the number of IOV structures within the array
574
+ * @param uarg a pointer passed to the callback
575
+ * @param callback the callback to invoke
576
+ * @return 0 on success, nonzero on error
577
+ *
578
+ * The IOV array itself shall copied (if needed) into the I/O implementation
579
+ * and thus does not need to be kept in memory after the function has been
580
+ * called. Note that the underlying buffers _do_ need to remain valid until
581
+ * the callback is received.
582
+ */
583
+ typedef int (*lcb_ioC_read2_fn)
584
+ (lcb_io_opt_t iops,
585
+ lcb_sockdata_t *sd,
586
+ lcb_IOV *iov,
587
+ lcb_SIZE niov,
588
+ void *uarg,
589
+ lcb_ioC_read2_callback callback);
590
+
591
+ /**
592
+ * @brief Asynchronously shutdown the socket.
593
+ *
594
+ * Request an asynchronous close for the specified socket. This merely releases
595
+ * control from the library over to the plugin for the specified socket and
596
+ * does _not_ actually imply that the resources have been closed.
597
+ *
598
+ * Notable, callbacks for read and write operations will _still_ be invoked
599
+ * in order to maintain proper resource deallocation. However the socket's
600
+ * closed field will be set to true.
601
+ *
602
+ * @param iops the I/O context
603
+ * @param sd the socket structure
604
+ */
605
+ typedef unsigned int (*lcb_ioC_close_fn)
606
+ (lcb_io_opt_t iops,
607
+ lcb_sockdata_t *sd);
608
+
609
+ /**
610
+ * This is the completion variant of @ref lcb_ioE_chkclosed_fn. See that
611
+ * function for details
612
+ *
613
+ * @param iops
614
+ * @param sd
615
+ * @param flags
616
+ * @return
617
+ */
618
+ typedef int (*lcb_ioC_chkclosed_fn)
619
+ (lcb_io_opt_t iops, lcb_sockdata_t *sd, int flags);
620
+
621
+ /**
622
+ * @see lcb_ioE_cntl_fn.
623
+ *
624
+ * @param iops
625
+ * @param sd
626
+ * @param mode
627
+ * @param option
628
+ * @param arg
629
+ * @return
630
+ */
631
+ typedef int (*lcb_ioC_cntl_fn)
632
+ (lcb_io_opt_t iops, lcb_sockdata_t *sd, int mode, int option, void *arg);
633
+
634
+ /**@}*/
635
+
636
+ /**
637
+ * @brief Start the event loop
638
+ * @param iops The I/O context
639
+ *
640
+ * This should start polling for socket events on all registered watchers
641
+ * and scheduled events. This function should return either when there are
642
+ * no more timers or events pending, or when lcb_io_stop_fn() has been invoked.
643
+ */
644
+ typedef void (*lcb_io_start_fn)(lcb_io_opt_t iops);
645
+
646
+ /**
647
+ * @brief Run a single iteration of the event loop without blocking. This
648
+ * is intended to be an optimization to allow scheduled I/O operations to
649
+ * complete without blocking the main thread
650
+ */
651
+ typedef void (*lcb_io_tick_fn)(lcb_io_opt_t iops);
652
+
653
+ /**
654
+ * @brief Pause the event loop
655
+ * @param iops The I/O Context
656
+ *
657
+ * This function shall suspend the event loop, causing a current invocation
658
+ * to lcb_io_start_fn() to return as soon as possible
659
+ */
660
+ typedef void (*lcb_io_stop_fn)(lcb_io_opt_t iops);
661
+
662
+ LCB_DEPRECATED(typedef void (*lcb_io_error_cb)(lcb_sockdata_t *socket));
663
+
664
+ #define LCB_IOPS_BASE_FIELDS \
665
+ void *cookie; \
666
+ int error; \
667
+ int need_cleanup;
668
+
669
+ struct lcb_iops_evented_st {
670
+ LCB_IOPS_BASE_FIELDS
671
+ LCB_IOPS_DEPRECATED(lcb_ioE_socket_fn socket);
672
+ LCB_IOPS_DEPRECATED(lcb_ioE_connect_fn connect);
673
+ LCB_IOPS_DEPRECATED(lcb_ioE_recv_fn recv);
674
+ LCB_IOPS_DEPRECATED(lcb_ioE_send_fn send);
675
+ LCB_IOPS_DEPRECATED(lcb_ioE_recvv_fn recvv);
676
+ LCB_IOPS_DEPRECATED(lcb_ioE_sendv_fn sendv);
677
+ LCB_IOPS_DEPRECATED(lcb_ioE_close_fn close);
678
+ LCB_IOPS_DEPRECATED(lcb_io_timer_create_fn create_timer);
679
+ LCB_IOPS_DEPRECATED(lcb_io_timer_destroy_fn destroy_timer);
680
+ LCB_IOPS_DEPRECATED(lcb_io_timer_cancel_fn delete_timer);
681
+ LCB_IOPS_DEPRECATED(lcb_io_timer_schedule_fn update_timer);
682
+ LCB_IOPS_DEPRECATED(lcb_ioE_event_create_fn create_event);
683
+ LCB_IOPS_DEPRECATED(lcb_ioE_event_destroy_fn destroy_event);
684
+ LCB_IOPS_DEPRECATED(lcb_ioE_event_watch_fn update_event);
685
+ LCB_IOPS_DEPRECATED(lcb_ioE_event_cancel_fn delete_event);
686
+ LCB_IOPS_DEPRECATED(lcb_io_stop_fn stop_event_loop);
687
+ LCB_IOPS_DEPRECATED(lcb_io_start_fn run_event_loop);
688
+ };
689
+
690
+ struct lcb_iops_completion_st {
691
+ LCB_IOPS_BASE_FIELDS
692
+ LCB_IOPS_DEPRECATED(lcb_ioC_socket_fn create_socket);
693
+ LCB_IOPS_DEPRECATED(lcb_ioC_connect_fn start_connect);
694
+ LCB_IOPS_DEPRECATED(lcb_ioC_wballoc_fn create_writebuf);
695
+ LCB_IOPS_DEPRECATED(lcb_ioC_wbfree_fn release_writebuf);
696
+ LCB_IOPS_DEPRECATED(lcb_ioC_write_fn start_write);
697
+ LCB_IOPS_DEPRECATED(lcb_ioC_read_fn start_read);
698
+ LCB_IOPS_DEPRECATED(lcb_ioC_close_fn close_socket);
699
+ LCB_IOPS_DEPRECATED(lcb_io_timer_create_fn create_timer);
700
+ LCB_IOPS_DEPRECATED(lcb_io_timer_destroy_fn destroy_timer);
701
+ LCB_IOPS_DEPRECATED(lcb_io_timer_cancel_fn delete_timer);
702
+ LCB_IOPS_DEPRECATED(lcb_io_timer_schedule_fn update_timer);
703
+ LCB_IOPS_DEPRECATED(lcb_ioC_nameinfo_fn get_nameinfo);
704
+ void (*pad1)(void);
705
+ void (*pad2)(void);
706
+ LCB_IOPS_DEPRECATED(void (*send_error)(struct lcb_io_opt_st*, lcb_sockdata_t*,void(*)(lcb_sockdata_t*)));
707
+ LCB_IOPS_DEPRECATED(lcb_io_stop_fn stop_event_loop);
708
+ LCB_IOPS_DEPRECATED(lcb_io_start_fn run_event_loop);
709
+ };
710
+
711
+ /** @brief Common functions for starting and stopping timers */
712
+ typedef struct lcb_timerprocs_st {
713
+ lcb_io_timer_create_fn create;
714
+ lcb_io_timer_destroy_fn destroy;
715
+ lcb_io_timer_cancel_fn cancel;
716
+ lcb_io_timer_schedule_fn schedule;
717
+ } lcb_timer_procs;
718
+
719
+ /** @brief Common functions for starting and stopping the event loop */
720
+ typedef struct lcb_loopprocs_st {
721
+ lcb_io_start_fn start;
722
+ lcb_io_stop_fn stop;
723
+ lcb_io_tick_fn tick;
724
+ } lcb_loop_procs;
725
+
726
+ /** @brief Functions wrapping the Berkeley Socket API */
727
+ typedef struct lcb_bsdprocs_st {
728
+ lcb_ioE_socket_fn socket0;
729
+ lcb_ioE_connect_fn connect0;
730
+ lcb_ioE_recv_fn recv;
731
+ lcb_ioE_recvv_fn recvv;
732
+ lcb_ioE_send_fn send;
733
+ lcb_ioE_sendv_fn sendv;
734
+ lcb_ioE_close_fn close;
735
+ lcb_ioE_bind_fn bind;
736
+ lcb_ioE_listen_fn listen;
737
+ lcb_ioE_accept_fn accept;
738
+ lcb_ioE_chkclosed_fn is_closed;
739
+ lcb_ioE_cntl_fn cntl;
740
+ } lcb_bsd_procs;
741
+
742
+ /** @brief Functions handling socket watcher events */
743
+ typedef struct lcb_evprocs_st {
744
+ lcb_ioE_event_create_fn create;
745
+ lcb_ioE_event_destroy_fn destroy;
746
+ lcb_ioE_event_cancel_fn cancel;
747
+ lcb_ioE_event_watch_fn watch;
748
+ } lcb_ev_procs;
749
+
750
+ /** @brief Functions for completion-based I/O */
751
+ typedef struct {
752
+ lcb_ioC_socket_fn socket;
753
+ lcb_ioC_close_fn close;
754
+ lcb_ioC_read_fn read;
755
+ lcb_ioC_connect_fn connect;
756
+ lcb_ioC_wballoc_fn wballoc;
757
+ lcb_ioC_wbfree_fn wbfree;
758
+ lcb_ioC_write_fn write;
759
+ lcb_ioC_write2_fn write2;
760
+ lcb_ioC_read2_fn read2;
761
+ lcb_ioC_serve_fn serve;
762
+ lcb_ioC_nameinfo_fn nameinfo;
763
+ lcb_ioC_chkclosed_fn is_closed;
764
+ lcb_ioC_cntl_fn cntl;
765
+ } lcb_completion_procs;
766
+
767
+ /**
768
+ * Enumeration defining the I/O model
769
+ */
770
+ typedef enum {
771
+ LCB_IOMODEL_EVENT, /**< Event/Poll style */
772
+ LCB_IOMODEL_COMPLETION /**< IOCP/Completion style */
773
+ } lcb_iomodel_t;
774
+
775
+ /**
776
+ * @param version the ABI/API version for the proc structures. Note that
777
+ * ABI is forward compatible for all proc structures, meaning that newer
778
+ * versions will always extend new fields and never replace existing ones.
779
+ * However in order to avoid a situation where a newer version of a plugin
780
+ * is loaded against an older version of the library (in which case the plugin
781
+ * will assume the proc table size is actually bigger than it is) the version
782
+ * serves as an indicator for this. The version actually passed is defined
783
+ * in `LCB_IOPROCS_VERSION`
784
+ *
785
+ * @param loop_procs a table to be set to basic loop control routines
786
+ * @param timer_procs a table to be set to the timer routines
787
+ * @param bsd_procs a table to be set to BSD socket API routines
788
+ * @param ev_procs a table to be set to event watcher routines
789
+ * @param completion_procs a table to be set to completion routines
790
+ * @param iomodel the I/O model to be used. If this is `LCB_IOMODEL_COMPLETION`
791
+ * then the contents of `bsd_procs` will be ignored and `completion_procs` must
792
+ * be populated. If the mode is `LCB_IOMODEL_EVENT` then the `bsd_procs` must be
793
+ * populated and `completion_procs` is ignored.
794
+ *
795
+ * Important to note that internally the `ev`, `bsd`, and `completion` field are
796
+ * defined as a union, thus
797
+ * @code{.c}
798
+ * union {
799
+ * struct {
800
+ * lcb_bsd_procs;
801
+ * lcb_ev_procs;
802
+ * } event;
803
+ * struct lcb_completion_procs completion;
804
+ * }
805
+ * @endcode
806
+ * thus setting both fields will actually clobber.
807
+ *
808
+ * @attention
809
+ * Note that the library takes ownership of the passed tables and it should
810
+ * not be controlled or accessed by the plugin.
811
+ *
812
+ * @attention
813
+ * This function may not have any side effects as it may be called
814
+ * multiple times.
815
+ *
816
+ * As opposed to the v0 and v1 IOPS structures that require a table to be
817
+ * populated and returned, the v2 IOPS works differently. Specifically, the
818
+ * IOPS population happens at multiple stages:
819
+ *
820
+ * 1. The base structure is returned, i.e. `lcb_create_NAME_iops` where _NAME_
821
+ * is the name of the plugin
822
+ *
823
+ * 2. Once the structure is returned, LCB shall invoke the `v.v2.get_procs()`
824
+ * function. The callback is responsible for populating the relevant fields.
825
+ *
826
+ * Note that the old `v0` and `v1` fields are now proxied via this mechanism.
827
+ * It _is_ possible to still monkey-patch the IO routines, but ensure the
828
+ * monkey patching takes place _before_ the instance is created (as the
829
+ * instance will initialize its own IO Table); thus, e.g.
830
+ * @code{.c}
831
+ * static void monkey_proc_fn(...) {
832
+ * //
833
+ * }
834
+ *
835
+ * static void monkey_patch_io(lcb_io_opt_t io) {
836
+ * io->v.v0.get_procs = monkey_proc_fn;
837
+ * }
838
+ *
839
+ * int main(void) {
840
+ * lcb_create_st options;
841
+ * lcb_t instance;
842
+ * lcb_io_opt_t io;
843
+ * lcb_create_iops(&io, NULL);
844
+ * monkey_patch_io(io);
845
+ * options.v.v0.io = io;
846
+ * lcb_create(&instance, &options);
847
+ * // ...
848
+ * }
849
+ * @endcode
850
+ *
851
+ * Typically the `get_procs` function will only be called once, and this will
852
+ * happen from within lcb_create(). Thus in order to monkey patch you must
853
+ * ensure that initially the `get_procs` function itself is first supplanted
854
+ * and then return your customized I/O routines from your own `get_procs` (in
855
+ * this example, `monkey_proc_fn()`)
856
+ *
857
+ */
858
+ typedef void (*lcb_io_procs_fn)
859
+ (int version,
860
+ lcb_loop_procs *loop_procs,
861
+ lcb_timer_procs *timer_procs,
862
+ lcb_bsd_procs *bsd_procs,
863
+ lcb_ev_procs *ev_procs,
864
+ lcb_completion_procs *completion_procs,
865
+ lcb_iomodel_t *iomodel);
866
+
867
+ struct lcbio_TABLE;
868
+ struct lcb_iops2_st {
869
+ LCB_IOPS_BASE_FIELDS
870
+ lcb_io_procs_fn get_procs;
871
+ struct lcbio_TABLE *iot;
872
+ };
873
+
874
+ /* This is here to provide backwards compatibility with older (broken) clients
875
+ * which attempt to 'subclass' the select plugin, or similar. In this case we
876
+ * provide 17 callback fields (unused here) which the plugin implementation
877
+ * may set, so that the older code can continue to function without upgrading
878
+ * the client to a newer version. This should not be used except by internal
879
+ * plugins; specifically the ABI layout of this field is subject to change
880
+ * (for example, additional fields may be added or existing fields may be
881
+ * renamed/removed) without notice.
882
+ */
883
+ typedef void (*lcb__iops3fndummy)(void);
884
+ struct lcb_iops3_st {
885
+ LCB_IOPS_BASE_FIELDS
886
+ lcb__iops3fndummy pads[17];
887
+ lcb_io_procs_fn get_procs;
888
+ struct lcbio_TABLE *iot;
889
+ };
890
+
891
+ /**
892
+ * This number is bumped up each time a new field is added to any of the
893
+ * function tables. This number is backwards compatible (i.e. version 3 contains
894
+ * all the fields of version 2, and some additional ones)
895
+ */
896
+ #define LCB_IOPROCS_VERSION 4
897
+
898
+ #define LCB_IOPS_BASEFLD(iops, fld) ((iops)->v.base).fld
899
+ #define LCB_IOPS_ERRNO(iops) LCB_IOPS_BASEFLD(iops, error)
900
+
901
+ struct lcb_io_opt_st {
902
+ int version;
903
+ void *dlhandle;
904
+ void (*destructor)(struct lcb_io_opt_st *iops);
905
+ union {
906
+ struct {
907
+ LCB_IOPS_BASE_FIELDS
908
+ } base;
909
+
910
+ /** These two names are deprecated internally */
911
+ struct lcb_iops_evented_st v0;
912
+ struct lcb_iops_completion_st v1;
913
+ struct lcb_iops2_st v2;
914
+ struct lcb_iops3_st v3;
915
+ } v;
916
+ };
917
+
918
+ /**
919
+ * @brief Signature for a loadable plugin's IOPS initializer
920
+ *
921
+ * @param version the plugin init API version. This will be 0 for this function
922
+ * @param io a pointer to be set to the I/O table
923
+ * @param cookie a user-defined argument passed to the I/O initializer
924
+ * @return LCB_SUCCESS on success, an error on failure
925
+ */
926
+ typedef lcb_error_t (*lcb_io_create_fn)
927
+ (int version, lcb_io_opt_t *io, void *cookie);
928
+
929
+
930
+ /**
931
+ * @volatile
932
+ *
933
+ * This is an alternative to copying the 'bsdio-inl.c' file around. It is
934
+ * designed specifically for the @ref lcb_io_procs_fn function and will do the
935
+ * job of applying the current _runtime_ version of the default event-based I/O
936
+ * implementation.
937
+ *
938
+ * e.g.
939
+ * @code{.c}
940
+ * static void getprocs_impl(int version, lcb_loop_procs *loop_procs,
941
+ * lcb_timer_procs *timer_procs, lcb_bsd_procs *bsd_procs,
942
+ * lcb_ev_procs *ev_procs, lcb_completion_procs *completion_procs,
943
+ * lcb_iomodel_t *iomodel) {
944
+ *
945
+ * // do stuff normally
946
+ * // ..
947
+ * // install the default I/O handlers:
948
+ * lcb_iops_wire_bsd_impl2(bsd_procs, version);
949
+ * @endcode
950
+ *
951
+ * Use this function with care, and understand the implications between using
952
+ * this API call and embedding the `bsdio-inl.c` source file. Specifically:
953
+ *
954
+ * - If your application is using an _older_ version of the library, this
955
+ * implementation may contain bugs not present in the version you compiled
956
+ * against (and an embedded version may be newer)
957
+ * - If your application is using a _newer_ version, there may be some additional
958
+ * I/O functions which you may wish to wrap or rather not implement at all,
959
+ * but will be implemented if you call this function.
960
+ */
961
+ LIBCOUCHBASE_API
962
+ void
963
+ lcb_iops_wire_bsd_impl2(lcb_bsd_procs *procs, int version);
964
+
965
+ /******************************************************************************
966
+ ******************************************************************************
967
+ ** IO CREATION **
968
+ ******************************************************************************
969
+ ******************************************************************************/
970
+
971
+ /**
972
+ * @brief Built-in I/O plugins
973
+ * @committed
974
+ */
975
+ typedef enum {
976
+ LCB_IO_OPS_INVALID = 0x00, /**< @private */
977
+ LCB_IO_OPS_DEFAULT = 0x01, /**< @private */
978
+
979
+ /** Integrate with the libevent loop. See lcb_create_libevent_io_opts() */
980
+ LCB_IO_OPS_LIBEVENT = 0x02,
981
+ LCB_IO_OPS_WINSOCK = 0x03, /**< @private */
982
+ LCB_IO_OPS_LIBEV = 0x04,
983
+ LCB_IO_OPS_SELECT = 0x05,
984
+ LCB_IO_OPS_WINIOCP = 0x06,
985
+ LCB_IO_OPS_LIBUV = 0x07
986
+ } lcb_io_ops_type_t;
987
+
988
+ /** @brief IO Creation for builtin plugins */
989
+ typedef struct {
990
+ lcb_io_ops_type_t type; /**< The predefined type you want to create */
991
+ void *cookie; /**< Plugin-specific argument */
992
+ } lcb_IOCREATEOPTS_BUILTIN;
993
+
994
+ #ifndef __LCB_DOXYGEN__
995
+ /* These are mostly internal structures which may be in use by older applications.*/
996
+ typedef struct { const char *sofile; const char *symbol; void *cookie; } lcb_IOCREATEOPTS_DSO;
997
+ typedef struct { lcb_io_create_fn create; void *cookie; } lcb_IOCREATEOPS_FUNCTIONPOINTER;
998
+ #endif
999
+
1000
+ /** @uncommited */
1001
+ struct lcb_create_io_ops_st {
1002
+ int version;
1003
+ union {
1004
+ lcb_IOCREATEOPTS_BUILTIN v0;
1005
+ lcb_IOCREATEOPTS_DSO v1;
1006
+ lcb_IOCREATEOPS_FUNCTIONPOINTER v2;
1007
+ } v;
1008
+ };
1009
+
1010
+ /**
1011
+ * Create a new instance of one of the library-supplied io ops types.
1012
+ *
1013
+ * This function should only be used if you wish to override/customize the
1014
+ * default I/O plugin behavior; for example to select a specific implementation
1015
+ * (e.g. always for the _select_ plugin) and/or to integrate
1016
+ * a builtin plugin with your own application (e.g. pass an existing `event_base`
1017
+ * structure to the _libevent_ plugin).
1018
+ *
1019
+ * If you _do_ use this function, then you must call lcb_destroy_io_ops() on
1020
+ * the plugin handle once it is no longer required (and no instance is using
1021
+ * it).
1022
+ *
1023
+ * Whether a single `lcb_io_opt_t` may be used by multiple instances at once
1024
+ * is dependent on the specific implementation, but as a general rule it should
1025
+ * be assumed to be unsafe.
1026
+ *
1027
+ * @param[out] op The newly created io ops structure
1028
+ * @param options How to create the io ops structure
1029
+ * @return @ref LCB_SUCCESS on success
1030
+ * @uncommitted
1031
+ */
1032
+ LIBCOUCHBASE_API
1033
+ lcb_error_t lcb_create_io_ops(lcb_io_opt_t *op, const struct lcb_create_io_ops_st *options);
1034
+
1035
+ /**
1036
+ * Destroy the plugin handle created by lcb_create_io_ops()
1037
+ * @param op ops structure
1038
+ * @return LCB_SUCCESS on success
1039
+ * @uncommitted
1040
+ */
1041
+ LIBCOUCHBASE_API
1042
+ lcb_error_t lcb_destroy_io_ops(lcb_io_opt_t op);
1043
+
1044
+ #ifdef __cplusplus
1045
+ }
1046
+ #endif
1047
+
1048
+ /**@}*/
1049
+
1050
+ #endif