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
data/lib/libcouchbase.rb
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true, encoding: ASCII-8BIT
|
|
2
|
+
|
|
3
|
+
require 'libuv'
|
|
4
|
+
|
|
5
|
+
module Libcouchbase
|
|
6
|
+
require 'libcouchbase/ext/libcouchbase'
|
|
7
|
+
require 'libcouchbase/error'
|
|
8
|
+
require 'libcouchbase/callbacks'
|
|
9
|
+
require 'libcouchbase/connection'
|
|
10
|
+
|
|
11
|
+
class Results
|
|
12
|
+
include Enumerable
|
|
13
|
+
|
|
14
|
+
# streams results as they are returned from the database
|
|
15
|
+
#
|
|
16
|
+
# unlike other operations, such as each, the results are not stored
|
|
17
|
+
# for later use and are discarded as soon as possible to save memory
|
|
18
|
+
#
|
|
19
|
+
# @yieldparam [Object] value the value of the current row
|
|
20
|
+
def stream; end
|
|
21
|
+
|
|
22
|
+
attr_reader :complete_result_set, :query_in_progress
|
|
23
|
+
attr_reader :query_completed, :metadata
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
autoload :N1QL, 'libcouchbase/n1ql'
|
|
27
|
+
autoload :Bucket, 'libcouchbase/bucket'
|
|
28
|
+
autoload :QueryView, 'libcouchbase/query_view'
|
|
29
|
+
autoload :QueryN1QL, 'libcouchbase/query_n1ql'
|
|
30
|
+
autoload :QueryFullText, 'libcouchbase/query_full_text'
|
|
31
|
+
autoload :DesignDoc, 'libcouchbase/design_docs'
|
|
32
|
+
autoload :DesignDocs, 'libcouchbase/design_docs'
|
|
33
|
+
autoload :ResultsEM, 'libcouchbase/results_fiber'
|
|
34
|
+
autoload :ResultsLibuv, 'libcouchbase/results_fiber'
|
|
35
|
+
autoload :ResultsNative, 'libcouchbase/results_native'
|
|
36
|
+
end
|
|
@@ -0,0 +1,819 @@
|
|
|
1
|
+
# frozen_string_literal: true, encoding: ASCII-8BIT
|
|
2
|
+
|
|
3
|
+
require 'forwardable'
|
|
4
|
+
require 'thread'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
module Libcouchbase
|
|
8
|
+
class Bucket
|
|
9
|
+
extend Forwardable
|
|
10
|
+
|
|
11
|
+
# Finalizer done right
|
|
12
|
+
# http://www.mikeperham.com/2010/02/24/the-trouble-with-ruby-finalizers/
|
|
13
|
+
def self.finalize(connection)
|
|
14
|
+
proc { connection.destroy }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def initialize(**options)
|
|
18
|
+
@connection = Connection.new(**options)
|
|
19
|
+
connect
|
|
20
|
+
|
|
21
|
+
# This obtains the connections reactor
|
|
22
|
+
@reactor = reactor
|
|
23
|
+
@quiet = true
|
|
24
|
+
|
|
25
|
+
# clean up the connection once this object is garbage collected
|
|
26
|
+
ObjectSpace.define_finalizer( self, self.class.finalize(@connection) )
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
attr_reader :connection
|
|
31
|
+
attr_accessor :quiet
|
|
32
|
+
def_delegators :@connection, :bucket, :reactor
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# Obtain an object stored in Couchbase by given key.
|
|
36
|
+
#
|
|
37
|
+
# @param keys [String, Symbol, Array] One or several keys to fetch
|
|
38
|
+
# @param options [Hash] Options for operation.
|
|
39
|
+
# @option options [Integer] :lock time to lock this key for. Max time 30s
|
|
40
|
+
# @option options [true, false] :extended (false) If set to +true+, the
|
|
41
|
+
# operation will return a +Libcouchbase::Result+, otherwise (by default)
|
|
42
|
+
# it returns just the value.
|
|
43
|
+
# @option options [true, false] :quiet (self.quiet) If set to +true+, the
|
|
44
|
+
# operation won't raise error for missing key, it will return +nil+.
|
|
45
|
+
# Otherwise it will raise a not found error.
|
|
46
|
+
# @option options [Symbol] :format the value should be stored as.
|
|
47
|
+
# Defaults to :document
|
|
48
|
+
# @option options [true, false] :assemble_hash (false) Assemble Hash for
|
|
49
|
+
# results.
|
|
50
|
+
#
|
|
51
|
+
# @return [Object, Array, Hash, Libcouchbase::Result] the value(s)
|
|
52
|
+
#
|
|
53
|
+
# @raise [Libcouchbase::Error::KeyExists] if the key already exists on the server
|
|
54
|
+
# with a different CAS value to that provided
|
|
55
|
+
# @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
|
|
56
|
+
# @raise [Libouchbase::Error::NetworkError] if there was a communication issue
|
|
57
|
+
# @raise [Libcouchbase::Error::KeyNotFound] if the key doesn't exists
|
|
58
|
+
#
|
|
59
|
+
# @example Get single value in quiet mode (the default)
|
|
60
|
+
# c.get("foo") #=> the associated value or nil
|
|
61
|
+
#
|
|
62
|
+
# @example Use alternative hash-like syntax
|
|
63
|
+
# c["foo"] #=> the associated value or nil
|
|
64
|
+
#
|
|
65
|
+
# @example Get single value in verbose mode
|
|
66
|
+
# c.get("missing-foo", quiet: false) #=> raises Libcouchbase::Error::NotFound
|
|
67
|
+
#
|
|
68
|
+
# @example Get multiple keys
|
|
69
|
+
# c.get("foo", "bar", "baz") #=> [val1, val2, val3]
|
|
70
|
+
#
|
|
71
|
+
# @example Get multiple keys with assembing result into the Hash
|
|
72
|
+
# c.get("foo", "bar", "baz", assemble_hash: true)
|
|
73
|
+
# #=> {"foo" => val1, "bar" => val2, "baz" => val3}
|
|
74
|
+
#
|
|
75
|
+
# @example Get and lock key using default timeout
|
|
76
|
+
# c.get("foo", lock: true) # This locks for the maximum time of 30 seconds
|
|
77
|
+
#
|
|
78
|
+
# @example Get and lock key using custom timeout
|
|
79
|
+
# c.get("foo", lock: 3)
|
|
80
|
+
#
|
|
81
|
+
# @example Get and lock multiple keys using custom timeout
|
|
82
|
+
# c.get("foo", "bar", lock: 3)
|
|
83
|
+
def get(*keys, extended: false, async: false, quiet: @quiet, assemble_hash: false, **opts)
|
|
84
|
+
if keys.length == 1
|
|
85
|
+
promise = @connection.get(keys[0], **opts)
|
|
86
|
+
|
|
87
|
+
if not extended
|
|
88
|
+
promise = promise.then(proc { |resp|
|
|
89
|
+
resp.value
|
|
90
|
+
})
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
if quiet
|
|
94
|
+
promise = promise.catch { |err|
|
|
95
|
+
if err.is_a? Libcouchbase::Error::KeyNotFound
|
|
96
|
+
nil
|
|
97
|
+
else
|
|
98
|
+
::Libuv::Q.reject(@reactor, err)
|
|
99
|
+
end
|
|
100
|
+
}
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
if assemble_hash
|
|
104
|
+
promise = promise.then(proc { |val|
|
|
105
|
+
hash = defined?(::HashWithIndifferentAccess) ? ::HashWithIndifferentAccess.new : {}
|
|
106
|
+
hash[keys[0]] = val
|
|
107
|
+
hash
|
|
108
|
+
})
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
result(promise, async)
|
|
112
|
+
else
|
|
113
|
+
promises = keys.collect { |key|
|
|
114
|
+
@connection.get(key, **opts)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if quiet
|
|
118
|
+
promises.map! { |prom|
|
|
119
|
+
prom.catch { |err|
|
|
120
|
+
if err.is_a? Libcouchbase::Error::KeyNotFound
|
|
121
|
+
nil
|
|
122
|
+
else
|
|
123
|
+
::Libuv::Q.reject(@reactor, err)
|
|
124
|
+
end
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
result(@reactor.all(*promises).then(proc { |results|
|
|
130
|
+
if not extended
|
|
131
|
+
# Check if resp nil as might have been a quiet request
|
|
132
|
+
results.collect! { |resp| resp.value if resp }
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
if assemble_hash
|
|
136
|
+
hash = defined?(::HashWithIndifferentAccess) ? ::HashWithIndifferentAccess.new : {}
|
|
137
|
+
keys.each_with_index do |key, index|
|
|
138
|
+
hash[key] = results[index]
|
|
139
|
+
end
|
|
140
|
+
hash
|
|
141
|
+
else
|
|
142
|
+
results
|
|
143
|
+
end
|
|
144
|
+
}), async)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
alias_method :[], :get
|
|
148
|
+
|
|
149
|
+
# Add the item to the database, but fail if the object exists already
|
|
150
|
+
#
|
|
151
|
+
# @param key [String, Symbol] Key used to reference the value.
|
|
152
|
+
# @param value [Object] Value to be stored
|
|
153
|
+
# @param options [Hash] Options for operation.
|
|
154
|
+
# @option options [Integer] :ttl Expiry time for key in seconds
|
|
155
|
+
# @option options [Integer] :expire_in Expiry time for key in seconds
|
|
156
|
+
# @option options [Integer, Time] :expire_at Unix epoc or time at which a key
|
|
157
|
+
# should expire
|
|
158
|
+
# @option options [Symbol] :format the value should be stored as.
|
|
159
|
+
# @option options [Integer] :cas The CAS value for an object. This value is
|
|
160
|
+
# created on the server and is guaranteed to be unique for each value of
|
|
161
|
+
# a given key. This value is used to provide simple optimistic
|
|
162
|
+
# concurrency control when multiple clients or threads try to update an
|
|
163
|
+
# item simultaneously.
|
|
164
|
+
# @option options [Integer] :persist_to persist to a number of nodes before returing
|
|
165
|
+
# a result. Use -1 to persist to the maximum number of nodes
|
|
166
|
+
# @option options [Integer] :replicate_to replicate to a number of nodes before
|
|
167
|
+
# returning a result. Use -1 to replicate to the maximum number of nodes
|
|
168
|
+
#
|
|
169
|
+
# @return [Libcouchbase::Result] this includes the CAS value of the object.
|
|
170
|
+
#
|
|
171
|
+
# @raise [Libcouchbase::Error::KeyExists] if the key already exists on the server
|
|
172
|
+
# @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
|
|
173
|
+
# @raise [Libouchbase::Error::NetworkError] if there was a communication issue
|
|
174
|
+
#
|
|
175
|
+
# @example Store the key which will be expired in 2 seconds using relative TTL.
|
|
176
|
+
# c.add("foo", "bar", expire_in: 2)
|
|
177
|
+
#
|
|
178
|
+
# @example Store the key which will be expired in 2 seconds using absolute TTL.
|
|
179
|
+
# c.add(:foo, :bar, expire_at: Time.now.to_i + 2)
|
|
180
|
+
#
|
|
181
|
+
# @example Force JSON document format for value
|
|
182
|
+
# c.add("foo", {"bar" => "baz"}, format: :document)
|
|
183
|
+
#
|
|
184
|
+
# @example Set application specific flags (note that it will be OR-ed with format flags)
|
|
185
|
+
# c.add("foo", "bar", flags: 0x1000)
|
|
186
|
+
#
|
|
187
|
+
# @example Ensure that the key will be persisted at least on the one node
|
|
188
|
+
# c.add("foo", "bar", persist_to: 1)
|
|
189
|
+
def add(key, value, async: false, **opts)
|
|
190
|
+
result @connection.store(key, value, **AddDefaults.merge(opts)), async
|
|
191
|
+
end
|
|
192
|
+
AddDefaults = {operation: :add}.freeze
|
|
193
|
+
|
|
194
|
+
# Unconditionally store the object in the Couchbase
|
|
195
|
+
#
|
|
196
|
+
# @param key [String, Symbol] Key used to reference the value.
|
|
197
|
+
# @param value [Object] Value to be stored
|
|
198
|
+
# @param options [Hash] Options for operation.
|
|
199
|
+
# @option options [Integer] :ttl Expiry time for key in seconds
|
|
200
|
+
# @option options [Integer] :expire_in Expiry time for key in seconds
|
|
201
|
+
# @option options [Integer, Time] :expire_at Unix epoc or time at which a key
|
|
202
|
+
# should expire
|
|
203
|
+
# @option options [Symbol] :format the value should be stored as.
|
|
204
|
+
# @option options [Integer] :cas The CAS value for an object. This value is
|
|
205
|
+
# created on the server and is guaranteed to be unique for each value of
|
|
206
|
+
# a given key. This value is used to provide simple optimistic
|
|
207
|
+
# concurrency control when multiple clients or threads try to update an
|
|
208
|
+
# item simultaneously.
|
|
209
|
+
# @option options [Integer] :persist_to persist to a number of nodes before returing
|
|
210
|
+
# a result. Use -1 to persist to the maximum number of nodes
|
|
211
|
+
# @option options [Integer] :replicate_to replicate to a number of nodes before
|
|
212
|
+
# returning a result. Use -1 to replicate to the maximum number of nodes
|
|
213
|
+
#
|
|
214
|
+
# @return [Libcouchbase::Result] this includes the CAS value of the object.
|
|
215
|
+
#
|
|
216
|
+
# @raise [Libcouchbase::Error::KeyExists] if the key already exists on the server
|
|
217
|
+
# with a different CAS value to that provided
|
|
218
|
+
# @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
|
|
219
|
+
# @raise [Libouchbase::Error::NetworkError] if there was a communication issue
|
|
220
|
+
#
|
|
221
|
+
# @example Store the key which will be expired in 2 seconds using relative TTL.
|
|
222
|
+
# c.set("foo", "bar", expire_in: 2)
|
|
223
|
+
#
|
|
224
|
+
# @example Store the key which will be expired in 2 seconds using absolute TTL.
|
|
225
|
+
# c.set(:foo, :bar, expire_at: Time.now.to_i + 2)
|
|
226
|
+
#
|
|
227
|
+
# @example Force JSON document format for value
|
|
228
|
+
# c.set("foo", {"bar" => "baz"}, format: :document)
|
|
229
|
+
#
|
|
230
|
+
# @example Use hash-like syntax to store the value
|
|
231
|
+
# c[:foo] = {bar: :baz}
|
|
232
|
+
#
|
|
233
|
+
# @example Set application specific flags (note that it will be OR-ed with format flags)
|
|
234
|
+
# c.set("foo", "bar", flags: 0x1000)
|
|
235
|
+
#
|
|
236
|
+
# @example Perform optimistic locking by specifying last known CAS version
|
|
237
|
+
# c.set("foo", "bar", cas: 8835713818674332672)
|
|
238
|
+
#
|
|
239
|
+
# @example Ensure that the key will be persisted at least on the one node
|
|
240
|
+
# c.set("foo", "bar", persist_to: 1)
|
|
241
|
+
def set(key, value, async: false, **opts)
|
|
242
|
+
# default operation is set
|
|
243
|
+
result @connection.store(key, value, **opts), async
|
|
244
|
+
end
|
|
245
|
+
alias_method :[]=, :set
|
|
246
|
+
|
|
247
|
+
# Replace the existing object in the database
|
|
248
|
+
#
|
|
249
|
+
# @param key [String, Symbol] Key used to reference the value.
|
|
250
|
+
# @param value [Object] Value to be stored
|
|
251
|
+
# @param options [Hash] Options for operation.
|
|
252
|
+
# @option options [Integer] :ttl Expiry time for key in seconds
|
|
253
|
+
# @option options [Integer] :expire_in Expiry time for key in seconds
|
|
254
|
+
# @option options [Integer, Time] :expire_at Unix epoc or time at which a key
|
|
255
|
+
# should expire
|
|
256
|
+
# @option options [Symbol] :format the value should be stored as.
|
|
257
|
+
# @option options [Integer] :cas The CAS value for an object. This value is
|
|
258
|
+
# created on the server and is guaranteed to be unique for each value of
|
|
259
|
+
# a given key. This value is used to provide simple optimistic
|
|
260
|
+
# concurrency control when multiple clients or threads try to update an
|
|
261
|
+
# item simultaneously.
|
|
262
|
+
# @option options [Integer] :persist_to persist to a number of nodes before returing
|
|
263
|
+
# a result. Use -1 to persist to the maximum number of nodes
|
|
264
|
+
# @option options [Integer] :replicate_to replicate to a number of nodes before
|
|
265
|
+
# returning a result. Use -1 to replicate to the maximum number of nodes
|
|
266
|
+
#
|
|
267
|
+
# @return [Libcouchbase::Result] this includes the CAS value of the object.
|
|
268
|
+
#
|
|
269
|
+
# @raise [Libcouchbase::Error::KeyExists] if the key already exists on the server
|
|
270
|
+
# with a different CAS value to that provided
|
|
271
|
+
# @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
|
|
272
|
+
# @raise [Libouchbase::Error::NetworkError] if there was a communication issue
|
|
273
|
+
# @raise [Libcouchbase::Error::KeyNotFound] if the key doesn't exists
|
|
274
|
+
#
|
|
275
|
+
# @example Store the key which will be expired in 2 seconds using relative TTL.
|
|
276
|
+
# c.replace("foo", "bar", expire_in: 2)
|
|
277
|
+
#
|
|
278
|
+
# @example Store the key which will be expired in 2 seconds using absolute TTL.
|
|
279
|
+
# c.replace(:foo, :bar, expire_at: Time.now.to_i + 2)
|
|
280
|
+
#
|
|
281
|
+
# @example Force JSON document format for value
|
|
282
|
+
# c.replace("foo", {"bar" => "baz"}, format: :document)
|
|
283
|
+
#
|
|
284
|
+
# @example Set application specific flags (note that it will be OR-ed with format flags)
|
|
285
|
+
# c.replace("foo", "bar", flags: 0x1000)
|
|
286
|
+
#
|
|
287
|
+
# @example Ensure that the key will be persisted at least on the one node
|
|
288
|
+
# c.replace("foo", "bar", persist_to: 1)
|
|
289
|
+
def replace(key, value, async: false, **opts)
|
|
290
|
+
result @connection.store(key, value, **ReplaceDefaults.merge(opts)), async
|
|
291
|
+
end
|
|
292
|
+
ReplaceDefaults = {operation: :replace}.freeze
|
|
293
|
+
|
|
294
|
+
# Append this object to the existing object
|
|
295
|
+
#
|
|
296
|
+
# @note This operation is kind of data-aware from server point of view.
|
|
297
|
+
# This mean that the server treats value as binary stream and just
|
|
298
|
+
# perform concatenation, therefore it won't work with +:marshal+ and
|
|
299
|
+
# +:document+ formats, because of lack of knowledge how to merge values
|
|
300
|
+
# in these formats.
|
|
301
|
+
#
|
|
302
|
+
# @param key [String, Symbol] Key used to reference the value.
|
|
303
|
+
# @param value [Object] Value to be appended
|
|
304
|
+
# @param options [Hash] Options for operation.
|
|
305
|
+
# @option options [Integer] :cas The CAS value for an object. This value is
|
|
306
|
+
# created on the server and is guaranteed to be unique for each value of
|
|
307
|
+
# a given key. This value is used to provide simple optimistic
|
|
308
|
+
# concurrency control when multiple clients or threads try to update an
|
|
309
|
+
# item simultaneously.
|
|
310
|
+
# @option options [Integer] :persist_to persist to a number of nodes before returing
|
|
311
|
+
# a result. Use -1 to persist to the maximum number of nodes
|
|
312
|
+
# @option options [Integer] :replicate_to replicate to a number of nodes before
|
|
313
|
+
# returning a result. Use -1 to replicate to the maximum number of nodes
|
|
314
|
+
#
|
|
315
|
+
# @return [Libcouchbase::Result] this includes the CAS value of the object.
|
|
316
|
+
#
|
|
317
|
+
# @raise [Libcouchbase::Error::KeyExists] if the key already exists on the server
|
|
318
|
+
# with a different CAS value to that provided
|
|
319
|
+
# @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
|
|
320
|
+
# @raise [Libouchbase::Error::NetworkError] if there was a communication issue
|
|
321
|
+
# @raise [Libcouchbase::Error::KeyNotFound] if the key doesn't exists
|
|
322
|
+
#
|
|
323
|
+
# @example Simple append
|
|
324
|
+
# c.set(:foo, "aaa", format: :plain)
|
|
325
|
+
# c.append(:foo, "bbb")
|
|
326
|
+
# c.get("foo") #=> "aaabbb"
|
|
327
|
+
#
|
|
328
|
+
# @example Using optimistic locking. The operation will fail on CAS mismatch
|
|
329
|
+
# resp = c.set("foo", "aaa", format: :plain)
|
|
330
|
+
# c.append("foo", "bbb", cas: resp.cas)
|
|
331
|
+
#
|
|
332
|
+
# @example Ensure that the key will be persisted at least on the one node
|
|
333
|
+
# c.append("foo", "bar", persist_to: 1)
|
|
334
|
+
def append(key, value, async: false, **opts)
|
|
335
|
+
result @connection.store(key, value, **AppendDefaults.merge(opts)), async
|
|
336
|
+
end
|
|
337
|
+
AppendDefaults = {operation: :append}.freeze
|
|
338
|
+
|
|
339
|
+
# Prepend this object to the existing object
|
|
340
|
+
#
|
|
341
|
+
# @note This operation is kind of data-aware from server point of view.
|
|
342
|
+
# This mean that the server treats value as binary stream and just
|
|
343
|
+
# perform concatenation, therefore it won't work with +:marshal+ and
|
|
344
|
+
# +:document+ formats, because of lack of knowledge how to merge values
|
|
345
|
+
# in these formats.
|
|
346
|
+
#
|
|
347
|
+
# @param key [String, Symbol] Key used to reference the value.
|
|
348
|
+
# @param value [Object] Value to be appended
|
|
349
|
+
# @param options [Hash] Options for operation.
|
|
350
|
+
# @option options [Integer] :cas The CAS value for an object. This value is
|
|
351
|
+
# created on the server and is guaranteed to be unique for each value of
|
|
352
|
+
# a given key. This value is used to provide simple optimistic
|
|
353
|
+
# concurrency control when multiple clients or threads try to update an
|
|
354
|
+
# item simultaneously.
|
|
355
|
+
# @option options [Integer] :persist_to persist to a number of nodes before returing
|
|
356
|
+
# a result. Use -1 to persist to the maximum number of nodes
|
|
357
|
+
# @option options [Integer] :replicate_to replicate to a number of nodes before
|
|
358
|
+
# returning a result. Use -1 to replicate to the maximum number of nodes
|
|
359
|
+
#
|
|
360
|
+
# @return [Libcouchbase::Result] this includes the CAS value of the object.
|
|
361
|
+
#
|
|
362
|
+
# @raise [Libcouchbase::Error::KeyExists] if the key already exists on the server
|
|
363
|
+
# with a different CAS value to that provided
|
|
364
|
+
# @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
|
|
365
|
+
# @raise [Libouchbase::Error::NetworkError] if there was a communication issue
|
|
366
|
+
# @raise [Libcouchbase::Error::KeyNotFound] if the key doesn't exists
|
|
367
|
+
#
|
|
368
|
+
# @example Simple prepend
|
|
369
|
+
# c.set(:foo, "aaa", format: :plain)
|
|
370
|
+
# c.prepend(:foo, "bbb")
|
|
371
|
+
# c.get("foo") #=> "bbbaaa"
|
|
372
|
+
#
|
|
373
|
+
# @example Using optimistic locking. The operation will fail on CAS mismatch
|
|
374
|
+
# resp = c.set("foo", "aaa", format: :plain)
|
|
375
|
+
# c.prepend("foo", "bbb", cas: resp.cas)
|
|
376
|
+
#
|
|
377
|
+
# @example Ensure that the key will be persisted at least on the one node
|
|
378
|
+
# c.prepend("foo", "bar", persist_to: 1)
|
|
379
|
+
def prepend(key, value, async: false, **opts)
|
|
380
|
+
result @connection.store(key, value, **PrependDefaults.merge(opts)), async
|
|
381
|
+
end
|
|
382
|
+
PrependDefaults = {operation: :prepend}.freeze
|
|
383
|
+
|
|
384
|
+
# Increment the value of an existing numeric key
|
|
385
|
+
#
|
|
386
|
+
# The increment method allow you to increase or decrease a given stored
|
|
387
|
+
# integer value. Updating the value of a key if it can be parsed to an integer.
|
|
388
|
+
# The update operation occurs on the server and is provided at the protocol
|
|
389
|
+
# level. This simplifies what would otherwise be a two-stage get and set
|
|
390
|
+
# operation.
|
|
391
|
+
#
|
|
392
|
+
# @param key [String, Symbol] Key used to reference the value.
|
|
393
|
+
# @param by [Integer] Integer (up to 64 bits) value to increment or decrement
|
|
394
|
+
# @param options [Hash] Options for operation.
|
|
395
|
+
# @option options [true, false] :create (false) If set to +true+, it will
|
|
396
|
+
# initialize the key with zero value and zero flags (use +:initial+
|
|
397
|
+
# option to set another initial value). Note: it won't increment the
|
|
398
|
+
# missing value.
|
|
399
|
+
# @option options [Integer] :initial (0) Integer (up to 64 bits) value for
|
|
400
|
+
# missing key initialization. This option imply +:create+ option is +true+
|
|
401
|
+
# @option options [Integer] :ttl Expiry time for key in seconds
|
|
402
|
+
# @option options [Integer] :expire_in Expiry time for key in seconds
|
|
403
|
+
# @option options [Integer, Time] :expire_at Unix epoc or time at which a key
|
|
404
|
+
# should expire
|
|
405
|
+
# @option options [true, false] :extended (false) If set to +true+, the
|
|
406
|
+
# operation will return a +Libcouchbase::Result+, otherwise (by default)
|
|
407
|
+
# it returns just the value.
|
|
408
|
+
#
|
|
409
|
+
# @return [Integer] the actual value of the key.
|
|
410
|
+
#
|
|
411
|
+
# @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
|
|
412
|
+
# @raise [Libouchbase::Error::NetworkError] if there was a communication issue
|
|
413
|
+
# @raise [Libcouchbase::Error::KeyNotFound] if the key doesn't exists
|
|
414
|
+
# @raise [Libcouchbase::Error::DeltaBadval] if the key contains non-numeric value
|
|
415
|
+
#
|
|
416
|
+
# @example Increment key by one
|
|
417
|
+
# c.incr(:foo)
|
|
418
|
+
#
|
|
419
|
+
# @example Increment key by 50
|
|
420
|
+
# c.incr("foo", 50)
|
|
421
|
+
#
|
|
422
|
+
# @example Increment key by one <b>OR</b> initialize with zero
|
|
423
|
+
# c.incr("foo", create: true) #=> will return old+1 or 0
|
|
424
|
+
#
|
|
425
|
+
# @example Increment key by one <b>OR</b> initialize with three
|
|
426
|
+
# c.incr("foo", 50, initial: 3) #=> will return old+50 or 3
|
|
427
|
+
#
|
|
428
|
+
# @example Increment key and get its CAS value
|
|
429
|
+
# resp = c.incr("foo", :extended => true)
|
|
430
|
+
# resp.cas #=> 12345
|
|
431
|
+
# resp.value #=> 2
|
|
432
|
+
def incr(key, by = 1, create: false, extended: false, async: false, **opts)
|
|
433
|
+
opts[:delta] ||= by
|
|
434
|
+
opts[:initial] = 0 if create
|
|
435
|
+
promise = @connection.counter(key, **opts)
|
|
436
|
+
if not extended
|
|
437
|
+
promise = promise.then { |resp| resp.value }
|
|
438
|
+
end
|
|
439
|
+
result promise, async
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
# Decrement the value of an existing numeric key
|
|
443
|
+
#
|
|
444
|
+
# Helper method, see incr
|
|
445
|
+
def decr(key, by = 1, **opts)
|
|
446
|
+
incr(key, -by, **opts)
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
# Delete the specified key
|
|
450
|
+
#
|
|
451
|
+
# @param key [String, Symbol] Key used to reference the value.
|
|
452
|
+
# @param options [Hash] Options for operation.
|
|
453
|
+
# @option options [Integer] :cas The CAS value for an object. This value is
|
|
454
|
+
# created on the server and is guaranteed to be unique for each value of
|
|
455
|
+
# a given key. This value is used to provide simple optimistic
|
|
456
|
+
# concurrency control when multiple clients or threads try to modify an
|
|
457
|
+
# item simultaneously.
|
|
458
|
+
# @option options [true, false] :quiet (self.quiet) If set to +true+, the
|
|
459
|
+
# operation won't raise error for missing key, it will return +nil+.
|
|
460
|
+
# Otherwise it will raise error.
|
|
461
|
+
#
|
|
462
|
+
# @return [true, false] the result of the operation.
|
|
463
|
+
#
|
|
464
|
+
# @raise [Libcouchbase::Error::KeyExists] if the key already exists on the server
|
|
465
|
+
# with a different CAS value to that provided
|
|
466
|
+
# @raise [Libouchbase::Error::Timedout] if timeout interval for observe exceeds
|
|
467
|
+
# @raise [Libouchbase::Error::NetworkError] if there was a communication issue
|
|
468
|
+
# @raise [Libcouchbase::Error::KeyNotFound] if the key doesn't exists
|
|
469
|
+
#
|
|
470
|
+
# @example Delete the key in quiet mode (default)
|
|
471
|
+
# c.set("foo", "bar")
|
|
472
|
+
# c.delete("foo") #=> true
|
|
473
|
+
# c.delete("foo") #=> false
|
|
474
|
+
#
|
|
475
|
+
# @example Delete the key verbosely
|
|
476
|
+
# c.set("foo", "bar")
|
|
477
|
+
# c.delete("foo", quiet: false) #=> true
|
|
478
|
+
# c.delete("foo", quiet: true) #=> nil (default behaviour)
|
|
479
|
+
# c.delete("foo", quiet: false) #=> will raise Libcouchbase::Error::KeyNotFound
|
|
480
|
+
#
|
|
481
|
+
# @example Delete the key with version check
|
|
482
|
+
# res = c.set("foo", "bar") #=> #<struct Libcouchbase::Response callback=:callback_set, key="foo", cas=1975457268957184, value="bar", metadata={:format=>:document, :flags=>0}>
|
|
483
|
+
# c.delete("foo", cas: 123456) #=> will raise Libcouchbase::Error::KeyExists
|
|
484
|
+
# c.delete("foo", cas: res.cas) #=> true
|
|
485
|
+
def delete(key, async: false, quiet: @quiet, **opts)
|
|
486
|
+
promise = @connection.remove(key, **opts).then { true }
|
|
487
|
+
if quiet
|
|
488
|
+
promise = promise.catch { |error|
|
|
489
|
+
if error.is_a? Libcouchbase::Error::KeyNotFound
|
|
490
|
+
false
|
|
491
|
+
else
|
|
492
|
+
::Libuv::Q.reject(@reactor, error)
|
|
493
|
+
end
|
|
494
|
+
}
|
|
495
|
+
end
|
|
496
|
+
result promise, async
|
|
497
|
+
end
|
|
498
|
+
|
|
499
|
+
# Delete contents of the bucket
|
|
500
|
+
#
|
|
501
|
+
# @see http://docs.couchbase.com/admin/admin/REST/rest-bucket-flush.html
|
|
502
|
+
#
|
|
503
|
+
# @raise [Libcouchbase::Error::HttpError] in case of an error is
|
|
504
|
+
# encountered.
|
|
505
|
+
#
|
|
506
|
+
# @return [Libcouchbase::Response]
|
|
507
|
+
#
|
|
508
|
+
# @example Simple flush the bucket
|
|
509
|
+
# c.flush
|
|
510
|
+
def flush(async: false)
|
|
511
|
+
result @connection.flush, async
|
|
512
|
+
end
|
|
513
|
+
|
|
514
|
+
# Touch a key, changing its CAS and optionally setting a timeout
|
|
515
|
+
def touch(async: false, **opts)
|
|
516
|
+
result @connection.touch(**opts), async
|
|
517
|
+
end
|
|
518
|
+
|
|
519
|
+
# Fetch design docs stored in current bucket
|
|
520
|
+
#
|
|
521
|
+
# @return [Libcouchbase::DesignDocs]
|
|
522
|
+
def design_docs(**opts)
|
|
523
|
+
DesignDocs.new(self, @connection, method(:result), **opts)
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
# Returns an enumerable for the results in a view.
|
|
527
|
+
#
|
|
528
|
+
# Results are lazily loaded when an operation is performed on the enum
|
|
529
|
+
#
|
|
530
|
+
# @return [Libcouchbase::Results]
|
|
531
|
+
def view(design, view, include_docs: true, is_spatial: false, **opts, &row_modifier)
|
|
532
|
+
view = @connection.query_view(design, view, **ViewDefaults.merge(opts))
|
|
533
|
+
view.include_docs = include_docs
|
|
534
|
+
view.is_spatial = is_spatial
|
|
535
|
+
|
|
536
|
+
current = ::Libuv::Reactor.current
|
|
537
|
+
|
|
538
|
+
if current && current.running?
|
|
539
|
+
ResultsLibuv.new(view, current, &row_modifier)
|
|
540
|
+
elsif Object.const_defined?(:EventMachine) && EM.reactor_thread?
|
|
541
|
+
ResultsEM.new(view, &row_modifier)
|
|
542
|
+
else
|
|
543
|
+
ResultsNative.new(view, &row_modifier)
|
|
544
|
+
end
|
|
545
|
+
end
|
|
546
|
+
ViewDefaults = {
|
|
547
|
+
on_error: :stop,
|
|
548
|
+
stale: false
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
# Returns an enumerable for the results in a full text search.
|
|
552
|
+
#
|
|
553
|
+
# Results are lazily loaded when an operation is performed on the enum
|
|
554
|
+
#
|
|
555
|
+
# @return [Libcouchbase::Results]
|
|
556
|
+
def full_text_search(index, query, **opts, &row_modifier)
|
|
557
|
+
if query.is_a? Hash
|
|
558
|
+
opts[:query] = query
|
|
559
|
+
else
|
|
560
|
+
opts[:query] = {query: query}
|
|
561
|
+
end
|
|
562
|
+
fts = @connection.full_text_search(index, **FtsDefaults.merge(opts))
|
|
563
|
+
|
|
564
|
+
current = ::Libuv::Reactor.current
|
|
565
|
+
if current && current.running?
|
|
566
|
+
ResultsLibuv.new(fts, current, &row_modifier)
|
|
567
|
+
elsif Object.const_defined?(:EventMachine) && EM.reactor_thread?
|
|
568
|
+
ResultsEM.new(fts, &row_modifier)
|
|
569
|
+
else
|
|
570
|
+
ResultsNative.new(fts, &row_modifier)
|
|
571
|
+
end
|
|
572
|
+
end
|
|
573
|
+
FtsDefaults = {
|
|
574
|
+
include_docs: true,
|
|
575
|
+
size: 10000, # Max result size
|
|
576
|
+
from: 0,
|
|
577
|
+
explain: false
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
# Returns an n1ql query builder.
|
|
581
|
+
#
|
|
582
|
+
# @return [Libcouchbase::N1QL]
|
|
583
|
+
def n1ql(**options)
|
|
584
|
+
N1QL.new(self, **options)
|
|
585
|
+
end
|
|
586
|
+
|
|
587
|
+
# Update or create design doc with supplied views
|
|
588
|
+
#
|
|
589
|
+
# @see http://docs.couchbase.com/admin/admin/REST/rest-ddocs-create.html
|
|
590
|
+
#
|
|
591
|
+
# @param [Hash, IO, String] data The source object containing JSON
|
|
592
|
+
# encoded design document.
|
|
593
|
+
def save_design_doc(data, id = nil, async: false)
|
|
594
|
+
attrs = case data
|
|
595
|
+
when String
|
|
596
|
+
JSON.parse(data, Connection::DECODE_OPTIONS)
|
|
597
|
+
when IO
|
|
598
|
+
JSON.parse(data.read, Connection::DECODE_OPTIONS)
|
|
599
|
+
when Hash
|
|
600
|
+
data
|
|
601
|
+
else
|
|
602
|
+
raise ArgumentError, "Document should be Hash, String or IO instance"
|
|
603
|
+
end
|
|
604
|
+
attrs[:language] ||= :javascript
|
|
605
|
+
|
|
606
|
+
id ||= attrs.delete(:_id)
|
|
607
|
+
id = id.sub(/^_design\//, '')
|
|
608
|
+
|
|
609
|
+
result @connection.http("/_design/#{id}",
|
|
610
|
+
method: :put,
|
|
611
|
+
body: attrs,
|
|
612
|
+
type: :view
|
|
613
|
+
), async
|
|
614
|
+
end
|
|
615
|
+
|
|
616
|
+
# Delete design doc with given id and optional revision.
|
|
617
|
+
#
|
|
618
|
+
# @see http://docs.couchbase.com/admin/admin/REST/rest-ddocs-delete.html
|
|
619
|
+
#
|
|
620
|
+
# @param [String, Symbol] id ID of the design doc
|
|
621
|
+
# @param [String] rev Optional revision
|
|
622
|
+
def delete_design_doc(id, rev = nil, async: false)
|
|
623
|
+
id = id.sub(/^_design\//, '')
|
|
624
|
+
rev = "?rev=#{rev}" if rev
|
|
625
|
+
result @connection.http("/_design/#{id}#{rev}", method: :delete, type: :view), async
|
|
626
|
+
end
|
|
627
|
+
|
|
628
|
+
# Compare and swap value.
|
|
629
|
+
#
|
|
630
|
+
# Reads a key's value from the server and yields it to a block. Replaces
|
|
631
|
+
# the key's value with the result of the block as long as the key hasn't
|
|
632
|
+
# been updated in the meantime, otherwise raises
|
|
633
|
+
# {Libcouchbase::Error::KeyExists}.
|
|
634
|
+
#
|
|
635
|
+
# Setting the +:retry+ option to a positive number will cause this method
|
|
636
|
+
# to rescue the {Libcouchbase::Error::KeyExists} error that happens when
|
|
637
|
+
# an update collision is detected, and automatically get a fresh copy
|
|
638
|
+
# of the value and retry the block. This will repeat as long as there
|
|
639
|
+
# continues to be conflicts, up to the maximum number of retries specified.
|
|
640
|
+
#
|
|
641
|
+
# @param [String, Symbol] key
|
|
642
|
+
#
|
|
643
|
+
# @param [Hash] options the options for "swap" part
|
|
644
|
+
# @option options [Fixnum] :retry (0) maximum number of times to autmatically retry upon update collision
|
|
645
|
+
#
|
|
646
|
+
# @yieldparam [Object] value existing value
|
|
647
|
+
# @yieldreturn [Object] new value.
|
|
648
|
+
#
|
|
649
|
+
# @raise [Couchbase::Error::KeyExists] if the key was updated before the the
|
|
650
|
+
# code in block has been completed (the CAS value has been changed).
|
|
651
|
+
# @raise [ArgumentError] if the block is missing
|
|
652
|
+
#
|
|
653
|
+
# @example Implement append to JSON encoded value
|
|
654
|
+
#
|
|
655
|
+
# c.set(:foo, {bar: 1})
|
|
656
|
+
# c.cas(:foo) do |val|
|
|
657
|
+
# val[:baz] = 2
|
|
658
|
+
# val
|
|
659
|
+
# end
|
|
660
|
+
# c.get(:foo) #=> {bar: 1, baz: 2}
|
|
661
|
+
#
|
|
662
|
+
# @return [Libcouchbase::Response] the transaction details including the new CAS
|
|
663
|
+
def compare_and_swap(key, **opts)
|
|
664
|
+
retries = opts.delete(:retry) || 0
|
|
665
|
+
begin
|
|
666
|
+
current = result(@connection.get(key))
|
|
667
|
+
new_value = yield current.value, opts
|
|
668
|
+
opts[:cas] = current.cas
|
|
669
|
+
|
|
670
|
+
set(key, new_value, **opts)
|
|
671
|
+
rescue Libcouchbase::Error::KeyExists
|
|
672
|
+
retries -= 1
|
|
673
|
+
retry if retries >= 0
|
|
674
|
+
raise
|
|
675
|
+
end
|
|
676
|
+
end
|
|
677
|
+
alias_method :cas, :compare_and_swap
|
|
678
|
+
|
|
679
|
+
# The numbers of the replicas for each node in the cluster
|
|
680
|
+
# @return [Integer]
|
|
681
|
+
def get_num_replicas
|
|
682
|
+
result @connection.get_num_replicas
|
|
683
|
+
end
|
|
684
|
+
|
|
685
|
+
# The numbers of nodes in the cluster
|
|
686
|
+
# @return [Integer]
|
|
687
|
+
def get_num_nodes
|
|
688
|
+
result @connection.get_num_nodes
|
|
689
|
+
end
|
|
690
|
+
|
|
691
|
+
# Waits for all the async operations to complete and returns the results
|
|
692
|
+
#
|
|
693
|
+
# @return [Array]
|
|
694
|
+
def wait_results(*results)
|
|
695
|
+
result ::Libuv::Q.all(@reactor, *results.flatten)
|
|
696
|
+
end
|
|
697
|
+
|
|
698
|
+
|
|
699
|
+
protected
|
|
700
|
+
|
|
701
|
+
|
|
702
|
+
def result(promise, async = false)
|
|
703
|
+
return promise if async
|
|
704
|
+
|
|
705
|
+
current = ::Libuv::Reactor.current
|
|
706
|
+
if current && current.running?
|
|
707
|
+
co promise
|
|
708
|
+
elsif Object.const_defined?(:EventMachine) && EM.reactor_thread?
|
|
709
|
+
# Assume this is being run in em-synchrony
|
|
710
|
+
f = Fiber.current
|
|
711
|
+
error = nil
|
|
712
|
+
response = nil
|
|
713
|
+
|
|
714
|
+
@connection.reactor.next_tick do
|
|
715
|
+
begin
|
|
716
|
+
response = co(promise)
|
|
717
|
+
rescue => e
|
|
718
|
+
error = e
|
|
719
|
+
end
|
|
720
|
+
|
|
721
|
+
EM.next_tick {
|
|
722
|
+
f.resume
|
|
723
|
+
}
|
|
724
|
+
end
|
|
725
|
+
|
|
726
|
+
Fiber.yield
|
|
727
|
+
|
|
728
|
+
raise error if error
|
|
729
|
+
response
|
|
730
|
+
else
|
|
731
|
+
request = Mutex.new
|
|
732
|
+
result = ConditionVariable.new
|
|
733
|
+
error = nil
|
|
734
|
+
response = nil
|
|
735
|
+
|
|
736
|
+
request.synchronize {
|
|
737
|
+
@connection.reactor.next_tick do
|
|
738
|
+
begin
|
|
739
|
+
response = co(promise)
|
|
740
|
+
rescue => e
|
|
741
|
+
error = e
|
|
742
|
+
end
|
|
743
|
+
|
|
744
|
+
# Odds are we won't actually block here
|
|
745
|
+
request.synchronize {
|
|
746
|
+
result.signal
|
|
747
|
+
}
|
|
748
|
+
end
|
|
749
|
+
result.wait(request)
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
raise error if error
|
|
753
|
+
response
|
|
754
|
+
end
|
|
755
|
+
end
|
|
756
|
+
|
|
757
|
+
def connect
|
|
758
|
+
if @connection.reactor.running?
|
|
759
|
+
# We don't need to start a reactor so we use the regular helper
|
|
760
|
+
result(@connection.connect)
|
|
761
|
+
elsif Object.const_defined?(:EventMachine) && EM.reactor_thread?
|
|
762
|
+
start_reactor_and_em_connect
|
|
763
|
+
else
|
|
764
|
+
start_reactor_and_connect
|
|
765
|
+
end
|
|
766
|
+
end
|
|
767
|
+
|
|
768
|
+
# This blocks on the current thread
|
|
769
|
+
def start_reactor_and_connect
|
|
770
|
+
connecting = Mutex.new
|
|
771
|
+
result = ConditionVariable.new
|
|
772
|
+
error = nil
|
|
773
|
+
|
|
774
|
+
connecting.synchronize {
|
|
775
|
+
Thread.new do
|
|
776
|
+
@connection.reactor.run do
|
|
777
|
+
begin
|
|
778
|
+
co @connection.connect
|
|
779
|
+
rescue => e
|
|
780
|
+
error = e
|
|
781
|
+
end
|
|
782
|
+
|
|
783
|
+
# Odds are we won't actually block here
|
|
784
|
+
connecting.synchronize {
|
|
785
|
+
result.signal
|
|
786
|
+
}
|
|
787
|
+
end
|
|
788
|
+
end
|
|
789
|
+
result.wait(connecting)
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
raise error if error
|
|
793
|
+
end
|
|
794
|
+
|
|
795
|
+
# Assume this is being run in em-synchrony
|
|
796
|
+
def start_reactor_and_em_connect
|
|
797
|
+
f = Fiber.current
|
|
798
|
+
error = nil
|
|
799
|
+
|
|
800
|
+
Thread.new do
|
|
801
|
+
@connection.reactor.run do
|
|
802
|
+
begin
|
|
803
|
+
co @connection.connect
|
|
804
|
+
rescue => e
|
|
805
|
+
error = e
|
|
806
|
+
end
|
|
807
|
+
|
|
808
|
+
EM.next_tick {
|
|
809
|
+
f.resume
|
|
810
|
+
}
|
|
811
|
+
end
|
|
812
|
+
end
|
|
813
|
+
|
|
814
|
+
Fiber.yield
|
|
815
|
+
|
|
816
|
+
raise error if error
|
|
817
|
+
end
|
|
818
|
+
end
|
|
819
|
+
end
|