couchbase 3.2.0 → 3.2.4
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +24 -18
- package/binding.gyp +88 -85
- package/deps/lcb/CMakeLists.txt +1 -1
- package/deps/lcb/CONTRIBUTING.md +1 -1
- package/deps/lcb/README.markdown +2 -2
- package/deps/lcb/RELEASE_NOTES.markdown +99 -14
- package/deps/lcb/cmake/Modules/GetVersionInfo.cmake +1 -1
- package/deps/lcb/contrib/cbsasl/src/scram-sha/scram_utils.cc +22 -26
- package/deps/lcb/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +20 -7
- package/deps/lcb/doc/Doxyfile +1 -1
- package/deps/lcb/example/CMakeLists.txt +4 -4
- package/deps/lcb/example/libuvdirect/main.c +39 -12
- package/deps/lcb/example/minimal/durability.cc +149 -0
- package/deps/lcb/example/minimal/query.c +11 -9
- package/deps/lcb/gyp_config/common/libcouchbase/configuration.h +3 -3
- package/deps/lcb/gyp_config/linux/arm64/config.h +243 -0
- package/deps/lcb/include/libcouchbase/couchbase.h +80 -5
- package/deps/lcb/include/libcouchbase/error.h +2 -0
- package/deps/lcb/include/libcouchbase/ixmgmt.h +15 -10
- package/deps/lcb/include/libcouchbase/tracing.h +2 -2
- package/deps/lcb/include/memcached/protocol_binary.h +21 -0
- package/deps/lcb/libcouchbase.gyp +347 -349
- package/deps/lcb/packaging/deb/control +1 -1
- package/deps/lcb/src/analytics/analytics_handle.cc +13 -5
- package/deps/lcb/src/analytics/analytics_handle.hh +29 -0
- package/deps/lcb/src/bootstrap.cc +6 -3
- package/deps/lcb/src/capi/cmd_analytics.cc +12 -1
- package/deps/lcb/src/capi/cmd_analytics.hh +30 -0
- package/deps/lcb/src/capi/cmd_counter.hh +23 -0
- package/deps/lcb/src/capi/cmd_exists.hh +24 -1
- package/deps/lcb/src/capi/cmd_get.hh +22 -0
- package/deps/lcb/src/capi/cmd_get_replica.hh +23 -0
- package/deps/lcb/src/capi/cmd_http.hh +7 -0
- package/deps/lcb/src/capi/cmd_query.cc +11 -1
- package/deps/lcb/src/capi/cmd_query.hh +31 -0
- package/deps/lcb/src/capi/cmd_remove.hh +23 -0
- package/deps/lcb/src/capi/cmd_search.cc +6 -0
- package/deps/lcb/src/capi/cmd_search.hh +23 -0
- package/deps/lcb/src/capi/cmd_store.hh +33 -21
- package/deps/lcb/src/capi/cmd_subdoc.hh +35 -0
- package/deps/lcb/src/capi/cmd_touch.hh +23 -0
- package/deps/lcb/src/capi/cmd_unlock.hh +23 -0
- package/deps/lcb/src/capi/cmd_view.hh +6 -0
- package/deps/lcb/src/capi/collection_qualifier.hh +2 -2
- package/deps/lcb/src/cntl.cc +45 -11
- package/deps/lcb/src/crypto.cc +2 -2
- package/deps/lcb/src/dns-srv.cc +5 -3
- package/deps/lcb/src/errmap.cc +5 -9
- package/deps/lcb/src/errmap.h +7 -3
- package/deps/lcb/src/handler.cc +24 -18
- package/deps/lcb/src/hostlist.h +2 -2
- package/deps/lcb/src/http/http-priv.h +2 -2
- package/deps/lcb/src/http/http.cc +5 -2
- package/deps/lcb/src/instance.cc +20 -11
- package/deps/lcb/src/internal.h +9 -0
- package/deps/lcb/src/lcbio/connect.cc +14 -2
- package/deps/lcb/src/lcbio/connect.h +2 -2
- package/deps/lcb/src/lcbio/ctx.cc +4 -2
- package/deps/lcb/src/lcbio/ioutils.cc +9 -10
- package/deps/lcb/src/lcbio/manager.cc +1 -1
- package/deps/lcb/src/mcserver/mcserver.cc +9 -6
- package/deps/lcb/src/mcserver/negotiate.cc +39 -17
- package/deps/lcb/src/n1ql/ixmgmt.cc +1 -2
- package/deps/lcb/src/n1ql/query_handle.cc +41 -19
- package/deps/lcb/src/n1ql/query_handle.hh +28 -1
- package/deps/lcb/src/operations/counter.cc +18 -5
- package/deps/lcb/src/operations/exists.cc +25 -4
- package/deps/lcb/src/operations/get.cc +39 -19
- package/deps/lcb/src/operations/get_replica.cc +28 -8
- package/deps/lcb/src/operations/observe.cc +1 -1
- package/deps/lcb/src/operations/ping.cc +8 -8
- package/deps/lcb/src/operations/pktfwd.cc +2 -1
- package/deps/lcb/src/operations/remove.cc +39 -22
- package/deps/lcb/src/operations/store.cc +18 -5
- package/deps/lcb/src/operations/subdoc.cc +18 -6
- package/deps/lcb/src/operations/touch.cc +34 -16
- package/deps/lcb/src/operations/unlock.cc +24 -5
- package/deps/lcb/src/packetutils.h +3 -2
- package/deps/lcb/src/retryq.cc +24 -5
- package/deps/lcb/src/search/search.cc +1 -0
- package/deps/lcb/src/search/search_handle.cc +30 -8
- package/deps/lcb/src/search/search_handle.hh +29 -0
- package/deps/lcb/src/settings.cc +1 -1
- package/deps/lcb/src/ssl/ssl_common.c +6 -7
- package/deps/lcb/src/tracing/span.cc +47 -14
- package/deps/lcb/src/tracing/tracer.cc +11 -2
- package/deps/lcb/src/tracing/tracing-internal.h +105 -93
- package/deps/lcb/src/utilities.cc +43 -0
- package/deps/lcb/src/utilities.h +53 -0
- package/deps/lcb/src/vbucket/vbucket.c +34 -33
- package/deps/lcb/src/views/view_handle.cc +13 -5
- package/deps/lcb/src/views/view_handle.hh +29 -0
- package/deps/lcb/tests/CMakeLists.txt +21 -0
- package/deps/lcb/tests/basic/t_ctlcodes.cc +24 -3
- package/deps/lcb/tests/basic/t_jsparse.cc +8 -0
- package/deps/lcb/tests/basic/t_n1qlstrings.cc +73 -0
- package/deps/lcb/tests/iotests/mock-environment.cc +30 -1
- package/deps/lcb/tests/iotests/mock-environment.h +49 -0
- package/deps/lcb/tests/iotests/mock-unit-test.cc +104 -6
- package/deps/lcb/tests/iotests/mock-unit-test.h +34 -0
- package/deps/lcb/tests/iotests/t_collections.cc +1 -1
- package/deps/lcb/tests/iotests/t_confmon.cc +4 -2
- package/deps/lcb/tests/iotests/t_get.cc +109 -7
- package/deps/lcb/tests/iotests/t_http.cc +9 -4
- package/deps/lcb/tests/iotests/t_lock.cc +18 -0
- package/deps/lcb/tests/iotests/t_mutate.cc +157 -63
- package/deps/lcb/tests/iotests/t_n1ql.cc +330 -33
- package/deps/lcb/tests/iotests/t_views.cc +1 -0
- package/deps/lcb/tests/iotests/testutil.cc +168 -0
- package/deps/lcb/tests/iotests/testutil.h +116 -0
- package/deps/lcb/tests/mocksupport/procutil.c +32 -28
- package/deps/lcb/tests/mocksupport/server.c +0 -1
- package/deps/lcb/tests/mocksupport/timeout.c +2 -2
- package/deps/lcb/tools/cbc.cc +7 -0
- package/dist/analyticsindexmanager.js +512 -524
- package/dist/binding.d.ts +3 -0
- package/dist/bindingutilities.js +4 -0
- package/dist/bucket.js +1 -1
- package/dist/bucketmanager.d.ts +31 -1
- package/dist/bucketmanager.js +194 -186
- package/dist/cluster.d.ts +7 -0
- package/dist/cluster.js +48 -38
- package/dist/collection.js +11 -17
- package/dist/collectionmanager.js +181 -197
- package/dist/connection.d.ts +3 -1
- package/dist/connection.js +27 -16
- package/dist/couchbase.d.ts +1 -0
- package/dist/couchbase.js +3 -13
- package/dist/datastructures.js +239 -310
- package/dist/diagnosticsexecutor.js +70 -85
- package/dist/errors.d.ts +70 -0
- package/dist/errors.js +96 -2
- package/dist/eventingfunctionmanager.d.ts +804 -0
- package/dist/eventingfunctionmanager.js +993 -0
- package/dist/httpexecutor.d.ts +2 -1
- package/dist/httpexecutor.js +30 -37
- package/dist/queryindexmanager.js +240 -266
- package/dist/scope.js +10 -4
- package/dist/sdspecs.d.ts +1 -1
- package/dist/searchexecutor.js +3 -0
- package/dist/searchindexmanager.js +240 -271
- package/dist/searchquery.d.ts +17 -0
- package/dist/searchquery.js +22 -1
- package/dist/searchtypes.d.ts +7 -2
- package/dist/searchtypes.js +2 -2
- package/dist/usermanager.js +251 -264
- package/dist/utilities.d.ts +2 -0
- package/dist/utilities.js +7 -2
- package/dist/viewexecutor.js +1 -1
- package/dist/viewindexmanager.js +131 -150
- package/package.json +1 -1
- package/src/addondata.cpp +58 -0
- package/src/addondata.h +40 -0
- package/src/binding.cpp +3 -1
- package/src/cas.h +2 -2
- package/src/connection.cpp +25 -178
- package/src/connection.h +8 -65
- package/src/connection_ops.cpp +57 -34
- package/src/constants.cpp +3 -0
- package/src/instance.cpp +235 -0
- package/src/instance.h +102 -0
- package/src/{connection_callbacks.cpp → instance_callbacks.cpp} +34 -34
- package/src/logger.cpp +11 -1
- package/src/logger.h +3 -0
- package/src/metrics.cpp +10 -0
- package/src/metrics.h +3 -0
- package/src/mutationtoken.h +2 -2
- package/src/opbuilder.h +13 -15
- package/src/respreader.cpp +1 -0
- package/src/respreader.h +6 -4
- package/src/tracespan.h +11 -11
- package/src/tracing.cpp +11 -0
- package/src/tracing.h +3 -0
- package/src/valueparser.h +5 -0
- package/deps/lcb/example/observe/durability.c +0 -110
@@ -0,0 +1,53 @@
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
2
|
+
/*
|
3
|
+
* Copyright 2018-2020 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 LIBCOUCHBASE_UTILITIES_H
|
19
|
+
#define LIBCOUCHBASE_UTILITIES_H 1
|
20
|
+
|
21
|
+
#include "config.h"
|
22
|
+
|
23
|
+
#ifdef __cplusplus
|
24
|
+
#include <string>
|
25
|
+
#include <vector>
|
26
|
+
|
27
|
+
namespace lcb
|
28
|
+
{
|
29
|
+
namespace flexible_framing_extras
|
30
|
+
{
|
31
|
+
lcb_STATUS encode_impersonate_user(const std::string &username, std::vector<std::uint8_t> &flexible_framing_extras);
|
32
|
+
} // namespace flexible_framing_extras
|
33
|
+
} // namespace lcb
|
34
|
+
|
35
|
+
extern "C" {
|
36
|
+
#endif
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Added to avoid triggering unexpected behaviour of strdup from stdlib.
|
40
|
+
* See https://stackoverflow.com/questions/8359966/strdup-returning-address-out-of-bounds
|
41
|
+
*
|
42
|
+
* All usages have to be replaced with std::string eventually.
|
43
|
+
*
|
44
|
+
* @private
|
45
|
+
*/
|
46
|
+
LCB_INTERNAL_API
|
47
|
+
char *lcb_strdup(const char *);
|
48
|
+
|
49
|
+
#ifdef __cplusplus
|
50
|
+
}
|
51
|
+
#endif
|
52
|
+
|
53
|
+
#endif
|
@@ -25,6 +25,7 @@
|
|
25
25
|
#include "json-inl.h"
|
26
26
|
#include "hash.h"
|
27
27
|
#include "crc32.h"
|
28
|
+
#include "utilities.h"
|
28
29
|
|
29
30
|
#define STRINGIFY_(X) #X
|
30
31
|
#define STRINGIFY(X) STRINGIFY_(X)
|
@@ -118,7 +119,7 @@ static int assign_dumy_server(lcbvb_CONFIG *cfg, lcbvb_SERVER *dst, const char *
|
|
118
119
|
{
|
119
120
|
int itmp;
|
120
121
|
char *colon;
|
121
|
-
if (!(dst->authority =
|
122
|
+
if (!(dst->authority = lcb_strdup(s))) {
|
122
123
|
SET_ERRSTR(cfg, "Couldn't allocate authority string");
|
123
124
|
goto GT_ERR;
|
124
125
|
}
|
@@ -354,28 +355,28 @@ static int build_server_strings(lcbvb_CONFIG *cfg, lcbvb_SERVER *server)
|
|
354
355
|
char tmpbuf[4096];
|
355
356
|
|
356
357
|
copy_address(tmpbuf, sizeof(tmpbuf), server->hostname, server->svc.data);
|
357
|
-
server->authority =
|
358
|
+
server->authority = lcb_strdup(tmpbuf);
|
358
359
|
if (!server->authority) {
|
359
360
|
SET_ERRSTR(cfg, "Couldn't allocate authority");
|
360
361
|
return 0;
|
361
362
|
}
|
362
363
|
|
363
|
-
server->svc.hoststrs[LCBVB_SVCTYPE_DATA] =
|
364
|
+
server->svc.hoststrs[LCBVB_SVCTYPE_DATA] = lcb_strdup(server->authority);
|
364
365
|
if (server->viewpath == NULL && server->svc.views && cfg->bname) {
|
365
366
|
server->viewpath = malloc(strlen(cfg->bname) + 2);
|
366
367
|
sprintf(server->viewpath, "/%s", cfg->bname);
|
367
368
|
}
|
368
369
|
if (server->querypath == NULL && server->svc.n1ql) {
|
369
|
-
server->querypath =
|
370
|
+
server->querypath = lcb_strdup("/query/service");
|
370
371
|
}
|
371
372
|
if (server->ftspath == NULL && server->svc.fts) {
|
372
|
-
server->ftspath =
|
373
|
+
server->ftspath = lcb_strdup("/");
|
373
374
|
}
|
374
375
|
if (server->cbaspath == NULL && server->svc.cbas) {
|
375
|
-
server->cbaspath =
|
376
|
+
server->cbaspath = lcb_strdup("");
|
376
377
|
}
|
377
378
|
if (server->eventingpath == NULL && server->svc.eventing) {
|
378
|
-
server->eventingpath =
|
379
|
+
server->eventingpath = lcb_strdup("");
|
379
380
|
}
|
380
381
|
return 1;
|
381
382
|
}
|
@@ -395,7 +396,7 @@ static int build_server_3x(lcbvb_CONFIG *cfg, lcbvb_SERVER *server, cJSON *js, c
|
|
395
396
|
if (!get_jstr(js, "hostname", &htmp)) {
|
396
397
|
htmp = "$HOST";
|
397
398
|
}
|
398
|
-
if (!(server->hostname =
|
399
|
+
if (!(server->hostname = lcb_strdup(htmp))) {
|
399
400
|
SET_ERRSTR(cfg, "Couldn't allocate memory");
|
400
401
|
goto GT_ERR;
|
401
402
|
}
|
@@ -422,7 +423,7 @@ static int build_server_3x(lcbvb_CONFIG *cfg, lcbvb_SERVER *server, cJSON *js, c
|
|
422
423
|
cJSON *jnetwork = cJSON_GetObjectItem(jaltaddr, *network);
|
423
424
|
if (jnetwork && get_jstr(jnetwork, "hostname", &htmp)) {
|
424
425
|
cJSON *jports;
|
425
|
-
server->alt_hostname =
|
426
|
+
server->alt_hostname = lcb_strdup(htmp);
|
426
427
|
jports = cJSON_GetObjectItem(jnetwork, "ports");
|
427
428
|
if (jports && jports->type == cJSON_Object) {
|
428
429
|
extract_services(cfg, jports, &server->alt_svc, 0);
|
@@ -481,7 +482,7 @@ static int build_server_2x(lcbvb_CONFIG *cfg, lcbvb_SERVER *server, cJSON *js)
|
|
481
482
|
}
|
482
483
|
|
483
484
|
/** Hostname is the _rest_ API host, e.g. '8091' */
|
484
|
-
if ((server->hostname =
|
485
|
+
if ((server->hostname = lcb_strdup(tmp)) == NULL) {
|
485
486
|
SET_ERRSTR(cfg, "Couldn't allocate hostname");
|
486
487
|
goto GT_ERR;
|
487
488
|
}
|
@@ -521,7 +522,7 @@ static int build_server_2x(lcbvb_CONFIG *cfg, lcbvb_SERVER *server, cJSON *js)
|
|
521
522
|
SET_ERRSTR(cfg, "Expected path in couchApiBase");
|
522
523
|
goto GT_ERR;
|
523
524
|
}
|
524
|
-
server->viewpath =
|
525
|
+
server->viewpath = lcb_strdup(path_begin);
|
525
526
|
} else {
|
526
527
|
server->svc.views = 0;
|
527
528
|
}
|
@@ -559,7 +560,7 @@ static void guess_network(cJSON *jnodes, int nsrv, const char *source, char **ne
|
|
559
560
|
cJSON *jhostname = cJSON_GetObjectItem(jsrv, "hostname");
|
560
561
|
if (jhostname && jhostname->type == cJSON_String) {
|
561
562
|
if (strcmp(jhostname->valuestring, source) == 0) {
|
562
|
-
*network =
|
563
|
+
*network = lcb_strdup("default");
|
563
564
|
return;
|
564
565
|
}
|
565
566
|
}
|
@@ -573,7 +574,7 @@ static void guess_network(cJSON *jnodes, int nsrv, const char *source, char **ne
|
|
573
574
|
cJSON *jhostname = cJSON_GetObjectItem(cur, "hostname");
|
574
575
|
if (jhostname && jhostname->type == cJSON_String) {
|
575
576
|
if (strcmp(jhostname->valuestring, source) == 0) {
|
576
|
-
*network =
|
577
|
+
*network = lcb_strdup(cur->string);
|
577
578
|
return;
|
578
579
|
}
|
579
580
|
}
|
@@ -582,7 +583,7 @@ static void guess_network(cJSON *jnodes, int nsrv, const char *source, char **ne
|
|
582
583
|
}
|
583
584
|
}
|
584
585
|
}
|
585
|
-
*network =
|
586
|
+
*network = lcb_strdup("default");
|
586
587
|
}
|
587
588
|
|
588
589
|
int lcbvb_load_json_ex(lcbvb_CONFIG *cfg, const char *data, const char *source, char **network)
|
@@ -604,7 +605,7 @@ int lcbvb_load_json_ex(lcbvb_CONFIG *cfg, const char *data, const char *source,
|
|
604
605
|
}
|
605
606
|
|
606
607
|
if (!is_cluster_cfg && get_jstr(cj, "name", &tmp)) {
|
607
|
-
cfg->bname =
|
608
|
+
cfg->bname = lcb_strdup(tmp);
|
608
609
|
cfg->bname_len = strlen(cfg->bname);
|
609
610
|
}
|
610
611
|
|
@@ -618,7 +619,7 @@ int lcbvb_load_json_ex(lcbvb_CONFIG *cfg, const char *data, const char *source,
|
|
618
619
|
}
|
619
620
|
|
620
621
|
if (get_jstr(cj, "uuid", &tmp)) {
|
621
|
-
cfg->buuid =
|
622
|
+
cfg->buuid = lcb_strdup(tmp);
|
622
623
|
}
|
623
624
|
|
624
625
|
if (!get_jint64(cj, "revEpoch", &cfg->revepoch)) {
|
@@ -824,7 +825,7 @@ void lcbvb_replace_host(lcbvb_CONFIG *cfg, const char *hoststr)
|
|
824
825
|
}
|
825
826
|
/* reassign authority */
|
826
827
|
free(srv->authority);
|
827
|
-
srv->authority =
|
828
|
+
srv->authority = lcb_strdup(srv->svc.hoststrs[LCBVB_SVCTYPE_DATA]);
|
828
829
|
}
|
829
830
|
if (copy) {
|
830
831
|
free(replacement);
|
@@ -1570,7 +1571,7 @@ const char *lcbvb_get_resturl(lcbvb_CONFIG *cfg, unsigned ix, lcbvb_SVCTYPE svc,
|
|
1570
1571
|
} else {
|
1571
1572
|
snprintf(buf, sizeof(buf), "%s://%s:%d%s", prefix, hostname, port, path);
|
1572
1573
|
}
|
1573
|
-
*strp =
|
1574
|
+
*strp = lcb_strdup(buf);
|
1574
1575
|
}
|
1575
1576
|
|
1576
1577
|
return *strp;
|
@@ -1617,24 +1618,24 @@ static void copy_service(const char *hostname, const lcbvb_SERVICES *src, lcbvb_
|
|
1617
1618
|
*dst = *src;
|
1618
1619
|
memset(&dst->hoststrs, 0, sizeof dst->hoststrs);
|
1619
1620
|
if (src->views_base_) {
|
1620
|
-
dst->views_base_ =
|
1621
|
+
dst->views_base_ = lcb_strdup(src->views_base_);
|
1621
1622
|
}
|
1622
1623
|
if (src->query_base_) {
|
1623
|
-
dst->query_base_ =
|
1624
|
+
dst->query_base_ = lcb_strdup(src->query_base_);
|
1624
1625
|
}
|
1625
1626
|
if (src->fts_base_) {
|
1626
|
-
dst->fts_base_ =
|
1627
|
+
dst->fts_base_ = lcb_strdup(src->fts_base_);
|
1627
1628
|
}
|
1628
1629
|
if (src->cbas_base_) {
|
1629
|
-
dst->cbas_base_ =
|
1630
|
+
dst->cbas_base_ = lcb_strdup(src->cbas_base_);
|
1630
1631
|
}
|
1631
1632
|
if (src->eventing_base_) {
|
1632
|
-
dst->eventing_base_ =
|
1633
|
+
dst->eventing_base_ = lcb_strdup(src->eventing_base_);
|
1633
1634
|
}
|
1634
1635
|
if (dst->data) {
|
1635
1636
|
char buf[4096];
|
1636
1637
|
copy_address(buf, sizeof(buf), hostname, dst->data);
|
1637
|
-
dst->hoststrs[LCBVB_SVCTYPE_DATA] =
|
1638
|
+
dst->hoststrs[LCBVB_SVCTYPE_DATA] = lcb_strdup(buf);
|
1638
1639
|
}
|
1639
1640
|
}
|
1640
1641
|
|
@@ -1656,12 +1657,12 @@ int lcbvb_genconfig_ex(lcbvb_CONFIG *vb, const char *name, const char *uuid, con
|
|
1656
1657
|
vb->nvb = nvbuckets;
|
1657
1658
|
vb->nrepl = nreplica;
|
1658
1659
|
vb->nsrv = nservers;
|
1659
|
-
vb->bname =
|
1660
|
+
vb->bname = lcb_strdup(name);
|
1660
1661
|
if (vb->bname) {
|
1661
1662
|
vb->bname_len = strlen(vb->bname);
|
1662
1663
|
}
|
1663
1664
|
if (uuid) {
|
1664
|
-
vb->buuid =
|
1665
|
+
vb->buuid = lcb_strdup(uuid);
|
1665
1666
|
}
|
1666
1667
|
|
1667
1668
|
if (nreplica >= nservers) {
|
@@ -1713,21 +1714,21 @@ int lcbvb_genconfig_ex(lcbvb_CONFIG *vb, const char *name, const char *uuid, con
|
|
1713
1714
|
const lcbvb_SERVER *src = servers + ii;
|
1714
1715
|
|
1715
1716
|
*dst = *src;
|
1716
|
-
dst->hostname =
|
1717
|
+
dst->hostname = lcb_strdup(src->hostname);
|
1717
1718
|
if (src->viewpath) {
|
1718
|
-
dst->viewpath =
|
1719
|
+
dst->viewpath = lcb_strdup(src->viewpath);
|
1719
1720
|
}
|
1720
1721
|
if (src->querypath) {
|
1721
|
-
dst->querypath =
|
1722
|
+
dst->querypath = lcb_strdup(src->querypath);
|
1722
1723
|
}
|
1723
1724
|
if (src->ftspath) {
|
1724
|
-
dst->ftspath =
|
1725
|
+
dst->ftspath = lcb_strdup(src->ftspath);
|
1725
1726
|
}
|
1726
1727
|
if (src->cbaspath) {
|
1727
|
-
dst->cbaspath =
|
1728
|
+
dst->cbaspath = lcb_strdup(src->cbaspath);
|
1728
1729
|
}
|
1729
1730
|
if (src->eventingpath) {
|
1730
|
-
dst->eventingpath =
|
1731
|
+
dst->eventingpath = lcb_strdup(src->eventingpath);
|
1731
1732
|
}
|
1732
1733
|
|
1733
1734
|
copy_service(src->hostname, &src->svc, &dst->svc);
|
@@ -1735,7 +1736,7 @@ int lcbvb_genconfig_ex(lcbvb_CONFIG *vb, const char *name, const char *uuid, con
|
|
1735
1736
|
{
|
1736
1737
|
char tmpbuf[MAX_AUTHORITY_SIZE] = {0};
|
1737
1738
|
copy_address(tmpbuf, sizeof(tmpbuf), dst->hostname, dst->svc.data);
|
1738
|
-
dst->authority =
|
1739
|
+
dst->authority = lcb_strdup(tmpbuf);
|
1739
1740
|
}
|
1740
1741
|
}
|
1741
1742
|
|
@@ -80,8 +80,8 @@ void lcb_VIEW_HANDLE_::invoke_last(lcb_STATUS err)
|
|
80
80
|
if (http_response_ && http_response_->ctx.response_code != 200 && http_response_->ctx.body_len) {
|
81
81
|
// chances that were not able to parse response
|
82
82
|
Json::Value meta;
|
83
|
-
if (Json::Reader()
|
84
|
-
|
83
|
+
if (Json::Reader(Json::Features::strictMode())
|
84
|
+
.parse(http_response_->ctx.body, http_response_->ctx.body + http_response_->ctx.body_len, meta)) {
|
85
85
|
const Json::Value &error = meta["error"];
|
86
86
|
if (error.isString()) {
|
87
87
|
first_error_code_ = error.asString();
|
@@ -101,7 +101,10 @@ void lcb_VIEW_HANDLE_::invoke_last(lcb_STATUS err)
|
|
101
101
|
resp.ctx.rc = LCB_ERR_VIEW_NOT_FOUND;
|
102
102
|
}
|
103
103
|
|
104
|
-
|
104
|
+
if (span_ != nullptr) {
|
105
|
+
lcb::trace::finish_http_span(span_, this);
|
106
|
+
span_ = nullptr;
|
107
|
+
}
|
105
108
|
if (http_request_ != nullptr) {
|
106
109
|
http_request_->span = nullptr;
|
107
110
|
}
|
@@ -379,11 +382,16 @@ lcb_VIEW_HANDLE_::lcb_VIEW_HANDLE_(lcb_INSTANCE *instance, void *cookie, const l
|
|
379
382
|
document_queue_->max_pending_response = cmd->max_concurrent_documents();
|
380
383
|
}
|
381
384
|
}
|
385
|
+
{
|
386
|
+
char buf[32];
|
387
|
+
size_t nbuf = snprintf(buf, sizeof(buf), "%016" PRIx64, lcb_next_rand64());
|
388
|
+
client_context_id_.assign(buf, nbuf);
|
389
|
+
}
|
382
390
|
|
383
391
|
lcb_aspend_add(&instance_->pendops, LCB_PENDTYPE_COUNTER, nullptr);
|
384
392
|
if (instance->settings->tracer) {
|
385
|
-
|
386
|
-
|
393
|
+
parent_span_ = cmd->parent_span();
|
394
|
+
span_ = lcb::trace::start_http_span(instance_->settings, this);
|
387
395
|
}
|
388
396
|
last_error_ = request_http(cmd);
|
389
397
|
}
|
@@ -118,6 +118,32 @@ struct lcb_VIEW_HANDLE_ : lcb::jsparse::Parser::Actions {
|
|
118
118
|
return http_request_;
|
119
119
|
}
|
120
120
|
|
121
|
+
static lcbtrace_THRESHOLDOPTS service()
|
122
|
+
{
|
123
|
+
return LCBTRACE_THRESHOLD_VIEW;
|
124
|
+
}
|
125
|
+
|
126
|
+
static const std::string &operation_name()
|
127
|
+
{
|
128
|
+
static std::string name = LCBTRACE_OP_VIEW;
|
129
|
+
return name;
|
130
|
+
}
|
131
|
+
|
132
|
+
lcbtrace_SPAN *parent_span() const
|
133
|
+
{
|
134
|
+
return parent_span_;
|
135
|
+
}
|
136
|
+
|
137
|
+
const std::string &client_context_id() const
|
138
|
+
{
|
139
|
+
return client_context_id_;
|
140
|
+
}
|
141
|
+
|
142
|
+
int retries() const
|
143
|
+
{
|
144
|
+
return retries_;
|
145
|
+
}
|
146
|
+
|
121
147
|
private:
|
122
148
|
/** Current HTTP response to provide in callbacks */
|
123
149
|
const lcb_RESPHTTP *http_response_{nullptr};
|
@@ -134,12 +160,15 @@ struct lcb_VIEW_HANDLE_ : lcb::jsparse::Parser::Actions {
|
|
134
160
|
std::string query_params_{};
|
135
161
|
std::string first_error_code_{};
|
136
162
|
std::string first_error_message_{};
|
163
|
+
std::string client_context_id_{};
|
137
164
|
|
138
165
|
unsigned refcount_{1};
|
139
166
|
bool include_docs_{false};
|
140
167
|
bool do_not_parse_rows_{false};
|
141
168
|
bool spatial_{false};
|
169
|
+
int retries_{0};
|
142
170
|
|
143
171
|
lcb_STATUS last_error_{LCB_SUCCESS};
|
172
|
+
lcbtrace_SPAN *parent_span_{nullptr};
|
144
173
|
lcbtrace_SPAN *span_{nullptr};
|
145
174
|
};
|
@@ -152,8 +152,29 @@ MACRO(DEFINE_MOCKTEST plugin test)
|
|
152
152
|
--tests ${test}
|
153
153
|
--verbose
|
154
154
|
--
|
155
|
+
--gtest_filter="-ContaminatingUnitTest.*"
|
156
|
+
--gtest_throw_on_failure=1
|
155
157
|
--gtest_print_time=1
|
156
158
|
--gtest_output=xml:"${PROJECT_BINARY_DIR}/REPORT_${plugin}_${test}.xml")
|
159
|
+
SET_TESTS_PROPERTIES(check-${plugin}-${test} PROPERTIES LABELS "normal" )
|
160
|
+
|
161
|
+
ADD_TEST(
|
162
|
+
NAME
|
163
|
+
check-contaminating-${plugin}-${test}
|
164
|
+
COMMAND
|
165
|
+
$<TARGET_FILE:check-all>
|
166
|
+
--srcdir "${PROJECT_SOURCE_DIR}"
|
167
|
+
--testdir "$<TARGET_FILE_DIR:check-all>"
|
168
|
+
--libdir "$<TARGET_FILE_DIR:couchbase>"
|
169
|
+
--plugins ${plugin}
|
170
|
+
--tests ${test}
|
171
|
+
--verbose
|
172
|
+
--
|
173
|
+
--gtest_filter="ContaminatingUnitTest.*"
|
174
|
+
--gtest_throw_on_failure=1
|
175
|
+
--gtest_print_time=1
|
176
|
+
--gtest_output=xml:"${PROJECT_BINARY_DIR}/REPORT_${plugin}_${test}.xml")
|
177
|
+
SET_TESTS_PROPERTIES(check-contaminating-${plugin}-${test} PROPERTIES LABELS "contaminating" )
|
157
178
|
ENDMACRO()
|
158
179
|
|
159
180
|
# Since we need a plugin name, we'll use 'select'. However none of these
|
@@ -18,6 +18,9 @@
|
|
18
18
|
#include "config.h"
|
19
19
|
#include <gtest/gtest.h>
|
20
20
|
#include <libcouchbase/couchbase.h>
|
21
|
+
#include <iotests/testutil.h>
|
22
|
+
|
23
|
+
#include "internal.h"
|
21
24
|
|
22
25
|
class CtlTest : public ::testing::Test
|
23
26
|
{
|
@@ -61,9 +64,9 @@ TEST_F(CtlTest, testStringCtls)
|
|
61
64
|
{
|
62
65
|
lcb_INSTANCE *instance;
|
63
66
|
lcb_STATUS err;
|
64
|
-
err = lcb_create(&instance,
|
67
|
+
err = lcb_create(&instance, nullptr);
|
65
68
|
ASSERT_EQ(LCB_SUCCESS, err);
|
66
|
-
ASSERT_FALSE(instance ==
|
69
|
+
ASSERT_FALSE(instance == nullptr);
|
67
70
|
|
68
71
|
// These are all U32
|
69
72
|
PairMap ctlMap[] = {{"operation_timeout", LCB_CNTL_OP_TIMEOUT},
|
@@ -74,7 +77,7 @@ TEST_F(CtlTest, testStringCtls)
|
|
74
77
|
{"error_thresh_delay", LCB_CNTL_CONFDELAY_THRESH},
|
75
78
|
{"config_total_timeout", LCB_CNTL_CONFIGURATION_TIMEOUT},
|
76
79
|
{"config_node_timeout", LCB_CNTL_CONFIG_NODE_TIMEOUT},
|
77
|
-
{
|
80
|
+
{nullptr, 0}};
|
78
81
|
|
79
82
|
for (PairMap *cur = ctlMap; cur->key; cur++) {
|
80
83
|
err = lcb_cntl_string(instance, cur->key, "50");
|
@@ -111,3 +114,21 @@ TEST_F(CtlTest, testStringCtls)
|
|
111
114
|
|
112
115
|
lcb_destroy(instance);
|
113
116
|
}
|
117
|
+
|
118
|
+
TEST_F(CtlTest, testTimeDurationParsing)
|
119
|
+
{
|
120
|
+
lcb_INSTANCE *instance;
|
121
|
+
ASSERT_EQ(LCB_SUCCESS, lcb_create(&instance, nullptr));
|
122
|
+
ASSERT_FALSE(instance == nullptr);
|
123
|
+
|
124
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cntl_string(instance, "analytics_timeout", "123.456"));
|
125
|
+
ASSERT_EQ(123456000, instance->settings->analytics_timeout);
|
126
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cntl_string(instance, "analytics_timeout", "42"));
|
127
|
+
ASSERT_EQ(42000000, instance->settings->analytics_timeout);
|
128
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cntl_string(instance, "analytics_timeout", "42us"));
|
129
|
+
ASSERT_EQ(42, instance->settings->analytics_timeout);
|
130
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cntl_string(instance, "analytics_timeout", "5s42us"));
|
131
|
+
ASSERT_EQ(5000042, instance->settings->analytics_timeout);
|
132
|
+
|
133
|
+
lcb_destroy(instance);
|
134
|
+
}
|
@@ -105,3 +105,11 @@ TEST_F(JsonParseTest, testN1QL)
|
|
105
105
|
ASSERT_TRUE(validateJsonRows(JSON_n1ql_empty, sizeof(JSON_n1ql_empty), Parser::MODE_N1QL));
|
106
106
|
ASSERT_TRUE(validateBadParse(JSON_n1ql_bad, sizeof(JSON_n1ql_bad), Parser::MODE_N1QL));
|
107
107
|
}
|
108
|
+
|
109
|
+
TEST_F(JsonParseTest, testInvalidJSON)
|
110
|
+
{
|
111
|
+
std::string input = "503 Service Unavailable";
|
112
|
+
Json::Value meta;
|
113
|
+
ASSERT_TRUE(Json::Reader().parse(input.c_str(), input.c_str() + input.size(), meta));
|
114
|
+
ASSERT_FALSE(Json::Reader(Json::Features::strictMode()).parse(input.c_str(), input.c_str() + input.size(), meta));
|
115
|
+
}
|
@@ -20,6 +20,7 @@
|
|
20
20
|
#include <libcouchbase/couchbase.h>
|
21
21
|
|
22
22
|
#include "n1ql/query_utils.hh"
|
23
|
+
#include "../iotests/testutil.h"
|
23
24
|
|
24
25
|
class N1qLStringTests : public ::testing::Test
|
25
26
|
{
|
@@ -35,3 +36,75 @@ TEST_F(N1qLStringTests, testParseTimeout)
|
|
35
36
|
ASSERT_THROW(lcb_parse_golang_duration("124"), lcb_duration_parse_error);
|
36
37
|
ASSERT_THROW(lcb_parse_golang_duration("99z"), lcb_duration_parse_error);
|
37
38
|
}
|
39
|
+
|
40
|
+
TEST_F(N1qLStringTests, testQueryPositionalParams)
|
41
|
+
{
|
42
|
+
lcb_CMDQUERY *cmd = nullptr;
|
43
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdquery_create(&cmd));
|
44
|
+
|
45
|
+
std::string statement = "SELECT 42 AS the_answer WHERE question IN (?, ?, ?) ";
|
46
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdquery_statement(cmd, statement.c_str(), statement.size()));
|
47
|
+
|
48
|
+
const char *payload = nullptr;
|
49
|
+
size_t payload_len = 0;
|
50
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdquery_encoded_payload(cmd, &payload, &payload_len));
|
51
|
+
ASSERT_TRUE(payload != nullptr && payload_len > 0);
|
52
|
+
ASSERT_EQ(R"({"statement":"SELECT 42 AS the_answer WHERE question IN (?, ?, ?) "})",
|
53
|
+
std::string(payload, payload_len));
|
54
|
+
|
55
|
+
std::vector<std::string> question{"\"life\"", "\"Universe\"", "\"Everything\""};
|
56
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdquery_positional_param(cmd, question[0].c_str(), question[0].size()));
|
57
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdquery_positional_param(cmd, question[1].c_str(), question[1].size()));
|
58
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdquery_positional_param(cmd, question[2].c_str(), question[2].size()));
|
59
|
+
|
60
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdquery_encoded_payload(cmd, &payload, &payload_len));
|
61
|
+
ASSERT_TRUE(payload != nullptr && payload_len > 0);
|
62
|
+
ASSERT_EQ(
|
63
|
+
R"({"args":["life","Universe","Everything"],"statement":"SELECT 42 AS the_answer WHERE question IN (?, ?, ?) "})",
|
64
|
+
std::string(payload, payload_len));
|
65
|
+
|
66
|
+
std::string questions{R"(["Universe", "life", "Everything"])"};
|
67
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdquery_positional_params(cmd, questions.c_str(), questions.size()));
|
68
|
+
|
69
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdquery_encoded_payload(cmd, &payload, &payload_len));
|
70
|
+
ASSERT_TRUE(payload != nullptr && payload_len > 0);
|
71
|
+
ASSERT_EQ(
|
72
|
+
R"({"args":["Universe","life","Everything"],"statement":"SELECT 42 AS the_answer WHERE question IN (?, ?, ?) "})",
|
73
|
+
std::string(payload, payload_len));
|
74
|
+
}
|
75
|
+
|
76
|
+
TEST_F(N1qLStringTests, testAnalyticsPositionalParams)
|
77
|
+
{
|
78
|
+
lcb_CMDANALYTICS *cmd = nullptr;
|
79
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdanalytics_create(&cmd));
|
80
|
+
|
81
|
+
std::string statement = "SELECT 42 AS the_answer WHERE question IN (?, ?, ?) ";
|
82
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdanalytics_statement(cmd, statement.c_str(), statement.size()));
|
83
|
+
|
84
|
+
const char *payload = nullptr;
|
85
|
+
size_t payload_len = 0;
|
86
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdanalytics_encoded_payload(cmd, &payload, &payload_len));
|
87
|
+
ASSERT_TRUE(payload != nullptr && payload_len > 0);
|
88
|
+
ASSERT_EQ(R"({"statement":"SELECT 42 AS the_answer WHERE question IN (?, ?, ?) "})",
|
89
|
+
std::string(payload, payload_len));
|
90
|
+
|
91
|
+
std::vector<std::string> question{"\"life\"", "\"Universe\"", "\"Everything\""};
|
92
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdanalytics_positional_param(cmd, question[0].c_str(), question[0].size()));
|
93
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdanalytics_positional_param(cmd, question[1].c_str(), question[1].size()));
|
94
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdanalytics_positional_param(cmd, question[2].c_str(), question[2].size()));
|
95
|
+
|
96
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdanalytics_encoded_payload(cmd, &payload, &payload_len));
|
97
|
+
ASSERT_TRUE(payload != nullptr && payload_len > 0);
|
98
|
+
ASSERT_EQ(
|
99
|
+
R"({"args":["life","Universe","Everything"],"statement":"SELECT 42 AS the_answer WHERE question IN (?, ?, ?) "})",
|
100
|
+
std::string(payload, payload_len));
|
101
|
+
|
102
|
+
std::string questions{R"(["Universe", "life", "Everything"])"};
|
103
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdanalytics_positional_params(cmd, questions.c_str(), questions.size()));
|
104
|
+
|
105
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cmdanalytics_encoded_payload(cmd, &payload, &payload_len));
|
106
|
+
ASSERT_TRUE(payload != nullptr && payload_len > 0);
|
107
|
+
ASSERT_EQ(
|
108
|
+
R"({"args":["Universe","life","Everything"],"statement":"SELECT 42 AS the_answer WHERE question IN (?, ?, ?) "})",
|
109
|
+
std::string(payload, payload_len));
|
110
|
+
}
|
@@ -21,6 +21,7 @@
|
|
21
21
|
#include "mock-environment.h"
|
22
22
|
#include <sstream>
|
23
23
|
#include "internal.h" /* settings from lcb_INSTANCE *for logging */
|
24
|
+
#include "testutil.h"
|
24
25
|
|
25
26
|
#define LOGARGS(instance, lvl) instance->settings, "tests-ENV", LCB_LOG_##lvl, __FILE__, __LINE__
|
26
27
|
|
@@ -288,6 +289,7 @@ void MockEnvironment::createConnection(HandleWrap &handle, lcb_INSTANCE **instan
|
|
288
289
|
}
|
289
290
|
|
290
291
|
lcb_createopts_io(&options, io);
|
292
|
+
|
291
293
|
lcb_STATUS err = lcb_create(instance, &options);
|
292
294
|
ASSERT_EQ(LCB_SUCCESS, err);
|
293
295
|
postCreate(*instance);
|
@@ -302,6 +304,26 @@ void MockEnvironment::createConnection(HandleWrap &handle, lcb_INSTANCE **instan
|
|
302
304
|
{
|
303
305
|
lcb_CREATEOPTS *options = nullptr;
|
304
306
|
makeConnectParams(options, nullptr);
|
307
|
+
|
308
|
+
if (test_tracer.enabled()) {
|
309
|
+
lcb_createopts_tracer(options, test_tracer.lcb_tracer());
|
310
|
+
}
|
311
|
+
|
312
|
+
if (test_meter.enabled()) {
|
313
|
+
lcb_createopts_meter(options, test_meter.lcb_meter());
|
314
|
+
}
|
315
|
+
|
316
|
+
createConnection(handle, instance, options);
|
317
|
+
lcb_createopts_destroy(options);
|
318
|
+
}
|
319
|
+
|
320
|
+
void MockEnvironment::createConnection(HandleWrap &handle, lcb_INSTANCE **instance, const std::string &username,
|
321
|
+
const std::string &password)
|
322
|
+
{
|
323
|
+
lcb_CREATEOPTS *options = nullptr;
|
324
|
+
makeConnectParams(options, nullptr);
|
325
|
+
|
326
|
+
lcb_createopts_credentials(options, username.c_str(), username.size(), password.c_str(), password.size());
|
305
327
|
createConnection(handle, instance, options);
|
306
328
|
lcb_createopts_destroy(options);
|
307
329
|
}
|
@@ -323,6 +345,10 @@ static void statsCallback(lcb_INSTANCE *instance, lcb_CALLBACK_TYPE, const lcb_R
|
|
323
345
|
{
|
324
346
|
MockEnvironment *me = nullptr;
|
325
347
|
lcb_respstats_cookie(resp, (void **)&me);
|
348
|
+
if (me->getServerVersion() != MockEnvironment::VERSION_UNKNOWN) {
|
349
|
+
// ignore all subsequent responses
|
350
|
+
return;
|
351
|
+
}
|
326
352
|
lcb_STATUS rc = lcb_respstats_status(resp);
|
327
353
|
ASSERT_EQ(LCB_SUCCESS, rc) << lcb_strerror_short(rc);
|
328
354
|
|
@@ -542,6 +568,9 @@ void MockEnvironment::SetUp()
|
|
542
568
|
featureRegistry.insert("replica_read");
|
543
569
|
featureRegistry.insert("lock");
|
544
570
|
|
571
|
+
test_tracer = TestTracer();
|
572
|
+
test_meter = TestMeter();
|
573
|
+
|
545
574
|
clearAndReset();
|
546
575
|
}
|
547
576
|
|
@@ -591,7 +620,7 @@ MockCommand::MockCommand(Code code)
|
|
591
620
|
std::string MockCommand::encode()
|
592
621
|
{
|
593
622
|
finalizePayload();
|
594
|
-
return Json::FastWriter().write(command);
|
623
|
+
return Json::FastWriter().write(command) + "\n";
|
595
624
|
}
|
596
625
|
|
597
626
|
void MockKeyCommand::finalizePayload()
|