libcouchbase 1.2.8 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (186) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -4
  3. data/README.md +16 -8
  4. data/ext/libcouchbase/CMakeLists.txt +34 -32
  5. data/ext/libcouchbase/RELEASE_NOTES.markdown +277 -6
  6. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +14 -0
  7. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +2 -0
  8. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +2 -1
  9. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +2 -0
  10. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +8 -1
  11. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
  12. data/ext/libcouchbase/cmake/config-cmake.h.in +14 -0
  13. data/ext/libcouchbase/cmake/configure +8 -26
  14. data/ext/libcouchbase/cmake/defs.mk.in +2 -2
  15. data/ext/libcouchbase/cmake/libcouchbase.stp.in +829 -0
  16. data/ext/libcouchbase/cmake/source_files.cmake +11 -2
  17. data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +18 -2
  18. data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +44 -2
  19. data/ext/libcouchbase/contrib/cbsasl/src/client.c +285 -73
  20. data/ext/libcouchbase/contrib/cbsasl/src/common.c +4 -0
  21. data/ext/libcouchbase/contrib/cbsasl/src/scram-sha/scram_utils.c +500 -0
  22. data/ext/libcouchbase/contrib/cbsasl/src/scram-sha/scram_utils.h +99 -0
  23. data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +1 -1
  24. data/ext/libcouchbase/contrib/cliopts/cliopts.h +14 -1
  25. data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +2 -3
  26. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +4 -0
  27. data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +7 -5
  28. data/ext/libcouchbase/contrib/snappy/snappy.cc +7 -2
  29. data/ext/libcouchbase/example/crypto/.gitignore +2 -0
  30. data/ext/libcouchbase/example/crypto/Makefile +13 -0
  31. data/ext/libcouchbase/example/crypto/common_provider.c +24 -0
  32. data/ext/libcouchbase/example/crypto/common_provider.h +31 -0
  33. data/ext/libcouchbase/example/crypto/openssl_symmetric_decrypt.c +139 -0
  34. data/ext/libcouchbase/example/crypto/openssl_symmetric_encrypt.c +147 -0
  35. data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.c +281 -0
  36. data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.h +29 -0
  37. data/ext/libcouchbase/example/tracing/.gitignore +2 -0
  38. data/ext/libcouchbase/example/tracing/Makefile +8 -0
  39. data/ext/libcouchbase/example/tracing/cJSON.c +1 -0
  40. data/ext/libcouchbase/example/tracing/cJSON.h +1 -0
  41. data/ext/libcouchbase/example/tracing/tracing.c +439 -0
  42. data/ext/libcouchbase/example/tracing/views.c +444 -0
  43. data/ext/libcouchbase/include/libcouchbase/auth.h +56 -4
  44. data/ext/libcouchbase/include/libcouchbase/cbft.h +8 -0
  45. data/ext/libcouchbase/include/libcouchbase/cntl-private.h +55 -1
  46. data/ext/libcouchbase/include/libcouchbase/cntl.h +101 -1
  47. data/ext/libcouchbase/include/libcouchbase/configuration.h.in +6 -0
  48. data/ext/libcouchbase/include/libcouchbase/couchbase.h +109 -6
  49. data/ext/libcouchbase/include/libcouchbase/crypto.h +140 -0
  50. data/ext/libcouchbase/include/libcouchbase/error.h +38 -2
  51. data/ext/libcouchbase/include/libcouchbase/kvbuf.h +6 -1
  52. data/ext/libcouchbase/include/libcouchbase/metrics.h +79 -0
  53. data/ext/libcouchbase/include/libcouchbase/n1ql.h +9 -0
  54. data/ext/libcouchbase/include/libcouchbase/tracing.h +319 -0
  55. data/ext/libcouchbase/include/libcouchbase/vbucket.h +1 -1
  56. data/ext/libcouchbase/include/libcouchbase/views.h +8 -0
  57. data/ext/libcouchbase/include/memcached/protocol_binary.h +40 -10
  58. data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +6 -14
  59. data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +3 -0
  60. data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +1 -0
  61. data/ext/libcouchbase/plugins/io/select/plugin-select.c +4 -1
  62. data/ext/libcouchbase/src/auth-priv.h +36 -4
  63. data/ext/libcouchbase/src/auth.cc +66 -27
  64. data/ext/libcouchbase/src/bootstrap.cc +1 -1
  65. data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +12 -7
  66. data/ext/libcouchbase/src/bucketconfig/bc_http.cc +26 -17
  67. data/ext/libcouchbase/src/bucketconfig/bc_http.h +1 -1
  68. data/ext/libcouchbase/src/bucketconfig/clconfig.h +4 -2
  69. data/ext/libcouchbase/src/bucketconfig/confmon.cc +6 -3
  70. data/ext/libcouchbase/src/cbft.cc +48 -0
  71. data/ext/libcouchbase/src/cntl.cc +138 -2
  72. data/ext/libcouchbase/src/config_static.h +17 -0
  73. data/ext/libcouchbase/src/connspec.cc +54 -6
  74. data/ext/libcouchbase/src/connspec.h +9 -1
  75. data/ext/libcouchbase/src/crypto.cc +386 -0
  76. data/ext/libcouchbase/src/ctx-log-inl.h +23 -6
  77. data/ext/libcouchbase/src/dump.cc +4 -0
  78. data/ext/libcouchbase/src/getconfig.cc +1 -2
  79. data/ext/libcouchbase/src/handler.cc +65 -27
  80. data/ext/libcouchbase/src/hostlist.cc +35 -7
  81. data/ext/libcouchbase/src/hostlist.h +7 -0
  82. data/ext/libcouchbase/src/http/http-priv.h +2 -0
  83. data/ext/libcouchbase/src/http/http.cc +77 -37
  84. data/ext/libcouchbase/src/http/http_io.cc +19 -2
  85. data/ext/libcouchbase/src/instance.cc +90 -17
  86. data/ext/libcouchbase/src/internal.h +5 -0
  87. data/ext/libcouchbase/src/lcbio/connect.cc +39 -4
  88. data/ext/libcouchbase/src/lcbio/connect.h +27 -0
  89. data/ext/libcouchbase/src/lcbio/ctx.c +49 -23
  90. data/ext/libcouchbase/src/lcbio/ioutils.cc +30 -3
  91. data/ext/libcouchbase/src/lcbio/ioutils.h +2 -0
  92. data/ext/libcouchbase/src/lcbio/manager.cc +44 -8
  93. data/ext/libcouchbase/src/lcbio/manager.h +2 -0
  94. data/ext/libcouchbase/src/lcbio/rw-inl.h +1 -0
  95. data/ext/libcouchbase/src/lcbio/ssl.h +3 -5
  96. data/ext/libcouchbase/src/logging.c +1 -1
  97. data/ext/libcouchbase/src/logging.h +2 -0
  98. data/ext/libcouchbase/src/mc/compress.cc +164 -0
  99. data/ext/libcouchbase/src/mc/compress.h +7 -12
  100. data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +5 -1
  101. data/ext/libcouchbase/src/mc/mcreq.c +11 -1
  102. data/ext/libcouchbase/src/mc/mcreq.h +35 -4
  103. data/ext/libcouchbase/src/mcserver/mcserver.cc +30 -7
  104. data/ext/libcouchbase/src/mcserver/mcserver.h +7 -0
  105. data/ext/libcouchbase/src/mcserver/negotiate.cc +103 -57
  106. data/ext/libcouchbase/src/mcserver/negotiate.h +2 -2
  107. data/ext/libcouchbase/src/mctx-helper.h +11 -0
  108. data/ext/libcouchbase/src/metrics.cc +132 -0
  109. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +2 -1
  110. data/ext/libcouchbase/src/n1ql/n1ql.cc +66 -0
  111. data/ext/libcouchbase/src/newconfig.cc +9 -2
  112. data/ext/libcouchbase/src/operations/counter.cc +2 -1
  113. data/ext/libcouchbase/src/operations/durability-cas.cc +11 -0
  114. data/ext/libcouchbase/src/operations/durability-seqno.cc +3 -0
  115. data/ext/libcouchbase/src/operations/durability.cc +24 -2
  116. data/ext/libcouchbase/src/operations/durability_internal.h +19 -0
  117. data/ext/libcouchbase/src/operations/get.cc +4 -2
  118. data/ext/libcouchbase/src/operations/observe-seqno.cc +1 -0
  119. data/ext/libcouchbase/src/operations/observe.cc +113 -62
  120. data/ext/libcouchbase/src/operations/ping.cc +246 -67
  121. data/ext/libcouchbase/src/operations/remove.cc +2 -1
  122. data/ext/libcouchbase/src/operations/store.cc +17 -14
  123. data/ext/libcouchbase/src/operations/touch.cc +3 -0
  124. data/ext/libcouchbase/src/packetutils.h +68 -4
  125. data/ext/libcouchbase/src/probes.d +132 -161
  126. data/ext/libcouchbase/src/rdb/bigalloc.c +1 -1
  127. data/ext/libcouchbase/src/retryq.cc +6 -2
  128. data/ext/libcouchbase/src/rnd.cc +68 -0
  129. data/ext/libcouchbase/src/rnd.h +39 -0
  130. data/ext/libcouchbase/src/settings.c +27 -0
  131. data/ext/libcouchbase/src/settings.h +67 -3
  132. data/ext/libcouchbase/src/ssl/CMakeLists.txt +0 -12
  133. data/ext/libcouchbase/src/ssl/ssl_common.c +23 -4
  134. data/ext/libcouchbase/src/strcodecs/base64.c +141 -16
  135. data/ext/libcouchbase/src/strcodecs/strcodecs.h +16 -1
  136. data/ext/libcouchbase/src/trace.h +68 -61
  137. data/ext/libcouchbase/src/tracing/span.cc +289 -0
  138. data/ext/libcouchbase/src/tracing/threshold_logging_tracer.cc +171 -0
  139. data/ext/libcouchbase/src/tracing/tracer.cc +53 -0
  140. data/ext/libcouchbase/src/tracing/tracing-internal.h +213 -0
  141. data/ext/libcouchbase/src/utilities.c +5 -0
  142. data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -2
  143. data/ext/libcouchbase/src/vbucket/vbucket.c +50 -18
  144. data/ext/libcouchbase/src/views/docreq.cc +26 -1
  145. data/ext/libcouchbase/src/views/docreq.h +17 -0
  146. data/ext/libcouchbase/src/views/viewreq.cc +64 -1
  147. data/ext/libcouchbase/src/views/viewreq.h +21 -0
  148. data/ext/libcouchbase/tests/CMakeLists.txt +6 -6
  149. data/ext/libcouchbase/tests/basic/t_base64.cc +34 -6
  150. data/ext/libcouchbase/tests/basic/t_connstr.cc +14 -0
  151. data/ext/libcouchbase/tests/basic/t_creds.cc +10 -10
  152. data/ext/libcouchbase/tests/basic/t_host.cc +22 -2
  153. data/ext/libcouchbase/tests/basic/t_scram.cc +514 -0
  154. data/ext/libcouchbase/tests/check-all.cc +6 -2
  155. data/ext/libcouchbase/tests/iotests/mock-environment.cc +64 -0
  156. data/ext/libcouchbase/tests/iotests/mock-environment.h +27 -1
  157. data/ext/libcouchbase/tests/iotests/t_confmon.cc +2 -2
  158. data/ext/libcouchbase/tests/iotests/t_forward.cc +8 -0
  159. data/ext/libcouchbase/tests/iotests/t_netfail.cc +124 -0
  160. data/ext/libcouchbase/tests/iotests/t_smoke.cc +1 -1
  161. data/ext/libcouchbase/tests/iotests/t_snappy.cc +316 -0
  162. data/ext/libcouchbase/tests/socktests/socktest.cc +2 -2
  163. data/ext/libcouchbase/tests/socktests/t_basic.cc +6 -6
  164. data/ext/libcouchbase/tests/socktests/t_manager.cc +1 -1
  165. data/ext/libcouchbase/tests/socktests/t_ssl.cc +1 -1
  166. data/ext/libcouchbase/tools/CMakeLists.txt +1 -1
  167. data/ext/libcouchbase/tools/cbc-handlers.h +17 -0
  168. data/ext/libcouchbase/tools/cbc-n1qlback.cc +7 -4
  169. data/ext/libcouchbase/tools/cbc-pillowfight.cc +408 -100
  170. data/ext/libcouchbase/tools/cbc-proxy.cc +134 -3
  171. data/ext/libcouchbase/tools/cbc-subdoc.cc +1 -2
  172. data/ext/libcouchbase/tools/cbc.cc +113 -8
  173. data/ext/libcouchbase/tools/common/histogram.cc +1 -0
  174. data/ext/libcouchbase/tools/common/options.cc +28 -1
  175. data/ext/libcouchbase/tools/common/options.h +5 -0
  176. data/ext/libcouchbase/tools/docgen/docgen.h +36 -10
  177. data/ext/libcouchbase/tools/docgen/loc.h +5 -4
  178. data/ext/libcouchbase/tools/docgen/seqgen.h +28 -0
  179. data/lib/libcouchbase/ext/libcouchbase/enums.rb +10 -0
  180. data/lib/libcouchbase/n1ql.rb +6 -1
  181. data/lib/libcouchbase/version.rb +1 -1
  182. data/spec/connection_spec.rb +6 -6
  183. metadata +38 -5
  184. data/ext/libcouchbase/cmake/Modules/FindCouchbaseSnappy.cmake +0 -11
  185. data/ext/libcouchbase/src/mc/compress.c +0 -90
  186. data/ext/libcouchbase/tools/common/my_inttypes.h +0 -22
@@ -0,0 +1,444 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2018 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
+ /**
19
+ * @file
20
+ *
21
+ * This is a minimal example file showing how to connect to a cluster and
22
+ * set and retrieve a single item. This is copy of minimal.c, but with
23
+ * tracing enabled.
24
+ *
25
+ * docker run -d -p 9411:9411 openzipkin/zipkin
26
+ * make
27
+ * ./views couchbase://localhost/beer-sample password Administrator
28
+ *
29
+ * open browser at http://localhost:9411
30
+ */
31
+
32
+ #include <stdio.h>
33
+ #include <libcouchbase/couchbase.h>
34
+ #include <libcouchbase/api3.h>
35
+ #include <libcouchbase/views.h>
36
+ #include <stdlib.h>
37
+ #include <unistd.h>
38
+ #include <string.h> /* strlen */
39
+ #ifdef _WIN32
40
+ #define PRIx64 "I64x"
41
+ #define PRId64 "I64d"
42
+ #else
43
+ #include <inttypes.h>
44
+ #endif
45
+
46
+ #include <netdb.h>
47
+ #include <sys/types.h>
48
+ #include <netinet/in.h>
49
+ #include <sys/socket.h>
50
+ #include <arpa/inet.h>
51
+
52
+ #include "cJSON.h"
53
+
54
+ #define COMPONENT_NAME "demo"
55
+
56
+ struct zipkin_payload;
57
+ typedef struct zipkin_payload {
58
+ char *data;
59
+ struct zipkin_payload *next;
60
+ } zipkin_payload;
61
+
62
+ typedef struct zipkin_state {
63
+ char *json_api_host;
64
+ char *json_api_port;
65
+ /* [0, 100], where 0 is "never", 100 is "always" */
66
+ int sample_rate;
67
+ zipkin_payload *root;
68
+ zipkin_payload *last;
69
+ size_t content_length;
70
+ } zipkin_state;
71
+
72
+ void zipkin_destructor(lcbtrace_TRACER *tracer)
73
+ {
74
+ if (tracer) {
75
+ if (tracer->cookie) {
76
+ free(tracer->cookie);
77
+ tracer->cookie = NULL;
78
+ }
79
+ free(tracer);
80
+ }
81
+ }
82
+
83
+ void zipkin_report(lcbtrace_TRACER *tracer, lcbtrace_SPAN *span)
84
+ {
85
+ zipkin_state *state = NULL;
86
+
87
+ if (tracer == NULL) {
88
+ return;
89
+ }
90
+ state = tracer->cookie;
91
+ if (state == NULL) {
92
+ return;
93
+ }
94
+ if (rand() % 100 > state->sample_rate) {
95
+ return;
96
+ }
97
+
98
+ {
99
+ #define BUFSZ 1000
100
+ size_t nbuf = BUFSZ;
101
+ char *buf;
102
+ lcbtrace_SPAN *parent;
103
+ uint64_t start;
104
+ zipkin_payload *payload = calloc(1, sizeof(zipkin_payload));
105
+ cJSON *json = cJSON_CreateObject();
106
+
107
+ buf = calloc(nbuf, sizeof(char));
108
+ cJSON_AddItemToObject(json, "name", cJSON_CreateString(lcbtrace_span_get_operation(span)));
109
+ snprintf(buf, nbuf, "%" PRIx64, lcbtrace_span_get_span_id(span));
110
+ cJSON_AddItemToObject(json, "id", cJSON_CreateString(buf));
111
+ snprintf(buf, nbuf, "%" PRIx64, lcbtrace_span_get_trace_id(span));
112
+ cJSON_AddItemToObject(json, "traceId", cJSON_CreateString(buf));
113
+ parent = lcbtrace_span_get_parent(span);
114
+ if (parent) {
115
+ snprintf(buf, nbuf, "%" PRIx64, lcbtrace_span_get_trace_id(parent));
116
+ cJSON_AddItemToObject(json, "parentId", cJSON_CreateString(buf));
117
+ }
118
+ start = lcbtrace_span_get_start_ts(span);
119
+ cJSON_AddItemToObject(json, "timestamp", cJSON_CreateNumber(start));
120
+ cJSON_AddItemToObject(json, "duration", cJSON_CreateNumber(lcbtrace_span_get_finish_ts(span) - start));
121
+
122
+ {
123
+ cJSON *endpoint = cJSON_CreateObject();
124
+
125
+ nbuf = BUFSZ;
126
+ if (lcbtrace_span_get_tag_str(span, LCBTRACE_TAG_DB_TYPE, &buf, &nbuf) == LCB_SUCCESS) {
127
+ buf[nbuf] = '\0';
128
+ cJSON_AddItemToObject(endpoint, "serviceName", cJSON_CreateString(buf));
129
+ }
130
+ cJSON_AddItemToObject(json, "localEndpoint", endpoint);
131
+ }
132
+
133
+ {
134
+ cJSON *tags = cJSON_CreateObject();
135
+ uint64_t latency, operation_id;
136
+ if (lcbtrace_span_get_tag_uint64(span, LCBTRACE_TAG_PEER_LATENCY, &latency) == LCB_SUCCESS) {
137
+ cJSON_AddItemToObject(tags, LCBTRACE_TAG_PEER_LATENCY, cJSON_CreateNumber(latency));
138
+ }
139
+ if (lcbtrace_span_get_tag_uint64(span, LCBTRACE_TAG_OPERATION_ID, &operation_id) == LCB_SUCCESS) {
140
+ cJSON_AddItemToObject(tags, LCBTRACE_TAG_OPERATION_ID, cJSON_CreateNumber(operation_id));
141
+ }
142
+ nbuf = BUFSZ;
143
+ if (lcbtrace_span_get_tag_str(span, LCBTRACE_TAG_COMPONENT, &buf, &nbuf) == LCB_SUCCESS) {
144
+ buf[nbuf] = '\0';
145
+ cJSON_AddItemToObject(tags, LCBTRACE_TAG_COMPONENT, cJSON_CreateString(buf));
146
+ }
147
+ nbuf = BUFSZ;
148
+ if (lcbtrace_span_get_tag_str(span, LCBTRACE_TAG_PEER_ADDRESS, &buf, &nbuf) == LCB_SUCCESS) {
149
+ buf[nbuf] = '\0';
150
+ cJSON_AddItemToObject(tags, LCBTRACE_TAG_PEER_ADDRESS, cJSON_CreateString(buf));
151
+ }
152
+ nbuf = BUFSZ;
153
+ if (lcbtrace_span_get_tag_str(span, LCBTRACE_TAG_LOCAL_ADDRESS, &buf, &nbuf) == LCB_SUCCESS) {
154
+ buf[nbuf] = '\0';
155
+ cJSON_AddItemToObject(tags, LCBTRACE_TAG_LOCAL_ADDRESS, cJSON_CreateString(buf));
156
+ }
157
+ nbuf = BUFSZ;
158
+ if (lcbtrace_span_get_tag_str(span, LCBTRACE_TAG_DB_INSTANCE, &buf, &nbuf) == LCB_SUCCESS) {
159
+ buf[nbuf] = '\0';
160
+ cJSON_AddItemToObject(tags, LCBTRACE_TAG_DB_INSTANCE, cJSON_CreateString(buf));
161
+ }
162
+ if (cJSON_GetArraySize(tags) > 0) {
163
+ cJSON_AddItemToObject(json, "tags", tags);
164
+ } else {
165
+ cJSON_Delete(tags);
166
+ }
167
+ }
168
+ free(buf);
169
+
170
+ payload->data = cJSON_PrintUnformatted(json);
171
+ cJSON_Delete(json);
172
+ if (state->last) {
173
+ state->last->next = payload;
174
+ }
175
+ state->last = payload;
176
+ state->content_length += strlen(payload->data) + 1; /* for comma/closing bracket */
177
+ if (state->root == NULL) {
178
+ state->root = payload;
179
+ }
180
+ }
181
+ }
182
+
183
+ void loop_send(int sock, char *bytes, ssize_t nbytes)
184
+ {
185
+ do {
186
+ ssize_t rv = send(sock, bytes, nbytes, 0);
187
+ if (rv < 0) {
188
+ perror("failed to send data to zipkin: ");
189
+ exit(EXIT_FAILURE);
190
+ } else if (rv < nbytes) {
191
+ nbytes -= rv;
192
+ bytes += rv;
193
+ continue;
194
+ }
195
+ break;
196
+ } while (1);
197
+ }
198
+
199
+ void zipkin_flush(lcbtrace_TRACER *tracer)
200
+ {
201
+ zipkin_state *state = NULL;
202
+ int sock, rv;
203
+
204
+ if (tracer == NULL) {
205
+ return;
206
+ }
207
+ state = tracer->cookie;
208
+ if (state == NULL) {
209
+ return;
210
+ }
211
+ if (state->root == NULL || state->content_length == 0) {
212
+ return;
213
+ }
214
+ {
215
+ struct addrinfo hints, *addr, *a;
216
+
217
+ memset(&hints, 0, sizeof(hints));
218
+ hints.ai_family = AF_UNSPEC;
219
+ hints.ai_socktype = SOCK_STREAM;
220
+ rv = getaddrinfo(state->json_api_host, state->json_api_port, &hints, &addr);
221
+ if (rv != 0) {
222
+ fprintf(stderr, "failed to resolve zipkin address getaddrinfo: %s\n", gai_strerror(rv));
223
+ exit(EXIT_FAILURE);
224
+ }
225
+ for (a = addr; a != NULL; a = a->ai_next) {
226
+ sock = socket(a->ai_family, a->ai_socktype, a->ai_protocol);
227
+ if (sock == -1) {
228
+ perror("failed to create socket for zipkin: ");
229
+ continue;
230
+ }
231
+ rv = connect(sock, a->ai_addr, a->ai_addrlen);
232
+ if (rv == -1) {
233
+ perror("failed to connect socket for zipkin: ");
234
+ continue;
235
+ }
236
+ break;
237
+ }
238
+ if (a == NULL) {
239
+ fprintf(stderr, "unable to connect to zipkin. terminating\n");
240
+ exit(EXIT_FAILURE);
241
+ }
242
+ freeaddrinfo(addr);
243
+ }
244
+ {
245
+ char preamble[1000] = "";
246
+ size_t size;
247
+
248
+ snprintf(preamble, sizeof(preamble),
249
+ "POST /api/v2/spans HTTP/1.1\r\n"
250
+ "Content-Type: application/json\r\n"
251
+ "Accept: */*\r\n"
252
+ "Connection: close\r\n"
253
+ "Host: %s:%s\r\n"
254
+ "Content-Length: %ld\r\n\r\n",
255
+ state->json_api_host, state->json_api_port, (long)state->content_length + 1 /* for open bracket */);
256
+ size = strlen(preamble);
257
+
258
+ rv = send(sock, preamble, size, 0);
259
+ if (rv == -1) {
260
+ perror("failed to send HTTP headers to zipkin: ");
261
+ exit(EXIT_FAILURE);
262
+ }
263
+ }
264
+ {
265
+ zipkin_payload *ptr = state->root;
266
+ loop_send(sock, "[", 1);
267
+ while (ptr) {
268
+ zipkin_payload *tmp = ptr;
269
+ loop_send(sock, ptr->data, strlen(ptr->data));
270
+ ptr = ptr->next;
271
+ if (ptr) {
272
+ loop_send(sock, ",", 1);
273
+ }
274
+ free(tmp->data);
275
+ free(tmp);
276
+ }
277
+ loop_send(sock, "]", 1);
278
+ }
279
+ close(sock);
280
+ state->root = state->last = NULL;
281
+ state->content_length = 0;
282
+ }
283
+
284
+ lcbtrace_TRACER *zipkin_new()
285
+ {
286
+ lcbtrace_TRACER *tracer = calloc(1, sizeof(lcbtrace_TRACER));
287
+ zipkin_state *zipkin = calloc(1, sizeof(zipkin_state));
288
+ tracer->destructor = zipkin_destructor;
289
+ tracer->flags = 0;
290
+ tracer->version = 0;
291
+ tracer->v.v0.report = zipkin_report;
292
+ zipkin->json_api_host = "localhost";
293
+ zipkin->json_api_port = "9411";
294
+ zipkin->sample_rate = 100;
295
+ zipkin->root = NULL;
296
+ zipkin->last = NULL;
297
+ zipkin->content_length = 0;
298
+ tracer->cookie = zipkin;
299
+ return tracer;
300
+ }
301
+
302
+ static void die(lcb_t instance, const char *msg, lcb_error_t err)
303
+ {
304
+ fprintf(stderr, "%s. Received code 0x%X (%s)\n", msg, err, lcb_strerror(instance, err));
305
+ exit(EXIT_FAILURE);
306
+ }
307
+
308
+ static void op_callback(lcb_t instance, int cbtype, const lcb_RESPBASE *rb)
309
+ {
310
+ fprintf(stderr, "=== %s ===\n", lcb_strcbtype(cbtype));
311
+ if (rb->rc == LCB_SUCCESS) {
312
+ fprintf(stderr, "KEY: %.*s\n", (int)rb->nkey, rb->key);
313
+ fprintf(stderr, "CAS: 0x%" PRIx64 "\n", rb->cas);
314
+ if (cbtype == LCB_CALLBACK_GET) {
315
+ const lcb_RESPGET *rg = (const lcb_RESPGET *)rb;
316
+ fprintf(stderr, "VALUE: %.*s\n", (int)rg->nvalue, rg->value);
317
+ fprintf(stderr, "FLAGS: 0x%x\n", rg->itmflags);
318
+ }
319
+ } else {
320
+ die(instance, lcb_strcbtype(cbtype), rb->rc);
321
+ }
322
+ }
323
+
324
+ static void view_callback(lcb_t instance, int cbtype, const lcb_RESPVIEWQUERY *rv)
325
+ {
326
+ if (rv->rflags & LCB_RESP_F_FINAL) {
327
+ printf("*** META FROM VIEWS ***\n");
328
+ fprintf(stderr, "%.*s\n", (int)rv->nvalue, rv->value);
329
+ return;
330
+ }
331
+
332
+ printf("Got row callback from LCB: RC=0x%X, DOCID=%.*s. KEY=%.*s\n", rv->rc, (int)rv->ndocid, rv->docid,
333
+ (int)rv->nkey, rv->key);
334
+
335
+ if (rv->docresp) {
336
+ printf(" Document for response. RC=0x%X. CAS=0x%" PRIx64 "\n", rv->docresp->rc, rv->docresp->cas);
337
+ }
338
+ }
339
+
340
+ int main(int argc, char *argv[])
341
+ {
342
+ lcb_error_t err;
343
+ lcb_t instance;
344
+ struct lcb_create_st create_options = {0};
345
+ lcb_CMDSTORE scmd = {0};
346
+ lcb_CMDGET gcmd = {0};
347
+ lcbtrace_SPAN *span = NULL;
348
+ lcbtrace_TRACER *tracer = NULL;
349
+
350
+ create_options.version = 3;
351
+
352
+ if (argc < 2) {
353
+ fprintf(stderr, "Usage: %s couchbase://host/bucket [ password [ username ] ]\n", argv[0]);
354
+ exit(EXIT_FAILURE);
355
+ }
356
+
357
+ create_options.v.v3.connstr = argv[1];
358
+ if (argc > 2) {
359
+ create_options.v.v3.passwd = argv[2];
360
+ }
361
+ if (argc > 3) {
362
+ create_options.v.v3.username = argv[3];
363
+ }
364
+
365
+ srand(time(NULL));
366
+
367
+ err = lcb_create(&instance, &create_options);
368
+ if (err != LCB_SUCCESS) {
369
+ die(NULL, "Couldn't create couchbase handle", err);
370
+ }
371
+
372
+ err = lcb_connect(instance);
373
+ if (err != LCB_SUCCESS) {
374
+ die(instance, "Couldn't schedule connection", err);
375
+ }
376
+
377
+ lcb_wait(instance);
378
+
379
+ err = lcb_get_bootstrap_status(instance);
380
+ if (err != LCB_SUCCESS) {
381
+ die(instance, "Couldn't bootstrap from cluster", err);
382
+ }
383
+
384
+ /* Assign the handlers to be called for the operation types */
385
+ lcb_install_callback3(instance, LCB_CALLBACK_GET, op_callback);
386
+ lcb_install_callback3(instance, LCB_CALLBACK_STORE, op_callback);
387
+
388
+ tracer = zipkin_new();
389
+
390
+ lcb_set_tracer(instance, tracer);
391
+
392
+ span = lcbtrace_span_start(tracer, "transaction", 0, NULL);
393
+ lcbtrace_span_add_tag_str(span, LCBTRACE_TAG_COMPONENT, COMPONENT_NAME);
394
+
395
+ {
396
+ int encoding_time_us = rand() % 1000;
397
+ lcbtrace_SPAN *encoding;
398
+ lcbtrace_REF ref;
399
+
400
+ ref.type = LCBTRACE_REF_CHILD_OF;
401
+ ref.span = span;
402
+
403
+ encoding = lcbtrace_span_start(tracer, LCBTRACE_OP_REQUEST_ENCODING, 0, &ref);
404
+ lcbtrace_span_add_tag_str(encoding, LCBTRACE_TAG_COMPONENT, COMPONENT_NAME);
405
+ usleep(encoding_time_us);
406
+ lcbtrace_span_finish(encoding, LCBTRACE_NOW);
407
+ }
408
+
409
+ lcb_CMDVIEWQUERY vcmd = {0};
410
+ char *doc_name = "beer";
411
+ char *view_name = "by_location";
412
+ char *options = "reduce=false&limit=3";
413
+
414
+ vcmd.callback = view_callback;
415
+ vcmd.ddoc = doc_name;
416
+ vcmd.nddoc = strlen(doc_name);
417
+ vcmd.view = view_name;
418
+ vcmd.nview = strlen(view_name);
419
+ vcmd.optstr = options;
420
+ vcmd.noptstr = strlen(options);
421
+ vcmd.cmdflags = LCB_CMDVIEWQUERY_F_INCLUDE_DOCS;
422
+
423
+ lcb_VIEWHANDLE handle;
424
+ vcmd.handle = &handle;
425
+
426
+ err = lcb_view_query(instance, NULL, &vcmd);
427
+ if (err != LCB_SUCCESS) {
428
+ die(instance, "Couldn't schedule view operation", err);
429
+ }
430
+ lcb_view_set_parent_span(instance, handle, span);
431
+
432
+ /* The store_callback is invoked from lcb_wait() */
433
+ fprintf(stderr, "Will wait for view operation to complete..\n");
434
+ lcb_wait(instance);
435
+
436
+ lcbtrace_span_finish(span, LCBTRACE_NOW);
437
+
438
+ zipkin_flush(tracer);
439
+
440
+ /* Now that we're all done, close down the connection handle */
441
+ lcb_destroy(instance);
442
+
443
+ return 0;
444
+ }
@@ -1,3 +1,20 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2017-2018 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
+
1
18
  #ifndef LCB_AUTH_H
2
19
  #define LCB_AUTH_H
3
20
 
@@ -178,7 +195,7 @@ void
178
195
  lcbauth_ref(lcb_AUTHENTICATOR *auth);
179
196
 
180
197
  /**
181
- * @uncomitted
198
+ * @uncommitted
182
199
  *
183
200
  * Decrements the refcount on the authenticator object, freeing it if there
184
201
  * are no more owners.
@@ -190,7 +207,7 @@ void
190
207
  lcbauth_unref(lcb_AUTHENTICATOR *auth);
191
208
 
192
209
  /**
193
- * @uncomitted
210
+ * @uncommitted
194
211
  *
195
212
  * Makes a copy of an existing lcb_AUTHENTICATOR object. The returned
196
213
  * authenticator object has a reference count of 1.
@@ -204,6 +221,33 @@ LIBCOUCHBASE_API
204
221
  lcb_AUTHENTICATOR *
205
222
  lcbauth_clone(const lcb_AUTHENTICATOR *src);
206
223
 
224
+ /**
225
+ * @private
226
+ *
227
+ * Callback invoked for LCBAUTH_MODE_DYNAMIC type of authenticator.
228
+ *
229
+ * @param cookie The opaque pointer, configured during callbacks setup.
230
+ * @param host The hostname of the service.
231
+ * @param port The port of the service.
232
+ * @param bucket The bucket name.
233
+ * @return password or username, depending on where the callback used
234
+ */
235
+ typedef const char *(*lcb_AUTHCALLBACK)(void *cookie, const char *host, const char *port, const char *bucket);
236
+
237
+ /**
238
+ * @private
239
+ *
240
+ * Sets callback, which will be invoked every time the library needs credentials.
241
+ *
242
+ * @param auth
243
+ * @param cookie the opaque pointer, which will be passed to callbacks
244
+ * @param usercb the callback, which should return user name
245
+ * @param passcb the callback, which should return user name
246
+ */
247
+ LIBCOUCHBASE_API
248
+ lcb_error_t lcbauth_set_callbacks(lcb_AUTHENTICATOR *auth, void *cookie, lcb_AUTHCALLBACK usercb,
249
+ lcb_AUTHCALLBACK passcb);
250
+
207
251
  typedef enum {
208
252
  /**
209
253
  * Use "bucket-specific" credentials when authenticating. This is the
@@ -218,11 +262,19 @@ typedef enum {
218
262
  * Note that if this option is selected, it becomes impossible to use
219
263
  * @ref LCBAUTH_F_BUCKET with lcbauth_add_pass()
220
264
  */
221
- LCBAUTH_MODE_RBAC = 1
265
+ LCBAUTH_MODE_RBAC = 1,
266
+
267
+ /**
268
+ * @private
269
+ *
270
+ * This mode allows to supply username/password with user-specified
271
+ * callback. See lcbauth_set_callback().
272
+ */
273
+ LCBAUTH_MODE_DYNAMIC = 2
222
274
  } lcbauth_MODE;
223
275
 
224
276
  /**
225
- * @uncomitted
277
+ * @uncommitted
226
278
  *
227
279
  * Set the mode of this authenticator.
228
280
  * @param src the authenticator