couchbase 3.0.0.alpha.1-universal-darwin-19 → 3.0.0.alpha.2-universal-darwin-19

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 (176) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests-6.0.3.yml +49 -0
  3. data/.github/workflows/tests.yml +47 -0
  4. data/.gitmodules +3 -0
  5. data/.idea/dictionaries/gem_terms.xml +5 -0
  6. data/.idea/inspectionProfiles/Project_Default.xml +1 -0
  7. data/.idea/vcs.xml +1 -0
  8. data/Gemfile +1 -0
  9. data/README.md +55 -2
  10. data/Rakefile +18 -0
  11. data/bin/init-cluster +62 -0
  12. data/bin/setup +1 -0
  13. data/couchbase.gemspec +3 -2
  14. data/examples/crud.rb +1 -2
  15. data/examples/managing_buckets.rb +47 -0
  16. data/examples/managing_collections.rb +58 -0
  17. data/examples/managing_query_indexes.rb +63 -0
  18. data/examples/query.rb +3 -2
  19. data/examples/query_with_consistency.rb +76 -0
  20. data/examples/subdocument.rb +23 -1
  21. data/ext/.clang-format +1 -1
  22. data/ext/.idea/dictionaries/couchbase_terms.xml +2 -0
  23. data/ext/.idea/vcs.xml +1 -0
  24. data/ext/CMakeLists.txt +30 -12
  25. data/ext/build_version.hxx.in +26 -0
  26. data/ext/couchbase/bucket.hxx +69 -8
  27. data/ext/couchbase/cluster.hxx +70 -54
  28. data/ext/couchbase/collections_manifest.hxx +3 -3
  29. data/ext/couchbase/configuration.hxx +14 -0
  30. data/ext/couchbase/couchbase.cxx +2044 -383
  31. data/ext/couchbase/{operations/document_id.hxx → document_id.hxx} +5 -4
  32. data/ext/couchbase/io/http_message.hxx +5 -1
  33. data/ext/couchbase/io/http_parser.hxx +2 -1
  34. data/ext/couchbase/io/http_session.hxx +6 -3
  35. data/ext/couchbase/io/{binary_message.hxx → mcbp_message.hxx} +15 -12
  36. data/ext/couchbase/io/mcbp_parser.hxx +99 -0
  37. data/ext/couchbase/io/{key_value_session.hxx → mcbp_session.hxx} +200 -95
  38. data/ext/couchbase/io/session_manager.hxx +37 -22
  39. data/ext/couchbase/mutation_token.hxx +2 -1
  40. data/ext/couchbase/operations.hxx +38 -8
  41. data/ext/couchbase/operations/bucket_create.hxx +138 -0
  42. data/ext/couchbase/operations/bucket_drop.hxx +65 -0
  43. data/ext/couchbase/operations/bucket_flush.hxx +65 -0
  44. data/ext/couchbase/operations/bucket_get.hxx +69 -0
  45. data/ext/couchbase/operations/bucket_get_all.hxx +62 -0
  46. data/ext/couchbase/operations/bucket_settings.hxx +111 -0
  47. data/ext/couchbase/operations/bucket_update.hxx +115 -0
  48. data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +60 -0
  49. data/ext/couchbase/operations/collection_create.hxx +86 -0
  50. data/ext/couchbase/operations/collection_drop.hxx +82 -0
  51. data/ext/couchbase/operations/command.hxx +10 -10
  52. data/ext/couchbase/operations/document_decrement.hxx +80 -0
  53. data/ext/couchbase/operations/document_exists.hxx +80 -0
  54. data/ext/couchbase/operations/{get.hxx → document_get.hxx} +4 -2
  55. data/ext/couchbase/operations/document_get_and_lock.hxx +64 -0
  56. data/ext/couchbase/operations/document_get_and_touch.hxx +64 -0
  57. data/ext/couchbase/operations/document_increment.hxx +80 -0
  58. data/ext/couchbase/operations/document_insert.hxx +74 -0
  59. data/ext/couchbase/operations/{lookup_in.hxx → document_lookup_in.hxx} +2 -2
  60. data/ext/couchbase/operations/{mutate_in.hxx → document_mutate_in.hxx} +11 -2
  61. data/ext/couchbase/operations/{query.hxx → document_query.hxx} +101 -6
  62. data/ext/couchbase/operations/document_remove.hxx +67 -0
  63. data/ext/couchbase/operations/document_replace.hxx +76 -0
  64. data/ext/couchbase/operations/{upsert.hxx → document_touch.hxx} +14 -14
  65. data/ext/couchbase/operations/{remove.hxx → document_unlock.hxx} +12 -10
  66. data/ext/couchbase/operations/document_upsert.hxx +74 -0
  67. data/ext/couchbase/operations/query_index_build_deferred.hxx +85 -0
  68. data/ext/couchbase/operations/query_index_create.hxx +134 -0
  69. data/ext/couchbase/operations/query_index_drop.hxx +108 -0
  70. data/ext/couchbase/operations/query_index_get_all.hxx +106 -0
  71. data/ext/couchbase/operations/scope_create.hxx +81 -0
  72. data/ext/couchbase/operations/scope_drop.hxx +79 -0
  73. data/ext/couchbase/operations/scope_get_all.hxx +72 -0
  74. data/ext/couchbase/protocol/client_opcode.hxx +35 -0
  75. data/ext/couchbase/protocol/client_request.hxx +56 -9
  76. data/ext/couchbase/protocol/client_response.hxx +52 -15
  77. data/ext/couchbase/protocol/cmd_cluster_map_change_notification.hxx +81 -0
  78. data/ext/couchbase/protocol/cmd_decrement.hxx +187 -0
  79. data/ext/couchbase/protocol/cmd_exists.hxx +171 -0
  80. data/ext/couchbase/protocol/cmd_get.hxx +31 -8
  81. data/ext/couchbase/protocol/cmd_get_and_lock.hxx +142 -0
  82. data/ext/couchbase/protocol/cmd_get_and_touch.hxx +142 -0
  83. data/ext/couchbase/protocol/cmd_get_cluster_config.hxx +16 -3
  84. data/ext/couchbase/protocol/cmd_get_collections_manifest.hxx +16 -3
  85. data/ext/couchbase/protocol/cmd_get_error_map.hxx +16 -3
  86. data/ext/couchbase/protocol/cmd_hello.hxx +24 -8
  87. data/ext/couchbase/protocol/cmd_increment.hxx +187 -0
  88. data/ext/couchbase/protocol/cmd_info.hxx +1 -0
  89. data/ext/couchbase/protocol/cmd_insert.hxx +172 -0
  90. data/ext/couchbase/protocol/cmd_lookup_in.hxx +28 -13
  91. data/ext/couchbase/protocol/cmd_mutate_in.hxx +65 -13
  92. data/ext/couchbase/protocol/cmd_remove.hxx +59 -4
  93. data/ext/couchbase/protocol/cmd_replace.hxx +172 -0
  94. data/ext/couchbase/protocol/cmd_sasl_auth.hxx +15 -3
  95. data/ext/couchbase/protocol/cmd_sasl_list_mechs.hxx +15 -3
  96. data/ext/couchbase/protocol/cmd_sasl_step.hxx +15 -3
  97. data/ext/couchbase/protocol/cmd_select_bucket.hxx +14 -2
  98. data/ext/couchbase/protocol/cmd_touch.hxx +102 -0
  99. data/ext/couchbase/protocol/cmd_unlock.hxx +95 -0
  100. data/ext/couchbase/protocol/cmd_upsert.hxx +50 -14
  101. data/ext/couchbase/protocol/durability_level.hxx +67 -0
  102. data/ext/couchbase/protocol/frame_info_id.hxx +187 -0
  103. data/ext/couchbase/protocol/hello_feature.hxx +137 -0
  104. data/ext/couchbase/protocol/server_opcode.hxx +57 -0
  105. data/ext/couchbase/protocol/server_request.hxx +122 -0
  106. data/ext/couchbase/protocol/unsigned_leb128.h +15 -15
  107. data/ext/couchbase/utils/byteswap.hxx +1 -2
  108. data/ext/couchbase/utils/url_codec.hxx +225 -0
  109. data/ext/couchbase/version.hxx +3 -1
  110. data/ext/extconf.rb +4 -1
  111. data/ext/test/main.cxx +37 -113
  112. data/ext/third_party/snappy/.appveyor.yml +36 -0
  113. data/ext/third_party/snappy/.gitignore +8 -0
  114. data/ext/third_party/snappy/.travis.yml +98 -0
  115. data/ext/third_party/snappy/AUTHORS +1 -0
  116. data/ext/third_party/snappy/CMakeLists.txt +345 -0
  117. data/ext/third_party/snappy/CONTRIBUTING.md +26 -0
  118. data/ext/third_party/snappy/COPYING +54 -0
  119. data/ext/third_party/snappy/NEWS +188 -0
  120. data/ext/third_party/snappy/README.md +148 -0
  121. data/ext/third_party/snappy/cmake/SnappyConfig.cmake.in +33 -0
  122. data/ext/third_party/snappy/cmake/config.h.in +59 -0
  123. data/ext/third_party/snappy/docs/README.md +72 -0
  124. data/ext/third_party/snappy/format_description.txt +110 -0
  125. data/ext/third_party/snappy/framing_format.txt +135 -0
  126. data/ext/third_party/snappy/snappy-c.cc +90 -0
  127. data/ext/third_party/snappy/snappy-c.h +138 -0
  128. data/ext/third_party/snappy/snappy-internal.h +315 -0
  129. data/ext/third_party/snappy/snappy-sinksource.cc +121 -0
  130. data/ext/third_party/snappy/snappy-sinksource.h +182 -0
  131. data/ext/third_party/snappy/snappy-stubs-internal.cc +42 -0
  132. data/ext/third_party/snappy/snappy-stubs-internal.h +493 -0
  133. data/ext/third_party/snappy/snappy-stubs-public.h.in +63 -0
  134. data/ext/third_party/snappy/snappy-test.cc +613 -0
  135. data/ext/third_party/snappy/snappy-test.h +526 -0
  136. data/ext/third_party/snappy/snappy.cc +1770 -0
  137. data/ext/third_party/snappy/snappy.h +209 -0
  138. data/ext/third_party/snappy/snappy_compress_fuzzer.cc +60 -0
  139. data/ext/third_party/snappy/snappy_uncompress_fuzzer.cc +58 -0
  140. data/ext/third_party/snappy/snappy_unittest.cc +1512 -0
  141. data/ext/third_party/snappy/testdata/alice29.txt +3609 -0
  142. data/ext/third_party/snappy/testdata/asyoulik.txt +4122 -0
  143. data/ext/third_party/snappy/testdata/baddata1.snappy +0 -0
  144. data/ext/third_party/snappy/testdata/baddata2.snappy +0 -0
  145. data/ext/third_party/snappy/testdata/baddata3.snappy +0 -0
  146. data/ext/third_party/snappy/testdata/fireworks.jpeg +0 -0
  147. data/ext/third_party/snappy/testdata/geo.protodata +0 -0
  148. data/ext/third_party/snappy/testdata/html +1 -0
  149. data/ext/third_party/snappy/testdata/html_x_4 +1 -0
  150. data/ext/third_party/snappy/testdata/kppkn.gtb +0 -0
  151. data/ext/third_party/snappy/testdata/lcet10.txt +7519 -0
  152. data/ext/third_party/snappy/testdata/paper-100k.pdf +600 -2
  153. data/ext/third_party/snappy/testdata/plrabn12.txt +10699 -0
  154. data/ext/third_party/snappy/testdata/urls.10K +10000 -0
  155. data/lib/couchbase/binary_collection.rb +33 -76
  156. data/lib/couchbase/binary_collection_options.rb +94 -0
  157. data/lib/couchbase/bucket.rb +9 -3
  158. data/lib/couchbase/cluster.rb +161 -23
  159. data/lib/couchbase/collection.rb +108 -191
  160. data/lib/couchbase/collection_options.rb +430 -0
  161. data/lib/couchbase/errors.rb +136 -134
  162. data/lib/couchbase/json_transcoder.rb +32 -0
  163. data/lib/couchbase/management/analytics_index_manager.rb +185 -9
  164. data/lib/couchbase/management/bucket_manager.rb +84 -33
  165. data/lib/couchbase/management/collection_manager.rb +166 -1
  166. data/lib/couchbase/management/query_index_manager.rb +261 -0
  167. data/lib/couchbase/management/search_index_manager.rb +291 -0
  168. data/lib/couchbase/management/user_manager.rb +12 -10
  169. data/lib/couchbase/management/view_index_manager.rb +151 -1
  170. data/lib/couchbase/mutation_state.rb +11 -1
  171. data/lib/couchbase/scope.rb +4 -4
  172. data/lib/couchbase/version.rb +1 -1
  173. metadata +113 -18
  174. data/.travis.yml +0 -7
  175. data/ext/couchbase/io/binary_parser.hxx +0 -64
  176. data/lib/couchbase/results.rb +0 -307
@@ -49,14 +49,14 @@ template
49
49
  typename std::enable_if<std::is_unsigned<T>::value, std::pair<T, std::string_view>>::type
50
50
  decode_unsigned_leb128(std::string_view buf, struct Leb128NoThrow)
51
51
  {
52
- T rv = static_cast<uint8_t>(buf[0]) & 0x7full;
52
+ T rv = static_cast<uint8_t>(buf[0]) & 0x7fULL;
53
53
  size_t end = 0;
54
- if ((buf[0] & 0x80) == 0x80ull) {
54
+ if ((buf[0] & 0x80) == 0x80ULL) {
55
55
  T shift = 7;
56
56
  // shift in the remaining data
57
57
  for (end = 1; end < buf.size(); end++) {
58
- rv |= (buf[end] & 0x7full) << shift;
59
- if ((static_cast<uint8_t>(buf[end]) & 0x80ull) == 0) {
58
+ rv |= (buf[end] & 0x7fULL) << shift;
59
+ if ((static_cast<uint8_t>(buf[end]) & 0x80ULL) == 0) {
60
60
  break; // no more
61
61
  }
62
62
  shift += 7;
@@ -112,7 +112,7 @@ unsigned_leb128_get_stop_byte_index(std::string_view buf)
112
112
  // If buf does not contain a stop-byte, invalid
113
113
  size_t stopByte = 0;
114
114
  for (auto c : buf) {
115
- if ((static_cast<uint8_t>(c) & 0x80ull) == 0) {
115
+ if ((static_cast<uint8_t>(c) & 0x80ULL) == 0) {
116
116
  return stopByte;
117
117
  }
118
118
  stopByte++;
@@ -134,45 +134,45 @@ template
134
134
  class unsigned_leb128<T, typename std::enable_if<std::is_unsigned<T>::value>::type>
135
135
  {
136
136
  public:
137
- unsigned_leb128(T in)
137
+ explicit unsigned_leb128(T in)
138
138
  {
139
139
  while (in > 0) {
140
- auto byte = gsl::narrow_cast<uint8_t>(in & 0x7full);
140
+ auto byte = gsl::narrow_cast<uint8_t>(in & 0x7fULL);
141
141
  in >>= 7;
142
142
 
143
143
  // In has more data?
144
144
  if (in > 0) {
145
145
  byte |= 0x80;
146
- encodedData[encodedSize - 1] = byte;
146
+ encodedData[encodedSize - 1U] = byte;
147
147
  // Increase the size
148
148
  encodedSize++;
149
149
  } else {
150
- encodedData[encodedSize - 1] = byte;
150
+ encodedData[encodedSize - 1U] = byte;
151
151
  }
152
152
  }
153
153
  }
154
154
 
155
- std::string_view get() const
155
+ [[nodiscard]] std::string get() const
156
156
  {
157
- return { encodedData.data(), encodedSize };
157
+ return { begin(), end() };
158
158
  }
159
159
 
160
- const uint8_t* begin() const
160
+ [[nodiscard]] const uint8_t* begin() const
161
161
  {
162
162
  return encodedData.data();
163
163
  }
164
164
 
165
- const uint8_t* end() const
165
+ [[nodiscard]] const uint8_t* end() const
166
166
  {
167
167
  return encodedData.data() + encodedSize;
168
168
  }
169
169
 
170
- const uint8_t* data() const
170
+ [[nodiscard]] const uint8_t* data() const
171
171
  {
172
172
  return encodedData.data();
173
173
  }
174
174
 
175
- size_t size() const
175
+ [[nodiscard]] size_t size() const
176
176
  {
177
177
  return encodedSize;
178
178
  }
@@ -22,7 +22,6 @@ namespace couchbase::utils
22
22
  static inline std::uint64_t
23
23
  byte_swap_64(std::uint64_t val)
24
24
  {
25
- ;
26
25
  std::uint64_t ret = 0U;
27
26
  for (std::size_t i = 0; i < sizeof(std::uint64_t); ++i) {
28
27
  ret <<= 8U;
@@ -31,4 +30,4 @@ byte_swap_64(std::uint64_t val)
31
30
  }
32
31
  return ret;
33
32
  }
34
- } // namespace couchbase::utils
33
+ } // namespace couchbase::utils
@@ -0,0 +1,225 @@
1
+ #pragma once
2
+
3
+ namespace couchbase::utils::string_codec
4
+ {
5
+ template<typename Ti, typename To>
6
+ bool
7
+ url_decode(Ti first, Ti last, To out, size_t& nout)
8
+ {
9
+ for (; first != last && *first != '\0'; ++first) {
10
+ if (*first == '%') {
11
+ char nextbuf[3] = { 0 };
12
+ size_t jj = 0;
13
+ first++;
14
+ nextbuf[0] = *first;
15
+ for (; first != last && jj < 2; ++jj) {
16
+ nextbuf[jj] = *first;
17
+ if (jj != 1) {
18
+ first++;
19
+ }
20
+ }
21
+ if (jj != 2) {
22
+ return false;
23
+ }
24
+
25
+ unsigned octet = 0;
26
+ if (sscanf(nextbuf, "%2X", &octet) != 1) {
27
+ return false;
28
+ }
29
+
30
+ *out = static_cast<char>(octet);
31
+ } else {
32
+ *out = *first;
33
+ }
34
+
35
+ out++;
36
+ nout++;
37
+ }
38
+ return true;
39
+ }
40
+
41
+ inline bool
42
+ url_decode(const char* input, char* output)
43
+ {
44
+ const char* endp = input + strlen(input);
45
+ size_t nout = 0;
46
+ if (url_decode(input, endp, output, nout)) {
47
+ output[nout] = '\0';
48
+ return true;
49
+ }
50
+ return false;
51
+ }
52
+
53
+ inline bool
54
+ url_decode(char* in_out)
55
+ {
56
+ return url_decode(in_out, in_out);
57
+ }
58
+
59
+ inline bool
60
+ url_decode(std::string& s)
61
+ {
62
+ size_t n = 0;
63
+ if (url_decode(s.begin(), s.end(), s.begin(), n)) {
64
+ s.resize(n);
65
+ return true;
66
+ }
67
+ return false;
68
+ }
69
+
70
+ namespace priv
71
+ {
72
+ inline bool
73
+ is_legal_uri_char(char c)
74
+ {
75
+ auto uc = static_cast<unsigned char>(c);
76
+ if ((isalpha(uc) != 0) || (isdigit(uc) != 0)) {
77
+ return true;
78
+ }
79
+ switch (uc) {
80
+ case '-':
81
+ case '_':
82
+ case '.':
83
+ case '~':
84
+ case '!':
85
+ case '*':
86
+ case '\'':
87
+ case '(':
88
+ case ')':
89
+ case ';':
90
+ case ':':
91
+ case '@':
92
+ case '&':
93
+ case '=':
94
+ case '+':
95
+ case '$':
96
+ case ',':
97
+ case '/':
98
+ case '?':
99
+ case '#':
100
+ case '[':
101
+ case ']':
102
+ return true;
103
+ default:
104
+ break;
105
+ }
106
+ return false;
107
+ }
108
+
109
+ template<typename T>
110
+ inline bool
111
+ is_already_escape(T first, T last)
112
+ {
113
+ first++; // ignore '%'
114
+ size_t jj;
115
+ for (jj = 0; first != last && jj < 2; ++jj, ++first) {
116
+ if (!isxdigit(*first)) {
117
+ return false;
118
+ }
119
+ }
120
+ return jj == 2;
121
+ }
122
+ } // namespace priv
123
+
124
+ template<typename Ti, typename To>
125
+ bool
126
+ url_encode(Ti first, Ti last, To& o, bool check_encoded = true)
127
+ {
128
+ // If re-encoding detection is enabled, this flag indicates not to
129
+ // re-encode
130
+ bool skip_encoding = false;
131
+
132
+ for (; first != last; ++first) {
133
+ if (!skip_encoding && check_encoded) {
134
+ if (*first == '%') {
135
+ skip_encoding = priv::is_already_escape(first, last);
136
+ } else if (*first == '+') {
137
+ skip_encoding = true;
138
+ }
139
+ }
140
+ if (skip_encoding || priv::is_legal_uri_char(*first)) {
141
+ if (skip_encoding && *first != '%' && !priv::is_legal_uri_char(*first)) {
142
+ return false;
143
+ }
144
+
145
+ o.insert(o.end(), first, first + 1);
146
+ } else {
147
+ unsigned int c = static_cast<unsigned char>(*first);
148
+ size_t numbytes = 0;
149
+
150
+ if ((c & 0x80) == 0) { /* ASCII character */
151
+ numbytes = 1;
152
+ } else if ((c & 0xE0) == 0xC0) { /* 110x xxxx */
153
+ numbytes = 2;
154
+ } else if ((c & 0xF0) == 0xE0) { /* 1110 xxxx */
155
+ numbytes = 3;
156
+ } else if ((c & 0xF8) == 0xF0) { /* 1111 0xxx */
157
+ numbytes = 4;
158
+ } else {
159
+ return false;
160
+ }
161
+
162
+ do {
163
+ char buf[4];
164
+ sprintf(buf, "%%%02X", static_cast<unsigned char>(*first));
165
+ o.insert(o.end(), &buf[0], &buf[0] + 3);
166
+ } while (--numbytes && ++first != last);
167
+ }
168
+ }
169
+ return true;
170
+ }
171
+
172
+ template<typename Tin, typename Tout>
173
+ bool
174
+ url_encode(const Tin& in, Tout& out)
175
+ {
176
+ return url_encode(in.begin(), in.end(), out);
177
+ }
178
+
179
+ /* See: https://url.spec.whatwg.org/#urlencoded-serializing: */
180
+ /*
181
+ * 0x2A
182
+ * 0x2D
183
+ * 0x2E
184
+ * 0x30 to 0x39
185
+ * 0x41 to 0x5A
186
+ * 0x5F
187
+ * 0x61 to 0x7A
188
+ * Append a code point whose value is byte to output.
189
+ * Otherwise
190
+ * Append byte, percent encoded, to output.
191
+ */
192
+ template<typename Ti, typename To>
193
+ void
194
+ form_encode(Ti first, Ti last, To& out)
195
+ {
196
+ for (; first != last; ++first) {
197
+ auto c = static_cast<unsigned char>(*first);
198
+ if (isalnum(c)) {
199
+ out.insert(out.end(), first, first + 1);
200
+ continue;
201
+ }
202
+ if (c == ' ') {
203
+ char tmp = '+';
204
+ out.insert(out.end(), &tmp, &tmp + 1);
205
+ } else if ((c == 0x2A || c == 0x2D || c == 0x2E) || (c >= 0x30 && c <= 0x39) || (c >= 0x41 && c <= 0x5A) || (c == 0x5F) ||
206
+ (c >= 0x60 && c <= 0x7A)) {
207
+ out.insert(out.end(), static_cast<char>(c));
208
+ } else {
209
+ char buf[3] = { 0 };
210
+ out.insert(out.end(), '%');
211
+ sprintf(buf, "%02X", c);
212
+ out.insert(out.end(), &buf[0], &buf[0] + 2);
213
+ }
214
+ }
215
+ }
216
+
217
+ std::string
218
+ form_encode(const std::string& src)
219
+ {
220
+ std::string dst;
221
+ form_encode(src.begin(), src.end(), dst);
222
+ return dst;
223
+ }
224
+
225
+ } // namespace couchbase::utils::string_codec
@@ -18,5 +18,7 @@
18
18
  #pragma once
19
19
 
20
20
  #define BACKEND_VERSION_MAJOR 0
21
- #define BACKEND_VERSION_MINOR 1
21
+ #define BACKEND_VERSION_MINOR 2
22
22
  #define BACKEND_VERSION_PATCH 0
23
+
24
+ #include <build_version.hxx>
@@ -12,6 +12,7 @@ def sys(*cmd)
12
12
  system(*cmd)
13
13
  end
14
14
 
15
+
15
16
  build_type = ENV["DEBUG"] ? "Debug" : "RelWithDebInfo"
16
17
  cmake_flags = [
17
18
  "-DCMAKE_BUILD_TYPE=#{build_type}",
@@ -19,9 +20,11 @@ cmake_flags = [
19
20
  "-DRUBY_ARCH_HDR_DIR=#{RbConfig::CONFIG["rubyarchhdrdir"]}",
20
21
  "-DTAOCPP_JSON_BUILD_TESTS=OFF",
21
22
  "-DTAOCPP_JSON_BUILD_EXAMPLES=OFF",
23
+ "-DSNAPPY_BUILD_TESTS=OFF",
24
+ "-DSNAPPY_INSTALL=OFF",
22
25
  ]
23
26
  openssl_root = `brew --prefix openssl 2> /dev/null`.strip
24
- if openssl_root
27
+ unless openssl_root.empty?
25
28
  cmake_flags << "-DOPENSSL_ROOT_DIR=#{openssl_root}"
26
29
  end
27
30
 
@@ -15,129 +15,53 @@
15
15
  * limitations under the License.
16
16
  */
17
17
 
18
- #include <asio.hpp>
18
+ #include <generated_config.hxx>
19
19
 
20
- #include <cluster.hxx>
20
+ #include <spdlog/spdlog.h>
21
21
 
22
- #include <errors.hxx>
23
- #include <operations/get.hxx>
24
- #include <operations/upsert.hxx>
25
- #include <operations/lookup_in.hxx>
26
- #include <operations/query.hxx>
22
+ #include <ruby.h>
27
23
 
28
- static int num_ops = 4;
29
-
30
- bool
31
- done()
24
+ void
25
+ run_script(const char* script)
32
26
  {
33
- --num_ops;
34
- spdlog::info("------ num_ops={}", num_ops);
35
- return num_ops == 0;
27
+ spdlog::info("run script:\n----------------------------------------{}---------------------------------------\n", script);
28
+ int status = 0;
29
+ rb_eval_string_protect(script, &status);
30
+ if (status != 0) {
31
+ VALUE rbError = rb_funcall(rb_gv_get("$!"), rb_intern("message"), 0);
32
+ spdlog::critical("ruby execution failure: {}", StringValuePtr(rbError));
33
+ exit(EXIT_FAILURE);
34
+ }
36
35
  }
37
36
 
38
37
  int
39
38
  main()
40
39
  {
41
- spdlog::set_level(spdlog::level::trace);
42
- spdlog::set_pattern("[%Y-%m-%d %T.%e] [%P,%t] [%^%l%$] %v");
43
- asio::io_context ctx;
40
+ ruby_init();
41
+ ruby_init_loadpath();
42
+
43
+ rb_require(LIBCOUCHBASE_EXT_PATH);
44
+ run_script(R"(
45
+ p Couchbase::VERSION
46
+ )");
44
47
 
45
- couchbase::cluster cluster{ ctx };
48
+ run_script(R"(
49
+ B = Couchbase::Backend.new
50
+ #B.open("192.168.42.101", "Administrator", "password")
51
+ B.open("localhost", "Administrator", "password")
52
+ )");
46
53
 
47
- couchbase::origin options;
48
- options.hostname = "192.168.42.103";
49
- options.hostname = "127.0.0.1";
50
- options.username = "Administrator";
51
- options.password = "password";
54
+ run_script(R"(
55
+ p B.open_bucket("default")
56
+ p B.document_increment("default", "_default._default", "foo", {:initial_value => 32, :expiration => 42})
57
+ p B.document_get("default", "_default._default", "foo")
58
+ p B.document_decrement("default", "_default._default", "foo", {:initial_value => 32, :expiration => 42})
59
+ )");
52
60
 
53
- // std::string bucket_name = "default";
54
- // std::string collection_name = "_default._default";
61
+ run_script(R"(
62
+ B.close
63
+ )");
55
64
 
56
- cluster.open(options, [&](std::error_code ec1) {
57
- spdlog::info("cluster has been opened: {}", ec1.message());
58
- couchbase::operations::query_request req{ "select random()" };
59
- cluster.execute(req, [&](couchbase::operations::query_response resp) {
60
- spdlog::info("QUERY {}: ec={}, body={}",
61
- couchbase::uuid::to_string(resp.client_context_id),
62
- resp.ec.message(),
63
- resp.payload.meta_data.metrics.result_size);
64
- for (auto &r : resp.payload.rows) {
65
- spdlog::info("ROW: {}", r);
66
- }
67
- if (resp.payload.meta_data.profile) {
68
- spdlog::info("PROFILE: {}", *resp.payload.meta_data.profile);
69
- }
70
- cluster.close();
71
- });
72
- #if 0
73
- cluster.open_bucket(bucket_name, [&](std::error_code ec2) {
74
- if (!ec2) {
75
- couchbase::operations::mutate_in_request req{
76
- couchbase::operations::document_id{ bucket_name, collection_name, "foo" },
77
- };
78
- req.specs.add_spec(couchbase::protocol::subdoc_opcode::dict_upsert, false, false, false, "test", R"({"name":"sergey"})");
79
- req.specs.add_spec(couchbase::protocol::subdoc_opcode::counter, false, false, false,"num", 24);
80
- cluster.execute(req, [&](couchbase::operations::mutate_in_response resp) {
81
- spdlog::info("MUTATE_IN {}: ec={}, cas={}, fields={}", resp.id, resp.ec.message(), resp.cas, resp.fields.size());
82
- size_t idx = 0;
83
- for (const auto& field : resp.fields) {
84
- spdlog::info(" {}. {}: {} {}", idx++, field.path, field.status, field.value);
85
- }
86
- // if (done()) {
87
- cluster.close();
88
- //}
89
- });
90
- couchbase::operations::lookup_in_request req{
91
- couchbase::operations::document_id{ bucket_name, collection_name, "foo" },
92
- };
93
- req.access_deleted = true;
94
- req.specs.add_spec(couchbase::protocol::subdoc_opcode::get, true, "$document");
95
- req.specs.add_spec(couchbase::protocol::subdoc_opcode::exists, false, "bar");
96
- req.specs.add_spec(couchbase::protocol::subdoc_opcode::get, false, "foo");
97
- cluster.execute(req, [&](couchbase::operations::lookup_in_response resp) {
98
- spdlog::info("LOOKUP_IN {}: ec={}, cas={}, fields={}", resp.id, resp.ec.message(), resp.cas, resp.fields.size());
99
- size_t idx = 0;
100
- for (const auto &field : resp.fields) {
101
- spdlog::info(" {}. {}{}: {}", idx++, field.path, field.exists ? "(hit) " : "(miss)", field.value);
102
- }
103
- //if (done()) {
104
- cluster.close();
105
- //}
106
- });
107
- cluster.execute(
108
- couchbase::operations::get_request{
109
- couchbase::operations::document_id{ bucket_name, collection_name, "foo" },
110
- },
111
- [&](couchbase::operations::get_response resp) {
112
- spdlog::info("GET {}: ec={}, cas={}\n{}", resp.id, resp.ec.message(), resp.cas, resp.value);
113
- if (done()) {
114
- cluster.close();
115
- }
116
- });
117
- cluster.execute(
118
- couchbase::operations::get_request{
119
- couchbase::operations::document_id{ bucket_name, collection_name, "bar" },
120
- },
121
- [&](couchbase::operations::get_response resp) {
122
- spdlog::info("GET {}: ec={}, cas={}\n{}", resp.id, resp.ec.message(), resp.cas, resp.value);
123
- if (done()) {
124
- cluster.close();
125
- }
126
- });
127
- cluster.execute(
128
- couchbase::operations::upsert_request{ couchbase::operations::document_id{ bucket_name, collection_name, "foo" },
129
- "{\"prop\":42}" },
130
- [&](couchbase::operations::upsert_response resp) {
131
- spdlog::info("UPSERT {}: ec={}, cas={}", resp.id, resp.ec.message(), resp.cas);
132
- if (done()) {
133
- cluster.close();
134
- }
135
- });
136
- } else {
137
- spdlog::info("unable to open the bucket: {}", ec2.message());
138
- }
139
- });
140
- #endif
141
- });
142
- ctx.run();
143
- }
65
+ ruby_finalize();
66
+ return 0;
67
+ }