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.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.gitmodules +3 -0
- data/.rspec +1 -0
- data/.travis.yml +35 -0
- data/Gemfile +4 -0
- data/LICENSE +24 -0
- data/README.md +389 -0
- data/Rakefile +75 -0
- data/ext/README.md +6 -0
- data/ext/Rakefile +20 -0
- data/ext/libcouchbase/.gitignore +130 -0
- data/ext/libcouchbase/.travis.yml +19 -0
- data/ext/libcouchbase/CMakeLists.txt +429 -0
- data/ext/libcouchbase/CONTRIBUTING.md +124 -0
- data/ext/libcouchbase/LICENSE +202 -0
- data/ext/libcouchbase/README.markdown +163 -0
- data/ext/libcouchbase/RELEASE_NOTES.markdown +2691 -0
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +27 -0
- data/ext/libcouchbase/cmake/Modules/CopyPDB.cmake +42 -0
- data/ext/libcouchbase/cmake/Modules/DistScript.cmake +17 -0
- data/ext/libcouchbase/cmake/Modules/DownloadLcbDep.cmake +20 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseHdrHistogram.cmake +15 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibev.cmake +73 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +52 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +56 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseSnappy.cmake +11 -0
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +29 -0
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +133 -0
- data/ext/libcouchbase/cmake/Modules/GetPlatformCCInfo.cmake +45 -0
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +70 -0
- data/ext/libcouchbase/cmake/config-cmake.h.in +60 -0
- data/ext/libcouchbase/cmake/configure +357 -0
- data/ext/libcouchbase/cmake/defs.mk.in +8 -0
- data/ext/libcouchbase/cmake/dtrace-instr-link.pl +38 -0
- data/ext/libcouchbase/cmake/source_files.cmake +73 -0
- data/ext/libcouchbase/configure.pl +1 -0
- data/ext/libcouchbase/contrib/cJSON/cJSON.c +624 -0
- data/ext/libcouchbase/contrib/cJSON/cJSON.h +158 -0
- data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +9 -0
- data/ext/libcouchbase/contrib/cbsasl/COPYING +202 -0
- data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +217 -0
- data/ext/libcouchbase/contrib/cbsasl/src/client.c +205 -0
- data/ext/libcouchbase/contrib/cbsasl/src/common.c +46 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.c +67 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.h +33 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.c +296 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.h +45 -0
- data/ext/libcouchbase/contrib/cbsasl/src/hash.c +573 -0
- data/ext/libcouchbase/contrib/cbsasl/src/hash.h +15 -0
- data/ext/libcouchbase/contrib/cbsasl/src/util.h +31 -0
- data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +2 -0
- data/ext/libcouchbase/contrib/cliopts/cliopts.c +747 -0
- data/ext/libcouchbase/contrib/cliopts/cliopts.h +493 -0
- data/ext/libcouchbase/contrib/genhash/genhash.c +372 -0
- data/ext/libcouchbase/contrib/genhash/genhash.h +235 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CHANGES +157 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CMakeLists.txt +252 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CONTRIBUTORS +37 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/LICENSE +28 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/MINIFY.sh +15 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/README +435 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/cmake/internal_utils.cmake +227 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h +294 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-message.h +250 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h +1421 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump +487 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-printers.h +855 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-spi.h +232 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h +179 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h +259 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest.h +2291 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h +358 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_prod.h +58 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h +319 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h +206 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h +1158 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h +5143 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h +619 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h +1947 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h +167 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h +1012 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump +339 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h +3331 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump +297 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-all.cc +48 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-death-test.cc +1344 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-filepath.cc +382 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-internal-inl.h +1218 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-port.cc +805 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-printers.cc +363 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-test-part.cc +110 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-typed-test.cc +110 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest.cc +5015 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest_main.cc +38 -0
- data/ext/libcouchbase/contrib/http_parser/LICENSE-MIT +23 -0
- data/ext/libcouchbase/contrib/http_parser/README.md +178 -0
- data/ext/libcouchbase/contrib/http_parser/http_parser.c +2060 -0
- data/ext/libcouchbase/contrib/http_parser/http_parser.h +321 -0
- data/ext/libcouchbase/contrib/jsonsl/LICENSE +20 -0
- data/ext/libcouchbase/contrib/jsonsl/jsonsl.c +1452 -0
- data/ext/libcouchbase/contrib/jsonsl/jsonsl.h +971 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/CMakeLists.txt +6 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/LICENSE +55 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp-forwards.h +255 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +4892 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.h +1961 -0
- data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +8 -0
- data/ext/libcouchbase/contrib/snappy/COPYING +28 -0
- data/ext/libcouchbase/contrib/snappy/snappy-c.cc +90 -0
- data/ext/libcouchbase/contrib/snappy/snappy-c.h +138 -0
- data/ext/libcouchbase/contrib/snappy/snappy-internal.h +150 -0
- data/ext/libcouchbase/contrib/snappy/snappy-lcb-msvc.h +5 -0
- data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +71 -0
- data/ext/libcouchbase/contrib/snappy/snappy-sinksource.h +137 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.cc +42 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.h +491 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +98 -0
- data/ext/libcouchbase/contrib/snappy/snappy.cc +1307 -0
- data/ext/libcouchbase/contrib/snappy/snappy.h +184 -0
- data/ext/libcouchbase/contrib/win32-defs/iocpdefs.h +133 -0
- data/ext/libcouchbase/contrib/win32-defs/mingwdefs.h +4396 -0
- data/ext/libcouchbase/contrib/win32-defs/win_stdint.h +258 -0
- data/ext/libcouchbase/example/CMakeLists.txt +37 -0
- data/ext/libcouchbase/example/README.markdown +47 -0
- data/ext/libcouchbase/example/db/db.c +167 -0
- data/ext/libcouchbase/example/db/vb.c +227 -0
- data/ext/libcouchbase/example/instancepool/main.cc +102 -0
- data/ext/libcouchbase/example/instancepool/pool.cc +102 -0
- data/ext/libcouchbase/example/instancepool/pool.h +69 -0
- data/ext/libcouchbase/example/libeventdirect/main.c +148 -0
- data/ext/libcouchbase/example/mcc/mcc.cc +246 -0
- data/ext/libcouchbase/example/minimal/minimal.c +130 -0
- data/ext/libcouchbase/example/observe/observe.c +146 -0
- data/ext/libcouchbase/example/subdoc/subdoc-multi.cc +132 -0
- data/ext/libcouchbase/example/subdoc/subdoc-simple.cc +191 -0
- data/ext/libcouchbase/example/tick/tick.c +119 -0
- data/ext/libcouchbase/example/views/views-example.cc +83 -0
- data/ext/libcouchbase/include/libcouchbase/_cxxwrap.h +150 -0
- data/ext/libcouchbase/include/libcouchbase/api-legacy.h +1689 -0
- data/ext/libcouchbase/include/libcouchbase/api3.h +2 -0
- data/ext/libcouchbase/include/libcouchbase/assert.h +44 -0
- data/ext/libcouchbase/include/libcouchbase/cbft.h +109 -0
- data/ext/libcouchbase/include/libcouchbase/cntl-private.h +356 -0
- data/ext/libcouchbase/include/libcouchbase/cntl.h +937 -0
- data/ext/libcouchbase/include/libcouchbase/configuration.h.in +23 -0
- data/ext/libcouchbase/include/libcouchbase/couchbase.h +3677 -0
- data/ext/libcouchbase/include/libcouchbase/deprecated.h +300 -0
- data/ext/libcouchbase/include/libcouchbase/error.h +595 -0
- data/ext/libcouchbase/include/libcouchbase/http.h +1 -0
- data/ext/libcouchbase/include/libcouchbase/iops.h +1050 -0
- data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +263 -0
- data/ext/libcouchbase/include/libcouchbase/kvbuf.h +132 -0
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +364 -0
- data/ext/libcouchbase/include/libcouchbase/pktfwd.h +270 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +367 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr-inl.c +76 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr.h +199 -0
- data/ext/libcouchbase/include/libcouchbase/subdoc.h +312 -0
- data/ext/libcouchbase/include/libcouchbase/sysdefs.h +98 -0
- data/ext/libcouchbase/include/libcouchbase/vbucket.h +643 -0
- data/ext/libcouchbase/include/libcouchbase/views.h +298 -0
- data/ext/libcouchbase/include/libcouchbase/visibility.h +65 -0
- data/ext/libcouchbase/include/memcached/COPYING +30 -0
- data/ext/libcouchbase/include/memcached/README +10 -0
- data/ext/libcouchbase/include/memcached/protocol_binary.h +1916 -0
- data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
- data/ext/libcouchbase/packaging/README +7 -0
- data/ext/libcouchbase/packaging/abicheck/.gitignore +4 -0
- data/ext/libcouchbase/packaging/abicheck/Makefile +17 -0
- data/ext/libcouchbase/packaging/abicheck/README.md +27 -0
- data/ext/libcouchbase/packaging/abicheck/template.xml +3 -0
- data/ext/libcouchbase/packaging/deb/compat +1 -0
- data/ext/libcouchbase/packaging/deb/control +73 -0
- data/ext/libcouchbase/packaging/deb/copyright +10 -0
- data/ext/libcouchbase/packaging/deb/libcouchbase-dev.docs +3 -0
- data/ext/libcouchbase/packaging/deb/package.mk +31 -0
- data/ext/libcouchbase/packaging/deb/rules +46 -0
- data/ext/libcouchbase/packaging/deb/source/format +1 -0
- data/ext/libcouchbase/packaging/distinfo/README +1 -0
- data/ext/libcouchbase/packaging/distinfo/distinfo.cmake.in +4 -0
- data/ext/libcouchbase/packaging/dllversion.rc.in +39 -0
- data/ext/libcouchbase/packaging/libcouchbase.pc.in +10 -0
- data/ext/libcouchbase/packaging/nuget/libcouchbase.autopkg +76 -0
- data/ext/libcouchbase/packaging/parse-git-describe.pl +166 -0
- data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +108 -0
- data/ext/libcouchbase/packaging/rpm/package.mk +40 -0
- data/ext/libcouchbase/plugins/io/iocp/CMakeLists.txt +9 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_iops.c +466 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_iops.h +217 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_loop.c +295 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_timer.c +79 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_util.c +229 -0
- data/ext/libcouchbase/plugins/io/libev/CMakeLists.txt +29 -0
- data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +65 -0
- data/ext/libcouchbase/plugins/io/libev/plugin-libev.c +289 -0
- data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +29 -0
- data/ext/libcouchbase/plugins/io/libevent/libevent_io_opts.h +67 -0
- data/ext/libcouchbase/plugins/io/libevent/plugin-libevent.c +292 -0
- data/ext/libcouchbase/plugins/io/libuv/CMakeLists.txt +42 -0
- data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +212 -0
- data/ext/libcouchbase/plugins/io/libuv/libuv_io_opts.h +118 -0
- data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +148 -0
- data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +648 -0
- data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +11 -0
- data/ext/libcouchbase/plugins/io/select/plugin-select.c +448 -0
- data/ext/libcouchbase/plugins/io/select/select_io_opts.h +39 -0
- data/ext/libcouchbase/src/README.md +103 -0
- data/ext/libcouchbase/src/aspend.h +106 -0
- data/ext/libcouchbase/src/auth.cc +74 -0
- data/ext/libcouchbase/src/auth.h +54 -0
- data/ext/libcouchbase/src/bootstrap.c +269 -0
- data/ext/libcouchbase/src/bootstrap.h +129 -0
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +495 -0
- data/ext/libcouchbase/src/bucketconfig/bc_file.c +347 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.c +630 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.h +82 -0
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +681 -0
- data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
- data/ext/libcouchbase/src/callbacks.c +378 -0
- data/ext/libcouchbase/src/cbft.cc +210 -0
- data/ext/libcouchbase/src/cntl.cc +847 -0
- data/ext/libcouchbase/src/config_static.h +159 -0
- data/ext/libcouchbase/src/connspec.cc +462 -0
- data/ext/libcouchbase/src/connspec.h +105 -0
- data/ext/libcouchbase/src/ctx-log-inl.h +27 -0
- data/ext/libcouchbase/src/dump.c +98 -0
- data/ext/libcouchbase/src/getconfig.c +100 -0
- data/ext/libcouchbase/src/gethrtime.c +109 -0
- data/ext/libcouchbase/src/handler.c +922 -0
- data/ext/libcouchbase/src/hashset.c +164 -0
- data/ext/libcouchbase/src/hashset.h +86 -0
- data/ext/libcouchbase/src/hashtable.c +75 -0
- data/ext/libcouchbase/src/hdr_timings.c +92 -0
- data/ext/libcouchbase/src/hostlist.cc +301 -0
- data/ext/libcouchbase/src/hostlist.h +171 -0
- data/ext/libcouchbase/src/http/http-priv.h +307 -0
- data/ext/libcouchbase/src/http/http.cc +633 -0
- data/ext/libcouchbase/src/http/http.h +34 -0
- data/ext/libcouchbase/src/http/http_io.cc +307 -0
- data/ext/libcouchbase/src/instance.cc +722 -0
- data/ext/libcouchbase/src/internal.h +244 -0
- data/ext/libcouchbase/src/iofactory.c +575 -0
- data/ext/libcouchbase/src/jsparse/parser.cc +519 -0
- data/ext/libcouchbase/src/jsparse/parser.h +173 -0
- data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
- data/ext/libcouchbase/src/lcbht/lcbht.h +199 -0
- data/ext/libcouchbase/src/lcbio/connect.c +557 -0
- data/ext/libcouchbase/src/lcbio/connect.h +364 -0
- data/ext/libcouchbase/src/lcbio/ctx.c +611 -0
- data/ext/libcouchbase/src/lcbio/ctx.h +405 -0
- data/ext/libcouchbase/src/lcbio/iotable.c +290 -0
- data/ext/libcouchbase/src/lcbio/iotable.h +84 -0
- data/ext/libcouchbase/src/lcbio/ioutils.c +350 -0
- data/ext/libcouchbase/src/lcbio/ioutils.h +203 -0
- data/ext/libcouchbase/src/lcbio/lcbio.h +51 -0
- data/ext/libcouchbase/src/lcbio/manager.c +584 -0
- data/ext/libcouchbase/src/lcbio/manager.h +156 -0
- data/ext/libcouchbase/src/lcbio/protoctx.c +84 -0
- data/ext/libcouchbase/src/lcbio/rw-inl.h +115 -0
- data/ext/libcouchbase/src/lcbio/ssl.h +149 -0
- data/ext/libcouchbase/src/lcbio/timer-ng.h +179 -0
- data/ext/libcouchbase/src/lcbio/timer.c +132 -0
- data/ext/libcouchbase/src/legacy.c +430 -0
- data/ext/libcouchbase/src/list.c +144 -0
- data/ext/libcouchbase/src/list.h +127 -0
- data/ext/libcouchbase/src/logging.c +244 -0
- data/ext/libcouchbase/src/logging.h +86 -0
- data/ext/libcouchbase/src/mc/compress.c +90 -0
- data/ext/libcouchbase/src/mc/compress.h +61 -0
- data/ext/libcouchbase/src/mc/forward.c +186 -0
- data/ext/libcouchbase/src/mc/forward.h +90 -0
- data/ext/libcouchbase/src/mc/iovcursor-inl.h +279 -0
- data/ext/libcouchbase/src/mc/iovcursor.h +66 -0
- data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +111 -0
- data/ext/libcouchbase/src/mc/mcreq.c +954 -0
- data/ext/libcouchbase/src/mc/mcreq.h +977 -0
- data/ext/libcouchbase/src/mcserver/mcserver.c +784 -0
- data/ext/libcouchbase/src/mcserver/mcserver.h +121 -0
- data/ext/libcouchbase/src/mcserver/negotiate.c +656 -0
- data/ext/libcouchbase/src/mcserver/negotiate.h +119 -0
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +860 -0
- data/ext/libcouchbase/src/n1ql/n1ql-internal.h +22 -0
- data/ext/libcouchbase/src/n1ql/n1ql.cc +729 -0
- data/ext/libcouchbase/src/n1ql/params.cc +215 -0
- data/ext/libcouchbase/src/netbuf/netbuf-defs.h +89 -0
- data/ext/libcouchbase/src/netbuf/netbuf-mblock.h +235 -0
- data/ext/libcouchbase/src/netbuf/netbuf.c +929 -0
- data/ext/libcouchbase/src/netbuf/netbuf.h +452 -0
- data/ext/libcouchbase/src/newconfig.c +385 -0
- data/ext/libcouchbase/src/nodeinfo.cc +194 -0
- data/ext/libcouchbase/src/operations/cbflush.c +71 -0
- data/ext/libcouchbase/src/operations/counter.c +116 -0
- data/ext/libcouchbase/src/operations/durability-cas.c +224 -0
- data/ext/libcouchbase/src/operations/durability-seqno.c +157 -0
- data/ext/libcouchbase/src/operations/durability.c +668 -0
- data/ext/libcouchbase/src/operations/durability_internal.h +199 -0
- data/ext/libcouchbase/src/operations/get.c +409 -0
- data/ext/libcouchbase/src/operations/observe-seqno.c +96 -0
- data/ext/libcouchbase/src/operations/observe.c +340 -0
- data/ext/libcouchbase/src/operations/pktfwd.c +86 -0
- data/ext/libcouchbase/src/operations/remove.c +83 -0
- data/ext/libcouchbase/src/operations/stats.c +461 -0
- data/ext/libcouchbase/src/operations/store.c +360 -0
- data/ext/libcouchbase/src/operations/subdoc.cc +510 -0
- data/ext/libcouchbase/src/operations/touch.c +81 -0
- data/ext/libcouchbase/src/packetutils.c +60 -0
- data/ext/libcouchbase/src/packetutils.h +147 -0
- data/ext/libcouchbase/src/probes.d +211 -0
- data/ext/libcouchbase/src/rdb/bigalloc.c +225 -0
- data/ext/libcouchbase/src/rdb/bigalloc.h +73 -0
- data/ext/libcouchbase/src/rdb/chunkalloc.c +174 -0
- data/ext/libcouchbase/src/rdb/libcalloc.c +94 -0
- data/ext/libcouchbase/src/rdb/rope.c +419 -0
- data/ext/libcouchbase/src/rdb/rope.h +488 -0
- data/ext/libcouchbase/src/retrychk.c +113 -0
- data/ext/libcouchbase/src/retryq.c +424 -0
- data/ext/libcouchbase/src/retryq.h +157 -0
- data/ext/libcouchbase/src/ringbuffer.c +442 -0
- data/ext/libcouchbase/src/ringbuffer.h +100 -0
- data/ext/libcouchbase/src/settings.c +95 -0
- data/ext/libcouchbase/src/settings.h +188 -0
- data/ext/libcouchbase/src/simplestring.c +211 -0
- data/ext/libcouchbase/src/simplestring.h +228 -0
- data/ext/libcouchbase/src/sllist-inl.h +197 -0
- data/ext/libcouchbase/src/sllist.h +76 -0
- data/ext/libcouchbase/src/ssl/CMakeLists.txt +23 -0
- data/ext/libcouchbase/src/ssl/ssl_c.c +415 -0
- data/ext/libcouchbase/src/ssl/ssl_common.c +454 -0
- data/ext/libcouchbase/src/ssl/ssl_e.c +408 -0
- data/ext/libcouchbase/src/ssl/ssl_iot_common.h +180 -0
- data/ext/libcouchbase/src/ssobuf.h +82 -0
- data/ext/libcouchbase/src/strcodecs/base64.c +123 -0
- data/ext/libcouchbase/src/strcodecs/strcodecs.h +285 -0
- data/ext/libcouchbase/src/timings.c +208 -0
- data/ext/libcouchbase/src/trace.h +105 -0
- data/ext/libcouchbase/src/utilities.c +171 -0
- data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -0
- data/ext/libcouchbase/src/vbucket/aliases.h +35 -0
- data/ext/libcouchbase/src/vbucket/crc32.h +83 -0
- data/ext/libcouchbase/src/vbucket/hash.h +30 -0
- data/ext/libcouchbase/src/vbucket/json-inl.h +112 -0
- data/ext/libcouchbase/src/vbucket/ketama.c +66 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/global.h +32 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/md5.h +35 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/md5c-inl.h +335 -0
- data/ext/libcouchbase/src/vbucket/vbucket.c +1543 -0
- data/ext/libcouchbase/src/views/docreq.c +194 -0
- data/ext/libcouchbase/src/views/docreq.h +83 -0
- data/ext/libcouchbase/src/views/viewreq.c +358 -0
- data/ext/libcouchbase/src/views/viewreq.h +36 -0
- data/ext/libcouchbase/src/wait.c +161 -0
- data/ext/libcouchbase/tests/CMakeLists.txt +140 -0
- data/ext/libcouchbase/tests/basic/t_base64.cc +81 -0
- data/ext/libcouchbase/tests/basic/t_ccbc103.cc +95 -0
- data/ext/libcouchbase/tests/basic/t_connstr.cc +404 -0
- data/ext/libcouchbase/tests/basic/t_creds.cc +32 -0
- data/ext/libcouchbase/tests/basic/t_ctlcodes.cc +92 -0
- data/ext/libcouchbase/tests/basic/t_hashset.cc +262 -0
- data/ext/libcouchbase/tests/basic/t_host.cc +198 -0
- data/ext/libcouchbase/tests/basic/t_jsparse.cc +137 -0
- data/ext/libcouchbase/tests/basic/t_jsparse.h +589 -0
- data/ext/libcouchbase/tests/basic/t_list.cc +155 -0
- data/ext/libcouchbase/tests/basic/t_logger.cc +65 -0
- data/ext/libcouchbase/tests/basic/t_misc.cc +24 -0
- data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +18 -0
- data/ext/libcouchbase/tests/basic/t_netbuf.cc +446 -0
- data/ext/libcouchbase/tests/basic/t_packet.cc +222 -0
- data/ext/libcouchbase/tests/basic/t_ringbuffer.cc +278 -0
- data/ext/libcouchbase/tests/basic/t_slist.cc +429 -0
- data/ext/libcouchbase/tests/basic/t_strerror.cc +64 -0
- data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
- data/ext/libcouchbase/tests/basic/t_urlencode.cc +132 -0
- data/ext/libcouchbase/tests/check-all.cc +608 -0
- data/ext/libcouchbase/tests/htparse/t_basic.cc +193 -0
- data/ext/libcouchbase/tests/ioserver/connection.cc +166 -0
- data/ext/libcouchbase/tests/ioserver/future.cc +50 -0
- data/ext/libcouchbase/tests/ioserver/ioserver.cc +104 -0
- data/ext/libcouchbase/tests/ioserver/ioserver.h +478 -0
- data/ext/libcouchbase/tests/ioserver/socket.cc +88 -0
- data/ext/libcouchbase/tests/ioserver/ssl_connection.cc +145 -0
- data/ext/libcouchbase/tests/ioserver/threads-pthreads.cc +119 -0
- data/ext/libcouchbase/tests/ioserver/threads-win32.cc +117 -0
- data/ext/libcouchbase/tests/ioserver/threads.h +66 -0
- data/ext/libcouchbase/tests/iotests/iotests.h +15 -0
- data/ext/libcouchbase/tests/iotests/mock-environment.cc +524 -0
- data/ext/libcouchbase/tests/iotests/mock-environment.h +385 -0
- data/ext/libcouchbase/tests/iotests/mock-unit-test.cc +67 -0
- data/ext/libcouchbase/tests/iotests/mock-unit-test.h +61 -0
- data/ext/libcouchbase/tests/iotests/serverparams.h +76 -0
- data/ext/libcouchbase/tests/iotests/t_arithmetic.cc +143 -0
- data/ext/libcouchbase/tests/iotests/t_behavior.cc +226 -0
- data/ext/libcouchbase/tests/iotests/t_configcache.cc +117 -0
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +241 -0
- data/ext/libcouchbase/tests/iotests/t_durability.cc +1059 -0
- data/ext/libcouchbase/tests/iotests/t_forward.cc +110 -0
- data/ext/libcouchbase/tests/iotests/t_get.cc +512 -0
- data/ext/libcouchbase/tests/iotests/t_http.cc +438 -0
- data/ext/libcouchbase/tests/iotests/t_iops.cc +175 -0
- data/ext/libcouchbase/tests/iotests/t_lock.cc +275 -0
- data/ext/libcouchbase/tests/iotests/t_misc.cc +713 -0
- data/ext/libcouchbase/tests/iotests/t_mutate.cc +609 -0
- data/ext/libcouchbase/tests/iotests/t_n1ql.cc +270 -0
- data/ext/libcouchbase/tests/iotests/t_netfail.cc +654 -0
- data/ext/libcouchbase/tests/iotests/t_obseqno.cc +157 -0
- data/ext/libcouchbase/tests/iotests/t_regression.cc +321 -0
- data/ext/libcouchbase/tests/iotests/t_sched.cc +88 -0
- data/ext/libcouchbase/tests/iotests/t_serverops.cc +230 -0
- data/ext/libcouchbase/tests/iotests/t_smoke.cc +528 -0
- data/ext/libcouchbase/tests/iotests/t_subdoc.cc +822 -0
- data/ext/libcouchbase/tests/iotests/t_syncmode.cc +64 -0
- data/ext/libcouchbase/tests/iotests/t_views.cc +405 -0
- data/ext/libcouchbase/tests/iotests/testutil.cc +250 -0
- data/ext/libcouchbase/tests/iotests/testutil.h +163 -0
- data/ext/libcouchbase/tests/mc/mctest.h +119 -0
- data/ext/libcouchbase/tests/mc/pktmaker.h +101 -0
- data/ext/libcouchbase/tests/mc/t_alloc.cc +269 -0
- data/ext/libcouchbase/tests/mc/t_context.cc +100 -0
- data/ext/libcouchbase/tests/mc/t_flush.cc +185 -0
- data/ext/libcouchbase/tests/mc/t_forward.cc +239 -0
- data/ext/libcouchbase/tests/mc/t_ioflush.cc +102 -0
- data/ext/libcouchbase/tests/mc/t_iovcursor.cc +173 -0
- data/ext/libcouchbase/tests/mocksupport/procutil.c +305 -0
- data/ext/libcouchbase/tests/mocksupport/procutil.h +89 -0
- data/ext/libcouchbase/tests/mocksupport/server.c +391 -0
- data/ext/libcouchbase/tests/mocksupport/server.h +72 -0
- data/ext/libcouchbase/tests/mocksupport/timeout.c +69 -0
- data/ext/libcouchbase/tests/nonio_tests.cc +23 -0
- data/ext/libcouchbase/tests/rdb/rdbtest.h +133 -0
- data/ext/libcouchbase/tests/rdb/t_basic.cc +128 -0
- data/ext/libcouchbase/tests/rdb/t_bigalloc.cc +93 -0
- data/ext/libcouchbase/tests/rdb/t_refs.cc +112 -0
- data/ext/libcouchbase/tests/socktests/socktest.cc +347 -0
- data/ext/libcouchbase/tests/socktests/socktest.h +448 -0
- data/ext/libcouchbase/tests/socktests/t_basic.cc +143 -0
- data/ext/libcouchbase/tests/socktests/t_ctx.cc +73 -0
- data/ext/libcouchbase/tests/socktests/t_manager.cc +179 -0
- data/ext/libcouchbase/tests/socktests/t_putex.cc +256 -0
- data/ext/libcouchbase/tests/socktests/t_read.cc +187 -0
- data/ext/libcouchbase/tests/socktests/t_reentrant.cc +143 -0
- data/ext/libcouchbase/tests/socktests/t_ssl.cc +80 -0
- data/ext/libcouchbase/tests/socktests/t_write.cc +95 -0
- data/ext/libcouchbase/tests/start_mock.bat +15 -0
- data/ext/libcouchbase/tests/start_mock.sh +42 -0
- data/ext/libcouchbase/tests/unit_tests.cc +43 -0
- data/ext/libcouchbase/tests/vbucket/confdata/bad.json +101 -0
- data/ext/libcouchbase/tests/vbucket/confdata/full_25.json +363 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_25.json +90 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_30.json +1 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_45.json +1 -0
- data/ext/libcouchbase/tests/vbucket/confdata/terse_25.json +291 -0
- data/ext/libcouchbase/tests/vbucket/confdata/terse_30.json +1 -0
- data/ext/libcouchbase/tests/vbucket/t_config.cc +341 -0
- data/ext/libcouchbase/tools/CMakeLists.txt +51 -0
- data/ext/libcouchbase/tools/cbc-handlers.h +462 -0
- data/ext/libcouchbase/tools/cbc-n1qlback.cc +439 -0
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +822 -0
- data/ext/libcouchbase/tools/cbc.cc +1541 -0
- data/ext/libcouchbase/tools/common/histogram.cc +43 -0
- data/ext/libcouchbase/tools/common/histogram.h +23 -0
- data/ext/libcouchbase/tools/common/my_inttypes.h +22 -0
- data/ext/libcouchbase/tools/common/options.cc +420 -0
- data/ext/libcouchbase/tools/common/options.h +81 -0
- data/ext/libcouchbase/tools/docgen/docgen.h +469 -0
- data/ext/libcouchbase/tools/docgen/loc.h +210 -0
- data/ext/libcouchbase/tools/docgen/placeholders.h +211 -0
- data/ext/libcouchbase/tools/docgen/seqgen.h +94 -0
- data/lib/libcouchbase.rb +36 -0
- data/lib/libcouchbase/bucket.rb +819 -0
- data/lib/libcouchbase/callbacks.rb +72 -0
- data/lib/libcouchbase/connection.rb +790 -0
- data/lib/libcouchbase/design_docs.rb +86 -0
- data/lib/libcouchbase/error.rb +68 -0
- data/lib/libcouchbase/ext/libcouchbase.rb +1135 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdbase.rb +23 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdcounter.rb +36 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdendure.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdfts.rb +24 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdget.rb +30 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdgetreplica.rb +49 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdhttp.rb +58 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdn1ql.rb +40 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdobseqno.rb +33 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdobserve.rb +30 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdstore.rb +40 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdstoredur.rb +45 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdsubdoc.rb +49 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdverbosity.rb +29 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdviewquery.rb +61 -0
- data/lib/libcouchbase/ext/libcouchbase/contigbuf.rb +14 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st.rb +15 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st0.rb +23 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st1.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st2.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st3.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/crst_u.rb +20 -0
- data/lib/libcouchbase/ext/libcouchbase/durability_opts_st_v.rb +11 -0
- data/lib/libcouchbase/ext/libcouchbase/durability_opts_t.rb +14 -0
- data/lib/libcouchbase/ext/libcouchbase/durabilityopt_sv0.rb +63 -0
- data/lib/libcouchbase/ext/libcouchbase/enums.rb +991 -0
- data/lib/libcouchbase/ext/libcouchbase/fragbuf.rb +18 -0
- data/lib/libcouchbase/ext/libcouchbase/ftshandle.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/histogram.rb +34 -0
- data/lib/libcouchbase/ext/libcouchbase/http_request_t.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/keybuf.rb +20 -0
- data/lib/libcouchbase/ext/libcouchbase/multicmd_ctx.rb +30 -0
- data/lib/libcouchbase/ext/libcouchbase/mutation_token.rb +17 -0
- data/lib/libcouchbase/ext/libcouchbase/n1qlhandle.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/n1qlparams.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/respbase.rb +29 -0
- data/lib/libcouchbase/ext/libcouchbase/respcounter.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/respendure.rb +49 -0
- data/lib/libcouchbase/ext/libcouchbase/respfts.rb +40 -0
- data/lib/libcouchbase/ext/libcouchbase/respget.rb +44 -0
- data/lib/libcouchbase/ext/libcouchbase/resphttp.rb +48 -0
- data/lib/libcouchbase/ext/libcouchbase/respmcversion.rb +38 -0
- data/lib/libcouchbase/ext/libcouchbase/respn1ql.rb +41 -0
- data/lib/libcouchbase/ext/libcouchbase/respobseqno.rb +52 -0
- data/lib/libcouchbase/ext/libcouchbase/respobserve.rb +41 -0
- data/lib/libcouchbase/ext/libcouchbase/respserverbase.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/respstats.rb +38 -0
- data/lib/libcouchbase/ext/libcouchbase/respstore.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/respstoredur.rb +38 -0
- data/lib/libcouchbase/ext/libcouchbase/respsubdoc.rb +35 -0
- data/lib/libcouchbase/ext/libcouchbase/respviewquery.rb +67 -0
- data/lib/libcouchbase/ext/libcouchbase/sdentry.rb +22 -0
- data/lib/libcouchbase/ext/libcouchbase/sdspec.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/t.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/valbuf.rb +22 -0
- data/lib/libcouchbase/ext/libcouchbase/valbuf_u_buf.rb +14 -0
- data/lib/libcouchbase/ext/libcouchbase/viewhandle.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase_iocp.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase_libuv.rb +18 -0
- data/lib/libcouchbase/ext/tasks.rb +87 -0
- data/lib/libcouchbase/n1ql.rb +73 -0
- data/lib/libcouchbase/query_full_text.rb +147 -0
- data/lib/libcouchbase/query_n1ql.rb +121 -0
- data/lib/libcouchbase/query_view.rb +129 -0
- data/lib/libcouchbase/results_fiber.rb +262 -0
- data/lib/libcouchbase/results_native.rb +211 -0
- data/lib/libcouchbase/version.rb +5 -0
- data/libcouchbase.gemspec +61 -0
- data/spec/bucket_spec.rb +270 -0
- data/spec/connection_spec.rb +277 -0
- data/spec/design_docs_spec.rb +23 -0
- data/spec/error_spec.rb +26 -0
- data/spec/fts_spec.rb +129 -0
- data/spec/n1ql_spec.rb +201 -0
- data/spec/results_libuv_spec.rb +229 -0
- data/spec/results_native_spec.rb +259 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/design.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/data-0000.cbb +0 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/failover.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/meta.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/seqno.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/snapshot_markers.json +1 -0
- data/spec/view_spec.rb +195 -0
- 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
|