libcouchbase 0.0.7 → 0.0.8

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 (133) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libcouchbase/.gitignore +2 -0
  3. data/ext/libcouchbase/CMakeLists.txt +5 -7
  4. data/ext/libcouchbase/README.markdown +2 -2
  5. data/ext/libcouchbase/RELEASE_NOTES.markdown +49 -0
  6. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +11 -0
  7. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +2 -0
  8. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +2 -1
  9. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
  10. data/ext/libcouchbase/cmake/config-cmake.h.in +2 -0
  11. data/ext/libcouchbase/cmake/defs.mk.in +0 -2
  12. data/ext/libcouchbase/cmake/source_files.cmake +34 -14
  13. data/ext/libcouchbase/configure.pl +1 -1
  14. data/ext/libcouchbase/contrib/genhash/genhash.h +6 -0
  15. data/ext/libcouchbase/include/libcouchbase/auth.h +10 -0
  16. data/ext/libcouchbase/include/libcouchbase/couchbase.h +10 -0
  17. data/ext/libcouchbase/include/libcouchbase/error.h +7 -0
  18. data/ext/libcouchbase/include/libcouchbase/n1ql.h +13 -1
  19. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +1 -1
  20. data/ext/libcouchbase/include/libcouchbase/subdoc.h +9 -0
  21. data/ext/libcouchbase/include/libcouchbase/views.h +7 -1
  22. data/ext/libcouchbase/include/libcouchbase/visibility.h +1 -0
  23. data/ext/libcouchbase/include/memcached/protocol_binary.h +21 -1132
  24. data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
  25. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +3 -2
  26. data/ext/libcouchbase/src/README.md +0 -2
  27. data/ext/libcouchbase/src/auth-priv.h +1 -0
  28. data/ext/libcouchbase/src/auth.cc +10 -0
  29. data/ext/libcouchbase/src/bootstrap.cc +216 -0
  30. data/ext/libcouchbase/src/bootstrap.h +50 -39
  31. data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +455 -0
  32. data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
  33. data/ext/libcouchbase/src/bucketconfig/bc_http.cc +528 -0
  34. data/ext/libcouchbase/src/bucketconfig/bc_http.h +50 -25
  35. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.cc +115 -0
  36. data/ext/libcouchbase/src/bucketconfig/clconfig.h +407 -386
  37. data/ext/libcouchbase/src/bucketconfig/confmon.cc +378 -0
  38. data/ext/libcouchbase/src/cbft.cc +22 -27
  39. data/ext/libcouchbase/src/cntl.cc +24 -24
  40. data/ext/libcouchbase/src/connspec.cc +30 -1
  41. data/ext/libcouchbase/src/connspec.h +17 -0
  42. data/ext/libcouchbase/src/dns-srv.cc +143 -0
  43. data/ext/libcouchbase/src/{dump.c → dump.cc} +8 -11
  44. data/ext/libcouchbase/src/getconfig.cc +73 -0
  45. data/ext/libcouchbase/src/handler.cc +84 -85
  46. data/ext/libcouchbase/src/hostlist.cc +0 -1
  47. data/ext/libcouchbase/src/hostlist.h +6 -1
  48. data/ext/libcouchbase/src/http/http-priv.h +125 -112
  49. data/ext/libcouchbase/src/http/http.cc +9 -29
  50. data/ext/libcouchbase/src/http/http.h +1 -34
  51. data/ext/libcouchbase/src/http/http_io.cc +22 -26
  52. data/ext/libcouchbase/src/instance.cc +102 -28
  53. data/ext/libcouchbase/src/internal.h +47 -29
  54. data/ext/libcouchbase/src/jsparse/parser.cc +146 -202
  55. data/ext/libcouchbase/src/jsparse/parser.h +91 -98
  56. data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
  57. data/ext/libcouchbase/src/lcbht/lcbht.h +174 -163
  58. data/ext/libcouchbase/src/lcbio/connect.cc +562 -0
  59. data/ext/libcouchbase/src/lcbio/connect.h +9 -2
  60. data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
  61. data/ext/libcouchbase/src/lcbio/iotable.h +61 -16
  62. data/ext/libcouchbase/src/lcbio/ioutils.h +1 -1
  63. data/ext/libcouchbase/src/lcbio/manager.c +2 -2
  64. data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
  65. data/ext/libcouchbase/src/mc/mcreq.h +9 -2
  66. data/ext/libcouchbase/src/mcserver/mcserver.cc +723 -0
  67. data/ext/libcouchbase/src/mcserver/mcserver.h +160 -70
  68. data/ext/libcouchbase/src/mcserver/negotiate.cc +118 -152
  69. data/ext/libcouchbase/src/mcserver/negotiate.h +85 -74
  70. data/ext/libcouchbase/src/mctx-helper.h +51 -0
  71. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +1 -2
  72. data/ext/libcouchbase/src/n1ql/n1ql.cc +56 -32
  73. data/ext/libcouchbase/src/{newconfig.c → newconfig.cc} +42 -70
  74. data/ext/libcouchbase/src/nodeinfo.cc +4 -8
  75. data/ext/libcouchbase/src/operations/{cbflush.c → cbflush.cc} +7 -15
  76. data/ext/libcouchbase/src/operations/{counter.c → counter.cc} +0 -0
  77. data/ext/libcouchbase/src/operations/{durability-cas.c → durability-cas.cc} +92 -76
  78. data/ext/libcouchbase/src/operations/{durability-seqno.c → durability-seqno.cc} +55 -49
  79. data/ext/libcouchbase/src/operations/durability.cc +643 -0
  80. data/ext/libcouchbase/src/operations/durability_internal.h +212 -124
  81. data/ext/libcouchbase/src/operations/{get.c → get.cc} +24 -26
  82. data/ext/libcouchbase/src/operations/{observe-seqno.c → observe-seqno.cc} +5 -8
  83. data/ext/libcouchbase/src/operations/{observe.c → observe.cc} +69 -94
  84. data/ext/libcouchbase/src/operations/{pktfwd.c → pktfwd.cc} +0 -0
  85. data/ext/libcouchbase/src/operations/{remove.c → remove.cc} +0 -0
  86. data/ext/libcouchbase/src/operations/{stats.c → stats.cc} +66 -78
  87. data/ext/libcouchbase/src/operations/{store.c → store.cc} +27 -32
  88. data/ext/libcouchbase/src/operations/subdoc.cc +38 -18
  89. data/ext/libcouchbase/src/operations/{touch.c → touch.cc} +0 -0
  90. data/ext/libcouchbase/src/packetutils.h +200 -137
  91. data/ext/libcouchbase/src/probes.d +1 -1
  92. data/ext/libcouchbase/src/{retrychk.c → retrychk.cc} +3 -4
  93. data/ext/libcouchbase/src/retryq.cc +394 -0
  94. data/ext/libcouchbase/src/retryq.h +116 -104
  95. data/ext/libcouchbase/src/settings.h +2 -1
  96. data/ext/libcouchbase/src/ssl/ssl_c.c +1 -0
  97. data/ext/libcouchbase/src/ssl/ssl_e.c +0 -1
  98. data/ext/libcouchbase/src/trace.h +8 -8
  99. data/ext/libcouchbase/src/vbucket/vbucket.c +0 -1
  100. data/ext/libcouchbase/src/views/{docreq.c → docreq.cc} +48 -54
  101. data/ext/libcouchbase/src/views/docreq.h +24 -30
  102. data/ext/libcouchbase/src/views/viewreq.cc +318 -0
  103. data/ext/libcouchbase/src/views/viewreq.h +43 -13
  104. data/ext/libcouchbase/src/{wait.c → wait.cc} +12 -17
  105. data/ext/libcouchbase/tests/basic/t_connstr.cc +89 -50
  106. data/ext/libcouchbase/tests/basic/t_jsparse.cc +27 -78
  107. data/ext/libcouchbase/tests/basic/t_packet.cc +35 -42
  108. data/ext/libcouchbase/tests/htparse/t_basic.cc +58 -78
  109. data/ext/libcouchbase/tests/iotests/t_confmon.cc +94 -111
  110. data/ext/libcouchbase/tests/iotests/t_sched.cc +1 -2
  111. data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
  112. data/ext/libcouchbase/tools/cbc-pillowfight.cc +1 -1
  113. data/lib/libcouchbase/version.rb +1 -1
  114. metadata +36 -39
  115. data/ext/libcouchbase/include/memcached/vbucket.h +0 -42
  116. data/ext/libcouchbase/src/bootstrap.c +0 -269
  117. data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +0 -495
  118. data/ext/libcouchbase/src/bucketconfig/bc_file.c +0 -347
  119. data/ext/libcouchbase/src/bucketconfig/bc_http.c +0 -630
  120. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +0 -150
  121. data/ext/libcouchbase/src/bucketconfig/confmon.c +0 -474
  122. data/ext/libcouchbase/src/getconfig.c +0 -100
  123. data/ext/libcouchbase/src/lcbht/lcbht.c +0 -282
  124. data/ext/libcouchbase/src/lcbio/connect.c +0 -557
  125. data/ext/libcouchbase/src/mcserver/mcserver.c +0 -784
  126. data/ext/libcouchbase/src/operations/durability.c +0 -668
  127. data/ext/libcouchbase/src/packetutils.c +0 -60
  128. data/ext/libcouchbase/src/retryq.c +0 -424
  129. data/ext/libcouchbase/src/simplestring.c +0 -211
  130. data/ext/libcouchbase/src/simplestring.h +0 -228
  131. data/ext/libcouchbase/src/ssobuf.h +0 -82
  132. data/ext/libcouchbase/src/views/viewreq.c +0 -358
  133. data/ext/libcouchbase/tests/basic/t_string.cc +0 -112
@@ -1,36 +1,66 @@
1
1
  #include <libcouchbase/couchbase.h>
2
2
  #include <libcouchbase/views.h>
3
3
  #include <libcouchbase/pktfwd.h>
4
-
5
4
  #include <jsparse/parser.h>
5
+ #include <string>
6
6
  #include "docreq.h"
7
7
 
8
- struct lcbview_REQUEST_st;
8
+ namespace lcb {
9
+ namespace views {
9
10
 
10
- typedef struct {
11
- lcb_DOCQREQ base;
12
- struct lcbview_REQUEST_st *parent;
11
+ struct ViewRequest;
12
+ struct VRDocRequest : docreq::DocRequest {
13
+ ViewRequest *parent;
13
14
  lcb_IOV key;
14
15
  lcb_IOV value;
15
16
  lcb_IOV geo;
16
- char rowbuf[1];
17
- } lcbview_DOCREQ;
17
+ std::string rowbuf;
18
+ };
19
+
20
+ struct ViewRequest : lcb::jsparse::Parser::Actions {
21
+ ViewRequest(lcb_t, const void*, const lcb_CMDVIEWQUERY*);
22
+ ~ViewRequest();
23
+ void invoke_last(lcb_error_t err);
24
+ void invoke_last() { invoke_last(lasterr); }
25
+ void invoke_row(lcb_RESPVIEWQUERY*);
26
+ void unref() {if(!--refcount){delete this;}}
27
+ void ref() {refcount++;}
28
+ void cancel();
29
+
30
+ /**
31
+ * Perform the actual HTTP request
32
+ * @param cmd User's command
33
+ */
34
+ inline lcb_error_t request_http(const lcb_CMDVIEWQUERY* cmd);
35
+
36
+ bool is_include_docs() const {
37
+ return cmdflags & LCB_CMDVIEWQUERY_F_INCLUDE_DOCS;
38
+ }
39
+ bool is_no_rowparse() const {
40
+ return cmdflags & LCB_CMDVIEWQUERY_F_NOROWPARSE;
41
+ }
42
+ bool is_spatial() const {
43
+ return cmdflags & LCB_CMDVIEWQUERY_F_SPATIAL;
44
+ }
45
+
46
+ void JSPARSE_on_row(const lcb::jsparse::Row&);
47
+ void JSPARSE_on_error(const std::string&);
48
+ void JSPARSE_on_complete(const std::string&);
18
49
 
19
- struct lcbview_REQUEST_st {
20
50
  /** Current HTTP response to provide in callbacks */
21
51
  const lcb_RESPHTTP *cur_htresp;
22
52
  /** HTTP request object, in case we need to cancel prematurely */
23
53
  struct lcb_http_request_st *htreq;
24
- lcbjsp_PARSER *parser;
54
+ lcb::jsparse::Parser *parser;
25
55
  const void *cookie;
26
- lcb_DOCQUEUE *docq;
56
+ docreq::Queue *docq;
27
57
  lcb_VIEWQUERYCALLBACK callback;
28
58
  lcb_t instance;
29
59
 
30
60
  unsigned refcount;
31
- unsigned include_docs;
32
- unsigned no_parse_rows;
61
+ uint32_t cmdflags;
33
62
  lcb_error_t lasterr;
34
63
  };
35
64
 
36
- typedef struct lcbview_REQUEST_st lcbview_REQUEST;
65
+ }
66
+ }
@@ -18,44 +18,39 @@
18
18
  #include <lcbio/iotable.h>
19
19
  #include <lcbio/timer-ng.h>
20
20
 
21
- static int
21
+ static bool
22
22
  has_pending(lcb_t instance)
23
23
  {
24
- unsigned ii;
25
24
 
26
- if (!lcb_retryq_empty(instance->retryq)) {
27
- return 1;
25
+ if (!instance->retryq->empty()) {
26
+ return true;
28
27
  }
29
28
 
30
29
  if (lcb_aspend_pending(&instance->pendops)) {
31
- return 1;
30
+ return true;
32
31
  }
33
32
 
34
- for (ii = 0; ii < LCBT_NSERVERS(instance); ii++) {
35
- mc_SERVER *ss = LCBT_GET_SERVER(instance, ii);
36
- if (mcserver_has_pending(ss)) {
37
- return 1;
33
+ for (size_t ii = 0; ii < LCBT_NSERVERS(instance); ii++) {
34
+ if (instance->get_server(ii)->has_pending()) {
35
+ return true;
38
36
  }
39
37
  }
40
- return 0;
38
+ return false;
41
39
  }
42
40
 
43
41
  static void
44
42
  maybe_reset_timeouts(lcb_t instance)
45
43
  {
46
- size_t ii;
47
- lcb_U64 now;
48
44
 
49
45
  if (!LCBT_SETTING(instance, readj_ts_wait)) {
50
46
  return;
51
47
  }
52
48
 
53
- now = lcb_nstime();
54
- for (ii = 0; ii < LCBT_NSERVERS(instance); ++ii) {
55
- mc_SERVER *ss = LCBT_GET_SERVER(instance, ii);
56
- mcreq_reset_timeouts(&ss->pipeline, now);
49
+ uint64_t now = lcb_nstime();
50
+ for (size_t ii = 0; ii < LCBT_NSERVERS(instance); ++ii) {
51
+ mcreq_reset_timeouts(instance->get_server(ii), now);
57
52
  }
58
- lcb_retryq_reset_timeouts(instance->retryq, now);
53
+ instance->retryq->reset_timeouts(now);
59
54
  }
60
55
 
61
56
  void
@@ -2,14 +2,6 @@
2
2
  #include "connspec.h"
3
3
  using namespace lcb;
4
4
 
5
- static lcb_error_t lcb_connspec_parse(const char *connstr, Connspec *spec, const char **errmsg)
6
- {
7
- return spec->parse(connstr, errmsg);
8
- }
9
- static lcb_error_t lcb_connspec_convert(Connspec *spec, const lcb_create_st *cropts)
10
- {
11
- return spec->load(*cropts);
12
- }
13
5
  static size_t countHosts(const Connspec *spec) {
14
6
  return spec->hosts().size();
15
7
  }
@@ -110,7 +102,7 @@ TEST_F(ConnstrTest, testParseBasic)
110
102
  ASSERT_EQ(LCB_CONFIG_HTTP_PORT, params.default_port());
111
103
 
112
104
  reinit();
113
- err = lcb_connspec_parse("1.2.3.4:999", &params, &errmsg);
105
+ err = params.parse("1.2.3.4:999", &errmsg);
114
106
  ASSERT_EQ(1, countHosts(&params));
115
107
  tmphost = findHost(&params, "1.2.3.4");
116
108
  ASSERT_FALSE(tmphost == NULL);
@@ -122,7 +114,7 @@ TEST_F(ConnstrTest, testParseBasic)
122
114
  TEST_F(ConnstrTest, testParseHosts)
123
115
  {
124
116
  lcb_error_t err;
125
- err = lcb_connspec_parse("couchbase://foo.com,bar.com,baz.com", &params, &errmsg);
117
+ err = params.parse("couchbase://foo.com,bar.com,baz.com", &errmsg);
126
118
  ASSERT_EQ(3, countHosts(&params));
127
119
  ASSERT_FALSE(NULL == findHost(&params, "foo.com"));
128
120
  ASSERT_FALSE(NULL == findHost(&params, "bar.com"));
@@ -130,7 +122,7 @@ TEST_F(ConnstrTest, testParseHosts)
130
122
 
131
123
  // Parse with 'legacy' format
132
124
  reinit();
133
- err = lcb_connspec_parse("couchbase://foo.com:8091", &params, &errmsg);
125
+ err = params.parse("couchbase://foo.com:8091", &errmsg);
134
126
  ASSERT_EQ(LCB_SUCCESS, err);
135
127
  const Spechost *dh = findHost(&params, "foo.com");
136
128
  ASSERT_FALSE(NULL == dh);
@@ -141,14 +133,14 @@ TEST_F(ConnstrTest, testParseHosts)
141
133
 
142
134
  // parse with invalid port, without specifying protocol
143
135
  reinit();
144
- err = lcb_connspec_parse("couchbase://foo.com:4444", &params, &errmsg);
136
+ err = params.parse("couchbase://foo.com:4444", &errmsg);
145
137
  ASSERT_EQ(LCB_SUCCESS, err);
146
138
  dh = findHost(&params, "foo.com");
147
139
  ASSERT_EQ(4444, dh->port);
148
140
  ASSERT_TRUE(dh->isMCD());
149
141
 
150
142
  reinit();
151
- err = lcb_connspec_parse("couchbases://foo.com:4444", &params, &errmsg);
143
+ err = params.parse("couchbases://foo.com:4444", &errmsg);
152
144
  ASSERT_EQ(LCB_SUCCESS, err);
153
145
  dh = findHost(&params, "foo.com");
154
146
  ASSERT_EQ(LCB_SSL_ENABLED, params.sslopts());
@@ -157,7 +149,7 @@ TEST_F(ConnstrTest, testParseHosts)
157
149
 
158
150
  // Parse with recognized format
159
151
  reinit();
160
- err = lcb_connspec_parse("couchbase://foo.com:4444=mcd", &params, &errmsg);
152
+ err = params.parse("couchbase://foo.com:4444=mcd", &errmsg);
161
153
  ASSERT_EQ(LCB_SUCCESS, err);
162
154
  dh = findHost(&params, "foo.com");
163
155
  ASSERT_EQ("foo.com", dh->hostname);
@@ -166,8 +158,7 @@ TEST_F(ConnstrTest, testParseHosts)
166
158
 
167
159
  //Parse multiple hosts with ports
168
160
  reinit();
169
- err = lcb_connspec_parse("couchbase://foo.com:4444=mcd,bar.com:5555=mcd",
170
- &params, &errmsg);
161
+ err = params.parse("couchbase://foo.com:4444=mcd,bar.com:5555=mcd", &errmsg);
171
162
  ASSERT_EQ(LCB_SUCCESS, err);
172
163
 
173
164
  dh = findHost(&params, "foo.com");
@@ -183,7 +174,7 @@ TEST_F(ConnstrTest, testParseHosts)
183
174
  ASSERT_TRUE(dh->isMCD());
184
175
 
185
176
  reinit();
186
- err = lcb_connspec_parse("couchbase://foo.com,bar.com:4444", &params, &errmsg);
177
+ err = params.parse("couchbase://foo.com,bar.com:4444", &errmsg);
187
178
  ASSERT_EQ(LCB_SUCCESS, err);
188
179
  dh = findHost(&params, "bar.com");
189
180
  ASSERT_EQ(4444, dh->port);
@@ -192,7 +183,7 @@ TEST_F(ConnstrTest, testParseHosts)
192
183
  ASSERT_TRUE(dh->isTypeless());
193
184
 
194
185
  reinit();
195
- err = lcb_connspec_parse("couchbase://foo.com;bar.com;baz.com", &params, &errmsg);
186
+ err = params.parse("couchbase://foo.com;bar.com;baz.com", &errmsg);
196
187
  ASSERT_EQ(LCB_SUCCESS, err) << "Can parse old-style semicolons";
197
188
  ASSERT_EQ(3, countHosts(&params));
198
189
  ASSERT_FALSE(NULL == findHost(&params, "foo.com"));
@@ -203,27 +194,27 @@ TEST_F(ConnstrTest, testParseHosts)
203
194
  TEST_F(ConnstrTest, testParseBucket)
204
195
  {
205
196
  lcb_error_t err;
206
- err = lcb_connspec_parse("couchbase://foo.com/user", &params, &errmsg);
197
+ err = params.parse("couchbase://foo.com/user", &errmsg);
207
198
  ASSERT_EQ(LCB_SUCCESS, err);
208
199
  ASSERT_EQ("user", params.bucket()) << "Basic bucket parse";
209
200
 
210
201
  reinit();
211
- err = lcb_connspec_parse("couchbase://foo.com/user/", &params, &errmsg);
202
+ err = params.parse("couchbase://foo.com/user/", &errmsg);
212
203
  ASSERT_EQ(LCB_SUCCESS, err) << "Bucket can have a slash";
213
204
  // We can have a bucket using a slash
214
205
 
215
206
  reinit();
216
- err = lcb_connspec_parse("couchbase:///default", &params, &errmsg);
207
+ err = params.parse("couchbase:///default", &errmsg);
217
208
  ASSERT_EQ(LCB_SUCCESS, err) << "Bucket without host OK";
218
209
  ASSERT_EQ("default", params.bucket());
219
210
 
220
211
  reinit();
221
- err = lcb_connspec_parse("couchbase:///default?", &params, &errmsg);
212
+ err = params.parse("couchbase:///default?", &errmsg);
222
213
  ASSERT_EQ(LCB_SUCCESS, err);
223
214
  ASSERT_EQ("default", params.bucket());
224
215
 
225
216
  reinit();
226
- err = lcb_connspec_parse("couchbase:///%2FUsers%2F?", &params, &errmsg);
217
+ err = params.parse("couchbase:///%2FUsers%2F?", &errmsg);
227
218
  ASSERT_EQ(LCB_SUCCESS, err);
228
219
  ASSERT_EQ("/Users/", params.bucket());
229
220
  }
@@ -231,7 +222,7 @@ TEST_F(ConnstrTest, testParseBucket)
231
222
  TEST_F(ConnstrTest, testOptionsPassthrough)
232
223
  {
233
224
  lcb_error_t err;
234
- err = lcb_connspec_parse("couchbase://?foo=bar", &params, &errmsg);
225
+ err = params.parse("couchbase://?foo=bar", &errmsg);
235
226
  ASSERT_EQ(LCB_SUCCESS, err) << "Options only";
236
227
  ASSERT_FALSE(params.options().empty());
237
228
  ASSERT_NE(0, params.options().size());
@@ -241,19 +232,19 @@ TEST_F(ConnstrTest, testOptionsPassthrough)
241
232
  ASSERT_EQ("bar", op.value);
242
233
 
243
234
  reinit();
244
- err = lcb_connspec_parse("couchbase://?foo=bar", &params, &errmsg);
235
+ err = params.parse("couchbase://?foo=bar", &errmsg);
245
236
  ASSERT_EQ(LCB_SUCCESS, err);
246
237
  ASSERT_TRUE(findOption(&params, "foo", op));
247
238
  ASSERT_EQ("bar", op.value);
248
239
 
249
240
  reinit();
250
- err = lcb_connspec_parse("couchbase://?foo", &params, &errmsg);
241
+ err = params.parse("couchbase://?foo", &errmsg);
251
242
  ASSERT_NE(LCB_SUCCESS, err) << "Option without value";
252
243
 
253
244
 
254
245
  // Multiple options
255
246
  reinit();
256
- err = lcb_connspec_parse("couchbase://?foo=fooval&bar=barval", &params, &errmsg);
247
+ err = params.parse("couchbase://?foo=fooval&bar=barval", &errmsg);
257
248
  ASSERT_EQ(LCB_SUCCESS, err);
258
249
  ASSERT_TRUE(findOption(&params, "foo", op));
259
250
  ASSERT_EQ("fooval", op.value);
@@ -262,20 +253,18 @@ TEST_F(ConnstrTest, testOptionsPassthrough)
262
253
  ASSERT_EQ("barval", op.value);
263
254
 
264
255
  reinit();
265
- err = lcb_connspec_parse("couchbase:///protected?ssl=on&compression=off",
266
- &params, &errmsg);
256
+ err = params.parse("couchbase:///protected?ssl=on&compression=off", &errmsg);
267
257
  ASSERT_EQ(LCB_SUCCESS, err) << "Ok with bucket and no hosts";
268
258
  ASSERT_EQ(1, countHosts(&params));
269
259
  ASSERT_FALSE(NULL == findHost(&params, "localhost"));
270
260
  ASSERT_TRUE(findOption(&params, "compression", op));
271
261
 
272
262
  reinit();
273
- err = lcb_connspec_parse("couchbase://?foo=foo&bar=bar&", &params, &errmsg);
263
+ err = params.parse("couchbase://?foo=foo&bar=bar&", &errmsg);
274
264
  ASSERT_EQ(LCB_SUCCESS, err) << "Ok with trailing '&'";
275
265
 
276
266
  reinit();
277
- err = lcb_connspec_parse("couchbase://?foo=foo&bootstrap_on=all&bar=bar",
278
- &params, &errmsg);
267
+ err = params.parse("couchbase://?foo=foo&bootstrap_on=all&bar=bar", &errmsg);
279
268
  ASSERT_EQ(LCB_SUCCESS, err) << "Ok with non-passthrough option";
280
269
  ASSERT_TRUE(findOption(&params, "foo", op));
281
270
  ASSERT_TRUE(findOption(&params, "bar", op));
@@ -285,32 +274,32 @@ TEST_F(ConnstrTest, testOptionsPassthrough)
285
274
  TEST_F(ConnstrTest, testRecognizedOptions)
286
275
  {
287
276
  lcb_error_t err;
288
- err = lcb_connspec_parse("couchbases://", &params, &errmsg);
277
+ err = params.parse("couchbases://", &errmsg);
289
278
  ASSERT_EQ(LCB_SUCCESS, err);
290
279
  ASSERT_EQ(LCB_SSL_ENABLED, params.sslopts());
291
280
 
292
281
  reinit();
293
- err = lcb_connspec_parse("couchbase://?ssl=on", &params, &errmsg);
282
+ err = params.parse("couchbase://?ssl=on", &errmsg);
294
283
  ASSERT_EQ(LCB_SUCCESS, err);
295
284
  ASSERT_EQ(LCB_SSL_ENABLED, params.sslopts());
296
285
 
297
286
  reinit();
298
- err = lcb_connspec_parse("couchbases://?ssl=no_verify", &params, &errmsg);
287
+ err = params.parse("couchbases://?ssl=no_verify", &errmsg);
299
288
  ASSERT_EQ(LCB_SUCCESS, err);
300
289
  ASSERT_EQ(LCB_SSL_ENABLED|LCB_SSL_NOVERIFY, params.sslopts());
301
290
 
302
291
  reinit();
303
- err = lcb_connspec_parse("couchbases://?ssl=off", &params, &errmsg);
292
+ err = params.parse("couchbases://?ssl=off", &errmsg);
304
293
  ASSERT_NE(LCB_SUCCESS, err);
305
294
 
306
295
  // Loglevel
307
296
  reinit();
308
- err = lcb_connspec_parse("couchbase://?console_log_level=5", &params, &errmsg);
297
+ err = params.parse("couchbase://?console_log_level=5", &errmsg);
309
298
  ASSERT_EQ(LCB_SUCCESS, err);
310
299
  ASSERT_EQ(5, params.loglevel());
311
300
 
312
301
  reinit();
313
- err = lcb_connspec_parse("couchbase://?console_log_level=gah", &params, &errmsg);
302
+ err = params.parse("couchbase://?console_log_level=gah", &errmsg);
314
303
  ASSERT_NE(LCB_SUCCESS, err);
315
304
 
316
305
  }
@@ -318,30 +307,30 @@ TEST_F(ConnstrTest, testRecognizedOptions)
318
307
  TEST_F(ConnstrTest, testTransportOptions)
319
308
  {
320
309
  lcb_error_t err;
321
- err = lcb_connspec_parse("couchbase://", &params, &errmsg);
310
+ err = params.parse("couchbase://", &errmsg);
322
311
  ASSERT_EQ(LCB_SUCCESS, err);
323
312
  ASSERT_FALSE(params.is_bs_udef());
324
313
 
325
314
  reinit();
326
- err = lcb_connspec_parse("couchbase://?bootstrap_on=cccp", &params, &errmsg);
315
+ err = params.parse("couchbase://?bootstrap_on=cccp", &errmsg);
327
316
  ASSERT_EQ(LCB_SUCCESS, err) << "bootstrap_on=cccp";
328
317
  ASSERT_TRUE(params.has_bsmode(LCB_CONFIG_TRANSPORT_CCCP));
329
318
  ASSERT_FALSE(params.has_bsmode(LCB_CONFIG_TRANSPORT_HTTP));
330
319
 
331
320
  reinit();
332
- err = lcb_connspec_parse("couchbase://?bootstrap_on=http", &params, &errmsg);
321
+ err = params.parse("couchbase://?bootstrap_on=http", &errmsg);
333
322
  ASSERT_EQ(LCB_SUCCESS, err) << "bootstrap_on=http";
334
323
  ASSERT_TRUE(params.has_bsmode(LCB_CONFIG_TRANSPORT_HTTP));
335
324
  ASSERT_FALSE(params.has_bsmode(LCB_CONFIG_TRANSPORT_CCCP));
336
325
 
337
326
  reinit();
338
- err = lcb_connspec_parse("couchbase://?bootstrap_on=all", &params, &errmsg);
327
+ err = params.parse("couchbase://?bootstrap_on=all", &errmsg);
339
328
  ASSERT_EQ(LCB_SUCCESS, err) << "bootstrap_on=all";
340
329
  ASSERT_TRUE(params.has_bsmode(LCB_CONFIG_TRANSPORT_CCCP));
341
330
  ASSERT_TRUE(params.has_bsmode(LCB_CONFIG_TRANSPORT_HTTP));
342
331
 
343
332
  reinit();
344
- err = lcb_connspec_parse("couchbase://?bootstrap_on=bleh", &params, &errmsg);
333
+ err = params.parse("couchbase://?bootstrap_on=bleh", &errmsg);
345
334
  ASSERT_NE(LCB_SUCCESS, err) << "Error on bad bootstrap_on value";
346
335
  }
347
336
 
@@ -355,7 +344,7 @@ TEST_F(ConnstrTest, testCompatConversion)
355
344
  cropts.v.v0.host = "foo.com;bar.com;baz.com";
356
345
  cropts.v.v0.passwd = "secret";
357
346
 
358
- err = lcb_connspec_convert(&params, &cropts);
347
+ err = params.load(cropts);
359
348
  ASSERT_EQ(LCB_SUCCESS, err);
360
349
  ASSERT_FALSE(NULL == findHost(&params, "foo.com"));
361
350
  ASSERT_FALSE(NULL == findHost(&params, "bar.com"));
@@ -372,7 +361,7 @@ TEST_F(ConnstrTest, testCompatConversion)
372
361
  cropts.version = 2;
373
362
  cropts.v.v2.host = "foo.com:9030;bar.com:9040;baz.com:9050";
374
363
  cropts.v.v2.mchosts = "foo.com:7030;bar.com:7040;baz.com:7050";
375
- err = lcb_connspec_convert(&params, &cropts);
364
+ err = params.load(cropts);
376
365
  ASSERT_EQ(LCB_SUCCESS, err);
377
366
  ASSERT_EQ(6, countHosts(&params));
378
367
 
@@ -382,7 +371,7 @@ TEST_F(ConnstrTest, testCompatConversion)
382
371
  cropts.version = 3;
383
372
  cropts.v.v3.passwd = "secret";
384
373
  cropts.v.v3.connstr = "couchbase:///fluffle?password=bleh";
385
- err = lcb_connspec_convert(&params, &cropts);
374
+ err = params.load(cropts);
386
375
  ASSERT_EQ(LCB_SUCCESS, err);
387
376
  ASSERT_EQ("fluffle", params.bucket());
388
377
  ASSERT_EQ(cropts.v.v3.passwd, params.password());
@@ -393,12 +382,62 @@ TEST_F(ConnstrTest, testCertificateWithoutSSL)
393
382
  // Ensure we get an invalid input error for certificate paths without
394
383
  // couchbases://
395
384
  lcb_error_t err;
396
- err = lcb_connspec_parse(
397
- "couchbase://1.2.3.4/default?certpath=/foo/bar/baz", &params, &errmsg);
385
+ err = params.parse(
386
+ "couchbase://1.2.3.4/default?certpath=/foo/bar/baz", &errmsg);
398
387
  ASSERT_NE(LCB_SUCCESS, err);
399
388
 
400
389
  reinit();
401
- err = lcb_connspec_parse(
402
- "couchbases://1.2.3.4/default?certpath=/foo/bar/baz", &params, &errmsg);
390
+ err = params.parse(
391
+ "couchbases://1.2.3.4/default?certpath=/foo/bar/baz", &errmsg);
403
392
  ASSERT_EQ(LCB_SUCCESS, err);
404
393
  }
394
+
395
+ TEST_F(ConnstrTest, testDnsSrvExplicit)
396
+ {
397
+ // Test various things relating to DNS SRV
398
+ lcb_error_t err;
399
+ err = params.parse("couchbase+dnssrv://1.1.1.1", &errmsg);
400
+ EXPECT_EQ(LCB_SUCCESS, err);
401
+ EXPECT_TRUE(params.can_dnssrv());
402
+ EXPECT_TRUE(params.is_explicit_dnssrv());
403
+
404
+ reinit();
405
+ err = params.parse("couchbase+dnssrv://1.1.1.1,2.2.2.2", &errmsg);
406
+ EXPECT_NE(LCB_SUCCESS, err);
407
+
408
+ reinit();
409
+ err = params.parse("couchbases+dnssrv://1.1.1.1", &errmsg);
410
+ EXPECT_EQ(LCB_SUCCESS, err);
411
+ EXPECT_NE(0, params.sslopts());
412
+ EXPECT_TRUE(params.can_dnssrv());
413
+ EXPECT_TRUE(params.is_explicit_dnssrv());
414
+ }
415
+
416
+ TEST_F(ConnstrTest, testDnsSrvImplicit)
417
+ {
418
+ lcb_error_t err;
419
+ EXPECT_EQ(LCB_SUCCESS, params.parse("couchbase://"));
420
+ EXPECT_FALSE(params.can_dnssrv());
421
+ EXPECT_FALSE(params.is_explicit_dnssrv());
422
+
423
+ reinit();
424
+ EXPECT_EQ(LCB_SUCCESS, params.parse("couchbase://1.1.1.1"));
425
+ EXPECT_TRUE(params.can_dnssrv());
426
+ EXPECT_FALSE(params.is_explicit_dnssrv());
427
+
428
+ reinit();
429
+ EXPECT_EQ(LCB_SUCCESS, params.parse("couchbase://1.1.1.1,2.2.2.2"));
430
+ EXPECT_FALSE(params.can_dnssrv()) << "No implicit SRV on multiple hosts";
431
+
432
+ reinit();
433
+ EXPECT_EQ(LCB_SUCCESS, params.parse("couchbase://1.1.1.1:666"));
434
+ EXPECT_FALSE(params.can_dnssrv());
435
+
436
+ reinit();
437
+ EXPECT_EQ(LCB_SUCCESS, params.parse("couchbase://1.1.1.1:11210"));
438
+ EXPECT_TRUE(params.can_dnssrv());
439
+
440
+ reinit();
441
+ EXPECT_EQ(LCB_SUCCESS, params.parse("couchbases://1.1.1.1"));
442
+ EXPECT_TRUE(params.can_dnssrv());
443
+ }