couchbase 1.3.11-x64-mingw32 → 1.3.12-x64-mingw32

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2d45ec73f1d8fab38aed70d95d14f94503830c8c
4
- data.tar.gz: f673cd9e5045805acb7d15e4a49172cf602b50d5
3
+ metadata.gz: 39b9a10fb3689e666ec344cb759eab69513f6fec
4
+ data.tar.gz: 9af7110af4bd2db6acce0ffa496f0c372dbd9722
5
5
  SHA512:
6
- metadata.gz: ac62f56ddb0982073d1d52cb47fb81b2febcbb3b3b51cc933bb9e4b82aedd903c0770be48ee80f16f08c0faca090b631094932c530d9f6ead9bb18ef302f4be5
7
- data.tar.gz: 0f0d314f1100af6fd65f76609e192284d7f35590c544b0554d28aecac9fab9338e31920fc52e761d84e685486406b3c6a7f0fb2ae91d5c569cc19796f32d7095
6
+ metadata.gz: 1f86b66eefc29115410727c8842341de12064f022ffc394df4f15ef77e2df653fa4fef2ca5b1a785e0767e9131de2300b85c087bbdbae38d65160557b91e2ff5
7
+ data.tar.gz: 8bb88a836f5ca2f5a6567713c7ee7999057e5b94b64524cab597311e3c5fd381428ef9a5e1eb1bf55e432093fa45039d84875638c1434b3d6fda5337f42dae4d
@@ -3,6 +3,10 @@
3
3
  This document is a list of user visible feature changes and important
4
4
  bugfixes. Do not forget to update this doc in every important patch.
5
5
 
6
+ ## 1.3.12 (2015-04-21)
7
+
8
+ * [major] Experimental support of N1QL querires
9
+
6
10
  ## 1.3.11 (2015-01-08)
7
11
 
8
12
  * [minor] Update crossbuild system to use cmake for libcouchbase
@@ -32,6 +32,7 @@ VALUE cb_mDocument;
32
32
  VALUE cb_mPlain;
33
33
  VALUE cb_mMarshal;
34
34
  VALUE cb_mURI;
35
+ VALUE cb_mMultiJson;
35
36
  VALUE em_m;
36
37
 
37
38
  /* Symbols */
@@ -102,6 +103,8 @@ ID cb_sym_put;
102
103
  ID cb_sym_quiet;
103
104
  ID cb_sym_replace;
104
105
  ID cb_sym_replica;
106
+ ID cb_sym_rows;
107
+ ID cb_sym_meta;
105
108
  ID cb_sym_select;
106
109
  ID cb_sym_send_threshold;
107
110
  ID cb_sym_set;
@@ -132,6 +135,7 @@ ID cb_id_iv_error;
132
135
  ID cb_id_iv_flags;
133
136
  ID cb_id_iv_from_master;
134
137
  ID cb_id_iv_headers;
138
+ ID cb_id_iv_meta;
135
139
  ID cb_id_iv_inner_exception;
136
140
  ID cb_id_iv_key;
137
141
  ID cb_id_iv_node;
@@ -159,6 +163,7 @@ ID cb_id_verify_observe_options;
159
163
  VALUE cb_eBaseError;
160
164
  VALUE cb_eValueFormatError;
161
165
  VALUE cb_eHTTPError;
166
+ VALUE cb_eQuery;
162
167
 
163
168
  /* LCB_SUCCESS = 0x00 */
164
169
  /* LCB_AUTH_CONTINUE = 0x01 */
@@ -231,6 +236,7 @@ Init_couchbase_ext(void)
231
236
  /* just a holder for EventMachine module */
232
237
  em_m = 0;
233
238
 
239
+ cb_mMultiJson = rb_const_get(rb_cObject, rb_intern("MultiJson"));
234
240
  cb_mURI = rb_const_get(rb_cObject, rb_intern("URI"));
235
241
  cb_mCouchbase = rb_define_module("Couchbase");
236
242
  /* Document-method: libcouchbase_version
@@ -578,6 +584,15 @@ Init_couchbase_ext(void)
578
584
  */
579
585
  cb_eHTTPError = rb_define_class_under(cb_mError, "HTTP", cb_eBaseError);
580
586
  cb_id_iv_body = rb_intern("@body");
587
+
588
+ /* Document-class: Couchbase::Error::Query
589
+ * Query error with status code
590
+ *
591
+ * @since 1.2.0
592
+ */
593
+ cb_eQuery = rb_define_class_under(cb_mError, "Query", cb_eBaseError);
594
+ cb_id_iv_meta = rb_intern("@meta");
595
+
581
596
  /* Document-method: error
582
597
  *
583
598
  * The underlying libcouchbase library could return one of the following
@@ -1233,6 +1248,94 @@ Init_couchbase_ext(void)
1233
1248
  rb_define_method(cb_cBucket, "default_observe_timeout", cb_bucket_default_observe_timeout_get, 0);
1234
1249
  rb_define_method(cb_cBucket, "default_observe_timeout=", cb_bucket_default_observe_timeout_set, 1);
1235
1250
 
1251
+ /* Document-method: query
1252
+ *
1253
+ * @since 1.3.12
1254
+ *
1255
+ * Perform N1QL query to the cluster. This API is experimental and
1256
+ * subject to change in future. Read more info at http://query.couchbase.com
1257
+ *
1258
+ * @example Simple N1QL query
1259
+ * connection.query('select "hello world"')
1260
+ * #=>
1261
+ * {
1262
+ * :rows => [
1263
+ * [0] {
1264
+ * "$1" => "hello world"
1265
+ * }
1266
+ * ],
1267
+ * :meta => {
1268
+ * "requestID" => "f0345617-f809-4b75-8340-acaa412b9f3d",
1269
+ * "signature" => {
1270
+ * "$1" => "string"
1271
+ * },
1272
+ * "results" => [],
1273
+ * "status" => "success",
1274
+ * "metrics" => {
1275
+ * "elapsedTime" => "1.582327ms",
1276
+ * "executionTime" => "1.470542ms",
1277
+ * "resultCount" => 1,
1278
+ * "resultSize" => 43
1279
+ * }
1280
+ * }
1281
+ * }
1282
+ *
1283
+ * @example create primary index
1284
+ * connection.query('create primary index on `travel-sample` using view')
1285
+ * #=>
1286
+ * {
1287
+ * :rows => [],
1288
+ * :meta => {
1289
+ * "requestID" => "597882ef-3c2b-4ac9-8f08-275fece46645",
1290
+ * "signature" => nil,
1291
+ * "results" => [],
1292
+ * "status" => "success",
1293
+ * "metrics" => {
1294
+ * "elapsedTime" => "1.550941465s",
1295
+ * "executionTime" => "1.550856413s",
1296
+ * "resultCount" => 0,
1297
+ * "resultSize" => 0
1298
+ * }
1299
+ * }
1300
+ * }
1301
+ *
1302
+ * @example select first airline
1303
+ * connection.query('select * from `travel-sample` where type = "airline" limit 1')
1304
+ * #=> {
1305
+ * :rows => [
1306
+ * [0] {
1307
+ * "travel-sample" => {
1308
+ * "callsign" => "Orbit",
1309
+ * "country" => "United States",
1310
+ * "iata" => nil,
1311
+ * "icao" => "OBT",
1312
+ * "id" => 16932,
1313
+ * "name" => "Orbit Airlines",
1314
+ * "type" => "airline"
1315
+ * }
1316
+ * }
1317
+ * ],
1318
+ * :meta => {
1319
+ * "requestID" => "f999550c-70b0-43f6-b76d-8cde03288847",
1320
+ * "signature" => {
1321
+ * "*" => "*"
1322
+ * },
1323
+ * "results" => [],
1324
+ * "status" => "success",
1325
+ * "metrics" => {
1326
+ * "elapsedTime" => "501.048085ms",
1327
+ * "executionTime" => "500.991849ms",
1328
+ * "resultCount" => 1,
1329
+ * "resultSize" => 303
1330
+ * }
1331
+ * }
1332
+ * }
1333
+ * @param [String] query string which contains the N1QL query
1334
+ *
1335
+ * @return [Hash] result object with :rows and :meta keys
1336
+ */
1337
+ rb_define_method(cb_cBucket, "query", cb_bucket_query, -1);
1338
+
1236
1339
  cb_cCouchRequest = rb_define_class_under(cb_cBucket, "CouchRequest", rb_cObject);
1237
1340
  rb_define_alloc_func(cb_cCouchRequest, cb_http_request_alloc);
1238
1341
 
@@ -1350,6 +1453,8 @@ Init_couchbase_ext(void)
1350
1453
  cb_sym_quiet = ID2SYM(rb_intern("quiet"));
1351
1454
  cb_sym_replace = ID2SYM(rb_intern("replace"));
1352
1455
  cb_sym_replica = ID2SYM(rb_intern("replica"));
1456
+ cb_sym_rows = ID2SYM(rb_intern("rows"));
1457
+ cb_sym_meta = ID2SYM(rb_intern("meta"));
1353
1458
  cb_sym_select = ID2SYM(rb_intern("select"));
1354
1459
  cb_sym_send_threshold = ID2SYM(rb_intern("send_threshold"));
1355
1460
  cb_sym_set = ID2SYM(rb_intern("set"));
@@ -53,6 +53,7 @@ extern hrtime_t gethrtime(void);
53
53
  #endif
54
54
 
55
55
  #include <libcouchbase/couchbase.h>
56
+ #include <libcouchbase/n1ql.h>
56
57
 
57
58
  #ifdef HAVE_RUBY_ENCODING_H
58
59
  #include "ruby/encoding.h"
@@ -194,6 +195,7 @@ extern VALUE cb_mDocument;
194
195
  extern VALUE cb_mPlain;
195
196
  extern VALUE cb_mMarshal;
196
197
  extern VALUE cb_mURI;
198
+ extern VALUE cb_mMultiJson;
197
199
  extern VALUE em_m;
198
200
 
199
201
  /* Symbols */
@@ -264,6 +266,8 @@ extern ID cb_sym_put;
264
266
  extern ID cb_sym_quiet;
265
267
  extern ID cb_sym_replace;
266
268
  extern ID cb_sym_replica;
269
+ extern ID cb_sym_rows;
270
+ extern ID cb_sym_meta;
267
271
  extern ID cb_sym_select;
268
272
  extern ID cb_sym_send_threshold;
269
273
  extern ID cb_sym_set;
@@ -294,6 +298,7 @@ extern ID cb_id_iv_error;
294
298
  extern ID cb_id_iv_flags;
295
299
  extern ID cb_id_iv_from_master;
296
300
  extern ID cb_id_iv_headers;
301
+ extern ID cb_id_iv_meta;
297
302
  extern ID cb_id_iv_inner_exception;
298
303
  extern ID cb_id_iv_key;
299
304
  extern ID cb_id_iv_node;
@@ -321,6 +326,7 @@ extern ID cb_id_verify_observe_options;
321
326
  extern VALUE cb_eBaseError;
322
327
  extern VALUE cb_eValueFormatError;
323
328
  extern VALUE cb_eHTTPError;
329
+ extern VALUE cb_eQuery;
324
330
  /* LCB_SUCCESS = 0x00 */
325
331
  /* LCB_AUTH_CONTINUE = 0x01 */
326
332
  extern VALUE cb_eAuthError; /* LCB_AUTH_ERROR = 0x02 */
@@ -418,6 +424,7 @@ VALUE cb_bucket_get(int argc, VALUE *argv, VALUE self);
418
424
  VALUE cb_bucket_incr(int argc, VALUE *argv, VALUE self);
419
425
  VALUE cb_bucket_decr(int argc, VALUE *argv, VALUE self);
420
426
  VALUE cb_bucket_unlock(int argc, VALUE *argv, VALUE self);
427
+ VALUE cb_bucket_query(int argc, VALUE *argv, VALUE self);
421
428
  VALUE cb_bucket_run(int argc, VALUE *argv, VALUE self);
422
429
  VALUE cb_bucket_stop(VALUE self);
423
430
  VALUE cb_bucket_version(int argc, VALUE *argv, VALUE self);
@@ -0,0 +1,117 @@
1
+ /*
2
+ * Copyright 2015 Couchbase, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ #include "couchbase_ext.h"
18
+
19
+ static void n1ql_callback(lcb_t handle, int type, const lcb_RESPN1QL *resp)
20
+ {
21
+ struct cb_context_st *ctx = (struct cb_context_st *)resp->cookie;
22
+ VALUE res = ctx->rv;
23
+ if (resp->rflags & LCB_RESP_F_FINAL) {
24
+ if (resp->rc != LCB_SUCCESS) {
25
+ char buf[512];
26
+ char *p = buf, *end = buf + 512;
27
+ VALUE meta = Qnil;
28
+
29
+ p += snprintf(buf, 512, "failed to perform query, rc = 0x%02x", resp->rc);
30
+ if (resp->htresp) {
31
+ p += snprintf(p, end - p, ". Inner HTTP requeest failed (rc = 0x%02x, http_status = %d)",
32
+ resp->htresp->rc, resp->htresp->htstatus);
33
+ }
34
+ if (resp->row) {
35
+ VALUE errors;
36
+ meta = rb_funcall(cb_mMultiJson, cb_id_load, 1, STR_NEW(resp->row, resp->nrow));
37
+ errors = rb_hash_lookup2(meta, STR_NEW_CSTR("errors"), Qnil);
38
+ if (errors != Qnil) {
39
+ int i, len;
40
+ p += snprintf(p, end - p, ": ");
41
+ len = RARRAY_LEN(errors);
42
+ for (i = 0; i < len; i++) {
43
+ VALUE error = rb_ary_entry(errors, i);
44
+ int code = FIX2INT(rb_hash_lookup2(error, STR_NEW_CSTR("code"), INT2FIX(0)));
45
+ char *msg = RSTRING_PTR(rb_hash_lookup2(error, STR_NEW_CSTR("msg"), STR_NEW_CSTR("")));
46
+ p += snprintf(p, end - p, "%s (%d)", msg, code);
47
+ if (len > 1 && i < len - 1) {
48
+ p += snprintf(p, end - p, ",");
49
+ }
50
+ }
51
+ }
52
+ }
53
+ ctx->exception = rb_exc_new2(cb_eQuery, buf);
54
+ rb_ivar_set(ctx->exception, cb_id_iv_error, INT2FIX(resp->rc));
55
+ rb_ivar_set(ctx->exception, cb_id_iv_status, INT2FIX(resp->htresp->htstatus));
56
+ rb_ivar_set(ctx->exception, cb_id_iv_meta, meta);
57
+ }
58
+ if (resp->row) {
59
+ rb_hash_aset(res, cb_sym_meta, rb_funcall(cb_mMultiJson, cb_id_load, 1, STR_NEW(resp->row, resp->nrow)));
60
+ }
61
+ } else {
62
+ /* TODO: protect from exceptions from MultiJson */
63
+ VALUE rows = rb_hash_aref(res, cb_sym_rows);
64
+ rb_ary_push(rows, rb_funcall(cb_mMultiJson, cb_id_load, 1, STR_NEW(resp->row, resp->nrow)));
65
+ }
66
+ (void)handle;
67
+ (void)type;
68
+ }
69
+
70
+ VALUE
71
+ cb_bucket_query(int argc, VALUE *argv, VALUE self)
72
+ {
73
+ struct cb_bucket_st *bucket = DATA_PTR(self);
74
+ struct cb_context_st *ctx;
75
+ lcb_N1QLPARAMS *params = lcb_n1p_new();
76
+ lcb_CMDN1QL cmd = { 0 };
77
+ lcb_error_t rc;
78
+ VALUE qstr, proc, opts, args;
79
+ VALUE exc, rv;
80
+
81
+ rb_scan_args(argc, argv, "1*&", &qstr, &args, &proc);
82
+
83
+ rc = lcb_n1p_setquery(params, RSTRING_PTR(qstr), RSTRING_LEN(qstr), LCB_N1P_QUERY_STATEMENT);
84
+ if (rc != LCB_SUCCESS) {
85
+ rb_raise(cb_eQuery, "cannot set query for N1QL command: %s", lcb_strerror(bucket->handle, rc));
86
+ }
87
+
88
+ rc = lcb_n1p_mkcmd(params, &cmd);
89
+ if (rc != LCB_SUCCESS) {
90
+ rb_raise(cb_eQuery, "cannot construct N1QL command: %s", lcb_strerror(bucket->handle, rc));
91
+ }
92
+
93
+ ctx = cb_context_alloc_common(bucket, proc, 1);
94
+ ctx->rv = rb_hash_new();
95
+ rb_hash_aset(ctx->rv, cb_sym_rows, rb_ary_new());
96
+ rb_hash_aset(ctx->rv, cb_sym_meta, Qnil);
97
+ cmd.callback = n1ql_callback;
98
+ rc = lcb_n1ql_query(bucket->handle, (void *)ctx, &cmd);
99
+ if (rc != LCB_SUCCESS) {
100
+ rb_raise(cb_eQuery, "cannot excute N1QL command: %s\n", lcb_strerror(bucket->handle, rc));
101
+ }
102
+ lcb_n1p_free(params);
103
+ lcb_wait(bucket->handle);
104
+
105
+ exc = ctx->exception;
106
+ rv = ctx->rv;
107
+ cb_context_free(ctx);
108
+ if (exc != Qnil) {
109
+ rb_exc_raise(exc);
110
+ }
111
+ exc = bucket->exception;
112
+ if (exc != Qnil) {
113
+ bucket->exception = Qnil;
114
+ rb_exc_raise(exc);
115
+ }
116
+ return rv;
117
+ }
@@ -17,5 +17,5 @@
17
17
 
18
18
  # Couchbase ruby client
19
19
  module Couchbase
20
- VERSION = '1.3.11'
20
+ VERSION = '1.3.12'
21
21
  end
data/tasks/compile.rake CHANGED
@@ -137,7 +137,7 @@ task 'package:windows' => ['package', 'lib/couchbase_ext.rb'] do
137
137
  ENV['TARGET'] = platform.name
138
138
  rm_rf('tmp/ ports/')
139
139
  mkdir_p('ports')
140
- recipe = MiniPortile.new('libcouchbase', '2.4.5')
140
+ recipe = MiniPortile.new('libcouchbase', '2.4.9')
141
141
  recipe.host = platform.host
142
142
  recipe.files << "http://packages.couchbase.com/clients/c/libcouchbase-#{recipe.version}.tar.gz"
143
143
  recipe.configure_options.push('--disable-cxx',
data/test/test_store.rb CHANGED
@@ -213,4 +213,12 @@ class TestStore < MiniTest::Test
213
213
  assert_equal ["bar", "foo"], connection.get(uniq_id(:a), uniq_id(:z))
214
214
  assert res.is_a?(Hash)
215
215
  end
216
+
217
+ def test_append_format
218
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
219
+ assert_equal :document, connection.default_format
220
+ connection.set(uniq_id, 'bar', :format => :plain)
221
+ connection.append(uniq_id, 'baz', :format => :plain)
222
+ assert_equal 'barbaz', connection.get(uniq_id)
223
+ end
216
224
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: couchbase
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.11
4
+ version: 1.3.12
5
5
  platform: x64-mingw32
6
6
  authors:
7
7
  - Couchbase
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-08 00:00:00.000000000 Z
11
+ date: 2015-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: yaji
@@ -244,6 +244,7 @@ files:
244
244
  - ext/couchbase_ext/gethrtime.c
245
245
  - ext/couchbase_ext/http.c
246
246
  - ext/couchbase_ext/multithread_plugin.c
247
+ - ext/couchbase_ext/n1ql.c
247
248
  - ext/couchbase_ext/observe.c
248
249
  - ext/couchbase_ext/result.c
249
250
  - ext/couchbase_ext/stats.c