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.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/README.md +1 -1
  4. data/ext/libcouchbase/CMakeLists.txt +8 -6
  5. data/ext/libcouchbase/README.markdown +2 -2
  6. data/ext/libcouchbase/RELEASE_NOTES.markdown +0 -86
  7. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +0 -11
  8. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +0 -2
  9. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +1 -2
  10. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
  11. data/ext/libcouchbase/cmake/config-cmake.h.in +0 -2
  12. data/ext/libcouchbase/cmake/defs.mk.in +2 -0
  13. data/ext/libcouchbase/cmake/source_files.cmake +5 -21
  14. data/ext/libcouchbase/include/libcouchbase/auth.h +0 -10
  15. data/ext/libcouchbase/include/libcouchbase/cntl.h +1 -27
  16. data/ext/libcouchbase/include/libcouchbase/error.h +1 -15
  17. data/ext/libcouchbase/include/libcouchbase/n1ql.h +1 -13
  18. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +1 -1
  19. data/ext/libcouchbase/include/libcouchbase/subdoc.h +0 -9
  20. data/ext/libcouchbase/include/libcouchbase/views.h +1 -7
  21. data/ext/libcouchbase/include/libcouchbase/visibility.h +0 -1
  22. data/ext/libcouchbase/include/memcached/protocol_binary.h +1131 -29
  23. data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
  24. data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
  25. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +2 -3
  26. data/ext/libcouchbase/src/README.md +2 -0
  27. data/ext/libcouchbase/src/auth-priv.h +0 -1
  28. data/ext/libcouchbase/src/auth.cc +4 -10
  29. data/ext/libcouchbase/src/bootstrap.c +269 -0
  30. data/ext/libcouchbase/src/bootstrap.h +39 -50
  31. data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +117 -84
  32. data/ext/libcouchbase/src/bucketconfig/bc_file.c +347 -0
  33. data/ext/libcouchbase/src/bucketconfig/bc_http.c +630 -0
  34. data/ext/libcouchbase/src/bucketconfig/bc_http.h +25 -50
  35. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
  36. data/ext/libcouchbase/src/bucketconfig/clconfig.h +386 -407
  37. data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
  38. data/ext/libcouchbase/src/cbft.cc +27 -22
  39. data/ext/libcouchbase/src/cntl.cc +19 -30
  40. data/ext/libcouchbase/src/connspec.cc +1 -48
  41. data/ext/libcouchbase/src/connspec.h +0 -27
  42. data/ext/libcouchbase/src/dump.cc +2 -2
  43. data/ext/libcouchbase/src/getconfig.cc +33 -7
  44. data/ext/libcouchbase/src/handler.cc +2 -0
  45. data/ext/libcouchbase/src/hostlist.cc +36 -0
  46. data/ext/libcouchbase/src/hostlist.h +62 -41
  47. data/ext/libcouchbase/src/http/http-priv.h +112 -125
  48. data/ext/libcouchbase/src/http/http.cc +30 -15
  49. data/ext/libcouchbase/src/http/http.h +34 -1
  50. data/ext/libcouchbase/src/http/http_io.cc +26 -22
  51. data/ext/libcouchbase/src/instance.cc +23 -94
  52. data/ext/libcouchbase/src/internal.h +26 -52
  53. data/ext/libcouchbase/src/jsparse/parser.cc +202 -146
  54. data/ext/libcouchbase/src/jsparse/parser.h +98 -91
  55. data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
  56. data/ext/libcouchbase/src/lcbht/lcbht.h +163 -174
  57. data/ext/libcouchbase/src/lcbio/connect.c +557 -0
  58. data/ext/libcouchbase/src/lcbio/connect.h +2 -9
  59. data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
  60. data/ext/libcouchbase/src/lcbio/iotable.h +16 -61
  61. data/ext/libcouchbase/src/lcbio/ioutils.h +1 -1
  62. data/ext/libcouchbase/src/lcbio/manager.c +2 -2
  63. data/ext/libcouchbase/src/mc/mcreq.h +2 -9
  64. data/ext/libcouchbase/src/mcserver/mcserver.cc +34 -143
  65. data/ext/libcouchbase/src/mcserver/mcserver.h +12 -7
  66. data/ext/libcouchbase/src/mcserver/negotiate.cc +38 -132
  67. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +2 -1
  68. data/ext/libcouchbase/src/n1ql/n1ql.cc +32 -56
  69. data/ext/libcouchbase/src/newconfig.cc +6 -6
  70. data/ext/libcouchbase/src/nodeinfo.cc +2 -2
  71. data/ext/libcouchbase/src/operations/{cbflush.cc → cbflush.c} +15 -7
  72. data/ext/libcouchbase/src/operations/{counter.cc → counter.c} +0 -0
  73. data/ext/libcouchbase/src/operations/durability.cc +26 -6
  74. data/ext/libcouchbase/src/operations/durability_internal.h +3 -6
  75. data/ext/libcouchbase/src/operations/{get.cc → get.c} +26 -24
  76. data/ext/libcouchbase/src/operations/{observe.cc → observe.c} +93 -68
  77. data/ext/libcouchbase/src/operations/{pktfwd.cc → pktfwd.c} +0 -0
  78. data/ext/libcouchbase/src/operations/{remove.cc → remove.c} +0 -0
  79. data/ext/libcouchbase/src/operations/stats.cc +8 -3
  80. data/ext/libcouchbase/src/operations/{store.cc → store.c} +32 -27
  81. data/ext/libcouchbase/src/operations/subdoc.cc +18 -38
  82. data/ext/libcouchbase/src/operations/{touch.cc → touch.c} +0 -0
  83. data/ext/libcouchbase/src/packetutils.c +37 -0
  84. data/ext/libcouchbase/src/packetutils.h +2 -2
  85. data/ext/libcouchbase/src/probes.d +1 -1
  86. data/ext/libcouchbase/src/{retrychk.cc → retrychk.c} +3 -2
  87. data/ext/libcouchbase/src/retryq.cc +4 -4
  88. data/ext/libcouchbase/src/settings.c +0 -3
  89. data/ext/libcouchbase/src/settings.h +0 -5
  90. data/ext/libcouchbase/src/simplestring.c +211 -0
  91. data/ext/libcouchbase/src/simplestring.h +228 -0
  92. data/ext/libcouchbase/src/ssl/ssl_c.c +0 -1
  93. data/ext/libcouchbase/src/ssl/ssl_common.c +0 -2
  94. data/ext/libcouchbase/src/ssl/ssl_e.c +1 -0
  95. data/ext/libcouchbase/src/ssobuf.h +82 -0
  96. data/ext/libcouchbase/src/trace.h +4 -4
  97. data/ext/libcouchbase/src/vbucket/vbucket.c +1 -0
  98. data/ext/libcouchbase/src/views/{docreq.cc → docreq.c} +54 -48
  99. data/ext/libcouchbase/src/views/docreq.h +30 -24
  100. data/ext/libcouchbase/src/views/viewreq.c +358 -0
  101. data/ext/libcouchbase/src/views/viewreq.h +13 -43
  102. data/ext/libcouchbase/tests/basic/t_connstr.cc +50 -89
  103. data/ext/libcouchbase/tests/basic/t_host.cc +75 -67
  104. data/ext/libcouchbase/tests/basic/t_jsparse.cc +78 -27
  105. data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
  106. data/ext/libcouchbase/tests/htparse/t_basic.cc +78 -58
  107. data/ext/libcouchbase/tests/iotests/mock-environment.h +1 -2
  108. data/ext/libcouchbase/tests/iotests/t_confmon.cc +114 -96
  109. data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
  110. data/ext/libcouchbase/tools/cbc-pillowfight.cc +1 -1
  111. data/lib/libcouchbase/ext/tasks.rb +6 -2
  112. data/lib/libcouchbase/query_view.rb +1 -1
  113. data/lib/libcouchbase/results_fiber.rb +6 -6
  114. data/lib/libcouchbase/version.rb +1 -1
  115. metadata +26 -26
  116. data/ext/libcouchbase/src/bootstrap.cc +0 -216
  117. data/ext/libcouchbase/src/bucketconfig/bc_file.cc +0 -281
  118. data/ext/libcouchbase/src/bucketconfig/bc_http.cc +0 -528
  119. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.cc +0 -115
  120. data/ext/libcouchbase/src/bucketconfig/confmon.cc +0 -378
  121. data/ext/libcouchbase/src/dns-srv.cc +0 -142
  122. data/ext/libcouchbase/src/errmap.cc +0 -107
  123. data/ext/libcouchbase/src/errmap.h +0 -113
  124. data/ext/libcouchbase/src/lcbht/lcbht.cc +0 -177
  125. data/ext/libcouchbase/src/lcbio/connect.cc +0 -562
  126. data/ext/libcouchbase/src/lcbio/timer-cxx.h +0 -87
  127. data/ext/libcouchbase/src/mctx-helper.h +0 -51
  128. data/ext/libcouchbase/src/views/viewreq.cc +0 -318
  129. data/ext/libcouchbase/tests/iotests/t_errmap.cc +0 -97
@@ -71,8 +71,7 @@ class MockCommand
71
71
  X(GET_MCPORTS) \
72
72
  X(SET_CCCP) \
73
73
  X(REGEN_VBCOORDS) \
74
- X(RESET_QUERYSTATE) \
75
- X(OPFAIL)
74
+ X(RESET_QUERYSTATE)
76
75
 
77
76
  public:
78
77
  enum Code {
@@ -7,115 +7,130 @@
7
7
  #include <lcbio/iotable.h>
8
8
  #include <set>
9
9
 
10
- using namespace lcb::clconfig;
11
-
12
- class ConfmonTest : public ::testing::Test
10
+ class Confmon : public ::testing::Test
13
11
  {
14
12
  void SetUp() {
15
13
  MockEnvironment::Reset();
16
14
  }
17
15
  };
18
16
 
19
- struct evstop_listener : Listener {
17
+ struct evstop_listener {
18
+ clconfig_listener base;
20
19
  lcbio_pTABLE io;
21
20
  int called;
22
-
23
- void clconfig_lsn(EventType event, ConfigInfo*) {
24
- if (event != CLCONFIG_EVENT_GOT_NEW_CONFIG) {
25
- return;
26
- }
27
- called = 1;
28
- IOT_STOP(io);
29
- }
30
-
31
- evstop_listener() : Listener(), io(NULL), called(0) {
32
- }
33
21
  };
34
22
 
35
23
  extern "C" {
36
- static void listen_callback1(Listener *lsn, EventType event,
37
- ConfigInfo *info)
24
+ static void listen_callback1(clconfig_listener *lsn, clconfig_event_t event,
25
+ clconfig_info *info)
38
26
  {
27
+ if (event != CLCONFIG_EVENT_GOT_NEW_CONFIG) {
28
+ return;
29
+ }
30
+
31
+ evstop_listener *me = reinterpret_cast<evstop_listener*>(lsn);
32
+ me->called = 1;
33
+ IOT_STOP(me->io);
39
34
  }
40
35
  }
41
36
 
42
- TEST_F(ConfmonTest, testBasic)
37
+ TEST_F(Confmon, testBasic)
43
38
  {
44
39
  HandleWrap hw;
45
40
  lcb_t instance;
46
41
  MockEnvironment::getInstance()->createConnection(hw, instance);
47
42
 
48
43
 
49
- Confmon *mon = new Confmon(instance->settings, instance->iotable);
50
- Provider *http = mon->get_provider(CLCONFIG_HTTP);
51
- http->enable();
52
- http->configure_nodes(*instance->ht_nodes);
44
+ lcb_confmon *mon = lcb_confmon_create(instance->settings, instance->iotable);
45
+ clconfig_provider *http = lcb_confmon_get_provider(mon, LCB_CLCONFIG_HTTP);
46
+ lcb_clconfig_http_enable(http);
47
+ lcb_clconfig_http_set_nodes(http, instance->ht_nodes);
53
48
 
54
- mon->prepare();
49
+ lcb_confmon_prepare(mon);
55
50
 
56
- EXPECT_EQ(NULL, mon->get_config());
57
- mon->start();
58
- mon->start(); // Twice!
59
- mon->stop();
60
- mon->stop();
51
+ EXPECT_EQ(NULL, lcb_confmon_get_config(mon));
52
+ EXPECT_EQ(LCB_SUCCESS, lcb_confmon_start(mon));
53
+ EXPECT_EQ(LCB_SUCCESS, lcb_confmon_start(mon));
54
+ EXPECT_EQ(LCB_SUCCESS, lcb_confmon_stop(mon));
55
+ EXPECT_EQ(LCB_SUCCESS, lcb_confmon_stop(mon));
61
56
 
62
57
  // Try to find a provider..
63
- Provider *provider = mon->get_provider(CLCONFIG_HTTP);
58
+ clconfig_provider *provider = lcb_confmon_get_provider(mon, LCB_CLCONFIG_HTTP);
64
59
  ASSERT_NE(0, provider->enabled);
65
60
 
66
- evstop_listener listener;
61
+ struct evstop_listener listener;
62
+ memset(&listener, 0, sizeof(listener));
63
+
64
+ listener.base.callback = listen_callback1;
65
+ listener.base.parent = mon;
67
66
  listener.io = instance->iotable;
68
- mon->add_listener(&listener);
69
- mon->start();
67
+
68
+ lcb_confmon_add_listener(mon, &listener.base);
69
+ lcb_confmon_start(mon);
70
70
  IOT_START(instance->iotable);
71
71
  ASSERT_NE(0, listener.called);
72
- delete mon;
72
+
73
+ lcb_confmon_destroy(mon);
73
74
  }
74
75
 
75
76
 
76
- struct listener2 : Listener {
77
+ struct listener2 {
78
+ clconfig_listener base;
77
79
  int call_count;
78
80
  lcbio_pTABLE io;
79
- Method last_source;
80
- std::set<EventType> expected_events;
81
+ clconfig_method_t last_source;
82
+ std::set<clconfig_event_t> expected_events;
81
83
 
82
84
  void reset() {
83
85
  call_count = 0;
84
- last_source = CLCONFIG_PHONY;
86
+ last_source = LCB_CLCONFIG_PHONY;
85
87
  expected_events.clear();
86
88
  }
87
89
 
88
- listener2() : Listener() {
90
+ listener2() {
91
+ memset(&base, 0, sizeof(base));
89
92
  io = NULL;
90
93
  reset();
91
94
  }
95
+ };
92
96
 
93
- void clconfig_lsn(EventType event, ConfigInfo *info) {
94
- if (event == CLCONFIG_EVENT_MONITOR_STOPPED) {
95
- IOT_START(io);
96
- return;
97
- }
97
+ static struct listener2* getListener2(const void *p)
98
+ {
99
+ return reinterpret_cast<struct listener2*>(const_cast<void*>(p));
100
+ }
98
101
 
99
- if (!expected_events.empty()) {
100
- if (expected_events.end() ==
101
- expected_events.find(event)) {
102
- return;
103
- }
104
- }
102
+ extern "C" {
103
+ static void listen_callback2(clconfig_listener *prov,
104
+ clconfig_event_t event,
105
+ clconfig_info *info)
106
+ {
107
+ // Increase the number of times we've received a callback..
108
+ struct listener2* lsn = getListener2(prov);
105
109
 
106
- call_count++;
107
- last_source = info->get_origin();
108
- IOT_STOP(io);
110
+ if (event == CLCONFIG_EVENT_MONITOR_STOPPED) {
111
+ IOT_START(lsn->io);
112
+ return;
113
+ }
109
114
 
115
+ if (!lsn->expected_events.empty()) {
116
+ if (lsn->expected_events.end() ==
117
+ lsn->expected_events.find(event)) {
118
+ return;
119
+ }
110
120
  }
111
- };
112
121
 
113
- static void runConfmonTest(lcbio_pTABLE io, Confmon *mon)
122
+ lsn->call_count++;
123
+ lsn->last_source = info->origin;
124
+ IOT_STOP(lsn->io);
125
+ }
126
+ }
127
+
128
+ static void runConfmon(lcbio_pTABLE io, lcb_confmon *mon)
114
129
  {
115
130
  IOT_START(io);
116
131
  }
117
132
 
118
- TEST_F(ConfmonTest, testCycle)
133
+ TEST_F(Confmon, testCycle)
119
134
  {
120
135
  HandleWrap hw;
121
136
  lcb_t instance;
@@ -130,54 +145,57 @@ TEST_F(ConfmonTest, testCycle)
130
145
  instance->settings->bc_http_stream_time = 100000;
131
146
  instance->memd_sockpool->tmoidle = 100000;
132
147
 
133
- Confmon *mon = new Confmon(instance->settings, instance->iotable);
148
+ lcb_confmon *mon = lcb_confmon_create(instance->settings, instance->iotable);
134
149
 
135
150
  struct listener2 lsn;
151
+ lsn.base.callback = listen_callback2;
136
152
  lsn.io = instance->iotable;
137
153
  lsn.reset();
138
- mon->add_listener(&lsn);
154
+
155
+ lcb_confmon_add_listener(mon, &lsn.base);
139
156
 
140
157
  mock->makeConnectParams(cropts, NULL);
141
- Provider *cccp = mon->get_provider(CLCONFIG_CCCP);
142
- Provider *http = mon->get_provider(CLCONFIG_HTTP);
158
+ clconfig_provider *cccp = lcb_confmon_get_provider(mon, LCB_CLCONFIG_CCCP);
159
+ clconfig_provider *http = lcb_confmon_get_provider(mon, LCB_CLCONFIG_HTTP);
143
160
 
144
- lcb::Hostlist hl;
145
- hl.add(cropts.v.v2.mchosts, 11210);
146
- cccp->enable(instance);
147
- cccp->configure_nodes(hl);
161
+ hostlist_t hl = hostlist_create();
162
+ hostlist_add_stringz(hl, cropts.v.v2.mchosts, 11210);
163
+ lcb_clconfig_cccp_enable(cccp, instance);
164
+ lcb_clconfig_cccp_set_nodes(cccp, hl);
148
165
 
149
- http->enable();
150
- http->configure_nodes(*instance->ht_nodes);
166
+ lcb_clconfig_http_enable(http);
167
+ lcb_clconfig_http_set_nodes(http, instance->ht_nodes);
168
+ hostlist_destroy(hl);
151
169
 
152
- mon->prepare();
153
- mon->start();
170
+ lcb_confmon_prepare(mon);
171
+ lcb_confmon_start(mon);
154
172
  lsn.expected_events.insert(CLCONFIG_EVENT_GOT_NEW_CONFIG);
155
- runConfmonTest(lsn.io, mon);
173
+ runConfmon(lsn.io, mon);
156
174
 
157
175
  // Ensure CCCP is functioning properly and we're called only once.
158
176
  ASSERT_EQ(1, lsn.call_count);
159
- ASSERT_EQ(CLCONFIG_CCCP, lsn.last_source);
177
+ ASSERT_EQ(LCB_CLCONFIG_CCCP, lsn.last_source);
160
178
 
161
- mon->start();
179
+ lcb_confmon_start(mon);
162
180
  lsn.reset();
163
181
  lsn.expected_events.insert(CLCONFIG_EVENT_GOT_ANY_CONFIG);
164
- runConfmonTest(lsn.io, mon);
182
+ runConfmon(lsn.io, mon);
165
183
  ASSERT_EQ(1, lsn.call_count);
166
- ASSERT_EQ(CLCONFIG_CCCP, lsn.last_source);
184
+ ASSERT_EQ(LCB_CLCONFIG_CCCP, lsn.last_source);
167
185
 
168
186
  mock->setCCCP(false);
169
187
  mock->failoverNode(5);
170
188
  lsn.reset();
171
- mon->start();
189
+ lcb_confmon_start(mon);
172
190
  lsn.expected_events.insert(CLCONFIG_EVENT_GOT_ANY_CONFIG);
173
191
  lsn.expected_events.insert(CLCONFIG_EVENT_GOT_NEW_CONFIG);
174
- runConfmonTest(lsn.io, mon);
175
- ASSERT_EQ(CLCONFIG_HTTP, lsn.last_source);
192
+ runConfmon(lsn.io, mon);
193
+ ASSERT_EQ(LCB_CLCONFIG_HTTP, lsn.last_source);
176
194
  ASSERT_EQ(1, lsn.call_count);
177
- delete mon;
195
+ lcb_confmon_destroy(mon);
178
196
  }
179
197
 
180
- TEST_F(ConfmonTest, testBootstrapMethods)
198
+ TEST_F(Confmon, testBootstrapMethods)
181
199
  {
182
200
  lcb_t instance;
183
201
  HandleWrap hw;
@@ -186,38 +204,38 @@ TEST_F(ConfmonTest, testBootstrapMethods)
186
204
  ASSERT_EQ(LCB_SUCCESS, err);
187
205
 
188
206
  // Try the various bootstrap times
189
- lcb::Bootstrap* bs = instance->bs_state;
190
- hrtime_t last = bs->get_last_refresh(), cur = 0;
207
+ struct lcb_BOOTSTRAP *bs = instance->bootstrap;
208
+ hrtime_t last = bs->last_refresh, cur = 0;
191
209
 
192
210
  // Reset it for the time being
193
- bs->reset_last_refresh();
194
- instance->confmon->stop();
211
+ bs->last_refresh = 0;
212
+ lcb_confmon_stop(instance->confmon);
195
213
 
196
214
  // Refreshing now should work
197
- instance->bootstrap(lcb::BS_REFRESH_THROTTLE);
198
- ASSERT_TRUE(instance->confmon->is_refreshing());
215
+ lcb_bootstrap_common(instance, LCB_BS_REFRESH_THROTTLE);
216
+ ASSERT_NE(0, lcb_confmon_is_refreshing(instance->confmon));
199
217
 
200
- cur = bs->get_last_refresh();
218
+ cur = bs->last_refresh;
201
219
  ASSERT_GT(cur, 0);
202
- ASSERT_EQ(0, bs->get_errcounter());
220
+ ASSERT_EQ(0, bs->errcounter);
203
221
  last = cur;
204
222
 
205
223
  // Stop it, so the state is reset
206
- instance->confmon->stop();
207
- ASSERT_FALSE(instance->confmon->is_refreshing());
224
+ lcb_confmon_stop(instance->confmon);
225
+ ASSERT_EQ(0, lcb_confmon_is_refreshing(instance->confmon));
208
226
 
209
- instance->bootstrap(lcb::BS_REFRESH_THROTTLE|lcb::BS_REFRESH_INCRERR);
210
- ASSERT_EQ(last, bs->get_last_refresh());
211
- ASSERT_EQ(1, bs->get_errcounter());
227
+ lcb_bootstrap_common(instance, LCB_BS_REFRESH_THROTTLE|LCB_BS_REFRESH_INCRERR);
228
+ ASSERT_EQ(last, bs->last_refresh);
229
+ ASSERT_EQ(1, bs->errcounter);
212
230
 
213
231
  // Ensure that a throttled-without-incr doesn't actually incr
214
- instance->bootstrap(lcb::BS_REFRESH_THROTTLE);
215
- ASSERT_EQ(1, bs->get_errcounter());
232
+ lcb_bootstrap_common(instance, LCB_BS_REFRESH_THROTTLE);
233
+ ASSERT_EQ(1, bs->errcounter);
216
234
 
217
235
  // No refresh yet
218
- ASSERT_FALSE(instance->confmon->is_refreshing());
236
+ ASSERT_EQ(0, lcb_confmon_is_refreshing(instance->confmon));
219
237
 
220
- instance->bootstrap(lcb::BS_REFRESH_ALWAYS);
221
- ASSERT_TRUE(instance->confmon->is_refreshing());
222
- instance->confmon->stop();
238
+ lcb_bootstrap_common(instance, LCB_BS_REFRESH_ALWAYS);
239
+ ASSERT_NE(0, lcb_confmon_is_refreshing(instance->confmon));
240
+ lcb_confmon_stop(instance->confmon);
223
241
  }
@@ -223,16 +223,15 @@ TEST_F(McAlloc, testValueAlloc)
223
223
  mcreq_release_packet(pipeline, packet);
224
224
  }
225
225
 
226
- struct ExtraCookie : mc_REQDATAEX {
226
+ struct ExtraCookie {
227
+ mc_REQDATAEX base;
227
228
  int remaining;
228
- ExtraCookie(const mc_REQDATAPROCS& procs_)
229
- : mc_REQDATAEX(NULL, procs_, 0), remaining(0) {
230
- }
231
229
  };
232
230
 
233
231
  extern "C" {
234
232
  static void pkt_dtor(mc_PACKET *pkt) {
235
- ExtraCookie *ec = static_cast<ExtraCookie*>(pkt->u_rdata.exdata);
233
+ mc_REQDATAEX *rd = pkt->u_rdata.exdata;
234
+ ExtraCookie *ec = (ExtraCookie *)rd;
236
235
  ec->remaining--;
237
236
  }
238
237
  }
@@ -241,17 +240,18 @@ TEST_F(McAlloc, testRdataExDtor)
241
240
  {
242
241
  CQWrap q;
243
242
  lcb_CMDBASE basecmd;
244
- const static mc_REQDATAPROCS procs = { NULL, pkt_dtor };
243
+ ExtraCookie ec;
245
244
  protocol_binary_request_header hdr;
246
245
 
247
246
  memset(&hdr, 0, sizeof hdr);
248
247
  memset(&basecmd, 0, sizeof basecmd);
248
+ memset(&ec, 0, sizeof ec);
249
249
 
250
+ mc_REQDATAPROCS procs = { NULL, pkt_dtor };
251
+ ec.base.procs = &procs;
250
252
  basecmd.key.contig.bytes = "foo";
251
253
  basecmd.key.contig.nbytes = 3;
252
254
 
253
- ExtraCookie ec(procs);
254
-
255
255
  mcreq_sched_enter(&q);
256
256
  for (unsigned ii = 0; ii < 5; ii++) {
257
257
  lcb_error_t err;
@@ -260,7 +260,7 @@ TEST_F(McAlloc, testRdataExDtor)
260
260
  err = mcreq_basic_packet(&q, &basecmd, &hdr, 0, &pkt, &pl, 0);
261
261
  ASSERT_EQ(LCB_SUCCESS, err);
262
262
  pkt->flags |= MCREQ_F_REQEXT;
263
- pkt->u_rdata.exdata = &ec;
263
+ pkt->u_rdata.exdata = &ec.base;
264
264
  mcreq_sched_add(pl, pkt);
265
265
  ec.remaining++;
266
266
  }
@@ -630,7 +630,7 @@ private:
630
630
 
631
631
  const lcb_U64 elapsed_ns = now - previous_time;
632
632
  const lcb_U64 wanted_duration_ns =
633
- (config.opsPerCycle * 1e9) / (config.getRateLimit() * config.getNumThreads());
633
+ config.opsPerCycle * 1e9 / config.getRateLimit();
634
634
  // On first invocation no previous_time, so skip attempting to sleep.
635
635
  if (elapsed_ns > 0 && elapsed_ns < wanted_duration_ns) {
636
636
  // Dampen the sleep time by averaging with the previous
@@ -74,14 +74,18 @@ else
74
74
  end
75
75
 
76
76
  file 'ext/libcouchbase/build/makefile' => 'ext/libcouchbase/build' do
77
+ result = nil
77
78
  Dir.chdir("ext/libcouchbase") do |path|
78
- system './cmake/configure', '-with-libuv', ::File.expand_path('../../', ::Libuv::Ext.path_to_internal_libuv)
79
+ result = system './cmake/configure', '-with-libuv', ::File.expand_path('../../', ::Libuv::Ext.path_to_internal_libuv)
79
80
  end
81
+ raise 'could not find cmake on path' unless result
80
82
  end
81
83
 
82
84
  file "ext/libcouchbase/build/lib/libcouchbase_libuv.#{FFI::Platform::LIBSUFFIX}" => 'ext/libcouchbase/build/makefile' do
85
+ result = nil
83
86
  Dir.chdir('ext/libcouchbase/build') do |path|
84
- system 'make'
87
+ result = system 'make'
85
88
  end
89
+ raise 'make failed' unless result
86
90
  end
87
91
  end
@@ -95,7 +95,7 @@ module Libcouchbase
95
95
  # check for included document here
96
96
  if @include_docs && row[:docresp]
97
97
  doc = row[:docresp]
98
- raw_string = doc[:value].read_string(doc[:nvalue])
98
+ raw_string = doc[:value].null? ? '' : doc[:value].read_string(doc[:nvalue])
99
99
  resp.value, meta[:format] = @connection.parse_document(raw_string, flags: doc[:itmflags])
100
100
  meta[:flags] = doc[:itmflags]
101
101
  end
@@ -37,8 +37,8 @@ module Libcouchbase
37
37
  @fiber = Fiber.current
38
38
 
39
39
  begin
40
- while not @query_completed do
41
- if @results.length > 0
40
+ while !@query_completed || (cont = @results.length > 0) do
41
+ if cont
42
42
  @resume_results = false
43
43
  yield @results.shift
44
44
  else
@@ -76,8 +76,8 @@ module Libcouchbase
76
76
  @fiber = Fiber.current
77
77
 
78
78
  begin
79
- while not @query_completed do
80
- if index < @results.length
79
+ while !@query_completed || (cont = index < @results.length) do
80
+ if cont
81
81
  @resume_results = false
82
82
  yield @results[index]
83
83
  index += 1
@@ -132,8 +132,8 @@ module Libcouchbase
132
132
 
133
133
  result = []
134
134
  begin
135
- while not @query_completed do
136
- if index < @results.length && index < num
135
+ while !@query_completed || (cont = index < @results.length && index < num) do
136
+ if cont
137
137
  result << @results[index]
138
138
  index += 1
139
139
  else