mt-libcouchbase 1.4.0
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 +22 -0
- data/.gitmodules +3 -0
- data/.rspec +1 -0
- data/.travis.yml +38 -0
- data/Gemfile +4 -0
- data/LICENSE +24 -0
- data/README.md +445 -0
- data/Rakefile +76 -0
- data/ext/README.md +6 -0
- data/ext/Rakefile +19 -0
- data/ext/libcouchbase/.gitignore +132 -0
- data/ext/libcouchbase/CMakeLists.txt +455 -0
- data/ext/libcouchbase/CONTRIBUTING.md +105 -0
- data/ext/libcouchbase/LICENSE +202 -0
- data/ext/libcouchbase/README.markdown +195 -0
- data/ext/libcouchbase/RELEASE_NOTES.markdown +3523 -0
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +52 -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 +18 -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 +54 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +57 -0
- data/ext/libcouchbase/cmake/Modules/FindProfiler.cmake +16 -0
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +49 -0
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +142 -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 +80 -0
- data/ext/libcouchbase/cmake/configure +355 -0
- data/ext/libcouchbase/cmake/defs.mk.in +6 -0
- data/ext/libcouchbase/cmake/dtrace-instr-link.pl +51 -0
- data/ext/libcouchbase/cmake/libcouchbase.stp.in +829 -0
- data/ext/libcouchbase/cmake/source_files.cmake +104 -0
- data/ext/libcouchbase/contrib/cJSON/cJSON.c +1022 -0
- data/ext/libcouchbase/contrib/cJSON/cJSON.h +158 -0
- data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +25 -0
- data/ext/libcouchbase/contrib/cbsasl/COPYING +202 -0
- data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +259 -0
- data/ext/libcouchbase/contrib/cbsasl/src/client.c +419 -0
- data/ext/libcouchbase/contrib/cbsasl/src/common.c +50 -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/scram-sha/scram_utils.c +500 -0
- data/ext/libcouchbase/contrib/cbsasl/src/scram-sha/scram_utils.h +99 -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 +938 -0
- data/ext/libcouchbase/contrib/cliopts/cliopts.h +610 -0
- data/ext/libcouchbase/contrib/genhash/genhash.c +371 -0
- data/ext/libcouchbase/contrib/genhash/genhash.h +241 -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 +4893 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.h +1961 -0
- data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +7 -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 +75 -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 +100 -0
- data/ext/libcouchbase/contrib/snappy/snappy.cc +1312 -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/doc/Doxyfile +2495 -0
- data/ext/libcouchbase/doc/DoxygenLayout.xml +109 -0
- data/ext/libcouchbase/doc/Makefile +44 -0
- data/ext/libcouchbase/doc/apiattr.h +117 -0
- data/ext/libcouchbase/doc/cbc-n1qlback.markdown +88 -0
- data/ext/libcouchbase/doc/cbc-pillowfight.markdown +296 -0
- data/ext/libcouchbase/doc/cbc-subdoc.markdown +299 -0
- data/ext/libcouchbase/doc/cbc.markdown +763 -0
- data/ext/libcouchbase/doc/cbcrc.markdown +52 -0
- data/ext/libcouchbase/doc/common-additional-options.markdown +82 -0
- data/ext/libcouchbase/doc/common-options.markdown +71 -0
- data/ext/libcouchbase/doc/environment.h +93 -0
- data/ext/libcouchbase/doc/example/threads.c +77 -0
- data/ext/libcouchbase/doc/footer.html +22 -0
- data/ext/libcouchbase/doc/genman.sh +25 -0
- data/ext/libcouchbase/doc/header.html +52 -0
- data/ext/libcouchbase/doc/intro.h +130 -0
- data/ext/libcouchbase/doc/mainpage.h +136 -0
- data/ext/libcouchbase/doc/man/cbc-admin.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-bucket-create.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-bucket-delete.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-cat.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-connstr.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-cp.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-create.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-decr.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-flush.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-hash.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-incr.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-lock.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-mcflush.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-mcversion.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-n1ql.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-n1qlback.1 +198 -0
- data/ext/libcouchbase/doc/man/cbc-observe.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-pillowfight.1 +499 -0
- data/ext/libcouchbase/doc/man/cbc-ping.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-rm.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-role-list.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-stats.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-subdoc.1 +494 -0
- data/ext/libcouchbase/doc/man/cbc-unlock.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-user-delete.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-user-list.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-user-upsert.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-verbosity.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-version.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-view.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-watch.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc.1 +1035 -0
- data/ext/libcouchbase/doc/man/cbcrc.4 +71 -0
- data/ext/libcouchbase/doc/style.css +1162 -0
- data/ext/libcouchbase/example/CMakeLists.txt +52 -0
- data/ext/libcouchbase/example/README.markdown +47 -0
- data/ext/libcouchbase/example/analytics/.gitignore +1 -0
- data/ext/libcouchbase/example/analytics/analytics.c +158 -0
- data/ext/libcouchbase/example/analytics/build-queries.rb +34 -0
- data/ext/libcouchbase/example/analytics/cJSON.c +1 -0
- data/ext/libcouchbase/example/analytics/cJSON.h +1 -0
- data/ext/libcouchbase/example/analytics/queries/00-show-dataverse.json +5 -0
- data/ext/libcouchbase/example/analytics/queries/01-setup-dataset-breweries.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/02-setup-dataset-beers.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/03-initiate-shadow.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/04-list-datasets.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/05-count-breweries.json +5 -0
- data/ext/libcouchbase/example/analytics/queries/06-first-brewery.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/07-key-based-lookup.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/08-exact-match-lookup.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/09-exact-match-lookup-different-shape.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/10-other-query-filters.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/11-equijoin.json +9 -0
- data/ext/libcouchbase/example/analytics/queries/12-equijoin-select-star.json +10 -0
- data/ext/libcouchbase/example/analytics/queries/13-ansi-join.json +8 -0
- data/ext/libcouchbase/example/analytics/queries/14-join-select-values.json +8 -0
- data/ext/libcouchbase/example/analytics/queries/15-nested-outer-join.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/16-theta-join.json +8 -0
- data/ext/libcouchbase/example/analytics/queries/17-existential-quantification.json +9 -0
- data/ext/libcouchbase/example/analytics/queries/18-universal-quantification.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/19-simple-aggregation.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/20-simple-aggregation-unwrapped-value.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/21-simple-aggregation-explicit.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/22-grouping-and-aggregation.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/23-grouping-and-aggregation-with-hint.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/24-grouping-and-limits.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/25-named-parameters.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/26-positional-parameters.json +7 -0
- data/ext/libcouchbase/example/analytics/queries.h +113 -0
- data/ext/libcouchbase/example/crypto/.gitignore +2 -0
- data/ext/libcouchbase/example/crypto/Makefile +13 -0
- data/ext/libcouchbase/example/crypto/common_provider.c +26 -0
- data/ext/libcouchbase/example/crypto/common_provider.h +33 -0
- data/ext/libcouchbase/example/crypto/openssl_symmetric_decrypt.c +144 -0
- data/ext/libcouchbase/example/crypto/openssl_symmetric_encrypt.c +146 -0
- data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.c +271 -0
- data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.h +29 -0
- data/ext/libcouchbase/example/db/db.c +171 -0
- data/ext/libcouchbase/example/db/vb.c +227 -0
- data/ext/libcouchbase/example/fts/.gitignore +1 -0
- data/ext/libcouchbase/example/fts/build-queries.rb +33 -0
- data/ext/libcouchbase/example/fts/fts.c +142 -0
- data/ext/libcouchbase/example/fts/queries/00-simple-text-query.json +12 -0
- data/ext/libcouchbase/example/fts/queries/01-simple-text-query-on-non-default-index.json +9 -0
- data/ext/libcouchbase/example/fts/queries/02-simple-text-query-on-stored-field.json +13 -0
- data/ext/libcouchbase/example/fts/queries/03-match-query-with-facet.json +19 -0
- data/ext/libcouchbase/example/fts/queries/04-docid-query.json +11 -0
- data/ext/libcouchbase/example/fts/queries/05-unanalyzed-term-query-with-fuzziness-level-of-0.json +13 -0
- data/ext/libcouchbase/example/fts/queries/06-unanalyzed-term-query-with-fuzziness-level-of-2.json +14 -0
- data/ext/libcouchbase/example/fts/queries/07-match-phrase-query.json +13 -0
- data/ext/libcouchbase/example/fts/queries/08-phrase-query.json +16 -0
- data/ext/libcouchbase/example/fts/queries/09-query-string-query.json +9 -0
- data/ext/libcouchbase/example/fts/queries/10-conjunction-query.json +21 -0
- data/ext/libcouchbase/example/fts/queries/11-wild-card-query.json +13 -0
- data/ext/libcouchbase/example/fts/queries/12-numeric-range-query.json +11 -0
- data/ext/libcouchbase/example/fts/queries/13-regexp-query.json +13 -0
- data/ext/libcouchbase/example/fts/queries.h +61 -0
- data/ext/libcouchbase/example/instancepool/main.cc +112 -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 +222 -0
- data/ext/libcouchbase/example/mcc/mcc.cc +246 -0
- data/ext/libcouchbase/example/minimal/.gitignore +1 -0
- data/ext/libcouchbase/example/minimal/minimal.c +132 -0
- data/ext/libcouchbase/example/minimal/query.c +185 -0
- data/ext/libcouchbase/example/observe/durability.c +102 -0
- data/ext/libcouchbase/example/observe/observe.c +159 -0
- data/ext/libcouchbase/example/subdoc/subdoc-multi.cc +143 -0
- data/ext/libcouchbase/example/subdoc/subdoc-simple.cc +201 -0
- data/ext/libcouchbase/example/subdoc/subdoc-xattrs.c +286 -0
- data/ext/libcouchbase/example/tick/tick.c +119 -0
- data/ext/libcouchbase/example/tracing/.gitignore +2 -0
- data/ext/libcouchbase/example/tracing/Makefile +8 -0
- data/ext/libcouchbase/example/tracing/cJSON.c +1 -0
- data/ext/libcouchbase/example/tracing/cJSON.h +1 -0
- data/ext/libcouchbase/example/tracing/tracing.c +439 -0
- data/ext/libcouchbase/example/tracing/views.c +444 -0
- data/ext/libcouchbase/example/users/README +48 -0
- data/ext/libcouchbase/example/users/users.c +147 -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/auth.h +297 -0
- data/ext/libcouchbase/include/libcouchbase/cbft.h +151 -0
- data/ext/libcouchbase/include/libcouchbase/cntl-private.h +319 -0
- data/ext/libcouchbase/include/libcouchbase/cntl.h +1418 -0
- data/ext/libcouchbase/include/libcouchbase/configuration.h.in +29 -0
- data/ext/libcouchbase/include/libcouchbase/couchbase.h +4089 -0
- data/ext/libcouchbase/include/libcouchbase/crypto.h +306 -0
- data/ext/libcouchbase/include/libcouchbase/deprecated.h +312 -0
- data/ext/libcouchbase/include/libcouchbase/error.h +680 -0
- data/ext/libcouchbase/include/libcouchbase/http.h +1 -0
- data/ext/libcouchbase/include/libcouchbase/iops.h +1053 -0
- data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +263 -0
- data/ext/libcouchbase/include/libcouchbase/kvbuf.h +137 -0
- data/ext/libcouchbase/include/libcouchbase/metrics.h +79 -0
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +539 -0
- data/ext/libcouchbase/include/libcouchbase/pktfwd.h +270 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +370 -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 +347 -0
- data/ext/libcouchbase/include/libcouchbase/sysdefs.h +98 -0
- data/ext/libcouchbase/include/libcouchbase/tracing.h +437 -0
- data/ext/libcouchbase/include/libcouchbase/vbucket.h +680 -0
- data/ext/libcouchbase/include/libcouchbase/views.h +357 -0
- data/ext/libcouchbase/include/libcouchbase/visibility.h +66 -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 +885 -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 +72 -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 +101 -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 +467 -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 +31 -0
- data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +66 -0
- data/ext/libcouchbase/plugins/io/libev/plugin-libev.c +289 -0
- data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +31 -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 +44 -0
- data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +218 -0
- data/ext/libcouchbase/plugins/io/libuv/libuv_io_opts.h +118 -0
- data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +155 -0
- data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +709 -0
- data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +13 -0
- data/ext/libcouchbase/plugins/io/select/plugin-select.c +451 -0
- data/ext/libcouchbase/plugins/io/select/select_io_opts.h +39 -0
- data/ext/libcouchbase/src/README.md +101 -0
- data/ext/libcouchbase/src/aspend.h +105 -0
- data/ext/libcouchbase/src/auth-priv.h +85 -0
- data/ext/libcouchbase/src/auth.cc +146 -0
- data/ext/libcouchbase/src/bootstrap.cc +263 -0
- data/ext/libcouchbase/src/bootstrap.h +149 -0
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +450 -0
- data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.cc +527 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.h +107 -0
- data/ext/libcouchbase/src/bucketconfig/bc_static.cc +150 -0
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +700 -0
- data/ext/libcouchbase/src/bucketconfig/confmon.cc +403 -0
- data/ext/libcouchbase/src/callbacks.c +380 -0
- data/ext/libcouchbase/src/cbft.cc +253 -0
- data/ext/libcouchbase/src/cntl.cc +1057 -0
- data/ext/libcouchbase/src/config_static.h +176 -0
- data/ext/libcouchbase/src/connspec.cc +555 -0
- data/ext/libcouchbase/src/connspec.h +155 -0
- data/ext/libcouchbase/src/crypto.cc +399 -0
- data/ext/libcouchbase/src/ctx-log-inl.h +44 -0
- data/ext/libcouchbase/src/dns-srv.cc +146 -0
- data/ext/libcouchbase/src/dump.cc +103 -0
- data/ext/libcouchbase/src/errmap.cc +173 -0
- data/ext/libcouchbase/src/errmap.h +271 -0
- data/ext/libcouchbase/src/getconfig.cc +72 -0
- data/ext/libcouchbase/src/gethrtime.c +109 -0
- data/ext/libcouchbase/src/handler.cc +1101 -0
- data/ext/libcouchbase/src/hashtable.c +75 -0
- data/ext/libcouchbase/src/hdr_timings.c +92 -0
- data/ext/libcouchbase/src/hostlist.cc +293 -0
- data/ext/libcouchbase/src/hostlist.h +160 -0
- data/ext/libcouchbase/src/http/http-priv.h +326 -0
- data/ext/libcouchbase/src/http/http.cc +672 -0
- data/ext/libcouchbase/src/http/http.h +1 -0
- data/ext/libcouchbase/src/http/http_io.cc +316 -0
- data/ext/libcouchbase/src/instance.cc +917 -0
- data/ext/libcouchbase/src/internal.h +285 -0
- data/ext/libcouchbase/src/iofactory.c +575 -0
- data/ext/libcouchbase/src/jsparse/parser.cc +445 -0
- data/ext/libcouchbase/src/jsparse/parser.h +159 -0
- data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
- data/ext/libcouchbase/src/lcbht/lcbht.h +210 -0
- data/ext/libcouchbase/src/lcbio/connect.cc +603 -0
- data/ext/libcouchbase/src/lcbio/connect.h +400 -0
- data/ext/libcouchbase/src/lcbio/ctx.c +658 -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 +169 -0
- data/ext/libcouchbase/src/lcbio/ioutils.cc +356 -0
- data/ext/libcouchbase/src/lcbio/ioutils.h +144 -0
- data/ext/libcouchbase/src/lcbio/lcbio.h +51 -0
- data/ext/libcouchbase/src/lcbio/manager.cc +579 -0
- data/ext/libcouchbase/src/lcbio/manager.h +195 -0
- data/ext/libcouchbase/src/lcbio/protoctx.c +84 -0
- data/ext/libcouchbase/src/lcbio/rw-inl.h +137 -0
- data/ext/libcouchbase/src/lcbio/ssl.h +159 -0
- data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -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 +431 -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 +88 -0
- data/ext/libcouchbase/src/mc/compress.cc +171 -0
- data/ext/libcouchbase/src/mc/compress.h +56 -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 +115 -0
- data/ext/libcouchbase/src/mc/mcreq.c +983 -0
- data/ext/libcouchbase/src/mc/mcreq.h +1015 -0
- data/ext/libcouchbase/src/mcserver/mcserver.cc +1055 -0
- data/ext/libcouchbase/src/mcserver/mcserver.h +221 -0
- data/ext/libcouchbase/src/mcserver/negotiate.cc +757 -0
- data/ext/libcouchbase/src/mcserver/negotiate.h +128 -0
- data/ext/libcouchbase/src/mctx-helper.h +62 -0
- data/ext/libcouchbase/src/metrics.cc +132 -0
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +857 -0
- data/ext/libcouchbase/src/n1ql/n1ql-internal.h +22 -0
- data/ext/libcouchbase/src/n1ql/n1ql.cc +830 -0
- data/ext/libcouchbase/src/n1ql/params.cc +260 -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.cc +365 -0
- data/ext/libcouchbase/src/nodeinfo.cc +184 -0
- data/ext/libcouchbase/src/operations/cbflush.cc +63 -0
- data/ext/libcouchbase/src/operations/counter.cc +117 -0
- data/ext/libcouchbase/src/operations/durability-cas.cc +251 -0
- data/ext/libcouchbase/src/operations/durability-seqno.cc +170 -0
- data/ext/libcouchbase/src/operations/durability.cc +668 -0
- data/ext/libcouchbase/src/operations/durability_internal.h +306 -0
- data/ext/libcouchbase/src/operations/get.cc +409 -0
- data/ext/libcouchbase/src/operations/observe-seqno.cc +94 -0
- data/ext/libcouchbase/src/operations/observe.cc +367 -0
- data/ext/libcouchbase/src/operations/ping.cc +496 -0
- data/ext/libcouchbase/src/operations/pktfwd.cc +86 -0
- data/ext/libcouchbase/src/operations/remove.cc +84 -0
- data/ext/libcouchbase/src/operations/stats.cc +459 -0
- data/ext/libcouchbase/src/operations/store.cc +358 -0
- data/ext/libcouchbase/src/operations/subdoc.cc +614 -0
- data/ext/libcouchbase/src/operations/touch.cc +84 -0
- data/ext/libcouchbase/src/packetutils.h +388 -0
- data/ext/libcouchbase/src/probes.d +182 -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.cc +113 -0
- data/ext/libcouchbase/src/retryq.cc +458 -0
- data/ext/libcouchbase/src/retryq.h +170 -0
- data/ext/libcouchbase/src/ringbuffer.c +442 -0
- data/ext/libcouchbase/src/ringbuffer.h +100 -0
- data/ext/libcouchbase/src/rnd.cc +61 -0
- data/ext/libcouchbase/src/rnd.h +39 -0
- data/ext/libcouchbase/src/settings.c +125 -0
- data/ext/libcouchbase/src/settings.h +273 -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 +11 -0
- data/ext/libcouchbase/src/ssl/ssl_c.c +442 -0
- data/ext/libcouchbase/src/ssl/ssl_common.c +478 -0
- data/ext/libcouchbase/src/ssl/ssl_e.c +421 -0
- data/ext/libcouchbase/src/ssl/ssl_iot_common.h +182 -0
- data/ext/libcouchbase/src/strcodecs/base64.c +307 -0
- data/ext/libcouchbase/src/strcodecs/strcodecs.h +302 -0
- data/ext/libcouchbase/src/timings.c +207 -0
- data/ext/libcouchbase/src/trace.h +117 -0
- data/ext/libcouchbase/src/tracing/span.cc +421 -0
- data/ext/libcouchbase/src/tracing/threshold_logging_tracer.cc +213 -0
- data/ext/libcouchbase/src/tracing/tracer.cc +53 -0
- data/ext/libcouchbase/src/tracing/tracing-internal.h +198 -0
- data/ext/libcouchbase/src/utilities.c +176 -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 +1735 -0
- data/ext/libcouchbase/src/views/docreq.cc +213 -0
- data/ext/libcouchbase/src/views/docreq.h +94 -0
- data/ext/libcouchbase/src/views/viewreq.cc +381 -0
- data/ext/libcouchbase/src/views/viewreq.h +87 -0
- data/ext/libcouchbase/src/wait.cc +156 -0
- data/ext/libcouchbase/tests/CMakeLists.txt +149 -0
- data/ext/libcouchbase/tests/basic/t_base64.cc +109 -0
- data/ext/libcouchbase/tests/basic/t_ccbc103.cc +95 -0
- data/ext/libcouchbase/tests/basic/t_connstr.cc +456 -0
- data/ext/libcouchbase/tests/basic/t_creds.cc +96 -0
- data/ext/libcouchbase/tests/basic/t_ctlcodes.cc +92 -0
- data/ext/libcouchbase/tests/basic/t_host.cc +210 -0
- data/ext/libcouchbase/tests/basic/t_jsparse.cc +82 -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 +17 -0
- data/ext/libcouchbase/tests/basic/t_netbuf.cc +446 -0
- data/ext/libcouchbase/tests/basic/t_packet.cc +215 -0
- data/ext/libcouchbase/tests/basic/t_ringbuffer.cc +278 -0
- data/ext/libcouchbase/tests/basic/t_scram.cc +514 -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_urlencode.cc +132 -0
- data/ext/libcouchbase/tests/check-all.cc +612 -0
- data/ext/libcouchbase/tests/htparse/t_basic.cc +173 -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 +117 -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 +632 -0
- data/ext/libcouchbase/tests/iotests/mock-environment.h +480 -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 +220 -0
- data/ext/libcouchbase/tests/iotests/t_configcache.cc +117 -0
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +223 -0
- data/ext/libcouchbase/tests/iotests/t_durability.cc +1108 -0
- data/ext/libcouchbase/tests/iotests/t_eerrs.cc +121 -0
- data/ext/libcouchbase/tests/iotests/t_errmap.cc +181 -0
- data/ext/libcouchbase/tests/iotests/t_forward.cc +118 -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 +274 -0
- data/ext/libcouchbase/tests/iotests/t_misc.cc +777 -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 +778 -0
- data/ext/libcouchbase/tests/iotests/t_obseqno.cc +156 -0
- data/ext/libcouchbase/tests/iotests/t_regression.cc +321 -0
- data/ext/libcouchbase/tests/iotests/t_sched.cc +87 -0
- data/ext/libcouchbase/tests/iotests/t_serverops.cc +231 -0
- data/ext/libcouchbase/tests/iotests/t_smoke.cc +528 -0
- data/ext/libcouchbase/tests/iotests/t_snappy.cc +316 -0
- data/ext/libcouchbase/tests/iotests/t_subdoc.cc +857 -0
- data/ext/libcouchbase/tests/iotests/t_syncmode.cc +64 -0
- data/ext/libcouchbase/tests/iotests/t_views.cc +417 -0
- data/ext/libcouchbase/tests/iotests/testutil.cc +251 -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 +344 -0
- data/ext/libcouchbase/tests/socktests/socktest.h +447 -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 +159 -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/ketama_expected.json +2562 -0
- data/ext/libcouchbase/tests/vbucket/confdata/map_node_present_nodesext_missing_nodes.json +94 -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/memd_ketama_config.json +31 -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 +386 -0
- data/ext/libcouchbase/tools/CMakeLists.txt +80 -0
- data/ext/libcouchbase/tools/cbc-handlers.h +636 -0
- data/ext/libcouchbase/tools/cbc-n1qlback.cc +496 -0
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +1230 -0
- data/ext/libcouchbase/tools/cbc-proxy.cc +534 -0
- data/ext/libcouchbase/tools/cbc-subdoc.cc +825 -0
- data/ext/libcouchbase/tools/cbc.cc +1928 -0
- data/ext/libcouchbase/tools/common/histogram.cc +44 -0
- data/ext/libcouchbase/tools/common/histogram.h +23 -0
- data/ext/libcouchbase/tools/common/options.cc +451 -0
- data/ext/libcouchbase/tools/common/options.h +90 -0
- data/ext/libcouchbase/tools/docgen/docgen.h +495 -0
- data/ext/libcouchbase/tools/docgen/loc.h +211 -0
- data/ext/libcouchbase/tools/docgen/placeholders.h +211 -0
- data/ext/libcouchbase/tools/docgen/seqgen.h +122 -0
- data/ext/libcouchbase/tools/extract-packets.rb +110 -0
- data/ext/libcouchbase/tools/linenoise/linenoise.c +1199 -0
- data/ext/libcouchbase/tools/linenoise/linenoise.h +73 -0
- data/lib/mt-libcouchbase/bucket.rb +825 -0
- data/lib/mt-libcouchbase/callbacks.rb +69 -0
- data/lib/mt-libcouchbase/connection.rb +896 -0
- data/lib/mt-libcouchbase/design_docs.rb +92 -0
- data/lib/mt-libcouchbase/error.rb +68 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdbase.rb +23 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdcounter.rb +36 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdendure.rb +26 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdfts.rb +24 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdget.rb +30 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdgetreplica.rb +49 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdhttp.rb +58 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdn1ql.rb +40 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdobseqno.rb +33 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdobserve.rb +30 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdstore.rb +40 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdstoredur.rb +45 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdsubdoc.rb +61 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdverbosity.rb +29 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdviewquery.rb +61 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/contigbuf.rb +14 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st.rb +15 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st0.rb +23 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st1.rb +26 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st2.rb +32 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st3.rb +26 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/crst_u.rb +20 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/durability_opts_st_v.rb +11 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/durability_opts_t.rb +14 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/durabilityopt_sv0.rb +63 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/enums.rb +1007 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/fragbuf.rb +18 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/ftshandle.rb +7 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/histogram.rb +34 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/http_request_t.rb +7 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/keybuf.rb +20 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/multicmd_ctx.rb +30 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/mutation_token.rb +17 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/n1qlhandle.rb +7 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/n1qlparams.rb +7 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respbase.rb +29 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respcounter.rb +32 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respendure.rb +49 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respfts.rb +40 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respget.rb +44 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/resphttp.rb +48 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respmcversion.rb +38 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respn1ql.rb +41 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respobseqno.rb +52 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respobserve.rb +41 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respserverbase.rb +32 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respstats.rb +38 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respstore.rb +32 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respstoredur.rb +38 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respsubdoc.rb +35 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respviewquery.rb +67 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/sdentry.rb +22 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/sdspec.rb +31 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/t.rb +7 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/valbuf.rb +22 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/valbuf_u_buf.rb +14 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/viewhandle.rb +7 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase.rb +1175 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase_libuv.rb +22 -0
- data/lib/mt-libcouchbase/ext/tasks.rb +39 -0
- data/lib/mt-libcouchbase/n1ql.rb +80 -0
- data/lib/mt-libcouchbase/query_full_text.rb +147 -0
- data/lib/mt-libcouchbase/query_n1ql.rb +123 -0
- data/lib/mt-libcouchbase/query_view.rb +135 -0
- data/lib/mt-libcouchbase/results_fiber.rb +281 -0
- data/lib/mt-libcouchbase/results_native.rb +220 -0
- data/lib/mt-libcouchbase/subdoc_request.rb +139 -0
- data/lib/mt-libcouchbase/version.rb +5 -0
- data/lib/mt-libcouchbase.rb +40 -0
- data/mt-libcouchbase.gemspec +68 -0
- data/spec/bucket_spec.rb +290 -0
- data/spec/connection_spec.rb +257 -0
- data/spec/design_docs_spec.rb +31 -0
- data/spec/error_spec.rb +26 -0
- data/spec/fts_spec.rb +135 -0
- data/spec/n1ql_spec.rb +260 -0
- data/spec/results_libuv_spec.rb +244 -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/subdoc_spec.rb +192 -0
- data/spec/view_spec.rb +201 -0
- data/windows_build.md +36 -0
- metadata +873 -0
|
@@ -0,0 +1,1101 @@
|
|
|
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
|
+
#include "internal.h"
|
|
19
|
+
#include "packetutils.h"
|
|
20
|
+
#include "mc/mcreq.h"
|
|
21
|
+
#include "mc/compress.h"
|
|
22
|
+
#include "trace.h"
|
|
23
|
+
|
|
24
|
+
#define LOGARGS(obj, lvl) (obj)->settings, "handler", LCB_LOG_##lvl, __FILE__, __LINE__
|
|
25
|
+
|
|
26
|
+
using lcb::MemcachedResponse;
|
|
27
|
+
|
|
28
|
+
template <typename T>
|
|
29
|
+
class ResponsePack {
|
|
30
|
+
public:
|
|
31
|
+
T resp;
|
|
32
|
+
lcb_MUTATION_TOKEN mt;
|
|
33
|
+
const char *value;
|
|
34
|
+
lcb_SIZE nvalue;
|
|
35
|
+
char *err_ref;
|
|
36
|
+
char *err_ctx;
|
|
37
|
+
|
|
38
|
+
~ResponsePack() {
|
|
39
|
+
free(err_ref);
|
|
40
|
+
free(err_ctx);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
static const lcb_MUTATION_TOKEN*
|
|
44
|
+
get_mt(const lcb_RESPBASE *rb) {
|
|
45
|
+
const ResponsePack *rp = reinterpret_cast<const ResponsePack*>(rb);
|
|
46
|
+
return &rp->mt;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static const char*
|
|
50
|
+
get_err_ctx(const lcb_RESPBASE *rb) {
|
|
51
|
+
const ResponsePack *rp = reinterpret_cast<const ResponsePack*>(rb);
|
|
52
|
+
if (rp->resp.rflags & LCB_RESP_F_ERRINFO) {
|
|
53
|
+
if (rp->err_ctx) {
|
|
54
|
+
return rp->err_ctx;
|
|
55
|
+
} else {
|
|
56
|
+
parse_enhanced_error(rp);
|
|
57
|
+
return rp->err_ctx;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return NULL;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
static const char*
|
|
64
|
+
get_err_ref(const lcb_RESPBASE *rb) {
|
|
65
|
+
const ResponsePack *rp = reinterpret_cast<const ResponsePack*>(rb);
|
|
66
|
+
if (rp->resp.rflags & LCB_RESP_F_ERRINFO) {
|
|
67
|
+
if (rp->err_ref) {
|
|
68
|
+
return rp->err_ref;
|
|
69
|
+
} else {
|
|
70
|
+
parse_enhanced_error(rp);
|
|
71
|
+
return rp->err_ref;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return NULL;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private:
|
|
78
|
+
|
|
79
|
+
static void
|
|
80
|
+
parse_enhanced_error(const ResponsePack *rp) {
|
|
81
|
+
ResponsePack *mrp = const_cast<ResponsePack *>(rp);
|
|
82
|
+
lcb_error_t rc = MemcachedResponse::parse_enhanced_error(mrp->value, mrp->nvalue, &mrp->err_ref, &mrp->err_ctx);
|
|
83
|
+
if (rc != LCB_SUCCESS) {
|
|
84
|
+
mrp->resp.rflags &= ~LCB_RESP_F_ERRINFO;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
LIBCOUCHBASE_API
|
|
90
|
+
lcb_error_t
|
|
91
|
+
lcb_errmap_default(lcb_t instance, lcb_uint16_t in)
|
|
92
|
+
{
|
|
93
|
+
switch (in) {
|
|
94
|
+
case PROTOCOL_BINARY_RESPONSE_NOT_MY_VBUCKET:
|
|
95
|
+
return LCB_ETIMEDOUT;
|
|
96
|
+
case PROTOCOL_BINARY_RESPONSE_AUTH_CONTINUE:
|
|
97
|
+
return LCB_AUTH_CONTINUE;
|
|
98
|
+
case PROTOCOL_BINARY_RESPONSE_EBUSY:
|
|
99
|
+
return LCB_EBUSY;
|
|
100
|
+
case PROTOCOL_BINARY_RESPONSE_ETMPFAIL:
|
|
101
|
+
return LCB_ETMPFAIL;
|
|
102
|
+
|
|
103
|
+
case PROTOCOL_BINARY_RESPONSE_EINTERNAL:
|
|
104
|
+
default:
|
|
105
|
+
if (instance) {
|
|
106
|
+
lcb_log(LOGARGS(instance, ERROR), "Got unhandled memcached error 0x%X", in);
|
|
107
|
+
} else {
|
|
108
|
+
fprintf(stderr, "COUCHBASE: Unhandled memcached status=0x%x\n", in);
|
|
109
|
+
}
|
|
110
|
+
return LCB_UNKNOWN_MEMCACHED_ERROR;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
static lcb_error_t
|
|
115
|
+
map_error(lcb_t instance, int in)
|
|
116
|
+
{
|
|
117
|
+
switch (in) {
|
|
118
|
+
case PROTOCOL_BINARY_RESPONSE_SUCCESS:
|
|
119
|
+
return LCB_SUCCESS;
|
|
120
|
+
case PROTOCOL_BINARY_RESPONSE_KEY_ENOENT:
|
|
121
|
+
return LCB_KEY_ENOENT;
|
|
122
|
+
case PROTOCOL_BINARY_RESPONSE_E2BIG:
|
|
123
|
+
return LCB_E2BIG;
|
|
124
|
+
case PROTOCOL_BINARY_RESPONSE_ENOMEM:
|
|
125
|
+
return LCB_ENOMEM;
|
|
126
|
+
case PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS:
|
|
127
|
+
return LCB_KEY_EEXISTS;
|
|
128
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_ENOENT:
|
|
129
|
+
return LCB_SUBDOC_PATH_ENOENT;
|
|
130
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_MISMATCH:
|
|
131
|
+
return LCB_SUBDOC_PATH_MISMATCH;
|
|
132
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_EINVAL:
|
|
133
|
+
return LCB_SUBDOC_PATH_EINVAL;
|
|
134
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_E2BIG:
|
|
135
|
+
return LCB_SUBDOC_PATH_E2BIG;
|
|
136
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_DOC_E2DEEP:
|
|
137
|
+
return LCB_SUBDOC_DOC_E2DEEP;
|
|
138
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_VALUE_ETOODEEP:
|
|
139
|
+
return LCB_SUBDOC_VALUE_E2DEEP;
|
|
140
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_VALUE_CANTINSERT:
|
|
141
|
+
return LCB_SUBDOC_VALUE_CANTINSERT;
|
|
142
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_DOC_NOTJSON:
|
|
143
|
+
return LCB_SUBDOC_DOC_NOTJSON;
|
|
144
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_NUM_ERANGE:
|
|
145
|
+
return LCB_SUBDOC_NUM_ERANGE;
|
|
146
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_DELTA_ERANGE:
|
|
147
|
+
return LCB_SUBDOC_BAD_DELTA;
|
|
148
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_EEXISTS:
|
|
149
|
+
return LCB_SUBDOC_PATH_EEXISTS;
|
|
150
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_MULTI_PATH_FAILURE:
|
|
151
|
+
return LCB_SUBDOC_MULTI_FAILURE;
|
|
152
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_INVALID_COMBO:
|
|
153
|
+
return LCB_SUBDOC_INVALID_COMBO;
|
|
154
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_SUCCESS_DELETED:
|
|
155
|
+
return LCB_SUBDOC_SUCCESS_DELETED;
|
|
156
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_INVALID_FLAG_COMBO:
|
|
157
|
+
return LCB_SUBDOC_XATTR_INVALID_FLAG_COMBO;
|
|
158
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_INVALID_KEY_COMBO:
|
|
159
|
+
return LCB_SUBDOC_XATTR_INVALID_KEY_COMBO;
|
|
160
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_UNKNOWN_MACRO:
|
|
161
|
+
return LCB_SUBDOC_XATTR_UNKNOWN_MACRO;
|
|
162
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_UNKNOWN_VATTR:
|
|
163
|
+
return LCB_SUBDOC_XATTR_UNKNOWN_VATTR;
|
|
164
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_CANT_MODIFY_VATTR:
|
|
165
|
+
return LCB_SUBDOC_XATTR_CANT_MODIFY_VATTR;
|
|
166
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_MULTI_PATH_FAILURE_DELETED:
|
|
167
|
+
return LCB_SUBDOC_MULTI_PATH_FAILURE_DELETED;
|
|
168
|
+
case PROTOCOL_BINARY_RESPONSE_SUBDOC_INVALID_XATTR_ORDER:
|
|
169
|
+
return LCB_SUBDOC_INVALID_XATTR_ORDER;
|
|
170
|
+
case PROTOCOL_BINARY_RESPONSE_EINVAL:
|
|
171
|
+
return LCB_EINVAL_MCD;
|
|
172
|
+
case PROTOCOL_BINARY_RESPONSE_NOT_STORED:
|
|
173
|
+
return LCB_NOT_STORED;
|
|
174
|
+
case PROTOCOL_BINARY_RESPONSE_DELTA_BADVAL:
|
|
175
|
+
return LCB_DELTA_BADVAL;
|
|
176
|
+
case PROTOCOL_BINARY_RESPONSE_AUTH_ERROR:
|
|
177
|
+
return LCB_AUTH_ERROR;
|
|
178
|
+
case PROTOCOL_BINARY_RESPONSE_ERANGE:
|
|
179
|
+
return LCB_ERANGE;
|
|
180
|
+
case PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND:
|
|
181
|
+
return LCB_UNKNOWN_COMMAND;
|
|
182
|
+
case PROTOCOL_BINARY_RESPONSE_NOT_SUPPORTED:
|
|
183
|
+
return LCB_NOT_SUPPORTED;
|
|
184
|
+
case PROTOCOL_BINARY_RESPONSE_EACCESS:
|
|
185
|
+
return LCB_NOT_AUTHORIZED;
|
|
186
|
+
case PROTOCOL_BINARY_RESPONSE_UNKNOWN_COLLECTION:
|
|
187
|
+
return LCB_EINVAL;
|
|
188
|
+
default:
|
|
189
|
+
if (instance != NULL) {
|
|
190
|
+
return instance->callbacks.errmap(instance, in);
|
|
191
|
+
} else {
|
|
192
|
+
return lcb_errmap_default(NULL, in);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
static lcb_RESPCALLBACK
|
|
198
|
+
find_callback(lcb_t instance, lcb_CALLBACKTYPE type)
|
|
199
|
+
{
|
|
200
|
+
lcb_RESPCALLBACK cb = instance->callbacks.v3callbacks[type];
|
|
201
|
+
if (!cb) {
|
|
202
|
+
cb = lcb_find_callback(instance, type);
|
|
203
|
+
}
|
|
204
|
+
return cb;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* This file contains the mapping of various protocol response codes for
|
|
210
|
+
* a given command. Each handler receives the following parameters:
|
|
211
|
+
*
|
|
212
|
+
* @param pipeline the pipeline (or "Server") upon which the request was sent
|
|
213
|
+
* (and response was received)
|
|
214
|
+
*
|
|
215
|
+
* @param request the original request (including associated data). The request
|
|
216
|
+
* may be used to determine additional information about it, such as the
|
|
217
|
+
* user-defined "Cookie", number of related requests remaining, and more.
|
|
218
|
+
*
|
|
219
|
+
* @param response the response which was received. This is an opaque
|
|
220
|
+
* representation of a memcached response packet
|
|
221
|
+
*
|
|
222
|
+
* @param immerr in the case of an abnormal failure (i.e. network failure) the
|
|
223
|
+
* handler will be invoked with this callback set to a non-success value. The
|
|
224
|
+
* 'info' structure will still contain a valid (albeit empty and cryptic)
|
|
225
|
+
* header. If the user depends on special data being found in the payload then
|
|
226
|
+
* the handler must check that this variable is set to LCB_SUCCESS before
|
|
227
|
+
* continuing. Also note that a negative reply may also be present within
|
|
228
|
+
* the response itself; however this is not the purpose of this parameter.
|
|
229
|
+
*
|
|
230
|
+
* @return request status
|
|
231
|
+
* The return value should indicate whether outstanding responses remain
|
|
232
|
+
* to be received for this request, or if this request is deemed to be
|
|
233
|
+
* satisfied.
|
|
234
|
+
*/
|
|
235
|
+
|
|
236
|
+
template <typename T>
|
|
237
|
+
void make_error(lcb_t instance, T* resp,
|
|
238
|
+
const MemcachedResponse *response, lcb_error_t imm) {
|
|
239
|
+
if (imm) {
|
|
240
|
+
resp->rc = imm;
|
|
241
|
+
resp->rflags |= LCB_RESP_F_CLIENTGEN;
|
|
242
|
+
} else if (response->status() == PROTOCOL_BINARY_RESPONSE_SUCCESS) {
|
|
243
|
+
resp->rc = LCB_SUCCESS;
|
|
244
|
+
} else {
|
|
245
|
+
resp->rc = map_error(instance, response->status());
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
template <typename T>
|
|
250
|
+
void handle_error_info(const MemcachedResponse* mc_resp, ResponsePack<T>* rp)
|
|
251
|
+
{
|
|
252
|
+
if (mc_resp->status() != PROTOCOL_BINARY_RESPONSE_SUCCESS
|
|
253
|
+
&& mc_resp->datatype() & PROTOCOL_BINARY_DATATYPE_JSON
|
|
254
|
+
&& mc_resp->vallen() > 0) {
|
|
255
|
+
rp->resp.rflags |= LCB_RESP_F_ERRINFO;
|
|
256
|
+
rp->value = mc_resp->value();
|
|
257
|
+
rp->nvalue = mc_resp->vallen();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
template <typename T>
|
|
262
|
+
void init_resp(lcb_t instance, const MemcachedResponse* mc_resp,
|
|
263
|
+
const mc_PACKET *req, lcb_error_t immerr, T *resp) {
|
|
264
|
+
make_error(instance, resp, mc_resp, immerr);
|
|
265
|
+
resp->cas = mc_resp->cas();
|
|
266
|
+
resp->cookie = const_cast<void*>(MCREQ_PKT_COOKIE(req));
|
|
267
|
+
mcreq_get_key(req, &resp->key, &resp->nkey);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Handles the propagation and population of the 'mutation token' information.
|
|
272
|
+
* @param mc_resp The response packet
|
|
273
|
+
* @param req The request packet (used to get the vBucket)
|
|
274
|
+
* @param tgt Pointer to mutation token which should be populated.
|
|
275
|
+
*/
|
|
276
|
+
static void
|
|
277
|
+
handle_mutation_token(lcb_t instance, const MemcachedResponse *mc_resp,
|
|
278
|
+
const mc_PACKET *req, lcb_MUTATION_TOKEN *stok)
|
|
279
|
+
{
|
|
280
|
+
const char *sbuf;
|
|
281
|
+
uint16_t vbid;
|
|
282
|
+
if (mc_resp->extlen() == 0) {
|
|
283
|
+
return; /* No extras */
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (!instance->dcpinfo && LCBT_SETTING(instance, dur_mutation_tokens)) {
|
|
287
|
+
size_t nvb = LCBT_VBCONFIG(instance)->nvb;
|
|
288
|
+
if (nvb) {
|
|
289
|
+
instance->dcpinfo = new lcb_MUTATION_TOKEN[nvb];
|
|
290
|
+
memset(instance->dcpinfo, 0, sizeof(*instance->dcpinfo) * nvb);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
sbuf = mc_resp->ext();
|
|
295
|
+
vbid = mcreq_get_vbucket(req);
|
|
296
|
+
stok->vbid_ = vbid;
|
|
297
|
+
memcpy(&stok->uuid_, sbuf, 8);
|
|
298
|
+
memcpy(&stok->seqno_, sbuf + 8, 8);
|
|
299
|
+
|
|
300
|
+
stok->uuid_ = lcb_ntohll(stok->uuid_);
|
|
301
|
+
stok->seqno_ = lcb_ntohll(stok->seqno_);
|
|
302
|
+
|
|
303
|
+
if (instance->dcpinfo) {
|
|
304
|
+
instance->dcpinfo[vbid] = *stok;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
static lcb_t get_instance(mc_PIPELINE *pipeline) {
|
|
309
|
+
return reinterpret_cast<lcb_t>(pipeline->parent->cqdata);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
template <typename T>
|
|
313
|
+
void invoke_callback(const mc_PACKET *pkt,
|
|
314
|
+
lcb_t instance, T* resp, lcb_CALLBACKTYPE cbtype)
|
|
315
|
+
{
|
|
316
|
+
if (!(pkt->flags & MCREQ_F_INVOKED)) {
|
|
317
|
+
resp->cookie = const_cast<void*>(MCREQ_PKT_COOKIE(pkt));
|
|
318
|
+
const lcb_RESPBASE *base = reinterpret_cast<const lcb_RESPBASE*>(resp);
|
|
319
|
+
if ((pkt->flags & MCREQ_F_PRIVCALLBACK) == 0) {
|
|
320
|
+
find_callback(instance, cbtype)(instance, cbtype, base);
|
|
321
|
+
} else {
|
|
322
|
+
(*(lcb_RESPCALLBACK*)resp->cookie)(instance, cbtype, base);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
template <typename T>
|
|
328
|
+
void invoke_callback(const mc_PACKET *pkt, mc_PIPELINE *pipeline, T *resp,
|
|
329
|
+
lcb_CALLBACKTYPE cbtype)
|
|
330
|
+
{
|
|
331
|
+
invoke_callback(pkt, get_instance(pipeline), cbtype, resp);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Optionally decompress an incoming payload.
|
|
336
|
+
* @param o The instance
|
|
337
|
+
* @param resp The response received
|
|
338
|
+
* @param[out] bytes pointer to the final payload
|
|
339
|
+
* @param[out] nbytes pointer to the size of the final payload
|
|
340
|
+
* @param[out] freeptr pointer to free. This should be initialized to `NULL`.
|
|
341
|
+
* If temporary dynamic storage is required this will be set to the allocated
|
|
342
|
+
* pointer upon return. Otherwise it will be set to NULL. In any case it must
|
|
343
|
+
*/
|
|
344
|
+
static void
|
|
345
|
+
maybe_decompress(lcb_t o,
|
|
346
|
+
const MemcachedResponse* respkt, lcb_RESPGET *rescmd, void **freeptr)
|
|
347
|
+
{
|
|
348
|
+
lcb_U8 dtype = 0;
|
|
349
|
+
if (!respkt->vallen()) {
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
if (respkt->datatype() & PROTOCOL_BINARY_DATATYPE_JSON) {
|
|
354
|
+
dtype = LCB_VALUE_F_JSON;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
if (respkt->datatype() & PROTOCOL_BINARY_DATATYPE_COMPRESSED) {
|
|
358
|
+
if (LCBT_SETTING(o, compressopts) & LCB_COMPRESS_IN) {
|
|
359
|
+
/* if we inflate, we don't set the flag */
|
|
360
|
+
mcreq_inflate_value(
|
|
361
|
+
respkt->value(), respkt->vallen(),
|
|
362
|
+
&rescmd->value, &rescmd->nvalue, freeptr);
|
|
363
|
+
|
|
364
|
+
} else {
|
|
365
|
+
/* user doesn't want inflation. signal it's compressed */
|
|
366
|
+
dtype |= LCB_VALUE_F_SNAPPYCOMP;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
rescmd->datatype = dtype;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
static void
|
|
373
|
+
H_get(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse* response,
|
|
374
|
+
lcb_error_t immerr)
|
|
375
|
+
{
|
|
376
|
+
ResponsePack<lcb_RESPGET> w = {{ 0 }};
|
|
377
|
+
lcb_RESPGET& resp = w.resp;
|
|
378
|
+
|
|
379
|
+
lcb_t o = get_instance(pipeline);
|
|
380
|
+
init_resp(o, response, request, immerr, &resp);
|
|
381
|
+
handle_error_info(response, &w);
|
|
382
|
+
resp.rflags |= LCB_RESP_F_FINAL;
|
|
383
|
+
|
|
384
|
+
if (resp.rc == LCB_SUCCESS) {
|
|
385
|
+
resp.datatype = response->datatype();
|
|
386
|
+
resp.value = response->value();
|
|
387
|
+
resp.nvalue = response->vallen();
|
|
388
|
+
resp.bufh = response->bufseg();
|
|
389
|
+
if (response->extlen() == sizeof(uint32_t)) {
|
|
390
|
+
memcpy(&resp.itmflags, response->ext(), sizeof(uint32_t));
|
|
391
|
+
resp.itmflags = ntohl(resp.itmflags);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
void *freeptr = NULL;
|
|
396
|
+
maybe_decompress(o, response, &resp, &freeptr);
|
|
397
|
+
LCBTRACE_KV_FINISH(pipeline, request, response);
|
|
398
|
+
TRACE_GET_END(o, request, response, &resp);
|
|
399
|
+
invoke_callback(request, o, &resp, LCB_CALLBACK_GET);
|
|
400
|
+
free(freeptr);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
static void
|
|
404
|
+
H_getreplica(mc_PIPELINE *pipeline, mc_PACKET *request,
|
|
405
|
+
MemcachedResponse *response, lcb_error_t immerr)
|
|
406
|
+
{
|
|
407
|
+
ResponsePack<lcb_RESPGET> w = {{ 0 }};
|
|
408
|
+
lcb_RESPGET& resp = w.resp;
|
|
409
|
+
lcb_t instance = get_instance(pipeline);
|
|
410
|
+
void *freeptr = NULL;
|
|
411
|
+
mc_REQDATAEX *rd = request->u_rdata.exdata;
|
|
412
|
+
|
|
413
|
+
init_resp(instance, response, request, immerr, &resp);
|
|
414
|
+
handle_error_info(response, &w);
|
|
415
|
+
|
|
416
|
+
if (resp.rc == LCB_SUCCESS) {
|
|
417
|
+
resp.datatype = response->datatype();
|
|
418
|
+
resp.value = response->value();
|
|
419
|
+
resp.nvalue = response->vallen();
|
|
420
|
+
resp.bufh = response->bufseg();
|
|
421
|
+
if (response->extlen() == sizeof(uint32_t)) {
|
|
422
|
+
memcpy(&resp.itmflags, response->ext(), sizeof(uint32_t));
|
|
423
|
+
resp.itmflags = ntohl(resp.itmflags);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
maybe_decompress(instance, response, &resp, &freeptr);
|
|
428
|
+
rd->procs->handler(pipeline, request, resp.rc, &resp);
|
|
429
|
+
free(freeptr);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
static void
|
|
433
|
+
H_subdoc(mc_PIPELINE *pipeline, mc_PACKET *request,
|
|
434
|
+
MemcachedResponse *response, lcb_error_t immerr)
|
|
435
|
+
{
|
|
436
|
+
lcb_t o = get_instance(pipeline);
|
|
437
|
+
ResponsePack<lcb_RESPSUBDOC> w = {{ 0 }};
|
|
438
|
+
lcb_CALLBACKTYPE cbtype;
|
|
439
|
+
init_resp(o, response, request, immerr, &w.resp);
|
|
440
|
+
w.resp.rflags |= LCB_RESP_F_FINAL;
|
|
441
|
+
|
|
442
|
+
/* For mutations, add the mutation token */
|
|
443
|
+
switch (response->opcode()) {
|
|
444
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_GET:
|
|
445
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_EXISTS:
|
|
446
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_LOOKUP:
|
|
447
|
+
cbtype = LCB_CALLBACK_SDLOOKUP;
|
|
448
|
+
break;
|
|
449
|
+
|
|
450
|
+
default:
|
|
451
|
+
handle_mutation_token(o, response, request, &w.mt);
|
|
452
|
+
w.resp.rflags |= LCB_RESP_F_EXTDATA;
|
|
453
|
+
cbtype = LCB_CALLBACK_SDMUTATE;
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
if (response->opcode() == PROTOCOL_BINARY_CMD_SUBDOC_MULTI_LOOKUP ||
|
|
458
|
+
response->opcode() == PROTOCOL_BINARY_CMD_SUBDOC_MULTI_MUTATION) {
|
|
459
|
+
if (w.resp.rc == LCB_SUCCESS || w.resp.rc == LCB_SUBDOC_MULTI_FAILURE) {
|
|
460
|
+
w.resp.responses = response;
|
|
461
|
+
} else {
|
|
462
|
+
handle_error_info(response, &w);
|
|
463
|
+
}
|
|
464
|
+
} else {
|
|
465
|
+
/* Single response */
|
|
466
|
+
w.resp.rflags |= LCB_RESP_F_SDSINGLE;
|
|
467
|
+
if (w.resp.rc == LCB_SUCCESS) {
|
|
468
|
+
w.resp.responses = response;
|
|
469
|
+
} else if (LCB_EIFSUBDOC(w.resp.rc)) {
|
|
470
|
+
w.resp.responses = response;
|
|
471
|
+
w.resp.rc = LCB_SUBDOC_MULTI_FAILURE;
|
|
472
|
+
} else {
|
|
473
|
+
handle_error_info(response, &w);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
invoke_callback(request, o, &w.resp, cbtype);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
static int
|
|
480
|
+
sdlookup_next(const MemcachedResponse *response, lcb_SDENTRY *ent, size_t *iter)
|
|
481
|
+
{
|
|
482
|
+
const char *buf;
|
|
483
|
+
uint16_t rc;
|
|
484
|
+
uint32_t vlen;
|
|
485
|
+
|
|
486
|
+
if (*iter == response->vallen()) {
|
|
487
|
+
return 0;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
buf = response->value();
|
|
491
|
+
buf += *iter;
|
|
492
|
+
|
|
493
|
+
memcpy(&rc, buf, 2);
|
|
494
|
+
memcpy(&vlen, buf + 2, 4);
|
|
495
|
+
|
|
496
|
+
rc = ntohs(rc);
|
|
497
|
+
vlen = ntohl(vlen);
|
|
498
|
+
|
|
499
|
+
ent->status = map_error(NULL, rc);
|
|
500
|
+
ent->nvalue = vlen;
|
|
501
|
+
|
|
502
|
+
if (ent->status == LCB_SUCCESS) {
|
|
503
|
+
ent->value = buf + 6;
|
|
504
|
+
} else {
|
|
505
|
+
ent->value = NULL;
|
|
506
|
+
ent->nvalue = 0;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
*iter += (6 + vlen);
|
|
510
|
+
return 1;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
static int
|
|
514
|
+
sdmutate_next(const MemcachedResponse *response, lcb_SDENTRY *ent, size_t *iter)
|
|
515
|
+
{
|
|
516
|
+
const char *buf, *buf_end;
|
|
517
|
+
uint16_t rc;
|
|
518
|
+
uint32_t vlen;
|
|
519
|
+
|
|
520
|
+
if (*iter == response->vallen()) {
|
|
521
|
+
return 0;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
buf_end = (const char *)response->value() + response->vallen();
|
|
525
|
+
buf = ((const char *)(response->value())) + *iter;
|
|
526
|
+
|
|
527
|
+
#define ADVANCE_BUF(sz) \
|
|
528
|
+
buf += sz; \
|
|
529
|
+
*iter += sz; \
|
|
530
|
+
assert(buf <= buf_end); \
|
|
531
|
+
|
|
532
|
+
/* Index */
|
|
533
|
+
ent->index = *(lcb_U8*)buf;
|
|
534
|
+
ADVANCE_BUF(1);
|
|
535
|
+
|
|
536
|
+
/* Status */
|
|
537
|
+
memcpy(&rc, buf, 2);
|
|
538
|
+
ADVANCE_BUF(2);
|
|
539
|
+
|
|
540
|
+
rc = ntohs(rc);
|
|
541
|
+
ent->status = map_error(NULL, rc);
|
|
542
|
+
|
|
543
|
+
if (rc == PROTOCOL_BINARY_RESPONSE_SUCCESS) {
|
|
544
|
+
memcpy(&vlen, buf, 4);
|
|
545
|
+
ADVANCE_BUF(4);
|
|
546
|
+
|
|
547
|
+
vlen = ntohl(vlen);
|
|
548
|
+
ent->nvalue = vlen;
|
|
549
|
+
ent->value = buf;
|
|
550
|
+
ADVANCE_BUF(vlen);
|
|
551
|
+
|
|
552
|
+
} else {
|
|
553
|
+
ent->value = NULL;
|
|
554
|
+
ent->nvalue = 0;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
(void)buf_end;
|
|
558
|
+
return 1;
|
|
559
|
+
#undef ADVANCE_BUF
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
LIBCOUCHBASE_API
|
|
563
|
+
int
|
|
564
|
+
lcb_sdresult_next(const lcb_RESPSUBDOC *resp, lcb_SDENTRY *ent, size_t *iter)
|
|
565
|
+
{
|
|
566
|
+
size_t iter_s = 0;
|
|
567
|
+
const MemcachedResponse *response =
|
|
568
|
+
reinterpret_cast<const MemcachedResponse*>(resp->responses);
|
|
569
|
+
if (!response) {
|
|
570
|
+
return 0;
|
|
571
|
+
}
|
|
572
|
+
if (!iter) {
|
|
573
|
+
/* Single response */
|
|
574
|
+
iter = &iter_s;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
switch (response->opcode()) {
|
|
578
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_LOOKUP:
|
|
579
|
+
return sdlookup_next(response, ent, iter);
|
|
580
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_MUTATION:
|
|
581
|
+
return sdmutate_next(response, ent, iter);
|
|
582
|
+
default:
|
|
583
|
+
if (*iter) {
|
|
584
|
+
return 0;
|
|
585
|
+
}
|
|
586
|
+
*iter = 1;
|
|
587
|
+
|
|
588
|
+
if (resp->rc == LCB_SUCCESS || resp->rc == LCB_SUBDOC_MULTI_FAILURE) {
|
|
589
|
+
ent->status = map_error(NULL, response->status());
|
|
590
|
+
ent->value = response->value();
|
|
591
|
+
ent->nvalue = response->vallen();
|
|
592
|
+
ent->index = 0;
|
|
593
|
+
return 1;
|
|
594
|
+
} else {
|
|
595
|
+
return 0;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
static void
|
|
601
|
+
H_delete(mc_PIPELINE *pipeline, mc_PACKET *packet, MemcachedResponse *response,
|
|
602
|
+
lcb_error_t immerr)
|
|
603
|
+
{
|
|
604
|
+
lcb_t root = get_instance(pipeline);
|
|
605
|
+
ResponsePack<lcb_RESPREMOVE> w = { { 0 } };
|
|
606
|
+
w.resp.rflags |= LCB_RESP_F_EXTDATA | LCB_RESP_F_FINAL;
|
|
607
|
+
init_resp(root, response, packet, immerr, &w.resp);
|
|
608
|
+
handle_error_info(response, &w);
|
|
609
|
+
handle_mutation_token(root, response, packet, &w.mt);
|
|
610
|
+
LCBTRACE_KV_FINISH(pipeline, packet, response);
|
|
611
|
+
TRACE_REMOVE_END(root, packet, response, &w.resp);
|
|
612
|
+
invoke_callback(packet, root, &w.resp, LCB_CALLBACK_REMOVE);
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
static void
|
|
616
|
+
H_observe(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse *response,
|
|
617
|
+
lcb_error_t immerr)
|
|
618
|
+
{
|
|
619
|
+
lcb_t root = get_instance(pipeline);
|
|
620
|
+
uint32_t ttp;
|
|
621
|
+
uint32_t ttr;
|
|
622
|
+
size_t pos;
|
|
623
|
+
lcbvb_CONFIG* config;
|
|
624
|
+
const char *end, *ptr;
|
|
625
|
+
mc_REQDATAEX *rd = request->u_rdata.exdata;
|
|
626
|
+
lcb_RESPOBSERVE resp = { 0 };
|
|
627
|
+
make_error(root, &resp, response, immerr);
|
|
628
|
+
|
|
629
|
+
if (resp.rc != LCB_SUCCESS) {
|
|
630
|
+
if (! (request->flags & MCREQ_F_INVOKED)) {
|
|
631
|
+
rd->procs->handler(pipeline, request, resp.rc, NULL);
|
|
632
|
+
}
|
|
633
|
+
return;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
/** The CAS field is split into TTP/TTR values */
|
|
637
|
+
uint64_t tmpcas = lcb_htonll(response->cas());
|
|
638
|
+
ptr = reinterpret_cast<char*>(&tmpcas);
|
|
639
|
+
memcpy(&ttp, ptr, sizeof(ttp));
|
|
640
|
+
memcpy(&ttr, ptr + sizeof(ttp), sizeof(ttp));
|
|
641
|
+
|
|
642
|
+
ttp = ntohl(ttp);
|
|
643
|
+
ttr = ntohl(ttr);
|
|
644
|
+
|
|
645
|
+
/** Actual payload sequence of (vb, nkey, key). Repeats multiple times */
|
|
646
|
+
ptr = response->value();
|
|
647
|
+
end = ptr + response->vallen();
|
|
648
|
+
config = pipeline->parent->config;
|
|
649
|
+
|
|
650
|
+
for (pos = 0; ptr < end; pos++) {
|
|
651
|
+
uint64_t cas;
|
|
652
|
+
uint8_t obs;
|
|
653
|
+
uint16_t nkey, vb;
|
|
654
|
+
const char *key;
|
|
655
|
+
|
|
656
|
+
memcpy(&vb, ptr, sizeof(vb));
|
|
657
|
+
vb = ntohs(vb);
|
|
658
|
+
ptr += sizeof(vb);
|
|
659
|
+
memcpy(&nkey, ptr, sizeof(nkey));
|
|
660
|
+
nkey = ntohs(nkey);
|
|
661
|
+
ptr += sizeof(nkey);
|
|
662
|
+
key = (const char *)ptr;
|
|
663
|
+
ptr += nkey;
|
|
664
|
+
obs = *((lcb_uint8_t *)ptr);
|
|
665
|
+
ptr += sizeof(obs);
|
|
666
|
+
memcpy(&cas, ptr, sizeof(cas));
|
|
667
|
+
ptr += sizeof(cas);
|
|
668
|
+
|
|
669
|
+
resp.key = key;
|
|
670
|
+
resp.nkey = nkey;
|
|
671
|
+
resp.cas = lcb_ntohll(cas);
|
|
672
|
+
resp.status = obs;
|
|
673
|
+
resp.ismaster = pipeline->index == lcbvb_vbmaster(config, vb);
|
|
674
|
+
resp.ttp = ttp;
|
|
675
|
+
resp.ttr = ttr;
|
|
676
|
+
TRACE_OBSERVE_PROGRESS(root, request, response, &resp);
|
|
677
|
+
LCBTRACE_KV_FINISH(pipeline, request, response);
|
|
678
|
+
if (! (request->flags & MCREQ_F_INVOKED)) {
|
|
679
|
+
rd->procs->handler(pipeline, request, resp.rc, &resp);
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
static void
|
|
685
|
+
H_observe_seqno(mc_PIPELINE *pipeline, mc_PACKET *request,
|
|
686
|
+
MemcachedResponse *response, lcb_error_t immerr) {
|
|
687
|
+
lcb_t root = get_instance(pipeline);
|
|
688
|
+
lcb_RESPOBSEQNO resp = { 0 };
|
|
689
|
+
init_resp(root, response, request, immerr, &resp);
|
|
690
|
+
|
|
691
|
+
resp.server_index = pipeline->index;
|
|
692
|
+
|
|
693
|
+
if (resp.rc == LCB_SUCCESS) {
|
|
694
|
+
const uint8_t *data = reinterpret_cast<const uint8_t *>(response->value());
|
|
695
|
+
bool is_failover = *data != 0;
|
|
696
|
+
|
|
697
|
+
data++;
|
|
698
|
+
#define COPY_ADV(dstfld, n, conv_fn) \
|
|
699
|
+
memcpy(&resp.dstfld, data, n); \
|
|
700
|
+
data += n; \
|
|
701
|
+
resp.dstfld = conv_fn(resp.dstfld);
|
|
702
|
+
|
|
703
|
+
COPY_ADV(vbid, 2, ntohs);
|
|
704
|
+
COPY_ADV(cur_uuid, 8, lcb_ntohll);
|
|
705
|
+
COPY_ADV(persisted_seqno, 8, lcb_ntohll);
|
|
706
|
+
COPY_ADV(mem_seqno, 8, lcb_ntohll);
|
|
707
|
+
if (is_failover) {
|
|
708
|
+
COPY_ADV(old_uuid, 8, lcb_ntohll);
|
|
709
|
+
COPY_ADV(old_seqno, 8, lcb_ntohll);
|
|
710
|
+
}
|
|
711
|
+
#undef COPY_ADV
|
|
712
|
+
|
|
713
|
+
/* Get the server for this command. Note that since this is a successful
|
|
714
|
+
* operation, the server is never a dummy */
|
|
715
|
+
}
|
|
716
|
+
LCBTRACE_KV_FINISH(pipeline, request, response);
|
|
717
|
+
invoke_callback(request, root, &resp, LCB_CALLBACK_OBSEQNO);
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
static void
|
|
721
|
+
H_store(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse *response,
|
|
722
|
+
lcb_error_t immerr)
|
|
723
|
+
{
|
|
724
|
+
lcb_t root = get_instance(pipeline);
|
|
725
|
+
ResponsePack<lcb_RESPSTORE> w = { { 0 } };
|
|
726
|
+
uint8_t opcode;
|
|
727
|
+
init_resp(root, response, request, immerr, &w.resp);
|
|
728
|
+
handle_error_info(response, &w);
|
|
729
|
+
if (!immerr) {
|
|
730
|
+
opcode = response->opcode();
|
|
731
|
+
} else {
|
|
732
|
+
protocol_binary_request_header hdr;
|
|
733
|
+
mcreq_read_hdr(request, &hdr);
|
|
734
|
+
opcode = hdr.request.opcode;
|
|
735
|
+
}
|
|
736
|
+
if (opcode == PROTOCOL_BINARY_CMD_ADD) {
|
|
737
|
+
w.resp.op = LCB_ADD;
|
|
738
|
+
} else if (opcode == PROTOCOL_BINARY_CMD_REPLACE) {
|
|
739
|
+
w.resp.op = LCB_REPLACE;
|
|
740
|
+
} else if (opcode == PROTOCOL_BINARY_CMD_APPEND) {
|
|
741
|
+
w.resp.op = LCB_APPEND;
|
|
742
|
+
} else if (opcode == PROTOCOL_BINARY_CMD_PREPEND) {
|
|
743
|
+
w.resp.op = LCB_PREPEND;
|
|
744
|
+
} else if (opcode == PROTOCOL_BINARY_CMD_SET) {
|
|
745
|
+
w.resp.op = LCB_SET;
|
|
746
|
+
}
|
|
747
|
+
w.resp.rflags |= LCB_RESP_F_EXTDATA | LCB_RESP_F_FINAL;
|
|
748
|
+
handle_mutation_token(root, response, request, &w.mt);
|
|
749
|
+
TRACE_STORE_END(root, request, response, &w.resp);
|
|
750
|
+
if (request->flags & MCREQ_F_REQEXT) {
|
|
751
|
+
LCBTRACE_KV_COMPLETE(pipeline, request, response);
|
|
752
|
+
request->u_rdata.exdata->procs->handler(pipeline, request, immerr, &w.resp);
|
|
753
|
+
} else {
|
|
754
|
+
LCBTRACE_KV_FINISH(pipeline, request, response);
|
|
755
|
+
invoke_callback(request, root, &w.resp, LCB_CALLBACK_STORE);
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
static void
|
|
760
|
+
H_arithmetic(mc_PIPELINE *pipeline, mc_PACKET *request,
|
|
761
|
+
MemcachedResponse *response, lcb_error_t immerr)
|
|
762
|
+
{
|
|
763
|
+
lcb_t root = get_instance(pipeline);
|
|
764
|
+
ResponsePack<lcb_RESPCOUNTER> w = { { 0 } };
|
|
765
|
+
init_resp(root, response, request, immerr, &w.resp);
|
|
766
|
+
|
|
767
|
+
if (w.resp.rc == LCB_SUCCESS) {
|
|
768
|
+
memcpy(&w.resp.value, response->value(), sizeof(w.resp.value));
|
|
769
|
+
w.resp.value = lcb_ntohll(w.resp.value);
|
|
770
|
+
w.resp.rflags |= LCB_RESP_F_EXTDATA;
|
|
771
|
+
handle_mutation_token(root, response, request, &w.mt);
|
|
772
|
+
} else {
|
|
773
|
+
handle_error_info(response, &w);
|
|
774
|
+
}
|
|
775
|
+
w.resp.rflags |= LCB_RESP_F_FINAL;
|
|
776
|
+
w.resp.cas = response->cas();
|
|
777
|
+
LCBTRACE_KV_FINISH(pipeline, request, response);
|
|
778
|
+
TRACE_ARITHMETIC_END(root, request, response, &w.resp);
|
|
779
|
+
invoke_callback(request, root, &w.resp, LCB_CALLBACK_COUNTER);
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
static void
|
|
783
|
+
H_stats(mc_PIPELINE *pipeline, mc_PACKET *request,
|
|
784
|
+
MemcachedResponse *response, lcb_error_t immerr)
|
|
785
|
+
{
|
|
786
|
+
lcb_t root = get_instance(pipeline);
|
|
787
|
+
lcb_RESPSTATS resp = { 0 };
|
|
788
|
+
mc_REQDATAEX *exdata;
|
|
789
|
+
|
|
790
|
+
make_error(root, &resp, response, immerr);
|
|
791
|
+
resp.version = 0;
|
|
792
|
+
|
|
793
|
+
exdata = request->u_rdata.exdata;
|
|
794
|
+
if (resp.rc != LCB_SUCCESS || response->keylen() == 0) {
|
|
795
|
+
/* Call the handler without a response, this indicates that this server
|
|
796
|
+
* has finished responding */
|
|
797
|
+
exdata->procs->handler(pipeline, request, resp.rc, NULL);
|
|
798
|
+
return;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
if ((resp.nkey = response->keylen())) {
|
|
802
|
+
resp.key = response->key();
|
|
803
|
+
if ((resp.value = response->value())) {
|
|
804
|
+
resp.nvalue = response->vallen();
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
exdata->procs->handler(pipeline, request, resp.rc, &resp);
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
static void
|
|
812
|
+
H_verbosity(mc_PIPELINE *pipeline, mc_PACKET *request,
|
|
813
|
+
MemcachedResponse *response, lcb_error_t immerr)
|
|
814
|
+
{
|
|
815
|
+
lcb_t root = get_instance(pipeline);
|
|
816
|
+
lcb_RESPBASE dummy = { 0 };
|
|
817
|
+
mc_REQDATAEX *exdata = request->u_rdata.exdata;
|
|
818
|
+
make_error(root, &dummy, response, immerr);
|
|
819
|
+
|
|
820
|
+
exdata->procs->handler(pipeline, request, dummy.rc, NULL);
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
static void
|
|
824
|
+
H_version(mc_PIPELINE *pipeline, mc_PACKET *request,
|
|
825
|
+
MemcachedResponse *response, lcb_error_t immerr)
|
|
826
|
+
{
|
|
827
|
+
lcb_t root = get_instance(pipeline);
|
|
828
|
+
lcb_RESPMCVERSION resp = { 0 };
|
|
829
|
+
mc_REQDATAEX *exdata = request->u_rdata.exdata;
|
|
830
|
+
|
|
831
|
+
make_error(root, &resp, response, immerr);
|
|
832
|
+
|
|
833
|
+
if (response->vallen()) {
|
|
834
|
+
resp.mcversion = response->value();
|
|
835
|
+
resp.nversion = response->vallen();
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
|
|
839
|
+
exdata->procs->handler(pipeline, request, resp.rc, &resp);
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
static void
|
|
843
|
+
H_noop(mc_PIPELINE *pipeline, mc_PACKET *request,
|
|
844
|
+
MemcachedResponse *response, lcb_error_t immerr)
|
|
845
|
+
{
|
|
846
|
+
lcb_t root = get_instance(pipeline);
|
|
847
|
+
lcb_RESPNOOP resp = { 0 };
|
|
848
|
+
mc_REQDATAEX *exdata = request->u_rdata.exdata;
|
|
849
|
+
|
|
850
|
+
make_error(root, &resp, response, immerr);
|
|
851
|
+
|
|
852
|
+
exdata->procs->handler(pipeline, request, resp.rc, &resp);
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
static void
|
|
856
|
+
H_touch(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse *response,
|
|
857
|
+
lcb_error_t immerr)
|
|
858
|
+
{
|
|
859
|
+
lcb_t root = get_instance(pipeline);
|
|
860
|
+
ResponsePack<lcb_RESPTOUCH> w = {{ 0 }};
|
|
861
|
+
lcb_RESPTOUCH& resp = w.resp;
|
|
862
|
+
init_resp(root, response, request, immerr, &resp);
|
|
863
|
+
handle_error_info(response, &w);
|
|
864
|
+
resp.rflags |= LCB_RESP_F_FINAL;
|
|
865
|
+
LCBTRACE_KV_FINISH(pipeline, request, response);
|
|
866
|
+
TRACE_TOUCH_END(root, request, response, &resp);
|
|
867
|
+
invoke_callback(request, root, &resp, LCB_CALLBACK_TOUCH);
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
static void
|
|
871
|
+
H_flush(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse *response,
|
|
872
|
+
lcb_error_t immerr)
|
|
873
|
+
{
|
|
874
|
+
lcb_t root = get_instance(pipeline);
|
|
875
|
+
lcb_RESPFLUSH resp = { 0 };
|
|
876
|
+
mc_REQDATAEX *exdata = request->u_rdata.exdata;
|
|
877
|
+
make_error(root, &resp, response, immerr);
|
|
878
|
+
exdata->procs->handler(pipeline, request, resp.rc, &resp);
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
static void
|
|
882
|
+
H_unlock(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse *response,
|
|
883
|
+
lcb_error_t immerr)
|
|
884
|
+
{
|
|
885
|
+
lcb_t root = get_instance(pipeline);
|
|
886
|
+
ResponsePack<lcb_RESPUNLOCK> w = {{ 0 }};
|
|
887
|
+
lcb_RESPUNLOCK& resp = w.resp;
|
|
888
|
+
init_resp(root, response, request, immerr, &resp);
|
|
889
|
+
handle_error_info(response, &w);
|
|
890
|
+
resp.rflags |= LCB_RESP_F_FINAL;
|
|
891
|
+
LCBTRACE_KV_FINISH(pipeline, request, response);
|
|
892
|
+
TRACE_UNLOCK_END(root, request, response, &resp);
|
|
893
|
+
invoke_callback(request, root, &resp, LCB_CALLBACK_UNLOCK);
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
static void
|
|
897
|
+
H_config(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse *response,
|
|
898
|
+
lcb_error_t immerr)
|
|
899
|
+
{
|
|
900
|
+
/** We just jump to the normal config handler */
|
|
901
|
+
lcb_RESPBASE dummy = {0};
|
|
902
|
+
mc_REQDATAEX *exdata = request->u_rdata.exdata;
|
|
903
|
+
make_error(get_instance(pipeline), &dummy, response, immerr);
|
|
904
|
+
|
|
905
|
+
exdata->procs->handler(pipeline, request, dummy.rc, response);
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
static void
|
|
909
|
+
record_metrics(mc_PIPELINE *pipeline, mc_PACKET *req, MemcachedResponse *)
|
|
910
|
+
{
|
|
911
|
+
lcb_t instance = get_instance(pipeline);
|
|
912
|
+
if (
|
|
913
|
+
#ifdef HAVE_DTRACE
|
|
914
|
+
1
|
|
915
|
+
#else
|
|
916
|
+
instance->kv_timings
|
|
917
|
+
#endif
|
|
918
|
+
) {
|
|
919
|
+
MCREQ_PKT_RDATA(req)->dispatch = gethrtime();
|
|
920
|
+
}
|
|
921
|
+
if (instance->kv_timings) {
|
|
922
|
+
lcb_histogram_record(instance->kv_timings, MCREQ_PKT_RDATA(req)->dispatch - MCREQ_PKT_RDATA(req)->start);
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
static void
|
|
927
|
+
dispatch_ufwd_error(mc_PIPELINE *pipeline, mc_PACKET *req, lcb_error_t immerr)
|
|
928
|
+
{
|
|
929
|
+
lcb_PKTFWDRESP resp = { 0 };
|
|
930
|
+
lcb_t instance = static_cast<lcb::Server*>(pipeline)->get_instance();
|
|
931
|
+
assert(immerr != LCB_SUCCESS);
|
|
932
|
+
resp.version = 0;
|
|
933
|
+
instance->callbacks.pktfwd(instance, MCREQ_PKT_COOKIE(req), immerr, &resp);
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
int
|
|
937
|
+
mcreq_dispatch_response(
|
|
938
|
+
mc_PIPELINE *pipeline, mc_PACKET *req, MemcachedResponse *res,
|
|
939
|
+
lcb_error_t immerr)
|
|
940
|
+
{
|
|
941
|
+
record_metrics(pipeline, req, res);
|
|
942
|
+
|
|
943
|
+
if (req->flags & MCREQ_F_UFWD) {
|
|
944
|
+
dispatch_ufwd_error(pipeline, req, immerr);
|
|
945
|
+
return 0;
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
|
|
949
|
+
#define INVOKE_OP(handler) \
|
|
950
|
+
handler(pipeline, req, res, immerr); \
|
|
951
|
+
return 0; \
|
|
952
|
+
break;
|
|
953
|
+
|
|
954
|
+
switch (res->opcode()) {
|
|
955
|
+
case PROTOCOL_BINARY_CMD_GET:
|
|
956
|
+
case PROTOCOL_BINARY_CMD_GAT:
|
|
957
|
+
case PROTOCOL_BINARY_CMD_GET_LOCKED:
|
|
958
|
+
INVOKE_OP(H_get);
|
|
959
|
+
|
|
960
|
+
case PROTOCOL_BINARY_CMD_ADD:
|
|
961
|
+
case PROTOCOL_BINARY_CMD_REPLACE:
|
|
962
|
+
case PROTOCOL_BINARY_CMD_SET:
|
|
963
|
+
case PROTOCOL_BINARY_CMD_APPEND:
|
|
964
|
+
case PROTOCOL_BINARY_CMD_PREPEND:
|
|
965
|
+
INVOKE_OP(H_store);
|
|
966
|
+
|
|
967
|
+
case PROTOCOL_BINARY_CMD_INCREMENT:
|
|
968
|
+
case PROTOCOL_BINARY_CMD_DECREMENT:
|
|
969
|
+
INVOKE_OP(H_arithmetic);
|
|
970
|
+
|
|
971
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_GET:
|
|
972
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_EXISTS:
|
|
973
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_ADD_UNIQUE:
|
|
974
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_PUSH_FIRST:
|
|
975
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_PUSH_LAST:
|
|
976
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_INSERT:
|
|
977
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_DICT_ADD:
|
|
978
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_DICT_UPSERT:
|
|
979
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_REPLACE:
|
|
980
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_DELETE:
|
|
981
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_COUNTER:
|
|
982
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_GET_COUNT:
|
|
983
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_LOOKUP:
|
|
984
|
+
case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_MUTATION:
|
|
985
|
+
INVOKE_OP(H_subdoc);
|
|
986
|
+
|
|
987
|
+
case PROTOCOL_BINARY_CMD_OBSERVE:
|
|
988
|
+
INVOKE_OP(H_observe);
|
|
989
|
+
|
|
990
|
+
case PROTOCOL_BINARY_CMD_GET_REPLICA:
|
|
991
|
+
INVOKE_OP(H_getreplica);
|
|
992
|
+
|
|
993
|
+
case PROTOCOL_BINARY_CMD_UNLOCK_KEY:
|
|
994
|
+
INVOKE_OP(H_unlock);
|
|
995
|
+
|
|
996
|
+
case PROTOCOL_BINARY_CMD_DELETE:
|
|
997
|
+
INVOKE_OP(H_delete);
|
|
998
|
+
|
|
999
|
+
case PROTOCOL_BINARY_CMD_TOUCH:
|
|
1000
|
+
INVOKE_OP(H_touch);
|
|
1001
|
+
|
|
1002
|
+
case PROTOCOL_BINARY_CMD_OBSERVE_SEQNO:
|
|
1003
|
+
INVOKE_OP(H_observe_seqno);
|
|
1004
|
+
|
|
1005
|
+
case PROTOCOL_BINARY_CMD_STAT:
|
|
1006
|
+
INVOKE_OP(H_stats);
|
|
1007
|
+
|
|
1008
|
+
case PROTOCOL_BINARY_CMD_FLUSH:
|
|
1009
|
+
INVOKE_OP(H_flush);
|
|
1010
|
+
|
|
1011
|
+
case PROTOCOL_BINARY_CMD_VERSION:
|
|
1012
|
+
INVOKE_OP(H_version);
|
|
1013
|
+
|
|
1014
|
+
case PROTOCOL_BINARY_CMD_VERBOSITY:
|
|
1015
|
+
INVOKE_OP(H_verbosity);
|
|
1016
|
+
|
|
1017
|
+
case PROTOCOL_BINARY_CMD_NOOP:
|
|
1018
|
+
INVOKE_OP(H_noop);
|
|
1019
|
+
|
|
1020
|
+
case PROTOCOL_BINARY_CMD_GET_CLUSTER_CONFIG:
|
|
1021
|
+
INVOKE_OP(H_config);
|
|
1022
|
+
|
|
1023
|
+
default:
|
|
1024
|
+
fprintf(stderr, "COUCHBASE: Received unknown opcode=0x%x\n", res->opcode());
|
|
1025
|
+
return -1;
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
const lcb_MUTATION_TOKEN *
|
|
1030
|
+
lcb_resp_get_mutation_token(int cbtype, const lcb_RESPBASE *rb)
|
|
1031
|
+
{
|
|
1032
|
+
const lcb_MUTATION_TOKEN *ss = NULL;
|
|
1033
|
+
if ((rb->rflags & LCB_RESP_F_EXTDATA) == 0) {
|
|
1034
|
+
return NULL;
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
switch (cbtype) {
|
|
1038
|
+
case LCB_CALLBACK_STORE:
|
|
1039
|
+
ss = ResponsePack<lcb_RESPSTORE>::get_mt(rb);
|
|
1040
|
+
break;
|
|
1041
|
+
|
|
1042
|
+
case LCB_CALLBACK_COUNTER:
|
|
1043
|
+
ss = ResponsePack<lcb_RESPCOUNTER>::get_mt(rb);
|
|
1044
|
+
break;
|
|
1045
|
+
|
|
1046
|
+
case LCB_CALLBACK_REMOVE:
|
|
1047
|
+
ss = ResponsePack<lcb_RESPREMOVE>::get_mt(rb);
|
|
1048
|
+
break;
|
|
1049
|
+
|
|
1050
|
+
case LCB_CALLBACK_SDMUTATE:
|
|
1051
|
+
ss = ResponsePack<lcb_RESPSUBDOC>::get_mt(rb);
|
|
1052
|
+
break;
|
|
1053
|
+
|
|
1054
|
+
default:
|
|
1055
|
+
return NULL;
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
if (ss->uuid_ == 0 && ss->seqno_ == 0) {
|
|
1059
|
+
return NULL;
|
|
1060
|
+
}
|
|
1061
|
+
return ss;
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
#define ERRINFO_CALLBACKS(X) \
|
|
1065
|
+
X(LCB_CALLBACK_GET, lcb_RESPGET) \
|
|
1066
|
+
X(LCB_CALLBACK_STORE, lcb_RESPSTORE) \
|
|
1067
|
+
X(LCB_CALLBACK_COUNTER, lcb_RESPCOUNTER) \
|
|
1068
|
+
X(LCB_CALLBACK_TOUCH, lcb_RESPTOUCH) \
|
|
1069
|
+
X(LCB_CALLBACK_REMOVE, lcb_RESPREMOVE) \
|
|
1070
|
+
X(LCB_CALLBACK_UNLOCK, lcb_RESPUNLOCK) \
|
|
1071
|
+
X(LCB_CALLBACK_SDLOOKUP, lcb_RESPSUBDOC) \
|
|
1072
|
+
X(LCB_CALLBACK_SDMUTATE, lcb_RESPSUBDOC) \
|
|
1073
|
+
|
|
1074
|
+
|
|
1075
|
+
LIBCOUCHBASE_API
|
|
1076
|
+
const char *
|
|
1077
|
+
lcb_resp_get_error_context(int cbtype, const lcb_RESPBASE *rb)
|
|
1078
|
+
{
|
|
1079
|
+
if ((rb->rflags & LCB_RESP_F_ERRINFO) == 0) {
|
|
1080
|
+
return NULL;
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
#define X(CBTYPE, RESP) if (cbtype == CBTYPE) { return ResponsePack<RESP>::get_err_ctx(rb); }
|
|
1084
|
+
ERRINFO_CALLBACKS(X);
|
|
1085
|
+
#undef X
|
|
1086
|
+
return NULL;
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
LIBCOUCHBASE_API
|
|
1090
|
+
const char *
|
|
1091
|
+
lcb_resp_get_error_ref(int cbtype, const lcb_RESPBASE *rb)
|
|
1092
|
+
{
|
|
1093
|
+
if ((rb->rflags & LCB_RESP_F_ERRINFO) == 0) {
|
|
1094
|
+
return NULL;
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
#define X(CBTYPE, RESP) if (cbtype == CBTYPE) { return ResponsePack<RESP>::get_err_ref(rb); }
|
|
1098
|
+
ERRINFO_CALLBACKS(X);
|
|
1099
|
+
#undef X
|
|
1100
|
+
return NULL;
|
|
1101
|
+
}
|