couchbase 1.1.3-x86-mingw32 → 1.1.4-x86-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.
- data/HISTORY.markdown +6 -0
- data/ext/couchbase_ext/couchbase_ext.c +52 -24
- data/lib/couchbase/version.rb +1 -1
- data/tasks/compile.rake +4 -4
- data/tasks/test.rake +1 -1
- metadata +5 -5
data/HISTORY.markdown
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## 1.1.4 / 2012-08-30
|
2
|
+
|
3
|
+
* RCBC-70 return binary keys using Encoding.external value (thanks to Alex Leverington)
|
4
|
+
* Switch to rbenv because RVM doesn't work with tclsh
|
5
|
+
* [backport] RCBC-37 Bootstrapping using multiple nodes
|
6
|
+
|
1
7
|
## 1.1.3 / 2012-07-27
|
2
8
|
|
3
9
|
* RCBC-59 Replicate flags in Bucket#cas operation
|
@@ -24,6 +24,15 @@
|
|
24
24
|
#include <libcouchbase/couchbase.h>
|
25
25
|
#include "couchbase_config.h"
|
26
26
|
|
27
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
28
|
+
#include "ruby/encoding.h"
|
29
|
+
#define STR_NEW(ptr, len) rb_external_str_new((ptr), (len))
|
30
|
+
#define STR_NEW_CSTR(str) rb_external_str_new_cstr((str))
|
31
|
+
#else
|
32
|
+
#define STR_NEW(ptr, len) rb_str_new((ptr), (len))
|
33
|
+
#define STR_NEW_CSTR(str) rb_str_new2((str))
|
34
|
+
#endif
|
35
|
+
|
27
36
|
#ifdef HAVE_STDARG_PROTOTYPES
|
28
37
|
#include <stdarg.h>
|
29
38
|
#define va_init_list(a,b) va_start(a,b)
|
@@ -34,9 +43,9 @@
|
|
34
43
|
|
35
44
|
#define debug_object(OBJ) \
|
36
45
|
rb_funcall(rb_stderr, rb_intern("print"), 1, rb_funcall(OBJ, rb_intern("object_id"), 0)); \
|
37
|
-
rb_funcall(rb_stderr, rb_intern("print"), 1,
|
46
|
+
rb_funcall(rb_stderr, rb_intern("print"), 1, STR_NEW_CSTR(" ")); \
|
38
47
|
rb_funcall(rb_stderr, rb_intern("print"), 1, rb_funcall(OBJ, rb_intern("class"), 0)); \
|
39
|
-
rb_funcall(rb_stderr, rb_intern("print"), 1,
|
48
|
+
rb_funcall(rb_stderr, rb_intern("print"), 1, STR_NEW_CSTR(" ")); \
|
40
49
|
rb_funcall(rb_stderr, rb_intern("puts"), 1, rb_funcall(OBJ, rb_intern("inspect"), 0));
|
41
50
|
|
42
51
|
#define FMT_MASK 0x3
|
@@ -65,6 +74,7 @@ typedef struct
|
|
65
74
|
VALUE exception; /* error delivered by error_callback */
|
66
75
|
VALUE on_error_proc; /* is using to deliver errors in async mode */
|
67
76
|
VALUE object_space;
|
77
|
+
char *node_list;
|
68
78
|
} bucket_t;
|
69
79
|
|
70
80
|
typedef struct
|
@@ -115,6 +125,7 @@ static ID sym_add,
|
|
115
125
|
sym_increment,
|
116
126
|
sym_initial,
|
117
127
|
sym_marshal,
|
128
|
+
sym_node_list,
|
118
129
|
sym_password,
|
119
130
|
sym_plain,
|
120
131
|
sym_pool,
|
@@ -455,7 +466,7 @@ unify_key(VALUE key)
|
|
455
466
|
case T_STRING:
|
456
467
|
return key;
|
457
468
|
case T_SYMBOL:
|
458
|
-
return
|
469
|
+
return STR_NEW_CSTR(rb_id2name(SYM2ID(key)));
|
459
470
|
default: /* call #to_str or raise error */
|
460
471
|
return StringValue(key);
|
461
472
|
}
|
@@ -563,7 +574,7 @@ storage_callback(libcouchbase_t handle, const void *cookie,
|
|
563
574
|
|
564
575
|
bucket->seqno--;
|
565
576
|
|
566
|
-
k =
|
577
|
+
k = STR_NEW((const char*)key, nkey);
|
567
578
|
c = cas > 0 ? ULL2NUM(cas) : Qnil;
|
568
579
|
switch(operation) {
|
569
580
|
case LIBCOUCHBASE_ADD:
|
@@ -624,7 +635,7 @@ delete_callback(libcouchbase_t handle, const void *cookie,
|
|
624
635
|
|
625
636
|
bucket->seqno--;
|
626
637
|
|
627
|
-
k =
|
638
|
+
k = STR_NEW((const char*)key, nkey);
|
628
639
|
if (error != LIBCOUCHBASE_KEY_ENOENT || !ctx->quiet) {
|
629
640
|
exc = cb_check_error(error, "failed to remove value", k);
|
630
641
|
if (exc != Qnil) {
|
@@ -666,7 +677,7 @@ get_callback(libcouchbase_t handle, const void *cookie,
|
|
666
677
|
|
667
678
|
bucket->seqno--;
|
668
679
|
|
669
|
-
k =
|
680
|
+
k = STR_NEW((const char*)key, nkey);
|
670
681
|
if (error != LIBCOUCHBASE_KEY_ENOENT || !ctx->quiet) {
|
671
682
|
exc = cb_check_error(error, "failed to get value", k);
|
672
683
|
if (exc != Qnil) {
|
@@ -682,7 +693,7 @@ get_callback(libcouchbase_t handle, const void *cookie,
|
|
682
693
|
c = ULL2NUM(cas);
|
683
694
|
v = Qnil;
|
684
695
|
if (nbytes != 0) {
|
685
|
-
v = decode_value(
|
696
|
+
v = decode_value(STR_NEW((const char*)bytes, nbytes), flags, ctx->force_format);
|
686
697
|
if (v == Qundef) {
|
687
698
|
if (ctx->exception != Qnil) {
|
688
699
|
cb_gc_unprotect(bucket, ctx->exception);
|
@@ -693,7 +704,7 @@ get_callback(libcouchbase_t handle, const void *cookie,
|
|
693
704
|
cb_gc_protect(bucket, ctx->exception);
|
694
705
|
}
|
695
706
|
} else if (flags_get_format(flags) == sym_plain) {
|
696
|
-
v =
|
707
|
+
v = STR_NEW_CSTR("");
|
697
708
|
}
|
698
709
|
if (bucket->async) { /* asynchronous */
|
699
710
|
if (ctx->proc != Qnil) {
|
@@ -731,7 +742,7 @@ flush_callback(libcouchbase_t handle, const void* cookie,
|
|
731
742
|
bucket_t *bucket = ctx->bucket;
|
732
743
|
VALUE node, success = Qtrue, *rv = ctx->rv, exc, res;
|
733
744
|
|
734
|
-
node = authority ?
|
745
|
+
node = authority ? STR_NEW_CSTR(authority) : Qnil;
|
735
746
|
exc = cb_check_error(error, "failed to flush bucket", node);
|
736
747
|
if (exc != Qnil) {
|
737
748
|
rb_ivar_set(exc, id_iv_operation, sym_flush);
|
@@ -777,7 +788,7 @@ version_callback(libcouchbase_t handle, const void *cookie,
|
|
777
788
|
bucket_t *bucket = ctx->bucket;
|
778
789
|
VALUE node, v, *rv = ctx->rv, exc, res;
|
779
790
|
|
780
|
-
node = authority ?
|
791
|
+
node = authority ? STR_NEW_CSTR(authority) : Qnil;
|
781
792
|
exc = cb_check_error(error, "failed to get version", node);
|
782
793
|
if (exc != Qnil) {
|
783
794
|
rb_ivar_set(exc, id_iv_operation, sym_flush);
|
@@ -788,7 +799,7 @@ version_callback(libcouchbase_t handle, const void *cookie,
|
|
788
799
|
}
|
789
800
|
|
790
801
|
if (authority) {
|
791
|
-
v =
|
802
|
+
v = STR_NEW((const char*)bytes, nbytes);
|
792
803
|
if (bucket->async) { /* asynchronous */
|
793
804
|
if (ctx->proc != Qnil) {
|
794
805
|
res = rb_class_new_instance(0, NULL, cResult);
|
@@ -824,7 +835,7 @@ stat_callback(libcouchbase_t handle, const void* cookie,
|
|
824
835
|
bucket_t *bucket = ctx->bucket;
|
825
836
|
VALUE stats, node, k, v, *rv = ctx->rv, exc = Qnil, res;
|
826
837
|
|
827
|
-
node = authority ?
|
838
|
+
node = authority ? STR_NEW_CSTR(authority) : Qnil;
|
828
839
|
exc = cb_check_error(error, "failed to fetch stats", node);
|
829
840
|
if (exc != Qnil) {
|
830
841
|
rb_ivar_set(exc, id_iv_operation, sym_stats);
|
@@ -834,8 +845,8 @@ stat_callback(libcouchbase_t handle, const void* cookie,
|
|
834
845
|
}
|
835
846
|
}
|
836
847
|
if (authority) {
|
837
|
-
k =
|
838
|
-
v =
|
848
|
+
k = STR_NEW((const char*)key, nkey);
|
849
|
+
v = STR_NEW((const char*)bytes, nbytes);
|
839
850
|
if (bucket->async) { /* asynchronous */
|
840
851
|
if (ctx->proc != Qnil) {
|
841
852
|
res = rb_class_new_instance(0, NULL, cResult);
|
@@ -876,7 +887,7 @@ touch_callback(libcouchbase_t handle, const void *cookie,
|
|
876
887
|
VALUE k, success, *rv = ctx->rv, exc = Qnil, res;
|
877
888
|
|
878
889
|
bucket->seqno--;
|
879
|
-
k =
|
890
|
+
k = STR_NEW((const char*)key, nkey);
|
880
891
|
if (error != LIBCOUCHBASE_KEY_ENOENT || !ctx->quiet) {
|
881
892
|
exc = cb_check_error(error, "failed to touch value", k);
|
882
893
|
if (exc != Qnil) {
|
@@ -922,7 +933,7 @@ arithmetic_callback(libcouchbase_t handle, const void *cookie,
|
|
922
933
|
|
923
934
|
bucket->seqno--;
|
924
935
|
|
925
|
-
k =
|
936
|
+
k = STR_NEW((const char*)key, nkey);
|
926
937
|
c = cas > 0 ? ULL2NUM(cas) : Qnil;
|
927
938
|
o = ctx->arithm > 0 ? sym_increment : sym_decrement;
|
928
939
|
exc = cb_check_error(error, "failed to perform arithmetic operation", k);
|
@@ -1042,7 +1053,7 @@ do_scan_connection_options(bucket_t *bucket, int argc, VALUE *argv)
|
|
1042
1053
|
uri_obj = rb_funcall(mURI, id_parse, 1, uri);
|
1043
1054
|
|
1044
1055
|
arg = rb_funcall(uri_obj, id_scheme, 0);
|
1045
|
-
if (arg == Qnil || rb_str_cmp(arg,
|
1056
|
+
if (arg == Qnil || rb_str_cmp(arg, STR_NEW_CSTR("http"))) {
|
1046
1057
|
rb_raise(rb_eArgError, "invalid URI: invalid scheme");
|
1047
1058
|
}
|
1048
1059
|
|
@@ -1088,6 +1099,14 @@ do_scan_connection_options(bucket_t *bucket, int argc, VALUE *argv)
|
|
1088
1099
|
bucket->bucket = strdup(NIL_P(arg) ? "default" : RSTRING_PTR(arg));
|
1089
1100
|
}
|
1090
1101
|
if (TYPE(opts) == T_HASH) {
|
1102
|
+
arg = rb_hash_aref(opts, sym_node_list);
|
1103
|
+
if (arg != Qnil) {
|
1104
|
+
VALUE tt;
|
1105
|
+
free(bucket->node_list);
|
1106
|
+
Check_Type(arg, T_ARRAY);
|
1107
|
+
tt = rb_ary_join(arg, rb_str_new2(";"));
|
1108
|
+
bucket->node_list = strdup(StringValueCStr(tt));
|
1109
|
+
}
|
1091
1110
|
arg = rb_hash_aref(opts, sym_hostname);
|
1092
1111
|
if (arg != Qnil) {
|
1093
1112
|
if (bucket->hostname) {
|
@@ -1191,7 +1210,7 @@ do_connect(bucket_t *bucket)
|
|
1191
1210
|
if (bucket->io == NULL && err != LIBCOUCHBASE_SUCCESS) {
|
1192
1211
|
rb_exc_raise(cb_check_error(err, "failed to create IO instance", Qnil));
|
1193
1212
|
}
|
1194
|
-
bucket->handle = libcouchbase_create(bucket->authority,
|
1213
|
+
bucket->handle = libcouchbase_create(bucket->node_list ? bucket-> node_list : bucket->authority,
|
1195
1214
|
bucket->username, bucket->password, bucket->bucket, bucket->io);
|
1196
1215
|
if (bucket->handle == NULL) {
|
1197
1216
|
rb_raise(eLibcouchbaseError, "failed to create libcouchbase instance");
|
@@ -1258,6 +1277,10 @@ cb_bucket_alloc(VALUE klass)
|
|
1258
1277
|
* Initialize bucket using options only.
|
1259
1278
|
*
|
1260
1279
|
* @param [Hash] options The options for operation for connection
|
1280
|
+
* @option options [Array] :node_list (nil) the list of nodes to connect
|
1281
|
+
* to. If specified it takes precedence over +:host+ option. The list
|
1282
|
+
* must be array of strings in form of host names or host names with
|
1283
|
+
* ports (in first case port 8091 will be used, see examples).
|
1261
1284
|
* @option options [String] :host ("localhost") the hostname or IP address
|
1262
1285
|
* of the node
|
1263
1286
|
* @option options [Fixnum] :port (8091) the port of the managemenent API
|
@@ -1290,6 +1313,9 @@ cb_bucket_alloc(VALUE klass)
|
|
1290
1313
|
* Couchbase.new('http://localhost:8091/pools/default/buckets/protected',
|
1291
1314
|
* :username => 'protected', :password => 'secret')
|
1292
1315
|
*
|
1316
|
+
* @example Use list of nodes, in case some nodes might be dead
|
1317
|
+
* Couchbase.new(:node_list => ['example.com:8091', 'example.org:8091', 'example.net'])
|
1318
|
+
*
|
1293
1319
|
* @return [Bucket]
|
1294
1320
|
*/
|
1295
1321
|
static VALUE
|
@@ -1310,6 +1336,7 @@ cb_bucket_init(int argc, VALUE *argv, VALUE self)
|
|
1310
1336
|
bucket->on_error_proc = Qnil;
|
1311
1337
|
bucket->timeout = 0;
|
1312
1338
|
bucket->object_space = rb_hash_new();
|
1339
|
+
bucket->node_list = NULL;
|
1313
1340
|
|
1314
1341
|
do_scan_connection_options(bucket, argc, argv);
|
1315
1342
|
do_connect(bucket);
|
@@ -1569,7 +1596,7 @@ cb_bucket_hostname_get(VALUE self)
|
|
1569
1596
|
rb_raise(eNoMemoryError, "failed to allocate memory for Bucket");
|
1570
1597
|
}
|
1571
1598
|
}
|
1572
|
-
return
|
1599
|
+
return STR_NEW_CSTR(bucket->hostname);
|
1573
1600
|
}
|
1574
1601
|
|
1575
1602
|
/* Document-method: port
|
@@ -1602,7 +1629,7 @@ cb_bucket_authority_get(VALUE self)
|
|
1602
1629
|
rb_raise(eNoMemoryError, "failed to allocate memory for Bucket");
|
1603
1630
|
}
|
1604
1631
|
snprintf(bucket->authority, len, "%s:%u", bucket->hostname, bucket->port);
|
1605
|
-
return
|
1632
|
+
return STR_NEW_CSTR(bucket->authority);
|
1606
1633
|
}
|
1607
1634
|
|
1608
1635
|
/* Document-method: bucket
|
@@ -1612,7 +1639,7 @@ cb_bucket_authority_get(VALUE self)
|
|
1612
1639
|
cb_bucket_bucket_get(VALUE self)
|
1613
1640
|
{
|
1614
1641
|
bucket_t *bucket = DATA_PTR(self);
|
1615
|
-
return
|
1642
|
+
return STR_NEW_CSTR(bucket->bucket);
|
1616
1643
|
}
|
1617
1644
|
|
1618
1645
|
/* Document-method: pool
|
@@ -1622,7 +1649,7 @@ cb_bucket_bucket_get(VALUE self)
|
|
1622
1649
|
cb_bucket_pool_get(VALUE self)
|
1623
1650
|
{
|
1624
1651
|
bucket_t *bucket = DATA_PTR(self);
|
1625
|
-
return
|
1652
|
+
return STR_NEW_CSTR(bucket->pool);
|
1626
1653
|
}
|
1627
1654
|
|
1628
1655
|
/* Document-method: username
|
@@ -1633,7 +1660,7 @@ cb_bucket_pool_get(VALUE self)
|
|
1633
1660
|
cb_bucket_username_get(VALUE self)
|
1634
1661
|
{
|
1635
1662
|
bucket_t *bucket = DATA_PTR(self);
|
1636
|
-
return
|
1663
|
+
return STR_NEW_CSTR(bucket->username);
|
1637
1664
|
}
|
1638
1665
|
|
1639
1666
|
/* Document-method: password
|
@@ -1643,7 +1670,7 @@ cb_bucket_username_get(VALUE self)
|
|
1643
1670
|
cb_bucket_password_get(VALUE self)
|
1644
1671
|
{
|
1645
1672
|
bucket_t *bucket = DATA_PTR(self);
|
1646
|
-
return
|
1673
|
+
return STR_NEW_CSTR(bucket->password);
|
1647
1674
|
}
|
1648
1675
|
|
1649
1676
|
/* Document-method: url
|
@@ -3549,6 +3576,7 @@ Init_couchbase_ext(void)
|
|
3549
3576
|
sym_increment = ID2SYM(rb_intern("increment"));
|
3550
3577
|
sym_initial = ID2SYM(rb_intern("initial"));
|
3551
3578
|
sym_marshal = ID2SYM(rb_intern("marshal"));
|
3579
|
+
sym_node_list = ID2SYM(rb_intern("node_list"));
|
3552
3580
|
sym_password = ID2SYM(rb_intern("password"));
|
3553
3581
|
sym_plain = ID2SYM(rb_intern("plain"));
|
3554
3582
|
sym_pool = ID2SYM(rb_intern("pool"));
|
data/lib/couchbase/version.rb
CHANGED
data/tasks/compile.rake
CHANGED
@@ -95,7 +95,7 @@ namespace :ports do
|
|
95
95
|
end
|
96
96
|
|
97
97
|
task :libcouchbase => [:libvbucket] do
|
98
|
-
recipe = MiniPortile.new "libcouchbase", "1.0.
|
98
|
+
recipe = MiniPortile.new "libcouchbase", "1.0.6"
|
99
99
|
recipe.files << "http://packages.couchbase.com/clients/c/#{recipe.name}-#{recipe.version}.tar.gz"
|
100
100
|
recipe.configure_options.push("--disable-debug",
|
101
101
|
"--disable-dependency-tracking",
|
@@ -118,7 +118,7 @@ task :cross => ["lib/couchbase_ext.rb", "ports:libcouchbase"]
|
|
118
118
|
|
119
119
|
desc "Package gem for windows"
|
120
120
|
task "package:windows" => :package do
|
121
|
-
sh("env RUBY_CC_VERSION=1.8.7
|
122
|
-
sh("env RUBY_CC_VERSION=1.9.2
|
123
|
-
sh("env RUBY_CC_VERSION=1.8.7:1.9.2
|
121
|
+
sh("env RUBY_CC_VERSION=1.8.7 RBENV_VERSION=1.8.7-p370 rbenv exec bundle exec rake cross compile")
|
122
|
+
sh("env RUBY_CC_VERSION=1.9.2 RBENV_VERSION=1.9.2-p320 rbenv exec bundle exec rake cross compile")
|
123
|
+
sh("env RUBY_CC_VERSION=1.8.7:1.9.2 RBENV_VERSION=1.9.2-p320 rbenv exec bundle exec rake cross native gem")
|
124
124
|
end
|
data/tasks/test.rake
CHANGED
@@ -19,7 +19,7 @@ require 'rake/testtask'
|
|
19
19
|
require 'rake/clean'
|
20
20
|
|
21
21
|
rule 'test/CouchbaseMock.jar' do |task|
|
22
|
-
jar_path = "0.5-SNAPSHOT/CouchbaseMock-0.5-
|
22
|
+
jar_path = "0.5-SNAPSHOT/CouchbaseMock-0.5-20120726.220757-19.jar"
|
23
23
|
sh %{wget -q -O test/CouchbaseMock.jar http://files.couchbase.com/maven2/org/couchbase/mock/CouchbaseMock/#{jar_path}}
|
24
24
|
end
|
25
25
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: couchbase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.4
|
5
5
|
prerelease:
|
6
6
|
platform: x86-mingw32
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: yajl-ruby
|
@@ -200,7 +200,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
200
200
|
version: '0'
|
201
201
|
segments:
|
202
202
|
- 0
|
203
|
-
hash:
|
203
|
+
hash: -2223779579395876074
|
204
204
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
205
|
none: false
|
206
206
|
requirements:
|
@@ -209,10 +209,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
209
209
|
version: '0'
|
210
210
|
segments:
|
211
211
|
- 0
|
212
|
-
hash:
|
212
|
+
hash: -2223779579395876074
|
213
213
|
requirements: []
|
214
214
|
rubyforge_project:
|
215
|
-
rubygems_version: 1.8.
|
215
|
+
rubygems_version: 1.8.23
|
216
216
|
signing_key:
|
217
217
|
specification_version: 3
|
218
218
|
summary: Couchbase ruby driver
|