libcouchbase 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.gitmodules +3 -0
- data/.rspec +1 -0
- data/.travis.yml +35 -0
- data/Gemfile +4 -0
- data/LICENSE +24 -0
- data/README.md +389 -0
- data/Rakefile +75 -0
- data/ext/README.md +6 -0
- data/ext/Rakefile +20 -0
- data/ext/libcouchbase/.gitignore +130 -0
- data/ext/libcouchbase/.travis.yml +19 -0
- data/ext/libcouchbase/CMakeLists.txt +429 -0
- data/ext/libcouchbase/CONTRIBUTING.md +124 -0
- data/ext/libcouchbase/LICENSE +202 -0
- data/ext/libcouchbase/README.markdown +163 -0
- data/ext/libcouchbase/RELEASE_NOTES.markdown +2691 -0
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +27 -0
- data/ext/libcouchbase/cmake/Modules/CopyPDB.cmake +42 -0
- data/ext/libcouchbase/cmake/Modules/DistScript.cmake +17 -0
- data/ext/libcouchbase/cmake/Modules/DownloadLcbDep.cmake +20 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseHdrHistogram.cmake +15 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibev.cmake +73 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +52 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +56 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseSnappy.cmake +11 -0
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +29 -0
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +133 -0
- data/ext/libcouchbase/cmake/Modules/GetPlatformCCInfo.cmake +45 -0
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +70 -0
- data/ext/libcouchbase/cmake/config-cmake.h.in +60 -0
- data/ext/libcouchbase/cmake/configure +357 -0
- data/ext/libcouchbase/cmake/defs.mk.in +8 -0
- data/ext/libcouchbase/cmake/dtrace-instr-link.pl +38 -0
- data/ext/libcouchbase/cmake/source_files.cmake +73 -0
- data/ext/libcouchbase/configure.pl +1 -0
- data/ext/libcouchbase/contrib/cJSON/cJSON.c +624 -0
- data/ext/libcouchbase/contrib/cJSON/cJSON.h +158 -0
- data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +9 -0
- data/ext/libcouchbase/contrib/cbsasl/COPYING +202 -0
- data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +217 -0
- data/ext/libcouchbase/contrib/cbsasl/src/client.c +205 -0
- data/ext/libcouchbase/contrib/cbsasl/src/common.c +46 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.c +67 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.h +33 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.c +296 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.h +45 -0
- data/ext/libcouchbase/contrib/cbsasl/src/hash.c +573 -0
- data/ext/libcouchbase/contrib/cbsasl/src/hash.h +15 -0
- data/ext/libcouchbase/contrib/cbsasl/src/util.h +31 -0
- data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +2 -0
- data/ext/libcouchbase/contrib/cliopts/cliopts.c +747 -0
- data/ext/libcouchbase/contrib/cliopts/cliopts.h +493 -0
- data/ext/libcouchbase/contrib/genhash/genhash.c +372 -0
- data/ext/libcouchbase/contrib/genhash/genhash.h +235 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CHANGES +157 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CMakeLists.txt +252 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CONTRIBUTORS +37 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/LICENSE +28 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/MINIFY.sh +15 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/README +435 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/cmake/internal_utils.cmake +227 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h +294 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-message.h +250 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h +1421 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump +487 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-printers.h +855 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-spi.h +232 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h +179 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h +259 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest.h +2291 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h +358 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_prod.h +58 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h +319 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h +206 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h +1158 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h +5143 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h +619 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h +1947 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h +167 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h +1012 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump +339 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h +3331 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump +297 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-all.cc +48 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-death-test.cc +1344 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-filepath.cc +382 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-internal-inl.h +1218 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-port.cc +805 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-printers.cc +363 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-test-part.cc +110 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-typed-test.cc +110 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest.cc +5015 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest_main.cc +38 -0
- data/ext/libcouchbase/contrib/http_parser/LICENSE-MIT +23 -0
- data/ext/libcouchbase/contrib/http_parser/README.md +178 -0
- data/ext/libcouchbase/contrib/http_parser/http_parser.c +2060 -0
- data/ext/libcouchbase/contrib/http_parser/http_parser.h +321 -0
- data/ext/libcouchbase/contrib/jsonsl/LICENSE +20 -0
- data/ext/libcouchbase/contrib/jsonsl/jsonsl.c +1452 -0
- data/ext/libcouchbase/contrib/jsonsl/jsonsl.h +971 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/CMakeLists.txt +6 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/LICENSE +55 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp-forwards.h +255 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +4892 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.h +1961 -0
- data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +8 -0
- data/ext/libcouchbase/contrib/snappy/COPYING +28 -0
- data/ext/libcouchbase/contrib/snappy/snappy-c.cc +90 -0
- data/ext/libcouchbase/contrib/snappy/snappy-c.h +138 -0
- data/ext/libcouchbase/contrib/snappy/snappy-internal.h +150 -0
- data/ext/libcouchbase/contrib/snappy/snappy-lcb-msvc.h +5 -0
- data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +71 -0
- data/ext/libcouchbase/contrib/snappy/snappy-sinksource.h +137 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.cc +42 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.h +491 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +98 -0
- data/ext/libcouchbase/contrib/snappy/snappy.cc +1307 -0
- data/ext/libcouchbase/contrib/snappy/snappy.h +184 -0
- data/ext/libcouchbase/contrib/win32-defs/iocpdefs.h +133 -0
- data/ext/libcouchbase/contrib/win32-defs/mingwdefs.h +4396 -0
- data/ext/libcouchbase/contrib/win32-defs/win_stdint.h +258 -0
- data/ext/libcouchbase/example/CMakeLists.txt +37 -0
- data/ext/libcouchbase/example/README.markdown +47 -0
- data/ext/libcouchbase/example/db/db.c +167 -0
- data/ext/libcouchbase/example/db/vb.c +227 -0
- data/ext/libcouchbase/example/instancepool/main.cc +102 -0
- data/ext/libcouchbase/example/instancepool/pool.cc +102 -0
- data/ext/libcouchbase/example/instancepool/pool.h +69 -0
- data/ext/libcouchbase/example/libeventdirect/main.c +148 -0
- data/ext/libcouchbase/example/mcc/mcc.cc +246 -0
- data/ext/libcouchbase/example/minimal/minimal.c +130 -0
- data/ext/libcouchbase/example/observe/observe.c +146 -0
- data/ext/libcouchbase/example/subdoc/subdoc-multi.cc +132 -0
- data/ext/libcouchbase/example/subdoc/subdoc-simple.cc +191 -0
- data/ext/libcouchbase/example/tick/tick.c +119 -0
- data/ext/libcouchbase/example/views/views-example.cc +83 -0
- data/ext/libcouchbase/include/libcouchbase/_cxxwrap.h +150 -0
- data/ext/libcouchbase/include/libcouchbase/api-legacy.h +1689 -0
- data/ext/libcouchbase/include/libcouchbase/api3.h +2 -0
- data/ext/libcouchbase/include/libcouchbase/assert.h +44 -0
- data/ext/libcouchbase/include/libcouchbase/cbft.h +109 -0
- data/ext/libcouchbase/include/libcouchbase/cntl-private.h +356 -0
- data/ext/libcouchbase/include/libcouchbase/cntl.h +937 -0
- data/ext/libcouchbase/include/libcouchbase/configuration.h.in +23 -0
- data/ext/libcouchbase/include/libcouchbase/couchbase.h +3677 -0
- data/ext/libcouchbase/include/libcouchbase/deprecated.h +300 -0
- data/ext/libcouchbase/include/libcouchbase/error.h +595 -0
- data/ext/libcouchbase/include/libcouchbase/http.h +1 -0
- data/ext/libcouchbase/include/libcouchbase/iops.h +1050 -0
- data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +263 -0
- data/ext/libcouchbase/include/libcouchbase/kvbuf.h +132 -0
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +364 -0
- data/ext/libcouchbase/include/libcouchbase/pktfwd.h +270 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +367 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr-inl.c +76 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr.h +199 -0
- data/ext/libcouchbase/include/libcouchbase/subdoc.h +312 -0
- data/ext/libcouchbase/include/libcouchbase/sysdefs.h +98 -0
- data/ext/libcouchbase/include/libcouchbase/vbucket.h +643 -0
- data/ext/libcouchbase/include/libcouchbase/views.h +298 -0
- data/ext/libcouchbase/include/libcouchbase/visibility.h +65 -0
- data/ext/libcouchbase/include/memcached/COPYING +30 -0
- data/ext/libcouchbase/include/memcached/README +10 -0
- data/ext/libcouchbase/include/memcached/protocol_binary.h +1916 -0
- data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
- data/ext/libcouchbase/packaging/README +7 -0
- data/ext/libcouchbase/packaging/abicheck/.gitignore +4 -0
- data/ext/libcouchbase/packaging/abicheck/Makefile +17 -0
- data/ext/libcouchbase/packaging/abicheck/README.md +27 -0
- data/ext/libcouchbase/packaging/abicheck/template.xml +3 -0
- data/ext/libcouchbase/packaging/deb/compat +1 -0
- data/ext/libcouchbase/packaging/deb/control +73 -0
- data/ext/libcouchbase/packaging/deb/copyright +10 -0
- data/ext/libcouchbase/packaging/deb/libcouchbase-dev.docs +3 -0
- data/ext/libcouchbase/packaging/deb/package.mk +31 -0
- data/ext/libcouchbase/packaging/deb/rules +46 -0
- data/ext/libcouchbase/packaging/deb/source/format +1 -0
- data/ext/libcouchbase/packaging/distinfo/README +1 -0
- data/ext/libcouchbase/packaging/distinfo/distinfo.cmake.in +4 -0
- data/ext/libcouchbase/packaging/dllversion.rc.in +39 -0
- data/ext/libcouchbase/packaging/libcouchbase.pc.in +10 -0
- data/ext/libcouchbase/packaging/nuget/libcouchbase.autopkg +76 -0
- data/ext/libcouchbase/packaging/parse-git-describe.pl +166 -0
- data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +108 -0
- data/ext/libcouchbase/packaging/rpm/package.mk +40 -0
- data/ext/libcouchbase/plugins/io/iocp/CMakeLists.txt +9 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_iops.c +466 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_iops.h +217 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_loop.c +295 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_timer.c +79 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_util.c +229 -0
- data/ext/libcouchbase/plugins/io/libev/CMakeLists.txt +29 -0
- data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +65 -0
- data/ext/libcouchbase/plugins/io/libev/plugin-libev.c +289 -0
- data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +29 -0
- data/ext/libcouchbase/plugins/io/libevent/libevent_io_opts.h +67 -0
- data/ext/libcouchbase/plugins/io/libevent/plugin-libevent.c +292 -0
- data/ext/libcouchbase/plugins/io/libuv/CMakeLists.txt +42 -0
- data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +212 -0
- data/ext/libcouchbase/plugins/io/libuv/libuv_io_opts.h +118 -0
- data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +148 -0
- data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +648 -0
- data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +11 -0
- data/ext/libcouchbase/plugins/io/select/plugin-select.c +448 -0
- data/ext/libcouchbase/plugins/io/select/select_io_opts.h +39 -0
- data/ext/libcouchbase/src/README.md +103 -0
- data/ext/libcouchbase/src/aspend.h +106 -0
- data/ext/libcouchbase/src/auth.cc +74 -0
- data/ext/libcouchbase/src/auth.h +54 -0
- data/ext/libcouchbase/src/bootstrap.c +269 -0
- data/ext/libcouchbase/src/bootstrap.h +129 -0
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +495 -0
- data/ext/libcouchbase/src/bucketconfig/bc_file.c +347 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.c +630 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.h +82 -0
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +681 -0
- data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
- data/ext/libcouchbase/src/callbacks.c +378 -0
- data/ext/libcouchbase/src/cbft.cc +210 -0
- data/ext/libcouchbase/src/cntl.cc +847 -0
- data/ext/libcouchbase/src/config_static.h +159 -0
- data/ext/libcouchbase/src/connspec.cc +462 -0
- data/ext/libcouchbase/src/connspec.h +105 -0
- data/ext/libcouchbase/src/ctx-log-inl.h +27 -0
- data/ext/libcouchbase/src/dump.c +98 -0
- data/ext/libcouchbase/src/getconfig.c +100 -0
- data/ext/libcouchbase/src/gethrtime.c +109 -0
- data/ext/libcouchbase/src/handler.c +922 -0
- data/ext/libcouchbase/src/hashset.c +164 -0
- data/ext/libcouchbase/src/hashset.h +86 -0
- data/ext/libcouchbase/src/hashtable.c +75 -0
- data/ext/libcouchbase/src/hdr_timings.c +92 -0
- data/ext/libcouchbase/src/hostlist.cc +301 -0
- data/ext/libcouchbase/src/hostlist.h +171 -0
- data/ext/libcouchbase/src/http/http-priv.h +307 -0
- data/ext/libcouchbase/src/http/http.cc +633 -0
- data/ext/libcouchbase/src/http/http.h +34 -0
- data/ext/libcouchbase/src/http/http_io.cc +307 -0
- data/ext/libcouchbase/src/instance.cc +722 -0
- data/ext/libcouchbase/src/internal.h +244 -0
- data/ext/libcouchbase/src/iofactory.c +575 -0
- data/ext/libcouchbase/src/jsparse/parser.cc +519 -0
- data/ext/libcouchbase/src/jsparse/parser.h +173 -0
- data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
- data/ext/libcouchbase/src/lcbht/lcbht.h +199 -0
- data/ext/libcouchbase/src/lcbio/connect.c +557 -0
- data/ext/libcouchbase/src/lcbio/connect.h +364 -0
- data/ext/libcouchbase/src/lcbio/ctx.c +611 -0
- data/ext/libcouchbase/src/lcbio/ctx.h +405 -0
- data/ext/libcouchbase/src/lcbio/iotable.c +290 -0
- data/ext/libcouchbase/src/lcbio/iotable.h +84 -0
- data/ext/libcouchbase/src/lcbio/ioutils.c +350 -0
- data/ext/libcouchbase/src/lcbio/ioutils.h +203 -0
- data/ext/libcouchbase/src/lcbio/lcbio.h +51 -0
- data/ext/libcouchbase/src/lcbio/manager.c +584 -0
- data/ext/libcouchbase/src/lcbio/manager.h +156 -0
- data/ext/libcouchbase/src/lcbio/protoctx.c +84 -0
- data/ext/libcouchbase/src/lcbio/rw-inl.h +115 -0
- data/ext/libcouchbase/src/lcbio/ssl.h +149 -0
- data/ext/libcouchbase/src/lcbio/timer-ng.h +179 -0
- data/ext/libcouchbase/src/lcbio/timer.c +132 -0
- data/ext/libcouchbase/src/legacy.c +430 -0
- data/ext/libcouchbase/src/list.c +144 -0
- data/ext/libcouchbase/src/list.h +127 -0
- data/ext/libcouchbase/src/logging.c +244 -0
- data/ext/libcouchbase/src/logging.h +86 -0
- data/ext/libcouchbase/src/mc/compress.c +90 -0
- data/ext/libcouchbase/src/mc/compress.h +61 -0
- data/ext/libcouchbase/src/mc/forward.c +186 -0
- data/ext/libcouchbase/src/mc/forward.h +90 -0
- data/ext/libcouchbase/src/mc/iovcursor-inl.h +279 -0
- data/ext/libcouchbase/src/mc/iovcursor.h +66 -0
- data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +111 -0
- data/ext/libcouchbase/src/mc/mcreq.c +954 -0
- data/ext/libcouchbase/src/mc/mcreq.h +977 -0
- data/ext/libcouchbase/src/mcserver/mcserver.c +784 -0
- data/ext/libcouchbase/src/mcserver/mcserver.h +121 -0
- data/ext/libcouchbase/src/mcserver/negotiate.c +656 -0
- data/ext/libcouchbase/src/mcserver/negotiate.h +119 -0
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +860 -0
- data/ext/libcouchbase/src/n1ql/n1ql-internal.h +22 -0
- data/ext/libcouchbase/src/n1ql/n1ql.cc +729 -0
- data/ext/libcouchbase/src/n1ql/params.cc +215 -0
- data/ext/libcouchbase/src/netbuf/netbuf-defs.h +89 -0
- data/ext/libcouchbase/src/netbuf/netbuf-mblock.h +235 -0
- data/ext/libcouchbase/src/netbuf/netbuf.c +929 -0
- data/ext/libcouchbase/src/netbuf/netbuf.h +452 -0
- data/ext/libcouchbase/src/newconfig.c +385 -0
- data/ext/libcouchbase/src/nodeinfo.cc +194 -0
- data/ext/libcouchbase/src/operations/cbflush.c +71 -0
- data/ext/libcouchbase/src/operations/counter.c +116 -0
- data/ext/libcouchbase/src/operations/durability-cas.c +224 -0
- data/ext/libcouchbase/src/operations/durability-seqno.c +157 -0
- data/ext/libcouchbase/src/operations/durability.c +668 -0
- data/ext/libcouchbase/src/operations/durability_internal.h +199 -0
- data/ext/libcouchbase/src/operations/get.c +409 -0
- data/ext/libcouchbase/src/operations/observe-seqno.c +96 -0
- data/ext/libcouchbase/src/operations/observe.c +340 -0
- data/ext/libcouchbase/src/operations/pktfwd.c +86 -0
- data/ext/libcouchbase/src/operations/remove.c +83 -0
- data/ext/libcouchbase/src/operations/stats.c +461 -0
- data/ext/libcouchbase/src/operations/store.c +360 -0
- data/ext/libcouchbase/src/operations/subdoc.cc +510 -0
- data/ext/libcouchbase/src/operations/touch.c +81 -0
- data/ext/libcouchbase/src/packetutils.c +60 -0
- data/ext/libcouchbase/src/packetutils.h +147 -0
- data/ext/libcouchbase/src/probes.d +211 -0
- data/ext/libcouchbase/src/rdb/bigalloc.c +225 -0
- data/ext/libcouchbase/src/rdb/bigalloc.h +73 -0
- data/ext/libcouchbase/src/rdb/chunkalloc.c +174 -0
- data/ext/libcouchbase/src/rdb/libcalloc.c +94 -0
- data/ext/libcouchbase/src/rdb/rope.c +419 -0
- data/ext/libcouchbase/src/rdb/rope.h +488 -0
- data/ext/libcouchbase/src/retrychk.c +113 -0
- data/ext/libcouchbase/src/retryq.c +424 -0
- data/ext/libcouchbase/src/retryq.h +157 -0
- data/ext/libcouchbase/src/ringbuffer.c +442 -0
- data/ext/libcouchbase/src/ringbuffer.h +100 -0
- data/ext/libcouchbase/src/settings.c +95 -0
- data/ext/libcouchbase/src/settings.h +188 -0
- data/ext/libcouchbase/src/simplestring.c +211 -0
- data/ext/libcouchbase/src/simplestring.h +228 -0
- data/ext/libcouchbase/src/sllist-inl.h +197 -0
- data/ext/libcouchbase/src/sllist.h +76 -0
- data/ext/libcouchbase/src/ssl/CMakeLists.txt +23 -0
- data/ext/libcouchbase/src/ssl/ssl_c.c +415 -0
- data/ext/libcouchbase/src/ssl/ssl_common.c +454 -0
- data/ext/libcouchbase/src/ssl/ssl_e.c +408 -0
- data/ext/libcouchbase/src/ssl/ssl_iot_common.h +180 -0
- data/ext/libcouchbase/src/ssobuf.h +82 -0
- data/ext/libcouchbase/src/strcodecs/base64.c +123 -0
- data/ext/libcouchbase/src/strcodecs/strcodecs.h +285 -0
- data/ext/libcouchbase/src/timings.c +208 -0
- data/ext/libcouchbase/src/trace.h +105 -0
- data/ext/libcouchbase/src/utilities.c +171 -0
- data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -0
- data/ext/libcouchbase/src/vbucket/aliases.h +35 -0
- data/ext/libcouchbase/src/vbucket/crc32.h +83 -0
- data/ext/libcouchbase/src/vbucket/hash.h +30 -0
- data/ext/libcouchbase/src/vbucket/json-inl.h +112 -0
- data/ext/libcouchbase/src/vbucket/ketama.c +66 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/global.h +32 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/md5.h +35 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/md5c-inl.h +335 -0
- data/ext/libcouchbase/src/vbucket/vbucket.c +1543 -0
- data/ext/libcouchbase/src/views/docreq.c +194 -0
- data/ext/libcouchbase/src/views/docreq.h +83 -0
- data/ext/libcouchbase/src/views/viewreq.c +358 -0
- data/ext/libcouchbase/src/views/viewreq.h +36 -0
- data/ext/libcouchbase/src/wait.c +161 -0
- data/ext/libcouchbase/tests/CMakeLists.txt +140 -0
- data/ext/libcouchbase/tests/basic/t_base64.cc +81 -0
- data/ext/libcouchbase/tests/basic/t_ccbc103.cc +95 -0
- data/ext/libcouchbase/tests/basic/t_connstr.cc +404 -0
- data/ext/libcouchbase/tests/basic/t_creds.cc +32 -0
- data/ext/libcouchbase/tests/basic/t_ctlcodes.cc +92 -0
- data/ext/libcouchbase/tests/basic/t_hashset.cc +262 -0
- data/ext/libcouchbase/tests/basic/t_host.cc +198 -0
- data/ext/libcouchbase/tests/basic/t_jsparse.cc +137 -0
- data/ext/libcouchbase/tests/basic/t_jsparse.h +589 -0
- data/ext/libcouchbase/tests/basic/t_list.cc +155 -0
- data/ext/libcouchbase/tests/basic/t_logger.cc +65 -0
- data/ext/libcouchbase/tests/basic/t_misc.cc +24 -0
- data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +18 -0
- data/ext/libcouchbase/tests/basic/t_netbuf.cc +446 -0
- data/ext/libcouchbase/tests/basic/t_packet.cc +222 -0
- data/ext/libcouchbase/tests/basic/t_ringbuffer.cc +278 -0
- data/ext/libcouchbase/tests/basic/t_slist.cc +429 -0
- data/ext/libcouchbase/tests/basic/t_strerror.cc +64 -0
- data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
- data/ext/libcouchbase/tests/basic/t_urlencode.cc +132 -0
- data/ext/libcouchbase/tests/check-all.cc +608 -0
- data/ext/libcouchbase/tests/htparse/t_basic.cc +193 -0
- data/ext/libcouchbase/tests/ioserver/connection.cc +166 -0
- data/ext/libcouchbase/tests/ioserver/future.cc +50 -0
- data/ext/libcouchbase/tests/ioserver/ioserver.cc +104 -0
- data/ext/libcouchbase/tests/ioserver/ioserver.h +478 -0
- data/ext/libcouchbase/tests/ioserver/socket.cc +88 -0
- data/ext/libcouchbase/tests/ioserver/ssl_connection.cc +145 -0
- data/ext/libcouchbase/tests/ioserver/threads-pthreads.cc +119 -0
- data/ext/libcouchbase/tests/ioserver/threads-win32.cc +117 -0
- data/ext/libcouchbase/tests/ioserver/threads.h +66 -0
- data/ext/libcouchbase/tests/iotests/iotests.h +15 -0
- data/ext/libcouchbase/tests/iotests/mock-environment.cc +524 -0
- data/ext/libcouchbase/tests/iotests/mock-environment.h +385 -0
- data/ext/libcouchbase/tests/iotests/mock-unit-test.cc +67 -0
- data/ext/libcouchbase/tests/iotests/mock-unit-test.h +61 -0
- data/ext/libcouchbase/tests/iotests/serverparams.h +76 -0
- data/ext/libcouchbase/tests/iotests/t_arithmetic.cc +143 -0
- data/ext/libcouchbase/tests/iotests/t_behavior.cc +226 -0
- data/ext/libcouchbase/tests/iotests/t_configcache.cc +117 -0
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +241 -0
- data/ext/libcouchbase/tests/iotests/t_durability.cc +1059 -0
- data/ext/libcouchbase/tests/iotests/t_forward.cc +110 -0
- data/ext/libcouchbase/tests/iotests/t_get.cc +512 -0
- data/ext/libcouchbase/tests/iotests/t_http.cc +438 -0
- data/ext/libcouchbase/tests/iotests/t_iops.cc +175 -0
- data/ext/libcouchbase/tests/iotests/t_lock.cc +275 -0
- data/ext/libcouchbase/tests/iotests/t_misc.cc +713 -0
- data/ext/libcouchbase/tests/iotests/t_mutate.cc +609 -0
- data/ext/libcouchbase/tests/iotests/t_n1ql.cc +270 -0
- data/ext/libcouchbase/tests/iotests/t_netfail.cc +654 -0
- data/ext/libcouchbase/tests/iotests/t_obseqno.cc +157 -0
- data/ext/libcouchbase/tests/iotests/t_regression.cc +321 -0
- data/ext/libcouchbase/tests/iotests/t_sched.cc +88 -0
- data/ext/libcouchbase/tests/iotests/t_serverops.cc +230 -0
- data/ext/libcouchbase/tests/iotests/t_smoke.cc +528 -0
- data/ext/libcouchbase/tests/iotests/t_subdoc.cc +822 -0
- data/ext/libcouchbase/tests/iotests/t_syncmode.cc +64 -0
- data/ext/libcouchbase/tests/iotests/t_views.cc +405 -0
- data/ext/libcouchbase/tests/iotests/testutil.cc +250 -0
- data/ext/libcouchbase/tests/iotests/testutil.h +163 -0
- data/ext/libcouchbase/tests/mc/mctest.h +119 -0
- data/ext/libcouchbase/tests/mc/pktmaker.h +101 -0
- data/ext/libcouchbase/tests/mc/t_alloc.cc +269 -0
- data/ext/libcouchbase/tests/mc/t_context.cc +100 -0
- data/ext/libcouchbase/tests/mc/t_flush.cc +185 -0
- data/ext/libcouchbase/tests/mc/t_forward.cc +239 -0
- data/ext/libcouchbase/tests/mc/t_ioflush.cc +102 -0
- data/ext/libcouchbase/tests/mc/t_iovcursor.cc +173 -0
- data/ext/libcouchbase/tests/mocksupport/procutil.c +305 -0
- data/ext/libcouchbase/tests/mocksupport/procutil.h +89 -0
- data/ext/libcouchbase/tests/mocksupport/server.c +391 -0
- data/ext/libcouchbase/tests/mocksupport/server.h +72 -0
- data/ext/libcouchbase/tests/mocksupport/timeout.c +69 -0
- data/ext/libcouchbase/tests/nonio_tests.cc +23 -0
- data/ext/libcouchbase/tests/rdb/rdbtest.h +133 -0
- data/ext/libcouchbase/tests/rdb/t_basic.cc +128 -0
- data/ext/libcouchbase/tests/rdb/t_bigalloc.cc +93 -0
- data/ext/libcouchbase/tests/rdb/t_refs.cc +112 -0
- data/ext/libcouchbase/tests/socktests/socktest.cc +347 -0
- data/ext/libcouchbase/tests/socktests/socktest.h +448 -0
- data/ext/libcouchbase/tests/socktests/t_basic.cc +143 -0
- data/ext/libcouchbase/tests/socktests/t_ctx.cc +73 -0
- data/ext/libcouchbase/tests/socktests/t_manager.cc +179 -0
- data/ext/libcouchbase/tests/socktests/t_putex.cc +256 -0
- data/ext/libcouchbase/tests/socktests/t_read.cc +187 -0
- data/ext/libcouchbase/tests/socktests/t_reentrant.cc +143 -0
- data/ext/libcouchbase/tests/socktests/t_ssl.cc +80 -0
- data/ext/libcouchbase/tests/socktests/t_write.cc +95 -0
- data/ext/libcouchbase/tests/start_mock.bat +15 -0
- data/ext/libcouchbase/tests/start_mock.sh +42 -0
- data/ext/libcouchbase/tests/unit_tests.cc +43 -0
- data/ext/libcouchbase/tests/vbucket/confdata/bad.json +101 -0
- data/ext/libcouchbase/tests/vbucket/confdata/full_25.json +363 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_25.json +90 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_30.json +1 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_45.json +1 -0
- data/ext/libcouchbase/tests/vbucket/confdata/terse_25.json +291 -0
- data/ext/libcouchbase/tests/vbucket/confdata/terse_30.json +1 -0
- data/ext/libcouchbase/tests/vbucket/t_config.cc +341 -0
- data/ext/libcouchbase/tools/CMakeLists.txt +51 -0
- data/ext/libcouchbase/tools/cbc-handlers.h +462 -0
- data/ext/libcouchbase/tools/cbc-n1qlback.cc +439 -0
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +822 -0
- data/ext/libcouchbase/tools/cbc.cc +1541 -0
- data/ext/libcouchbase/tools/common/histogram.cc +43 -0
- data/ext/libcouchbase/tools/common/histogram.h +23 -0
- data/ext/libcouchbase/tools/common/my_inttypes.h +22 -0
- data/ext/libcouchbase/tools/common/options.cc +420 -0
- data/ext/libcouchbase/tools/common/options.h +81 -0
- data/ext/libcouchbase/tools/docgen/docgen.h +469 -0
- data/ext/libcouchbase/tools/docgen/loc.h +210 -0
- data/ext/libcouchbase/tools/docgen/placeholders.h +211 -0
- data/ext/libcouchbase/tools/docgen/seqgen.h +94 -0
- data/lib/libcouchbase.rb +36 -0
- data/lib/libcouchbase/bucket.rb +819 -0
- data/lib/libcouchbase/callbacks.rb +72 -0
- data/lib/libcouchbase/connection.rb +790 -0
- data/lib/libcouchbase/design_docs.rb +86 -0
- data/lib/libcouchbase/error.rb +68 -0
- data/lib/libcouchbase/ext/libcouchbase.rb +1135 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdbase.rb +23 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdcounter.rb +36 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdendure.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdfts.rb +24 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdget.rb +30 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdgetreplica.rb +49 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdhttp.rb +58 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdn1ql.rb +40 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdobseqno.rb +33 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdobserve.rb +30 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdstore.rb +40 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdstoredur.rb +45 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdsubdoc.rb +49 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdverbosity.rb +29 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdviewquery.rb +61 -0
- data/lib/libcouchbase/ext/libcouchbase/contigbuf.rb +14 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st.rb +15 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st0.rb +23 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st1.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st2.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st3.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/crst_u.rb +20 -0
- data/lib/libcouchbase/ext/libcouchbase/durability_opts_st_v.rb +11 -0
- data/lib/libcouchbase/ext/libcouchbase/durability_opts_t.rb +14 -0
- data/lib/libcouchbase/ext/libcouchbase/durabilityopt_sv0.rb +63 -0
- data/lib/libcouchbase/ext/libcouchbase/enums.rb +991 -0
- data/lib/libcouchbase/ext/libcouchbase/fragbuf.rb +18 -0
- data/lib/libcouchbase/ext/libcouchbase/ftshandle.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/histogram.rb +34 -0
- data/lib/libcouchbase/ext/libcouchbase/http_request_t.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/keybuf.rb +20 -0
- data/lib/libcouchbase/ext/libcouchbase/multicmd_ctx.rb +30 -0
- data/lib/libcouchbase/ext/libcouchbase/mutation_token.rb +17 -0
- data/lib/libcouchbase/ext/libcouchbase/n1qlhandle.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/n1qlparams.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/respbase.rb +29 -0
- data/lib/libcouchbase/ext/libcouchbase/respcounter.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/respendure.rb +49 -0
- data/lib/libcouchbase/ext/libcouchbase/respfts.rb +40 -0
- data/lib/libcouchbase/ext/libcouchbase/respget.rb +44 -0
- data/lib/libcouchbase/ext/libcouchbase/resphttp.rb +48 -0
- data/lib/libcouchbase/ext/libcouchbase/respmcversion.rb +38 -0
- data/lib/libcouchbase/ext/libcouchbase/respn1ql.rb +41 -0
- data/lib/libcouchbase/ext/libcouchbase/respobseqno.rb +52 -0
- data/lib/libcouchbase/ext/libcouchbase/respobserve.rb +41 -0
- data/lib/libcouchbase/ext/libcouchbase/respserverbase.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/respstats.rb +38 -0
- data/lib/libcouchbase/ext/libcouchbase/respstore.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/respstoredur.rb +38 -0
- data/lib/libcouchbase/ext/libcouchbase/respsubdoc.rb +35 -0
- data/lib/libcouchbase/ext/libcouchbase/respviewquery.rb +67 -0
- data/lib/libcouchbase/ext/libcouchbase/sdentry.rb +22 -0
- data/lib/libcouchbase/ext/libcouchbase/sdspec.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/t.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/valbuf.rb +22 -0
- data/lib/libcouchbase/ext/libcouchbase/valbuf_u_buf.rb +14 -0
- data/lib/libcouchbase/ext/libcouchbase/viewhandle.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase_iocp.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase_libuv.rb +18 -0
- data/lib/libcouchbase/ext/tasks.rb +87 -0
- data/lib/libcouchbase/n1ql.rb +73 -0
- data/lib/libcouchbase/query_full_text.rb +147 -0
- data/lib/libcouchbase/query_n1ql.rb +121 -0
- data/lib/libcouchbase/query_view.rb +129 -0
- data/lib/libcouchbase/results_fiber.rb +262 -0
- data/lib/libcouchbase/results_native.rb +211 -0
- data/lib/libcouchbase/version.rb +5 -0
- data/libcouchbase.gemspec +61 -0
- data/spec/bucket_spec.rb +270 -0
- data/spec/connection_spec.rb +277 -0
- data/spec/design_docs_spec.rb +23 -0
- data/spec/error_spec.rb +26 -0
- data/spec/fts_spec.rb +129 -0
- data/spec/n1ql_spec.rb +201 -0
- data/spec/results_libuv_spec.rb +229 -0
- data/spec/results_native_spec.rb +259 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/design.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/data-0000.cbb +0 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/failover.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/meta.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/seqno.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/snapshot_markers.json +1 -0
- data/spec/view_spec.rb +195 -0
- metadata +775 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2014 Couchbase, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#ifndef LCB_MCSERVER_NEGOTIATE_H
|
|
19
|
+
#define LCB_MCSERVER_NEGOTIATE_H
|
|
20
|
+
#include <libcouchbase/couchbase.h>
|
|
21
|
+
#include <lcbio/lcbio.h>
|
|
22
|
+
#ifdef __cplusplus
|
|
23
|
+
extern "C" {
|
|
24
|
+
#endif
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @file
|
|
28
|
+
* @brief SASL Negotiation routines
|
|
29
|
+
*
|
|
30
|
+
* @defgroup lcb-sasl Server/SASL Negotiation
|
|
31
|
+
* @details
|
|
32
|
+
* This module contains routines to initialize a server and authenticate it
|
|
33
|
+
* against a cluster. In the future this will also be used to handle things
|
|
34
|
+
* such as TLS negotiation and the HELLO command
|
|
35
|
+
* @addtogroup lcb-sasl
|
|
36
|
+
* @{
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
struct lcb_settings_st;
|
|
40
|
+
typedef struct mc_SESSREQ *mc_pSESSREQ;
|
|
41
|
+
typedef struct mc_SESSINFO *mc_pSESSINFO;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @brief Start negotiation on a connected socket
|
|
45
|
+
*
|
|
46
|
+
* This will start negotiation on the socket. Once complete (or an error has
|
|
47
|
+
* taken place) the `callback` will be invoked with the result.
|
|
48
|
+
*
|
|
49
|
+
* @param sock A connected socket to use. Its reference count will be increased
|
|
50
|
+
* @param settings A settings structure. Used for auth information as well as
|
|
51
|
+
* logging
|
|
52
|
+
* @param tmo Time in microseconds to wait until the negotiation is done
|
|
53
|
+
* @param callback A callback to invoke when a result has been received
|
|
54
|
+
* @param data User-defined pointer passed to the callback
|
|
55
|
+
* @return A new handle which may be cancelled via mc_sessreq_cancel(). As with
|
|
56
|
+
* other cancellable requests, once this handle is cancelled a callback will
|
|
57
|
+
* not be received for it, and once the callback is received the handle may not
|
|
58
|
+
* be cancelled as it will point to invalid memory.
|
|
59
|
+
*
|
|
60
|
+
* Once the socket has been negotiated successfuly, you may then use the
|
|
61
|
+
* mc_sess_get() function to query the socket about various negotiation aspects
|
|
62
|
+
*
|
|
63
|
+
* @code{.c}
|
|
64
|
+
* lcbio_CONNREQ creq;
|
|
65
|
+
* mc_pSASLREQ req;
|
|
66
|
+
* req = mc_sasl_start(sock, settings, tmo, callback, data);
|
|
67
|
+
* LCBIO_CONNREQ_MKGENERIC(req, mc_sasl_cancel);
|
|
68
|
+
* @endcode
|
|
69
|
+
*
|
|
70
|
+
* @see lcbio_connreq_cancel()
|
|
71
|
+
* @see LCBIO_CONNREQ_MKGENERIC
|
|
72
|
+
*/
|
|
73
|
+
mc_pSESSREQ
|
|
74
|
+
mc_sessreq_start(
|
|
75
|
+
lcbio_SOCKET *sock, struct lcb_settings_st *settings,
|
|
76
|
+
uint32_t tmo, lcbio_CONNDONE_cb callback, void *data);
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @brief Cancel a pending SASL negotiation request
|
|
80
|
+
* @param handle The handle to cancel
|
|
81
|
+
*/
|
|
82
|
+
void
|
|
83
|
+
mc_sessreq_cancel(mc_pSESSREQ handle);
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* @brief Get an opaque handle representing the negotiated state of the socket
|
|
87
|
+
* @param sock The negotiated socket
|
|
88
|
+
* @return the `SASLINFO` structure if the socket is negotiated, or `NULL` if
|
|
89
|
+
* the socket has not been negotiated.
|
|
90
|
+
*
|
|
91
|
+
* @see mc_sasl_getmech()
|
|
92
|
+
*/
|
|
93
|
+
mc_pSESSINFO
|
|
94
|
+
mc_sess_get(lcbio_SOCKET *sock);
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @brief Get the mechanism employed for authentication
|
|
98
|
+
* @param info pointer retrieved via mc_sasl_get()
|
|
99
|
+
* @return A string indicating the mechanism used. This may be `PLAIN` or
|
|
100
|
+
* `CRAM-MD5`.
|
|
101
|
+
*/
|
|
102
|
+
const char *
|
|
103
|
+
mc_sess_get_saslmech(mc_pSESSINFO info);
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* @brief Determine if a specific protocol feature is supported on the server
|
|
107
|
+
* @param info info pointer returned via mc_sasl_get()
|
|
108
|
+
* @param feature A feature ID
|
|
109
|
+
* @return true if supported, false otherwise
|
|
110
|
+
*/
|
|
111
|
+
int
|
|
112
|
+
mc_sess_chkfeature(mc_pSESSINFO info, lcb_U16 feature);
|
|
113
|
+
|
|
114
|
+
/**@}*/
|
|
115
|
+
|
|
116
|
+
#ifdef __cplusplus
|
|
117
|
+
}
|
|
118
|
+
#endif
|
|
119
|
+
#endif
|
|
@@ -0,0 +1,860 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2016 Couchbase, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
#define NOMINMAX
|
|
18
|
+
#include <libcouchbase/ixmgmt.h>
|
|
19
|
+
#include <string>
|
|
20
|
+
#include <set>
|
|
21
|
+
#include <algorithm>
|
|
22
|
+
|
|
23
|
+
#include "contrib/lcb-jsoncpp/lcb-jsoncpp.h"
|
|
24
|
+
#include "lcbio/lcbio.h"
|
|
25
|
+
#include "lcbio/timer-ng.h"
|
|
26
|
+
#include "settings.h"
|
|
27
|
+
#include "internal.h"
|
|
28
|
+
|
|
29
|
+
#define LOGFMT "(mgreq=%p) "
|
|
30
|
+
#define LOGID(req) static_cast<const void*>(req)
|
|
31
|
+
#define LOGARGS(req, lvl) (req)->m_instance->settings, "ixmgmt", LCB_LOG_##lvl, __FILE__, __LINE__
|
|
32
|
+
|
|
33
|
+
using std::vector;
|
|
34
|
+
using std::string;
|
|
35
|
+
|
|
36
|
+
static const char *
|
|
37
|
+
ixtype_2_str(unsigned ixtype)
|
|
38
|
+
{
|
|
39
|
+
if (ixtype == LCB_N1XSPEC_T_GSI) {
|
|
40
|
+
return "gsi";
|
|
41
|
+
} else if (ixtype == LCB_N1XSPEC_T_VIEW) {
|
|
42
|
+
return "view";
|
|
43
|
+
} else {
|
|
44
|
+
return NULL;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
struct IndexOpCtx {
|
|
49
|
+
lcb_N1XMGMTCALLBACK callback;
|
|
50
|
+
void *cookie;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
struct ErrorSpec {
|
|
54
|
+
string msg;
|
|
55
|
+
unsigned code;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
template <typename T> void my_delete(T p) {
|
|
59
|
+
delete p;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
template <typename T> lcb_error_t
|
|
63
|
+
extract_n1ql_errors(const char *s, size_t n, T& err_out)
|
|
64
|
+
{
|
|
65
|
+
Json::Value jresp;
|
|
66
|
+
if (!Json::Reader().parse(s, s + n, jresp)) {
|
|
67
|
+
return LCB_PROTOCOL_ERROR;
|
|
68
|
+
}
|
|
69
|
+
if (jresp["status"].asString() == "success") {
|
|
70
|
+
return LCB_SUCCESS;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
Json::Value& errors = jresp["errors"];
|
|
74
|
+
if (errors.isNull()) {
|
|
75
|
+
return LCB_SUCCESS;
|
|
76
|
+
} else if (!errors.isArray()) {
|
|
77
|
+
return LCB_PROTOCOL_ERROR;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (errors.empty()) {
|
|
81
|
+
return LCB_SUCCESS;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
for (Json::ArrayIndex ii = 0; ii < errors.size(); ++ii) {
|
|
85
|
+
const Json::Value& err = errors[ii];
|
|
86
|
+
if (!err.isObject()) {
|
|
87
|
+
continue; // expected an object!
|
|
88
|
+
}
|
|
89
|
+
ErrorSpec spec;
|
|
90
|
+
spec.msg = err["msg"].asString();
|
|
91
|
+
spec.code = err["code"].asUInt();
|
|
92
|
+
err_out.insert(err_out.end(), spec);
|
|
93
|
+
}
|
|
94
|
+
return LCB_ERROR;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
static lcb_error_t
|
|
98
|
+
get_n1ql_error(const char *s, size_t n)
|
|
99
|
+
{
|
|
100
|
+
std::vector<ErrorSpec> dummy;
|
|
101
|
+
return extract_n1ql_errors(s, n, dummy);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Called for generic operations and establishes existence or lack thereof
|
|
105
|
+
static void
|
|
106
|
+
cb_generic(lcb_t instance, int, const lcb_RESPN1QL *resp)
|
|
107
|
+
{
|
|
108
|
+
// Get the real cookie..
|
|
109
|
+
if (!(resp->rflags & LCB_RESP_F_FINAL)) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
IndexOpCtx *ctx = reinterpret_cast<IndexOpCtx*>(resp->cookie);
|
|
114
|
+
lcb_RESPN1XMGMT w_resp = { 0 };
|
|
115
|
+
w_resp.cookie = ctx->cookie;
|
|
116
|
+
|
|
117
|
+
if ((w_resp.rc = resp->rc) == LCB_SUCCESS || resp->rc == LCB_HTTP_ERROR) {
|
|
118
|
+
// Check if the top-level N1QL response succeeded, and then
|
|
119
|
+
// descend to determine additional errors. This is primarily
|
|
120
|
+
// required to support EEXIST for GSI primary indexes
|
|
121
|
+
|
|
122
|
+
vector<ErrorSpec> errors;
|
|
123
|
+
lcb_error_t rc = extract_n1ql_errors(resp->row, resp->nrow, errors);
|
|
124
|
+
if (rc == LCB_ERROR) {
|
|
125
|
+
w_resp.rc = LCB_QUERY_ERROR;
|
|
126
|
+
for (size_t ii = 0; ii < errors.size(); ++ii) {
|
|
127
|
+
const std::string& msg = errors[ii].msg;
|
|
128
|
+
if (msg.find("already exist") != string::npos) {
|
|
129
|
+
w_resp.rc = LCB_KEY_EEXISTS; // Index entry already exists
|
|
130
|
+
} else if (msg.find("not found") != string::npos) {
|
|
131
|
+
w_resp.rc = LCB_KEY_ENOENT;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
} else {
|
|
135
|
+
w_resp.rc = rc;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
w_resp.inner = resp;
|
|
140
|
+
w_resp.specs = NULL;
|
|
141
|
+
w_resp.nspecs = 0;
|
|
142
|
+
ctx->callback(instance, LCB_CALLBACK_IXMGMT, &w_resp);
|
|
143
|
+
delete ctx;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Dispatch the actual operation using a N1QL query
|
|
148
|
+
* @param instance
|
|
149
|
+
* @param cookie User cookie
|
|
150
|
+
* @param u_callback User callback (to assign to new context)
|
|
151
|
+
* @param i_callback Internal callback to be invoked when N1QL response
|
|
152
|
+
* is done
|
|
153
|
+
* @param s N1QL request payload
|
|
154
|
+
* @param n N1QL request length
|
|
155
|
+
* @param obj Internal context. Created with new if NULL
|
|
156
|
+
* @return
|
|
157
|
+
*
|
|
158
|
+
* See other overload for passing just the query string w/o extra parameters
|
|
159
|
+
*/
|
|
160
|
+
template <typename T> lcb_error_t
|
|
161
|
+
dispatch_common(lcb_t instance,
|
|
162
|
+
const void *cookie, lcb_N1XMGMTCALLBACK u_callback,
|
|
163
|
+
lcb_N1QLCALLBACK i_callback, const char *s, size_t n, T *obj)
|
|
164
|
+
{
|
|
165
|
+
lcb_error_t rc = LCB_SUCCESS;
|
|
166
|
+
bool our_alloc = false;
|
|
167
|
+
lcb_CMDN1QL cmd = { 0 };
|
|
168
|
+
struct { lcb_t m_instance; } ixwrap = { instance }; // For logging
|
|
169
|
+
|
|
170
|
+
if (obj == NULL) {
|
|
171
|
+
obj = new T();
|
|
172
|
+
our_alloc = true;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (!(obj->callback = u_callback)) {
|
|
176
|
+
rc = LCB_EINVAL;
|
|
177
|
+
goto GT_ERROR;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
obj->cookie = const_cast<void*>(cookie);
|
|
181
|
+
|
|
182
|
+
cmd.query = s;
|
|
183
|
+
cmd.nquery = n;
|
|
184
|
+
cmd.callback = i_callback;
|
|
185
|
+
lcb_log(LOGARGS(&ixwrap, DEBUG), LOGFMT "Issuing query %.*s", LOGID(obj), (int)n, s);
|
|
186
|
+
rc = lcb_n1ql_query(instance, obj, &cmd);
|
|
187
|
+
|
|
188
|
+
GT_ERROR:
|
|
189
|
+
if (rc != LCB_SUCCESS && our_alloc) {
|
|
190
|
+
delete obj;
|
|
191
|
+
}
|
|
192
|
+
return rc;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
template <typename T> lcb_error_t
|
|
196
|
+
dispatch_common(lcb_t instance,
|
|
197
|
+
const void *cookie, lcb_N1XMGMTCALLBACK u_callback,
|
|
198
|
+
lcb_N1QLCALLBACK i_callback, const string& ss, T *obj = NULL)
|
|
199
|
+
{
|
|
200
|
+
Json::Value root;
|
|
201
|
+
root["statement"] = ss;
|
|
202
|
+
string reqbuf = Json::FastWriter().write(root);
|
|
203
|
+
return dispatch_common<T>(instance,
|
|
204
|
+
cookie, u_callback, i_callback,
|
|
205
|
+
reqbuf.c_str(), reqbuf.size()-1 /*newline*/, obj);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
// Class to back the storage for the actual lcb_IXSPEC without doing too much
|
|
210
|
+
// mind-numbing buffer copies. Maybe this can be done via a macro instead?
|
|
211
|
+
class IndexSpec : public lcb_N1XSPEC {
|
|
212
|
+
public:
|
|
213
|
+
IndexSpec(const char *s, size_t n) {
|
|
214
|
+
memset(static_cast<lcb_N1XSPEC*>(this), 0, sizeof (lcb_N1XSPEC));
|
|
215
|
+
load_json(s, n);
|
|
216
|
+
}
|
|
217
|
+
inline IndexSpec(const lcb_N1XSPEC *spec);
|
|
218
|
+
static inline void to_key(const lcb_N1XSPEC *spec, std::string& out);
|
|
219
|
+
bool is_primary() const { return flags & LCB_N1XSPEC_F_PRIMARY; }
|
|
220
|
+
bool is_defer() const { return flags & LCB_N1XSPEC_F_DEFER; }
|
|
221
|
+
void ensure_keyspace(lcb_t instance) {
|
|
222
|
+
if (nkeyspace) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
keyspace = LCBT_SETTING(instance, bucket);
|
|
226
|
+
nkeyspace = strlen(keyspace);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
private:
|
|
230
|
+
// Load fields from a JSON string
|
|
231
|
+
inline void load_json(const char *s, size_t n);
|
|
232
|
+
|
|
233
|
+
// Load all fields
|
|
234
|
+
inline size_t load_fields(const Json::Value& root, bool do_copy);
|
|
235
|
+
|
|
236
|
+
size_t total_fields_size(const Json::Value& src) {
|
|
237
|
+
return load_fields(src, false);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Load field from a JSON object
|
|
241
|
+
inline size_t load_json_field(
|
|
242
|
+
const Json::Value& root,
|
|
243
|
+
const char *name, const char **tgt_ptr, size_t *tgt_len, bool do_copy);
|
|
244
|
+
|
|
245
|
+
// Load field from another pointer
|
|
246
|
+
void load_field(const char **dest, const char *src, size_t n) {
|
|
247
|
+
m_buf.append(src, n);
|
|
248
|
+
if (n) {
|
|
249
|
+
*dest = &m_buf.c_str()[m_buf.size()-n];
|
|
250
|
+
} else {
|
|
251
|
+
*dest = NULL;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
string m_buf;
|
|
256
|
+
IndexSpec(const IndexSpec&);
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
LIBCOUCHBASE_API
|
|
260
|
+
lcb_error_t
|
|
261
|
+
lcb_n1x_create(lcb_t instance, const void *cookie, const lcb_CMDN1XMGMT *cmd)
|
|
262
|
+
{
|
|
263
|
+
string ss;
|
|
264
|
+
IndexSpec spec(&cmd->spec);
|
|
265
|
+
spec.ensure_keyspace(instance);
|
|
266
|
+
|
|
267
|
+
ss = "CREATE";
|
|
268
|
+
if (spec.is_primary()) {
|
|
269
|
+
ss += " PRIMARY";
|
|
270
|
+
} else if (!spec.nname) {
|
|
271
|
+
return LCB_EMPTY_KEY;
|
|
272
|
+
}
|
|
273
|
+
ss.append(" INDEX");
|
|
274
|
+
if (spec.nname) {
|
|
275
|
+
ss.append(" `").append(spec.name, spec.nname).append("` ");
|
|
276
|
+
}
|
|
277
|
+
ss.append(" ON `").append(spec.keyspace, spec.nkeyspace).append("`");
|
|
278
|
+
|
|
279
|
+
if (!spec.is_primary()) {
|
|
280
|
+
if (!spec.nfields) {
|
|
281
|
+
return LCB_EMPTY_KEY;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// See if we can parse 'fields' properly. First, try to parse as
|
|
285
|
+
// JSON:
|
|
286
|
+
Json::Value fields_arr;
|
|
287
|
+
Json::Reader r;
|
|
288
|
+
if (!r.parse(spec.fields, spec.fields + spec.nfields, fields_arr)) {
|
|
289
|
+
// Invalid JSON!
|
|
290
|
+
return LCB_EINVAL;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
ss.append(" (");
|
|
294
|
+
if (fields_arr.isArray()) {
|
|
295
|
+
if (!fields_arr.size()) {
|
|
296
|
+
return LCB_EMPTY_KEY;
|
|
297
|
+
}
|
|
298
|
+
for (size_t ii = 0; ii < fields_arr.size(); ++ii) {
|
|
299
|
+
static Json::Value empty;
|
|
300
|
+
const Json::Value& field = fields_arr.get(ii, empty);
|
|
301
|
+
if (!field.isString()) {
|
|
302
|
+
return LCB_EINVAL;
|
|
303
|
+
}
|
|
304
|
+
ss.append(field.asString());
|
|
305
|
+
if (ii != fields_arr.size()-1) {
|
|
306
|
+
ss.append(",");
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
} else if (fields_arr.isString()) {
|
|
310
|
+
std::string field_list = fields_arr.asString();
|
|
311
|
+
if (field_list.empty()) {
|
|
312
|
+
return LCB_EMPTY_KEY;
|
|
313
|
+
}
|
|
314
|
+
ss.append(field_list);
|
|
315
|
+
} else {
|
|
316
|
+
return LCB_EINVAL;
|
|
317
|
+
}
|
|
318
|
+
ss.append(") ");
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
if (spec.ncond) {
|
|
322
|
+
if (spec.is_primary()) {
|
|
323
|
+
return LCB_EINVAL;
|
|
324
|
+
}
|
|
325
|
+
ss.append(" WHERE ").append(spec.cond, spec.ncond).append(" ");
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (spec.ixtype) {
|
|
329
|
+
const char *ixtype = ixtype_2_str(spec.ixtype);
|
|
330
|
+
if (!ixtype) {
|
|
331
|
+
return LCB_EINVAL;
|
|
332
|
+
}
|
|
333
|
+
ss.append(" USING ").append(ixtype);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (spec.is_defer()) {
|
|
337
|
+
ss.append(" WITH {\"defer_build\": true}");
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return dispatch_common<IndexOpCtx>(instance, cookie, cmd->callback, cb_generic, ss);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
class ListIndexCtx : public IndexOpCtx {
|
|
345
|
+
public:
|
|
346
|
+
vector<IndexSpec*> specs;
|
|
347
|
+
|
|
348
|
+
virtual void invoke(lcb_t instance, lcb_RESPN1XMGMT *resp) {
|
|
349
|
+
finish(instance, resp);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
void finish(lcb_t instance, lcb_RESPN1XMGMT *resp = NULL) {
|
|
353
|
+
lcb_RESPN1XMGMT w_resp = { 0 };
|
|
354
|
+
if (resp == NULL) {
|
|
355
|
+
resp = &w_resp;
|
|
356
|
+
resp->rc = LCB_SUCCESS;
|
|
357
|
+
}
|
|
358
|
+
resp->cookie = cookie;
|
|
359
|
+
lcb_N1XSPEC **speclist = reinterpret_cast<lcb_N1XSPEC**>(&specs[0]);
|
|
360
|
+
resp->specs = speclist;
|
|
361
|
+
resp->nspecs = specs.size();
|
|
362
|
+
callback(instance, LCB_CALLBACK_IXMGMT, resp);
|
|
363
|
+
delete this;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
virtual ~ListIndexCtx() {
|
|
367
|
+
for (size_t ii = 0; ii < specs.size(); ++ii) {
|
|
368
|
+
delete specs[ii];
|
|
369
|
+
}
|
|
370
|
+
specs.clear();
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
static void
|
|
375
|
+
cb_index_list(lcb_t instance, int, const lcb_RESPN1QL *resp)
|
|
376
|
+
{
|
|
377
|
+
ListIndexCtx *ctx = reinterpret_cast<ListIndexCtx *>(resp->cookie);
|
|
378
|
+
if (!(resp->rflags & LCB_RESP_F_FINAL)) {
|
|
379
|
+
ctx->specs.push_back(new IndexSpec(resp->row, resp->nrow));
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
lcb_RESPN1XMGMT w_resp = { 0 };
|
|
384
|
+
if ((w_resp.rc = resp->rc) == LCB_SUCCESS) {
|
|
385
|
+
w_resp.rc = get_n1ql_error(resp->row, resp->nrow);
|
|
386
|
+
}
|
|
387
|
+
w_resp.inner = resp;
|
|
388
|
+
ctx->invoke(instance, &w_resp);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
static lcb_error_t
|
|
392
|
+
do_index_list(lcb_t instance, const void *cookie, const lcb_CMDN1XMGMT *cmd,
|
|
393
|
+
ListIndexCtx *ctx)
|
|
394
|
+
{
|
|
395
|
+
string ss;
|
|
396
|
+
IndexSpec spec(&cmd->spec);
|
|
397
|
+
ss = "SELECT idx.* FROM system:indexes idx WHERE";
|
|
398
|
+
|
|
399
|
+
if (spec.flags & LCB_N1XSPEC_F_PRIMARY) {
|
|
400
|
+
ss.append(" is_primary=true AND");
|
|
401
|
+
}
|
|
402
|
+
if (spec.nkeyspace) {
|
|
403
|
+
ss.append(" keyspace_id=\"").append(spec.keyspace, spec.nkeyspace).append("\" AND");
|
|
404
|
+
}
|
|
405
|
+
if (spec.nnspace) {
|
|
406
|
+
ss.append(" namespace_id=\"").append(spec.nspace, spec.nnspace).append("\" AND");
|
|
407
|
+
}
|
|
408
|
+
if (spec.ixtype) {
|
|
409
|
+
const char *s_ixtype = ixtype_2_str(spec.ixtype);
|
|
410
|
+
if (s_ixtype == NULL) {
|
|
411
|
+
if (ctx != NULL) {
|
|
412
|
+
delete ctx;
|
|
413
|
+
}
|
|
414
|
+
return LCB_EINVAL;
|
|
415
|
+
}
|
|
416
|
+
ss.append(" using=\"").append(s_ixtype).append("\" AND");
|
|
417
|
+
}
|
|
418
|
+
if (spec.nname) {
|
|
419
|
+
ss.append(" name=\"").append(spec.name, spec.nname).append("\" AND");
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// WHERE <.....> true
|
|
423
|
+
ss.append(" true");
|
|
424
|
+
ss.append(" ORDER BY is_primary DESC, name ASC");
|
|
425
|
+
|
|
426
|
+
return dispatch_common<ListIndexCtx>(instance,
|
|
427
|
+
cookie, cmd->callback, cb_index_list, ss, ctx);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
LIBCOUCHBASE_API
|
|
431
|
+
lcb_error_t
|
|
432
|
+
lcb_n1x_list(lcb_t instance, const void *cookie, const lcb_CMDN1XMGMT *cmd)
|
|
433
|
+
{
|
|
434
|
+
return do_index_list(instance, cookie, cmd, NULL);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
LIBCOUCHBASE_API
|
|
438
|
+
lcb_error_t
|
|
439
|
+
lcb_n1x_drop(lcb_t instance, const void *cookie, const lcb_CMDN1XMGMT *cmd)
|
|
440
|
+
{
|
|
441
|
+
string ss;
|
|
442
|
+
IndexSpec spec(&cmd->spec);
|
|
443
|
+
spec.ensure_keyspace(instance);
|
|
444
|
+
|
|
445
|
+
if (spec.nname) {
|
|
446
|
+
ss = "DROP INDEX";
|
|
447
|
+
ss.append(" `").append(spec.keyspace, spec.nkeyspace).append("`");
|
|
448
|
+
ss.append(".`").append(spec.name, spec.nname).append("`");
|
|
449
|
+
} else if (spec.flags & LCB_N1XSPEC_F_PRIMARY) {
|
|
450
|
+
ss = "DROP PRIMARY INDEX ON";
|
|
451
|
+
ss.append(" `").append(spec.keyspace, spec.nkeyspace).append("`");
|
|
452
|
+
} else {
|
|
453
|
+
return LCB_EMPTY_KEY;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
if (spec.ixtype) {
|
|
457
|
+
const char *stype = ixtype_2_str(spec.ixtype);
|
|
458
|
+
if (!stype) {
|
|
459
|
+
return LCB_EINVAL;
|
|
460
|
+
}
|
|
461
|
+
ss.append(" USING ").append(stype);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
return dispatch_common<IndexOpCtx>(instance, cookie, cmd->callback, cb_generic, ss);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
class ListIndexCtx_BuildIndex : public ListIndexCtx {
|
|
468
|
+
public:
|
|
469
|
+
virtual inline void invoke(lcb_t instance, lcb_RESPN1XMGMT *resp);
|
|
470
|
+
inline lcb_error_t try_build(lcb_t instance);
|
|
471
|
+
};
|
|
472
|
+
|
|
473
|
+
static void
|
|
474
|
+
cb_build_submitted(lcb_t instance, int, const lcb_RESPN1QL *resp)
|
|
475
|
+
{
|
|
476
|
+
ListIndexCtx *ctx = reinterpret_cast<ListIndexCtx*>(resp->cookie);
|
|
477
|
+
|
|
478
|
+
if (resp->rflags & LCB_RESP_F_FINAL) {
|
|
479
|
+
lcb_RESPN1XMGMT w_resp = { 0 };
|
|
480
|
+
if ((w_resp.rc = resp->rc) == LCB_SUCCESS) {
|
|
481
|
+
w_resp.rc = get_n1ql_error(resp->row, resp->nrow);
|
|
482
|
+
}
|
|
483
|
+
ctx->finish(instance, &w_resp);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
lcb_error_t
|
|
488
|
+
ListIndexCtx_BuildIndex::try_build(lcb_t instance)
|
|
489
|
+
{
|
|
490
|
+
vector<IndexSpec*> pending;
|
|
491
|
+
for (size_t ii = 0; ii < specs.size(); ++ii) {
|
|
492
|
+
IndexSpec* spec = specs[ii];
|
|
493
|
+
if (strncmp(spec->state, "pending", spec->nstate) == 0 ||
|
|
494
|
+
strncmp(spec->state, "deferred", spec->nstate) == 0) {
|
|
495
|
+
pending.push_back(spec);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
if (pending.empty()) {
|
|
500
|
+
return LCB_KEY_ENOENT;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
string ss;
|
|
504
|
+
ss = "BUILD INDEX ON `";
|
|
505
|
+
|
|
506
|
+
ss.append(pending[0]->keyspace, pending[0]->nkeyspace).append("`");
|
|
507
|
+
ss += '(';
|
|
508
|
+
for (size_t ii = 0; ii < pending.size(); ++ii) {
|
|
509
|
+
ss += '`';
|
|
510
|
+
ss.append(pending[ii]->name, pending[ii]->nname);
|
|
511
|
+
ss += '`';
|
|
512
|
+
if (ii+1 < pending.size()) {
|
|
513
|
+
ss += ',';
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
ss += ')';
|
|
517
|
+
|
|
518
|
+
lcb_error_t rc = dispatch_common<ListIndexCtx_BuildIndex>(
|
|
519
|
+
instance, cookie, callback, cb_build_submitted, ss,
|
|
520
|
+
this);
|
|
521
|
+
|
|
522
|
+
if (rc == LCB_SUCCESS) {
|
|
523
|
+
std::set<IndexSpec*> to_remove(specs.begin(), specs.end());
|
|
524
|
+
for (size_t ii = 0; ii < pending.size(); ++ii) {
|
|
525
|
+
to_remove.erase(pending[ii]);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
std::for_each(to_remove.begin(), to_remove.end(), my_delete<IndexSpec*>);
|
|
529
|
+
|
|
530
|
+
specs = pending;
|
|
531
|
+
}
|
|
532
|
+
return rc;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
void
|
|
536
|
+
ListIndexCtx_BuildIndex::invoke(lcb_t instance, lcb_RESPN1XMGMT *resp)
|
|
537
|
+
{
|
|
538
|
+
if (resp->rc == LCB_SUCCESS &&
|
|
539
|
+
(resp->rc = try_build(instance)) == LCB_SUCCESS) {
|
|
540
|
+
return;
|
|
541
|
+
}
|
|
542
|
+
finish(instance, resp);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
LIBCOUCHBASE_API
|
|
546
|
+
lcb_error_t
|
|
547
|
+
lcb_n1x_startbuild(lcb_t instance, const void *cookie, const lcb_CMDN1XMGMT *cmd)
|
|
548
|
+
{
|
|
549
|
+
ListIndexCtx_BuildIndex *ctx = new ListIndexCtx_BuildIndex();
|
|
550
|
+
lcb_error_t rc = do_index_list(instance, cookie, cmd, ctx);
|
|
551
|
+
if (rc != LCB_SUCCESS) {
|
|
552
|
+
delete ctx;
|
|
553
|
+
}
|
|
554
|
+
return rc;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
struct WatchIndexCtx : public IndexOpCtx {
|
|
558
|
+
// Interval timer
|
|
559
|
+
lcbio_pTIMER m_timer;
|
|
560
|
+
uint32_t m_interval;
|
|
561
|
+
uint64_t m_tsend;
|
|
562
|
+
lcb_t m_instance;
|
|
563
|
+
std::map<std::string,IndexSpec*> m_defspend;
|
|
564
|
+
std::vector<IndexSpec*> m_defsok;
|
|
565
|
+
|
|
566
|
+
inline void read_state(const lcb_RESPN1XMGMT *resp);
|
|
567
|
+
inline void reschedule();
|
|
568
|
+
inline lcb_error_t do_poll();
|
|
569
|
+
inline lcb_error_t load_defs(const lcb_CMDN1XWATCH *);
|
|
570
|
+
inline WatchIndexCtx(lcb_t, const void *, const lcb_CMDN1XWATCH*);
|
|
571
|
+
inline ~WatchIndexCtx();
|
|
572
|
+
inline void finish(lcb_error_t rc, const lcb_RESPN1XMGMT *);
|
|
573
|
+
};
|
|
574
|
+
|
|
575
|
+
static void
|
|
576
|
+
cb_watchix_tm(void *arg)
|
|
577
|
+
{
|
|
578
|
+
WatchIndexCtx *ctx = reinterpret_cast<WatchIndexCtx*>(arg);
|
|
579
|
+
uint64_t now = lcb_nstime();
|
|
580
|
+
if (now >= ctx->m_tsend) {
|
|
581
|
+
ctx->finish(LCB_ETIMEDOUT, NULL);
|
|
582
|
+
} else {
|
|
583
|
+
ctx->do_poll();
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
#define DEFAULT_WATCH_TIMEOUT LCB_S2US(30)
|
|
588
|
+
#define DEFAULT_WATCH_INTERVAL LCB_MS2US(500)
|
|
589
|
+
|
|
590
|
+
WatchIndexCtx::WatchIndexCtx(lcb_t instance, const void *cookie_, const lcb_CMDN1XWATCH *cmd)
|
|
591
|
+
: m_instance(instance)
|
|
592
|
+
{
|
|
593
|
+
uint64_t now = lcb_nstime();
|
|
594
|
+
uint32_t timeout = cmd->timeout ? cmd->timeout : DEFAULT_WATCH_TIMEOUT;
|
|
595
|
+
m_interval = cmd->interval ? cmd->interval : DEFAULT_WATCH_INTERVAL;
|
|
596
|
+
m_interval = std::min(m_interval, timeout);
|
|
597
|
+
m_tsend = now + LCB_US2NS(timeout);
|
|
598
|
+
|
|
599
|
+
this->callback = cmd->callback;
|
|
600
|
+
this->cookie = const_cast<void*>(cookie_);
|
|
601
|
+
|
|
602
|
+
m_timer = lcbio_timer_new(instance->iotable, this, cb_watchix_tm);
|
|
603
|
+
lcb_aspend_add(&instance->pendops, LCB_PENDTYPE_COUNTER, NULL);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
WatchIndexCtx::~WatchIndexCtx()
|
|
607
|
+
{
|
|
608
|
+
if (m_timer) {
|
|
609
|
+
lcbio_timer_destroy(m_timer);
|
|
610
|
+
}
|
|
611
|
+
if (m_instance) {
|
|
612
|
+
lcb_aspend_del(&m_instance->pendops, LCB_PENDTYPE_COUNTER, NULL);
|
|
613
|
+
lcb_maybe_breakout(m_instance);
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
std::for_each(m_defsok.begin(), m_defsok.end(), my_delete<IndexSpec*>);
|
|
617
|
+
for (std::map<string,IndexSpec*>::iterator ii = m_defspend.begin();
|
|
618
|
+
ii != m_defspend.end(); ++ii) {
|
|
619
|
+
delete ii->second;
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
void
|
|
624
|
+
IndexSpec::to_key(const lcb_N1XSPEC* spec, std::string& s)
|
|
625
|
+
{
|
|
626
|
+
// Identity is:
|
|
627
|
+
// {keyspace,name,is_primary,type}
|
|
628
|
+
s.append(spec->nspace, spec->nnspace).append(" ");
|
|
629
|
+
s.append(spec->keyspace, spec->nkeyspace).append(" ");
|
|
630
|
+
s.append(spec->name, spec->nname).append(" ");
|
|
631
|
+
const char *type_s = ixtype_2_str(spec->ixtype);
|
|
632
|
+
if (!type_s) {
|
|
633
|
+
type_s = "<UNKNOWN>";
|
|
634
|
+
}
|
|
635
|
+
s.append(type_s);
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
void
|
|
639
|
+
WatchIndexCtx::read_state(const lcb_RESPN1XMGMT *resp)
|
|
640
|
+
{
|
|
641
|
+
// We examine the indexes here to see which ones have been completed
|
|
642
|
+
// Make them all into an std::map
|
|
643
|
+
if (resp->rc != LCB_SUCCESS) {
|
|
644
|
+
lcb_log(LOGARGS(this, INFO), LOGFMT "Error 0x%x while listing indexes. Rescheduling", LOGID(this), resp->rc);
|
|
645
|
+
reschedule();
|
|
646
|
+
return;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
std::map<std::string, const lcb_N1XSPEC*> in_specs;
|
|
650
|
+
for (size_t ii = 0; ii < resp->nspecs; ++ii) {
|
|
651
|
+
std::string key;
|
|
652
|
+
IndexSpec::to_key(resp->specs[ii], key);
|
|
653
|
+
in_specs[key] = resp->specs[ii];
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
std::map<std::string, IndexSpec*>::iterator it_remain = m_defspend.begin();
|
|
657
|
+
while (it_remain != m_defspend.end()) {
|
|
658
|
+
// See if the index is 'online' yet!
|
|
659
|
+
std::map<std::string,const lcb_N1XSPEC*>::iterator res;
|
|
660
|
+
res = in_specs.find(it_remain->first);
|
|
661
|
+
if (res == in_specs.end()) {
|
|
662
|
+
lcb_log(LOGARGS(this, INFO), LOGFMT "Index [%s] not in cluster", LOGID(this), it_remain->first.c_str());
|
|
663
|
+
// We can't find our own index. Someone else deleted it. Bail!
|
|
664
|
+
finish(LCB_KEY_ENOENT, resp);
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
std::string s_state(res->second->state, res->second->nstate);
|
|
669
|
+
if (s_state == "online") {
|
|
670
|
+
lcb_log(LOGARGS(this, DEBUG), LOGFMT "Index [%s] is ready", LOGID(this), it_remain->first.c_str());
|
|
671
|
+
m_defsok.push_back(it_remain->second);
|
|
672
|
+
m_defspend.erase(it_remain++);
|
|
673
|
+
} else {
|
|
674
|
+
++it_remain;
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
if (m_defspend.empty()) {
|
|
679
|
+
finish(LCB_SUCCESS, resp);
|
|
680
|
+
} else {
|
|
681
|
+
reschedule();
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
lcb_error_t
|
|
686
|
+
WatchIndexCtx::load_defs(const lcb_CMDN1XWATCH *cmd)
|
|
687
|
+
{
|
|
688
|
+
for (size_t ii = 0; ii < cmd->nspec; ++ii) {
|
|
689
|
+
std::string key;
|
|
690
|
+
IndexSpec *extspec = new IndexSpec(cmd->specs[ii]);
|
|
691
|
+
IndexSpec::to_key(extspec, key);
|
|
692
|
+
m_defspend[key] = extspec;
|
|
693
|
+
}
|
|
694
|
+
if (m_defspend.empty()) {
|
|
695
|
+
return LCB_ENO_COMMANDS;
|
|
696
|
+
}
|
|
697
|
+
return LCB_SUCCESS;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
void
|
|
701
|
+
WatchIndexCtx::finish(lcb_error_t rc, const lcb_RESPN1XMGMT *resp)
|
|
702
|
+
{
|
|
703
|
+
lcb_RESPN1XMGMT my_resp = { 0 };
|
|
704
|
+
my_resp.cookie = cookie;
|
|
705
|
+
my_resp.rc = rc;
|
|
706
|
+
|
|
707
|
+
if (resp) {
|
|
708
|
+
my_resp.inner = resp->inner;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
lcb_N1XSPEC **speclist = reinterpret_cast<lcb_N1XSPEC**>(&m_defsok[0]);
|
|
712
|
+
my_resp.specs = speclist;
|
|
713
|
+
my_resp.nspecs = m_defsok.size();
|
|
714
|
+
callback(m_instance, LCB_CALLBACK_IXMGMT, &my_resp);
|
|
715
|
+
delete this;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
void
|
|
719
|
+
WatchIndexCtx::reschedule()
|
|
720
|
+
{
|
|
721
|
+
// Next interval!
|
|
722
|
+
uint64_t now = lcb_nstime();
|
|
723
|
+
if (now + LCB_US2NS(m_interval) >= m_tsend) {
|
|
724
|
+
finish(LCB_ETIMEDOUT, NULL);
|
|
725
|
+
} else {
|
|
726
|
+
lcbio_timer_rearm(m_timer, m_interval);
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
static void
|
|
731
|
+
cb_watch_gotlist(lcb_t, int, const lcb_RESPN1XMGMT *resp)
|
|
732
|
+
{
|
|
733
|
+
WatchIndexCtx *ctx = reinterpret_cast<WatchIndexCtx*>(resp->cookie);
|
|
734
|
+
ctx->read_state(resp);
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
lcb_error_t
|
|
738
|
+
WatchIndexCtx::do_poll()
|
|
739
|
+
{
|
|
740
|
+
lcb_CMDN1XMGMT cmd;
|
|
741
|
+
memset(&cmd, 0, sizeof cmd);
|
|
742
|
+
cmd.callback = cb_watch_gotlist;
|
|
743
|
+
lcb_log(LOGARGS(this, DEBUG), LOGFMT "Will check for index readiness of %lu indexes. %lu completed", LOGID(this), m_defspend.size(), m_defsok.size());
|
|
744
|
+
return lcb_n1x_list(m_instance, this, &cmd);
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
LIBCOUCHBASE_API
|
|
748
|
+
lcb_error_t
|
|
749
|
+
lcb_n1x_watchbuild(lcb_t instance, const void *cookie, const lcb_CMDN1XWATCH *cmd)
|
|
750
|
+
{
|
|
751
|
+
WatchIndexCtx *ctx = new WatchIndexCtx(instance, cookie, cmd);
|
|
752
|
+
lcb_error_t rc;
|
|
753
|
+
if ((rc = ctx->load_defs(cmd)) != LCB_SUCCESS) {
|
|
754
|
+
delete ctx;
|
|
755
|
+
return rc;
|
|
756
|
+
}
|
|
757
|
+
if ((rc = ctx->do_poll()) != LCB_SUCCESS) {
|
|
758
|
+
delete ctx;
|
|
759
|
+
return rc;
|
|
760
|
+
}
|
|
761
|
+
return LCB_SUCCESS;
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
void
|
|
765
|
+
IndexSpec::load_json(const char *s, size_t n) {
|
|
766
|
+
Json::Value root;
|
|
767
|
+
// Set the JSON first!
|
|
768
|
+
m_buf.assign(s, n);
|
|
769
|
+
nrawjson = n;
|
|
770
|
+
|
|
771
|
+
if (!Json::Reader().parse(s, s + n, root)) {
|
|
772
|
+
rawjson = m_buf.c_str();
|
|
773
|
+
return;
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
m_buf.reserve(n + total_fields_size(root));
|
|
777
|
+
load_fields(root, true);
|
|
778
|
+
|
|
779
|
+
// Once all the fields are loaded, it's time to actually assign the
|
|
780
|
+
// rawjson field, which is simply the beginning of the buffer
|
|
781
|
+
rawjson = m_buf.c_str();
|
|
782
|
+
|
|
783
|
+
// Get the index type
|
|
784
|
+
string ixtype_s = root["using"].asString();
|
|
785
|
+
if (ixtype_s == "gsi") {
|
|
786
|
+
ixtype = LCB_N1XSPEC_T_GSI;
|
|
787
|
+
} else if (ixtype_s == "view") {
|
|
788
|
+
ixtype = LCB_N1XSPEC_T_VIEW;
|
|
789
|
+
}
|
|
790
|
+
if (root["is_primary"].asBool()) {
|
|
791
|
+
flags |= LCB_N1XSPEC_F_PRIMARY;
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
// IndexSpec stuff
|
|
796
|
+
IndexSpec::IndexSpec(const lcb_N1XSPEC *spec)
|
|
797
|
+
{
|
|
798
|
+
*static_cast<lcb_N1XSPEC*>(this) = *spec;
|
|
799
|
+
if (spec->nrawjson) {
|
|
800
|
+
load_json(spec->rawjson, spec->nrawjson);
|
|
801
|
+
return;
|
|
802
|
+
}
|
|
803
|
+
// Initialize the bufs
|
|
804
|
+
m_buf.reserve(nname + nkeyspace + nnspace + nstate + nfields + nrawjson + nstate + ncond);
|
|
805
|
+
load_field(&rawjson, spec->rawjson, nrawjson);
|
|
806
|
+
load_field(&name, spec->name, nname);
|
|
807
|
+
load_field(&keyspace, spec->keyspace, nkeyspace);
|
|
808
|
+
load_field(&nspace, spec->nspace, nnspace);
|
|
809
|
+
load_field(&state, spec->state, nstate);
|
|
810
|
+
load_field(&fields, spec->fields, nfields);
|
|
811
|
+
load_field(&cond, spec->cond, ncond);
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
size_t
|
|
815
|
+
IndexSpec::load_fields(const Json::Value& root, bool do_copy)
|
|
816
|
+
{
|
|
817
|
+
size_t size = 0;
|
|
818
|
+
size += load_json_field(root, "name", &name, &nname, do_copy);
|
|
819
|
+
size += load_json_field(root, "keyspace_id", &keyspace, &nkeyspace, do_copy);
|
|
820
|
+
size += load_json_field(root, "namespace_id", &nspace, &nnspace, do_copy);
|
|
821
|
+
size += load_json_field(root, "state", &state, &nstate, do_copy);
|
|
822
|
+
size += load_json_field(root, "index_key", &fields, &nfields, do_copy);
|
|
823
|
+
size += load_json_field(root, "condition", &cond, &ncond, do_copy);
|
|
824
|
+
return size;
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
size_t
|
|
828
|
+
IndexSpec::load_json_field(const Json::Value& root,
|
|
829
|
+
const char *name_, const char **tgt_ptr, size_t *tgt_len, bool do_copy)
|
|
830
|
+
{
|
|
831
|
+
size_t namelen = strlen(name_);
|
|
832
|
+
const Json::Value *val = root.find(name_, name_ + namelen);
|
|
833
|
+
size_t n = 0;
|
|
834
|
+
|
|
835
|
+
if (val == NULL) {
|
|
836
|
+
return 0;
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
if (val->isString()) {
|
|
840
|
+
const char *s_begin, *s_end;
|
|
841
|
+
if (val->getString(&s_begin, &s_end) && (n = s_end - s_begin) && do_copy) {
|
|
842
|
+
m_buf.insert(m_buf.end(), s_begin, s_end);
|
|
843
|
+
}
|
|
844
|
+
} else {
|
|
845
|
+
std::string frag = Json::FastWriter().write(*val);
|
|
846
|
+
n = frag.size();
|
|
847
|
+
if (do_copy) {
|
|
848
|
+
m_buf.append(frag);
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
if (n) {
|
|
853
|
+
*tgt_ptr = &(m_buf.c_str()[m_buf.size()-n]);
|
|
854
|
+
*tgt_len = n;
|
|
855
|
+
} else {
|
|
856
|
+
*tgt_ptr = NULL;
|
|
857
|
+
*tgt_len = 0;
|
|
858
|
+
}
|
|
859
|
+
return n;
|
|
860
|
+
}
|