libcouchbase 0.2.0 → 0.3.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 +4 -4
- data/.travis.yml +1 -1
- data/README.md +1 -1
- data/ext/libcouchbase/CMakeLists.txt +8 -6
- data/ext/libcouchbase/README.markdown +2 -2
- data/ext/libcouchbase/RELEASE_NOTES.markdown +0 -86
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +0 -11
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +0 -2
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +1 -2
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
- data/ext/libcouchbase/cmake/config-cmake.h.in +0 -2
- data/ext/libcouchbase/cmake/defs.mk.in +2 -0
- data/ext/libcouchbase/cmake/source_files.cmake +5 -21
- data/ext/libcouchbase/include/libcouchbase/auth.h +0 -10
- data/ext/libcouchbase/include/libcouchbase/cntl.h +1 -27
- data/ext/libcouchbase/include/libcouchbase/error.h +1 -15
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +1 -13
- data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +1 -1
- data/ext/libcouchbase/include/libcouchbase/subdoc.h +0 -9
- data/ext/libcouchbase/include/libcouchbase/views.h +1 -7
- data/ext/libcouchbase/include/libcouchbase/visibility.h +0 -1
- data/ext/libcouchbase/include/memcached/protocol_binary.h +1131 -29
- data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
- data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
- data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +2 -3
- data/ext/libcouchbase/src/README.md +2 -0
- data/ext/libcouchbase/src/auth-priv.h +0 -1
- data/ext/libcouchbase/src/auth.cc +4 -10
- data/ext/libcouchbase/src/bootstrap.c +269 -0
- data/ext/libcouchbase/src/bootstrap.h +39 -50
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +117 -84
- 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 +25 -50
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +386 -407
- data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
- data/ext/libcouchbase/src/cbft.cc +27 -22
- data/ext/libcouchbase/src/cntl.cc +19 -30
- data/ext/libcouchbase/src/connspec.cc +1 -48
- data/ext/libcouchbase/src/connspec.h +0 -27
- data/ext/libcouchbase/src/dump.cc +2 -2
- data/ext/libcouchbase/src/getconfig.cc +33 -7
- data/ext/libcouchbase/src/handler.cc +2 -0
- data/ext/libcouchbase/src/hostlist.cc +36 -0
- data/ext/libcouchbase/src/hostlist.h +62 -41
- data/ext/libcouchbase/src/http/http-priv.h +112 -125
- data/ext/libcouchbase/src/http/http.cc +30 -15
- data/ext/libcouchbase/src/http/http.h +34 -1
- data/ext/libcouchbase/src/http/http_io.cc +26 -22
- data/ext/libcouchbase/src/instance.cc +23 -94
- data/ext/libcouchbase/src/internal.h +26 -52
- data/ext/libcouchbase/src/jsparse/parser.cc +202 -146
- data/ext/libcouchbase/src/jsparse/parser.h +98 -91
- data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
- data/ext/libcouchbase/src/lcbht/lcbht.h +163 -174
- data/ext/libcouchbase/src/lcbio/connect.c +557 -0
- data/ext/libcouchbase/src/lcbio/connect.h +2 -9
- data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
- data/ext/libcouchbase/src/lcbio/iotable.h +16 -61
- data/ext/libcouchbase/src/lcbio/ioutils.h +1 -1
- data/ext/libcouchbase/src/lcbio/manager.c +2 -2
- data/ext/libcouchbase/src/mc/mcreq.h +2 -9
- data/ext/libcouchbase/src/mcserver/mcserver.cc +34 -143
- data/ext/libcouchbase/src/mcserver/mcserver.h +12 -7
- data/ext/libcouchbase/src/mcserver/negotiate.cc +38 -132
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +2 -1
- data/ext/libcouchbase/src/n1ql/n1ql.cc +32 -56
- data/ext/libcouchbase/src/newconfig.cc +6 -6
- data/ext/libcouchbase/src/nodeinfo.cc +2 -2
- data/ext/libcouchbase/src/operations/{cbflush.cc → cbflush.c} +15 -7
- data/ext/libcouchbase/src/operations/{counter.cc → counter.c} +0 -0
- data/ext/libcouchbase/src/operations/durability.cc +26 -6
- data/ext/libcouchbase/src/operations/durability_internal.h +3 -6
- data/ext/libcouchbase/src/operations/{get.cc → get.c} +26 -24
- data/ext/libcouchbase/src/operations/{observe.cc → observe.c} +93 -68
- data/ext/libcouchbase/src/operations/{pktfwd.cc → pktfwd.c} +0 -0
- data/ext/libcouchbase/src/operations/{remove.cc → remove.c} +0 -0
- data/ext/libcouchbase/src/operations/stats.cc +8 -3
- data/ext/libcouchbase/src/operations/{store.cc → store.c} +32 -27
- data/ext/libcouchbase/src/operations/subdoc.cc +18 -38
- data/ext/libcouchbase/src/operations/{touch.cc → touch.c} +0 -0
- data/ext/libcouchbase/src/packetutils.c +37 -0
- data/ext/libcouchbase/src/packetutils.h +2 -2
- data/ext/libcouchbase/src/probes.d +1 -1
- data/ext/libcouchbase/src/{retrychk.cc → retrychk.c} +3 -2
- data/ext/libcouchbase/src/retryq.cc +4 -4
- data/ext/libcouchbase/src/settings.c +0 -3
- data/ext/libcouchbase/src/settings.h +0 -5
- data/ext/libcouchbase/src/simplestring.c +211 -0
- data/ext/libcouchbase/src/simplestring.h +228 -0
- data/ext/libcouchbase/src/ssl/ssl_c.c +0 -1
- data/ext/libcouchbase/src/ssl/ssl_common.c +0 -2
- data/ext/libcouchbase/src/ssl/ssl_e.c +1 -0
- data/ext/libcouchbase/src/ssobuf.h +82 -0
- data/ext/libcouchbase/src/trace.h +4 -4
- data/ext/libcouchbase/src/vbucket/vbucket.c +1 -0
- data/ext/libcouchbase/src/views/{docreq.cc → docreq.c} +54 -48
- data/ext/libcouchbase/src/views/docreq.h +30 -24
- data/ext/libcouchbase/src/views/viewreq.c +358 -0
- data/ext/libcouchbase/src/views/viewreq.h +13 -43
- data/ext/libcouchbase/tests/basic/t_connstr.cc +50 -89
- data/ext/libcouchbase/tests/basic/t_host.cc +75 -67
- data/ext/libcouchbase/tests/basic/t_jsparse.cc +78 -27
- data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
- data/ext/libcouchbase/tests/htparse/t_basic.cc +78 -58
- data/ext/libcouchbase/tests/iotests/mock-environment.h +1 -2
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +114 -96
- data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +1 -1
- data/lib/libcouchbase/ext/tasks.rb +6 -2
- data/lib/libcouchbase/query_view.rb +1 -1
- data/lib/libcouchbase/results_fiber.rb +6 -6
- data/lib/libcouchbase/version.rb +1 -1
- metadata +26 -26
- data/ext/libcouchbase/src/bootstrap.cc +0 -216
- data/ext/libcouchbase/src/bucketconfig/bc_file.cc +0 -281
- data/ext/libcouchbase/src/bucketconfig/bc_http.cc +0 -528
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.cc +0 -115
- data/ext/libcouchbase/src/bucketconfig/confmon.cc +0 -378
- data/ext/libcouchbase/src/dns-srv.cc +0 -142
- data/ext/libcouchbase/src/errmap.cc +0 -107
- data/ext/libcouchbase/src/errmap.h +0 -113
- data/ext/libcouchbase/src/lcbht/lcbht.cc +0 -177
- data/ext/libcouchbase/src/lcbio/connect.cc +0 -562
- data/ext/libcouchbase/src/lcbio/timer-cxx.h +0 -87
- data/ext/libcouchbase/src/mctx-helper.h +0 -51
- data/ext/libcouchbase/src/views/viewreq.cc +0 -318
- data/ext/libcouchbase/tests/iotests/t_errmap.cc +0 -97
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2016 Couchbase, Inc.
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
#ifndef LCBIO_TIMER_CXX
|
|
18
|
-
#define LCBIO_TIMER_CXX
|
|
19
|
-
|
|
20
|
-
#include <lcbio/timer-ng.h>
|
|
21
|
-
#include <cstdlib>
|
|
22
|
-
|
|
23
|
-
namespace lcb {
|
|
24
|
-
namespace io {
|
|
25
|
-
|
|
26
|
-
class SimpleTimer {
|
|
27
|
-
public:
|
|
28
|
-
typedef void (Callback)(void*);
|
|
29
|
-
SimpleTimer(lcbio_pTABLE iot, void *data, Callback cb)
|
|
30
|
-
: inner(lcbio_timer_new(iot, data, cb)) {
|
|
31
|
-
}
|
|
32
|
-
~SimpleTimer() {
|
|
33
|
-
release();
|
|
34
|
-
}
|
|
35
|
-
void release() {
|
|
36
|
-
if (inner != NULL) {
|
|
37
|
-
lcbio_timer_destroy(inner);
|
|
38
|
-
inner = NULL;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
void signal() {
|
|
42
|
-
lcbio_async_signal(inner);
|
|
43
|
-
}
|
|
44
|
-
void cancel() {
|
|
45
|
-
lcbio_timer_disarm(inner);
|
|
46
|
-
}
|
|
47
|
-
bool is_armed() const {
|
|
48
|
-
return lcbio_timer_armed(inner);
|
|
49
|
-
}
|
|
50
|
-
void rearm(uint32_t usec) {
|
|
51
|
-
lcbio_timer_rearm(inner, usec);
|
|
52
|
-
}
|
|
53
|
-
void arm_if_disarmed(uint32_t usec) {
|
|
54
|
-
if (!is_armed()) {
|
|
55
|
-
rearm(usec);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
void dump(FILE *fp) const {
|
|
59
|
-
lcbio_timer_dump(inner, fp);
|
|
60
|
-
}
|
|
61
|
-
private:
|
|
62
|
-
lcbio_pTIMER inner;
|
|
63
|
-
SimpleTimer(const SimpleTimer&);
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
template <typename T, void (T::*M)(void)>
|
|
67
|
-
class Timer : public SimpleTimer {
|
|
68
|
-
public:
|
|
69
|
-
Timer(lcbio_pTABLE iot, T* ptr)
|
|
70
|
-
: SimpleTimer(iot, ptr, cb) {
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
~Timer() {
|
|
74
|
-
release();
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
private:
|
|
78
|
-
static void cb(void *arg) {
|
|
79
|
-
T *obj = reinterpret_cast<T*>(arg);
|
|
80
|
-
(obj->*M)();
|
|
81
|
-
}
|
|
82
|
-
Timer(const Timer&);
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
#endif
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2016 Couchbase, Inc.
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
#ifndef LCB_MCTX_HELPER_H
|
|
18
|
-
#define LCB_MCTX_HELPER_H
|
|
19
|
-
#include <libcouchbase/couchbase.h>
|
|
20
|
-
|
|
21
|
-
namespace lcb {
|
|
22
|
-
|
|
23
|
-
class MultiCmdContext : public lcb_MULTICMD_CTX {
|
|
24
|
-
protected:
|
|
25
|
-
virtual lcb_error_t MCTX_addcmd(const lcb_CMDBASE* cmd) = 0;
|
|
26
|
-
virtual lcb_error_t MCTX_done(const void *cookie) = 0;
|
|
27
|
-
virtual void MCTX_fail() = 0;
|
|
28
|
-
|
|
29
|
-
MultiCmdContext() {
|
|
30
|
-
lcb_MULTICMD_CTX::addcmd = dispatch_mctx_addcmd;
|
|
31
|
-
lcb_MULTICMD_CTX::done = dispatch_mctx_done;
|
|
32
|
-
lcb_MULTICMD_CTX::fail = dispatch_mctx_fail;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
virtual ~MultiCmdContext() {}
|
|
36
|
-
|
|
37
|
-
private:
|
|
38
|
-
static lcb_error_t dispatch_mctx_addcmd(lcb_MULTICMD_CTX* ctx, const lcb_CMDBASE * cmd) {
|
|
39
|
-
return static_cast<MultiCmdContext*>(ctx)->MCTX_addcmd(cmd);
|
|
40
|
-
}
|
|
41
|
-
static lcb_error_t dispatch_mctx_done(lcb_MULTICMD_CTX* ctx, const void *cookie) {
|
|
42
|
-
return static_cast<MultiCmdContext*>(ctx)->MCTX_done(cookie);
|
|
43
|
-
}
|
|
44
|
-
static void dispatch_mctx_fail(lcb_MULTICMD_CTX* ctx) {
|
|
45
|
-
static_cast<MultiCmdContext*>(ctx)->MCTX_fail();
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
#endif
|
|
@@ -1,318 +0,0 @@
|
|
|
1
|
-
#include "viewreq.h"
|
|
2
|
-
#include "sllist-inl.h"
|
|
3
|
-
#include "http/http.h"
|
|
4
|
-
#include "internal.h"
|
|
5
|
-
|
|
6
|
-
#define MAX_GET_URI_LENGTH 2048
|
|
7
|
-
using namespace lcb::views;
|
|
8
|
-
|
|
9
|
-
static void chunk_callback(lcb_t, int, const lcb_RESPBASE*);
|
|
10
|
-
|
|
11
|
-
template <typename value_type, typename size_type>
|
|
12
|
-
void IOV2PTRLEN(const lcb_IOV* iov, value_type*& ptr, size_type& len) {
|
|
13
|
-
ptr = reinterpret_cast<const value_type*>(iov->iov_base);
|
|
14
|
-
len = iov->iov_len;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/* Whether the request (from the user side) is still ongoing */
|
|
18
|
-
#define CAN_CONTINUE(req) ((req)->callback != NULL)
|
|
19
|
-
#define LOGARGS(instance, lvl) instance->settings, "views", LCB_LOG_##lvl, __FILE__, __LINE__
|
|
20
|
-
|
|
21
|
-
void ViewRequest::invoke_last(lcb_error_t err) {
|
|
22
|
-
lcb_RESPVIEWQUERY resp = { 0 };
|
|
23
|
-
if (callback == NULL) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
if (docq && docq->has_pending()) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
resp.rc = err;
|
|
31
|
-
resp.htresp = cur_htresp;
|
|
32
|
-
resp.cookie = const_cast<void*>(cookie);
|
|
33
|
-
resp.rflags = LCB_RESP_F_FINAL;
|
|
34
|
-
if (parser && parser->meta_complete) {
|
|
35
|
-
resp.value = parser->meta_buf.c_str();
|
|
36
|
-
resp.nvalue = parser->meta_buf.size();
|
|
37
|
-
} else {
|
|
38
|
-
resp.rflags |= LCB_RESP_F_CLIENTGEN;
|
|
39
|
-
}
|
|
40
|
-
callback(instance, LCB_CALLBACK_VIEWQUERY, &resp);
|
|
41
|
-
cancel();
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
void ViewRequest::invoke_row(lcb_RESPVIEWQUERY *resp) {
|
|
45
|
-
if (callback == NULL) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
resp->htresp = cur_htresp;
|
|
49
|
-
resp->cookie = const_cast<void*>(cookie);
|
|
50
|
-
callback(instance, LCB_CALLBACK_VIEWQUERY, resp);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
static void
|
|
54
|
-
chunk_callback(lcb_t instance, int, const lcb_RESPBASE *rb)
|
|
55
|
-
{
|
|
56
|
-
const lcb_RESPHTTP *rh = (const lcb_RESPHTTP *)rb;
|
|
57
|
-
ViewRequest *req = reinterpret_cast<ViewRequest*>(rh->cookie);
|
|
58
|
-
|
|
59
|
-
req->cur_htresp = rh;
|
|
60
|
-
|
|
61
|
-
if (rh->rc != LCB_SUCCESS || rh->htstatus != 200 || (rh->rflags & LCB_RESP_F_FINAL)) {
|
|
62
|
-
if (req->lasterr == LCB_SUCCESS && rh->htstatus != 200) {
|
|
63
|
-
if (rh->rc != LCB_SUCCESS) {
|
|
64
|
-
req->lasterr = rh->rc;
|
|
65
|
-
} else {
|
|
66
|
-
lcb_log(LOGARGS(instance, DEBUG), "Got not ok http status %d", rh->htstatus);
|
|
67
|
-
req->lasterr = LCB_HTTP_ERROR;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
req->ref();
|
|
71
|
-
req->invoke_last();
|
|
72
|
-
if (rh->rflags & LCB_RESP_F_FINAL) {
|
|
73
|
-
req->htreq = NULL;
|
|
74
|
-
req->unref();
|
|
75
|
-
}
|
|
76
|
-
req->cur_htresp = NULL;
|
|
77
|
-
req->unref();
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (!CAN_CONTINUE(req)) {
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
req->refcount++;
|
|
86
|
-
req->parser->feed(reinterpret_cast<const char*>(rh->body), rh->nbody);
|
|
87
|
-
req->cur_htresp = NULL;
|
|
88
|
-
req->unref();
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
static void
|
|
92
|
-
do_copy_iov(std::string& dstbuf, lcb_IOV *dstiov, const lcb_IOV *srciov)
|
|
93
|
-
{
|
|
94
|
-
dstiov->iov_len = srciov->iov_len;
|
|
95
|
-
dstiov->iov_base = const_cast<char*>(dstbuf.c_str() + dstbuf.size());
|
|
96
|
-
dstbuf.append(reinterpret_cast<const char*>(srciov->iov_base), srciov->iov_len);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
static VRDocRequest *
|
|
100
|
-
mk_docreq(const lcb::jsparse::Row *datum)
|
|
101
|
-
{
|
|
102
|
-
size_t extra_alloc = 0;
|
|
103
|
-
VRDocRequest *dreq;
|
|
104
|
-
extra_alloc =
|
|
105
|
-
datum->key.iov_len + datum->value.iov_len +
|
|
106
|
-
datum->geo.iov_len + datum->docid.iov_len;
|
|
107
|
-
|
|
108
|
-
dreq = new VRDocRequest();
|
|
109
|
-
dreq->rowbuf.reserve(extra_alloc);
|
|
110
|
-
do_copy_iov(dreq->rowbuf, &dreq->key, &datum->key);
|
|
111
|
-
do_copy_iov(dreq->rowbuf, &dreq->value, &datum->value);
|
|
112
|
-
do_copy_iov(dreq->rowbuf, &dreq->docid, &datum->docid);
|
|
113
|
-
do_copy_iov(dreq->rowbuf, &dreq->geo, &datum->geo);
|
|
114
|
-
return dreq;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
void ViewRequest::JSPARSE_on_row(const lcb::jsparse::Row& datum) {
|
|
118
|
-
using lcb::jsparse::Row;
|
|
119
|
-
if (!is_no_rowparse()) {
|
|
120
|
-
parser->parse_viewrow(const_cast<Row&>(datum));
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (is_include_docs() && datum.docid.iov_len && callback) {
|
|
124
|
-
VRDocRequest *dreq = mk_docreq(&datum);
|
|
125
|
-
dreq->parent = this;
|
|
126
|
-
docq->add(dreq);
|
|
127
|
-
ref();
|
|
128
|
-
|
|
129
|
-
} else {
|
|
130
|
-
lcb_RESPVIEWQUERY resp = { 0 };
|
|
131
|
-
if (is_no_rowparse()) {
|
|
132
|
-
IOV2PTRLEN(&datum.row, resp.value, resp.nvalue);
|
|
133
|
-
} else {
|
|
134
|
-
IOV2PTRLEN(&datum.key, resp.key, resp.nkey);
|
|
135
|
-
IOV2PTRLEN(&datum.docid, resp.docid, resp.ndocid);
|
|
136
|
-
IOV2PTRLEN(&datum.value, resp.value, resp.nvalue);
|
|
137
|
-
IOV2PTRLEN(&datum.geo, resp.geometry, resp.ngeometry);
|
|
138
|
-
}
|
|
139
|
-
resp.htresp = cur_htresp;
|
|
140
|
-
invoke_row(&resp);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
void ViewRequest::JSPARSE_on_error(const std::string&) {
|
|
145
|
-
invoke_last(LCB_PROTOCOL_ERROR);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
void ViewRequest::JSPARSE_on_complete(const std::string&) {
|
|
149
|
-
// Nothing
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
static void
|
|
153
|
-
cb_doc_ready(lcb::docreq::Queue *q, lcb::docreq::DocRequest *req_base)
|
|
154
|
-
{
|
|
155
|
-
lcb_RESPVIEWQUERY resp = { 0 };
|
|
156
|
-
VRDocRequest *dreq = (VRDocRequest*)req_base;
|
|
157
|
-
resp.docresp = &dreq->docresp;
|
|
158
|
-
IOV2PTRLEN(&dreq->key, resp.key, resp.nkey);
|
|
159
|
-
IOV2PTRLEN(&dreq->value, resp.value, resp.nvalue);
|
|
160
|
-
IOV2PTRLEN(&dreq->docid, resp.docid, resp.ndocid);
|
|
161
|
-
IOV2PTRLEN(&dreq->geo, resp.geometry, resp.ngeometry);
|
|
162
|
-
|
|
163
|
-
if (q->parent) {
|
|
164
|
-
reinterpret_cast<ViewRequest*>(q->parent)->invoke_row(&resp);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
delete dreq;
|
|
168
|
-
|
|
169
|
-
if (q->parent) {
|
|
170
|
-
reinterpret_cast<ViewRequest*>(q->parent)->unref();
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
static void
|
|
175
|
-
cb_docq_throttle(lcb::docreq::Queue *q, int enabled)
|
|
176
|
-
{
|
|
177
|
-
ViewRequest *req = reinterpret_cast<ViewRequest*>(q->parent);
|
|
178
|
-
if (req == NULL || req->htreq == NULL) {
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
if (enabled) {
|
|
182
|
-
req->htreq->pause();
|
|
183
|
-
} else {
|
|
184
|
-
req->htreq->resume();
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
ViewRequest::~ViewRequest() {
|
|
189
|
-
invoke_last();
|
|
190
|
-
|
|
191
|
-
if (parser != NULL) {
|
|
192
|
-
delete parser;
|
|
193
|
-
}
|
|
194
|
-
if (htreq != NULL) {
|
|
195
|
-
lcb_cancel_http_request(instance, htreq);
|
|
196
|
-
}
|
|
197
|
-
if (docq != NULL) {
|
|
198
|
-
docq->parent = NULL;
|
|
199
|
-
docq->unref();
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
lcb_error_t ViewRequest::request_http(const lcb_CMDVIEWQUERY *cmd) {
|
|
204
|
-
lcb_CMDHTTP htcmd = { 0 };
|
|
205
|
-
htcmd.method = LCB_HTTP_METHOD_GET;
|
|
206
|
-
htcmd.type = LCB_HTTP_TYPE_VIEW;
|
|
207
|
-
htcmd.cmdflags = LCB_CMDHTTP_F_STREAM;
|
|
208
|
-
|
|
209
|
-
std::string path;
|
|
210
|
-
path.append("_design/");
|
|
211
|
-
path.append(cmd->ddoc, cmd->nddoc);
|
|
212
|
-
path.append(is_spatial() ? "/_spatial/" : "/_view/");
|
|
213
|
-
path.append(cmd->view, cmd->nview);
|
|
214
|
-
if (cmd->noptstr) {
|
|
215
|
-
path.append("?").append(cmd->optstr, cmd->noptstr);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
if (cmd->npostdata) {
|
|
219
|
-
htcmd.method = LCB_HTTP_METHOD_POST;
|
|
220
|
-
htcmd.body = cmd->postdata;
|
|
221
|
-
htcmd.nbody = cmd->npostdata;
|
|
222
|
-
htcmd.content_type = "application/json";
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
LCB_CMD_SET_KEY(&htcmd, path.c_str(), path.size());
|
|
226
|
-
htcmd.reqhandle = &htreq;
|
|
227
|
-
|
|
228
|
-
lcb_error_t err = lcb_http3(instance, this, &htcmd);
|
|
229
|
-
if (err == LCB_SUCCESS) {
|
|
230
|
-
htreq->set_callback(chunk_callback);
|
|
231
|
-
}
|
|
232
|
-
return err;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
ViewRequest::ViewRequest(lcb_t instance_, const void *cookie_,
|
|
236
|
-
const lcb_CMDVIEWQUERY* cmd)
|
|
237
|
-
: cur_htresp(NULL), htreq(NULL),
|
|
238
|
-
parser(new lcb::jsparse::Parser(lcb::jsparse::Parser::MODE_VIEWS, this)),
|
|
239
|
-
cookie(cookie_), docq(NULL), callback(cmd->callback),
|
|
240
|
-
instance(instance_), refcount(1),
|
|
241
|
-
cmdflags(cmd->cmdflags),
|
|
242
|
-
lasterr(LCB_SUCCESS) {
|
|
243
|
-
|
|
244
|
-
// Validate:
|
|
245
|
-
if (cmd->nddoc == 0 || cmd->nview == 0 || callback == NULL) {
|
|
246
|
-
lasterr = LCB_EINVAL;
|
|
247
|
-
} else if (is_include_docs() && is_no_rowparse()) {
|
|
248
|
-
lasterr = LCB_OPTIONS_CONFLICT;
|
|
249
|
-
} else if (cmd->noptstr > MAX_GET_URI_LENGTH) {
|
|
250
|
-
lasterr = LCB_E2BIG;
|
|
251
|
-
}
|
|
252
|
-
if (lasterr != LCB_SUCCESS) {
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
if (is_include_docs()) {
|
|
257
|
-
docq = new lcb::docreq::Queue(instance);
|
|
258
|
-
docq->parent = this;
|
|
259
|
-
docq->cb_ready = cb_doc_ready;
|
|
260
|
-
docq->cb_throttle = cb_docq_throttle;
|
|
261
|
-
if (cmd->docs_concurrent_max) {
|
|
262
|
-
docq->max_pending_response = cmd->docs_concurrent_max;
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
if (cmd->handle) {
|
|
267
|
-
*cmd->handle = this;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
lcb_aspend_add(&instance->pendops, LCB_PENDTYPE_COUNTER, NULL);
|
|
271
|
-
|
|
272
|
-
lasterr = request_http(cmd);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
LIBCOUCHBASE_API
|
|
276
|
-
lcb_error_t
|
|
277
|
-
lcb_view_query(lcb_t instance, const void *cookie, const lcb_CMDVIEWQUERY *cmd)
|
|
278
|
-
{
|
|
279
|
-
ViewRequest *req = new ViewRequest(instance, cookie, cmd);
|
|
280
|
-
lcb_error_t err = req->lasterr;
|
|
281
|
-
if (err != LCB_SUCCESS) {
|
|
282
|
-
req->cancel();
|
|
283
|
-
delete req;
|
|
284
|
-
}
|
|
285
|
-
return err;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
LIBCOUCHBASE_API
|
|
289
|
-
void
|
|
290
|
-
lcb_view_query_initcmd(lcb_CMDVIEWQUERY *vq,
|
|
291
|
-
const char *design, const char *view, const char *options,
|
|
292
|
-
lcb_VIEWQUERYCALLBACK callback)
|
|
293
|
-
{
|
|
294
|
-
vq->view = view;
|
|
295
|
-
vq->nview = strlen(view);
|
|
296
|
-
vq->ddoc = design;
|
|
297
|
-
vq->nddoc = strlen(design);
|
|
298
|
-
if (options != NULL) {
|
|
299
|
-
vq->optstr = options;
|
|
300
|
-
vq->noptstr = strlen(options);
|
|
301
|
-
}
|
|
302
|
-
vq->callback = callback;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
LIBCOUCHBASE_API
|
|
306
|
-
void lcb_view_cancel(lcb_t, lcb_VIEWHANDLE handle) {
|
|
307
|
-
handle->cancel();
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
void ViewRequest::cancel() {
|
|
311
|
-
if (callback) {
|
|
312
|
-
callback = NULL;
|
|
313
|
-
lcb_aspend_del(&instance->pendops, LCB_PENDTYPE_COUNTER, NULL);
|
|
314
|
-
if (docq) {
|
|
315
|
-
docq->cancel();
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}
|