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,81 @@
|
|
|
1
|
+
#ifndef CBC_OPTIONS_H
|
|
2
|
+
#define CBC_OPTIONS_H
|
|
3
|
+
|
|
4
|
+
#define CLIOPTS_ENABLE_CXX 1
|
|
5
|
+
#include <libcouchbase/couchbase.h>
|
|
6
|
+
#include <libcouchbase/api3.h>
|
|
7
|
+
#include <exception>
|
|
8
|
+
#include <stdexcept>
|
|
9
|
+
#include <sstream>
|
|
10
|
+
#include "contrib/cliopts/cliopts.h"
|
|
11
|
+
|
|
12
|
+
#define CBC_CONFIG_FILENAME ".cbcrc"
|
|
13
|
+
#define CBC_WIN32_APPDIR "Couchbase CBC Utility"
|
|
14
|
+
|
|
15
|
+
namespace cbc {
|
|
16
|
+
|
|
17
|
+
#define X_OPTIONS(X) \
|
|
18
|
+
X(String, host, "host", 'h') \
|
|
19
|
+
X(String, bucket, "bucket", 'b') \
|
|
20
|
+
X(String, passwd, "password", 'P') \
|
|
21
|
+
X(String, user, "username", 'u') \
|
|
22
|
+
X(String, transport, "bootstrap-protocol", 'C') \
|
|
23
|
+
X(String, configcache, "config-cache", 'Z') \
|
|
24
|
+
X(String, saslmech, "force-sasl-mech", 'S') \
|
|
25
|
+
X(String, connstr, "spec", 'U') \
|
|
26
|
+
X(String, ssl, "ssl", '\0') \
|
|
27
|
+
X(String, certpath, "certpath", '\0') \
|
|
28
|
+
X(UInt, timeout, "timeout", '\0') \
|
|
29
|
+
X(Bool, timings, "timings", 'T') \
|
|
30
|
+
X(Bool, verbose, "verbose", 'v') \
|
|
31
|
+
X(Bool, dump, "dump", '\0') \
|
|
32
|
+
X(List, cparams, "cparam", 'D')
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class LcbError : public std::runtime_error {
|
|
36
|
+
private:
|
|
37
|
+
static std::string format_err(lcb_error_t err) {
|
|
38
|
+
std::stringstream ss;
|
|
39
|
+
ss << "libcouchbase error: " << lcb_strerror(NULL, err);
|
|
40
|
+
ss << " (0x" << std::hex << err << ")";
|
|
41
|
+
return ss.str();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public:
|
|
45
|
+
lcb_error_t rc;
|
|
46
|
+
LcbError(lcb_error_t code) : std::runtime_error(format_err(code)) {}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
class BadArg : public std::runtime_error {
|
|
50
|
+
public:
|
|
51
|
+
BadArg(std::string w) : std::runtime_error(w) {}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
class ConnParams {
|
|
55
|
+
public:
|
|
56
|
+
ConnParams();
|
|
57
|
+
void fillCropts(lcb_create_st&);
|
|
58
|
+
void addToParser(cliopts::Parser& parser);
|
|
59
|
+
lcb_error_t doCtls(lcb_t instance);
|
|
60
|
+
bool useTimings() { return o_timings.result(); }
|
|
61
|
+
void setAdminMode();
|
|
62
|
+
bool shouldDump() { return o_dump.result(); }
|
|
63
|
+
void writeConfig(const std::string& dest = getConfigfileName());
|
|
64
|
+
static std::string getConfigfileName();
|
|
65
|
+
|
|
66
|
+
private:
|
|
67
|
+
|
|
68
|
+
#define X(tp, varname, longdesc, shortdesc) \
|
|
69
|
+
cliopts::tp##Option o_##varname;
|
|
70
|
+
|
|
71
|
+
X_OPTIONS(X)
|
|
72
|
+
#undef X
|
|
73
|
+
std::string connstr;
|
|
74
|
+
std::string passwd;
|
|
75
|
+
bool isAdmin;
|
|
76
|
+
bool loadFileDefaults();
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
#endif
|
|
@@ -0,0 +1,469 @@
|
|
|
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
|
+
|
|
18
|
+
#include "contrib/lcb-jsoncpp/lcb-jsoncpp.h"
|
|
19
|
+
#include "placeholders.h"
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <stdexcept>
|
|
22
|
+
|
|
23
|
+
namespace Pillowfight {
|
|
24
|
+
|
|
25
|
+
#define JSON_VALUE_SIZE 16
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Per-thread mutable state to generate the document. The populateIov()
|
|
29
|
+
* method is called to populate IOVs suitable for passing to the storage
|
|
30
|
+
* functions.
|
|
31
|
+
*/
|
|
32
|
+
class GeneratorState {
|
|
33
|
+
public:
|
|
34
|
+
/**
|
|
35
|
+
* Populate an IOV array
|
|
36
|
+
* @param seq The sequence number (used as a 'selector')
|
|
37
|
+
* @param[out] iov IOV containing pointers to buffers
|
|
38
|
+
*
|
|
39
|
+
* The buffers pointed to in the IOV array remain valid so long as
|
|
40
|
+
* the populateIov() function is not called again on this state
|
|
41
|
+
*/
|
|
42
|
+
virtual void populateIov(uint32_t seq, std::vector<lcb_IOV>& iov) = 0;
|
|
43
|
+
virtual ~GeneratorState() {}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
class SubdocGeneratorState {
|
|
47
|
+
public:
|
|
48
|
+
/**
|
|
49
|
+
* Populates subdocument command specifications
|
|
50
|
+
* @param seq the sequence number of the current command
|
|
51
|
+
* @param[in,out] specs container to hold the actual spec array.
|
|
52
|
+
* The spec array must have already been properly pre-sized.
|
|
53
|
+
*/
|
|
54
|
+
virtual void populateLookup(uint32_t seq, std::vector<lcb_SDSPEC>& specs) = 0;
|
|
55
|
+
virtual void populateMutate(uint32_t seq, std::vector<lcb_SDSPEC>& specs) = 0;
|
|
56
|
+
virtual ~SubdocGeneratorState() {}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
class DocGeneratorBase {
|
|
60
|
+
public:
|
|
61
|
+
/**
|
|
62
|
+
* Create the per-thread state for generating documents
|
|
63
|
+
* @param total_gens Number of total generator threads
|
|
64
|
+
* @param cur_gen The index of the current generator thread
|
|
65
|
+
* @return An opaque state object. This should be deleted by the caller
|
|
66
|
+
*/
|
|
67
|
+
virtual GeneratorState *createState(int total_gens, int cur_gen) const = 0;
|
|
68
|
+
virtual SubdocGeneratorState *createSubdocState(int, int) const { return NULL; }
|
|
69
|
+
virtual ~DocGeneratorBase() {}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Generator class for raw objects. This contains a fixed buffer and will
|
|
74
|
+
* simply vary in how 'long' the buffer is
|
|
75
|
+
*/
|
|
76
|
+
class RawDocGenerator : public DocGeneratorBase {
|
|
77
|
+
public:
|
|
78
|
+
/**
|
|
79
|
+
* Generate graded sizes based on a min,max specification. This allows us
|
|
80
|
+
* to be more efficient by cutting corners on how 'random' the sizes
|
|
81
|
+
* actually are. Rather than generating a 'random' size each time we need
|
|
82
|
+
* a document, we split the range into a set of potential sizes (which are
|
|
83
|
+
* also evenly distributed) and cycle between them.
|
|
84
|
+
*
|
|
85
|
+
* @param minsz Smallest desired size
|
|
86
|
+
* @param maxsz Largest desired size
|
|
87
|
+
* @param granularity How many grades to produce
|
|
88
|
+
* @return A vector of sizes which fall between the range
|
|
89
|
+
*/
|
|
90
|
+
static std::vector<size_t>
|
|
91
|
+
gen_graded_sizes(uint32_t minsz, uint32_t maxsz, int grades=10) {
|
|
92
|
+
std::vector<size_t> ret;
|
|
93
|
+
|
|
94
|
+
size_t diff = maxsz - minsz;
|
|
95
|
+
size_t factor = diff / grades;
|
|
96
|
+
if (factor == 0 || minsz == maxsz) {
|
|
97
|
+
ret.push_back(maxsz);
|
|
98
|
+
} else {
|
|
99
|
+
for (int ii = 0; ii < grades+1; ii++) {
|
|
100
|
+
size_t size = minsz + (factor * ii);
|
|
101
|
+
ret.push_back(size);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return ret;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
RawDocGenerator(uint32_t minsz, uint32_t maxsz)
|
|
108
|
+
: m_sizes(gen_graded_sizes(minsz, maxsz)) {
|
|
109
|
+
// Populate the buffer to its capacity
|
|
110
|
+
m_buf.insert(0, '#', maxsz);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class MyState : public GeneratorState {
|
|
115
|
+
public:
|
|
116
|
+
MyState(const RawDocGenerator *parent) : m_parent(parent) {
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const RawDocGenerator *m_parent;
|
|
120
|
+
void populateIov(uint32_t seq, std::vector<lcb_IOV>& iov_out) {
|
|
121
|
+
m_parent->populateIov(seq, iov_out);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
GeneratorState * createState(int, int) const {
|
|
126
|
+
return new MyState(this);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private:
|
|
130
|
+
void populateIov(uint32_t seq, std::vector<lcb_IOV>& iov_out) const {
|
|
131
|
+
iov_out.resize(1);
|
|
132
|
+
size_t cursz = m_sizes[seq % m_sizes.size()];
|
|
133
|
+
iov_out[0].iov_base = const_cast<char*>(m_buf.c_str());
|
|
134
|
+
iov_out[0].iov_len = cursz;
|
|
135
|
+
}
|
|
136
|
+
std::string m_buf;
|
|
137
|
+
std::vector<size_t> m_sizes;
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* This 'generator' ignores sizes and generates documents as they are received
|
|
142
|
+
* from premade buffers
|
|
143
|
+
*/
|
|
144
|
+
class PresetDocGenerator : public DocGeneratorBase {
|
|
145
|
+
public:
|
|
146
|
+
/**
|
|
147
|
+
* @param inputs List of fixed inputs to use
|
|
148
|
+
*/
|
|
149
|
+
PresetDocGenerator(const std::vector<std::string>& inputs) : m_bufs(inputs) {
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
class MyState : public GeneratorState {
|
|
153
|
+
public:
|
|
154
|
+
MyState(const PresetDocGenerator *parent) : m_parent(parent) {
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
void populateIov(uint32_t seq, std::vector<lcb_IOV>& iov_out) {
|
|
158
|
+
m_parent->populateIov(seq, iov_out);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
private:
|
|
162
|
+
const PresetDocGenerator *m_parent;
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
GeneratorState *createState(int, int) const {
|
|
166
|
+
return new MyState(this);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
protected:
|
|
170
|
+
PresetDocGenerator() {}
|
|
171
|
+
|
|
172
|
+
void populateIov(uint32_t seq, std::vector<lcb_IOV>& iov_out) const {
|
|
173
|
+
iov_out.resize(1);
|
|
174
|
+
const std::string& s = m_bufs[seq % m_bufs.size()];
|
|
175
|
+
iov_out[0].iov_base = const_cast<char *>(s.c_str());
|
|
176
|
+
iov_out[0].iov_len = s.size();
|
|
177
|
+
}
|
|
178
|
+
std::vector<std::string> m_bufs;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
// This is the same as the normal document generator, except we generate
|
|
182
|
+
// the JSON first
|
|
183
|
+
class JsonDocGenerator : public PresetDocGenerator {
|
|
184
|
+
private:
|
|
185
|
+
struct Doc {
|
|
186
|
+
std::string m_doc;
|
|
187
|
+
class Field {
|
|
188
|
+
public:
|
|
189
|
+
Field(const std::string& n, std::string& v) : m_name(n), m_value(v) {}
|
|
190
|
+
const std::string& name() const { return m_name; }
|
|
191
|
+
const std::string& value() const { return m_value; }
|
|
192
|
+
private:
|
|
193
|
+
std::string m_name;
|
|
194
|
+
std::string m_value;
|
|
195
|
+
};
|
|
196
|
+
std::vector<Field> m_fields;
|
|
197
|
+
};
|
|
198
|
+
std::vector<Doc> m_docs;
|
|
199
|
+
|
|
200
|
+
public:
|
|
201
|
+
/**
|
|
202
|
+
* @param minsz Minimum JSON document size
|
|
203
|
+
* @param maxsz Maximum JSON document size
|
|
204
|
+
*/
|
|
205
|
+
JsonDocGenerator(uint32_t minsz, uint32_t maxsz)
|
|
206
|
+
{
|
|
207
|
+
genDocuments(minsz, maxsz, m_docs);
|
|
208
|
+
for (size_t ii = 0; ii < m_docs.size(); ++ii) {
|
|
209
|
+
m_bufs.push_back(m_docs[ii].m_doc);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
static void genDocuments(uint32_t minsz, uint32_t maxsz, std::vector<std::string>& out)
|
|
214
|
+
{
|
|
215
|
+
std::vector<Doc> docs;
|
|
216
|
+
genDocuments(minsz, maxsz, docs);
|
|
217
|
+
for (size_t ii = 0; ii < docs.size(); ++ii) {
|
|
218
|
+
out.push_back(docs[ii].m_doc);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
private:
|
|
223
|
+
/**
|
|
224
|
+
* Helper method to decrease the original size by a given amount.
|
|
225
|
+
*
|
|
226
|
+
* This also ensures the number never reaches below 0.
|
|
227
|
+
*
|
|
228
|
+
* @param[out] orig Pointer to original size
|
|
229
|
+
* @param toDecr number by which to decrement
|
|
230
|
+
*/
|
|
231
|
+
static void decrSize(int *orig, size_t toDecr)
|
|
232
|
+
{
|
|
233
|
+
*orig = std::max(0, *orig - static_cast<int>(toDecr));
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
static void
|
|
237
|
+
genDocuments(uint32_t minsz, uint32_t maxsz, std::vector<Doc>& out)
|
|
238
|
+
{
|
|
239
|
+
std::vector<size_t> sizes = RawDocGenerator::gen_graded_sizes(minsz, maxsz);
|
|
240
|
+
for (std::vector<size_t>::iterator ii = sizes.begin();
|
|
241
|
+
ii != sizes.end(); ++ii) {
|
|
242
|
+
out.push_back(generate(*ii));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Generates a "JSON" document of a given size. In order to remain
|
|
248
|
+
* more or less in-tune with common document sizes, field names will be
|
|
249
|
+
* "Field_$incr" and values will be evenly distributed as fixed 16 byte
|
|
250
|
+
* strings. (See JSON_VALUE_SIZE)
|
|
251
|
+
*/
|
|
252
|
+
static Doc generate(int docsize)
|
|
253
|
+
{
|
|
254
|
+
int counter = 0;
|
|
255
|
+
char keybuf[128] = { 0 };
|
|
256
|
+
Json::Value root(Json::objectValue);
|
|
257
|
+
Json::FastWriter writer;
|
|
258
|
+
Doc ret;
|
|
259
|
+
|
|
260
|
+
while (docsize > 0) {
|
|
261
|
+
decrSize(&docsize, sprintf(keybuf, "Field_%d", ++counter) + 3);
|
|
262
|
+
size_t valsize = std::min(JSON_VALUE_SIZE, docsize);
|
|
263
|
+
if (!valsize) {
|
|
264
|
+
valsize = 1;
|
|
265
|
+
}
|
|
266
|
+
std::string value(valsize, '*');
|
|
267
|
+
decrSize(&docsize, valsize + 3);
|
|
268
|
+
root[keybuf] = value;
|
|
269
|
+
value = '"' + value;
|
|
270
|
+
value += '"';
|
|
271
|
+
ret.m_fields.push_back(Doc::Field(keybuf, value));
|
|
272
|
+
}
|
|
273
|
+
ret.m_doc = writer.write(root);
|
|
274
|
+
return ret;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
class SDGenstate: public SubdocGeneratorState {
|
|
278
|
+
public:
|
|
279
|
+
SDGenstate(const std::vector<Doc>& docs) : m_pathix(0), m_docs(docs) {
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
void populateLookup(uint32_t seq, std::vector<lcb_SDSPEC>& specs) {
|
|
283
|
+
populate(seq, specs, false);
|
|
284
|
+
}
|
|
285
|
+
void populateMutate(uint32_t seq, std::vector<lcb_SDSPEC>& specs) {
|
|
286
|
+
populate(seq, specs, true);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
private:
|
|
290
|
+
void populate(uint32_t seq, std::vector<lcb_SDSPEC>& specs, bool mutate) {
|
|
291
|
+
const Doc& d = doc(seq);
|
|
292
|
+
specs.resize(std::min(d.m_fields.size(), specs.size()));
|
|
293
|
+
for (size_t ii = 0; ii < d.m_fields.size() && ii < specs.size(); ++ii) {
|
|
294
|
+
const Doc::Field& f = d.m_fields[m_pathix++ % d.m_fields.size()];
|
|
295
|
+
lcb_SDSPEC& cur_spec = specs[ii];
|
|
296
|
+
LCB_SDSPEC_SET_PATH(&cur_spec, f.name().c_str(), f.name().size());
|
|
297
|
+
if (mutate) {
|
|
298
|
+
LCB_SDSPEC_SET_VALUE(&cur_spec, f.value().c_str(), f.value().size());
|
|
299
|
+
specs[ii].sdcmd = LCB_SDCMD_DICT_UPSERT;
|
|
300
|
+
} else {
|
|
301
|
+
specs[ii].sdcmd = LCB_SDCMD_GET;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const Doc& doc(uint32_t seq) const { return m_docs[seq % m_docs.size()]; }
|
|
307
|
+
size_t m_pathix;
|
|
308
|
+
const std::vector<Doc>& m_docs;
|
|
309
|
+
};
|
|
310
|
+
public:
|
|
311
|
+
virtual SubdocGeneratorState *createSubdocState(int, int) const {
|
|
312
|
+
return new SDGenstate(m_docs);
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
struct TemplateSpec {
|
|
317
|
+
std::string term;
|
|
318
|
+
unsigned minval;
|
|
319
|
+
unsigned maxval;
|
|
320
|
+
bool sequential;
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Generate documents based on placeholder values. Each document (JSON or not)
|
|
325
|
+
* may have one or more special replacement texts which can be substituted
|
|
326
|
+
* with a random number
|
|
327
|
+
*/
|
|
328
|
+
class PlaceholderDocGenerator : public DocGeneratorBase {
|
|
329
|
+
public:
|
|
330
|
+
/**
|
|
331
|
+
* @param specs Placeholder specifications
|
|
332
|
+
* @param inputs Documents to use for replacements
|
|
333
|
+
*/
|
|
334
|
+
PlaceholderDocGenerator(
|
|
335
|
+
const std::vector<std::string>& inputs,
|
|
336
|
+
const std::vector<TemplateSpec>& specs) {
|
|
337
|
+
|
|
338
|
+
initMatches(specs, inputs);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
protected:
|
|
342
|
+
PlaceholderDocGenerator() {}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Really belongs in constructor, but is decoupled for subclasses
|
|
346
|
+
*/
|
|
347
|
+
void initMatches(
|
|
348
|
+
const std::vector<TemplateSpec>& specs,
|
|
349
|
+
const std::vector<std::string>& inputs) {
|
|
350
|
+
|
|
351
|
+
using namespace Placeholders;
|
|
352
|
+
|
|
353
|
+
for (std::vector<TemplateSpec>::const_iterator ii = specs.begin();
|
|
354
|
+
ii != specs.end(); ++ii) {
|
|
355
|
+
Placeholders::Spec cur(ii->term, ii->minval, ii->maxval, ii->sequential);
|
|
356
|
+
pl_specs.push_back(cur);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
for (std::vector<std::string>::const_iterator ii = inputs.begin();
|
|
360
|
+
ii != inputs.end(); ++ii) {
|
|
361
|
+
matches.push_back(new DocumentMatches(*ii, pl_specs));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
public:
|
|
366
|
+
GeneratorState *createState(int total, int cur) const {
|
|
367
|
+
return new MyState(this, total, cur);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
private:
|
|
371
|
+
class MyState : public GeneratorState {
|
|
372
|
+
public:
|
|
373
|
+
MyState(const PlaceholderDocGenerator *parent, int total, int cur)
|
|
374
|
+
: m_parent(parent) {
|
|
375
|
+
using namespace Placeholders;
|
|
376
|
+
for (size_t ii = 0; ii < parent->matches.size(); ii++) {
|
|
377
|
+
m_substs.push_back(
|
|
378
|
+
Substitutions(parent->matches[ii], total, cur));
|
|
379
|
+
}
|
|
380
|
+
m_bufs.resize(m_substs.size());
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
void populateIov(uint32_t seq, std::vector<lcb_IOV>& iov_out) {
|
|
384
|
+
using namespace Placeholders;
|
|
385
|
+
size_t ix = seq % m_substs.size();
|
|
386
|
+
Substitutions& subst = m_substs[ix];
|
|
387
|
+
Substitutions::Backbuffer& buf = m_bufs[ix];
|
|
388
|
+
subst.makeIovs(iov_out, buf);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
std::vector<Placeholders::Substitutions::Backbuffer> m_bufs;
|
|
392
|
+
std::vector<Placeholders::Substitutions> m_substs;
|
|
393
|
+
const PlaceholderDocGenerator *m_parent;
|
|
394
|
+
};
|
|
395
|
+
|
|
396
|
+
// Match object for each doc
|
|
397
|
+
std::vector<Placeholders::DocumentMatches*> matches;
|
|
398
|
+
std::vector<Placeholders::Spec> pl_specs;
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Generate documents based on JSON fields. This adds on top of the normal
|
|
403
|
+
* document generator in that JSON paths are used and explicit placeholders
|
|
404
|
+
* are not required
|
|
405
|
+
*/
|
|
406
|
+
class PlaceholderJsonGenerator : public PlaceholderDocGenerator {
|
|
407
|
+
public:
|
|
408
|
+
/**
|
|
409
|
+
* @param specs List of specs. The term in the spec refers to the field
|
|
410
|
+
* which is to be replaced, not the placeholder text
|
|
411
|
+
* @param documents The documents to operate on
|
|
412
|
+
*/
|
|
413
|
+
PlaceholderJsonGenerator(
|
|
414
|
+
const std::vector<std::string>& documents,
|
|
415
|
+
const std::vector<TemplateSpec>& specs) {
|
|
416
|
+
|
|
417
|
+
initJsonPlaceholders(specs, documents);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Generate the documents, and then generate specs for them
|
|
422
|
+
* @param specs The specs to use
|
|
423
|
+
* @param minsz Minimum document size
|
|
424
|
+
* @param maxsz Maximum document size
|
|
425
|
+
*/
|
|
426
|
+
PlaceholderJsonGenerator(uint32_t minsz, uint32_t maxsz,
|
|
427
|
+
const std::vector<TemplateSpec>& specs) {
|
|
428
|
+
|
|
429
|
+
std::vector<std::string> jsondocs;
|
|
430
|
+
JsonDocGenerator::genDocuments(minsz, maxsz, jsondocs);
|
|
431
|
+
initJsonPlaceholders(specs, jsondocs);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
private:
|
|
435
|
+
void initJsonPlaceholders(
|
|
436
|
+
const std::vector<TemplateSpec>& specs,
|
|
437
|
+
const std::vector<std::string>& documents) {
|
|
438
|
+
|
|
439
|
+
int serial = 0;
|
|
440
|
+
Json::Reader reader;
|
|
441
|
+
Json::FastWriter writer;
|
|
442
|
+
std::vector<TemplateSpec> new_specs;
|
|
443
|
+
std::vector<std::string> new_docs;
|
|
444
|
+
|
|
445
|
+
for (size_t ii = 0; ii < documents.size(); ii++) {
|
|
446
|
+
Json::Value root;
|
|
447
|
+
if (!reader.parse(documents[ii], root)) {
|
|
448
|
+
throw std::runtime_error("Couldn't parse one or more documents!");
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
for (size_t jj = 0; jj < specs.size(); ++jj) {
|
|
452
|
+
char buf[64];
|
|
453
|
+
const TemplateSpec& spec = specs[jj];
|
|
454
|
+
sprintf(buf, "$__pillowfight_%d", serial++);
|
|
455
|
+
root[spec.term] = buf;
|
|
456
|
+
TemplateSpec new_spec = spec;
|
|
457
|
+
|
|
458
|
+
std::string replace_term(buf);
|
|
459
|
+
replace_term = '"' + replace_term + '"';
|
|
460
|
+
new_spec.term = replace_term;
|
|
461
|
+
new_specs.push_back(new_spec);
|
|
462
|
+
}
|
|
463
|
+
new_docs.push_back(writer.write(root));
|
|
464
|
+
}
|
|
465
|
+
initMatches(new_specs, new_docs);
|
|
466
|
+
}
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
} // namespace
|