libcouchbase 1.0.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +11 -8
- data/ext/libcouchbase/CMakeLists.txt +1 -1
- data/ext/libcouchbase/README.markdown +38 -6
- data/ext/libcouchbase/RELEASE_NOTES.markdown +151 -0
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +2 -2
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
- data/ext/libcouchbase/cmake/source_files.cmake +1 -0
- data/ext/libcouchbase/contrib/cJSON/cJSON.c +686 -288
- data/ext/libcouchbase/contrib/cJSON/cJSON.h +0 -0
- data/ext/libcouchbase/contrib/cbsasl/src/hash.c +17 -17
- data/ext/libcouchbase/contrib/cliopts/cliopts.c +76 -0
- data/ext/libcouchbase/contrib/cliopts/cliopts.h +66 -15
- data/ext/libcouchbase/contrib/genhash/genhash.c +1 -2
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +4 -3
- data/ext/libcouchbase/example/instancepool/main.cc +12 -2
- data/ext/libcouchbase/example/libeventdirect/main.c +99 -25
- data/ext/libcouchbase/example/minimal/minimal.c +7 -5
- data/ext/libcouchbase/example/observe/durability.c +102 -0
- data/ext/libcouchbase/example/observe/observe.c +19 -6
- data/ext/libcouchbase/example/subdoc/subdoc-xattrs.c +1 -2
- data/ext/libcouchbase/include/libcouchbase/cntl-private.h +6 -8
- data/ext/libcouchbase/include/libcouchbase/cntl.h +84 -64
- data/ext/libcouchbase/include/libcouchbase/couchbase.h +295 -78
- data/ext/libcouchbase/include/libcouchbase/deprecated.h +2 -2
- data/ext/libcouchbase/include/libcouchbase/error.h +1 -1
- data/ext/libcouchbase/include/libcouchbase/iops.h +9 -9
- data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +2 -2
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +69 -7
- data/ext/libcouchbase/include/libcouchbase/vbucket.h +17 -0
- data/ext/libcouchbase/include/libcouchbase/views.h +3 -3
- data/ext/libcouchbase/include/memcached/protocol_binary.h +62 -1
- data/ext/libcouchbase/packaging/deb/control +1 -1
- data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +37 -36
- data/ext/libcouchbase/src/bootstrap.cc +22 -8
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +1 -1
- data/ext/libcouchbase/src/bucketconfig/bc_http.cc +0 -1
- data/ext/libcouchbase/src/bucketconfig/confmon.cc +13 -8
- data/ext/libcouchbase/src/callbacks.c +2 -0
- data/ext/libcouchbase/src/cntl.cc +28 -17
- data/ext/libcouchbase/src/dns-srv.cc +1 -2
- data/ext/libcouchbase/src/dump.cc +4 -0
- data/ext/libcouchbase/src/errmap.h +89 -16
- data/ext/libcouchbase/src/handler.cc +28 -11
- data/ext/libcouchbase/src/http/http-priv.h +4 -1
- data/ext/libcouchbase/src/http/http.cc +3 -0
- data/ext/libcouchbase/src/instance.cc +1 -1
- data/ext/libcouchbase/src/internal.h +1 -0
- data/ext/libcouchbase/src/lcbio/connect.cc +2 -3
- data/ext/libcouchbase/src/lcbio/manager.cc +2 -2
- data/ext/libcouchbase/src/lcbio/ssl.h +10 -0
- data/ext/libcouchbase/src/mc/mcreq.c +8 -0
- data/ext/libcouchbase/src/mcserver/mcserver.cc +14 -1
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +0 -3
- data/ext/libcouchbase/src/n1ql/n1ql.cc +22 -29
- data/ext/libcouchbase/src/n1ql/params.cc +46 -1
- data/ext/libcouchbase/src/newconfig.cc +4 -4
- data/ext/libcouchbase/src/operations/durability-seqno.cc +4 -0
- data/ext/libcouchbase/src/operations/durability.cc +3 -0
- data/ext/libcouchbase/src/operations/ping.cc +315 -0
- data/ext/libcouchbase/src/operations/stats.cc +10 -0
- data/ext/libcouchbase/src/operations/subdoc.cc +13 -1
- data/ext/libcouchbase/src/retrychk.cc +1 -0
- data/ext/libcouchbase/src/settings.c +2 -0
- data/ext/libcouchbase/src/settings.h +13 -7
- data/ext/libcouchbase/src/ssl/ssl_c.c +28 -2
- data/ext/libcouchbase/src/ssl/ssl_common.c +3 -0
- data/ext/libcouchbase/src/ssl/ssl_e.c +15 -1
- data/ext/libcouchbase/src/ssl/ssl_iot_common.h +3 -1
- data/ext/libcouchbase/src/timings.c +0 -1
- data/ext/libcouchbase/src/vbucket/vbucket.c +49 -1
- data/ext/libcouchbase/tests/iotests/mock-environment.cc +58 -40
- data/ext/libcouchbase/tests/iotests/mock-environment.h +23 -4
- data/ext/libcouchbase/tests/iotests/mock-unit-test.h +8 -8
- data/ext/libcouchbase/tests/iotests/t_behavior.cc +5 -5
- data/ext/libcouchbase/tests/iotests/t_durability.cc +50 -0
- data/ext/libcouchbase/tests/iotests/t_eerrs.cc +4 -2
- data/ext/libcouchbase/tests/iotests/t_errmap.cc +6 -3
- data/ext/libcouchbase/tests/iotests/t_lock.cc +5 -6
- data/ext/libcouchbase/tests/iotests/t_misc.cc +44 -0
- data/ext/libcouchbase/tests/iotests/t_serverops.cc +1 -0
- data/ext/libcouchbase/tests/iotests/t_subdoc.cc +28 -0
- data/ext/libcouchbase/tests/iotests/t_views.cc +22 -10
- data/ext/libcouchbase/tools/CMakeLists.txt +21 -1
- data/ext/libcouchbase/tools/cbc-handlers.h +23 -3
- data/ext/libcouchbase/tools/cbc-n1qlback.cc +1 -1
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +126 -26
- data/ext/libcouchbase/tools/cbc-proxy.cc +403 -0
- data/ext/libcouchbase/tools/cbc-subdoc.cc +826 -0
- data/ext/libcouchbase/tools/cbc.cc +149 -37
- data/ext/libcouchbase/tools/common/options.h +5 -2
- data/ext/libcouchbase/tools/linenoise/linenoise.c +15 -15
- data/lib/libcouchbase.rb +4 -0
- data/lib/libcouchbase/bucket.rb +51 -0
- data/lib/libcouchbase/connection.rb +100 -13
- data/lib/libcouchbase/ext/libcouchbase.rb +40 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdsubdoc.rb +13 -1
- data/lib/libcouchbase/ext/libcouchbase/enums.rb +2 -1
- data/lib/libcouchbase/ext/libcouchbase/sdspec.rb +5 -0
- data/lib/libcouchbase/subdoc_request.rb +129 -0
- data/lib/libcouchbase/version.rb +1 -1
- data/spec/bucket_spec.rb +15 -1
- data/spec/connection_spec.rb +1 -1
- data/spec/subdoc_spec.rb +192 -0
- metadata +13 -4
- data/ext/libcouchbase/.travis.yml +0 -19
|
@@ -11,12 +11,17 @@
|
|
|
11
11
|
#include <libcouchbase/n1ql.h>
|
|
12
12
|
#include <limits>
|
|
13
13
|
#include <stddef.h>
|
|
14
|
+
#include <errno.h>
|
|
14
15
|
#include "common/options.h"
|
|
15
16
|
#include "common/histogram.h"
|
|
16
17
|
#include "cbc-handlers.h"
|
|
17
18
|
#include "connspec.h"
|
|
18
19
|
#include "contrib/lcb-jsoncpp/lcb-jsoncpp.h"
|
|
19
20
|
|
|
21
|
+
#ifndef LCB_NO_SSL
|
|
22
|
+
#include <openssl/crypto.h>
|
|
23
|
+
#endif
|
|
24
|
+
|
|
20
25
|
using namespace cbc;
|
|
21
26
|
|
|
22
27
|
using std::string;
|
|
@@ -34,11 +39,19 @@ string getRespKey(const lcb_RESPBASE* resp)
|
|
|
34
39
|
}
|
|
35
40
|
|
|
36
41
|
static void
|
|
37
|
-
printKeyError(string& key,
|
|
42
|
+
printKeyError(string& key, int cbtype, const lcb_RESPBASE *resp, const char *additional = NULL)
|
|
38
43
|
{
|
|
39
|
-
fprintf(stderr, "%-20s %s (0x%x)\n", key.c_str(), lcb_strerror(NULL,
|
|
44
|
+
fprintf(stderr, "%-20s %s (0x%x)\n", key.c_str(), lcb_strerror(NULL, resp->rc), resp->rc);
|
|
45
|
+
const char *ctx = lcb_resp_get_error_context(cbtype, resp);
|
|
46
|
+
if (ctx != NULL) {
|
|
47
|
+
fprintf(stderr, "%-20s %s\n", "", ctx);
|
|
48
|
+
}
|
|
49
|
+
const char *ref = lcb_resp_get_error_ref(cbtype, resp);
|
|
50
|
+
if (ref != NULL) {
|
|
51
|
+
fprintf(stderr, "%-20s Ref: %s\n", "", ref);
|
|
52
|
+
}
|
|
40
53
|
if (additional) {
|
|
41
|
-
fprintf(stderr, "%-20s%s\n", "", additional);
|
|
54
|
+
fprintf(stderr, "%-20s %s\n", "", additional);
|
|
42
55
|
}
|
|
43
56
|
}
|
|
44
57
|
|
|
@@ -60,7 +73,7 @@ printKeyCasStatus(string& key, int cbtype, const lcb_RESPBASE *resp,
|
|
|
60
73
|
|
|
61
74
|
extern "C" {
|
|
62
75
|
static void
|
|
63
|
-
get_callback(lcb_t, lcb_CALLBACKTYPE, const lcb_RESPGET *resp)
|
|
76
|
+
get_callback(lcb_t, lcb_CALLBACKTYPE cbtype, const lcb_RESPGET *resp)
|
|
64
77
|
{
|
|
65
78
|
string key = getRespKey((const lcb_RESPBASE *)resp);
|
|
66
79
|
if (resp->rc == LCB_SUCCESS) {
|
|
@@ -71,7 +84,7 @@ get_callback(lcb_t, lcb_CALLBACKTYPE, const lcb_RESPGET *resp)
|
|
|
71
84
|
fflush(stdout);
|
|
72
85
|
fprintf(stderr, "\n");
|
|
73
86
|
} else {
|
|
74
|
-
printKeyError(key, resp
|
|
87
|
+
printKeyError(key, cbtype, (const lcb_RESPBASE *)resp);
|
|
75
88
|
}
|
|
76
89
|
}
|
|
77
90
|
|
|
@@ -96,13 +109,13 @@ store_callback(lcb_t, lcb_CALLBACKTYPE cbtype, const lcb_RESPBASE *resp)
|
|
|
96
109
|
} else {
|
|
97
110
|
sprintf(buf, "%s", "Store failed");
|
|
98
111
|
}
|
|
99
|
-
printKeyError(key,
|
|
112
|
+
printKeyError(key, cbtype, resp);
|
|
100
113
|
}
|
|
101
114
|
} else {
|
|
102
115
|
if (resp->rc == LCB_SUCCESS) {
|
|
103
116
|
printKeyCasStatus(key, cbtype, resp, "Stored.");
|
|
104
117
|
} else {
|
|
105
|
-
printKeyError(key, resp
|
|
118
|
+
printKeyError(key, cbtype, resp);
|
|
106
119
|
}
|
|
107
120
|
}
|
|
108
121
|
}
|
|
@@ -112,7 +125,7 @@ common_callback(lcb_t, int type, const lcb_RESPBASE *resp)
|
|
|
112
125
|
{
|
|
113
126
|
string key = getRespKey(resp);
|
|
114
127
|
if (resp->rc != LCB_SUCCESS) {
|
|
115
|
-
printKeyError(key, resp
|
|
128
|
+
printKeyError(key, type, resp);
|
|
116
129
|
return;
|
|
117
130
|
}
|
|
118
131
|
switch (type) {
|
|
@@ -131,7 +144,7 @@ common_callback(lcb_t, int type, const lcb_RESPBASE *resp)
|
|
|
131
144
|
}
|
|
132
145
|
|
|
133
146
|
static void
|
|
134
|
-
observe_callback(lcb_t, lcb_CALLBACKTYPE, const lcb_RESPOBSERVE *resp)
|
|
147
|
+
observe_callback(lcb_t, lcb_CALLBACKTYPE cbtype, const lcb_RESPOBSERVE *resp)
|
|
135
148
|
{
|
|
136
149
|
if (resp->nkey == 0) {
|
|
137
150
|
return;
|
|
@@ -144,7 +157,7 @@ observe_callback(lcb_t, lcb_CALLBACKTYPE, const lcb_RESPOBSERVE *resp)
|
|
|
144
157
|
resp->ismaster ? "Master" : "Replica",
|
|
145
158
|
resp->status, resp->cas);
|
|
146
159
|
} else {
|
|
147
|
-
printKeyError(key, resp
|
|
160
|
+
printKeyError(key, cbtype, (const lcb_RESPBASE *)resp);
|
|
148
161
|
}
|
|
149
162
|
}
|
|
150
163
|
|
|
@@ -180,7 +193,7 @@ static void
|
|
|
180
193
|
stats_callback(lcb_t, lcb_CALLBACKTYPE, const lcb_RESPSTATS *resp)
|
|
181
194
|
{
|
|
182
195
|
if (resp->rc != LCB_SUCCESS) {
|
|
183
|
-
fprintf(stderr, "
|
|
196
|
+
fprintf(stderr, "ERROR 0x%02X (%s)\n", resp->rc, lcb_strerror(NULL, resp->rc));
|
|
184
197
|
return;
|
|
185
198
|
}
|
|
186
199
|
if (resp->server == NULL || resp->key == NULL) {
|
|
@@ -231,12 +244,24 @@ common_server_callback(lcb_t, int cbtype, const lcb_RESPSERVERBASE *sbase)
|
|
|
231
244
|
}
|
|
232
245
|
}
|
|
233
246
|
|
|
247
|
+
static void
|
|
248
|
+
ping_callback(lcb_t, int, const lcb_RESPPING *resp)
|
|
249
|
+
{
|
|
250
|
+
if (resp->rc != LCB_SUCCESS) {
|
|
251
|
+
fprintf(stderr, "failed: %s\n", lcb_strerror(NULL, resp->rc));
|
|
252
|
+
} else {
|
|
253
|
+
if (resp->njson) {
|
|
254
|
+
printf("%.*s", (int)resp->njson, resp->json);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
234
259
|
static void
|
|
235
260
|
arithmetic_callback(lcb_t, lcb_CALLBACKTYPE type, const lcb_RESPCOUNTER *resp)
|
|
236
261
|
{
|
|
237
262
|
string key = getRespKey((const lcb_RESPBASE *)resp);
|
|
238
263
|
if (resp->rc != LCB_SUCCESS) {
|
|
239
|
-
printKeyError(key, resp
|
|
264
|
+
printKeyError(key, type, (lcb_RESPBASE *)resp);
|
|
240
265
|
} else {
|
|
241
266
|
char buf[4096] = { 0 };
|
|
242
267
|
sprintf(buf, "Current value is %" PRIu64 ".", resp->value);
|
|
@@ -403,21 +428,36 @@ GetHandler::run()
|
|
|
403
428
|
lcb_install_callback3(instance, LCB_CALLBACK_GET, (lcb_RESPCALLBACK)get_callback);
|
|
404
429
|
lcb_install_callback3(instance, LCB_CALLBACK_GETREPLICA, (lcb_RESPCALLBACK)get_callback);
|
|
405
430
|
const vector<string>& keys = parser.getRestArgs();
|
|
406
|
-
|
|
431
|
+
std::string replica_mode = o_replica.result();
|
|
407
432
|
|
|
408
433
|
lcb_sched_enter(instance);
|
|
409
434
|
for (size_t ii = 0; ii < keys.size(); ++ii) {
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
cmd.
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
435
|
+
lcb_error_t err;
|
|
436
|
+
if (o_replica.passed()) {
|
|
437
|
+
lcb_CMDGETREPLICA cmd = { 0 };
|
|
438
|
+
const string& key = keys[ii];
|
|
439
|
+
LCB_KREQ_SIMPLE(&cmd.key, key.c_str(), key.size());
|
|
440
|
+
if (replica_mode == "first") {
|
|
441
|
+
cmd.strategy = LCB_REPLICA_FIRST;
|
|
442
|
+
} else if (replica_mode == "all") {
|
|
443
|
+
cmd.strategy = LCB_REPLICA_ALL;
|
|
444
|
+
} else {
|
|
445
|
+
cmd.strategy = LCB_REPLICA_SELECT;
|
|
446
|
+
cmd.index = std::atoi(replica_mode.c_str());
|
|
447
|
+
}
|
|
448
|
+
err = lcb_rget3(instance, this, &cmd);
|
|
449
|
+
} else {
|
|
450
|
+
lcb_CMDGET cmd = { 0 };
|
|
451
|
+
const string& key = keys[ii];
|
|
452
|
+
LCB_KREQ_SIMPLE(&cmd.key, key.c_str(), key.size());
|
|
453
|
+
if (o_exptime.passed()) {
|
|
454
|
+
cmd.exptime = o_exptime.result();
|
|
455
|
+
}
|
|
456
|
+
if (isLock()) {
|
|
457
|
+
cmd.lock = 1;
|
|
458
|
+
}
|
|
459
|
+
err = lcb_get3(instance, this, &cmd);
|
|
418
460
|
}
|
|
419
|
-
|
|
420
|
-
err = lcb_get3(instance, this, &cmd);
|
|
421
461
|
if (err != LCB_SUCCESS) {
|
|
422
462
|
throw LcbError(err);
|
|
423
463
|
}
|
|
@@ -763,11 +803,49 @@ VersionHandler::run()
|
|
|
763
803
|
memset(&info, 0, sizeof info);
|
|
764
804
|
err = lcb_cntl(NULL, LCB_CNTL_GET, LCB_CNTL_IOPS_DEFAULT_TYPES, &info);
|
|
765
805
|
if (err == LCB_SUCCESS) {
|
|
766
|
-
fprintf(stderr, " IO: Default=%s, Current=%s
|
|
806
|
+
fprintf(stderr, " IO: Default=%s, Current=%s, Accessible=",
|
|
767
807
|
iops_to_string(info.v.v0.os_default), iops_to_string(info.v.v0.effective));
|
|
768
808
|
}
|
|
769
|
-
|
|
770
|
-
|
|
809
|
+
{
|
|
810
|
+
size_t ii;
|
|
811
|
+
char buf[256] = {0}, *p = buf;
|
|
812
|
+
lcb_io_ops_type_t known_io[] = {
|
|
813
|
+
LCB_IO_OPS_WINIOCP,
|
|
814
|
+
LCB_IO_OPS_LIBEVENT,
|
|
815
|
+
LCB_IO_OPS_LIBUV,
|
|
816
|
+
LCB_IO_OPS_LIBEV,
|
|
817
|
+
LCB_IO_OPS_SELECT
|
|
818
|
+
};
|
|
819
|
+
|
|
820
|
+
|
|
821
|
+
for (ii = 0; ii < sizeof(known_io) / sizeof(known_io[0]); ii++) {
|
|
822
|
+
struct lcb_create_io_ops_st cio = {0};
|
|
823
|
+
lcb_io_opt_t io = NULL;
|
|
824
|
+
|
|
825
|
+
cio.v.v0.type = known_io[ii];
|
|
826
|
+
if (lcb_create_io_ops(&io, &cio) == LCB_SUCCESS) {
|
|
827
|
+
p += sprintf(p, "%s,", iops_to_string(known_io[ii]));
|
|
828
|
+
lcb_destroy_io_ops(io);
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
*(--p) = '\n';
|
|
832
|
+
fprintf(stderr, "%s", buf);
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
if (lcb_supports_feature(LCB_SUPPORTS_SSL)) {
|
|
836
|
+
#ifdef LCB_NO_SSL
|
|
837
|
+
printf(" SSL: SUPPORTED\n");
|
|
838
|
+
#else
|
|
839
|
+
#if defined(OPENSSL_VERSION)
|
|
840
|
+
printf(" SSL Runtime: %s\n", OpenSSL_version(OPENSSL_VERSION));
|
|
841
|
+
#elif defined(SSLEAY_VERSION)
|
|
842
|
+
printf(" SSL Runtime: %s\n", SSLeay_version(SSLEAY_VERSION));
|
|
843
|
+
#endif
|
|
844
|
+
printf(" SSL Headers: %s\n", OPENSSL_VERSION_TEXT);
|
|
845
|
+
#endif
|
|
846
|
+
} else {
|
|
847
|
+
printf(" SSL: NOT SUPPORTED\n");
|
|
848
|
+
}
|
|
771
849
|
}
|
|
772
850
|
|
|
773
851
|
void
|
|
@@ -852,6 +930,28 @@ VerbosityHandler::run()
|
|
|
852
930
|
lcb_wait(instance);
|
|
853
931
|
}
|
|
854
932
|
|
|
933
|
+
void
|
|
934
|
+
PingHandler::run()
|
|
935
|
+
{
|
|
936
|
+
Handler::run();
|
|
937
|
+
|
|
938
|
+
lcb_install_callback3(instance, LCB_CALLBACK_PING, (lcb_RESPCALLBACK)ping_callback);
|
|
939
|
+
lcb_CMDPING cmd = { 0 };
|
|
940
|
+
lcb_error_t err;
|
|
941
|
+
cmd.services = LCB_PINGSVC_F_KV | LCB_PINGSVC_F_N1QL | LCB_PINGSVC_F_VIEWS | LCB_PINGSVC_F_FTS;
|
|
942
|
+
cmd.options = LCB_PINGOPT_F_JSON | LCB_PINGOPT_F_JSONPRETTY;
|
|
943
|
+
if (o_details.passed()) {
|
|
944
|
+
cmd.options |= LCB_PINGOPT_F_JSONDETAILS;
|
|
945
|
+
}
|
|
946
|
+
lcb_sched_enter(instance);
|
|
947
|
+
err = lcb_ping3(instance, NULL, &cmd);
|
|
948
|
+
if (err != LCB_SUCCESS) {
|
|
949
|
+
throw LcbError(err);
|
|
950
|
+
}
|
|
951
|
+
lcb_sched_leave(instance);
|
|
952
|
+
lcb_wait(instance);
|
|
953
|
+
}
|
|
954
|
+
|
|
855
955
|
void
|
|
856
956
|
McFlushHandler::run()
|
|
857
957
|
{
|
|
@@ -979,11 +1079,11 @@ extern "C" {
|
|
|
979
1079
|
static void n1qlCallback(lcb_t, int, const lcb_RESPN1QL *resp)
|
|
980
1080
|
{
|
|
981
1081
|
if (resp->rflags & LCB_RESP_F_FINAL) {
|
|
982
|
-
fprintf(stderr, "
|
|
1082
|
+
fprintf(stderr, "---> Query response finished\n");
|
|
983
1083
|
if (resp->rc != LCB_SUCCESS) {
|
|
984
|
-
fprintf(stderr, "
|
|
1084
|
+
fprintf(stderr, "---> Query failed with library code 0x%x (%s)\n", resp->rc, lcb_strerror(NULL, resp->rc));
|
|
985
1085
|
if (resp->htresp) {
|
|
986
|
-
fprintf(stderr, "Inner HTTP request failed with library code 0x%x and HTTP status %d\n",
|
|
1086
|
+
fprintf(stderr, "---> Inner HTTP request failed with library code 0x%x and HTTP status %d\n",
|
|
987
1087
|
resp->htresp->rc, resp->htresp->htstatus);
|
|
988
1088
|
}
|
|
989
1089
|
}
|
|
@@ -1039,7 +1139,10 @@ N1qlHandler::run()
|
|
|
1039
1139
|
if (o_prepare.passed()) {
|
|
1040
1140
|
cmd.cmdflags |= LCB_CMDN1QL_F_PREPCACHE;
|
|
1041
1141
|
}
|
|
1042
|
-
|
|
1142
|
+
if (o_analytics.passed()) {
|
|
1143
|
+
cmd.cmdflags |= LCB_CMDN1QL_F_CBASQUERY;
|
|
1144
|
+
}
|
|
1145
|
+
fprintf(stderr, "---> Encoded query: %.*s\n", (int)cmd.nquery, cmd.query);
|
|
1043
1146
|
cmd.callback = n1qlCallback;
|
|
1044
1147
|
rc = lcb_n1ql_query(instance, NULL, &cmd);
|
|
1045
1148
|
if (rc != LCB_SUCCESS) {
|
|
@@ -1348,7 +1451,6 @@ ConnstrHandler::run()
|
|
|
1348
1451
|
lcb_error_t err;
|
|
1349
1452
|
const char *errmsg;
|
|
1350
1453
|
lcb::Connspec spec;
|
|
1351
|
-
memset(&spec, 0, sizeof spec);
|
|
1352
1454
|
err = spec.parse(connstr_s.c_str(), &errmsg);
|
|
1353
1455
|
if (err != LCB_SUCCESS) {
|
|
1354
1456
|
throw BadArg(errmsg);
|
|
@@ -1362,6 +1464,8 @@ ConnstrHandler::run()
|
|
|
1362
1464
|
if (spec.sslopts() & LCB_SSL_NOVERIFY) {
|
|
1363
1465
|
sslOpts += "|NOVERIFY";
|
|
1364
1466
|
}
|
|
1467
|
+
} else {
|
|
1468
|
+
sslOpts = "DISABLED";
|
|
1365
1469
|
}
|
|
1366
1470
|
printf("SSL: %s\n", sslOpts.c_str());
|
|
1367
1471
|
|
|
@@ -1455,7 +1559,7 @@ static const char* optionsOrder[] = {
|
|
|
1455
1559
|
"version",
|
|
1456
1560
|
"verbosity",
|
|
1457
1561
|
"view",
|
|
1458
|
-
"
|
|
1562
|
+
"query",
|
|
1459
1563
|
"admin",
|
|
1460
1564
|
"bucket-create",
|
|
1461
1565
|
"bucket-delete",
|
|
@@ -1467,6 +1571,7 @@ static const char* optionsOrder[] = {
|
|
|
1467
1571
|
"connstr",
|
|
1468
1572
|
"write-config",
|
|
1469
1573
|
"strerror",
|
|
1574
|
+
"ping",
|
|
1470
1575
|
NULL
|
|
1471
1576
|
};
|
|
1472
1577
|
|
|
@@ -1536,6 +1641,7 @@ setupHandlers()
|
|
|
1536
1641
|
handlers_s["cp"] = new SetHandler("cp");
|
|
1537
1642
|
handlers_s["stats"] = new StatsHandler();
|
|
1538
1643
|
handlers_s["verbosity"] = new VerbosityHandler();
|
|
1644
|
+
handlers_s["ping"] = new PingHandler();
|
|
1539
1645
|
handlers_s["mcflush"] = new McFlushHandler();
|
|
1540
1646
|
handlers_s["incr"] = new IncrHandler();
|
|
1541
1647
|
handlers_s["decr"] = new DecrHandler();
|
|
@@ -1544,7 +1650,7 @@ setupHandlers()
|
|
|
1544
1650
|
handlers_s["bucket-delete"] = new BucketDeleteHandler();
|
|
1545
1651
|
handlers_s["bucket-flush"] = new BucketFlushHandler();
|
|
1546
1652
|
handlers_s["view"] = new ViewsHandler();
|
|
1547
|
-
handlers_s["
|
|
1653
|
+
handlers_s["query"] = new N1qlHandler();
|
|
1548
1654
|
handlers_s["connstr"] = new ConnstrHandler();
|
|
1549
1655
|
handlers_s["write-config"] = new WriteConfigHandler();
|
|
1550
1656
|
handlers_s["strerror"] = new StrErrorHandler();
|
|
@@ -1561,6 +1667,7 @@ setupHandlers()
|
|
|
1561
1667
|
}
|
|
1562
1668
|
|
|
1563
1669
|
handlers["cat"] = handlers["get"];
|
|
1670
|
+
handlers["n1ql"] = handlers["query"];
|
|
1564
1671
|
}
|
|
1565
1672
|
|
|
1566
1673
|
#if _POSIX_VERSION >= 200112L
|
|
@@ -1604,7 +1711,8 @@ wrapExternalBinary(int argc, char **argv, const std::string& name)
|
|
|
1604
1711
|
size_t cbc_pos = exePath.find("cbc");
|
|
1605
1712
|
|
|
1606
1713
|
if (cbc_pos == string::npos) {
|
|
1607
|
-
|
|
1714
|
+
fprintf(stderr, "Failed to invoke %s (%s)\n", name.c_str(), exePath.c_str());
|
|
1715
|
+
exit(EXIT_FAILURE);
|
|
1608
1716
|
}
|
|
1609
1717
|
|
|
1610
1718
|
exePath.replace(cbc_pos, 3, name);
|
|
@@ -1617,11 +1725,11 @@ wrapExternalBinary(int argc, char **argv, const std::string& name)
|
|
|
1617
1725
|
}
|
|
1618
1726
|
args.push_back((char*)NULL);
|
|
1619
1727
|
execvp(exePath.c_str(), &args[0]);
|
|
1620
|
-
|
|
1621
|
-
throw BadArg("Couldn't execute " + name + " !");
|
|
1728
|
+
fprintf(stderr, "Failed to execute execute %s (%s): %s\n", name.c_str(), exePath.c_str(), strerror(errno));
|
|
1622
1729
|
#else
|
|
1623
|
-
|
|
1730
|
+
fprintf(stderr, "Can't wrap around %s on non-POSIX environments", name.c_str());
|
|
1624
1731
|
#endif
|
|
1732
|
+
exit(EXIT_FAILURE);
|
|
1625
1733
|
}
|
|
1626
1734
|
|
|
1627
1735
|
static void cleanupHandlers()
|
|
@@ -1641,6 +1749,10 @@ int main(int argc, char **argv)
|
|
|
1641
1749
|
wrapExternalBinary(argc, argv, "cbc-pillowfight");
|
|
1642
1750
|
} else if (strcmp(argv[1], "n1qlback") == 0) {
|
|
1643
1751
|
wrapExternalBinary(argc, argv, "cbc-n1qlback");
|
|
1752
|
+
} else if (strcmp(argv[1], "subdoc") == 0) {
|
|
1753
|
+
wrapExternalBinary(argc, argv, "cbc-subdoc");
|
|
1754
|
+
} else if (strcmp(argv[1], "proxy") == 0) {
|
|
1755
|
+
wrapExternalBinary(argc, argv, "cbc-proxy");
|
|
1644
1756
|
}
|
|
1645
1757
|
}
|
|
1646
1758
|
|
|
@@ -34,8 +34,11 @@ namespace cbc {
|
|
|
34
34
|
|
|
35
35
|
class LcbError : public std::runtime_error {
|
|
36
36
|
private:
|
|
37
|
-
static std::string format_err(lcb_error_t err) {
|
|
37
|
+
static std::string format_err(lcb_error_t err, std::string msg) {
|
|
38
38
|
std::stringstream ss;
|
|
39
|
+
if (!msg.empty()) {
|
|
40
|
+
ss << msg << ". ";
|
|
41
|
+
}
|
|
39
42
|
ss << "libcouchbase error: " << lcb_strerror(NULL, err);
|
|
40
43
|
ss << " (0x" << std::hex << err << ")";
|
|
41
44
|
return ss.str();
|
|
@@ -43,7 +46,7 @@ private:
|
|
|
43
46
|
|
|
44
47
|
public:
|
|
45
48
|
lcb_error_t rc;
|
|
46
|
-
LcbError(lcb_error_t code) : std::runtime_error(format_err(code)) {}
|
|
49
|
+
LcbError(lcb_error_t code, std::string msg = "") : std::runtime_error(format_err(code, msg)) {}
|
|
47
50
|
};
|
|
48
51
|
|
|
49
52
|
class BadArg : public std::runtime_error {
|
|
@@ -173,7 +173,6 @@ enum KEY_ACTION{
|
|
|
173
173
|
};
|
|
174
174
|
|
|
175
175
|
static void linenoiseAtExit(void);
|
|
176
|
-
int linenoiseHistoryAdd(const char *line);
|
|
177
176
|
static void refreshLine(struct linenoiseState *l);
|
|
178
177
|
|
|
179
178
|
/* Debugging macro. */
|
|
@@ -192,7 +191,7 @@ FILE *lndebug_fp = NULL;
|
|
|
192
191
|
fflush(lndebug_fp); \
|
|
193
192
|
} while (0)
|
|
194
193
|
#else
|
|
195
|
-
#define lndebug(
|
|
194
|
+
#define lndebug(...)
|
|
196
195
|
#endif
|
|
197
196
|
|
|
198
197
|
/* ======================= Low level terminal handling ====================== */
|
|
@@ -473,7 +472,7 @@ static void abFree(struct abuf *ab) {
|
|
|
473
472
|
|
|
474
473
|
/* Helper of refreshSingleLine() and refreshMultiLine() to show hints
|
|
475
474
|
* to the right of the prompt. */
|
|
476
|
-
void refreshShowHints(struct abuf *ab, struct linenoiseState *l, int plen) {
|
|
475
|
+
static void refreshShowHints(struct abuf *ab, struct linenoiseState *l, int plen) {
|
|
477
476
|
char seq[64];
|
|
478
477
|
if (hintsCallback && plen+l->len < l->cols) {
|
|
479
478
|
int color = -1, bold = 0;
|
|
@@ -635,7 +634,7 @@ static void refreshLine(struct linenoiseState *l) {
|
|
|
635
634
|
/* Insert the character 'c' at cursor current position.
|
|
636
635
|
*
|
|
637
636
|
* On error writing to the terminal -1 is returned, otherwise 0. */
|
|
638
|
-
int linenoiseEditInsert(struct linenoiseState *l, char c) {
|
|
637
|
+
static int linenoiseEditInsert(struct linenoiseState *l, char c) {
|
|
639
638
|
if (l->len < l->buflen) {
|
|
640
639
|
if (l->len == l->pos) {
|
|
641
640
|
l->buf[l->pos] = c;
|
|
@@ -662,7 +661,7 @@ int linenoiseEditInsert(struct linenoiseState *l, char c) {
|
|
|
662
661
|
}
|
|
663
662
|
|
|
664
663
|
/* Move cursor on the left. */
|
|
665
|
-
void linenoiseEditMoveLeft(struct linenoiseState *l) {
|
|
664
|
+
static void linenoiseEditMoveLeft(struct linenoiseState *l) {
|
|
666
665
|
if (l->pos > 0) {
|
|
667
666
|
l->pos--;
|
|
668
667
|
refreshLine(l);
|
|
@@ -670,7 +669,7 @@ void linenoiseEditMoveLeft(struct linenoiseState *l) {
|
|
|
670
669
|
}
|
|
671
670
|
|
|
672
671
|
/* Move cursor on the right. */
|
|
673
|
-
void linenoiseEditMoveRight(struct linenoiseState *l) {
|
|
672
|
+
static void linenoiseEditMoveRight(struct linenoiseState *l) {
|
|
674
673
|
if (l->pos != l->len) {
|
|
675
674
|
l->pos++;
|
|
676
675
|
refreshLine(l);
|
|
@@ -678,7 +677,7 @@ void linenoiseEditMoveRight(struct linenoiseState *l) {
|
|
|
678
677
|
}
|
|
679
678
|
|
|
680
679
|
/* Move cursor to the start of the line. */
|
|
681
|
-
void linenoiseEditMoveHome(struct linenoiseState *l) {
|
|
680
|
+
static void linenoiseEditMoveHome(struct linenoiseState *l) {
|
|
682
681
|
if (l->pos != 0) {
|
|
683
682
|
l->pos = 0;
|
|
684
683
|
refreshLine(l);
|
|
@@ -686,7 +685,7 @@ void linenoiseEditMoveHome(struct linenoiseState *l) {
|
|
|
686
685
|
}
|
|
687
686
|
|
|
688
687
|
/* Move cursor to the end of the line. */
|
|
689
|
-
void linenoiseEditMoveEnd(struct linenoiseState *l) {
|
|
688
|
+
static void linenoiseEditMoveEnd(struct linenoiseState *l) {
|
|
690
689
|
if (l->pos != l->len) {
|
|
691
690
|
l->pos = l->len;
|
|
692
691
|
refreshLine(l);
|
|
@@ -697,7 +696,7 @@ void linenoiseEditMoveEnd(struct linenoiseState *l) {
|
|
|
697
696
|
* entry as specified by 'dir'. */
|
|
698
697
|
#define LINENOISE_HISTORY_NEXT 0
|
|
699
698
|
#define LINENOISE_HISTORY_PREV 1
|
|
700
|
-
void linenoiseEditHistoryNext(struct linenoiseState *l, int dir) {
|
|
699
|
+
static void linenoiseEditHistoryNext(struct linenoiseState *l, int dir) {
|
|
701
700
|
if (history_len > 1) {
|
|
702
701
|
/* Update the current history entry before to
|
|
703
702
|
* overwrite it with the next one. */
|
|
@@ -721,7 +720,7 @@ void linenoiseEditHistoryNext(struct linenoiseState *l, int dir) {
|
|
|
721
720
|
|
|
722
721
|
/* Delete the character at the right of the cursor without altering the cursor
|
|
723
722
|
* position. Basically this is what happens with the "Delete" keyboard key. */
|
|
724
|
-
void linenoiseEditDelete(struct linenoiseState *l) {
|
|
723
|
+
static void linenoiseEditDelete(struct linenoiseState *l) {
|
|
725
724
|
if (l->len > 0 && l->pos < l->len) {
|
|
726
725
|
memmove(l->buf+l->pos,l->buf+l->pos+1,l->len-l->pos-1);
|
|
727
726
|
l->len--;
|
|
@@ -731,7 +730,7 @@ void linenoiseEditDelete(struct linenoiseState *l) {
|
|
|
731
730
|
}
|
|
732
731
|
|
|
733
732
|
/* Backspace implementation. */
|
|
734
|
-
void linenoiseEditBackspace(struct linenoiseState *l) {
|
|
733
|
+
static void linenoiseEditBackspace(struct linenoiseState *l) {
|
|
735
734
|
if (l->pos > 0 && l->len > 0) {
|
|
736
735
|
memmove(l->buf+l->pos-1,l->buf+l->pos,l->len-l->pos);
|
|
737
736
|
l->pos--;
|
|
@@ -743,7 +742,7 @@ void linenoiseEditBackspace(struct linenoiseState *l) {
|
|
|
743
742
|
|
|
744
743
|
/* Delete the previosu word, maintaining the cursor at the start of the
|
|
745
744
|
* current word. */
|
|
746
|
-
void linenoiseEditDeletePrevWord(struct linenoiseState *l) {
|
|
745
|
+
static void linenoiseEditDeletePrevWord(struct linenoiseState *l) {
|
|
747
746
|
size_t old_pos = l->pos;
|
|
748
747
|
size_t diff;
|
|
749
748
|
|
|
@@ -804,11 +803,12 @@ static int linenoiseEdit(int stdin_fd, int stdout_fd, char *buf, size_t buflen,
|
|
|
804
803
|
* there was an error reading from fd. Otherwise it will return the
|
|
805
804
|
* character that should be handled next. */
|
|
806
805
|
if (c == 9 && completionCallback != NULL) {
|
|
807
|
-
|
|
806
|
+
int r = completeLine(&l);
|
|
808
807
|
/* Return on errors */
|
|
809
|
-
if (
|
|
808
|
+
if (r < 0) return l.len;
|
|
810
809
|
/* Read next character when 0 */
|
|
811
|
-
if (
|
|
810
|
+
if (r == 0) continue;
|
|
811
|
+
c = (char)r;
|
|
812
812
|
}
|
|
813
813
|
|
|
814
814
|
switch(c) {
|