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
@@ -198,7 +198,7 @@ HANDLER(get_kvb) {
198
198
 
199
199
 
200
200
  HANDLER(conninfo) {
201
- lcbio_SOCKET *sock;
201
+ const lcbio_SOCKET *sock;
202
202
  lcb_cntl_server_st *si = reinterpret_cast<lcb_cntl_server_st*>(arg);
203
203
  const lcb_host_t *host;
204
204
 
@@ -206,25 +206,25 @@ HANDLER(conninfo) {
206
206
  if (si->version < 0 || si->version > 1) { return LCB_ECTL_BADARG; }
207
207
 
208
208
  if (cmd == LCB_CNTL_MEMDNODE_INFO) {
209
- mc_SERVER *server;
209
+ lcb::Server *server;
210
210
  int ix = si->v.v0.index;
211
211
 
212
212
  if (ix < 0 || ix > (int)LCBT_NSERVERS(instance)) {
213
213
  return LCB_ECTL_BADARG;
214
214
  }
215
- server = LCBT_GET_SERVER(instance, ix);
215
+ server = instance->get_server(ix);
216
216
  if (!server) {
217
217
  return LCB_NETWORK_ERROR;
218
218
  }
219
219
  sock = server->connctx->sock;
220
220
  if (si->version == 1 && sock) {
221
- mc_pSESSINFO sasl = mc_sess_get(server->connctx->sock);
222
- if (sasl) {
223
- si->v.v1.sasl_mech = mc_sess_get_saslmech(sasl);
221
+ lcb::SessionInfo *info = lcb::SessionInfo::get(server->connctx->sock);
222
+ if (info) {
223
+ si->v.v1.sasl_mech = info->get_mech().c_str();
224
224
  }
225
225
  }
226
226
  } else if (cmd == LCB_CNTL_CONFIGNODE_INFO) {
227
- sock = lcb_confmon_get_rest_connection(instance->confmon);
227
+ sock = lcb::clconfig::http_get_conn(instance->confmon);
228
228
  } else {
229
229
  return LCB_ECTL_BADARG;
230
230
  }
@@ -246,7 +246,8 @@ HANDLER(conninfo) {
246
246
 
247
247
  HANDLER(config_cache_loaded_handler) {
248
248
  if (mode != LCB_CNTL_GET) { return LCB_ECTL_UNSUPPMODE; }
249
- *(int *)arg = instance->cur_configinfo && instance->cur_configinfo->origin == LCB_CLCONFIG_FILE;
249
+ *(int *)arg = instance->cur_configinfo &&
250
+ instance->cur_configinfo->get_origin() == lcb::clconfig::CLCONFIG_FILE;
250
251
  (void)cmd; return LCB_SUCCESS;
251
252
  }
252
253
 
@@ -282,9 +283,9 @@ HANDLER(config_transport) {
282
283
  if (mode == LCB_CNTL_SET) { return LCB_ECTL_UNSUPPMODE; }
283
284
  if (!instance->cur_configinfo) { return LCB_CLIENT_ETMPFAIL; }
284
285
 
285
- switch (instance->cur_configinfo->origin) {
286
- case LCB_CLCONFIG_HTTP: *val = LCB_CONFIG_TRANSPORT_HTTP; break;
287
- case LCB_CLCONFIG_CCCP: *val = LCB_CONFIG_TRANSPORT_CCCP; break;
286
+ switch (instance->cur_configinfo->get_origin()) {
287
+ case lcb::clconfig::CLCONFIG_HTTP: *val = LCB_CONFIG_TRANSPORT_HTTP; break;
288
+ case lcb::clconfig::CLCONFIG_CCCP: *val = LCB_CONFIG_TRANSPORT_CCCP; break;
288
289
  default: return LCB_CLIENT_ETMPFAIL;
289
290
  }
290
291
  (void)cmd; return LCB_SUCCESS;
@@ -292,7 +293,7 @@ HANDLER(config_transport) {
292
293
 
293
294
  HANDLER(config_nodes) {
294
295
  const char *node_strs = reinterpret_cast<const char*>(arg);
295
- clconfig_provider *target;
296
+ lcb::clconfig::Provider *target;
296
297
  lcb::Hostlist hostlist;
297
298
  lcb_error_t err;
298
299
 
@@ -309,13 +310,13 @@ HANDLER(config_nodes) {
309
310
  }
310
311
 
311
312
  if (cmd == LCB_CNTL_CONFIG_HTTP_NODES) {
312
- target = lcb_confmon_get_provider(instance->confmon, LCB_CLCONFIG_HTTP);
313
- lcb_clconfig_http_set_nodes(target, &hostlist);
313
+ target = instance->confmon->get_provider(lcb::clconfig::CLCONFIG_HTTP);
314
314
  } else {
315
- target = lcb_confmon_get_provider(instance->confmon, LCB_CLCONFIG_CCCP);
316
- lcb_clconfig_cccp_set_nodes(target, &hostlist);
315
+ target = instance->confmon->get_provider(lcb::clconfig::CLCONFIG_CCCP);
317
316
  }
318
317
 
318
+ target->configure_nodes(hostlist);
319
+
319
320
  return LCB_SUCCESS;
320
321
  }
321
322
 
@@ -327,22 +328,22 @@ HANDLER(init_providers) {
327
328
  }
328
329
 
329
330
  HANDLER(config_cache_handler) {
330
- clconfig_provider *provider;
331
+ using namespace lcb::clconfig;
332
+ Provider *provider;
331
333
 
332
- provider = lcb_confmon_get_provider(instance->confmon, LCB_CLCONFIG_FILE);
334
+ provider = instance->confmon->get_provider(lcb::clconfig::CLCONFIG_FILE);
333
335
  if (mode == LCB_CNTL_SET) {
334
- int rv;
335
- rv = lcb_clconfig_file_set_filename(provider,
336
+ bool rv = file_set_filename(provider,
336
337
  reinterpret_cast<const char*>(arg),
337
338
  cmd == LCB_CNTL_CONFIGCACHE_RO);
338
339
 
339
- if (rv == 0) {
340
+ if (rv) {
340
341
  instance->settings->bc_http_stream_time = LCB_MS2US(10000);
341
342
  return LCB_SUCCESS;
342
343
  }
343
344
  return LCB_ERROR;
344
345
  } else {
345
- *(const char **)arg = lcb_clconfig_file_get_filename(provider);
346
+ *(const char **)arg = file_get_filename(provider);
346
347
  return LCB_SUCCESS;
347
348
  }
348
349
  }
@@ -470,8 +471,7 @@ HANDLER(mutation_tokens_supported_handler) {
470
471
  *(int *)arg = 0;
471
472
 
472
473
  for (ii = 0; ii < LCBT_NSERVERS(instance); ii++) {
473
- mc_SERVER *s = LCBT_GET_SERVER(instance, ii);
474
- if (s->mutation_tokens) {
474
+ if (instance->get_server(ii)->supports_mutation_tokens()) {
475
475
  *(int *)arg = 1;
476
476
  break;
477
477
  }
@@ -31,6 +31,8 @@
31
31
  #define F_HASUSER (1<<2)
32
32
  #define F_SSLSCHEME (1<<3)
33
33
  #define F_FILEONLY (1<<4)
34
+ #define F_DNSSRV (1<<5)
35
+ #define F_DNSSRV_EXPLICIT ( (1<<6) |F_DNSSRV)
34
36
 
35
37
  using namespace lcb;
36
38
 
@@ -104,6 +106,14 @@ Connspec::parse_hosts(const char *hostbegin,
104
106
  port = scratch.substr(colonpos + 1);
105
107
  }
106
108
 
109
+ if (m_flags & F_DNSSRV_EXPLICIT) {
110
+ if (!m_hosts.empty()) {
111
+ SET_ERROR("Only a single host is allowed with DNS SRV");
112
+ } else if (!port.empty()) {
113
+ SET_ERROR("Port cannot be specified with DNS SRV");
114
+ }
115
+ }
116
+
107
117
  m_hosts.resize(m_hosts.size() + 1);
108
118
  Spechost *dh = &m_hosts.back();
109
119
  dh->hostname = scratch.substr(0, hostlen);
@@ -288,10 +298,17 @@ Connspec::parse(const char *connstr_, const char **errmsg)
288
298
  m_implicit_port = 0;
289
299
  } else if (SCHEME_MATCHES(LCB_SPECSCHEME_MCCOMPAT)) {
290
300
  m_implicit_port = LCB_CONFIG_MCCOMPAT_PORT;
301
+ } else if (SCHEME_MATCHES(LCB_SPECSCHEME_SRV)) {
302
+ m_implicit_port = LCB_CONFIG_MCD_PORT;
303
+ m_flags |= F_DNSSRV_EXPLICIT;
304
+ } else if (SCHEME_MATCHES(LCB_SPECSCHEME_SRV_SSL)) {
305
+ m_implicit_port = LCB_CONFIG_MCD_SSL_PORT;
306
+ m_sslopts |= LCB_SSL_ENABLED;
307
+ m_flags |= F_SSLSCHEME | F_DNSSRV_EXPLICIT;
291
308
  } else {
292
309
  /* If we don't have a scheme at all: */
293
310
  if (strstr(connstr_, "://")) {
294
- SET_ERROR("String must begin with ''couchbase://, 'couchbases://', or 'http://'");
311
+ SET_ERROR("String must begin with 'couchbase://, 'couchbases://', or 'http://'");
295
312
  } else {
296
313
  found_scheme = "";
297
314
  m_implicit_port = LCB_CONFIG_HTTP_PORT;
@@ -345,6 +362,8 @@ Connspec::parse(const char *connstr_, const char **errmsg)
345
362
  if (m_hosts.empty()) {
346
363
  m_hosts.resize(m_hosts.size()+1);
347
364
  m_hosts.back().hostname = "localhost";
365
+ } else if (m_hosts.size() == 1 && m_hosts[0].isTypeless()) {
366
+ m_flags |= F_DNSSRV;
348
367
  }
349
368
 
350
369
  if (options_ != NULL) {
@@ -460,3 +479,13 @@ Connspec::load(const lcb_create_st& cropts)
460
479
  GT_DONE:
461
480
  return err;
462
481
  }
482
+
483
+ bool
484
+ Connspec::can_dnssrv() const {
485
+ return m_flags & F_DNSSRV;
486
+ }
487
+
488
+ bool
489
+ Connspec::is_explicit_dnssrv() const {
490
+ return (m_flags & F_DNSSRV_EXPLICIT) == F_DNSSRV_EXPLICIT;
491
+ }
@@ -73,6 +73,18 @@ public:
73
73
  bool is_bs_http() const { return has_bsmode(LCB_CONFIG_TRANSPORT_HTTP); }
74
74
  bool is_bs_cccp() const { return has_bsmode(LCB_CONFIG_TRANSPORT_CCCP); }
75
75
  bool is_bs_file() const { return m_flags & LCB_CONNSPEC_F_FILEONLY; }
76
+
77
+ /**
78
+ * Whether a DNS SRV lookup can be performed on this connection string.
79
+ * @return true if a DNS SRV lookup is possible, or false if there is
80
+ * a parameter or format of the connection string preventing a lookup
81
+ */
82
+ bool can_dnssrv() const;
83
+
84
+ /**
85
+ * Whether the explicit `couchbase{s}+dnssrv` internal scheme is used
86
+ */
87
+ bool is_explicit_dnssrv() const;
76
88
  uint16_t default_port() const { return m_implicit_port; }
77
89
  const std::vector<Spechost>& hosts() const { return m_hosts; }
78
90
  const std::string& bucket() const { return m_bucket; }
@@ -83,6 +95,8 @@ public:
83
95
  const Options& options() const { return m_ctlopts; }
84
96
  unsigned loglevel() const { return m_loglevel; }
85
97
  const std::string& connstr() const { return m_connstr; }
98
+ void clear_hosts() { m_hosts.clear(); }
99
+ void add_host(const Spechost& host) { m_hosts.push_back(host); }
86
100
  private:
87
101
  Options m_ctlopts;
88
102
  std::string m_bucket;
@@ -110,7 +124,10 @@ private:
110
124
  #define LCB_SPECSCHEME_HTTP "http://"
111
125
  #define LCB_SPECSCHEME_HTTP_SSL "https-internal://"
112
126
  #define LCB_SPECSCHEME_MCCOMPAT "memcached://"
127
+ #define LCB_SPECSCHEME_SRV "couchbase+dnssrv://"
128
+ #define LCB_SPECSCHEME_SRV_SSL "couchbases+dnssrv://"
113
129
  } // namespace
130
+
114
131
  #endif
115
132
 
116
133
  #ifdef _MSC_VER
@@ -0,0 +1,143 @@
1
+ #include <libcouchbase/couchbase.h>
2
+
3
+ #include "config.h"
4
+ #include "hostlist.h"
5
+
6
+ #ifndef _WIN32
7
+ #include <string>
8
+
9
+ #ifdef HAVE_ARPA_NAMESER_H
10
+ #include <arpa/nameser.h>
11
+ #if __NAMESER < 19991006
12
+ #undef HAVE_RES_SEARCH
13
+ #endif /* __NAMESER < NNN */
14
+ #endif /* HAVE_ARPA_NAMESER_H */
15
+
16
+ #if defined(HAVE_ARPA_NAMESER_H) && defined(HAVE_RES_SEARCH)
17
+ #define CAN_SRV_LOOKUP
18
+ #include <cstdio>
19
+ #include <sys/types.h>
20
+ #include <netinet/in.h>
21
+ #include <resolv.h>
22
+
23
+ LCB_INTERNAL_API
24
+ lcb_error_t
25
+ lcb_dnssrv_query(const char *name, hostlist_t hostlist)
26
+ {
27
+ ns_msg msg;
28
+
29
+ int rv = 0, nresp, ii;
30
+ lcb_U16 dns_rv;
31
+
32
+ std::vector<unsigned char> pkt(NS_PACKETSZ);
33
+ nresp = res_search(name, ns_c_in, ns_t_srv, &pkt[0], NS_PACKETSZ);
34
+ if (nresp < 0) {
35
+ return LCB_UNKNOWN_HOST;
36
+ }
37
+
38
+ rv = ns_initparse(&pkt[0], nresp, &msg);
39
+ if (rv != 0) {
40
+ return LCB_PROTOCOL_ERROR;
41
+ }
42
+
43
+ dns_rv = ns_msg_getflag(msg, ns_f_rcode);
44
+ if (dns_rv != ns_r_noerror) {
45
+ return LCB_UNKNOWN_HOST;
46
+ }
47
+
48
+ if (!ns_msg_count(msg, ns_s_an)) {
49
+ return LCB_UNKNOWN_HOST;
50
+ }
51
+
52
+ for (ii = 0; ii < ns_msg_count(msg, ns_s_an); ii++) {
53
+ lcb_U16 srv_prio, srv_weight, srv_port;
54
+ ns_rr rr;
55
+ const lcb_U8 *rdata;
56
+ size_t rdlen;
57
+
58
+ if (ns_parserr(&msg, ns_s_an, ii, &rr) != 0) {
59
+ continue;
60
+ }
61
+
62
+ if (ns_rr_type(rr) != ns_t_srv) {
63
+ continue;
64
+ }
65
+
66
+ /* Get the rdata and length fields */
67
+ rdata = ns_rr_rdata(rr);
68
+ rdlen = ns_rr_rdlen(rr);
69
+
70
+ if (rdlen < 6) {
71
+ continue;
72
+ }
73
+
74
+ #define do_get16(t) t = ns_get16(rdata); rdata += 2; rdlen -=2
75
+ do_get16(srv_prio);
76
+ do_get16(srv_weight);
77
+ do_get16(srv_port);
78
+ #undef do_get_16
79
+
80
+ (void)srv_prio; (void)srv_weight; /* Handle these in the future */
81
+ std::vector<char> dname(NS_MAXDNAME + 1);
82
+ ns_name_uncompress(
83
+ ns_msg_base(msg), ns_msg_end(msg),
84
+ rdata, &dname[0], NS_MAXDNAME);
85
+ hostlist->add(&dname[0], srv_port);
86
+ }
87
+ return LCB_SUCCESS;
88
+ }
89
+ #endif /* HAVE_RES_SEARCH */
90
+
91
+ #else
92
+ #include <windns.h>
93
+ #define CAN_SRV_LOOKUP
94
+ /* Implement via DnsQuery() */
95
+ LCB_INTERNAL_API
96
+ lcb_error_t
97
+ lcb_dnssrv_query(const char *addr, hostlist_t hs)
98
+ {
99
+ DNS_STATUS status;
100
+ PDNS_RECORDA root, cur;
101
+
102
+ status = DnsQuery_A(
103
+ addr, DNS_TYPE_SRV, DNS_QUERY_STANDARD, NULL, (PDNS_RECORD*)&root, NULL);
104
+ if (status != 0) {
105
+ return LCB_UNKNOWN_HOST;
106
+ }
107
+
108
+ for (cur = root; cur; cur = cur->pNext) {
109
+ // Use the ASCII version of the DNS lookup structure
110
+ const DNS_SRV_DATAA *srv = &cur->Data.SRV;
111
+ hostlist_add_stringz(hs, srv->pNameTarget, srv->wPort);
112
+ }
113
+ DnsRecordListFree(root, DnsFreeRecordList);
114
+ return LCB_SUCCESS;
115
+ }
116
+
117
+ #endif /* !WIN32 */
118
+
119
+
120
+ #ifndef CAN_SRV_LOOKUP
121
+ LCB_INTERNAL_API lcb_error_t lcb_dnssrv_query(const char *, hostlist_t) {
122
+ return LCB_CLIENT_FEATURE_UNAVAILABLE;
123
+ }
124
+ #endif
125
+
126
+ #define SVCNAME_PLAIN "_couchbase._tcp."
127
+ #define SVCNAME_SSL "_couchbases._tcp."
128
+
129
+ LCB_INTERNAL_API
130
+ hostlist_st*
131
+ lcb_dnssrv_getbslist(const char *addr, int is_ssl, lcb_error_t *errp) {
132
+ std::string ss;
133
+ lcb::Hostlist *ret = new lcb::Hostlist();
134
+ ss.append(is_ssl ? SVCNAME_SSL : SVCNAME_PLAIN);
135
+ ss.append(addr);
136
+
137
+ *errp = lcb_dnssrv_query(ss.c_str(), ret);
138
+ if (*errp != LCB_SUCCESS) {
139
+ delete ret;
140
+ ret = NULL;
141
+ }
142
+ return static_cast<hostlist_st*>(ret);
143
+ }
@@ -34,7 +34,7 @@ lcb_dump(lcb_t instance, FILE *fp, lcb_U32 flags)
34
34
  fprintf(fp, "Settings=%p\n", (void*)instance->settings);
35
35
 
36
36
  if (instance->cur_configinfo) {
37
- clconfig_info *cfg = instance->cur_configinfo;
37
+ lcb::clconfig::ConfigInfo *cfg = instance->cur_configinfo;
38
38
  fprintf(fp, "Current VBC=%p\n", (void*)cfg->vbc);
39
39
  fprintf(fp, "Config RevID=%d\n", cfg->vbc->revid);
40
40
  if (flags & LCB_DUMP_VBCONFIG) {
@@ -50,10 +50,10 @@ lcb_dump(lcb_t instance, FILE *fp, lcb_U32 flags)
50
50
  } else {
51
51
  fprintf(fp, "NO CLUSTER CONFIG\n");
52
52
  }
53
- fprintf(fp,"Retry queue has items: %s\n", lcb_retryq_empty(instance->retryq) ? "No" : "Yes");
53
+ fprintf(fp,"Retry queue has items: %s\n", instance->retryq->empty() ? "No" : "Yes");
54
54
  if (flags & LCB_DUMP_PKTINFO) {
55
55
  fprintf(fp, "=== BEGIN RETRY QUEUE DUMP ===\n");
56
- lcb_retryq_dump(instance->retryq, fp, NULL);
56
+ instance->retryq->dump(fp, NULL);
57
57
  fprintf(fp, "=== END RETRY QUEUE DUMP ===\n");
58
58
  } else {
59
59
  fprintf(fp, "=== NOT DUMPING PACKET INFO. LCB_DUMP_PKTINFO not passed\n");
@@ -61,10 +61,7 @@ lcb_dump(lcb_t instance, FILE *fp, lcb_U32 flags)
61
61
 
62
62
  fprintf(fp, "=== BEGIN PIPELINE DUMP ===\n");
63
63
  for (ii = 0; ii < instance->cmdq.npipelines; ii++) {
64
- mc_SERVER *server;
65
- mc_PIPELINE *pl = instance->cmdq.pipelines[ii];
66
-
67
- server = (mc_SERVER *)pl;
64
+ lcb::Server *server = static_cast<lcb::Server*>(instance->cmdq.pipelines[ii]);
68
65
  fprintf(fp, "** [%u] SERVER %s:%s\n", ii, server->curhost->host, server->curhost->port);
69
66
  if (server->connctx) {
70
67
  fprintf(fp, "** == BEGIN SOCKET INFO\n");
@@ -77,14 +74,14 @@ lcb_dump(lcb_t instance, FILE *fp, lcb_U32 flags)
77
74
  }
78
75
  if (flags & LCB_DUMP_BUFINFO) {
79
76
  fprintf(fp, "** == DUMPING NETBUF INFO (For packet network data)\n");
80
- netbuf_dump_status(&pl->nbmgr, fp);
77
+ netbuf_dump_status(&server->nbmgr, fp);
81
78
  fprintf(fp, "** == DUMPING NETBUF INFO (For packet structures)\n");
82
- netbuf_dump_status(&pl->reqpool, fp);
79
+ netbuf_dump_status(&server->reqpool, fp);
83
80
  } else {
84
81
  fprintf(fp, "** == NOT DUMPING NETBUF INFO. LCB_DUMP_BUFINFO not passed\n");
85
82
  }
86
83
  if (flags & LCB_DUMP_PKTINFO) {
87
- mcreq_dump_chain(pl, fp, NULL);
84
+ mcreq_dump_chain(server, fp, NULL);
88
85
  } else {
89
86
  fprintf(fp, "** == NOT DUMPING PACKETS. LCB_DUMP_PKTINFO not passed\n");
90
87
  }
@@ -93,6 +90,6 @@ lcb_dump(lcb_t instance, FILE *fp, lcb_U32 flags)
93
90
  fprintf(fp, "=== END PIPELINE DUMP ===\n");
94
91
 
95
92
  fprintf(fp, "=== BEGIN CONFMON DUMP ===\n");
96
- lcb_confmon_dump(instance->confmon, fp);
93
+ instance->confmon->dump(fp);
97
94
  fprintf(fp, "=== END CONFMON DUMP ===\n");
98
95
  }
@@ -0,0 +1,73 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014 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 "packetutils.h"
20
+ #include <bucketconfig/clconfig.h>
21
+
22
+ static void
23
+ ext_callback_proxy(mc_PIPELINE *pl, mc_PACKET *req, lcb_error_t rc,
24
+ const void *resdata)
25
+ {
26
+ lcb::Server *server = static_cast<lcb::Server*>(pl);
27
+ mc_REQDATAEX *rd = req->u_rdata.exdata;
28
+ const lcb::MemcachedResponse *res =
29
+ reinterpret_cast<const lcb::MemcachedResponse*>(resdata);
30
+
31
+ lcb::clconfig::cccp_update(
32
+ rd->cookie, rc, res->body<const char*>(), res->bodylen(),
33
+ &server->get_host());
34
+ free(rd);
35
+ }
36
+
37
+ static mc_REQDATAPROCS procs = { ext_callback_proxy };
38
+
39
+ lcb_error_t
40
+ lcb_st::request_config(const void *cookie_, lcb::Server *server)
41
+ {
42
+ lcb_error_t err;
43
+ mc_PACKET *packet;
44
+ mc_REQDATAEX *rd;
45
+
46
+ packet = mcreq_allocate_packet(server);
47
+ if (!packet) {
48
+ return LCB_CLIENT_ENOMEM;
49
+ }
50
+
51
+ err = mcreq_reserve_header(server, packet, 24);
52
+ if (err != LCB_SUCCESS) {
53
+ mcreq_release_packet(server, packet);
54
+ return err;
55
+ }
56
+
57
+ rd = reinterpret_cast<mc_REQDATAEX*>(calloc(1, sizeof(*rd)));
58
+ rd->procs = &procs;
59
+ rd->cookie = cookie_;
60
+ rd->start = gethrtime();
61
+ packet->u_rdata.exdata = rd;
62
+ packet->flags |= MCREQ_F_REQEXT;
63
+
64
+ lcb::MemcachedRequest hdr(
65
+ PROTOCOL_BINARY_CMD_GET_CLUSTER_CONFIG, packet->opaque);
66
+ hdr.opaque(packet->opaque);
67
+ memcpy(SPAN_BUFFER(&packet->kh_span), hdr.data(), hdr.size());
68
+
69
+ mcreq_sched_enter(&cmdq);
70
+ mcreq_sched_add(server, packet);
71
+ mcreq_sched_leave(&cmdq, 1);
72
+ return LCB_SUCCESS;
73
+ }