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
@@ -23,9 +23,24 @@
23
23
  #include "settings.h"
24
24
  #include "hostlist.h"
25
25
  #ifdef __cplusplus
26
+ namespace lcb {
27
+ namespace io {
28
+ struct Connstart;
29
+ struct PoolRequest;
30
+ class ConnectionRequest;
31
+ }
32
+ }
33
+ typedef lcb::io::ConnectionRequest* lcbio_pCONNSTART;
34
+ typedef lcb::io::ConnectionRequest lcbio_MGRREQ;
26
35
  extern "C" {
36
+ #else
37
+ struct lcbio_CONNSTART;
38
+ typedef struct lcbio_CONNSTART* lcbio_pCONNSTART;
39
+ typedef struct lcbio_MGRREQ lcbio_MGRREQ;
27
40
  #endif
28
41
 
42
+ typedef lcbio_MGRREQ* lcbio_pMGRREQ;
43
+
29
44
  /**
30
45
  * @file
31
46
  * This provides the core socket routines
@@ -39,12 +54,6 @@ extern "C" {
39
54
  * @{
40
55
  */
41
56
 
42
- struct lcbio_CONNSTART;
43
- struct lcbio_MGRREQ;
44
-
45
- /** @brief Pending connection request */
46
- typedef struct lcbio_CONNSTART *lcbio_pCONNSTART;
47
- typedef struct lcbio_MGRREQ *lcbio_pMGRREQ;
48
57
  typedef struct lcbio_TABLE *lcbio_pTABLE;
49
58
  typedef struct lcbio_TIMER *lcbio_pTIMER, *lcbio_pASYNC;
50
59
 
@@ -266,7 +275,7 @@ lcbio_protoctx_add(lcbio_SOCKET *socket, lcbio_PROTOCTX *proto);
266
275
  * @return the context, or NULL if not found
267
276
  */
268
277
  lcbio_PROTOCTX *
269
- lcbio_protoctx_get(lcbio_SOCKET *socket, lcbio_PROTOID id);
278
+ lcbio_protoctx_get(const lcbio_SOCKET *socket, lcbio_PROTOID id);
270
279
 
271
280
  /**
272
281
  * Remove a protocol context by its ID
@@ -148,7 +148,7 @@ lcbio_ctx_close_ex(lcbio_CTX *ctx, lcbio_CTXCLOSE_cb cb, void *arg,
148
148
  }
149
149
 
150
150
  oldrc = ctx->sock->refcount;
151
- lcb_log(LOGARGS(ctx, DEBUG), CTX_LOGFMT "Destroying. PND=%d,ENT=%d,SORC=%d", CTX_LOGID(ctx), (int)ctx->npending, (int)ctx->entered, oldrc);
151
+ lcb_log(LOGARGS(ctx, DEBUG), CTX_LOGFMT "Destroying context. Pending Writes=%d, Entered=%s, Socket Refcount=%d", CTX_LOGID(ctx), (int)ctx->npending, (int)ctx->entered ? "true": "false", oldrc);
152
152
 
153
153
  if (cb) {
154
154
  int reusable =
@@ -37,22 +37,6 @@
37
37
  extern "C" {
38
38
  #endif
39
39
 
40
- typedef struct lcbio_TABLE {
41
- lcb_io_opt_t p;
42
- lcb_iomodel_t model;
43
- lcb_timer_procs timer;
44
- lcb_loop_procs loop;
45
-
46
- union {
47
- struct {
48
- lcb_ev_procs ev;
49
- lcb_bsd_procs io;
50
- } v0;
51
- lcb_completion_procs completion;
52
- } u_io;
53
- unsigned refcount;
54
- void (*dtor)(void *);
55
- } lcbio_TABLE;
56
40
 
57
41
  /** Whether the underlying model is event-based */
58
42
  #define IOT_IS_EVENT(iot) ((iot)->model == LCB_IOMODEL_EVENT)
@@ -78,6 +62,107 @@ typedef struct lcbio_TABLE {
78
62
  /** First argument to IO Table */
79
63
  #define IOT_ARG(iot) (iot)->p
80
64
 
65
+ typedef struct lcbio_TABLE {
66
+ lcb_io_opt_t p;
67
+ lcb_iomodel_t model;
68
+ lcb_timer_procs timer;
69
+ lcb_loop_procs loop;
70
+
71
+ union {
72
+ struct {
73
+ lcb_ev_procs ev;
74
+ lcb_bsd_procs io;
75
+ } v0;
76
+ lcb_completion_procs completion;
77
+ } u_io;
78
+ unsigned refcount;
79
+ void (*dtor)(void *);
80
+
81
+ #ifdef __cplusplus
82
+ bool is_E() const { return IOT_IS_EVENT(this); }
83
+ bool is_C() const { return !is_E(); }
84
+ int get_errno() const { return IOT_ERRNO(this); }
85
+
86
+ void run_loop() { IOT_START(this); }
87
+ void stop_loop() { IOT_STOP(this); }
88
+
89
+ int E_connect(lcb_socket_t sock, const sockaddr* saddr, unsigned addrlen) {
90
+ return IOT_V0IO(this).connect0(p, sock, saddr, addrlen);
91
+ }
92
+
93
+ lcb_socket_t E_socket(int domain, int type, int protocol) {
94
+ return IOT_V0IO(this).socket0(p, domain, type, protocol);
95
+ }
96
+
97
+ lcb_socket_t E_socket(const addrinfo *ai) {
98
+ return E_socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
99
+ }
100
+
101
+ void E_close(lcb_socket_t sock) {
102
+ IOT_V0IO(this).close(p, sock);
103
+ }
104
+
105
+ void *E_event_create() {
106
+ return IOT_V0EV(this).create(p);
107
+ }
108
+
109
+ void E_event_watch(lcb_socket_t fd, void *event, short mask, void *arg,
110
+ lcb_ioE_callback cb) {
111
+ IOT_V0EV(this).watch(p, fd, event, mask, arg, cb);
112
+ }
113
+
114
+ void E_event_destroy(void *event) {
115
+ IOT_V0EV(this).destroy(p, event);
116
+ }
117
+
118
+ void E_event_cancel(lcb_socket_t fd, void *event) {
119
+ IOT_V0EV(this).cancel(p, fd, event);
120
+ }
121
+
122
+ int E_check_closed(lcb_socket_t s, int flags) {
123
+ return IOT_V0IO(this).is_closed(p, s, flags);
124
+ }
125
+
126
+ int E_cntl(lcb_socket_t s, int mode, int opt, void *val) {
127
+ return IOT_V0IO(this).cntl(p, s, mode, opt, val);
128
+ }
129
+
130
+ void C_close(lcb_sockdata_t *sd) {
131
+ IOT_V1(this).close(p, sd);
132
+ }
133
+
134
+ int C_connect(lcb_sockdata_t *sd, const sockaddr *addr, unsigned addrlen,
135
+ lcb_io_connect_cb callback) {
136
+ return IOT_V1(this).connect(p, sd, addr, addrlen, callback);
137
+ }
138
+
139
+ lcb_sockdata_t* C_socket(int domain, int type, int protocol) {
140
+ return IOT_V1(this).socket(p, domain, type, protocol);
141
+ }
142
+
143
+ lcb_sockdata_t* C_socket(const addrinfo *ai) {
144
+ return C_socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
145
+ }
146
+
147
+ int C_check_closed(lcb_sockdata_t *sock, int flags) {
148
+ return IOT_V1(this).is_closed(p, sock, flags);
149
+ }
150
+
151
+ int C_cntl(lcb_sockdata_t *sd, int mode, int opt, void *val) {
152
+ return IOT_V1(this).cntl(p, sd, mode, opt, val) == 0;
153
+ }
154
+
155
+ bool has_cntl() {
156
+ if (is_E()) {
157
+ return IOT_V0IO(this).cntl != NULL;
158
+ } else {
159
+ return IOT_V1(this).cntl != NULL;
160
+ }
161
+ }
162
+ #endif
163
+
164
+ } lcbio_TABLE;
165
+
81
166
  #ifdef __cplusplus
82
167
  }
83
168
  #endif
@@ -100,7 +100,7 @@ ioerr2lcberr(lcbio_OSERR in, const lcb_settings *settings)
100
100
  case ECONNABORTED:
101
101
  return LCB_ECONNRESET;
102
102
  default:
103
- lcb_log(settings, "lcbio", LCB_LOG_WARN, __FILE__, __LINE__, "FIXME: Unknown iops/os error code %d. Using NETWORK_ERROR", in);
103
+ lcb_log(settings, "lcbio", LCB_LOG_WARN, __FILE__, __LINE__, "OS errno %d (%s) does not have a direct client error code equivalent. Using NETWORK_ERROR", in, strerror(in));
104
104
  return LCB_NETWORK_ERROR;
105
105
  }
106
106
  }
@@ -124,14 +124,12 @@ lcbio_E_ai2sock(lcbio_TABLE *io, struct addrinfo **ai, int *connerr)
124
124
  *connerr = 0;
125
125
 
126
126
  for (; *ai; *ai = (*ai)->ai_next) {
127
- ret = IOT_V0IO(io).socket0(
128
- IOT_ARG(io), (*ai)->ai_family, (*ai)->ai_socktype,
129
- (*ai)->ai_protocol);
127
+ ret = io->E_socket(*ai);
130
128
 
131
129
  if (ret != INVALID_SOCKET) {
132
130
  return ret;
133
131
  } else {
134
- *connerr = IOT_ERRNO(io);
132
+ *connerr = io->get_errno();
135
133
  }
136
134
  }
137
135
 
@@ -143,9 +141,7 @@ lcbio_C_ai2sock(lcbio_TABLE *io, struct addrinfo **ai, int *connerr)
143
141
  {
144
142
  lcb_sockdata_t *ret = NULL;
145
143
  for (; *ai; *ai = (*ai)->ai_next) {
146
- ret = IOT_V1(io).socket(
147
- IOT_ARG(io), (*ai)->ai_family, (*ai)->ai_socktype,
148
- (*ai)->ai_protocol);
144
+ ret = io->C_socket(*ai);
149
145
  if (ret) {
150
146
  return ret;
151
147
  } else {
@@ -254,31 +250,26 @@ lcbio_is_netclosed(lcbio_SOCKET *sock, int flags)
254
250
  {
255
251
  lcbio_pTABLE iot = sock->io;
256
252
 
257
- if (IOT_IS_EVENT(iot)) {
258
- return IOT_V0IO(iot).is_closed(IOT_ARG(iot), sock->u.fd, flags);
253
+ if (iot->is_E()) {
254
+ return iot->E_check_closed(sock->u.fd, flags);
259
255
  } else {
260
- return IOT_V1(iot).is_closed(IOT_ARG(iot), sock->u.sd, flags);
256
+ return iot->C_check_closed(sock->u.sd, flags);
261
257
  }
262
258
  }
263
259
 
264
260
  lcb_error_t
265
- lcbio_disable_nagle(lcbio_SOCKET *s)
266
- {
261
+ lcbio_enable_sockopt(lcbio_SOCKET *s, int cntl) {
267
262
  lcbio_pTABLE iot = s->io;
268
- int val = 1, rv;
269
- int is_supp = ((IOT_IS_EVENT(iot) && IOT_V0IO(iot).cntl)) ||
270
- (!IOT_IS_EVENT(iot) && IOT_V1(iot).cntl);
263
+ int rv;
264
+ int value = 1;
271
265
 
272
- if (!is_supp) {
266
+ if (!iot->has_cntl()) {
273
267
  return LCB_NOT_SUPPORTED;
274
268
  }
275
-
276
- if (IOT_IS_EVENT(iot)) {
277
- rv = IOT_V0IO(iot).cntl(IOT_ARG(iot), s->u.fd, LCB_IO_CNTL_SET,
278
- LCB_IO_CNTL_TCP_NODELAY, &val);
269
+ if (iot->is_E()) {
270
+ rv = iot->E_cntl(s->u.fd, LCB_IO_CNTL_SET, cntl, &value);
279
271
  } else {
280
- rv = IOT_V1(iot).cntl(IOT_ARG(iot), s->u.sd, LCB_IO_CNTL_SET,
281
- LCB_IO_CNTL_TCP_NODELAY, &val);
272
+ rv = iot->C_cntl(s->u.sd, LCB_IO_CNTL_SET, cntl, &value);
282
273
  }
283
274
  if (rv != 0) {
284
275
  return lcbio_mklcberr(IOT_ERRNO(iot), s->settings);
@@ -287,22 +278,16 @@ lcbio_disable_nagle(lcbio_SOCKET *s)
287
278
  }
288
279
  }
289
280
 
290
- void
291
- lcbio_connreq_cancel(lcbio_CONNREQ *req)
292
- {
293
- if (!req->u.cs) {
294
- return;
295
- }
296
-
297
- if (req->type == LCBIO_CONNREQ_POOLED) {
298
- lcbio_mgr_cancel(req->u.preq);
299
- } else if (req->type == LCBIO_CONNREQ_RAW) {
300
- lcbio_connect_cancel(req->u.cs);
301
- } else {
302
- req->dtor(req->u.p_generic);
281
+ const char *
282
+ lcbio_strsockopt(int cntl) {
283
+ switch (cntl) {
284
+ case LCB_IO_CNTL_TCP_KEEPALIVE:
285
+ return "TCP_KEEPALIVE";
286
+ case LCB_IO_CNTL_TCP_NODELAY:
287
+ return "TCP_NODELAY";
288
+ default:
289
+ return "FIXME: Unknown option";
303
290
  }
304
-
305
- req->u.cs = NULL;
306
291
  }
307
292
 
308
293
  int
@@ -316,35 +301,29 @@ lcbio_ssl_supported(void)
316
301
  }
317
302
 
318
303
  lcbio_pSSLCTX
319
- lcbio_ssl_new__fallback(const char *ca, int noverify, lcb_error_t *errp,
320
- lcb_settings *settings)
304
+ lcbio_ssl_new__fallback(const char *, int, lcb_error_t *errp,
305
+ lcb_settings *)
321
306
  {
322
- (void)ca; (void)noverify; (void)settings;
323
307
  if (errp) { *errp = LCB_CLIENT_FEATURE_UNAVAILABLE; }
324
308
  return NULL;
325
309
  }
326
310
 
327
311
 
328
312
  #ifdef LCB_NO_SSL
329
- void lcbio_ssl_free(lcbio_pSSLCTX a) {
330
- (void)a;
313
+ void lcbio_ssl_free(lcbio_pSSLCTX) {
331
314
  }
332
- lcb_error_t lcbio_ssl_apply(lcbio_SOCKET *a, lcbio_pSSLCTX b) {
333
- (void)a;(void)b;
315
+ lcb_error_t lcbio_ssl_apply(lcbio_SOCKET*, lcbio_pSSLCTX) {
334
316
  return LCB_CLIENT_FEATURE_UNAVAILABLE;
335
317
  }
336
- int lcbio_ssl_check(lcbio_SOCKET *s) {
337
- (void)s;
318
+ int lcbio_ssl_check(lcbio_SOCKET*) {
338
319
  return 0;
339
320
  }
340
- lcb_error_t lcbio_ssl_get_error(lcbio_SOCKET *s) {
341
- (void)s;
321
+ lcb_error_t lcbio_ssl_get_error(lcbio_SOCKET *) {
342
322
  return LCB_SUCCESS;
343
323
  }
344
324
  void lcbio_ssl_global_init(void) {
345
325
  }
346
- lcb_error_t lcbio_sslify_if_needed(lcbio_SOCKET *s, lcb_settings *st) {
347
- (void)s;(void)st;
326
+ lcb_error_t lcbio_sslify_if_needed(lcbio_SOCKET *, lcb_settings *) {
348
327
  return LCB_SUCCESS;
349
328
  }
350
329
  #endif
@@ -92,9 +92,17 @@ lcbio_get_nameinfo(lcbio_SOCKET *sock, struct lcbio_NAMEINFO *nistrs);
92
92
  int
93
93
  lcbio_is_netclosed(lcbio_SOCKET *sock, int flags);
94
94
 
95
- /** Disable Nagle's algorithm on the socket */
95
+ /**
96
+ * Enable an option on a socket
97
+ * @param sock The socket
98
+ * @param cntl The option (LCB_IO_CNTL_xxx)
99
+ * @return
100
+ */
96
101
  lcb_error_t
97
- lcbio_disable_nagle(lcbio_SOCKET *s);
102
+ lcbio_enable_sockopt(lcbio_SOCKET *sock, int cntl);
103
+
104
+ const char *
105
+ lcbio_strsockopt(int cntl);
98
106
 
99
107
  void
100
108
  lcbio__load_socknames(lcbio_SOCKET *sock);
@@ -105,99 +113,30 @@ lcbio__load_socknames(lcbio_SOCKET *sock);
105
113
  #define lcbio_syserrno errno
106
114
  #endif
107
115
 
116
+ #ifdef __cplusplus
117
+ }
108
118
 
109
- /**
110
- * @addtogroup lcbio
111
- * @{
112
- *
113
- * @name Pending Requests
114
- * @{
115
- *
116
- * The lcbio_CONNREQ structure may contain various forms of pending requests
117
- * which are _cancellable_. This is useful to act as an abstraction over the
118
- * various helper functions which may be employed to initiate a new connection
119
- * or negotiate an existing one.
120
- *
121
- * The semantics of a _cancellable_ request are:
122
- *
123
- * <ul>
124
- * <li>They represent a pending operation</li>
125
- * <li>When cancelled, the pending operation is invalidated. This means that
126
- * any callbacks scheduled as a result of the operation will not be invoked.
127
- * </li>
128
- *
129
- * <li>If the pending operation has completed, the request is invalidated. This
130
- * means the pointer for the request is considered invalid once the operation
131
- * has completed
132
- * </li>
133
- * </ul>
134
- */
135
-
136
- /**
137
- * @brief Container object for various forms of cancellable requests.
138
- */
139
- typedef struct {
140
- int type; /**< One of the LCBIO_CONNREQ_* constants */
141
- #define LCBIO_CONNREQ_RAW 1
142
- #define LCBIO_CONNREQ_POOLED 2
143
- #define LCBIO_CONNREQ_GENERIC 3
144
- union {
145
- struct lcbio_CONNSTART *cs; /**< from lcbio_connect() */
146
- struct lcbio_MGRREQ *preq; /**< from lcbio_mgr_get() */
147
- void *p_generic; /**< Generic pointer. Destroyed via the dtor field */
148
- } u;
149
- void (*dtor)(void *);
150
- } lcbio_CONNREQ;
151
-
152
- /** @brief Clear an existing request, setting the pointer to NULL */
153
- #define LCBIO_CONNREQ_CLEAR(req) (req)->u.p_generic = NULL
154
-
155
- /**
156
- * @brief Initialize a connreq with an lcbio_pCONNSTART handle
157
- * @param req the request to initialize
158
- * @param cs the lcbio_pCONNSTART returned by lcbio_connect()
159
- */
160
- #define LCBIO_CONNREQ_MKRAW(req, cs) do { \
161
- (req)->u.cs = cs; \
162
- (req)->type = LCBIO_CONNREQ_RAW; \
163
- } while (0);
164
-
165
- /**
166
- * @brief Initialize a connreq with an lcbio_pMGRREQ
167
- * @param req The request to initialize
168
- * @param sreq the lcbio_pMGRREQ returned by lcbio_mgr_get()
169
- */
170
- #define LCBIO_CONNREQ_MKPOOLED(req, sreq) do { \
171
- (req)->u.preq = sreq; \
172
- (req)->type = LCBIO_CONNREQ_POOLED; \
173
- } while (0);
119
+ namespace lcb {
120
+ namespace io {
174
121
 
175
122
  /**
176
- * Initialize a connreq with a generic pointer.
177
- * @param req The request to initialize
178
- * @param p the pointer representing the request
179
- * @param dtorcb a callback invoked with `p` when the request has been cancelled
123
+ * This interface defines a pending connection request. It may be
124
+ * cancelled.
180
125
  */
181
- #define LCBIO_CONNREQ_MKGENERIC(req, p, dtorcb) do { \
182
- (req)->u.p_generic = p; \
183
- (req)->type = LCBIO_CONNREQ_GENERIC; \
184
- (req)->dtor = (void (*)(void *))dtorcb; \
185
- } while (0);
186
-
187
- /**
188
- * @brief cancels a pending request, if not yet cancelled.
189
- *
190
- * Cancels a pending request. If the request has already been cancelled (by
191
- * calling this function), then this function does nothing
192
- * @param req The request to cancel
193
- */
194
- void
195
- lcbio_connreq_cancel(lcbio_CONNREQ *req);
196
-
197
- /**@}*/
198
- /**@}*/
126
+ class ConnectionRequest {
127
+ public:
128
+ virtual void cancel() = 0;
129
+ virtual ~ConnectionRequest() {}
130
+ static void cancel(ConnectionRequest **pp) {
131
+ if (*pp) {
132
+ (*pp)->cancel();
133
+ *pp = NULL;
134
+ }
135
+ }
136
+ };
199
137
 
200
- #ifdef __cplusplus
201
138
  }
139
+ }
140
+
202
141
  #endif
203
142
  #endif