couchbase 3.0.0.alpha.1 → 3.0.0.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
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
+ }