libcouchbase 0.3.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libcouchbase/CMakeLists.txt +6 -8
  3. data/ext/libcouchbase/README.markdown +2 -2
  4. data/ext/libcouchbase/RELEASE_NOTES.markdown +229 -2
  5. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +11 -0
  6. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +18 -0
  7. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +3 -2
  8. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
  9. data/ext/libcouchbase/cmake/config-cmake.h.in +4 -0
  10. data/ext/libcouchbase/cmake/defs.mk.in +0 -2
  11. data/ext/libcouchbase/cmake/source_files.cmake +21 -5
  12. data/ext/libcouchbase/contrib/cJSON/cJSON.c +1 -1
  13. data/ext/libcouchbase/contrib/cbsasl/src/client.c +2 -0
  14. data/ext/libcouchbase/example/users/README +48 -0
  15. data/ext/libcouchbase/example/users/users.c +147 -0
  16. data/ext/libcouchbase/include/libcouchbase/auth.h +175 -31
  17. data/ext/libcouchbase/include/libcouchbase/cntl.h +82 -1
  18. data/ext/libcouchbase/include/libcouchbase/couchbase.h +45 -3
  19. data/ext/libcouchbase/include/libcouchbase/error.h +19 -1
  20. data/ext/libcouchbase/include/libcouchbase/iops.h +3 -0
  21. data/ext/libcouchbase/include/libcouchbase/n1ql.h +31 -1
  22. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +4 -1
  23. data/ext/libcouchbase/include/libcouchbase/subdoc.h +36 -2
  24. data/ext/libcouchbase/include/libcouchbase/views.h +7 -1
  25. data/ext/libcouchbase/include/libcouchbase/visibility.h +1 -0
  26. data/ext/libcouchbase/include/memcached/protocol_binary.h +24 -1146
  27. data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
  28. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +3 -2
  29. data/ext/libcouchbase/src/README.md +0 -2
  30. data/ext/libcouchbase/src/auth-priv.h +23 -4
  31. data/ext/libcouchbase/src/auth.cc +51 -43
  32. data/ext/libcouchbase/src/bootstrap.cc +244 -0
  33. data/ext/libcouchbase/src/bootstrap.h +58 -38
  34. data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +120 -158
  35. data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
  36. data/ext/libcouchbase/src/bucketconfig/bc_http.cc +526 -0
  37. data/ext/libcouchbase/src/bucketconfig/bc_http.h +50 -25
  38. data/ext/libcouchbase/src/bucketconfig/bc_static.cc +150 -0
  39. data/ext/libcouchbase/src/bucketconfig/clconfig.h +410 -386
  40. data/ext/libcouchbase/src/bucketconfig/confmon.cc +393 -0
  41. data/ext/libcouchbase/src/cbft.cc +22 -27
  42. data/ext/libcouchbase/src/cntl.cc +56 -22
  43. data/ext/libcouchbase/src/connspec.cc +47 -6
  44. data/ext/libcouchbase/src/connspec.h +27 -0
  45. data/ext/libcouchbase/src/dns-srv.cc +147 -0
  46. data/ext/libcouchbase/src/dump.cc +3 -3
  47. data/ext/libcouchbase/src/errmap.cc +173 -0
  48. data/ext/libcouchbase/src/errmap.h +198 -0
  49. data/ext/libcouchbase/src/getconfig.cc +7 -33
  50. data/ext/libcouchbase/src/handler.cc +118 -7
  51. data/ext/libcouchbase/src/hostlist.cc +0 -36
  52. data/ext/libcouchbase/src/hostlist.h +44 -62
  53. data/ext/libcouchbase/src/http/http-priv.h +125 -112
  54. data/ext/libcouchbase/src/http/http.cc +27 -35
  55. data/ext/libcouchbase/src/http/http.h +1 -34
  56. data/ext/libcouchbase/src/http/http_io.cc +28 -36
  57. data/ext/libcouchbase/src/instance.cc +131 -34
  58. data/ext/libcouchbase/src/internal.h +58 -26
  59. data/ext/libcouchbase/src/jsparse/parser.cc +136 -210
  60. data/ext/libcouchbase/src/jsparse/parser.h +84 -98
  61. data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
  62. data/ext/libcouchbase/src/lcbht/lcbht.h +174 -163
  63. data/ext/libcouchbase/src/lcbio/connect.cc +569 -0
  64. data/ext/libcouchbase/src/lcbio/connect.h +16 -7
  65. data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
  66. data/ext/libcouchbase/src/lcbio/iotable.h +101 -16
  67. data/ext/libcouchbase/src/lcbio/{ioutils.c → ioutils.cc} +30 -51
  68. data/ext/libcouchbase/src/lcbio/ioutils.h +29 -90
  69. data/ext/libcouchbase/src/lcbio/manager.cc +543 -0
  70. data/ext/libcouchbase/src/lcbio/manager.h +133 -96
  71. data/ext/libcouchbase/src/lcbio/protoctx.c +2 -2
  72. data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
  73. data/ext/libcouchbase/src/mc/mcreq.c +11 -2
  74. data/ext/libcouchbase/src/mc/mcreq.h +9 -2
  75. data/ext/libcouchbase/src/mcserver/mcserver.cc +175 -43
  76. data/ext/libcouchbase/src/mcserver/mcserver.h +9 -13
  77. data/ext/libcouchbase/src/mcserver/negotiate.cc +181 -62
  78. data/ext/libcouchbase/src/mcserver/negotiate.h +1 -3
  79. data/ext/libcouchbase/src/mctx-helper.h +51 -0
  80. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +1 -2
  81. data/ext/libcouchbase/src/n1ql/n1ql.cc +74 -42
  82. data/ext/libcouchbase/src/netbuf/netbuf.c +4 -4
  83. data/ext/libcouchbase/src/newconfig.cc +6 -6
  84. data/ext/libcouchbase/src/nodeinfo.cc +2 -2
  85. data/ext/libcouchbase/src/operations/{cbflush.c → cbflush.cc} +7 -15
  86. data/ext/libcouchbase/src/operations/{counter.c → counter.cc} +0 -0
  87. data/ext/libcouchbase/src/operations/durability.cc +6 -26
  88. data/ext/libcouchbase/src/operations/durability_internal.h +6 -3
  89. data/ext/libcouchbase/src/operations/{get.c → get.cc} +24 -26
  90. data/ext/libcouchbase/src/operations/{observe.c → observe.cc} +68 -93
  91. data/ext/libcouchbase/src/operations/{pktfwd.c → pktfwd.cc} +0 -0
  92. data/ext/libcouchbase/src/operations/{remove.c → remove.cc} +0 -0
  93. data/ext/libcouchbase/src/operations/stats.cc +3 -8
  94. data/ext/libcouchbase/src/operations/{store.c → store.cc} +27 -32
  95. data/ext/libcouchbase/src/operations/subdoc.cc +129 -42
  96. data/ext/libcouchbase/src/operations/{touch.c → touch.cc} +0 -0
  97. data/ext/libcouchbase/src/packetutils.h +30 -2
  98. data/ext/libcouchbase/src/probes.d +1 -1
  99. data/ext/libcouchbase/src/rdb/rope.c +1 -1
  100. data/ext/libcouchbase/src/{retrychk.c → retrychk.cc} +2 -3
  101. data/ext/libcouchbase/src/retryq.cc +52 -14
  102. data/ext/libcouchbase/src/retryq.h +3 -3
  103. data/ext/libcouchbase/src/settings.c +5 -0
  104. data/ext/libcouchbase/src/settings.h +11 -0
  105. data/ext/libcouchbase/src/ssl/ssl_c.c +1 -0
  106. data/ext/libcouchbase/src/ssl/ssl_common.c +2 -0
  107. data/ext/libcouchbase/src/ssl/ssl_e.c +0 -1
  108. data/ext/libcouchbase/src/strcodecs/strcodecs.h +1 -1
  109. data/ext/libcouchbase/src/trace.h +4 -4
  110. data/ext/libcouchbase/src/vbucket/vbucket.c +6 -10
  111. data/ext/libcouchbase/src/views/{docreq.c → docreq.cc} +48 -54
  112. data/ext/libcouchbase/src/views/docreq.h +24 -30
  113. data/ext/libcouchbase/src/views/viewreq.cc +318 -0
  114. data/ext/libcouchbase/src/views/viewreq.h +43 -13
  115. data/ext/libcouchbase/tests/basic/t_connstr.cc +88 -50
  116. data/ext/libcouchbase/tests/basic/t_creds.cc +47 -5
  117. data/ext/libcouchbase/tests/basic/t_host.cc +67 -75
  118. data/ext/libcouchbase/tests/basic/t_jsparse.cc +27 -82
  119. data/ext/libcouchbase/tests/basic/t_misc.cc +1 -1
  120. data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +0 -1
  121. data/ext/libcouchbase/tests/htparse/t_basic.cc +58 -78
  122. data/ext/libcouchbase/tests/ioserver/connection.cc +1 -1
  123. data/ext/libcouchbase/tests/ioserver/ioserver.cc +19 -6
  124. data/ext/libcouchbase/tests/iotests/mock-environment.cc +28 -2
  125. data/ext/libcouchbase/tests/iotests/mock-environment.h +51 -1
  126. data/ext/libcouchbase/tests/iotests/t_behavior.cc +1 -7
  127. data/ext/libcouchbase/tests/iotests/t_confmon.cc +97 -115
  128. data/ext/libcouchbase/tests/iotests/t_durability.cc +0 -1
  129. data/ext/libcouchbase/tests/iotests/t_eerrs.cc +119 -0
  130. data/ext/libcouchbase/tests/iotests/t_errmap.cc +178 -0
  131. data/ext/libcouchbase/tests/iotests/t_misc.cc +3 -3
  132. data/ext/libcouchbase/tests/iotests/t_netfail.cc +1 -1
  133. data/ext/libcouchbase/tests/iotests/t_obseqno.cc +0 -1
  134. data/ext/libcouchbase/tests/iotests/t_subdoc.cc +18 -11
  135. data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
  136. data/ext/libcouchbase/tests/socktests/socktest.cc +7 -10
  137. data/ext/libcouchbase/tests/socktests/socktest.h +2 -3
  138. data/ext/libcouchbase/tests/socktests/t_basic.cc +6 -6
  139. data/ext/libcouchbase/tests/socktests/t_manager.cc +5 -6
  140. data/ext/libcouchbase/tests/socktests/t_ssl.cc +1 -1
  141. data/ext/libcouchbase/tests/vbucket/confdata/ketama_expected.json +2562 -0
  142. data/ext/libcouchbase/tests/vbucket/confdata/memd_ketama_config.json +31 -0
  143. data/ext/libcouchbase/tests/vbucket/t_config.cc +35 -5
  144. data/ext/libcouchbase/tools/CMakeLists.txt +2 -2
  145. data/ext/libcouchbase/tools/cbc-handlers.h +128 -0
  146. data/ext/libcouchbase/tools/cbc-n1qlback.cc +64 -10
  147. data/ext/libcouchbase/tools/cbc-pillowfight.cc +2 -2
  148. data/ext/libcouchbase/tools/cbc.cc +143 -10
  149. data/ext/libcouchbase/tools/docgen/loc.h +1 -1
  150. data/lib/libcouchbase/connection.rb +4 -3
  151. data/lib/libcouchbase/version.rb +1 -1
  152. metadata +37 -28
  153. data/ext/libcouchbase/include/memcached/vbucket.h +0 -42
  154. data/ext/libcouchbase/src/bootstrap.c +0 -269
  155. data/ext/libcouchbase/src/bucketconfig/bc_file.c +0 -347
  156. data/ext/libcouchbase/src/bucketconfig/bc_http.c +0 -630
  157. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +0 -150
  158. data/ext/libcouchbase/src/bucketconfig/confmon.c +0 -474
  159. data/ext/libcouchbase/src/lcbht/lcbht.c +0 -282
  160. data/ext/libcouchbase/src/lcbio/connect.c +0 -557
  161. data/ext/libcouchbase/src/lcbio/manager.c +0 -584
  162. data/ext/libcouchbase/src/packetutils.c +0 -37
  163. data/ext/libcouchbase/src/simplestring.c +0 -211
  164. data/ext/libcouchbase/src/simplestring.h +0 -228
  165. data/ext/libcouchbase/src/ssobuf.h +0 -82
  166. data/ext/libcouchbase/src/views/viewreq.c +0 -358
  167. data/ext/libcouchbase/tests/basic/t_string.cc +0 -112
@@ -0,0 +1,393 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2013 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "internal.h"
19
+ #include "clconfig.h"
20
+ #include <list>
21
+ #include <algorithm>
22
+
23
+ #define LOGARGS(mon, lvlbase) mon->settings, "confmon", LCB_LOG_##lvlbase, __FILE__, __LINE__
24
+ #define LOG(mon, lvlbase, msg) lcb_log(mon->settings, "confmon", LCB_LOG_##lvlbase, __FILE__, __LINE__, msg)
25
+
26
+ using namespace lcb::clconfig;
27
+
28
+ Provider* Confmon::next_active(Provider *cur) {
29
+ ProviderList::iterator ii = std::find(
30
+ active_providers.begin(), active_providers.end(), cur);
31
+
32
+ if (ii == active_providers.end() || (++ii) == active_providers.end()) {
33
+ return NULL;
34
+ } else {
35
+ return *ii;
36
+ }
37
+ }
38
+
39
+ Provider* Confmon::first_active()
40
+ {
41
+ if (active_providers.empty()) {
42
+ return NULL;
43
+ } else {
44
+ return active_providers.front();
45
+ }
46
+ }
47
+
48
+ static const char *
49
+ provider_string(Method type) {
50
+ if (type == CLCONFIG_HTTP) { return "HTTP"; }
51
+ if (type == CLCONFIG_CCCP) { return "CCCP"; }
52
+ if (type == CLCONFIG_FILE) { return "FILE"; }
53
+ if (type == CLCONFIG_MCRAW) { return "MCRAW"; }
54
+ if (type == CLCONFIG_CLADMIN) { return "CLADMIN"; }
55
+ return "";
56
+ }
57
+
58
+ Confmon::Confmon(lcb_settings *settings_, lcbio_pTABLE iot_)
59
+ : cur_provider(NULL),
60
+ config(NULL),
61
+ settings(settings_),
62
+ last_error(LCB_SUCCESS),
63
+ iot(iot_),
64
+ as_start(iot_, this),
65
+ as_stop(iot_, this),
66
+ state(0),
67
+ last_stop_us(0) {
68
+
69
+ lcbio_table_ref(iot);
70
+ lcb_settings_ref(settings);
71
+
72
+ all_providers[CLCONFIG_FILE] = new_file_provider(this);
73
+ all_providers[CLCONFIG_CCCP] = new_cccp_provider(this);
74
+ all_providers[CLCONFIG_HTTP] = new_http_provider(this);
75
+ all_providers[CLCONFIG_MCRAW] = new_mcraw_provider(this);
76
+ all_providers[CLCONFIG_CLADMIN] = new_cladmin_provider(this);
77
+
78
+ for (size_t ii = 0; ii < CLCONFIG_MAX; ii++) {
79
+ all_providers[ii]->parent = this;
80
+ }
81
+ }
82
+
83
+ void Confmon::prepare() {
84
+ active_providers.clear();
85
+ lcb_log(LOGARGS(this, DEBUG), "Preparing providers (this may be called multiple times)");
86
+
87
+ for (size_t ii = 0; ii < CLCONFIG_MAX; ii++) {
88
+ Provider *cur = all_providers[ii];
89
+ if (cur) {
90
+ if (cur->enabled) {
91
+ active_providers.push_back(cur);
92
+ lcb_log(LOGARGS(this, DEBUG), "Provider %s is ENABLED", provider_string(cur->type));
93
+ } else if (cur->pause()) {
94
+ lcb_log(LOGARGS(this, DEBUG), "Provider %s is DISABLED", provider_string(cur->type));
95
+ }
96
+ }
97
+ }
98
+
99
+ lcb_assert(!active_providers.empty());
100
+ cur_provider = first_active();
101
+ }
102
+
103
+ Confmon::~Confmon() {
104
+ as_start.release();
105
+ as_stop.release();
106
+
107
+ if (config) {
108
+ config->decref();
109
+ config = NULL;
110
+ }
111
+
112
+ for (size_t ii = 0; ii < CLCONFIG_MAX; ii++) {
113
+ Provider *provider = all_providers[ii];
114
+ if (provider == NULL) {
115
+ continue;
116
+ }
117
+ delete provider;
118
+ all_providers[ii] = NULL;
119
+ }
120
+
121
+ lcbio_table_unref(iot);
122
+ lcb_settings_unref(settings);
123
+ }
124
+
125
+ int Confmon::do_set_next(ConfigInfo *new_config, bool notify_miss)
126
+ {
127
+ unsigned ii;
128
+
129
+ if (config && new_config == config) {
130
+ return 0;
131
+ }
132
+ if (config) {
133
+ lcbvb_CHANGETYPE chstatus = LCBVB_NO_CHANGES;
134
+ lcbvb_CONFIGDIFF *diff = lcbvb_compare(config->vbc, new_config->vbc);
135
+
136
+ if (!diff) {
137
+ lcb_log(LOGARGS(this, DEBUG), "Couldn't create vbucket diff");
138
+ return 0;
139
+ }
140
+
141
+ chstatus = lcbvb_get_changetype(diff);
142
+ lcbvb_free_diff(diff);
143
+
144
+ if (chstatus == 0 || config->compare(*new_config) >= 0) {
145
+ const lcbvb_CONFIG *ca, *cb;
146
+
147
+ ca = config->vbc;
148
+ cb = new_config->vbc;
149
+
150
+ lcb_log(LOGARGS(this, INFO), "Not applying configuration received via %s. No changes detected. A.rev=%d, B.rev=%d", provider_string(new_config->get_origin()), ca->revid, cb->revid);
151
+ if (notify_miss) {
152
+ invoke_listeners(CLCONFIG_EVENT_GOT_ANY_CONFIG, new_config);
153
+ }
154
+ return 0;
155
+ }
156
+ }
157
+
158
+ lcb_log(LOGARGS(this, INFO), "Setting new configuration. Received via %s", provider_string(new_config->get_origin()));
159
+
160
+ if (config) {
161
+ /** DECREF the old one */
162
+ config->decref();
163
+ }
164
+
165
+ for (ii = 0; ii < CLCONFIG_MAX; ii++) {
166
+ Provider *cur = all_providers[ii];
167
+ if (cur && cur->enabled) {
168
+ cur->config_updated(new_config->vbc);
169
+ }
170
+ }
171
+
172
+ new_config->incref();
173
+ config = new_config;
174
+ stop();
175
+
176
+ invoke_listeners(CLCONFIG_EVENT_GOT_NEW_CONFIG, new_config);
177
+
178
+ return 1;
179
+ }
180
+
181
+ void Confmon::provider_failed(Provider *provider, lcb_error_t reason) {
182
+ lcb_log(LOGARGS(this, INFO), "Provider '%s' failed", provider_string(provider->type));
183
+
184
+ if (provider != cur_provider) {
185
+ lcb_log(LOGARGS(this, TRACE), "Ignoring failure. Current=%p (%s)", (void*)cur_provider, provider_string(cur_provider->type));
186
+ return;
187
+ }
188
+ if (!is_refreshing()) {
189
+ lcb_log(LOGARGS(this, DEBUG), "Ignoring failure. Refresh not active");
190
+ }
191
+
192
+ if (reason != LCB_SUCCESS) {
193
+ if (settings->detailed_neterr && last_error != LCB_SUCCESS) {
194
+ /* Filter out any artificial 'connect error' or 'network error' codes */
195
+ if (reason != LCB_CONNECT_ERROR && reason != LCB_NETWORK_ERROR) {
196
+ last_error = reason;
197
+ }
198
+ } else {
199
+ last_error = reason;
200
+ }
201
+ }
202
+
203
+ if (settings->conntype == LCB_TYPE_CLUSTER && provider->type == CLCONFIG_HTTP) {
204
+ Provider *cladmin = get_provider(CLCONFIG_CLADMIN);
205
+ if (!cladmin->enabled) {
206
+ cladmin->enable();
207
+ cladmin->configure_nodes(*provider->get_nodes());
208
+ active_providers.push_back(cladmin);
209
+ lcb_log(LOGARGS(this, DEBUG), "Static configuration provider has been enabled");
210
+ }
211
+ }
212
+
213
+ cur_provider = next_active(cur_provider);
214
+
215
+ if (!cur_provider) {
216
+ LOG(this, TRACE, "Maximum provider reached. Resetting index");
217
+ invoke_listeners(CLCONFIG_EVENT_PROVIDERS_CYCLED, NULL);
218
+ cur_provider = first_active();
219
+ stop();
220
+ } else {
221
+ uint32_t interval = 0;
222
+ if (config) {
223
+ /* Not first */
224
+ interval = settings->grace_next_provider;
225
+ }
226
+ lcb_log(LOGARGS(this, DEBUG), "Will try next provider in %uus", interval);
227
+ state |= CONFMON_S_ITERGRACE;
228
+ as_start.rearm(interval);
229
+ }
230
+ }
231
+
232
+ void Confmon::provider_got_config(Provider *, ConfigInfo *config_) {
233
+ do_set_next(config_, true);
234
+ stop();
235
+ }
236
+
237
+ void Confmon::do_next_provider()
238
+ {
239
+ state &= ~CONFMON_S_ITERGRACE;
240
+ for (ProviderList::const_iterator ii = active_providers.begin();
241
+ ii != active_providers.end(); ++ii) {
242
+ ConfigInfo *info;
243
+ Provider* cached_provider = *ii;
244
+ info = cached_provider->get_cached();
245
+ if (!info) {
246
+ continue;
247
+ }
248
+
249
+ if (do_set_next(info, false)) {
250
+ LOG(this, DEBUG, "Using cached configuration");
251
+ }
252
+ }
253
+
254
+ lcb_log(LOGARGS(this, TRACE), "Attempting to retrieve cluster map via %s", provider_string(cur_provider->type));
255
+
256
+ cur_provider->refresh();
257
+ }
258
+
259
+ void Confmon::start() {
260
+ lcb_U32 tmonext = 0;
261
+ as_stop.cancel();
262
+ if (is_refreshing()) {
263
+ LOG(this, DEBUG, "Cluster map refresh already in progress");
264
+ return;
265
+ }
266
+
267
+ LOG(this, TRACE, "Refreshing current cluster map");
268
+ lcb_assert(cur_provider);
269
+ state = CONFMON_S_ACTIVE|CONFMON_S_ITERGRACE;
270
+
271
+ if (last_stop_us > 0) {
272
+ lcb_U32 diff = LCB_NS2US(gethrtime()) - last_stop_us;
273
+ if (diff <= settings->grace_next_cycle) {
274
+ tmonext = settings->grace_next_cycle - diff;
275
+ }
276
+ }
277
+
278
+ as_start.rearm(tmonext);
279
+ }
280
+
281
+ void Confmon::stop_real() {
282
+ ProviderList::const_iterator ii;
283
+ for (ii = active_providers.begin(); ii != active_providers.end(); ++ii) {
284
+ (*ii)->pause();
285
+ }
286
+
287
+ last_stop_us = LCB_NS2US(gethrtime());
288
+ invoke_listeners(CLCONFIG_EVENT_MONITOR_STOPPED, NULL);
289
+ }
290
+
291
+ void Confmon::stop() {
292
+ if (!is_refreshing()) {
293
+ return;
294
+ }
295
+ as_start.cancel();
296
+ as_stop.cancel();
297
+ state = CONFMON_S_INACTIVE;
298
+ }
299
+
300
+ Provider::Provider(Confmon *parent_, Method type_)
301
+ : type(type_), enabled(false), parent(parent_) {
302
+ }
303
+
304
+ Provider::~Provider() {
305
+ parent = NULL;
306
+ }
307
+
308
+ ConfigInfo::~ConfigInfo() {
309
+ if (vbc) {
310
+ lcbvb_destroy(vbc);
311
+ }
312
+ }
313
+
314
+ int ConfigInfo::compare(const ConfigInfo& other) {
315
+ /** First check if both have revisions */
316
+ int rev_a, rev_b;
317
+ rev_a = lcbvb_get_revision(this->vbc);
318
+ rev_b = lcbvb_get_revision(other.vbc);
319
+ if (rev_a >= 0 && rev_b >= 0) {
320
+ return rev_a - rev_b;
321
+ }
322
+
323
+ if (this->cmpclock == other.cmpclock) {
324
+ return 0;
325
+
326
+ } else if (this->cmpclock < other.cmpclock) {
327
+ return -1;
328
+ }
329
+
330
+ return 1;
331
+ }
332
+
333
+ ConfigInfo::ConfigInfo(lcbvb_CONFIG *config_, Method origin_)
334
+ : vbc(config_), cmpclock(gethrtime()), refcount(1), origin(origin_) {
335
+ }
336
+
337
+ void Confmon::add_listener(Listener *lsn) {
338
+ listeners.push_back(lsn);
339
+ }
340
+
341
+ void Confmon::remove_listener(Listener *lsn) {
342
+ listeners.remove(lsn);
343
+ }
344
+
345
+ void Confmon::invoke_listeners(EventType event, ConfigInfo *info) {
346
+ ListenerList::iterator ii = listeners.begin();
347
+ while (ii != listeners.end()) {
348
+ ListenerList::iterator cur = ii++;
349
+ (*cur)->clconfig_lsn(event, info);
350
+ }
351
+ }
352
+
353
+
354
+ void Confmon::set_active(Method type, bool enabled)
355
+ {
356
+ Provider *provider = all_providers[type];
357
+ if (provider->enabled == enabled) {
358
+ return;
359
+ } else {
360
+ provider->enabled = enabled;
361
+ }
362
+ prepare();
363
+ }
364
+
365
+ void Confmon::dump(FILE *fp) {
366
+ fprintf(fp, "CONFMON=%p\n", (void*)this);
367
+ fprintf(fp, "STATE= (0x%x)", state);
368
+ if (state & CONFMON_S_ACTIVE) {
369
+ fprintf(fp, "ACTIVE|");
370
+ }
371
+ if (state == CONFMON_S_INACTIVE) {
372
+ fprintf(fp, "INACTIVE/IDLE");
373
+ }
374
+ if (state & CONFMON_S_ITERGRACE) {
375
+ fprintf(fp, "ITERGRACE");
376
+ }
377
+ fprintf(fp, "\n");
378
+ fprintf(fp, "LAST ERROR: 0x%x\n", last_error);
379
+
380
+
381
+ for (size_t ii = 0; ii < CLCONFIG_MAX; ii++) {
382
+ Provider *cur = all_providers[ii];
383
+ if (!cur) {
384
+ continue;
385
+ }
386
+
387
+ fprintf(fp, "** PROVIDER: 0x%x (%s) %p\n", cur->type, provider_string(cur->type), (void*)cur);
388
+ fprintf(fp, "** ENABLED: %s\n", cur->enabled ? "YES" : "NO");
389
+ fprintf(fp, "** CURRENT: %s\n", cur == cur_provider ? "YES" : "NO");
390
+ cur->dump(fp);
391
+ fprintf(fp, "\n");
392
+ }
393
+ }
@@ -27,10 +27,10 @@
27
27
  #define LOGID(req) static_cast<const void*>(req)
28
28
  #define LOGARGS(req, lvl) req->instance->settings, "n1ql", LCB_LOG_##lvl, __FILE__, __LINE__
29
29
 
30
- struct lcb_FTSREQ {
30
+ struct lcb_FTSREQ : lcb::jsparse::Parser::Actions {
31
31
  const lcb_RESPHTTP *cur_htresp;
32
32
  lcb_http_request_t htreq;
33
- lcbjsp_PARSER *parser;
33
+ lcb::jsparse::Parser *parser;
34
34
  const void *cookie;
35
35
  lcb_FTSCALLBACK callback;
36
36
  lcb_t instance;
@@ -41,25 +41,20 @@ struct lcb_FTSREQ {
41
41
 
42
42
  lcb_FTSREQ(lcb_t, const void *, const lcb_CMDFTS *);
43
43
  ~lcb_FTSREQ();
44
- };
45
-
46
- static void
47
- row_callback(lcbjsp_PARSER *parser, const lcbjsp_ROW *datum)
48
- {
49
- lcb_FTSREQ *req = static_cast<lcb_FTSREQ*>(parser->data);
50
- lcb_RESPFTS resp = { 0 };
51
-
52
- if (datum->type == LCBJSP_TYPE_ROW) {
53
- resp.row = static_cast<const char*>(datum->row.iov_base);
54
- resp.nrow = datum->row.iov_len;
55
- req->nrows++;
56
- req->invoke_row(&resp);
57
- } else if (datum->type == LCBJSP_TYPE_ERROR) {
58
- req->lasterr = resp.rc = LCB_PROTOCOL_ERROR;
59
- } else if (datum->type == LCBJSP_TYPE_COMPLETE) {
60
- /* Nothing */
44
+ void JSPARSE_on_row(const lcb::jsparse::Row& datum) {
45
+ lcb_RESPFTS resp = { 0 };
46
+ resp.row = static_cast<const char*>(datum.row.iov_base);
47
+ resp.nrow = datum.row.iov_len;
48
+ nrows++;
49
+ invoke_row(&resp);
61
50
  }
62
- }
51
+ void JSPARSE_on_error(const std::string&) {
52
+ lasterr = LCB_PROTOCOL_ERROR;
53
+ }
54
+ void JSPARSE_on_complete(const std::string&) {
55
+ // Nothing
56
+ }
57
+ };
63
58
 
64
59
  static void
65
60
  chunk_callback(lcb_t, int, const lcb_RESPBASE *rb)
@@ -83,7 +78,7 @@ chunk_callback(lcb_t, int, const lcb_RESPBASE *rb)
83
78
  * should remain alive (so we can cancel it later on) */
84
79
  delete req;
85
80
  } else {
86
- lcbjsp_feed(req->parser, static_cast<const char*>(rh->body), rh->nbody);
81
+ req->parser->feed(static_cast<const char*>(rh->body), rh->nbody);
87
82
  }
88
83
  }
89
84
 
@@ -107,7 +102,7 @@ lcb_FTSREQ::invoke_last()
107
102
 
108
103
  if (parser) {
109
104
  lcb_IOV meta;
110
- lcbjsp_get_postmortem(parser, &meta);
105
+ parser->get_postmortem(meta);
111
106
  resp.row = static_cast<const char*>(meta.iov_base);
112
107
  resp.nrow = meta.iov_len;
113
108
  }
@@ -116,7 +111,9 @@ lcb_FTSREQ::invoke_last()
116
111
  }
117
112
 
118
113
  lcb_FTSREQ::lcb_FTSREQ(lcb_t instance_, const void *cookie_, const lcb_CMDFTS *cmd)
119
- : cur_htresp(NULL), htreq(NULL), parser(lcbjsp_create(LCBJSP_MODE_FTS)),
114
+ : lcb::jsparse::Parser::Actions(),
115
+ cur_htresp(NULL), htreq(NULL),
116
+ parser(new lcb::jsparse::Parser(lcb::jsparse::Parser::MODE_FTS, this)),
120
117
  cookie(cookie_), callback(cmd->callback), instance(instance_), nrows(0),
121
118
  lasterr(LCB_SUCCESS)
122
119
  {
@@ -165,12 +162,10 @@ lcb_FTSREQ::lcb_FTSREQ(lcb_t instance_, const void *cookie_, const lcb_CMDFTS *c
165
162
  std::string qbody(Json::FastWriter().write(root));
166
163
  htcmd.body = qbody.c_str();
167
164
  htcmd.nbody = qbody.size();
168
- parser->data = this;
169
- parser->callback = row_callback;
170
165
 
171
166
  lasterr = lcb_http3(instance, this, &htcmd);
172
167
  if (lasterr == LCB_SUCCESS) {
173
- lcb_htreq_setcb(htreq, chunk_callback);
168
+ htreq->set_callback(chunk_callback);
174
169
  if (cmd->handle) {
175
170
  *cmd->handle = reinterpret_cast<lcb_FTSREQ*>(this);
176
171
  }
@@ -184,7 +179,7 @@ lcb_FTSREQ::~lcb_FTSREQ()
184
179
  htreq = NULL;
185
180
  }
186
181
  if (parser) {
187
- lcbjsp_free(parser);
182
+ delete parser;
188
183
  parser = NULL;
189
184
  }
190
185
  }