libcouchbase 1.3.0 → 1.3.2
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 +5 -5
- data/.travis.yml +2 -2
- data/ext/libcouchbase/CMakeLists.txt +51 -25
- data/ext/libcouchbase/CONTRIBUTING.md +46 -65
- data/ext/libcouchbase/RELEASE_NOTES.markdown +163 -0
- data/ext/libcouchbase/cmake/Modules/DownloadLcbDep.cmake +9 -11
- data/ext/libcouchbase/cmake/Modules/FindProfiler.cmake +16 -0
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +6 -6
- data/ext/libcouchbase/cmake/config-cmake.h.in +2 -0
- data/ext/libcouchbase/cmake/configure +16 -0
- data/ext/libcouchbase/example/CMakeLists.txt +17 -2
- data/ext/libcouchbase/example/analytics/.gitignore +1 -0
- data/ext/libcouchbase/example/analytics/analytics.c +158 -0
- data/ext/libcouchbase/example/analytics/build-queries.rb +34 -0
- data/ext/libcouchbase/example/analytics/cJSON.c +1 -0
- data/ext/libcouchbase/example/analytics/cJSON.h +1 -0
- data/ext/libcouchbase/example/analytics/queries.h +113 -0
- data/ext/libcouchbase/example/analytics/queries/00-show-dataverse.json +5 -0
- data/ext/libcouchbase/example/analytics/queries/01-setup-dataset-breweries.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/02-setup-dataset-beers.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/03-initiate-shadow.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/04-list-datasets.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/05-count-breweries.json +5 -0
- data/ext/libcouchbase/example/analytics/queries/06-first-brewery.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/07-key-based-lookup.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/08-exact-match-lookup.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/09-exact-match-lookup-different-shape.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/10-other-query-filters.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/11-equijoin.json +9 -0
- data/ext/libcouchbase/example/analytics/queries/12-equijoin-select-star.json +10 -0
- data/ext/libcouchbase/example/analytics/queries/13-ansi-join.json +8 -0
- data/ext/libcouchbase/example/analytics/queries/14-join-select-values.json +8 -0
- data/ext/libcouchbase/example/analytics/queries/15-nested-outer-join.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/16-theta-join.json +8 -0
- data/ext/libcouchbase/example/analytics/queries/17-existential-quantification.json +9 -0
- data/ext/libcouchbase/example/analytics/queries/18-universal-quantification.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/19-simple-aggregation.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/20-simple-aggregation-unwrapped-value.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/21-simple-aggregation-explicit.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/22-grouping-and-aggregation.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/23-grouping-and-aggregation-with-hint.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/24-grouping-and-limits.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/25-named-parameters.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/26-positional-parameters.json +7 -0
- data/ext/libcouchbase/example/crypto/common_provider.c +2 -0
- data/ext/libcouchbase/example/crypto/common_provider.h +2 -0
- data/ext/libcouchbase/example/crypto/openssl_symmetric_decrypt.c +5 -0
- data/ext/libcouchbase/example/crypto/openssl_symmetric_encrypt.c +0 -1
- data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.c +16 -26
- data/ext/libcouchbase/example/db/db.c +10 -6
- data/ext/libcouchbase/example/fts/.gitignore +1 -0
- data/ext/libcouchbase/example/fts/build-queries.rb +33 -0
- data/ext/libcouchbase/example/fts/fts.c +142 -0
- data/ext/libcouchbase/example/fts/queries.h +61 -0
- data/ext/libcouchbase/example/fts/queries/00-simple-text-query.json +12 -0
- data/ext/libcouchbase/example/fts/queries/01-simple-text-query-on-non-default-index.json +9 -0
- data/ext/libcouchbase/example/fts/queries/02-simple-text-query-on-stored-field.json +13 -0
- data/ext/libcouchbase/example/fts/queries/03-match-query-with-facet.json +19 -0
- data/ext/libcouchbase/example/fts/queries/04-docid-query.json +11 -0
- data/ext/libcouchbase/example/fts/queries/05-unanalyzed-term-query-with-fuzziness-level-of-0.json +13 -0
- data/ext/libcouchbase/example/fts/queries/06-unanalyzed-term-query-with-fuzziness-level-of-2.json +14 -0
- data/ext/libcouchbase/example/fts/queries/07-match-phrase-query.json +13 -0
- data/ext/libcouchbase/example/fts/queries/08-phrase-query.json +16 -0
- data/ext/libcouchbase/example/fts/queries/09-query-string-query.json +9 -0
- data/ext/libcouchbase/example/fts/queries/10-conjunction-query.json +21 -0
- data/ext/libcouchbase/example/fts/queries/11-wild-card-query.json +13 -0
- data/ext/libcouchbase/example/fts/queries/12-numeric-range-query.json +11 -0
- data/ext/libcouchbase/example/fts/queries/13-regexp-query.json +13 -0
- data/ext/libcouchbase/example/minimal/.gitignore +1 -0
- data/ext/libcouchbase/example/minimal/query.c +185 -0
- data/ext/libcouchbase/example/subdoc/subdoc-xattrs.c +2 -2
- data/ext/libcouchbase/example/tracing/cJSON.c +1 -1
- data/ext/libcouchbase/example/tracing/cJSON.h +1 -1
- data/ext/libcouchbase/include/libcouchbase/cbft.h +38 -4
- data/ext/libcouchbase/include/libcouchbase/cntl-private.h +8 -97
- data/ext/libcouchbase/include/libcouchbase/cntl.h +288 -8
- data/ext/libcouchbase/include/libcouchbase/couchbase.h +47 -10
- data/ext/libcouchbase/include/libcouchbase/crypto.h +214 -48
- data/ext/libcouchbase/include/libcouchbase/deprecated.h +12 -0
- data/ext/libcouchbase/include/libcouchbase/error.h +33 -2
- data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +1 -1
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +87 -13
- data/ext/libcouchbase/include/libcouchbase/subdoc.h +3 -7
- data/ext/libcouchbase/include/libcouchbase/tracing.h +174 -56
- data/ext/libcouchbase/include/libcouchbase/vbucket.h +21 -1
- data/ext/libcouchbase/include/libcouchbase/views.h +49 -4
- data/ext/libcouchbase/packaging/deb/control +2 -3
- data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
- data/ext/libcouchbase/plugins/io/libev/CMakeLists.txt +7 -5
- data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +7 -5
- data/ext/libcouchbase/plugins/io/libuv/CMakeLists.txt +14 -12
- data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +3 -0
- data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +14 -6
- data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +7 -5
- data/ext/libcouchbase/src/bootstrap.cc +6 -1
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +2 -7
- data/ext/libcouchbase/src/bucketconfig/bc_file.cc +1 -1
- data/ext/libcouchbase/src/bucketconfig/bc_http.cc +4 -11
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +29 -36
- data/ext/libcouchbase/src/bucketconfig/confmon.cc +4 -2
- data/ext/libcouchbase/src/cntl.cc +181 -151
- data/ext/libcouchbase/src/config_static.h +1 -1
- data/ext/libcouchbase/src/connspec.cc +5 -1
- data/ext/libcouchbase/src/connspec.h +3 -1
- data/ext/libcouchbase/src/crypto.cc +93 -80
- data/ext/libcouchbase/src/dns-srv.cc +1 -1
- data/ext/libcouchbase/src/handler.cc +0 -1
- data/ext/libcouchbase/src/http/http-priv.h +1 -0
- data/ext/libcouchbase/src/http/http.cc +1 -2
- data/ext/libcouchbase/src/instance.cc +21 -2
- data/ext/libcouchbase/src/internal.h +1 -0
- data/ext/libcouchbase/src/lcbio/ctx.c +24 -3
- data/ext/libcouchbase/src/lcbio/ioutils.cc +1 -1
- data/ext/libcouchbase/src/lcbio/rw-inl.h +22 -1
- data/ext/libcouchbase/src/lcbio/ssl.h +2 -0
- data/ext/libcouchbase/src/mc/compress.cc +18 -11
- data/ext/libcouchbase/src/mc/mcreq.c +2 -0
- data/ext/libcouchbase/src/mc/mcreq.h +1 -1
- data/ext/libcouchbase/src/mcserver/mcserver.cc +163 -6
- data/ext/libcouchbase/src/mcserver/negotiate.cc +17 -7
- data/ext/libcouchbase/src/n1ql/n1ql.cc +12 -3
- data/ext/libcouchbase/src/newconfig.cc +4 -3
- data/ext/libcouchbase/src/nodeinfo.cc +1 -7
- data/ext/libcouchbase/src/operations/observe.cc +1 -0
- data/ext/libcouchbase/src/operations/ping.cc +5 -3
- data/ext/libcouchbase/src/retryq.cc +22 -0
- data/ext/libcouchbase/src/retryq.h +2 -1
- data/ext/libcouchbase/src/rnd.cc +5 -12
- data/ext/libcouchbase/src/settings.c +4 -7
- data/ext/libcouchbase/src/settings.h +6 -2
- data/ext/libcouchbase/src/strcodecs/base64.c +59 -0
- data/ext/libcouchbase/src/strcodecs/strcodecs.h +2 -0
- data/ext/libcouchbase/src/trace.h +2 -2
- data/ext/libcouchbase/src/tracing/span.cc +177 -45
- data/ext/libcouchbase/src/tracing/threshold_logging_tracer.cc +70 -28
- data/ext/libcouchbase/src/tracing/tracing-internal.h +33 -48
- data/ext/libcouchbase/src/vbucket/vbucket.c +146 -30
- data/ext/libcouchbase/src/wait.cc +1 -1
- data/ext/libcouchbase/tests/CMakeLists.txt +13 -4
- data/ext/libcouchbase/tests/iotests/mock-environment.cc +1 -1
- data/ext/libcouchbase/tests/iotests/t_misc.cc +2 -2
- data/ext/libcouchbase/tests/iotests/t_views.cc +1 -1
- data/ext/libcouchbase/tests/iotests/testutil.cc +3 -2
- data/ext/libcouchbase/tests/vbucket/confdata/map_node_present_nodesext_missing_nodes.json +94 -0
- data/ext/libcouchbase/tests/vbucket/t_config.cc +15 -0
- data/ext/libcouchbase/tools/CMakeLists.txt +11 -6
- data/ext/libcouchbase/tools/cbc-handlers.h +9 -0
- data/ext/libcouchbase/tools/cbc-proxy.cc +1 -1
- data/ext/libcouchbase/tools/cbc.cc +33 -5
- data/ext/libcouchbase/tools/common/options.cc +1 -1
- data/ext/libcouchbase/tools/extract-packets.rb +110 -0
- data/lib/libcouchbase/connection.rb +13 -5
- data/lib/libcouchbase/ext/tasks.rb +1 -1
- data/lib/libcouchbase/version.rb +1 -1
- metadata +62 -7
|
@@ -66,10 +66,19 @@ IF(CMAKE_COMPILER_IS_GNUCXX)
|
|
|
66
66
|
COMPILE_FLAGS "-Wno-sign-compare -Wno-missing-field-initializers")
|
|
67
67
|
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
|
|
68
68
|
|
|
69
|
-
IF(NOT
|
|
70
|
-
|
|
71
|
-
"${PROJECT_SOURCE_DIR}/tests/CouchbaseMock.jar")
|
|
72
|
-
ENDIF(
|
|
69
|
+
IF(NOT LCB_NO_MOCK)
|
|
70
|
+
IF(NOT EXISTS ${PROJECT_SOURCE_DIR}/tests/CouchbaseMock.jar)
|
|
71
|
+
DOWNLOAD_LCB_DEP("${COUCHBASE_MOCK_URL}" "${PROJECT_SOURCE_DIR}/tests/CouchbaseMock.jar")
|
|
72
|
+
ENDIF()
|
|
73
|
+
FIND_PROGRAM(JAVA java)
|
|
74
|
+
EXECUTE_PROCESS(COMMAND "${JAVA}" -jar "${PROJECT_SOURCE_DIR}/tests/CouchbaseMock.jar" --version
|
|
75
|
+
RESULT_VARIABLE RET OUTPUT_VARIABLE VER OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
76
|
+
IF(RET EQUAL 0)
|
|
77
|
+
MESSAGE(STATUS "Using ${VER}")
|
|
78
|
+
ELSE()
|
|
79
|
+
MESSAGE(FATAL_ERROR "Unable to use ${PROJECT_SOURCE_DIR}/tests/CouchbaseMock.jar as CouchbaseMock")
|
|
80
|
+
ENDIF()
|
|
81
|
+
ENDIF()
|
|
73
82
|
|
|
74
83
|
# We're a library using the shared CRT. Don't use the static one
|
|
75
84
|
INCLUDE_DIRECTORIES(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})
|
|
@@ -754,7 +754,7 @@ TEST_F(MockUnitTest, testAppendE2BIG)
|
|
|
754
754
|
size_t nkey = strlen(key);
|
|
755
755
|
|
|
756
756
|
size_t nvalue1 = 20 * 1024 * 1024;
|
|
757
|
-
void *value1 =
|
|
757
|
+
void *value1 = calloc(nvalue1, sizeof(char));
|
|
758
758
|
lcb_CMDSTORE scmd = { 0 };
|
|
759
759
|
scmd.operation = LCB_SET;
|
|
760
760
|
LCB_CMD_SET_KEY(&scmd, key, nkey);
|
|
@@ -765,7 +765,7 @@ TEST_F(MockUnitTest, testAppendE2BIG)
|
|
|
765
765
|
free(value1);
|
|
766
766
|
|
|
767
767
|
size_t nvalue2 = 1 * 1024 * 1024;
|
|
768
|
-
void *value2 =
|
|
768
|
+
void *value2 = calloc(nvalue2, sizeof(char));
|
|
769
769
|
lcb_CMDSTORE acmd = { 0 };
|
|
770
770
|
acmd.operation = LCB_APPEND;
|
|
771
771
|
LCB_CMD_SET_KEY(&acmd, key, nkey);
|
|
@@ -31,6 +31,7 @@ ViewsUnitTest::connectBeerSample(HandleWrap& hw, lcb_t& instance, bool first)
|
|
|
31
31
|
{
|
|
32
32
|
lcb_create_st crparams;
|
|
33
33
|
lcb_create_st crparamsAdmin;
|
|
34
|
+
lcb_config_transport_t transports[] = {LCB_CONFIG_TRANSPORT_HTTP, LCB_CONFIG_TRANSPORT_LIST_END};
|
|
34
35
|
MockEnvironment::getInstance()->makeConnectParams(crparams, NULL);
|
|
35
36
|
crparamsAdmin = crparams;
|
|
36
37
|
|
|
@@ -40,7 +41,6 @@ ViewsUnitTest::connectBeerSample(HandleWrap& hw, lcb_t& instance, bool first)
|
|
|
40
41
|
// the logs cleaner.
|
|
41
42
|
crparams.v.v2.user = "beer-sample";
|
|
42
43
|
crparams.v.v2.mchosts = NULL;
|
|
43
|
-
lcb_config_transport_t transports[] = {LCB_CONFIG_TRANSPORT_HTTP, LCB_CONFIG_TRANSPORT_LIST_END};
|
|
44
44
|
crparams.v.v2.transports = transports;
|
|
45
45
|
}
|
|
46
46
|
|
|
@@ -88,10 +88,11 @@ void KVOperation::assertOk(lcb_error_t err)
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
if (allowableErrors.empty()) {
|
|
91
|
-
ASSERT_EQ(LCB_SUCCESS, err);
|
|
91
|
+
ASSERT_EQ(LCB_SUCCESS, err) << "Unexpected error: " << lcb_strerror_short(err);
|
|
92
92
|
return;
|
|
93
93
|
}
|
|
94
|
-
ASSERT_TRUE(allowableErrors.find(err) != allowableErrors.end())
|
|
94
|
+
ASSERT_TRUE(allowableErrors.find(err) != allowableErrors.end())
|
|
95
|
+
<< "Unable to find " << lcb_strerror_short(err) << " in allowable errors";
|
|
95
96
|
}
|
|
96
97
|
|
|
97
98
|
void KVOperation::store(lcb_t instance)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"rev":32470,
|
|
3
|
+
"name":"cache",
|
|
4
|
+
"uri":"/pools/default/buckets/cache?bucket_uuid=c82bb209e1afd5d938d7adcb6ea10de2",
|
|
5
|
+
"streamingUri":"/pools/default/bucketsStreaming/cache?bucket_uuid=c82bb209e1afd5d938d7adcb6ea10de2",
|
|
6
|
+
"nodes":[
|
|
7
|
+
{
|
|
8
|
+
"couchApiBase":"http://10.0.0.1:8092/cache%2Bc82bb209e1afd5d938d7adcb6ea10de2",
|
|
9
|
+
"hostname":"10.0.0.1:8091",
|
|
10
|
+
"ports":{
|
|
11
|
+
"proxy":11211,
|
|
12
|
+
"direct":11210
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"couchApiBase":"http://10.0.0.2:8092/cache%2Bc82bb209e1afd5d938d7adcb6ea10de2",
|
|
17
|
+
"hostname":"10.0.0.2:8091",
|
|
18
|
+
"ports":{
|
|
19
|
+
"proxy":11211,
|
|
20
|
+
"direct":11210
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"couchApiBase":"http://10.0.0.3:8092/cache%2Bc82bb209e1afd5d938d7adcb6ea10de2",
|
|
25
|
+
"hostname":"10.0.0.3:8091",
|
|
26
|
+
"ports":{
|
|
27
|
+
"proxy":11211,
|
|
28
|
+
"direct":11210
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"nodesExt":[
|
|
33
|
+
{
|
|
34
|
+
"services":{
|
|
35
|
+
"mgmt":8091,
|
|
36
|
+
"mgmtSSL":18091,
|
|
37
|
+
"capiSSL":18092,
|
|
38
|
+
"capi":8092,
|
|
39
|
+
"kvSSL":11207,
|
|
40
|
+
"projector":9999,
|
|
41
|
+
"kv":11210,
|
|
42
|
+
"moxi":11211
|
|
43
|
+
},
|
|
44
|
+
"thisNode":true,
|
|
45
|
+
"hostname":"10.0.0.1"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"services":{
|
|
49
|
+
"mgmt":8091,
|
|
50
|
+
"mgmtSSL":18091,
|
|
51
|
+
"capiSSL":18092,
|
|
52
|
+
"capi":8092,
|
|
53
|
+
"kvSSL":11207,
|
|
54
|
+
"projector":9999,
|
|
55
|
+
"kv":11210,
|
|
56
|
+
"moxi":11211
|
|
57
|
+
},
|
|
58
|
+
"hostname":"10.0.0.2"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"services":{
|
|
62
|
+
"mgmt":8091,
|
|
63
|
+
"mgmtSSL":18091,
|
|
64
|
+
"capiSSL":18092,
|
|
65
|
+
"capi":8092,
|
|
66
|
+
"kvSSL":11207,
|
|
67
|
+
"projector":9999,
|
|
68
|
+
"kv":11210,
|
|
69
|
+
"moxi":11211
|
|
70
|
+
},
|
|
71
|
+
"hostname":"10.0.0.3"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"services":{
|
|
75
|
+
"mgmt":8091,
|
|
76
|
+
"mgmtSSL":18091,
|
|
77
|
+
"capiSSL":18092,
|
|
78
|
+
"capi":8092,
|
|
79
|
+
"kvSSL":11207,
|
|
80
|
+
"projector":9999,
|
|
81
|
+
"kv":11210,
|
|
82
|
+
"moxi":11211
|
|
83
|
+
},
|
|
84
|
+
"hostname":"10.0.0.4"
|
|
85
|
+
}
|
|
86
|
+
],
|
|
87
|
+
"nodeLocator":"ketama",
|
|
88
|
+
"uuid":"c82bb209e1afd5d938d7adcb6ea10de2",
|
|
89
|
+
"bucketCapabilitiesVer":"",
|
|
90
|
+
"bucketCapabilities":[
|
|
91
|
+
"cbhello",
|
|
92
|
+
"nodesExt"
|
|
93
|
+
]
|
|
94
|
+
}
|
|
@@ -369,3 +369,18 @@ TEST_F(ConfigTest, testKetamaCompliance) {
|
|
|
369
369
|
|
|
370
370
|
lcbvb_destroy(vbc);
|
|
371
371
|
}
|
|
372
|
+
|
|
373
|
+
TEST_F(ConfigTest, testPresentNodesextMissingNodesKetama)
|
|
374
|
+
{
|
|
375
|
+
// Scenario when a node is in nodesext but not nodes
|
|
376
|
+
string txt = getConfigFile("map_node_present_nodesext_missing_nodes.json");
|
|
377
|
+
lcbvb_CONFIG *vbc = lcbvb_parse_json(txt.c_str());
|
|
378
|
+
ASSERT_TRUE(vbc != NULL);
|
|
379
|
+
ASSERT_EQ(4, vbc->nsrv);
|
|
380
|
+
ASSERT_EQ(LCBVB_DIST_KETAMA, vbc->dtype);
|
|
381
|
+
|
|
382
|
+
ASSERT_NE((const char *)NULL, lcbvb_get_hostport(vbc, 0, LCBVB_SVCTYPE_DATA, LCBVB_SVCMODE_PLAIN));
|
|
383
|
+
ASSERT_NE((const char *)NULL, lcbvb_get_hostport(vbc, 1, LCBVB_SVCTYPE_DATA, LCBVB_SVCMODE_PLAIN));
|
|
384
|
+
ASSERT_NE((const char *)NULL, lcbvb_get_hostport(vbc, 2, LCBVB_SVCTYPE_DATA, LCBVB_SVCMODE_PLAIN));
|
|
385
|
+
ASSERT_EQ((const char *)NULL, lcbvb_get_hostport(vbc, 3, LCBVB_SVCTYPE_DATA, LCBVB_SVCMODE_PLAIN));
|
|
386
|
+
}
|
|
@@ -19,7 +19,10 @@ TARGET_LINK_LIBRARIES(cbc-n1qlback couchbase)
|
|
|
19
19
|
INSTALL(TARGETS cbc cbc-pillowfight cbc-n1qlback
|
|
20
20
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
IF (NOT OPENSSL_FOUND AND (NOT LCB_NO_SSL))
|
|
23
|
+
FIND_PACKAGE(OpenSSL)
|
|
24
|
+
ENDIF()
|
|
25
|
+
|
|
23
26
|
IF(OPENSSL_FOUND AND (NOT LCB_NO_SSL))
|
|
24
27
|
INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
|
|
25
28
|
ADD_DEFINITIONS(${OPENSSL_DEFINITIONS})
|
|
@@ -31,11 +34,11 @@ IF(MSVC)
|
|
|
31
34
|
SET_TARGET_PROPERTIES(cbc PROPERTIES DEBUG_OUTPUT_NAME cbc_d)
|
|
32
35
|
SET_TARGET_PROPERTIES(cbc-pillowfight PROPERTIES DEBUG_OUTPUT_NAME cbc-pillowfight_d)
|
|
33
36
|
SET_TARGET_PROPERTIES(cbc-n1qlback PROPERTIES DEBUG_OUTPUT_NAME cbc-n1qlback_d)
|
|
34
|
-
ENDIF()
|
|
35
37
|
|
|
36
|
-
INSTALL_PDBS(cbc)
|
|
37
|
-
INSTALL_PDBS(cbc-pillowfight)
|
|
38
|
-
INSTALL_PDBS(cbc-n1qlback)
|
|
38
|
+
INSTALL_PDBS(cbc)
|
|
39
|
+
INSTALL_PDBS(cbc-pillowfight)
|
|
40
|
+
INSTALL_PDBS(cbc-n1qlback)
|
|
41
|
+
ENDIF()
|
|
39
42
|
|
|
40
43
|
SET_TARGET_PROPERTIES(lcbtools PROPERTIES COMPILE_FLAGS "${LCB_CORE_CXXFLAGS}")
|
|
41
44
|
SET_SOURCE_FILES_PROPERTIES(cbc.cc cbc-pillowfight.cc cbc-n1qlback.cc PROPERTIES COMPILE_FLAGS "${LCB_CORE_CXXFLAGS}")
|
|
@@ -62,7 +65,9 @@ IF(NOT WIN32)
|
|
|
62
65
|
cat create observe observe-seqno incr decr mcflush hash lock
|
|
63
66
|
unlock rm stats version verbosity view n1ql admin ping
|
|
64
67
|
bucket-create bucket-delete bucket-flush connstr write-config strerror
|
|
65
|
-
touch role-list user-list user-upsert user-delete watch
|
|
68
|
+
touch role-list user-list user-upsert user-delete watch
|
|
69
|
+
mcversion
|
|
70
|
+
)
|
|
66
71
|
|
|
67
72
|
FOREACH(subcmd IN ITEMS ${CBC_SUBCOMMANDS})
|
|
68
73
|
ADD_CUSTOM_COMMAND(TARGET cbc POST_BUILD
|
|
@@ -220,6 +220,15 @@ protected:
|
|
|
220
220
|
void run();
|
|
221
221
|
};
|
|
222
222
|
|
|
223
|
+
class McVersionHandler : public Handler {
|
|
224
|
+
public:
|
|
225
|
+
HANDLER_DESCRIPTION("Query server versions using the memcached command")
|
|
226
|
+
HANDLER_USAGE("[OPTIONS ...]")
|
|
227
|
+
McVersionHandler() : Handler("mcversion") {}
|
|
228
|
+
protected:
|
|
229
|
+
void run();
|
|
230
|
+
};
|
|
231
|
+
|
|
223
232
|
class PingHandler : public Handler {
|
|
224
233
|
public:
|
|
225
234
|
HANDLER_DESCRIPTION("Reach all services on every node and measure response time")
|
|
@@ -350,7 +350,7 @@ static void conn_readcb(struct bufferevent *bev, void *cookie)
|
|
|
350
350
|
cmd.callback = n1ql_callback;
|
|
351
351
|
cl->cnt = 0;
|
|
352
352
|
if (cbas) {
|
|
353
|
-
cmd.cmdflags |=
|
|
353
|
+
cmd.cmdflags |= LCB_CMDN1QL_F_ANALYTICSQUERY;
|
|
354
354
|
}
|
|
355
355
|
rc = lcb_n1ql_query(instance, cl, &cmd);
|
|
356
356
|
if (rc != LCB_SUCCESS) {
|
|
@@ -81,9 +81,15 @@ get_callback(lcb_t, lcb_CALLBACKTYPE cbtype, const lcb_RESPGET *resp)
|
|
|
81
81
|
key.c_str(), resp->cas, resp->itmflags, (unsigned long)resp->nvalue,
|
|
82
82
|
(int)resp->datatype);
|
|
83
83
|
if (resp->datatype) {
|
|
84
|
+
int nflags = 0;
|
|
84
85
|
fprintf(stderr, "(");
|
|
85
86
|
if (resp->datatype & LCB_VALUE_F_JSON) {
|
|
86
87
|
fprintf(stderr, "JSON");
|
|
88
|
+
nflags++;
|
|
89
|
+
}
|
|
90
|
+
if (resp->datatype & LCB_VALUE_F_SNAPPYCOMP) {
|
|
91
|
+
fprintf(stderr, "%sSNAPPY", nflags > 0 ? "," : "");
|
|
92
|
+
nflags++;
|
|
87
93
|
}
|
|
88
94
|
fprintf(stderr, ")");
|
|
89
95
|
}
|
|
@@ -262,11 +268,14 @@ watch_callback(lcb_t, lcb_CALLBACKTYPE, const lcb_RESPSTATS *resp)
|
|
|
262
268
|
static void
|
|
263
269
|
common_server_callback(lcb_t, int cbtype, const lcb_RESPSERVERBASE *sbase)
|
|
264
270
|
{
|
|
265
|
-
|
|
271
|
+
string msg;
|
|
266
272
|
if (cbtype == LCB_CALLBACK_VERBOSITY) {
|
|
267
273
|
msg = "Set verbosity";
|
|
268
274
|
} else if (cbtype == LCB_CALLBACK_FLUSH) {
|
|
269
275
|
msg = "Flush";
|
|
276
|
+
} else if (cbtype == LCB_CALLBACK_VERSIONS) {
|
|
277
|
+
const lcb_RESPMCVERSION *resp = (const lcb_RESPMCVERSION *)sbase;
|
|
278
|
+
msg = string(resp->mcversion, resp->nversion);
|
|
270
279
|
} else {
|
|
271
280
|
msg = "";
|
|
272
281
|
}
|
|
@@ -274,10 +283,10 @@ common_server_callback(lcb_t, int cbtype, const lcb_RESPSERVERBASE *sbase)
|
|
|
274
283
|
return;
|
|
275
284
|
}
|
|
276
285
|
if (sbase->rc != LCB_SUCCESS) {
|
|
277
|
-
fprintf(stderr, "%s failed for server %s: %s\n", msg, sbase->server,
|
|
286
|
+
fprintf(stderr, "%s failed for server %s: %s\n", msg.c_str(), sbase->server,
|
|
278
287
|
lcb_strerror(NULL, sbase->rc));
|
|
279
288
|
} else {
|
|
280
|
-
fprintf(stderr, "%s: %s\n", msg, sbase->server);
|
|
289
|
+
fprintf(stderr, "%s: %s\n", msg.c_str(), sbase->server);
|
|
281
290
|
}
|
|
282
291
|
}
|
|
283
292
|
|
|
@@ -834,6 +843,7 @@ VersionHandler::run()
|
|
|
834
843
|
lcb_get_version(NULL), changeset);
|
|
835
844
|
fprintf(stderr, " Headers: Version=%s, Changeset=%s\n",
|
|
836
845
|
LCB_VERSION_STRING, LCB_VERSION_CHANGESET);
|
|
846
|
+
fprintf(stderr, " Build Timestamp: %s\n", LCB_BUILD_TIMESTAMP);
|
|
837
847
|
|
|
838
848
|
struct lcb_cntl_iops_info_st info;
|
|
839
849
|
memset(&info, 0, sizeof info);
|
|
@@ -1033,6 +1043,23 @@ VerbosityHandler::run()
|
|
|
1033
1043
|
lcb_wait(instance);
|
|
1034
1044
|
}
|
|
1035
1045
|
|
|
1046
|
+
void
|
|
1047
|
+
McVersionHandler::run()
|
|
1048
|
+
{
|
|
1049
|
+
Handler::run();
|
|
1050
|
+
|
|
1051
|
+
lcb_install_callback3(instance, LCB_CALLBACK_VERSIONS, (lcb_RESPCALLBACK)common_server_callback);
|
|
1052
|
+
lcb_CMDBASE cmd = { 0 };
|
|
1053
|
+
lcb_error_t err;
|
|
1054
|
+
lcb_sched_enter(instance);
|
|
1055
|
+
err = lcb_server_versions3(instance, NULL, &cmd);
|
|
1056
|
+
if (err != LCB_SUCCESS) {
|
|
1057
|
+
throw LcbError(err);
|
|
1058
|
+
}
|
|
1059
|
+
lcb_sched_leave(instance);
|
|
1060
|
+
lcb_wait(instance);
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1036
1063
|
void
|
|
1037
1064
|
PingHandler::run()
|
|
1038
1065
|
{
|
|
@@ -1041,7 +1068,7 @@ PingHandler::run()
|
|
|
1041
1068
|
lcb_install_callback3(instance, LCB_CALLBACK_PING, (lcb_RESPCALLBACK)ping_callback);
|
|
1042
1069
|
lcb_CMDPING cmd = { 0 };
|
|
1043
1070
|
lcb_error_t err;
|
|
1044
|
-
cmd.services = LCB_PINGSVC_F_KV | LCB_PINGSVC_F_N1QL | LCB_PINGSVC_F_VIEWS | LCB_PINGSVC_F_FTS;
|
|
1071
|
+
cmd.services = LCB_PINGSVC_F_KV | LCB_PINGSVC_F_N1QL | LCB_PINGSVC_F_VIEWS | LCB_PINGSVC_F_FTS | LCB_PINGSVC_F_ANALYTICS;
|
|
1045
1072
|
cmd.options = LCB_PINGOPT_F_JSON | LCB_PINGOPT_F_JSONPRETTY;
|
|
1046
1073
|
if (o_details.passed()) {
|
|
1047
1074
|
cmd.options |= LCB_PINGOPT_F_JSONDETAILS;
|
|
@@ -1243,7 +1270,7 @@ N1qlHandler::run()
|
|
|
1243
1270
|
cmd.cmdflags |= LCB_CMDN1QL_F_PREPCACHE;
|
|
1244
1271
|
}
|
|
1245
1272
|
if (o_analytics.passed()) {
|
|
1246
|
-
cmd.cmdflags |=
|
|
1273
|
+
cmd.cmdflags |= LCB_CMDN1QL_F_ANALYTICSQUERY;
|
|
1247
1274
|
}
|
|
1248
1275
|
fprintf(stderr, "---> Encoded query: %.*s\n", (int)cmd.nquery, cmd.query);
|
|
1249
1276
|
cmd.callback = n1qlCallback;
|
|
@@ -1765,6 +1792,7 @@ setupHandlers()
|
|
|
1765
1792
|
handlers_s["user-list"] = new UserListHandler();
|
|
1766
1793
|
handlers_s["user-upsert"] = new UserUpsertHandler();
|
|
1767
1794
|
handlers_s["user-delete"] = new UserDeleteHandler();
|
|
1795
|
+
handlers_s["mcversion"] = new McVersionHandler();
|
|
1768
1796
|
|
|
1769
1797
|
map<string,Handler*>::iterator ii;
|
|
1770
1798
|
for (ii = handlers_s.begin(); ii != handlers_s.end(); ++ii) {
|
|
@@ -434,7 +434,7 @@ ConnParams::doCtls(lcb_t instance)
|
|
|
434
434
|
// Set the detailed error codes option
|
|
435
435
|
doSctl<int>(instance, LCB_CNTL_DETAILED_ERRCODES, 1);
|
|
436
436
|
|
|
437
|
-
{
|
|
437
|
+
if (!o_connstr.passed() || o_connstr.result().find("compression=") == std::string::npos) {
|
|
438
438
|
int opts = LCB_COMPRESS_IN;
|
|
439
439
|
if (o_compress.passed()) {
|
|
440
440
|
opts |= LCB_COMPRESS_OUT;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
#!/usr/bin/ruby
|
|
2
|
+
|
|
3
|
+
# This tool extracts packet dumps from the TRACE log statements
|
|
4
|
+
# when the library compiled with -DLCB_DUMP_PACKETS=ON
|
|
5
|
+
|
|
6
|
+
require 'stringio'
|
|
7
|
+
require 'base64'
|
|
8
|
+
|
|
9
|
+
def pad(dir, *lines)
|
|
10
|
+
lines.flatten.join("\n").gsub(/^/, dir == 'snd' ? '> ' : '< ')
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def format_bytes(buf, style = :wide)
|
|
14
|
+
out = StringIO.new
|
|
15
|
+
width = style == :wide ? 32 : 16
|
|
16
|
+
full_rows = buf.size / width
|
|
17
|
+
remainder = buf.size % width
|
|
18
|
+
|
|
19
|
+
if style == :wide
|
|
20
|
+
out.print(" +-------------------------------------------------------------------------------------------------+\n" \
|
|
21
|
+
" | 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 4 5 6 7 8 9 a b c d e f |\n" \
|
|
22
|
+
"+--------+-------------------------------------------------------------------------------------------------+--------------------------------+")
|
|
23
|
+
else
|
|
24
|
+
out.print(" +-------------------------------------------------+\n" \
|
|
25
|
+
" | 0 1 2 3 4 5 6 7 8 9 a b c d e f |\n" \
|
|
26
|
+
"+--------+-------------------------------------------------+----------------+")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
row = 0
|
|
30
|
+
while row < full_rows
|
|
31
|
+
row_start_index = row * width
|
|
32
|
+
# prefix
|
|
33
|
+
out.printf("\n|%08x|", row_start_index)
|
|
34
|
+
row_end_index = row_start_index + width
|
|
35
|
+
# hex
|
|
36
|
+
i = row_start_index
|
|
37
|
+
while i < row_end_index
|
|
38
|
+
out.printf(" %02x", buf[i].ord)
|
|
39
|
+
i += 1
|
|
40
|
+
end
|
|
41
|
+
out.printf(" |")
|
|
42
|
+
# ascii
|
|
43
|
+
i = row_start_index
|
|
44
|
+
while i < row_end_index
|
|
45
|
+
b = buf[i].ord
|
|
46
|
+
i += 1
|
|
47
|
+
if (b <= 0x1f) || (b >= 0x7f)
|
|
48
|
+
out.printf(".")
|
|
49
|
+
else
|
|
50
|
+
out.printf("%c", b)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
out.printf("|")
|
|
54
|
+
row += 1
|
|
55
|
+
end
|
|
56
|
+
if remainder != 0
|
|
57
|
+
row_start_index = full_rows * width
|
|
58
|
+
# prefix
|
|
59
|
+
out.printf("\n|%08x|", row_start_index)
|
|
60
|
+
row_end_index = row_start_index + remainder
|
|
61
|
+
# hex
|
|
62
|
+
i = row_start_index
|
|
63
|
+
while i < row_end_index
|
|
64
|
+
out.printf(" %02x", buf[i].ord)
|
|
65
|
+
i += 1
|
|
66
|
+
end
|
|
67
|
+
i = width - remainder
|
|
68
|
+
while i > 0
|
|
69
|
+
out.printf(" ")
|
|
70
|
+
i -= 1
|
|
71
|
+
end
|
|
72
|
+
out.printf(" |")
|
|
73
|
+
# ascii
|
|
74
|
+
i = row_start_index
|
|
75
|
+
while i < row_end_index
|
|
76
|
+
b = buf[i].ord
|
|
77
|
+
i += 1
|
|
78
|
+
if (b <= 0x1f) || (b >= 0x7f)
|
|
79
|
+
out.printf(".")
|
|
80
|
+
else
|
|
81
|
+
out.printf("%c", b)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
i = width - remainder
|
|
85
|
+
while i > 0
|
|
86
|
+
out.printf(" ")
|
|
87
|
+
i -= 1
|
|
88
|
+
end
|
|
89
|
+
out.printf("|")
|
|
90
|
+
end
|
|
91
|
+
if style == :wide
|
|
92
|
+
out.print("\n+--------+-------------------------------------------------------------------------------------------------+--------------------------------+\n")
|
|
93
|
+
else
|
|
94
|
+
out.print("\n+--------+-------------------------------------------------+----------------+\n")
|
|
95
|
+
end
|
|
96
|
+
out.string
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
ARGF.each_line do |line|
|
|
100
|
+
line.force_encoding(Encoding::BINARY)
|
|
101
|
+
md = line.match(/TRACE.*<([^>]+)>.*\(CTX=(0x[0-9a-z]+),([^,)]+).*pkt,(snd|rcv).*: size=(\d+), (.+)/)
|
|
102
|
+
next unless md
|
|
103
|
+
address = md[1]
|
|
104
|
+
ctx_id = md[2]
|
|
105
|
+
subsys = md[3]
|
|
106
|
+
dir = md[4]
|
|
107
|
+
data = Base64.decode64(md[6])
|
|
108
|
+
puts pad(dir, "#{address} CTX=#{ctx_id},#{subsys} #{dir == 'snd' ? 'sent' : 'received'} #{data.size} bytes")
|
|
109
|
+
puts pad(dir, format_bytes(data))
|
|
110
|
+
end
|