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,119 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2015 Couchbase, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#include <stdio.h>
|
|
18
|
+
#include <stdlib.h>
|
|
19
|
+
#include <string.h>
|
|
20
|
+
#include <assert.h>
|
|
21
|
+
#include <libcouchbase/couchbase.h>
|
|
22
|
+
#include <libcouchbase/api3.h>
|
|
23
|
+
#include <unistd.h>
|
|
24
|
+
|
|
25
|
+
#define VALUE_SIZE 1048576
|
|
26
|
+
static int counter = 0;
|
|
27
|
+
static const char *key = "Hello";
|
|
28
|
+
static char value[VALUE_SIZE];
|
|
29
|
+
|
|
30
|
+
static void store_cb(lcb_t instance, int cbtype, const lcb_RESPSTORE *resp)
|
|
31
|
+
{
|
|
32
|
+
assert(resp->rc == LCB_SUCCESS);
|
|
33
|
+
counter--;
|
|
34
|
+
printf("-");
|
|
35
|
+
fflush(stdout);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
int main(int argc, char **argv)
|
|
39
|
+
{
|
|
40
|
+
lcb_t instance;
|
|
41
|
+
lcb_error_t rc;
|
|
42
|
+
int ii;
|
|
43
|
+
struct lcb_create_st options = { 0 };
|
|
44
|
+
lcb_CMDSTORE cmd = { 0 };
|
|
45
|
+
|
|
46
|
+
if (argc != 2) {
|
|
47
|
+
fprintf(stderr, "Must have connection string!\n");
|
|
48
|
+
exit(EXIT_FAILURE);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
options.version = 3;
|
|
52
|
+
options.v.v3.connstr = argv[1];
|
|
53
|
+
|
|
54
|
+
rc = lcb_create(&instance, &options);
|
|
55
|
+
assert(rc == LCB_SUCCESS);
|
|
56
|
+
|
|
57
|
+
rc = lcb_cntl_string(instance, "operation_timeout", "120");
|
|
58
|
+
assert(rc == LCB_SUCCESS);
|
|
59
|
+
|
|
60
|
+
rc = lcb_connect(instance);
|
|
61
|
+
assert(rc == LCB_SUCCESS);
|
|
62
|
+
|
|
63
|
+
lcb_wait(instance);
|
|
64
|
+
rc = lcb_get_bootstrap_status(instance);
|
|
65
|
+
assert(rc == LCB_SUCCESS);
|
|
66
|
+
|
|
67
|
+
lcb_install_callback3(instance, LCB_CALLBACK_STORE, (lcb_RESPCALLBACK)store_cb);
|
|
68
|
+
|
|
69
|
+
// fill the value so valgrind doesn't warn about unitialized buffers
|
|
70
|
+
for (ii = 0; ii < VALUE_SIZE; ii++) {
|
|
71
|
+
value[ii] = '*';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
LCB_CMD_SET_KEY(&cmd, key, strlen(key));
|
|
75
|
+
LCB_CMD_SET_VALUE(&cmd, value, VALUE_SIZE);
|
|
76
|
+
cmd.operation = LCB_SET;
|
|
77
|
+
|
|
78
|
+
printf("Running sample. This will schedule 1000 operations, invoking \n");
|
|
79
|
+
printf("an event loop tick after each one. The tick is non-blocking\n");
|
|
80
|
+
printf("It will sleep 500 microseconds between each operation to allow\n");
|
|
81
|
+
printf("for the asynchronous sending of the buffer's contents to the\n");
|
|
82
|
+
printf("server.\n\n");
|
|
83
|
+
printf("LEGEND:\n");
|
|
84
|
+
printf(" + => Operation Scheduled\n");
|
|
85
|
+
printf(" - => Operation Completed\n");
|
|
86
|
+
|
|
87
|
+
for (ii = 0; ii < 1000; ii++) {
|
|
88
|
+
lcb_sched_enter(instance);
|
|
89
|
+
|
|
90
|
+
// Note: lcb_store() implicitly does lcb_sched_enter(), lcb_store3(),
|
|
91
|
+
// and lcb_sched_leave().
|
|
92
|
+
rc = lcb_store3(instance, NULL, &cmd);
|
|
93
|
+
assert(rc == LCB_SUCCESS);
|
|
94
|
+
lcb_sched_leave(instance);
|
|
95
|
+
counter++;
|
|
96
|
+
|
|
97
|
+
// This is like lcb_wait(), except it does not block.
|
|
98
|
+
lcb_tick_nowait(instance);
|
|
99
|
+
|
|
100
|
+
// Sleep to demonstrate.. Naturally the longer the wait time, the
|
|
101
|
+
// clearer the difference between the tick and non-tick versions
|
|
102
|
+
usleep(100);
|
|
103
|
+
printf("+");
|
|
104
|
+
fflush(stdout);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
printf("\nCalling lcb_wait()\n");
|
|
108
|
+
lcb_wait(instance);
|
|
109
|
+
printf("\n");
|
|
110
|
+
lcb_destroy(instance);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Sample output
|
|
115
|
+
* +++++++++++++--+----+----+-++++++++++++++-++----------+++-+--+-------++++++++--+------++-+++++++++-+++++-++++-+++++-+++++-++++-+++++-++++-++++++++++-++-++++-++++-++++-++++++-+++++-+++++-+++++-+++++-+++++-++++++++---++-++-++-+-+++-+-+++-+-+++-+-++-+-+-+++-+++-+-++-++-++-+--+-+-++-+++-+--+-+-++-+-+++++++++++++++-+-+-+-+--++-++++++++++++-++++-+++++++++-++++-++-++++++-+++++-+++-+++++-+++-+++++-++++-++++--++-++-++-+-++++++++-+---+++--++-+-+-+++--+-+--+-++++--++--+-+-+-+++++-+-+--++-+++-+-+--+--+-+--+++-+-++-+--+-++++-+--++++++++--+-++---++-++-++---+-+--+-++++--+++--+-+-+--+-+++-++++++---+------------+-----------------------------------------------------------++++----------------------------------------------------------------------------------------------------++++-+++++++--+-+--+-+++++-+--+--+--++++-+-++--+-+-+--++++-+--+++-+-+--+-+--+-++++++++-+----++-+-------------------------+------------------------------++++++++++-+-+++-+-+--+-+---++-+-++++-+-+-+-+--+++-+--------+------++---++++-+++-+-+-+-+--+++-+++-+--+-+-+++-+-++-+-+-+--+-++----+---+------+++++++--+++-+++++-------+-++++++---------+++++-+---+-+-+++-++-----+-----+++++-+-+-++++++--+-+-+--+-+-+-++++--+-+--+-+++++--+--+-++-+----+-----++++++---++++-+++++-++++++-++++-++++-+++++-++++++++-+++++-+++++-+++++-++++-++++-+++++-+++++-+++++-+++++-++++-++++-++++++-+++++-++++-+++-++++-+++++-++++-+++-++++++-+++-++-+++-+--++-++-++-+--+++++----+++-+--+--+-+--++-+++-+-+--+--++-+++-+--+-++++--+-+-+-++-+++-+--+-+--+-+-++++--+-+--+-+-+-+++-+--+-+--+-++-+-++-+-+-+-+-+--+-++-+-+-------+-----+------+------------------+--------------------+------------------------------------------------------+---++++++++-++++-+++++++-++-+++++-+++++-++++-+++++-++++++-++++-+++-++-+-+-+++-++-+-+++-+-++-+++++++++------++-++-+--+-+--++++++++-----+-+++--+-+-+--+-+-+++-++-+-+-+--+-++-++++-+--+--+-+-+++-+++-+--+-+--+-++-+------+--------------+------------------------------------------------------+-------+++++++++-++++++-+++-++++-++++++-+
|
|
116
|
+
* Calling lcb_wait()
|
|
117
|
+
* ----------------------------
|
|
118
|
+
*
|
|
119
|
+
*/
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#include <libcouchbase/couchbase.h>
|
|
2
|
+
#include <libcouchbase/api3.h>
|
|
3
|
+
#include <libcouchbase/views.h>
|
|
4
|
+
#include <string>
|
|
5
|
+
#include <cstring>
|
|
6
|
+
#include <cstdlib>
|
|
7
|
+
#include <cstdio>
|
|
8
|
+
#include <cassert>
|
|
9
|
+
|
|
10
|
+
static int cbCounter = 0;
|
|
11
|
+
|
|
12
|
+
extern "C" {
|
|
13
|
+
static void viewCallback(lcb_t, int, const lcb_RESPVIEWQUERY *rv)
|
|
14
|
+
{
|
|
15
|
+
if (rv->rflags & LCB_RESP_F_FINAL) {
|
|
16
|
+
printf("*** META FROM VIEWS ***\n");
|
|
17
|
+
fprintf(stderr, "%.*s\n", (int)rv->nvalue, rv->value);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
printf("Got row callback from LCB: RC=0x%X, DOCID=%.*s. KEY=%.*s\n",
|
|
22
|
+
rv->rc,
|
|
23
|
+
(int)rv->ndocid, rv->docid,
|
|
24
|
+
(int)rv->nkey, rv->key);
|
|
25
|
+
|
|
26
|
+
if (rv->docresp) {
|
|
27
|
+
printf(" Document for response. RC=0x%X. CAS=0x%llx\n",
|
|
28
|
+
rv->docresp->rc, rv->docresp->cas);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
cbCounter++;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
int main(int argc, const char **argv)
|
|
36
|
+
{
|
|
37
|
+
lcb_t instance;
|
|
38
|
+
lcb_create_st cropts;
|
|
39
|
+
memset(&cropts, 0, sizeof cropts);
|
|
40
|
+
const char *connstr = "couchbase://localhost/beer-sample";
|
|
41
|
+
|
|
42
|
+
if (argc > 1) {
|
|
43
|
+
if (strcmp(argv[1], "--help") == 0) {
|
|
44
|
+
fprintf(stderr, "Usage: %s CONNSTR\n", argv[0]);
|
|
45
|
+
exit(EXIT_SUCCESS);
|
|
46
|
+
} else {
|
|
47
|
+
connstr = argv[1];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
cropts.version = 3;
|
|
52
|
+
cropts.v.v3.connstr = connstr;
|
|
53
|
+
lcb_error_t rc;
|
|
54
|
+
rc = lcb_create(&instance, &cropts);
|
|
55
|
+
assert(rc == LCB_SUCCESS);
|
|
56
|
+
rc = lcb_connect(instance);
|
|
57
|
+
assert(rc == LCB_SUCCESS);
|
|
58
|
+
lcb_wait(instance);
|
|
59
|
+
assert(lcb_get_bootstrap_status(instance) == LCB_SUCCESS);
|
|
60
|
+
|
|
61
|
+
// Nao, set up the views..
|
|
62
|
+
lcb_CMDVIEWQUERY vq = { 0 };
|
|
63
|
+
std::string dName = "beer";
|
|
64
|
+
std::string vName = "by_location";
|
|
65
|
+
std::string options = "reduce=false";
|
|
66
|
+
|
|
67
|
+
vq.callback = viewCallback;
|
|
68
|
+
vq.ddoc = dName.c_str();
|
|
69
|
+
vq.nddoc = dName.length();
|
|
70
|
+
vq.view = vName.c_str();
|
|
71
|
+
vq.nview = vName.length();
|
|
72
|
+
vq.optstr = options.c_str();
|
|
73
|
+
vq.noptstr = options.size();
|
|
74
|
+
|
|
75
|
+
vq.cmdflags = LCB_CMDVIEWQUERY_F_INCLUDE_DOCS;
|
|
76
|
+
|
|
77
|
+
rc = lcb_view_query(instance, NULL, &vq);
|
|
78
|
+
assert(rc == LCB_SUCCESS);
|
|
79
|
+
lcb_wait(instance);
|
|
80
|
+
lcb_destroy(instance);
|
|
81
|
+
printf("Total Invocations=%d\n", cbCounter);
|
|
82
|
+
return 0;
|
|
83
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2014 Couchbase, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#ifndef LCB_CXXWRAP_H
|
|
19
|
+
#define LCB_CXXWRAP_H
|
|
20
|
+
|
|
21
|
+
/* Note that the contents of this file are here only to provide inline
|
|
22
|
+
* definitions for backwards compatibility with older code. Users of the library
|
|
23
|
+
* should assume that structures do _not_ behave differently under C++ and must
|
|
24
|
+
* be explicitly initialized with their appropriate members.
|
|
25
|
+
*
|
|
26
|
+
* For newer code which wants to use pure "C-Style" initializers, define the
|
|
27
|
+
* LCB_NO_DEPR_CXX_CTORS macro so that the structures remain to function
|
|
28
|
+
* as they do in plain C.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
#if defined(__cplusplus) && !defined(LCB_NO_DEPR_CXX_CTORS)
|
|
32
|
+
|
|
33
|
+
#include <cstdlib>
|
|
34
|
+
#include <cstring>
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
#define LCB_DEPR_CTORS_GET \
|
|
38
|
+
lcb_get_cmd_st() { std::memset(this, 0, sizeof(*this)); } \
|
|
39
|
+
lcb_get_cmd_st(const void *key, lcb_size_t nkey=0, lcb_time_t exptime=0, int lock=0) { \
|
|
40
|
+
version = 0; \
|
|
41
|
+
v.v0.key = key; \
|
|
42
|
+
if (key != NULL && nkey == 0) { \
|
|
43
|
+
v.v0.nkey = std::strlen((const char *)key); \
|
|
44
|
+
} else { \
|
|
45
|
+
v.v0.nkey = nkey; \
|
|
46
|
+
} \
|
|
47
|
+
v.v0.exptime = exptime; v.v0.lock = lock; v.v0.hashkey = NULL; v.v0.nhashkey = 0; \
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
#define LCB_DEPR_CTORS_RGET \
|
|
52
|
+
lcb_get_replica_cmd_st() { std::memset(this, 0, sizeof(*this)); } \
|
|
53
|
+
lcb_get_replica_cmd_st(const void *key, lcb_size_t nkey, lcb_replica_t strategy=LCB_REPLICA_FIRST, int index=0) { \
|
|
54
|
+
version = 1; v.v1.key = key; v.v1.nkey = nkey; v.v1.hashkey = NULL; v.v1.nhashkey = 0; v.v1.strategy = strategy; v.v1.index = index; \
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
#define LCB_DEPR_CTORS_UNL \
|
|
58
|
+
lcb_unlock_cmd_st() { std::memset(this, 0, sizeof(*this)); } \
|
|
59
|
+
lcb_unlock_cmd_st(const void *key, lcb_size_t nkey, lcb_cas_t cas) { \
|
|
60
|
+
version = 0; v.v0.key = key; v.v0.nkey = nkey; v.v0.cas = cas; v.v0.hashkey = NULL; v.v0.nhashkey = 0; \
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
#define LCB_DEPR_CTORS_STORE \
|
|
64
|
+
lcb_store_cmd_st() { std::memset(this, 0, sizeof(*this)); } \
|
|
65
|
+
lcb_store_cmd_st(lcb_storage_t operation, const void *key, lcb_size_t nkey, \
|
|
66
|
+
const void *bytes=NULL, lcb_size_t nbytes=0, lcb_uint32_t flags=0, \
|
|
67
|
+
lcb_time_t exptime=0, lcb_cas_t cas=0, lcb_datatype_t datatype=0) { \
|
|
68
|
+
version = 0; v.v0.operation = operation; v.v0.key = key; v.v0.nkey = nkey; v.v0.cas = cas; \
|
|
69
|
+
v.v0.bytes = bytes; v.v0.nbytes = nbytes; v.v0.flags = flags; v.v0.datatype = datatype; \
|
|
70
|
+
v.v0.exptime = exptime; v.v0.hashkey = NULL; v.v0.nhashkey = 0; \
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
#define LCB_DEPR_CTORS_ARITH \
|
|
74
|
+
lcb_arithmetic_cmd_st() { std::memset(this, 0, sizeof(*this)); } \
|
|
75
|
+
lcb_arithmetic_cmd_st(const void *key, lcb_size_t nkey, lcb_int64_t delta, int create=0, \
|
|
76
|
+
lcb_uint64_t initial=0, lcb_time_t exptime=0) { \
|
|
77
|
+
version = 0; v.v0.key = key; v.v0.nkey = nkey; v.v0.exptime = exptime; \
|
|
78
|
+
v.v0.delta = delta; v.v0.create = create; v.v0.initial = initial; \
|
|
79
|
+
v.v0.hashkey = NULL; v.v0.nhashkey = 0; \
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
#define LCB_DEPR_CTORS_OBS \
|
|
84
|
+
lcb_observe_cmd_st() { std::memset(this, 0, sizeof(*this)); } \
|
|
85
|
+
lcb_observe_cmd_st(const void *key, lcb_size_t nkey) { \
|
|
86
|
+
version = 0; v.v0.key = key; v.v0.nkey = nkey; v.v0.hashkey = NULL; v.v0.nhashkey = 0; \
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
#define LCB_DEPR_CTORS_RM \
|
|
90
|
+
lcb_remove_cmd_st() { std::memset(this, 0, sizeof(*this)); } \
|
|
91
|
+
lcb_remove_cmd_st(const void *key, lcb_size_t nkey=0, lcb_cas_t cas=0) { \
|
|
92
|
+
version = 0; v.v0.key = key; \
|
|
93
|
+
if (key != NULL && nkey == 0) { v.v0.nkey = std::strlen((const char *)key);}\
|
|
94
|
+
else { v.v0.nkey = nkey; } \
|
|
95
|
+
v.v0.cas = cas; v.v0.hashkey = NULL; v.v0.nhashkey = 0; \
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
#define LCB_DEPR_CTORS_STATS \
|
|
99
|
+
lcb_server_stats_cmd_st(const char *name=NULL, lcb_size_t nname=0) { \
|
|
100
|
+
version = 0; v.v0.name = name; v.v0.nname = nname; \
|
|
101
|
+
if (name != NULL && nname == 0) { v.v0.nname = std::strlen(name); } \
|
|
102
|
+
else { v.v0.nname = nname; } \
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
#define LCB_DEPR_CTORS_VERBOSITY \
|
|
106
|
+
lcb_verbosity_cmd_st(lcb_verbosity_level_t level=LCB_VERBOSITY_WARNING, const char *server=NULL) { \
|
|
107
|
+
version = 0; v.v0.server = server; v.v0.level = level; \
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
#define LCB_DEPR_CTORS_VERSIONS \
|
|
111
|
+
lcb_server_version_cmd_st() { std::memset(this, 0, sizeof(*this)); }
|
|
112
|
+
|
|
113
|
+
#define LCB_DEPR_CTORS_FLUSH \
|
|
114
|
+
lcb_flush_cmd_st() { std::memset(this, 0, sizeof(*this)); }
|
|
115
|
+
|
|
116
|
+
#define LCB_DEPR_CTORS_CRST \
|
|
117
|
+
lcb_create_st(const char *host=NULL, const char *user=NULL,\
|
|
118
|
+
const char *passwd=NULL, const char *bucket=NULL, \
|
|
119
|
+
struct lcb_io_opt_st *io=NULL, lcb_type_t type=LCB_TYPE_BUCKET) { \
|
|
120
|
+
version = 2; v.v2.host = host; v.v2.user = user; v.v2.passwd = passwd; \
|
|
121
|
+
v.v2.bucket = bucket; v.v2.io = io; v.v2.type = type; v.v2.mchosts = NULL; \
|
|
122
|
+
v.v2.transports = NULL; \
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
#define LCB_DEPR_CTORS_HTTP \
|
|
126
|
+
lcb_http_cmd_st() { std::memset(this, 0, sizeof(*this)); } \
|
|
127
|
+
lcb_http_cmd_st(const char *path, lcb_size_t npath, const void *body, \
|
|
128
|
+
lcb_size_t nbody, lcb_http_method_t method, \
|
|
129
|
+
int chunked, const char *content_type) { \
|
|
130
|
+
version = 0; v.v0.path = path; v.v0.npath = npath; v.v0.body = body; \
|
|
131
|
+
v.v0.nbody = nbody; v.v0.method = method; v.v0.chunked = chunked; \
|
|
132
|
+
v.v0.content_type = content_type; \
|
|
133
|
+
}
|
|
134
|
+
#else
|
|
135
|
+
/* Not C++ */
|
|
136
|
+
#define LCB_DEPR_CTORS_GET
|
|
137
|
+
#define LCB_DEPR_CTORS_RGET
|
|
138
|
+
#define LCB_DEPR_CTORS_UNL
|
|
139
|
+
#define LCB_DEPR_CTORS_STORE
|
|
140
|
+
#define LCB_DEPR_CTORS_ARITH
|
|
141
|
+
#define LCB_DEPR_CTORS_OBS
|
|
142
|
+
#define LCB_DEPR_CTORS_RM
|
|
143
|
+
#define LCB_DEPR_CTORS_STATS
|
|
144
|
+
#define LCB_DEPR_CTORS_VERBOSITY
|
|
145
|
+
#define LCB_DEPR_CTORS_VERSIONS
|
|
146
|
+
#define LCB_DEPR_CTORS_FLUSH
|
|
147
|
+
#define LCB_DEPR_CTORS_HTTP
|
|
148
|
+
#define LCB_DEPR_CTORS_CRST
|
|
149
|
+
#endif
|
|
150
|
+
#endif /* LCB_CXXWRAP_H */
|
|
@@ -0,0 +1,1689 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2010-2016 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
|
+
#ifndef LCB_APILEGACY_H
|
|
18
|
+
#define LCB_APILEGACY_H
|
|
19
|
+
|
|
20
|
+
#ifdef __cplusplus
|
|
21
|
+
extern "C" {
|
|
22
|
+
#endif
|
|
23
|
+
|
|
24
|
+
#ifndef LIBCOUCHBASE_COUCHBASE_H
|
|
25
|
+
#error "include <libcouchbase/couchbase.h> first!"
|
|
26
|
+
#endif
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
/**@private
|
|
30
|
+
* Note that hashkey/groupid is not a supported feature of Couchbase Server
|
|
31
|
+
* and this client. It should be considered volatile and experimental.
|
|
32
|
+
* Using this could lead to an unbalanced cluster, inability to interoperate
|
|
33
|
+
* with the data from other languages, not being able to use the
|
|
34
|
+
* Couchbase Server UI to look up documents and other possible future
|
|
35
|
+
* upgrade/migration concerns.
|
|
36
|
+
*/
|
|
37
|
+
#define LCB__HKFIELDS \
|
|
38
|
+
/**
|
|
39
|
+
@private
|
|
40
|
+
@volatile
|
|
41
|
+
Do not use. This field exists to support older code. Using a dedicated
|
|
42
|
+
hashkey will cause problems with your data in various systems. */ \
|
|
43
|
+
const void *hashkey; \
|
|
44
|
+
\
|
|
45
|
+
lcb_SIZE nhashkey; /**<@private*/
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @defgroup lcb-legacy-api Legacy Key-Value API
|
|
49
|
+
* @brief Operate on one or more key values
|
|
50
|
+
* @details
|
|
51
|
+
*
|
|
52
|
+
* The key-value APIs are high performance APIs utilizing the memcached protocol.
|
|
53
|
+
* Use these APIs to access data by its unique key.
|
|
54
|
+
*
|
|
55
|
+
* These APIs are designed so that each function is passed in one or more
|
|
56
|
+
* "Command Structures". A command structure is a small structure detailing a
|
|
57
|
+
* specific key and contains options and modifiers for the operation as it
|
|
58
|
+
* relates to that key.
|
|
59
|
+
*
|
|
60
|
+
* All the command structures are currently layed out like so:
|
|
61
|
+
*
|
|
62
|
+
* @code{.c}
|
|
63
|
+
* {
|
|
64
|
+
* int version;
|
|
65
|
+
* union {
|
|
66
|
+
* struct CMDv0 v0;
|
|
67
|
+
* struct CMDv1 v1;
|
|
68
|
+
* } v;
|
|
69
|
+
* }
|
|
70
|
+
* @endcode
|
|
71
|
+
*
|
|
72
|
+
* These top level structures are _wrapper_ structures and are present to ensure
|
|
73
|
+
* portability between different versions of the library. To employ these
|
|
74
|
+
* structures within the command, you may do:
|
|
75
|
+
*
|
|
76
|
+
* @code{.c}
|
|
77
|
+
* lcb_get_cmd_t gcmd_wrap = { 0 }, *cmdp_wrap = &gcmd_wrap;
|
|
78
|
+
* lcb_GETCMDv0 *gcmd = &gcmd_wrap->v.v0;
|
|
79
|
+
* gcmd->key = key;
|
|
80
|
+
* gcmd->nkey = strlen(key);
|
|
81
|
+
* lcb_get(instance, cookie, 1, &gcmd_wrap);
|
|
82
|
+
* @endcode
|
|
83
|
+
*
|
|
84
|
+
* @addtogroup lcb-legacy-api
|
|
85
|
+
* @{
|
|
86
|
+
*/
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @brief Get Command Structure
|
|
90
|
+
*/
|
|
91
|
+
typedef struct {
|
|
92
|
+
const void *key; /**< Key to retrieve */
|
|
93
|
+
lcb_SIZE nkey; /**< Key length */
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* If this parameter is specified and `lock` is _not_ set then the server
|
|
97
|
+
* will also update the object's expiration time while retrieving the key.
|
|
98
|
+
* If `lock` _is_ set then this is the maximum amount of time the lock
|
|
99
|
+
* may be held (before an unlock) before the server will forecfully unlock
|
|
100
|
+
* the key.
|
|
101
|
+
*/
|
|
102
|
+
lcb_time_t exptime;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* If this parameter is set then the server will in addition to retrieving
|
|
106
|
+
* the item also lock the item, making it so that subsequent attempts to
|
|
107
|
+
* lock and/or modify the same item will fail with an error
|
|
108
|
+
* (either @ref LCB_KEY_EEXISTS or @ref LCB_ETMPFAIL).
|
|
109
|
+
*
|
|
110
|
+
* The lock will be released when one of the following happens:
|
|
111
|
+
*
|
|
112
|
+
* 1. The item is explicitly unlocked (see lcb_unlock())
|
|
113
|
+
* 2. The lock expires (See the #exptime parameter)
|
|
114
|
+
* 3. The item is modified using lcb_store(), and being provided with the
|
|
115
|
+
* correct _CAS_.
|
|
116
|
+
*
|
|
117
|
+
*/
|
|
118
|
+
int lock;
|
|
119
|
+
LCB__HKFIELDS
|
|
120
|
+
} lcb_GETCMDv0;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @brief lcb_get() Command Wrapper Structure
|
|
124
|
+
* @see lcb_GETCMDv0
|
|
125
|
+
*/
|
|
126
|
+
typedef struct lcb_get_cmd_st {
|
|
127
|
+
int version;
|
|
128
|
+
union { lcb_GETCMDv0 v0; } v;
|
|
129
|
+
LCB_DEPR_CTORS_GET
|
|
130
|
+
} lcb_get_cmd_t;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* @brief Inner response structure for a get operation
|
|
134
|
+
*/
|
|
135
|
+
typedef struct {
|
|
136
|
+
const void *key;
|
|
137
|
+
lcb_SIZE nkey;
|
|
138
|
+
const void *bytes;
|
|
139
|
+
lcb_SIZE nbytes;
|
|
140
|
+
lcb_U32 flags; /**< Server side flags stored with the item */
|
|
141
|
+
lcb_cas_t cas; /**< CAS representing current mutation state of the item */
|
|
142
|
+
lcb_U8 datatype; /**< @private */
|
|
143
|
+
} lcb_GETRESPv0;
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* @brief lcb_get() response wrapper structure
|
|
147
|
+
* @see lcb_GETRESPv0
|
|
148
|
+
*/
|
|
149
|
+
typedef struct {
|
|
150
|
+
int version;
|
|
151
|
+
union {
|
|
152
|
+
lcb_GETRESPv0 v0;
|
|
153
|
+
} v;
|
|
154
|
+
} lcb_get_resp_t;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* The callback function for a "get-style" request.
|
|
158
|
+
*
|
|
159
|
+
* @param instance the instance performing the operation
|
|
160
|
+
* @param cookie the cookie associated with with the command
|
|
161
|
+
* @param error The status of the operation
|
|
162
|
+
* @param resp More information about the actual item (only key
|
|
163
|
+
* and nkey is valid if `error != LCB_SUCCESS`)
|
|
164
|
+
* @committed
|
|
165
|
+
*/
|
|
166
|
+
typedef void (*lcb_get_callback)(
|
|
167
|
+
lcb_t instance, const void *cookie, lcb_error_t error, const lcb_get_resp_t *resp);
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* @brief Set the callback to be invoked when an item is received as a result
|
|
171
|
+
* of an lcb_get() operation.
|
|
172
|
+
* @param callback the new callback to install. Pass NULL to only query the
|
|
173
|
+
* current callback
|
|
174
|
+
* @return the previous callback
|
|
175
|
+
* @see lcb_get()
|
|
176
|
+
* @committed
|
|
177
|
+
*/
|
|
178
|
+
LIBCOUCHBASE_API
|
|
179
|
+
lcb_get_callback lcb_set_get_callback(lcb_t, lcb_get_callback callback);
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Get a number of values from the cache.
|
|
183
|
+
*
|
|
184
|
+
* If you specify a non-zero value for expiration, the server will
|
|
185
|
+
* update the expiration value on the item (refer to the
|
|
186
|
+
* documentation on lcb_store to see the meaning of the
|
|
187
|
+
* expiration). All other members should be set to zero.
|
|
188
|
+
*
|
|
189
|
+
* @code{.c}
|
|
190
|
+
* lcb_get_cmd_t *get = calloc(1, sizeof(*get));
|
|
191
|
+
* get->version = 0;
|
|
192
|
+
* get->v.v0.key = "my-key";
|
|
193
|
+
* get->v.v0.nkey = strlen(get->v.v0.key);
|
|
194
|
+
* // Set an expiration of 60 (optional)
|
|
195
|
+
* get->v.v0.exptime = 60;
|
|
196
|
+
* lcb_get_cmd_t* commands[] = { get };
|
|
197
|
+
* lcb_get(instance, NULL, 1, commands);
|
|
198
|
+
* @endcode
|
|
199
|
+
*
|
|
200
|
+
* It is possible to get an item with a lock that has a timeout. It can
|
|
201
|
+
* then be unlocked with either a CAS operation or with an explicit
|
|
202
|
+
* unlock command.
|
|
203
|
+
*
|
|
204
|
+
* You may specify the expiration value for the lock in the
|
|
205
|
+
* expiration (setting it to 0 cause the server to use the default
|
|
206
|
+
* value).
|
|
207
|
+
*
|
|
208
|
+
* Get and lock the key:
|
|
209
|
+
*
|
|
210
|
+
* @code{.c}
|
|
211
|
+
* lcb_get_cmd_t *get = calloc(1, sizeof(*get));
|
|
212
|
+
* get->version = 0;
|
|
213
|
+
* get->v.v0.key = "my-key";
|
|
214
|
+
* get->v.v0.nkey = strlen(get->v.v0.key);
|
|
215
|
+
* // Set a lock expiration of 5 (optional)
|
|
216
|
+
* get->v.v0.lock = 1;
|
|
217
|
+
* get->v.v0.exptime = 5;
|
|
218
|
+
* lcb_get_cmd_t* commands[] = { get };
|
|
219
|
+
* lcb_get(instance, NULL, 1, commands);
|
|
220
|
+
* @endcode
|
|
221
|
+
*
|
|
222
|
+
* @param instance the instance used to batch the requests from
|
|
223
|
+
* @param command_cookie A cookie passed to all of the notifications
|
|
224
|
+
* from this command
|
|
225
|
+
* @param num the total number of elements in the commands array
|
|
226
|
+
* @param commands the array containing the items to get
|
|
227
|
+
* @return_rc
|
|
228
|
+
*
|
|
229
|
+
* Operation-specific errors received in callbacks include:
|
|
230
|
+
* @cb_err ::LCB_KEY_ENOENT if the key does not exist
|
|
231
|
+
* @cb_err ::LCB_ETMPFAIL if the `lock` option was set in the command and the item
|
|
232
|
+
* was already locked.
|
|
233
|
+
*
|
|
234
|
+
* @committed
|
|
235
|
+
*/
|
|
236
|
+
LIBCOUCHBASE_API
|
|
237
|
+
lcb_error_t lcb_get(lcb_t instance, const void *command_cookie, lcb_SIZE num,
|
|
238
|
+
const lcb_get_cmd_t *const *commands);
|
|
239
|
+
|
|
240
|
+
/**@}*/
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* @name Legacy get-from-replica API
|
|
244
|
+
*
|
|
245
|
+
* @{
|
|
246
|
+
*/
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
typedef struct { const void *key; lcb_SIZE nkey; LCB__HKFIELDS } lcb_GETREPLICACMDv0;
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* @brief Command for lcb_get_replica()
|
|
253
|
+
*/
|
|
254
|
+
typedef struct {
|
|
255
|
+
const void *key;
|
|
256
|
+
lcb_SIZE nkey;
|
|
257
|
+
LCB__HKFIELDS
|
|
258
|
+
lcb_replica_t strategy; /**< Strategy to use */
|
|
259
|
+
/**If #strategy is LCB_REPLICA_SELECT, specific the replica index to use */
|
|
260
|
+
int index;
|
|
261
|
+
} lcb_GETREPLICACMDv1;
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* @brief wrapper structure for lcb_get_replica()
|
|
265
|
+
* @see lcb_GETREPLICACMDv1
|
|
266
|
+
*/
|
|
267
|
+
typedef struct lcb_get_replica_cmd_st {
|
|
268
|
+
int version;
|
|
269
|
+
union {
|
|
270
|
+
lcb_GETREPLICACMDv0 v0;
|
|
271
|
+
lcb_GETREPLICACMDv1 v1;
|
|
272
|
+
} v;
|
|
273
|
+
LCB_DEPR_CTORS_RGET
|
|
274
|
+
} lcb_get_replica_cmd_t;
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Get a number of replca values from the cache.
|
|
278
|
+
*
|
|
279
|
+
* @brief Get items from replica. This is like lcb_get() but is useful when
|
|
280
|
+
* an item from the master cannot be retrieved.
|
|
281
|
+
*
|
|
282
|
+
* From command version 1, it is possible to select strategy of how to
|
|
283
|
+
* select the replica node. Currently three strategies are available:
|
|
284
|
+
* 1. LCB_REPLICA_FIRST: Previously accessible and default as of 2.0.8,
|
|
285
|
+
* the caller will get a reply from the first replica to successfully
|
|
286
|
+
* reply within the timeout for the operation or will receive an
|
|
287
|
+
* error.
|
|
288
|
+
*
|
|
289
|
+
* 2. LCB_REPLICA_ALL: Ask all replicas to send documents/item back.
|
|
290
|
+
*
|
|
291
|
+
* 3. LCB_REPLICA_SELECT: Select one replica by the index in the
|
|
292
|
+
* configuration starting from zero. This approach can more quickly
|
|
293
|
+
* receive all possible replies for a given topology, but it can
|
|
294
|
+
* also generate false negatives.
|
|
295
|
+
*
|
|
296
|
+
* @note
|
|
297
|
+
* applications should not assume the order of the
|
|
298
|
+
* replicas indicates more recent data is at a lower index number.
|
|
299
|
+
* It is up to the application to determine which version of a
|
|
300
|
+
* document/item it may wish to use in the case of retrieving data from a replica.
|
|
301
|
+
*
|
|
302
|
+
* ### Examples
|
|
303
|
+
*
|
|
304
|
+
* #### Get document from the second replica
|
|
305
|
+
*
|
|
306
|
+
* @code{.c}
|
|
307
|
+
* lcb_get_replica_cmd_t *get = calloc(1, sizeof(*get));
|
|
308
|
+
* get->version = 1;
|
|
309
|
+
* get->v.v1.key = "my-key";
|
|
310
|
+
* get->v.v1.nkey = strlen(get->v.v1.key);
|
|
311
|
+
* get->v.v1.strategy = LCB_REPLICA_SELECT;
|
|
312
|
+
* get->v.v1.index = 2;
|
|
313
|
+
* lcb_get_replica_cmd_st* commands[] = { get };
|
|
314
|
+
* lcb_get_replica(instance, NULL, 1, commands);
|
|
315
|
+
* @endcode
|
|
316
|
+
*
|
|
317
|
+
* #### Get document from the first available replica
|
|
318
|
+
* @code{.c}
|
|
319
|
+
* get->v.v1.strategy = LCB_REPLICA_FIRST;
|
|
320
|
+
* lcb_get_replica_cmd_st* commands[] = { get };
|
|
321
|
+
* lcb_get_replica(instance, NULL, 1, commands);
|
|
322
|
+
* @endcode
|
|
323
|
+
*
|
|
324
|
+
* #### Get document from all replicas
|
|
325
|
+
* This will will generate lcb_get_num_replicas() responses
|
|
326
|
+
*
|
|
327
|
+
* @code{.c}
|
|
328
|
+
* get->v.v1.strategy = LCB_REPLICA_ALL;
|
|
329
|
+
* lcb_get_replica_cmd_st* commands[] = { get };
|
|
330
|
+
* lcb_get_replica(instance, NULL, 1, commands);
|
|
331
|
+
* @endcode
|
|
332
|
+
*
|
|
333
|
+
*
|
|
334
|
+
* @param instance the instance used to batch the requests from
|
|
335
|
+
* @param command_cookie A cookie passed to all of the notifications
|
|
336
|
+
* from this command
|
|
337
|
+
* @param num the total number of elements in the commands array
|
|
338
|
+
* @param commands the array containing the items to get
|
|
339
|
+
* @return_rc
|
|
340
|
+
*
|
|
341
|
+
* For operation-specific error codes received in the callback, see lcb_get()
|
|
342
|
+
*
|
|
343
|
+
* @committed
|
|
344
|
+
*/
|
|
345
|
+
LIBCOUCHBASE_API
|
|
346
|
+
lcb_error_t lcb_get_replica(lcb_t instance,
|
|
347
|
+
const void *command_cookie,
|
|
348
|
+
lcb_SIZE num,
|
|
349
|
+
const lcb_get_replica_cmd_t *const *commands);
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* @brief lcb_unlock() Command structure
|
|
353
|
+
* @see lcb_GETRESPv0
|
|
354
|
+
*/
|
|
355
|
+
typedef struct {
|
|
356
|
+
const void *key;
|
|
357
|
+
lcb_SIZE nkey;
|
|
358
|
+
lcb_cas_t cas; /**< You _must_ populate this with the CAS */
|
|
359
|
+
LCB__HKFIELDS
|
|
360
|
+
} lcb_UNLOCKCMDv0;
|
|
361
|
+
|
|
362
|
+
/**@brief lcb_unlock() Wrapper structure
|
|
363
|
+
* @see lcb_UNLOCKCMDv0 */
|
|
364
|
+
typedef struct lcb_unlock_cmd_st {
|
|
365
|
+
int version;
|
|
366
|
+
union {
|
|
367
|
+
lcb_UNLOCKCMDv0 v0;
|
|
368
|
+
} v;
|
|
369
|
+
LCB_DEPR_CTORS_UNL
|
|
370
|
+
} lcb_unlock_cmd_t;
|
|
371
|
+
|
|
372
|
+
/** @brief lcb_unlock() response structure */
|
|
373
|
+
typedef struct {
|
|
374
|
+
const void *key;
|
|
375
|
+
lcb_SIZE nkey;
|
|
376
|
+
} lcb_UNLOCKRESPv0;
|
|
377
|
+
|
|
378
|
+
/**@brief lcb_unlock() wrapper response structure
|
|
379
|
+
* @see lcb_UNLOCKRESPv0 */
|
|
380
|
+
typedef struct {
|
|
381
|
+
int version;
|
|
382
|
+
union {
|
|
383
|
+
lcb_UNLOCKRESPv0 v0;
|
|
384
|
+
} v;
|
|
385
|
+
} lcb_unlock_resp_t;
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* The callback function for an unlock request.
|
|
389
|
+
*
|
|
390
|
+
* @param instance the instance performing the operation
|
|
391
|
+
* @param cookie the cookie associated with with the command
|
|
392
|
+
* @param error The status of the operation
|
|
393
|
+
* @param resp More information about the operation
|
|
394
|
+
* @committed
|
|
395
|
+
*/
|
|
396
|
+
typedef void (*lcb_unlock_callback)(lcb_t instance,
|
|
397
|
+
const void *cookie,
|
|
398
|
+
lcb_error_t error,
|
|
399
|
+
const lcb_unlock_resp_t *resp);
|
|
400
|
+
/**@committed*/
|
|
401
|
+
LIBCOUCHBASE_API
|
|
402
|
+
lcb_unlock_callback lcb_set_unlock_callback(lcb_t, lcb_unlock_callback);
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Unlock the key locked with lcb_get() with the lcb_GETCMDv0::lock option
|
|
406
|
+
*
|
|
407
|
+
* You should initialize the `key`, `nkey` and `cas` member in the
|
|
408
|
+
* lcb_item_st structure for the keys to get. All other
|
|
409
|
+
* members should be set to zero.
|
|
410
|
+
*
|
|
411
|
+
* @code{.c}
|
|
412
|
+
* lcb_unlock_cmd_t *unlock = calloc(1, sizeof(*unlock));
|
|
413
|
+
* unlock->version = 0;
|
|
414
|
+
* unlock->v.v0.key = "my-key";
|
|
415
|
+
* unlock->v.v0.nkey = strlen(unlock->v.v0.key);
|
|
416
|
+
* unlock->v.v0.cas = 0x666;
|
|
417
|
+
* lcb_unlock_cmd_t* commands[] = { unlock };
|
|
418
|
+
* lcb_unlock(instance, NULL, 1, commands);
|
|
419
|
+
* @endcode
|
|
420
|
+
*
|
|
421
|
+
* @param instance the handle to lcb
|
|
422
|
+
* @param command_cookie A cookie passed to all of the notifications
|
|
423
|
+
* from this command
|
|
424
|
+
* @param num the total number of elements in the commands array
|
|
425
|
+
* @param commands the array containing the items to unlock
|
|
426
|
+
* @return The status of the operation
|
|
427
|
+
* @return_rc
|
|
428
|
+
*
|
|
429
|
+
* Operation specific error codes:
|
|
430
|
+
* @cb_err ::LCB_ETMPFAIL if the item is not locked, or if the wrong CAS was
|
|
431
|
+
* specified
|
|
432
|
+
*
|
|
433
|
+
* @committed
|
|
434
|
+
*/
|
|
435
|
+
LIBCOUCHBASE_API
|
|
436
|
+
lcb_error_t lcb_unlock(lcb_t instance,
|
|
437
|
+
const void *command_cookie,
|
|
438
|
+
lcb_SIZE num,
|
|
439
|
+
const lcb_unlock_cmd_t *const *commands);
|
|
440
|
+
/**@}*/
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* @brief lcb_store() Command structure
|
|
444
|
+
*
|
|
445
|
+
* This structure is used to define an item to be stored on the server.
|
|
446
|
+
*/
|
|
447
|
+
typedef struct {
|
|
448
|
+
const void *key;
|
|
449
|
+
lcb_SIZE nkey;
|
|
450
|
+
const void *bytes; /**< Value to store */
|
|
451
|
+
lcb_SIZE nbytes; /**< Length of value to store */
|
|
452
|
+
lcb_U32 flags; /**< User-defined flags stored along with the item */
|
|
453
|
+
/**If present, the server will check that the item's _current_ CAS matches
|
|
454
|
+
* the value specified here. If this check fails the command will fail with
|
|
455
|
+
* an @ref LCB_KEY_EEXISTS error.
|
|
456
|
+
*
|
|
457
|
+
* @warning For @ref LCB_APPEND and @ref LCB_PREPEND, this field should be
|
|
458
|
+
* `0`. */
|
|
459
|
+
lcb_cas_t cas;
|
|
460
|
+
lcb_U8 datatype; /**< @private */
|
|
461
|
+
/**Expiration for the item. `0` means never expire.
|
|
462
|
+
* @warning for @ref LCB_APPEND and @ref LCB_PREPEND, this field should be
|
|
463
|
+
* `0`. */
|
|
464
|
+
lcb_time_t exptime;
|
|
465
|
+
lcb_storage_t operation; /**< **Mandatory**. Mutation type */
|
|
466
|
+
LCB__HKFIELDS
|
|
467
|
+
} lcb_STORECMDv0;
|
|
468
|
+
|
|
469
|
+
/** @brief Wrapper structure for lcb_STORECMDv0 */
|
|
470
|
+
typedef struct lcb_store_cmd_st {
|
|
471
|
+
int version;
|
|
472
|
+
union {
|
|
473
|
+
lcb_STORECMDv0 v0;
|
|
474
|
+
} v;
|
|
475
|
+
LCB_DEPR_CTORS_STORE
|
|
476
|
+
} lcb_store_cmd_t;
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
typedef struct {
|
|
481
|
+
const void *key; /**< Key that was stored */
|
|
482
|
+
lcb_SIZE nkey; /**< Size of key that was stored */
|
|
483
|
+
lcb_cas_t cas; /**< Cas representing current mutation */
|
|
484
|
+
/** mutation tokenen for mutation. This is used with N1QL and durability */
|
|
485
|
+
const lcb_MUTATION_TOKEN *mutation_token;
|
|
486
|
+
} lcb_STORERESPv0;
|
|
487
|
+
|
|
488
|
+
/** @brief Wrapper structure for lcb_STORERESPv0 */
|
|
489
|
+
typedef struct {
|
|
490
|
+
int version;
|
|
491
|
+
union {
|
|
492
|
+
lcb_STORERESPv0 v0;
|
|
493
|
+
} v;
|
|
494
|
+
} lcb_store_resp_t;
|
|
495
|
+
|
|
496
|
+
/**
|
|
497
|
+
* The callback function for a storage request.
|
|
498
|
+
*
|
|
499
|
+
* @param instance the instance performing the operation
|
|
500
|
+
* @param operation the operation performed
|
|
501
|
+
* @param cookie the cookie associated with with the command
|
|
502
|
+
* @param error The status of the operation
|
|
503
|
+
* @param resp More information about the item related to the store
|
|
504
|
+
* operation. (only key and nkey is valid if
|
|
505
|
+
* error != LCB_SUCCESS)
|
|
506
|
+
* @committed
|
|
507
|
+
*/
|
|
508
|
+
typedef void (*lcb_store_callback)(lcb_t instance, const void *cookie,
|
|
509
|
+
lcb_storage_t operation, lcb_error_t error, const lcb_store_resp_t *resp);
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* @brief Set the callback to be received when an item has been stored
|
|
513
|
+
* @param callback the new callback to install, or `NULL` to just query the
|
|
514
|
+
* current callback
|
|
515
|
+
* @return the previous callback
|
|
516
|
+
* @see lcb_store()
|
|
517
|
+
* @committed
|
|
518
|
+
*/
|
|
519
|
+
LIBCOUCHBASE_API
|
|
520
|
+
lcb_store_callback lcb_set_store_callback(lcb_t, lcb_store_callback callback);
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* Store an item in the cluster.
|
|
524
|
+
*
|
|
525
|
+
* You may initialize all of the members in the the
|
|
526
|
+
* lcb_item_st structure with the values you want.
|
|
527
|
+
* Values larger than `30*24*60*60` seconds (30 days) are
|
|
528
|
+
* interpreted as absolute times (from the epoch). Unused members
|
|
529
|
+
* should be set to zero.
|
|
530
|
+
*
|
|
531
|
+
* @code{.c}
|
|
532
|
+
* lcb_store_cmd_st *store = calloc(1, sizeof(*store));
|
|
533
|
+
* store->version = 0;
|
|
534
|
+
* store->v.v0.key = "my-key";
|
|
535
|
+
* store->v.v0.nkey = strlen(store->v.v0.key);
|
|
536
|
+
* store->v.v0.bytes = "{ value:666 }"
|
|
537
|
+
* store->v.v0.nbytes = strlen(store->v.v0.bytes);
|
|
538
|
+
* store->v.v0.flags = 0xdeadcafe;
|
|
539
|
+
* store->v.v0.cas = 0x1234;
|
|
540
|
+
* store->v.v0.exptime = 0x666;
|
|
541
|
+
* store->v.v0.operation = LCB_REPLACE;
|
|
542
|
+
* lcb_store_cmd_st* commands[] = { store };
|
|
543
|
+
* lcb_store(instance, NULL, 1, commands);
|
|
544
|
+
* @endcode
|
|
545
|
+
*
|
|
546
|
+
* @param instance the instance used to batch the requests from
|
|
547
|
+
* @param command_cookie A cookie passed to all of the notifications
|
|
548
|
+
* from this command
|
|
549
|
+
* @param num the total number of elements in the commands array
|
|
550
|
+
* @param commands the array containing the items to store
|
|
551
|
+
* @return_rc
|
|
552
|
+
*
|
|
553
|
+
* Operation-specific error codes include:
|
|
554
|
+
* @cb_err ::LCB_KEY_ENOENT if ::LCB_REPLACE was used and the key does not exist
|
|
555
|
+
* @cb_err ::LCB_KEY_EEXISTS if ::LCB_ADD was used and the key already exists
|
|
556
|
+
* @cb_err ::LCB_KEY_EEXISTS if the CAS was specified (for an operation other
|
|
557
|
+
* than ::LCB_ADD) and the item exists on the server with a different
|
|
558
|
+
* CAS
|
|
559
|
+
* @cb_err ::LCB_KEY_EEXISTS if the item was locked and the CAS supplied did
|
|
560
|
+
* not match the locked item's CAS (or if no CAS was supplied)
|
|
561
|
+
* @cb_err ::LCB_NOT_STORED if an ::LCB_APPEND or ::LCB_PREPEND operation was
|
|
562
|
+
* performed and the item did not exist on the server.
|
|
563
|
+
* @cb_err ::LCB_E2BIG if the size of the value exceeds the cluster per-item
|
|
564
|
+
* value limit (currently 20MB).
|
|
565
|
+
*
|
|
566
|
+
* @committed
|
|
567
|
+
*/
|
|
568
|
+
LIBCOUCHBASE_API
|
|
569
|
+
lcb_error_t lcb_store(lcb_t instance, const void *command_cookie, lcb_SIZE num,
|
|
570
|
+
const lcb_store_cmd_t *const *commands);
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
/**@brief Command structure for arithmetic operations
|
|
574
|
+
* This is contained within the @ref lcb_arithmetic_cmd_t structure */
|
|
575
|
+
typedef struct {
|
|
576
|
+
const void *key;
|
|
577
|
+
lcb_SIZE nkey;
|
|
578
|
+
|
|
579
|
+
/**Expiration time for the item. Note this is _only_ valid if #create is
|
|
580
|
+
* set to true. */
|
|
581
|
+
lcb_time_t exptime;
|
|
582
|
+
|
|
583
|
+
/**
|
|
584
|
+
* If the item does not exist on the server, set this to true to force
|
|
585
|
+
* the creation of the item. Otherwise the operation will fail with
|
|
586
|
+
* @ref LCB_KEY_ENOENT
|
|
587
|
+
*/
|
|
588
|
+
int create;
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* This number will be added to the current value on the server; if this is
|
|
592
|
+
* negative then the current value will be decremented; if positive then
|
|
593
|
+
* the current value will be incremented.
|
|
594
|
+
*
|
|
595
|
+
* On the server, the counter value is a 64 bit unsigned integer, whose
|
|
596
|
+
* maximum value is `UINT64_MAX` If an integer overflow occurs as a result
|
|
597
|
+
* of adding the `delta` value to the existing value on the server, then the
|
|
598
|
+
* value on the server will wrap around; thus for example, if the existing
|
|
599
|
+
* value was `UINT64_MAX-1` and `delta` was supplied as `2`, the new value
|
|
600
|
+
* would be `1`.
|
|
601
|
+
*/
|
|
602
|
+
lcb_S64 delta;
|
|
603
|
+
|
|
604
|
+
/**
|
|
605
|
+
* If the `create` field is true, this is the initial value for the counter
|
|
606
|
+
* iff the item does not yet exist.
|
|
607
|
+
*/
|
|
608
|
+
lcb_U64 initial;
|
|
609
|
+
LCB__HKFIELDS
|
|
610
|
+
} lcb_ARITHCMDv0;
|
|
611
|
+
|
|
612
|
+
/** @brief Wrapper structure for @ref lcb_ARITHCMDv0 */
|
|
613
|
+
typedef struct lcb_arithmetic_cmd_st {
|
|
614
|
+
int version;
|
|
615
|
+
/** @brief Wrapper union for @ref lcb_ARITHCMDv0 */
|
|
616
|
+
union { /** @brief Fill this structure */ lcb_ARITHCMDv0 v0; } v;
|
|
617
|
+
|
|
618
|
+
LCB_DEPR_CTORS_ARITH
|
|
619
|
+
} lcb_arithmetic_cmd_t;
|
|
620
|
+
|
|
621
|
+
typedef struct {
|
|
622
|
+
const void *key;
|
|
623
|
+
lcb_SIZE nkey;
|
|
624
|
+
lcb_U64 value; /**< Current numerical value of the counter */
|
|
625
|
+
lcb_cas_t cas;
|
|
626
|
+
/** mutation token for mutation. This is used with N1QL and durability */
|
|
627
|
+
const lcb_MUTATION_TOKEN *mutation_token;
|
|
628
|
+
} lcb_ARITHRESPv0;
|
|
629
|
+
|
|
630
|
+
typedef struct {
|
|
631
|
+
int version;
|
|
632
|
+
union {
|
|
633
|
+
lcb_ARITHRESPv0 v0;
|
|
634
|
+
} v;
|
|
635
|
+
} lcb_arithmetic_resp_t;
|
|
636
|
+
|
|
637
|
+
/**
|
|
638
|
+
* The callback function for an arithmetic request.
|
|
639
|
+
*
|
|
640
|
+
* @param instance the instance performing the operation
|
|
641
|
+
* @param cookie the cookie associated with with the command
|
|
642
|
+
* @param error The status of the operation
|
|
643
|
+
* @param resp More information about the operation (only key
|
|
644
|
+
* and nkey is valid if error != LCB_SUCCESS)
|
|
645
|
+
*
|
|
646
|
+
* @committed
|
|
647
|
+
*/
|
|
648
|
+
typedef void (*lcb_arithmetic_callback)
|
|
649
|
+
(lcb_t instance, const void *cookie, lcb_error_t error, const lcb_arithmetic_resp_t *resp);
|
|
650
|
+
|
|
651
|
+
/**@committed*/
|
|
652
|
+
LIBCOUCHBASE_API
|
|
653
|
+
lcb_arithmetic_callback lcb_set_arithmetic_callback(lcb_t, lcb_arithmetic_callback);
|
|
654
|
+
|
|
655
|
+
/**
|
|
656
|
+
* Perform arithmetic operation on a keys value.
|
|
657
|
+
*
|
|
658
|
+
* You should initialize the key, nkey and expiration member in
|
|
659
|
+
* the lcb_item_st structure for the keys to update.
|
|
660
|
+
* Values larger than 30*24*60*60 seconds (30 days) are
|
|
661
|
+
* interpreted as absolute times (from the epoch). All other
|
|
662
|
+
* members should be set to zero.
|
|
663
|
+
*
|
|
664
|
+
* @code{.c}
|
|
665
|
+
* lcb_arithmetic_cmd_t *arithmetic = calloc(1, sizeof(*arithmetic));
|
|
666
|
+
* arithmetic->version = 0;
|
|
667
|
+
* arithmetic->v.v0.key = "counter";
|
|
668
|
+
* arithmetic->v.v0.nkey = strlen(arithmetic->v.v0.key);
|
|
669
|
+
* arithmetic->v.v0.initial = 0x666;
|
|
670
|
+
* arithmetic->v.v0.create = 1;
|
|
671
|
+
* arithmetic->v.v0.delta = 1;
|
|
672
|
+
* lcb_arithmetic_cmd_t* commands[] = { arithmetic };
|
|
673
|
+
* lcb_arithmetic(instance, NULL, 1, commands);
|
|
674
|
+
* @endcode
|
|
675
|
+
*
|
|
676
|
+
* @param instance the handle to lcb
|
|
677
|
+
* @param command_cookie A cookie passed to all of the notifications
|
|
678
|
+
* from this command
|
|
679
|
+
* @param num the total number of elements in the commands array
|
|
680
|
+
* @param commands the array containing the items to operate on
|
|
681
|
+
* @return_rc
|
|
682
|
+
*
|
|
683
|
+
* The following operation-specific error codes may be delivered in the callback:
|
|
684
|
+
* @cb_err ::LCB_KEY_ENOENT if the key does not exist (and `create` was not
|
|
685
|
+
* specified in the command
|
|
686
|
+
* @cb_err ::LCB_DELTA_BADVAL if the existing value could not be parsed into
|
|
687
|
+
* a number.
|
|
688
|
+
* @committed
|
|
689
|
+
*/
|
|
690
|
+
LIBCOUCHBASE_API
|
|
691
|
+
lcb_error_t lcb_arithmetic(lcb_t instance,
|
|
692
|
+
const void *command_cookie,
|
|
693
|
+
lcb_SIZE num,
|
|
694
|
+
const lcb_arithmetic_cmd_t *const *commands);
|
|
695
|
+
|
|
696
|
+
typedef enum {
|
|
697
|
+
/**
|
|
698
|
+
* Only sends a command to the master. In this case the callback will
|
|
699
|
+
* be invoked only once for the master, and then another time with the
|
|
700
|
+
* NULL callback
|
|
701
|
+
*/
|
|
702
|
+
LCB_OBSERVE_MASTER_ONLY = 0x01
|
|
703
|
+
} lcb_observe_options_t;
|
|
704
|
+
|
|
705
|
+
#define LCB_OBSERVE_FIELDS_COMMON \
|
|
706
|
+
const void *key; \
|
|
707
|
+
lcb_SIZE nkey; \
|
|
708
|
+
LCB__HKFIELDS /**<@private*/
|
|
709
|
+
|
|
710
|
+
typedef struct {
|
|
711
|
+
LCB_OBSERVE_FIELDS_COMMON
|
|
712
|
+
} lcb_OBSERVECMDv0;
|
|
713
|
+
|
|
714
|
+
/**@brief lcb_observe() Command structure */
|
|
715
|
+
typedef struct {
|
|
716
|
+
LCB_OBSERVE_FIELDS_COMMON
|
|
717
|
+
lcb_observe_options_t options;
|
|
718
|
+
} lcb_OBSERVECMDv1;
|
|
719
|
+
|
|
720
|
+
/**@brief lcb_observe() Command wrapper structure
|
|
721
|
+
* @see lcb_OBSERVECMDv1 */
|
|
722
|
+
typedef struct lcb_observe_cmd_st {
|
|
723
|
+
int version;
|
|
724
|
+
union {
|
|
725
|
+
lcb_OBSERVECMDv0 v0;
|
|
726
|
+
lcb_OBSERVECMDv1 v1;
|
|
727
|
+
} v;
|
|
728
|
+
|
|
729
|
+
LCB_DEPR_CTORS_OBS
|
|
730
|
+
} lcb_observe_cmd_t;
|
|
731
|
+
|
|
732
|
+
/**
|
|
733
|
+
* @brief Response Structure for lcb_observe()
|
|
734
|
+
*/
|
|
735
|
+
typedef struct {
|
|
736
|
+
const void *key;
|
|
737
|
+
lcb_SIZE nkey;
|
|
738
|
+
lcb_cas_t cas; /**< CAS of the item on this server */
|
|
739
|
+
lcb_observe_t status; /**< Status flags */
|
|
740
|
+
int from_master; /**< zero if key came from replica */
|
|
741
|
+
lcb_time_t ttp; /**< average time to persist on this server */
|
|
742
|
+
lcb_time_t ttr; /**< average time to replicate on this server */
|
|
743
|
+
} lcb_OBSERVERESPv0;
|
|
744
|
+
|
|
745
|
+
typedef struct {
|
|
746
|
+
int version;
|
|
747
|
+
union {
|
|
748
|
+
lcb_OBSERVERESPv0 v0;
|
|
749
|
+
} v;
|
|
750
|
+
} lcb_observe_resp_t;
|
|
751
|
+
|
|
752
|
+
/**
|
|
753
|
+
* The callback function for an observe request.
|
|
754
|
+
*
|
|
755
|
+
* @param instance the instance performing the operation
|
|
756
|
+
* @param cookie the cookie associated with with the command
|
|
757
|
+
* @param error The status of the operation
|
|
758
|
+
* @param resp More information about the operation (only key
|
|
759
|
+
* and nkey is valid if error != LCB_SUCCESS)
|
|
760
|
+
*/
|
|
761
|
+
typedef void (*lcb_observe_callback)(lcb_t instance,
|
|
762
|
+
const void *cookie,
|
|
763
|
+
lcb_error_t error,
|
|
764
|
+
const lcb_observe_resp_t *resp);
|
|
765
|
+
|
|
766
|
+
LIBCOUCHBASE_API
|
|
767
|
+
lcb_observe_callback lcb_set_observe_callback(lcb_t, lcb_observe_callback);
|
|
768
|
+
|
|
769
|
+
/**
|
|
770
|
+
* Observe key
|
|
771
|
+
*
|
|
772
|
+
* @code{.c}
|
|
773
|
+
* lcb_observe_cmd_t *observe = calloc(1, sizeof(*observe));
|
|
774
|
+
* observe->version = 0;
|
|
775
|
+
* observe->v.v0.key = "my-key";
|
|
776
|
+
* observe->v.v0.nkey = strlen(observe->v.v0.key);
|
|
777
|
+
* lcb_observe_cmd_t* commands[] = { observe };
|
|
778
|
+
* lcb_observe(instance, NULL, 1, commands);
|
|
779
|
+
* @endcode
|
|
780
|
+
*
|
|
781
|
+
* @param instance the instance used to batch the requests from
|
|
782
|
+
* @param command_cookie A cookie passed to all of the notifications
|
|
783
|
+
* from this command
|
|
784
|
+
* @param num the total number of elements in the commands array
|
|
785
|
+
* @param commands the array containing the items to observe
|
|
786
|
+
* @return_rc
|
|
787
|
+
*
|
|
788
|
+
* The following operation-specific error codes may be returned in the
|
|
789
|
+
* callback:
|
|
790
|
+
*
|
|
791
|
+
* @cb_err ::LCB_UNKNOWN_COMMAND, ::LCB_NOT_SUPPORTED if the cluster does not
|
|
792
|
+
* support this operation (such as a Couchbase cluster older than
|
|
793
|
+
* version 2.0, or a memcached bucket).
|
|
794
|
+
*
|
|
795
|
+
* @committed
|
|
796
|
+
*/
|
|
797
|
+
LIBCOUCHBASE_API
|
|
798
|
+
lcb_error_t lcb_observe(lcb_t instance,
|
|
799
|
+
const void *command_cookie,
|
|
800
|
+
lcb_SIZE num,
|
|
801
|
+
const lcb_observe_cmd_t *const *commands);
|
|
802
|
+
|
|
803
|
+
/**
|
|
804
|
+
* @name Remove items from the cluster (Legacy API)
|
|
805
|
+
* Delete items from the cluster
|
|
806
|
+
* @{
|
|
807
|
+
*/
|
|
808
|
+
typedef struct {
|
|
809
|
+
const void *key;
|
|
810
|
+
lcb_SIZE nkey;
|
|
811
|
+
lcb_cas_t cas;
|
|
812
|
+
LCB__HKFIELDS /**<@private*/
|
|
813
|
+
} lcb_REMOVECMDv0;
|
|
814
|
+
|
|
815
|
+
typedef struct lcb_remove_cmd_st {
|
|
816
|
+
int version;
|
|
817
|
+
union {
|
|
818
|
+
lcb_REMOVECMDv0 v0;
|
|
819
|
+
} v;
|
|
820
|
+
LCB_DEPR_CTORS_RM
|
|
821
|
+
} lcb_remove_cmd_t;
|
|
822
|
+
|
|
823
|
+
|
|
824
|
+
typedef struct {
|
|
825
|
+
const void *key;
|
|
826
|
+
lcb_SIZE nkey;
|
|
827
|
+
lcb_cas_t cas;
|
|
828
|
+
/** mutation token for mutation. This is used with N1QL and durability */
|
|
829
|
+
const lcb_MUTATION_TOKEN *mutation_token;
|
|
830
|
+
} lcb_REMOVERESPv0;
|
|
831
|
+
|
|
832
|
+
typedef struct {
|
|
833
|
+
int version;
|
|
834
|
+
union {
|
|
835
|
+
lcb_REMOVERESPv0 v0;
|
|
836
|
+
} v;
|
|
837
|
+
} lcb_remove_resp_t;
|
|
838
|
+
|
|
839
|
+
/**
|
|
840
|
+
* The callback function for a remove request.
|
|
841
|
+
*
|
|
842
|
+
* @param instance the instance performing the operation
|
|
843
|
+
* @param cookie the cookie associated with with the command
|
|
844
|
+
* @param error The status of the operation
|
|
845
|
+
* @param resp More information about the operation
|
|
846
|
+
*/
|
|
847
|
+
typedef void (*lcb_remove_callback)(lcb_t instance, const void *cookie,
|
|
848
|
+
lcb_error_t error, const lcb_remove_resp_t *resp);
|
|
849
|
+
|
|
850
|
+
LIBCOUCHBASE_API
|
|
851
|
+
lcb_remove_callback lcb_set_remove_callback(lcb_t, lcb_remove_callback);
|
|
852
|
+
|
|
853
|
+
/**
|
|
854
|
+
* Remove a key from the cluster
|
|
855
|
+
*
|
|
856
|
+
* @code{.c}
|
|
857
|
+
* lcb_remove_cmd_t *remove = calloc(1, sizeof(*remove));
|
|
858
|
+
* remove->version = 0;
|
|
859
|
+
* remove->v.v0.key = "my-key";
|
|
860
|
+
* remove->v.v0.nkey = strlen(remove->v.v0.key);
|
|
861
|
+
* remove->v.v0.cas = 0x666;
|
|
862
|
+
* lcb_remove_cmd_t* commands[] = { remove };
|
|
863
|
+
* lcb_remove(instance, NULL, 1, commands);
|
|
864
|
+
* @endcode
|
|
865
|
+
*
|
|
866
|
+
* @param instance the instance used to batch the requests from
|
|
867
|
+
* @param command_cookie A cookie passed to all of the notifications
|
|
868
|
+
* from this command
|
|
869
|
+
* @param num the total number of elements in the commands array
|
|
870
|
+
* @param commands the array containing the items to remove
|
|
871
|
+
* @return_rc
|
|
872
|
+
*
|
|
873
|
+
* The following operation-specific error codes are returned in the callback
|
|
874
|
+
* @cb_err ::LCB_KEY_ENOENT if the key does not exist
|
|
875
|
+
* @cb_err ::LCB_KEY_EEXISTS if the CAS was specified and it does not match the
|
|
876
|
+
* CAS on the server
|
|
877
|
+
* @cb_err ::LCB_KEY_EEXISTS if the item was locked and no CAS (or an incorrect
|
|
878
|
+
* CAS) was specified.
|
|
879
|
+
*
|
|
880
|
+
* @committed
|
|
881
|
+
*/
|
|
882
|
+
LIBCOUCHBASE_API
|
|
883
|
+
lcb_error_t lcb_remove(lcb_t instance,
|
|
884
|
+
const void *command_cookie,
|
|
885
|
+
lcb_SIZE num,
|
|
886
|
+
const lcb_remove_cmd_t *const *commands);
|
|
887
|
+
|
|
888
|
+
/**
|
|
889
|
+
* @name Modify an item's expiration time
|
|
890
|
+
* Modify an item's expiration time, keeping it alive without modifying
|
|
891
|
+
* it
|
|
892
|
+
* @{
|
|
893
|
+
*/
|
|
894
|
+
typedef lcb_get_cmd_t lcb_touch_cmd_t;
|
|
895
|
+
typedef struct {
|
|
896
|
+
const void *key;
|
|
897
|
+
lcb_SIZE nkey;
|
|
898
|
+
lcb_cas_t cas;
|
|
899
|
+
} lcb_TOUCHRESPv0;
|
|
900
|
+
typedef struct {
|
|
901
|
+
int version;
|
|
902
|
+
union {
|
|
903
|
+
lcb_TOUCHRESPv0 v0;
|
|
904
|
+
} v;
|
|
905
|
+
} lcb_touch_resp_t;
|
|
906
|
+
|
|
907
|
+
/**
|
|
908
|
+
* The callback function for a touch request.
|
|
909
|
+
*
|
|
910
|
+
* @param instance the instance performing the operation
|
|
911
|
+
* @param cookie the cookie associated with with the command
|
|
912
|
+
* @param error The status of the operation
|
|
913
|
+
* @param resp More information about the operation
|
|
914
|
+
* @committed
|
|
915
|
+
*/
|
|
916
|
+
typedef void (*lcb_touch_callback)(lcb_t instance,
|
|
917
|
+
const void *cookie,
|
|
918
|
+
lcb_error_t error,
|
|
919
|
+
const lcb_touch_resp_t *resp);
|
|
920
|
+
/**@committed*/
|
|
921
|
+
LIBCOUCHBASE_API
|
|
922
|
+
lcb_touch_callback lcb_set_touch_callback(lcb_t, lcb_touch_callback);
|
|
923
|
+
|
|
924
|
+
/**
|
|
925
|
+
* Touch (set expiration time) on a number of values in the cache.
|
|
926
|
+
*
|
|
927
|
+
* Values larger than 30*24*60*60 seconds (30 days) are
|
|
928
|
+
* interpreted as absolute times (from the epoch). All other
|
|
929
|
+
* members should be set to zero.
|
|
930
|
+
*
|
|
931
|
+
* @par Example
|
|
932
|
+
* @code{.c}
|
|
933
|
+
* lcb_touch_cmd_t touch = { 0 };
|
|
934
|
+
* lcb_touch_cmd_t *cmdlist = { &touch; }
|
|
935
|
+
* touch->v.v0.key = "my-key";
|
|
936
|
+
* touch->v.v0.nkey = strlen(item->v.v0.key);
|
|
937
|
+
* touch->v.v0.exptime = 300; // 5 minutes
|
|
938
|
+
* lcb_touch(instance, NULL, 1, cmdlist);
|
|
939
|
+
* @endcode
|
|
940
|
+
*
|
|
941
|
+
* @param instance the instance used to batch the requests from
|
|
942
|
+
* @param cookie A cookie passed to all of the notifications from this command
|
|
943
|
+
* @param num the total number of elements in the commnands array
|
|
944
|
+
* @param commands the array containing the items to touch
|
|
945
|
+
* @return_rc
|
|
946
|
+
*
|
|
947
|
+
* Errors received in callbacks:
|
|
948
|
+
* @cb_err ::LCB_KEY_ENOENT if the item does not exist
|
|
949
|
+
* @cb_err ::LCB_KEY_EEXISTS if the item is locked
|
|
950
|
+
*/
|
|
951
|
+
LIBCOUCHBASE_API
|
|
952
|
+
lcb_error_t lcb_touch(lcb_t instance,
|
|
953
|
+
const void *cookie,
|
|
954
|
+
lcb_SIZE num,
|
|
955
|
+
const lcb_touch_cmd_t *const *commands);
|
|
956
|
+
|
|
957
|
+
/**
|
|
958
|
+
* @{
|
|
959
|
+
*/
|
|
960
|
+
|
|
961
|
+
/** @brief Single-key command structure for lcb_durability_poll() */
|
|
962
|
+
typedef struct {
|
|
963
|
+
const void *key;
|
|
964
|
+
size_t nkey;
|
|
965
|
+
LCB__HKFIELDS /**<@private*/
|
|
966
|
+
|
|
967
|
+
/**
|
|
968
|
+
* CAS to be checked against. If the key exists on the server
|
|
969
|
+
* with a different CAS, the error (in the response) is set to
|
|
970
|
+
* LCB_KEY_EEXISTS
|
|
971
|
+
*/
|
|
972
|
+
lcb_cas_t cas;
|
|
973
|
+
const lcb_MUTATION_TOKEN *mutation_token;
|
|
974
|
+
} lcb_DURABILITYCMDv0;
|
|
975
|
+
|
|
976
|
+
/**
|
|
977
|
+
* @brief lcb_durability_poll() Command wrapper
|
|
978
|
+
* @see lcb_DURABILITYCMDv0
|
|
979
|
+
*/
|
|
980
|
+
typedef struct lcb_durability_cmd_st {
|
|
981
|
+
int version;
|
|
982
|
+
union {
|
|
983
|
+
lcb_DURABILITYCMDv0 v0;
|
|
984
|
+
} v;
|
|
985
|
+
} lcb_durability_cmd_t;
|
|
986
|
+
|
|
987
|
+
|
|
988
|
+
/** @brief Response structure for lcb_durability_poll() */
|
|
989
|
+
typedef struct {
|
|
990
|
+
const void *key;
|
|
991
|
+
lcb_SIZE nkey;
|
|
992
|
+
/**
|
|
993
|
+
* if this entry failed, this contains the reason, e.g.
|
|
994
|
+
*
|
|
995
|
+
* - `LCB_KEY_EEXISTS`: The key exists with a different CAS than expected
|
|
996
|
+
* - `LCB_KEY_ENOENT`: The key was not found in the master cache
|
|
997
|
+
* - `LCB_ETIMEDOUT`: The key may exist, but the required servers needed
|
|
998
|
+
* took too long to respond
|
|
999
|
+
*/
|
|
1000
|
+
lcb_error_t err;
|
|
1001
|
+
|
|
1002
|
+
/** if found with a different CAS, this is the CAS */
|
|
1003
|
+
lcb_cas_t cas;
|
|
1004
|
+
|
|
1005
|
+
/**
|
|
1006
|
+
* Whether the key was persisted to the master.
|
|
1007
|
+
* For deletes, this means the key was removed from disk
|
|
1008
|
+
*/
|
|
1009
|
+
unsigned char persisted_master;
|
|
1010
|
+
|
|
1011
|
+
/**
|
|
1012
|
+
* Whether the key exists on the master. For deletes, this means
|
|
1013
|
+
* the key does not exist in cache
|
|
1014
|
+
*/
|
|
1015
|
+
unsigned char exists_master;
|
|
1016
|
+
|
|
1017
|
+
/** how many nodes (including master) this item was persisted to */
|
|
1018
|
+
unsigned char npersisted;
|
|
1019
|
+
|
|
1020
|
+
/** how many nodes (excluding master) this item was replicated to */
|
|
1021
|
+
unsigned char nreplicated;
|
|
1022
|
+
|
|
1023
|
+
/**
|
|
1024
|
+
* Total number of observe responses received for the node.
|
|
1025
|
+
* This can be used as a performance metric to determine how many
|
|
1026
|
+
* total OBSERVE probes were sent until this key was 'done'
|
|
1027
|
+
*/
|
|
1028
|
+
unsigned short nresponses;
|
|
1029
|
+
} lcb_DURABILITYRESPv0;
|
|
1030
|
+
|
|
1031
|
+
typedef struct lcb_durability_resp_st {
|
|
1032
|
+
int version;
|
|
1033
|
+
union {
|
|
1034
|
+
lcb_DURABILITYRESPv0 v0;
|
|
1035
|
+
} v;
|
|
1036
|
+
} lcb_durability_resp_t;
|
|
1037
|
+
|
|
1038
|
+
/**
|
|
1039
|
+
* Schedule a durability check on a set of keys. This callback wraps (somewhat)
|
|
1040
|
+
* the lower-level OBSERVE (lcb_observe) operations so that users may check if
|
|
1041
|
+
* a key is endured, e.g. if a key is persisted accross "at least" n number of
|
|
1042
|
+
* servers
|
|
1043
|
+
*
|
|
1044
|
+
* When each key has its criteria satisfied, the durability callback (see above)
|
|
1045
|
+
* is invoked for it.
|
|
1046
|
+
*
|
|
1047
|
+
* The callback may also be invoked when a condition is encountered that will
|
|
1048
|
+
* prevent the key from ever satisfying the criteria.
|
|
1049
|
+
*
|
|
1050
|
+
* @param instance the lcb handle
|
|
1051
|
+
* @param cookie a pointer to be received with each callback
|
|
1052
|
+
* @param options a set of options and criteria for this durability check
|
|
1053
|
+
* @param cmds a list of key specifications to check for
|
|
1054
|
+
* @param ncmds how many key specifications reside in the list
|
|
1055
|
+
* @return ::LCB_SUCCESS if scheduled successfuly
|
|
1056
|
+
* @return ::LCB_DURABILITY_ETOOMANY if the criteria specified exceeds the
|
|
1057
|
+
* current satisfiable limit (e.g. `persist_to` was set to 4, but
|
|
1058
|
+
* there are only 2 servers online in the cluster) and `cap_max`
|
|
1059
|
+
* was not specified.
|
|
1060
|
+
* @return ::LCB_DUPLICATE_COMMANDS if the same key was found more than once
|
|
1061
|
+
* in the command list
|
|
1062
|
+
*
|
|
1063
|
+
* The following error codes may be returned in the callback
|
|
1064
|
+
* @cb_err ::LCB_ETIMEDOUT if the specified interval expired before the client
|
|
1065
|
+
* could verify the durability requirements were satisfied. See
|
|
1066
|
+
* @ref LCB_CNTL_DURABILITY_TIMEOUT and lcb_DURABILITYOPTSv0::timeout
|
|
1067
|
+
* for more information on how to increase this interval.
|
|
1068
|
+
*
|
|
1069
|
+
* Example (after receiving a store callback)
|
|
1070
|
+
* @code{.c}
|
|
1071
|
+
*
|
|
1072
|
+
* lcb_durability_cmd_t cmd, cmds[1];
|
|
1073
|
+
* lcb_durability_opts_t opts;
|
|
1074
|
+
* lcb_error_t err;
|
|
1075
|
+
*
|
|
1076
|
+
* memset(&opts, 0, sizeof(opts);
|
|
1077
|
+
* memset(&cmd, 0, sizeof(cmd);
|
|
1078
|
+
* cmds[0] = &cmd;
|
|
1079
|
+
*
|
|
1080
|
+
*
|
|
1081
|
+
* opts.persist_to = 2;
|
|
1082
|
+
* opts.replicate_to = 1;
|
|
1083
|
+
*
|
|
1084
|
+
* cmd.v.v0.key = resp->v.v0.key;
|
|
1085
|
+
* cmd.v.v0.nkey = resp->v.v0.nkey;
|
|
1086
|
+
* cmd.v.v0.cas = resp->v.v0.cas;
|
|
1087
|
+
*
|
|
1088
|
+
* //schedule the command --
|
|
1089
|
+
* err = lcb_durability_poll(instance, cookie, &opts, &cmds, 1);
|
|
1090
|
+
* // error checking omitted --
|
|
1091
|
+
*
|
|
1092
|
+
* // later on, in the callback. resp is now a durability_resp_t* --
|
|
1093
|
+
* if (resp->v.v0.err == LCB_SUCCESS) {
|
|
1094
|
+
* printf("Key was endured!\n");
|
|
1095
|
+
* } else {
|
|
1096
|
+
* printf("Key did not endure in time\n");
|
|
1097
|
+
* printf("Replicated to: %u replica nodes\n", resp->v.v0.nreplicated);
|
|
1098
|
+
* printf("Persisted to: %u total nodes\n", resp->v.v0.npersisted);
|
|
1099
|
+
* printf("Did we persist to master? %u\n",
|
|
1100
|
+
* resp->v.v0.persisted_master);
|
|
1101
|
+
* printf("Does the key exist in the master's cache? %u\n",
|
|
1102
|
+
* resp->v.v0.exists_master);
|
|
1103
|
+
*
|
|
1104
|
+
* switch (resp->v.v0.err) {
|
|
1105
|
+
*
|
|
1106
|
+
* case LCB_KEY_EEXISTS:
|
|
1107
|
+
* printf("Seems like someone modified the key already...\n");
|
|
1108
|
+
* break;
|
|
1109
|
+
*
|
|
1110
|
+
* case LCB_ETIMEDOUT:
|
|
1111
|
+
* printf("Either key does not exist, or the servers are too slow\n");
|
|
1112
|
+
* printf("If persisted_master or exists_master is true, then the"
|
|
1113
|
+
* "server is simply slow.",
|
|
1114
|
+
* "otherwise, the key does not exist\n");
|
|
1115
|
+
*
|
|
1116
|
+
* break;
|
|
1117
|
+
*
|
|
1118
|
+
* default:
|
|
1119
|
+
* printf("Got other error. This is probably a network error\n");
|
|
1120
|
+
* break;
|
|
1121
|
+
* }
|
|
1122
|
+
* }
|
|
1123
|
+
* @endcode
|
|
1124
|
+
* @committed
|
|
1125
|
+
*/
|
|
1126
|
+
LIBCOUCHBASE_API
|
|
1127
|
+
lcb_error_t lcb_durability_poll(lcb_t instance,
|
|
1128
|
+
const void *cookie,
|
|
1129
|
+
const lcb_durability_opts_t *options,
|
|
1130
|
+
lcb_SIZE ncmds,
|
|
1131
|
+
const lcb_durability_cmd_t *const *cmds);
|
|
1132
|
+
|
|
1133
|
+
/**
|
|
1134
|
+
* Callback for durability status. The callback is invoked on completion
|
|
1135
|
+
* of each key (i.e. only one callback is invoked per-key).
|
|
1136
|
+
*
|
|
1137
|
+
* @param lcb_t the instance
|
|
1138
|
+
* @param cookie the user cookie
|
|
1139
|
+
* @param err an error
|
|
1140
|
+
* @param res a response containing information about the key.
|
|
1141
|
+
*/
|
|
1142
|
+
typedef void (*lcb_durability_callback)(lcb_t instance,
|
|
1143
|
+
const void *cookie,
|
|
1144
|
+
lcb_error_t err,
|
|
1145
|
+
const lcb_durability_resp_t *res);
|
|
1146
|
+
|
|
1147
|
+
LIBCOUCHBASE_API
|
|
1148
|
+
lcb_durability_callback lcb_set_durability_callback(lcb_t,
|
|
1149
|
+
lcb_durability_callback);
|
|
1150
|
+
|
|
1151
|
+
/**@}*/
|
|
1152
|
+
|
|
1153
|
+
/**
|
|
1154
|
+
* @name Retrieve statistics from the cluster
|
|
1155
|
+
* @{
|
|
1156
|
+
*/
|
|
1157
|
+
typedef struct {
|
|
1158
|
+
const void *name; /**< The name of the stats group to get */
|
|
1159
|
+
lcb_SIZE nname; /**< The number of bytes in name */
|
|
1160
|
+
} lcb_STATSCMDv0;
|
|
1161
|
+
|
|
1162
|
+
typedef struct lcb_server_stats_cmd_st {
|
|
1163
|
+
int version;
|
|
1164
|
+
union { lcb_STATSCMDv0 v0; } v;
|
|
1165
|
+
LCB_DEPR_CTORS_STATS
|
|
1166
|
+
} lcb_server_stats_cmd_t;
|
|
1167
|
+
|
|
1168
|
+
/**
|
|
1169
|
+
* @brief Per-server, per-stat response structure for lcb_server_stats()
|
|
1170
|
+
*
|
|
1171
|
+
* This structure is returned for each statistic requested by lcb_server_stats().
|
|
1172
|
+
* As both the number of servers replying to this function as well as the number
|
|
1173
|
+
* of stats per server is variable, the application should pay attention to the
|
|
1174
|
+
* following semantics:
|
|
1175
|
+
*
|
|
1176
|
+
* 1. A new statistic item is delivered with the `server_endpoint` and `key`
|
|
1177
|
+
* being non-`NULL`
|
|
1178
|
+
* 2. If a specific server encounters an error, the `key` and `bytes` fields
|
|
1179
|
+
* will be NULL.
|
|
1180
|
+
* 3. Once no more replies remain from any of the servers, a final callback
|
|
1181
|
+
* will be delivered with the `server_endpoint` field set to `NULL`.
|
|
1182
|
+
*
|
|
1183
|
+
* It is recommended to index statistics twice; first based on the
|
|
1184
|
+
* `server_endpoint` field and then on the `key` field. It is likely that the
|
|
1185
|
+
* same `key` will be received multiple times for different `server_endpoints`.
|
|
1186
|
+
*/
|
|
1187
|
+
typedef struct {
|
|
1188
|
+
const char *server_endpoint; /**< Server which the statistic is from */
|
|
1189
|
+
const void *key; /**< Statistic name */
|
|
1190
|
+
lcb_SIZE nkey;
|
|
1191
|
+
const void *bytes; /**< Statistic value */
|
|
1192
|
+
lcb_SIZE nbytes;
|
|
1193
|
+
} lcb_STATSRESPv0;
|
|
1194
|
+
|
|
1195
|
+
/** @brief Wrapper structure for lcb_STATSRESPv0 */
|
|
1196
|
+
typedef struct lcb_server_stat_resp_st {
|
|
1197
|
+
int version;
|
|
1198
|
+
union {
|
|
1199
|
+
lcb_STATSRESPv0 v0;
|
|
1200
|
+
} v;
|
|
1201
|
+
} lcb_server_stat_resp_t;
|
|
1202
|
+
|
|
1203
|
+
/**
|
|
1204
|
+
* The callback function for a stat request
|
|
1205
|
+
*
|
|
1206
|
+
* @param instance the instance performing the operation
|
|
1207
|
+
* @param cookie the cookie associated with with the command
|
|
1208
|
+
* @param error The status of the operation
|
|
1209
|
+
* @param resp response data
|
|
1210
|
+
*/
|
|
1211
|
+
typedef void (*lcb_stat_callback)(lcb_t instance,
|
|
1212
|
+
const void *cookie,
|
|
1213
|
+
lcb_error_t error,
|
|
1214
|
+
const lcb_server_stat_resp_t *resp);
|
|
1215
|
+
LIBCOUCHBASE_API
|
|
1216
|
+
lcb_stat_callback lcb_set_stat_callback(lcb_t, lcb_stat_callback);
|
|
1217
|
+
|
|
1218
|
+
/**
|
|
1219
|
+
* Request server statistics. Without a key specified the server will
|
|
1220
|
+
* respond with a "default" set of statistics information. Each piece of
|
|
1221
|
+
* statistical information is returned in its own packet (key contains
|
|
1222
|
+
* the name of the statistical item and the body contains the value in
|
|
1223
|
+
* ASCII format). The sequence of return packets is terminated with a
|
|
1224
|
+
* packet that contains no key and no value.
|
|
1225
|
+
*
|
|
1226
|
+
* The command will signal about transfer completion by passing NULL as
|
|
1227
|
+
* the server endpoint and 0 for key length. Note that key length will
|
|
1228
|
+
* be zero when some server responds with error. In latter case server
|
|
1229
|
+
* endpoint argument will indicate the server address.
|
|
1230
|
+
*
|
|
1231
|
+
* @code{.c}
|
|
1232
|
+
* lcb_server_stats_cmd_t *cmd = calloc(1, sizeof(*cmd));
|
|
1233
|
+
* cmd->version = 0;
|
|
1234
|
+
* cmd->v.v0.name = "tap";
|
|
1235
|
+
* cmd->v.v0.nname = strlen(cmd->v.v0.nname);
|
|
1236
|
+
* lcb_server_stats_cmd_t* commands[] = { cmd };
|
|
1237
|
+
* lcb_server_stats(instance, NULL, 1, commands);
|
|
1238
|
+
* @endcode
|
|
1239
|
+
*
|
|
1240
|
+
* @param instance the instance used to batch the requests from
|
|
1241
|
+
* @param command_cookie a cookie passed to all of the notifications
|
|
1242
|
+
* from this command
|
|
1243
|
+
* @param num the total number of elements in the commands array
|
|
1244
|
+
* @param commands the array containing the statistic to get
|
|
1245
|
+
* @return_rc
|
|
1246
|
+
*
|
|
1247
|
+
* The following callbacks may be returned in the callback
|
|
1248
|
+
* @cb_err ::LCB_KEY_ENOENT if key passed is unrecognized
|
|
1249
|
+
*
|
|
1250
|
+
* @todo Enumerate some useful stats here
|
|
1251
|
+
*/
|
|
1252
|
+
LIBCOUCHBASE_API
|
|
1253
|
+
lcb_error_t lcb_server_stats(lcb_t instance,
|
|
1254
|
+
const void *command_cookie,
|
|
1255
|
+
lcb_SIZE num,
|
|
1256
|
+
const lcb_server_stats_cmd_t *const *commands);
|
|
1257
|
+
|
|
1258
|
+
/**@}*/
|
|
1259
|
+
|
|
1260
|
+
|
|
1261
|
+
typedef struct lcb_server_version_cmd_st {
|
|
1262
|
+
int version;
|
|
1263
|
+
union { struct { const void *notused; } v0; } v;
|
|
1264
|
+
LCB_DEPR_CTORS_VERSIONS
|
|
1265
|
+
} lcb_server_version_cmd_t;
|
|
1266
|
+
|
|
1267
|
+
/**
|
|
1268
|
+
* @brief Response structure for lcb_server_versions()
|
|
1269
|
+
*/
|
|
1270
|
+
typedef struct lcb_server_version_resp_st {
|
|
1271
|
+
int version;
|
|
1272
|
+
union {
|
|
1273
|
+
struct {
|
|
1274
|
+
const char *server_endpoint;
|
|
1275
|
+
const char *vstring;
|
|
1276
|
+
lcb_SIZE nvstring;
|
|
1277
|
+
} v0;
|
|
1278
|
+
} v;
|
|
1279
|
+
} lcb_server_version_resp_t;
|
|
1280
|
+
|
|
1281
|
+
/**
|
|
1282
|
+
* Request server versions. The callback will be invoked with the
|
|
1283
|
+
* instance, server address, version string, and version string length.
|
|
1284
|
+
*
|
|
1285
|
+
* When all server versions have been received, the callback is invoked
|
|
1286
|
+
* with the server endpoint argument set to NULL
|
|
1287
|
+
*
|
|
1288
|
+
* @code{.c}
|
|
1289
|
+
* lcb_server_version_cmd_t *cmd = calloc(1, sizeof(*cmd));
|
|
1290
|
+
* cmd->version = 0;
|
|
1291
|
+
* lcb_server_version_cmd_t* commands[] = { cmd };
|
|
1292
|
+
* lcb_server_versions(instance, NULL, 1, commands);
|
|
1293
|
+
* @endcode
|
|
1294
|
+
*
|
|
1295
|
+
* @param instance the instance used to batch the requests from
|
|
1296
|
+
* @param command_cookie a cookie passed to all of the notifications
|
|
1297
|
+
* from this command
|
|
1298
|
+
* @param num the total number of elements in the commands array
|
|
1299
|
+
* @param commands the array containing the version commands
|
|
1300
|
+
* @return The status of the operation
|
|
1301
|
+
*
|
|
1302
|
+
* @attention
|
|
1303
|
+
* The name of this function may be slightly misleading. This does **not**
|
|
1304
|
+
* retrieve the Couchbase Server version, but only the version of its _memcached_
|
|
1305
|
+
* component. See lcb_server_stats() for a way to retrieve the server version
|
|
1306
|
+
* @committed
|
|
1307
|
+
*/
|
|
1308
|
+
LIBCOUCHBASE_API
|
|
1309
|
+
lcb_error_t lcb_server_versions(lcb_t instance,
|
|
1310
|
+
const void *command_cookie,
|
|
1311
|
+
lcb_SIZE num,
|
|
1312
|
+
const lcb_server_version_cmd_t *const *commands);
|
|
1313
|
+
|
|
1314
|
+
/**
|
|
1315
|
+
* The callback function for a version request
|
|
1316
|
+
*
|
|
1317
|
+
* @param instance the instance performing the operation
|
|
1318
|
+
* @param cookie the cookie associated with with the command
|
|
1319
|
+
* @param error The status of the operation
|
|
1320
|
+
* @param resp response data
|
|
1321
|
+
*/
|
|
1322
|
+
typedef void (*lcb_version_callback)(lcb_t instance,
|
|
1323
|
+
const void *cookie,
|
|
1324
|
+
lcb_error_t error,
|
|
1325
|
+
const lcb_server_version_resp_t *resp);
|
|
1326
|
+
|
|
1327
|
+
LIBCOUCHBASE_API
|
|
1328
|
+
lcb_version_callback lcb_set_version_callback(lcb_t, lcb_version_callback);
|
|
1329
|
+
|
|
1330
|
+
typedef struct {
|
|
1331
|
+
const char *server;
|
|
1332
|
+
lcb_verbosity_level_t level;
|
|
1333
|
+
} lcb_VERBOSITYCMDv0;
|
|
1334
|
+
|
|
1335
|
+
typedef struct lcb_verbosity_cmd_st {
|
|
1336
|
+
int version;
|
|
1337
|
+
union {
|
|
1338
|
+
lcb_VERBOSITYCMDv0 v0;
|
|
1339
|
+
} v;
|
|
1340
|
+
LCB_DEPR_CTORS_VERBOSITY
|
|
1341
|
+
} lcb_verbosity_cmd_t;
|
|
1342
|
+
|
|
1343
|
+
typedef struct lcb_verbosity_resp_st {
|
|
1344
|
+
int version;
|
|
1345
|
+
union {
|
|
1346
|
+
struct {
|
|
1347
|
+
const char *server_endpoint;
|
|
1348
|
+
} v0;
|
|
1349
|
+
} v;
|
|
1350
|
+
} lcb_verbosity_resp_t;
|
|
1351
|
+
|
|
1352
|
+
/**
|
|
1353
|
+
* Set the loglevel on the servers
|
|
1354
|
+
*
|
|
1355
|
+
* @code{.c}
|
|
1356
|
+
* lcb_verbosity_cmd_t *cmd = calloc(1, sizeof(*cmd));
|
|
1357
|
+
* cmd->version = 0;
|
|
1358
|
+
* cmd->v.v0.level = LCB_VERBOSITY_WARNING;
|
|
1359
|
+
* lcb_verbosity_cmd_t* commands[] = { cmd };
|
|
1360
|
+
* lcb_set_verbosity(instance, NULL, 1, commands);
|
|
1361
|
+
* @endcode
|
|
1362
|
+
*
|
|
1363
|
+
* @param instance the instance used to batch the requests from
|
|
1364
|
+
* @param command_cookie A cookie passed to all of the notifications
|
|
1365
|
+
* from this command
|
|
1366
|
+
* @param num the total number of elements in the commands array
|
|
1367
|
+
* @param commands the array containing the verbosity commands
|
|
1368
|
+
* @return The status of the operation.
|
|
1369
|
+
*/
|
|
1370
|
+
LIBCOUCHBASE_API
|
|
1371
|
+
lcb_error_t lcb_set_verbosity(lcb_t instance,
|
|
1372
|
+
const void *command_cookie,
|
|
1373
|
+
lcb_SIZE num,
|
|
1374
|
+
const lcb_verbosity_cmd_t *const *commands);
|
|
1375
|
+
|
|
1376
|
+
/**
|
|
1377
|
+
* The callback function for a verbosity command
|
|
1378
|
+
*
|
|
1379
|
+
* @param instance the instance performing the operation
|
|
1380
|
+
* @param cookie the cookie associated with with the command
|
|
1381
|
+
* @param error The status of the operation
|
|
1382
|
+
* @param resp response data
|
|
1383
|
+
*/
|
|
1384
|
+
typedef void (*lcb_verbosity_callback)(lcb_t instance,
|
|
1385
|
+
const void *cookie,
|
|
1386
|
+
lcb_error_t error,
|
|
1387
|
+
const lcb_verbosity_resp_t *resp);
|
|
1388
|
+
|
|
1389
|
+
LIBCOUCHBASE_API
|
|
1390
|
+
lcb_verbosity_callback lcb_set_verbosity_callback(lcb_t,
|
|
1391
|
+
lcb_verbosity_callback);
|
|
1392
|
+
typedef struct lcb_flush_cmd_st {
|
|
1393
|
+
int version;
|
|
1394
|
+
union { struct { int unused; } v0; } v;
|
|
1395
|
+
LCB_DEPR_CTORS_FLUSH
|
|
1396
|
+
} lcb_flush_cmd_t;
|
|
1397
|
+
|
|
1398
|
+
typedef struct lcb_flush_resp_st {
|
|
1399
|
+
int version;
|
|
1400
|
+
union {
|
|
1401
|
+
struct {
|
|
1402
|
+
const char *server_endpoint;
|
|
1403
|
+
} v0;
|
|
1404
|
+
} v;
|
|
1405
|
+
} lcb_flush_resp_t;
|
|
1406
|
+
|
|
1407
|
+
/**
|
|
1408
|
+
* Flush the entire couchbase cluster!
|
|
1409
|
+
*
|
|
1410
|
+
* @warning
|
|
1411
|
+
* From Couchbase Server 2.0 and higher, this command will only work on
|
|
1412
|
+
* _memcached_ buckets. To flush a Couchbase bucket, use the HTTP REST
|
|
1413
|
+
* API (See: http://docs.couchbase.com/admin/admin/REST/rest-bucket-flush.html)
|
|
1414
|
+
*
|
|
1415
|
+
* @code{.c}
|
|
1416
|
+
* lcb_flush_cmd_t *cmd = calloc(1, sizeof(*cmd));
|
|
1417
|
+
* cmd->version = 0;
|
|
1418
|
+
* lcb_flush_cmd_t* commands[] = { cmd };
|
|
1419
|
+
* lcb_flush(instance, NULL, 1, commands);
|
|
1420
|
+
* @endcode
|
|
1421
|
+
*
|
|
1422
|
+
* @param instance the instance used to batch the requests from
|
|
1423
|
+
* @param cookie A cookie passed to all of the notifications from this command
|
|
1424
|
+
* @param num the total number of elements in the commands array
|
|
1425
|
+
* @param commands the array containing the flush commands
|
|
1426
|
+
* @return_rc
|
|
1427
|
+
*
|
|
1428
|
+
* The following error codes may be returned in the callback
|
|
1429
|
+
* @cb_err ::LCB_NOT_SUPPORTED if trying to flush a Couchbase bucket.
|
|
1430
|
+
*
|
|
1431
|
+
* @committed
|
|
1432
|
+
*/
|
|
1433
|
+
LIBCOUCHBASE_API
|
|
1434
|
+
lcb_error_t lcb_flush(lcb_t instance, const void *cookie,
|
|
1435
|
+
lcb_SIZE num,
|
|
1436
|
+
const lcb_flush_cmd_t *const *commands);
|
|
1437
|
+
|
|
1438
|
+
/**
|
|
1439
|
+
* The callback function for a flush request
|
|
1440
|
+
*
|
|
1441
|
+
* @param instance the instance performing the operation
|
|
1442
|
+
* @param cookie the cookie associated with with the command
|
|
1443
|
+
* @param error The status of the operation
|
|
1444
|
+
* @param resp Response data
|
|
1445
|
+
*/
|
|
1446
|
+
typedef void (*lcb_flush_callback)(lcb_t instance,
|
|
1447
|
+
const void *cookie,
|
|
1448
|
+
lcb_error_t error,
|
|
1449
|
+
const lcb_flush_resp_t *resp);
|
|
1450
|
+
LIBCOUCHBASE_API
|
|
1451
|
+
lcb_flush_callback lcb_set_flush_callback(lcb_t, lcb_flush_callback);
|
|
1452
|
+
|
|
1453
|
+
/**
|
|
1454
|
+
* @name HTTP Operations (Legacy API)
|
|
1455
|
+
* Schedule HTTP requests to the server. This includes management
|
|
1456
|
+
* and view requests
|
|
1457
|
+
* @{
|
|
1458
|
+
*/
|
|
1459
|
+
|
|
1460
|
+
/**
|
|
1461
|
+
* @brief Structure for lcb_make_http_request()
|
|
1462
|
+
*/
|
|
1463
|
+
typedef struct {
|
|
1464
|
+
/** A view path string with optional query params (e.g. skip, limit etc.) */
|
|
1465
|
+
const char *path;
|
|
1466
|
+
lcb_SIZE npath; /**< Length of the path. Mandatory */
|
|
1467
|
+
const void *body; /**< The POST body for HTTP request */
|
|
1468
|
+
lcb_SIZE nbody; /**< Length of the body. Mandatory if `body != NULL`*/
|
|
1469
|
+
lcb_http_method_t method;
|
|
1470
|
+
/**If true the client will use lcb_http_data_callback to
|
|
1471
|
+
* notify about response and will call lcb_http_complete
|
|
1472
|
+
* with empty data eventually. */
|
|
1473
|
+
int chunked;
|
|
1474
|
+
/** The `Content-Type` header for request. For view requests
|
|
1475
|
+
* it is usually `application/json`, for management --
|
|
1476
|
+
* `application/x-www-form-urlencoded`. */
|
|
1477
|
+
const char *content_type;
|
|
1478
|
+
} lcb_HTTPCMDv0;
|
|
1479
|
+
|
|
1480
|
+
/**
|
|
1481
|
+
* v1 is used by the raw http requests. It is exactly the
|
|
1482
|
+
* same layout as v0, but it contains an extra field;
|
|
1483
|
+
* the hostname & port to use....
|
|
1484
|
+
*/
|
|
1485
|
+
typedef struct {
|
|
1486
|
+
const char *path; /**< @see lcb_HTTPCMDv0::path */
|
|
1487
|
+
lcb_SIZE npath;
|
|
1488
|
+
const void *body; /**< @see lcb_HTTPCMDv0::body */
|
|
1489
|
+
lcb_SIZE nbody;
|
|
1490
|
+
lcb_http_method_t method;
|
|
1491
|
+
int chunked;
|
|
1492
|
+
const char *content_type;
|
|
1493
|
+
const char *host;
|
|
1494
|
+
const char *username;
|
|
1495
|
+
const char *password;
|
|
1496
|
+
} lcb_HTTPCMDv1;
|
|
1497
|
+
|
|
1498
|
+
/**@brief Wrapper structure for lcb_make_http_request
|
|
1499
|
+
* @see lcb_HTTPCMDv0
|
|
1500
|
+
* @see lcb_HTTPCMDv1
|
|
1501
|
+
*/
|
|
1502
|
+
typedef struct lcb_http_cmd_st {
|
|
1503
|
+
int version;
|
|
1504
|
+
union {
|
|
1505
|
+
lcb_HTTPCMDv0 v0;
|
|
1506
|
+
lcb_HTTPCMDv1 v1;
|
|
1507
|
+
} v;
|
|
1508
|
+
LCB_DEPR_CTORS_HTTP
|
|
1509
|
+
} lcb_http_cmd_t;
|
|
1510
|
+
|
|
1511
|
+
/**
|
|
1512
|
+
* @brief Response structure received for HTTP requests
|
|
1513
|
+
*
|
|
1514
|
+
* The `headers` field is a list of key-value headers for HTTP, so it may
|
|
1515
|
+
* be traversed like so:
|
|
1516
|
+
*
|
|
1517
|
+
* @code{.c}
|
|
1518
|
+
* const char ** cur = resp->headers;
|
|
1519
|
+
* for (; *cur; cur+=2) {
|
|
1520
|
+
* printf("Header: %s:%s\n", cur[0], cur[1]);
|
|
1521
|
+
* }
|
|
1522
|
+
* @endcode
|
|
1523
|
+
*/
|
|
1524
|
+
typedef struct {
|
|
1525
|
+
lcb_http_status_t status; /**< HTTP status code */
|
|
1526
|
+
const char *path; /**< Path used for request */
|
|
1527
|
+
lcb_SIZE npath;
|
|
1528
|
+
const char *const *headers; /**< List of headers */
|
|
1529
|
+
const void *bytes; /**< Body (if any) */
|
|
1530
|
+
lcb_SIZE nbytes;
|
|
1531
|
+
} lcb_HTTPRESPv0;
|
|
1532
|
+
|
|
1533
|
+
typedef struct {
|
|
1534
|
+
int version;
|
|
1535
|
+
union {
|
|
1536
|
+
lcb_HTTPRESPv0 v0;
|
|
1537
|
+
} v;
|
|
1538
|
+
} lcb_http_resp_t;
|
|
1539
|
+
|
|
1540
|
+
/**
|
|
1541
|
+
* Callback invoked for HTTP requests
|
|
1542
|
+
* @param request Original request handle
|
|
1543
|
+
* @param instance The instance on which the request was issued
|
|
1544
|
+
* @param cookie Cookie associated with the request
|
|
1545
|
+
* @param error Error code for request. Note that more information may likely
|
|
1546
|
+
* be found within the response structure itself, specifically the
|
|
1547
|
+
* lcb_HTTPRESPv0::status and lcb_HTTPRESPv0::bytes field
|
|
1548
|
+
*
|
|
1549
|
+
* @param resp The response structure
|
|
1550
|
+
*/
|
|
1551
|
+
typedef void (*lcb_http_res_callback)(
|
|
1552
|
+
lcb_http_request_t request, lcb_t instance, const void *cookie,
|
|
1553
|
+
lcb_error_t error, const lcb_http_resp_t *resp);
|
|
1554
|
+
|
|
1555
|
+
typedef lcb_http_res_callback lcb_http_data_callback;
|
|
1556
|
+
typedef lcb_http_res_callback lcb_http_complete_callback;
|
|
1557
|
+
|
|
1558
|
+
/**
|
|
1559
|
+
* @brief Set the HTTP completion callback for HTTP request completion
|
|
1560
|
+
*
|
|
1561
|
+
* This callback will be
|
|
1562
|
+
* invoked once when the response is complete. If the lcb_HTTPCMDv0::chunked
|
|
1563
|
+
* flag was set, the lcb_HTTRESPv0::bytes will be `NULL`, otherwise it will
|
|
1564
|
+
* contain the fully buffered response.
|
|
1565
|
+
*/
|
|
1566
|
+
LIBCOUCHBASE_API
|
|
1567
|
+
lcb_http_complete_callback
|
|
1568
|
+
lcb_set_http_complete_callback(lcb_t, lcb_http_complete_callback);
|
|
1569
|
+
|
|
1570
|
+
/**
|
|
1571
|
+
* @brief Set the HTTP data stream callback for streaming responses
|
|
1572
|
+
*
|
|
1573
|
+
* This callback is invoked only if the lcb_HTTPCMDv0::chunked flag is true.
|
|
1574
|
+
* The lcb_HTTRESPv0::bytes field will on each invocation contain a new
|
|
1575
|
+
* fragment of data which should be processed by the client. When the request
|
|
1576
|
+
* is complete, the the callback specified by lcb_set_http_complete_callback()
|
|
1577
|
+
* will be invoked with the lcb_HTTPRESPv0::bytes field set to `NULL`
|
|
1578
|
+
*/
|
|
1579
|
+
LIBCOUCHBASE_API
|
|
1580
|
+
lcb_http_data_callback
|
|
1581
|
+
lcb_set_http_data_callback(lcb_t, lcb_http_data_callback);
|
|
1582
|
+
|
|
1583
|
+
/**
|
|
1584
|
+
* Execute HTTP request matching given path and yield JSON result object.
|
|
1585
|
+
* Depending on type it could be:
|
|
1586
|
+
*
|
|
1587
|
+
* - LCB_HTTP_TYPE_VIEW
|
|
1588
|
+
*
|
|
1589
|
+
* The client should setup view_complete callback in order to fetch
|
|
1590
|
+
* the result. Also he can setup view_data callback to fetch response
|
|
1591
|
+
* body in chunks as soon as possible, it will be called each time the
|
|
1592
|
+
* library receive a data chunk from socket. The empty <tt>bytes</tt>
|
|
1593
|
+
* argument (NULL pointer and zero size) is the sign of end of
|
|
1594
|
+
* response. Chunked callback allows to save memory on large datasets.
|
|
1595
|
+
*
|
|
1596
|
+
* - LCB_HTTP_TYPE_MANAGEMENT
|
|
1597
|
+
*
|
|
1598
|
+
* Management requests allow you to configure the cluster, add/remove
|
|
1599
|
+
* buckets, rebalance etc. The result will be passed to management
|
|
1600
|
+
* callbacks (data/complete).
|
|
1601
|
+
*
|
|
1602
|
+
* Fetch first 10 docs from `_design/test/_view/all` view
|
|
1603
|
+
* @code{.c}
|
|
1604
|
+
* lcb_http_request_t req;
|
|
1605
|
+
* lcb_http_cmd_t *cmd = calloc(1, sizeof(lcb_http_cmd_t));
|
|
1606
|
+
* cmd->version = 0;
|
|
1607
|
+
* cmd->v.v0.path = "_design/test/_view/all?limit=10";
|
|
1608
|
+
* cmd->v.v0.npath = strlen(item->v.v0.path);
|
|
1609
|
+
* cmd->v.v0.body = NULL;
|
|
1610
|
+
* cmd->v.v0.nbody = 0;
|
|
1611
|
+
* cmd->v.v0.method = LCB_HTTP_METHOD_GET;
|
|
1612
|
+
* cmd->v.v0.chunked = 1;
|
|
1613
|
+
* cmd->v.v0.content_type = "application/json";
|
|
1614
|
+
* lcb_error_t err = lcb_make_http_request(instance, NULL,
|
|
1615
|
+
* LCB_HTTP_TYPE_VIEW, &cmd, &req);
|
|
1616
|
+
* if (err != LCB_SUCCESS) {
|
|
1617
|
+
* .. failed to schedule request ..
|
|
1618
|
+
* @endcode
|
|
1619
|
+
*
|
|
1620
|
+
* The same as above but with POST filter
|
|
1621
|
+
* @code{.c}
|
|
1622
|
+
* lcb_http_request_t req;
|
|
1623
|
+
* lcb_http_cmd_t *cmd = calloc(1, sizeof(lcb_http_cmd_t));
|
|
1624
|
+
* cmd->version = 0;
|
|
1625
|
+
* cmd->v.v0.path = "_design/test/_view/all?limit=10";
|
|
1626
|
+
* cmd->v.v0.npath = strlen(item->v.v0.path);
|
|
1627
|
+
* cmd->v.v0.body = "{\"keys\": [\"test_1000\", \"test_10002\"]}"
|
|
1628
|
+
* cmd->v.v0.nbody = strlen(item->v.v0.body);
|
|
1629
|
+
* cmd->v.v0.method = LCB_HTTP_METHOD_POST;
|
|
1630
|
+
* cmd->v.v0.chunked = 1;
|
|
1631
|
+
* cmd->v.v0.content_type = "application/json";
|
|
1632
|
+
* lcb_error_t err = lcb_make_http_request(instance, NULL,
|
|
1633
|
+
* LCB_HTTP_TYPE_VIEW, &cmd, &req);
|
|
1634
|
+
* if (err != LCB_SUCCESS) {
|
|
1635
|
+
* .. failed to schedule request ..
|
|
1636
|
+
* @endcode
|
|
1637
|
+
*
|
|
1638
|
+
* @code{.c} Delete bucket via REST management API
|
|
1639
|
+
* lcb_http_request_t req;
|
|
1640
|
+
* lcb_http_cmd_t cmd;
|
|
1641
|
+
* cmd->version = 0;
|
|
1642
|
+
* cmd.v.v0.path = query.c_str();
|
|
1643
|
+
* cmd.v.v0.npath = query.length();
|
|
1644
|
+
* cmd.v.v0.body = NULL;
|
|
1645
|
+
* cmd.v.v0.nbody = 0;
|
|
1646
|
+
* cmd.v.v0.method = LCB_HTTP_METHOD_DELETE;
|
|
1647
|
+
* cmd.v.v0.chunked = false;
|
|
1648
|
+
* cmd.v.v0.content_type = "application/x-www-form-urlencoded";
|
|
1649
|
+
* lcb_error_t err = lcb_make_http_request(instance, NULL,
|
|
1650
|
+
* LCB_HTTP_TYPE_MANAGEMENT, &cmd, &req);
|
|
1651
|
+
* if (err != LCB_SUCCESS) {
|
|
1652
|
+
* .. failed to schedule request ..
|
|
1653
|
+
* @endcode
|
|
1654
|
+
*
|
|
1655
|
+
* @param instance The handle to lcb
|
|
1656
|
+
* @param command_cookie A cookie passed to all of the notifications
|
|
1657
|
+
* from this command
|
|
1658
|
+
* @param type The type of the request needed.
|
|
1659
|
+
* @param cmd The struct describing the command options
|
|
1660
|
+
* @param request Where to store request handle
|
|
1661
|
+
*
|
|
1662
|
+
* @return_rc
|
|
1663
|
+
*
|
|
1664
|
+
* The following errors may be received in the callback. Note that ::LCB_SUCCESS
|
|
1665
|
+
* will be delivered the callback so long as the operation received a full
|
|
1666
|
+
* HTTP response. You should inspect the individual HTTP status code to determine
|
|
1667
|
+
* if the actual HTTP request succeeded or not.
|
|
1668
|
+
*
|
|
1669
|
+
* @cb_err ::LCB_TOO_MANY_REDIRECTS if the request was redirected too many times.
|
|
1670
|
+
* @cb_err ::LCB_PROTOCOL_ERROR if the endpoint did not send back a well formed
|
|
1671
|
+
* HTTP response
|
|
1672
|
+
*
|
|
1673
|
+
* @committed
|
|
1674
|
+
*/
|
|
1675
|
+
LIBCOUCHBASE_API
|
|
1676
|
+
lcb_error_t lcb_make_http_request(lcb_t instance,
|
|
1677
|
+
const void *command_cookie,
|
|
1678
|
+
lcb_http_type_t type,
|
|
1679
|
+
const lcb_http_cmd_t *cmd,
|
|
1680
|
+
lcb_http_request_t *request);
|
|
1681
|
+
|
|
1682
|
+
/**@}*/
|
|
1683
|
+
|
|
1684
|
+
/**@}*/
|
|
1685
|
+
|
|
1686
|
+
#ifdef __cplusplus
|
|
1687
|
+
}
|
|
1688
|
+
#endif
|
|
1689
|
+
#endif
|