couchbase 2.0.0.pre.1-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: !binary |-
4
+ ZGM3OWI3NzQ3ODBjNWJiYzdhMmVlMjFhYzk5ZGE2ZjQ2ZTRlYjZkZg==
5
+ data.tar.gz: !binary |-
6
+ MzQ5ZTFhMmNmZjAwMzQzOWM4NDcyMjcxZGYyNzZhMGIyYzNkOWNlMg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NGRiNmI0NGVhODBhMTU3ODE4NzJmMzFhZTUyYmNmOTU3N2NmYWJmNjI3NjQ5
10
+ Yzg3YzY5ZTk1MGU0YTM1YTg4Y2Y4NDJhM2YyYzdhNGUzZTVhYTlhYjI2OThk
11
+ OWJiN2M0MGIwMzc3Y2M4MzY0ZmM3ZTQyYjNkYjZjMTlhYWFhZjE=
12
+ data.tar.gz: !binary |-
13
+ ZjUxNmJiMjhhMjdhYjM2NWUwNGNiZDIwNjcwMmE0NzZhODA4OGJjNzk0MGRl
14
+ YTBlYmY3ZDZjNGUwZTllNWY4YzE1MTVjNDI3ZjFlODRlMGIxNDZjN2ZjY2Nl
15
+ NjYwODRkNDE3MWM2NmM3Njc0MzZmMjMxOGUxOGYzOTU3NWVjYWU=
@@ -0,0 +1,15 @@
1
+ *.bundle
2
+ *.gem
3
+ *.so
4
+ .timestamp
5
+ .yardoc
6
+ Gemfile.lock
7
+ core*
8
+ doc/
9
+ ext/couchbase/Makefile
10
+ ext/couchbase/mkmf.log
11
+ lib/couchbase_ext.rb
12
+ pkg/*
13
+ ports
14
+ test/CouchbaseMock.jar
15
+ tmp
@@ -0,0 +1,22 @@
1
+ before_install:
2
+ - sudo rm -rf /etc/apt/sources.list.d/couchdb-ppa-source.list
3
+ - sudo rm -rf /etc/apt/sources.list.d/mongodb.list
4
+ - sudo rm -rf /etc/apt/sources.list.d/datastax-source.list
5
+ - sudo rm -rf /etc/apt/sources.list.d/rabbitmq-source.list
6
+ - sudo rm -rf /etc/apt/sources.list.d/mapopa-source.list
7
+ - sudo rm -rf /etc/apt/sources.list.d/webupd8team-java-ppa-source.list
8
+ - sudo rm -rf /etc/apt/sources.list.d/maven3-ppa-source.list
9
+ - wget -O- http://packages.couchbase.com/ubuntu/couchbase.key | sudo apt-key add -
10
+ - echo deb http://packages.couchbase.com/snapshot/ubuntu oneiric oneiric/main | sudo tee /etc/apt/sources.list.d/couchbase.list
11
+ - sudo apt-get update
12
+ - sudo apt-get -y install libcouchbase2-dev
13
+
14
+ rvm:
15
+ - 1.8.7
16
+ - 1.9.2
17
+ - 1.9.3
18
+ - ree
19
+
20
+ notifications:
21
+ email:
22
+ - sergey@couchbase.com
@@ -0,0 +1,5 @@
1
+ --protected
2
+ --no-private
3
+ -
4
+ README.markdown
5
+ RELEASE_NOTES.markdown
@@ -0,0 +1,75 @@
1
+ We've decided to use "gerrit" for our code review system, making it
2
+ easier for all of us to contribute with code and comments.
3
+
4
+ 1. Visit http://review.couchbase.org and "Register" for an account
5
+ 2. Review http://review.couchbase.org/static/individual_agreement.html
6
+ 3. Agree to agreement by visiting http://review.couchbase.org/#/settings/agreements
7
+ 4. If you do not receive an email, please contact us
8
+ 5. Check out the `couchbase-ruby-client` area http://review.couchbase.org/#/q/status:open+project:couchbase-ruby-client,n,z
9
+ 6. Join us on IRC at #libcouchbase on Freenode :-)
10
+
11
+ We normally don't go looking for stuff in gerrit, so you should add at
12
+ least me `"Sergey Avseyev" <sergey.avseyev@gmail.com>` as a reviewer
13
+ for your patch (and I'll know who else to add and add them for you).
14
+
15
+ ## Contributing Using Repo Tool
16
+
17
+ Follow ["Uploading Changes" guide][1] on the site if you have some code to contribute.
18
+
19
+ All you should need to set up your development environment should be:
20
+
21
+ ~ % mkdir couchbase-ruby
22
+ ~ % cd couchbase-ruby
23
+ ~/couchbase-ruby % repo init -u git://github.com/trondn/manifests.git -m ruby.xml
24
+ ~/couchbase-ruby % repo sync
25
+ ~/couchbase-ruby % repo start my-branch-name --all
26
+ ~/couchbase-ruby % make
27
+
28
+ This will build the latest version of `libcouchbase`,
29
+ `couchbase-ruby-client` and `couchbase-ruby-client` libraries. You must
30
+ have a C and C++ compiler installed, automake, autoconf.
31
+
32
+ If you have to make any changes just commit them before you upload
33
+ them to gerrit with the following command:
34
+
35
+ ~/couchbase-ruby/client % repo upload
36
+
37
+ You might experience a problem trying to upload the patches if you've
38
+ selected a different login name at http://review.couchbase.org than
39
+ your login name. Don't worry, all you need to do is to add the
40
+ following to your ~/.gitconfig file:
41
+
42
+ [review "review.couchbase.org"]
43
+ username = YOURNAME
44
+
45
+ ## Contributing Using Plain Git
46
+
47
+ If you not so familiar with repo tool and its workflow there is
48
+ alternative way to do the same job. Lets assume you have installed
49
+ couchbase gem and libcouchbase from official packages and would you to
50
+ contribute to couchbase-client gem only. Then you just need to complete
51
+ gerrit registration steps above and clone the source repository
52
+ (remember the repository on github.com is just a mirror):
53
+
54
+ ~ % git clone ssh://YOURNAME@review.couchbase.org:29418/couchbase-ruby-client.git
55
+
56
+ Install [`commit-msg` hook][2]:
57
+
58
+ ~/couchbase-ruby-client % scp -p -P 29418 YOURNAME@review.couchbase.org:hooks/commit-msg .git/hooks/
59
+
60
+ Make your changes and upload them for review:
61
+
62
+ ~/couchbase-ruby-client % git commit
63
+ ~/couchbase-ruby-client % git push origin HEAD:refs/for/master
64
+
65
+ If you need to fix or add something to your patch, do it and re-upload
66
+ the changes (all you need is to keep `Change-Id:` line the same to
67
+ allow gerrit to track the patch.
68
+
69
+ ~/couchbase-ruby-client % git commit --amend
70
+ ~/couchbase-ruby-client % git push origin HEAD:refs/for/master
71
+
72
+ Happy hacking!
73
+
74
+ [1]: http://review.couchbase.org/Documentation/user-upload.html
75
+ [2]: http://review.couchbase.org/Documentation/user-changeid.html
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in couchbase.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
@@ -0,0 +1,3 @@
1
+ all:
2
+ $(MAKE) -C../.. ruby-client
3
+
@@ -0,0 +1,83 @@
1
+ # Couchbase Ruby Client
2
+
3
+ This is the official client library for use with Couchbase Server.
4
+
5
+ ## SUPPORT
6
+
7
+ If you find an issue, please file it in our [JIRA][1]. Also you are
8
+ always welcome on the `#libcouchbase` channel at [freenode.net IRC
9
+ servers][2]. Checkout [library overview][overview] and [API
10
+ documentation][api].
11
+
12
+
13
+ ## INSTALL
14
+
15
+ At the moment it only support [jruby](http://jruby.org/), so
16
+ installation is as simple as:
17
+
18
+ $ gem install couchbase
19
+
20
+ ## USAGE
21
+
22
+ Since it is 2.0 release, it introduces API changes comparing to 1.x
23
+ versions.
24
+
25
+ require 'couchbase'
26
+
27
+ Cluster object accepts list of nodes to connect to:
28
+
29
+ c = Couchbase::Cluster.new(['localhost'])
30
+
31
+
32
+ To open bucket, specify name and password (optional):
33
+
34
+ b = c.open_bucket('default', '')
35
+
36
+ SDK 2.0 operates with documents, so the API expose
37
+ `Couchbase::Document` to wrap your data:
38
+
39
+ doc = Couchbase::Document.new(:id => 'mydoc', :content => {'foo' => 'bar'})
40
+
41
+ Now you can put it into the bucket:
42
+
43
+ b.upsert(doc)
44
+ # => #<Couchbase::Document:0x6ada79a9
45
+ # @cas=247387287270276,
46
+ # @content={"foo"=>"bar"},
47
+ # @expiry=0,
48
+ # @id="mydoc",
49
+ # @transcode=true>
50
+
51
+ And retrieve it later:
52
+
53
+ b.get('mydoc')
54
+ # => #<Couchbase::Document:0x789052f6
55
+ # @cas=247387287270276,
56
+ # @content={"foo"=>"bar"},
57
+ # @expiry=0,
58
+ # @id="mydoc",
59
+ # @transcode=true>
60
+
61
+ More complex example with `beer-sample` bucket, which comes with the
62
+ server distribution.
63
+
64
+ require 'couchbase'
65
+ c = Couchbase::Cluster.new(['localhost'])
66
+ b = c.open_bucket('beer-sample')
67
+ res = b.query('beer', 'by_location', :group_level => 1)
68
+
69
+ puts 'First 4 countries: '
70
+ res.rows.take(4).each do |row|
71
+ puts "#{row['key'].first}: #{row['value']}"
72
+ end
73
+
74
+ res.rows.each do |row|
75
+ b.counter('beer_lovers', +1, initial: 1) if row['value'] > 10
76
+ end
77
+ puts "There are #{b.get('beer_lovers').content} countries with more than 10 breweries"
78
+ # >> First 4 countries:
79
+ # >> Argentina: 2
80
+ # >> Aruba: 1
81
+ # >> Australia: 14
82
+ # >> Austria: 10
83
+ # >> There are 18 countries with more than 10 breweries
@@ -0,0 +1,872 @@
1
+ # Release Notes
2
+
3
+ This document is a list of user visible feature changes and important
4
+ bugfixes. Do not forget to update this doc in every important patch.
5
+
6
+ ## 1.3.7 (2014-04-18)
7
+
8
+ * [major] Allow the selection of bootstrap providers. Since libcouchbase
9
+ 2.3.0 there is a new bootstrapping transport available: Cluster
10
+ Configuration Carrier Publication (CCCP). It is more efficient way
11
+ to keep cluster configuration up to date using Carrier Publication
12
+ instead of HTTP connection.
13
+
14
+ nodes = ["example.com", "example.org"]
15
+ Couchbase.connect(node_list: nodes, bootstrap_transports: [:cccp, :http])
16
+
17
+ Read more about it here:
18
+ http://www.couchbase.com/wiki/display/couchbase/Cluster+Configuration+Carrier+Publication
19
+
20
+ * [major] RCBC-168 An experimental DNS SRV helper for connection
21
+ constructor. The DNS SRV records need to be configured on a reachable
22
+ DNS server. An example configuration could look like the following
23
+ (note that the service ids might change):
24
+
25
+ _cbmcd._tcp.example.com. 0 IN SRV 20 0 11210 node2.example.com.
26
+ _cbmcd._tcp.example.com. 0 IN SRV 10 0 11210 node1.example.com.
27
+ _cbmcd._tcp.example.com. 0 IN SRV 30 0 11210 node3.example.com.
28
+
29
+ _cbhttp._tcp.example.com. 0 IN SRV 20 0 8091 node2.example.com.
30
+ _cbhttp._tcp.example.com. 0 IN SRV 10 0 8091 node1.example.com.
31
+ _cbhttp._tcp.example.com. 0 IN SRV 30 0 8091 node3.example.com.
32
+
33
+ Now if "example.com" is passed in as the argument, the three nodes
34
+ configured will be parsed and put in the returned URI list. Note
35
+ that the priority is respected (in this example, node1 will be the
36
+ first one in the list, followed by node2 and node3). As of now,
37
+ weighting is not supported. This is how it could be used to
38
+ bootstrap the connection:
39
+
40
+ transport = :http
41
+ nodes = Couchbase::DNS.locate('example.com', transport)
42
+ if nodes.empty?
43
+ nodes = ["example.com:8091"]
44
+ end
45
+ Couchbase.connect(node_list: nodes, bootstrap_transports: [transport])
46
+
47
+ NOTE: This is experiemental and subject to change at any time. Watch
48
+ the release notes for changes in future releases.
49
+
50
+ * [major] RCBC-166 Fix a crash with eventmachine. In eventmachine event
51
+ handlers are separated and run seprately and in the following order:
52
+ [READ, WRITE]. So it was possible to cancel WRITE event handler from
53
+ the READ handler which cause crash when the reactor run it in next
54
+ turn.
55
+
56
+ * [minor] Fixed a typo which doesn't allow to use bundler in the project
57
+ directory.
58
+
59
+ ## 1.3.6 (2014-02-17)
60
+
61
+ * [major] Fix linkage issue which blocks library installation on
62
+ windows.
63
+
64
+ ## 1.3.5 (2014-02-05)
65
+
66
+ * [major] RCBC-159, RCBC-152 Honor the :environment constructor argument
67
+
68
+ * [major] Allow inheritance from `Couchbase::Bucket`. It wasn't
69
+ possible to create a view with subclass of the `Couchbase::Bucket`.
70
+
71
+ * [major] Ensure that an exception raised early will not prevent the
72
+ finalizer from being called in the underlying client being constructed.
73
+ One example situation where this could occur:
74
+
75
+ class Couchbase::Bucket
76
+ def initialize(*args)
77
+ raise "something wrong"
78
+ super
79
+ end
80
+ end
81
+
82
+ ## 1.3.4 (2014-01-08)
83
+
84
+ * [major] Build 64-bit versions of the extensions for Windows
85
+ platform. Also support ruby 2.0 and 2.1.
86
+
87
+ * [minor] Update hacking section in README
88
+
89
+ * [minor] Fix gemspec warnings regarding versions of the dependencies.
90
+ Now it honours semantic versioning and doesn't use strict versions.
91
+
92
+ * [major] RCBC-151 Return CAS in extended mode for incr/decr
93
+
94
+ * [minor] RCBC-150 Update list of options on `Cluster.create_bucket`.
95
+ Added new options: `:replica_index`, `:flush_enabled`,
96
+ `:parallel_db_and_view_compaction`.
97
+
98
+ * [major] Allow retries on Couchbase::Bucket#cas collisions. Now it
99
+ takes a `:retry` Fixnum option that specifies the maximum number of
100
+ times the method should retry the entire get/update/set operation
101
+ when a `Couchbase::Error::KeyExists` error is encountered due to a
102
+ concurrent update from another writer between its `#get` and `#set`
103
+ calls.
104
+
105
+ * [major] MD5 and truncate ActiveSupport::Cache keys that are longer
106
+ than 250 characters.
107
+
108
+ ## 1.3.3 (2013-09-12)
109
+
110
+ * [major] RCBC-134 Allow application to use several connections with
111
+ thread-local singleton.
112
+
113
+ * [major] RCBC-135 Fixed invalid memory access which was detected by
114
+ using 'GC.stress = true' in tests.
115
+
116
+ * [major] RCBC-141 Initialize event indexes correctly. The plugin
117
+ didn't trace event callbacks, which might lead to invalid memory
118
+ access during rebalance, where libcouchbase creates/removes a lot of
119
+ events because of a fast-changing topology.
120
+
121
+ * [major] RCBC-137 Add selection options for new IO engines: select
122
+ and iocp.
123
+
124
+ * [major] When setting the username field, check for password
125
+ presence. Fixes segmentation fault in this code:
126
+
127
+ Couchbase.connect(:username => "default", :bucket => "default")
128
+
129
+ * [minor] Allow to determine the version of libcouchbase:
130
+
131
+ Couchbase.libcouchbase_version
132
+
133
+ * [major] RCBC-136 Build shared object for ruby 2.0 on windows. Also
134
+ fixes build script when using latest rake and rake-compiler.
135
+
136
+ * [minor] Fix deprecation warning on ruby 2.x. On newer versions it
137
+ should use `rb_thread_call_without_gvl()`.
138
+
139
+ ext/couchbase_ext/multithread_plugin.c: In function ‘loop_run_poll’:
140
+ ext/couchbase_ext/multithread_plugin.c:772:5: warning: ‘rb_thread_blocking_region’ is deprecated (declared at .../2.0.0-p247-dbg/include/ruby-2.0.0/ruby/intern.h:839) [-Wdeprecated-declarations]
141
+ rb_thread_blocking_region(loop_blocking_poll, args, RUBY_UBF_PROCESS, NULL);
142
+
143
+ * [major] Do not try to compile with plugins for Windows platform.
144
+
145
+ * [major] Force handle to be NULL on `lcb_create()` failure.
146
+ `lcb_create()` can leave garbage in the pointer even if the call
147
+ itself failed. This behaviour could lead to illegal memory access
148
+ on GC.
149
+
150
+ * [minor] Remove usage of `RARRAY_PTR` in favor of `rb_ary_entry`.
151
+ This improves performance significantly on Rubinius and also
152
+ improves compatibility with future CRuby 2.1 which introduces
153
+ generational garbage collection. This results in these arrays not
154
+ having to be rescanned in Rubinius and not marked as shady in
155
+ RBGCENC in CRuby 2.1.
156
+ For more discussion, also see: https://bugs.ruby-lang.org/issues/8399
157
+
158
+ ## 1.3.2 (2013-07-10)
159
+
160
+ * [major] RCBC-133 Allow application to select the strategy of reading
161
+ from replica nodes. **This version requires libcouchbase >= 2.0.7.**
162
+ Now three strategies are available:
163
+
164
+ * `:first` - synonym to `true`, previous behaviour now the
165
+ default. It means that the library will sequentially iterate
166
+ over all replicas in the configuration supplied by the cluster
167
+ and will return as soon as it finds a successful response, or
168
+ report an error.
169
+
170
+ c.get("foo", :replica => true)
171
+ c.get("foo", :replica => :first)
172
+ #=> "bar"
173
+ c.get("foo", :replica => :first, :extended => true)
174
+ #=> ["bar", 0, 11218368683493556224]
175
+
176
+ * `:all` - query all replicas in parallel. In this case the method
177
+ will return the array of the values on the all replica nodes without
178
+ a particular order. Also if the key isn't on the node, it will be
179
+ skipped in the result array.
180
+
181
+ c.get("foo", :replica => :all)
182
+ #=> ["bar", "bar", "bar"]
183
+ c.get("foo", :replica => :all, :extended => true)
184
+ #=> [["bar", 0, 11218368683493556224],
185
+ # ["bar", 0, 11218368683493556224],
186
+ # ["bar", 0, 11218368683493556224]]
187
+
188
+ * `Fixnum` - you can also select specific replica node by its
189
+ index in the cluster configuration. It should be in interval
190
+ `0...c.num_replicas`
191
+
192
+ 0...c.num_replicas
193
+ #=> 0...3
194
+ c.get("foo", :replica => 1)
195
+ #=> "bar"
196
+ c.get("foo", :replica => 42)
197
+ #=> ArgumentError: replica index should be in interval 0...3
198
+
199
+ Note that applications should not assume the order of the
200
+ replicas indicates more recent data is at a lower index number.
201
+ It is up to the application to determine which version of a
202
+ document/item it may wish to use in the case of retrieving data
203
+ from a replica.
204
+
205
+
206
+ ## 1.3.1 (2013-06-05)
207
+
208
+ * [major] RCBC-131 Couchbase::Cluster instance shouldn't require
209
+ persistent connection.
210
+
211
+ * Fix compatibility with multi_json 1.7.5. They removed VERSION
212
+ constant
213
+
214
+ ## 1.3.0 (2013-05-07)
215
+
216
+ * [major] RCBC-46 implement Couchbase::ConnectionPool to allow
217
+ applications (and ActiveSupport::Cache::CouchbaseStore) use it in
218
+ multi-threaded environment
219
+
220
+ * [major] Introduce Transcoders. This mechanism is more flexible, and
221
+ similar to how other clients encode values.
222
+
223
+ * [minor] Deprecate numeric argument to 'default_format'. Instead
224
+ of this style:
225
+
226
+ Couchbase.connect(:default_format => Couchbase::Bucket::FMT_MARSHAL)
227
+
228
+ Symbol notation or explicit transcoder entity should be used
229
+
230
+ Couchbase.connect(:default_format => :marshal)
231
+ Couchbase.connect(:transcoder => Couchbase::Transcoder::Marshal)
232
+
233
+ ## 1.2.3 (2013-04-02)
234
+
235
+ * [major] Make ActiveSupport::Cache::CouchbaseStore threadsafe
236
+
237
+ * [minor] Check for gethrtime. Needed for solaris/smartos
238
+
239
+ * [minor] Update documentation bits regarding SET operations
240
+
241
+ ## 1.2.2 (2013-02-11)
242
+
243
+ * [minor] Bucket#design_docs will return a Hash with DesignDoc
244
+ instances as a values.
245
+
246
+ * [critical] RCBC-104 Data corruption on intensive store operations.
247
+ The issue could also lead to segfaults.
248
+
249
+ * [major] RCBC-118 Alias #total_rows as #total_entries on view result
250
+ set to match documentation.
251
+
252
+ * [minor] View#fetch_all - async method for fetching all records
253
+
254
+ conn.run do
255
+ doc.recent_posts.fetch_all do |posts|
256
+ do_something_with_all_posts(posts)
257
+ end
258
+ end
259
+
260
+ * [major] Allow to use Bucket instance in completely asynchronous
261
+ environment like this, without blocking on connect:
262
+
263
+ conn = Couchbase.new(:async => true)
264
+ conn.run do
265
+ conn.on_connect do |res|
266
+ if res.success?
267
+ #
268
+ # schedule async requests
269
+ #
270
+ end
271
+ end
272
+ end
273
+
274
+ * [major] RCBC-27 EventMachine plugin to integrate with EventMachine
275
+ library. Note that the plugin is experimental at this stage.
276
+ Example:
277
+
278
+ require 'eventmachine'
279
+ require 'couchbase'
280
+
281
+ EM.epoll = true if EM.epoll?
282
+ EM.kqueue = true if EM.kqueue?
283
+ EM.run do
284
+ con = Couchbase.connect(:engine => :eventmachine, :async => true)
285
+ con.on_connect do |res|
286
+ puts "connected: #{res.inspect}"
287
+ if res.success?
288
+ con.set("emfoo", "bar") do |res|
289
+ puts "set: #{res.inspect}"
290
+ con.get("emfoo") do |res|
291
+ puts "get: #{res.inspect}"
292
+ EM.stop
293
+ end
294
+ end
295
+ else
296
+ EM.stop
297
+ end
298
+ end
299
+ end
300
+
301
+
302
+ ## 1.2.1 (2012-12-28)
303
+
304
+ * [major] RCBC-101 Persistence constraints wasn't passed to mutation
305
+ methods, so they haven't been applied properly.
306
+
307
+ * [major] RCBC-102 Inconsistent return values in case of storage
308
+ functions with persistence constraints. It always return a Hash like
309
+ in case of multi-set, even if there is only one document is being
310
+ set.
311
+
312
+ * [minor] Improve internal structures of multi-threaded IO plugin to
313
+ protect it from memory leaks when the Fiber object is forgotten.
314
+
315
+ ## 1.2.0 (2012-12-12)
316
+
317
+ 30 files changed, 2079 insertions(+), 662 deletions(-)
318
+
319
+ * Specialized io plugin for releasing Ruby GVL (thanks to
320
+ Sokolov Yura aka funny_falcon).
321
+
322
+ * Ruby 1.9.x uses global lock for ensuring integrity, and blocking
323
+ calls should be called inside rb_thread_blocking_region to allow
324
+ other threads to be runned.
325
+
326
+ * Ruby 1.8.7 have only green threads, so that rb_thread_schedule
327
+ should be called manually.
328
+
329
+ * RCBC-42 Catch exceptions from ruby callbacks
330
+
331
+ * RCBC-99 read out the StringIO contents in json gem monkey patch
332
+
333
+ * Use marshal serializer by default for session store
334
+
335
+ * Remove debugger development dependency
336
+
337
+ * Fix memory leaks and performance improvements
338
+
339
+ ## 1.2.0.z.beta5 (2012-11-29)
340
+
341
+ 25 files changed, 1419 insertions(+), 1230 deletions(-)
342
+
343
+ * RCBC-95 Use response body to clarify Couchbase::Error::HTTP
344
+
345
+ * Fix memory leaks: in async mode context wasn't freed
346
+
347
+ * Allow to setup default initial value for INCR/DECR on per connection
348
+ level.
349
+
350
+ * Make error message about libcouchbase dependency more verbose
351
+
352
+ ## 1.2.0.z.beta4 (2012-11-21)
353
+
354
+ 27 files changed, 311 insertions(+), 123 deletions(-)
355
+
356
+ * Increase default connection timeout for Views up to 75 seconds
357
+
358
+ * RCBC-94 Reset global exception after usage
359
+
360
+ * RCBC-89 Do not expose docs embedded in HTTP response. Use binary
361
+ protocol for it.
362
+
363
+ * Remove all_docs mentions. It isn't recommended to use it because of
364
+ performance issues
365
+
366
+ * Protect against non string values in :plain mode. Will raise error
367
+ if the value given isn't a string.
368
+
369
+ * RCBC-90 Update documentation about session store
370
+
371
+ * Make rack session store adapter quiet
372
+
373
+ * Update to recent libcouchbase API
374
+
375
+ * Adjust version check for MultiJson monkeypatch (8098da1)
376
+
377
+ * Do not hide ValueFormat reason. It is accessible using
378
+ Couchbase::Error::Value#inner_exception.
379
+
380
+ ## 1.2.0.z.beta3 (2012-10-16)
381
+
382
+ 18 files changed, 241 insertions(+), 57 deletions(-)
383
+
384
+ * RCBC-52 Implement bucket create/delete operations. Examples:
385
+
386
+ conn = Couchbase::Cluster.new(:hostname => "localhost",
387
+ :username => "Administrator", :password => "secret")
388
+ conn.create_bucket("my_protected_bucket",
389
+ :ram_quota => 500, # megabytes
390
+ :sasl_password => "s3cr3tBuck3t")
391
+
392
+ * Propagate status code for HTTP responses
393
+
394
+ * RCBC-87 Fix build error on Mac OS X
395
+
396
+ * Use global scope to find Error classes (thanks to @wr0ngway)
397
+
398
+ * Fix memory leaks
399
+
400
+ * Update to recent libcouchbase API
401
+
402
+ ## 1.2.0.z.beta2 (2012-09-21)
403
+
404
+ 3 files changed, 6 insertions(+), 2 deletions(-)
405
+
406
+ * RCBC-82 Not all rubies are fat on Mac OS X. Fixes build there
407
+
408
+ ## 1.2.0.z.beta (2012-09-18)
409
+
410
+ 2 files changed, 5 insertions(+), 1 deletion(-)
411
+
412
+ * Fix version ordering by using ".z" prefix before .beta. The problem
413
+ is that DP (Developer Preview) should have lower precedence than
414
+ Beta, but alphabetially ".beta" orders before ".dp". This is why
415
+ further Beta versions have ".z".
416
+
417
+ ## 1.2.0.beta (2012-09-18)
418
+
419
+ 51 files changed, 9301 insertions(+), 3364 deletions(-)
420
+
421
+ * RCBC-81 Protect against NoMethodError in extconf.rb. Fixes
422
+ gem installation
423
+
424
+ * RCBC-79 Use RESTful flush
425
+
426
+ * Various build fixes
427
+
428
+ * Add attribute reader for Error::Base status code
429
+
430
+ * CCBC-98 Expose client temporary failure error
431
+
432
+ * RCBC-28 Implement Bucket#unlock
433
+
434
+ # Unlock the single key
435
+ val, _, cas = c.get("foo", :lock => true, :extended => true)
436
+ c.unlock("foo", :cas => cas)
437
+
438
+ # Unlock several keys
439
+ c.unlock("foo" => cas1, :bar => cas2)
440
+ #=> {"foo" => true, "bar" => true}
441
+
442
+ * Fix CAS conversion for Bucket#delete method for 32-bit systems
443
+
444
+ ## 1.1.5 (2012-09-17)
445
+
446
+ 3 files changed, 9 insertions(+), 5 deletions(-)
447
+
448
+ * RCBC-81 Fixed installing issue on Mac OS X.
449
+
450
+ ## 1.1.4 (2012-08-30)
451
+
452
+ 5 files changed, 64 insertions(+), 30 deletions(-)
453
+
454
+ * RCBC-37 Allow to pass intial list of nodes which will allow to
455
+ iterate addresses until alive node will be found.
456
+
457
+ Couchbase.connect(:node_list => ['example.com:8091', 'example.org:8091', 'example.net'])
458
+
459
+ * RCBC-70 Fixed UTF-8 in the keys. Original discussion
460
+ https://groups.google.com/d/topic/couchbase/bya0lSf9uGE/discussion
461
+
462
+ ## 1.2.0.dp6 (2012-06-28)
463
+
464
+ 21 files changed, 1520 insertions(+), 428 deletions(-)
465
+
466
+ * RCBC-47 Allow to skip username for protected buckets. The will use
467
+ bucket name for credentials.
468
+
469
+ * Expose number of replicas to the user
470
+
471
+ * RCBC-6 Implement Bucket#observe command to query durable state.
472
+ Examples:
473
+
474
+ # Query state of single key
475
+ c.observe("foo")
476
+ #=> [#<Couchbase::Result:0x00000001650df0 ...>, ...]
477
+
478
+ # Query state of multiple keys
479
+ keys = ["foo", "bar"]
480
+ stats = c.observe(keys)
481
+ stats.size #=> 2
482
+ stats["foo"] #=> [#<Couchbase::Result:0x00000001650df0 ...>, ...]
483
+
484
+ * RCBC-49 Storage functions with durability requirements
485
+
486
+ # Ensure that the key will be persisted at least on the one node
487
+ c.set("foo", "bar", :observe => {:persisted => 1})
488
+
489
+ * RCBC-50 Allow to read keys from replica
490
+
491
+ * RCBC-57 Expose timers API from libcouchbase
492
+
493
+ * RCBC-59 Replicate flags in Bucket#cas operation
494
+
495
+ * Apply timeout value before connection. Currently libcouchbase shares
496
+ timeouts for connection and IO operations. This patch allows to
497
+ setup timeout on the instantiating the connection.
498
+
499
+ * RCBC-39 Allow to specify delta for incr/decr in options
500
+
501
+ * RCBC-40 Fix Bucket#cas operation behaviour in async mode. The
502
+ callback of the Bucket#cas method is triggered only once, when it
503
+ fetches old value, and it isn't possible to receive notification if
504
+ the next store operation was successful. Example, append JSON
505
+ encoded value asynchronously:
506
+
507
+ c.default_format = :document
508
+ c.set("foo", {"bar" => 1})
509
+ c.run do
510
+ c.cas("foo") do |val|
511
+ case val.operation
512
+ when :get
513
+ val["baz"] = 2
514
+ val
515
+ when :set
516
+ # verify all is ok
517
+ puts "error: #{ret.error.inspect}" unless ret.success?
518
+ end
519
+ end
520
+ end
521
+ c.get("foo") #=> {"bar" => 1, "baz" => 2}
522
+
523
+ * RCBC-43 More docs and examples on views
524
+
525
+ * RCBC-37 Bootstrapping using multiple nodes
526
+
527
+ Couchbase.connect(:node_list => ['example.com:8091', 'example.org:8091', 'example.net'])
528
+
529
+ * Inherit StandardError instead RuntimeError for errors
530
+
531
+ ## 1.2.0.dp5 (2012-06-15)
532
+
533
+ 12 files changed, 939 insertions(+), 20 deletions(-)
534
+
535
+ * Integrate with Rack and Rails session store
536
+
537
+ # rack
538
+ require 'rack/session/couchbase'
539
+ use Rack::Session::Couchbase
540
+
541
+ # rails
542
+ require 'action_dispatch/middleware/session/couchbase_store'
543
+ AppName::Application.config.session_store :couchbase_store
544
+
545
+ * Implement cache store adapter for Rails
546
+
547
+ cache_options = {
548
+ :bucket => 'protected',
549
+ :username => 'protected',
550
+ :password => 'secret',
551
+ :expires_in => 30.seconds
552
+ }
553
+ config.cache_store = :couchbase_store, cache_options
554
+
555
+ * Implement key prefix (simple namespacing)
556
+
557
+ Couchbase.connect(:key_prefix => "prefix:")
558
+
559
+ * Allow to force assembling result Hash for multi-get
560
+
561
+ connection.get("foo", "bar")
562
+ #=> [1, 2]
563
+ connection.get("foo", "bar", :assemble_hash => true)
564
+ #=> {"foo" => 1, "bar" => 2}
565
+
566
+ ## 1.2.0.dp4 (2012-06-07)
567
+
568
+ 4 files changed, 34 insertions(+), 19 deletions(-)
569
+
570
+ * Update Bucket#replace documentation: it accepts :cas option
571
+
572
+ * RCBC-36 Fix segfault. Occasional segfault when accessing the
573
+ results of a View. https://gist.github.com/2883925
574
+
575
+ ## 1.2.0.dp3 (2012-06-06)
576
+
577
+ 4 files changed, 22 insertions(+), 4 deletions(-)
578
+
579
+ * Fix for multi_json < 1.3.3
580
+
581
+ * Break out from event loop for non-chunked responses. View results
582
+ are chunked by default, so there no problems, but other requests
583
+ like Bucket#save_design_doc() were "locking" awaiting forever.
584
+
585
+ ## 1.2.0.dp2 (2012-06-06)
586
+
587
+ 22 files changed, 859 insertions(+), 253 deletions(-)
588
+
589
+ * RCBC-31 Make Bucket#get more consistent. The pattern of using more
590
+ than one argument to determine if an array should be returned is not
591
+ idiomatic. Consider the case of a multi-get in an application where
592
+ I have n items to return. If there happens to be only one item it
593
+ will be treated differently than if there happens to be 2 items.
594
+
595
+ get(["foo"]) #=> ["bar"]
596
+ get("foo") #=> "bar"
597
+ get(["x"], :extended => true) #=> {"x"=>["xval", 0, 18336939621176836096]}
598
+
599
+ * Use monotonic high resolution clock
600
+
601
+ * Implement threshold for outgoing commands
602
+
603
+ * Allow to stop event loop from ruby
604
+
605
+ * RCBC-35 Fix the View parameters escaping. More info at
606
+ https://gist.github.com/2775050
607
+
608
+ * RCBC-34 Use multi_json gem. json_gem compatibility (require
609
+ 'yajl/json_gem') is notorious for causing all kinds of issues with
610
+ various gems. The most compatible way to use yajl is to call
611
+ Yajl::Parser and Yajl::Encoder directly.
612
+
613
+ * Allow to block and wait for part of the requests
614
+
615
+ * Fixed view iterator. It doesn't lock event loop anymore This used to
616
+ cause "locks", memory leaks or even segmentation fault.
617
+
618
+ * Define views only if "views" key presented
619
+
620
+ * Require yajl as development dependency
621
+
622
+ * RCBC-76 Implement get with lock operation. Examples:
623
+
624
+ # Get and lock key using default timeout
625
+ c.get("foo", :lock => true)
626
+
627
+ # Determine lock timeout parameters
628
+ c.stats.values_at("ep_getl_default_timeout", "ep_getl_max_timeout")
629
+ #=> [{"127.0.0.2:11210"=>"15"}, {"127.0.0.1:11210"=>"30"}]
630
+
631
+ # Get and lock key using custom timeout
632
+ c.get("foo", :lock => 3)
633
+
634
+ * Update documentation
635
+
636
+ ## 1.1.3 (2012-07-27)
637
+
638
+ 5 files changed, 192 insertions(+), 101 deletions(-)
639
+
640
+ * RCBC-64 The Couchbase::Bucket class hasn't implemented the #dup
641
+ method. So it caused SEGFAULT. The patch is implementing correct
642
+ function, which copy the internals and initializes new connection.
643
+
644
+ * RCBC-59 The flags might be reset if caller will use
645
+ Couchbase::Bucket#cas operation. Here is IRB session demonstrating
646
+ the issue:
647
+
648
+ irb> Couchbase.bucket.set("foo", "bar", :flags => 0x100)
649
+ 17982951084586893312
650
+ irb> Couchbase.bucket.cas("foo") { "baz" }
651
+ 1712422461213442048
652
+ irb> Couchbase.bucket.get("foo", :extended => true)
653
+ ["baz", 0, 1712422461213442048]
654
+
655
+
656
+ * RCBC-60 Make object_space GC protector per-bucket object. Previous
657
+ version provided not completely thread-safe bucket instance, because
658
+ it was sharing global hash for protecting objects, created in
659
+ extension, from garbage collecting.
660
+
661
+ ## 1.1.2 (2012-06-05)
662
+
663
+ 5 files changed, 9 insertions(+), 4 deletions(-)
664
+
665
+ * Upgrade libcouchbase dependency to 1.0.4. Version 1.0.4 includes
666
+ important stability fixes.
667
+
668
+ * Backport debugger patch. The gem used to require debugger as
669
+ development dependency. Unfortunately ruby-debug19 isn't supported
670
+ anymore for ruby 1.9.x. But there is new gem 'debugger'. This patch
671
+ replaces this dependency.
672
+
673
+ ## 1.2.0.dp (2012-04-10)
674
+
675
+ 19 files changed, 1606 insertions(+), 93 deletions(-)
676
+
677
+ * Properly handle hashes as Couchbase.connection_options. Fixed a bug
678
+ when 'Couchbase.connection_options' for "default" connection, when
679
+ there are several arguments to pass to the connect() function when
680
+ establishing thread local connection as below:
681
+
682
+ Couchbase.connection_options = {:port => 9000, :bucket => 'myapp'}
683
+
684
+ * Implement views. Couchbase Server Views are accessible using the
685
+ view APIs. Please refer to
686
+ http://www.couchbase.com/docs/couchbase-manual-2.0/couchbase-views.html
687
+ for getting started with views.
688
+
689
+ * Use verbose mode by default throwing exceptions on NOT_FOUND errors.
690
+ This means that quiet attribute is false now on new connections.
691
+
692
+ * Documentation fixes
693
+
694
+ ## 1.1.1 (2012-03-19)
695
+
696
+ 5 files changed, 83 insertions(+), 23 deletions(-)
697
+
698
+ * Flags are used differently in different clients for example between
699
+ Python and Ruby. This fix will force the format to a known value
700
+ irrespective of the flags.
701
+
702
+ * Calls between Ruby and C libraries for Couchbase which involved
703
+ default arguments had an associated arity of -1 which was not being
704
+ handled correctly. That is being handled correctly now.
705
+
706
+ ## 1.1.0 (2012-03-07)
707
+
708
+ 27 files changed, 2460 insertions(+), 849 deletions(-)
709
+
710
+ * With the usage of the URI parser from stdlib it is possible to
711
+ validate the bucket URI more strictly. Also, it is possible to
712
+ specify credentials in the URI like:
713
+ http://username:password@example.com:8091/pools/default/buckets/custom
714
+
715
+ * The "default" connection is available in thread local storage. This
716
+ mean that using the Couchbase.bucket method it is possible to get
717
+ access to current connection and there is no need to share
718
+ connections when running in multi-thread environment. Each thread
719
+ has its own connection reference.
720
+
721
+ * The direct dependency on libevent and libsasl has been removed. Now
722
+ the library doesn't require libevent headers installed.
723
+
724
+ * The disconnect and reconnect interfaces are implemented which
725
+ provide routines for explicit resource management. Connections were
726
+ freed only when the Garbage Collector found that the connection was
727
+ not being used. Now it's possible for the client to check if the
728
+ bucket was connected using 'connected?' or 'disconnect' it manually
729
+ or 'reconnect' using old settings.
730
+
731
+ * There were spurious timeout issues with a compound statement like
732
+ below. No timeout will occur unless there is a problem with the
733
+ connection.
734
+
735
+ connection.run do
736
+ connection.get("foo") {|ret| puts "got foo = #{ret.value}"}
737
+ sleep(5)
738
+ end
739
+
740
+ * It is not required to install libcouchbase or libvbucket on windows.
741
+
742
+ * It is possible to store nil as a value. It is possible to
743
+ distinguish a nil value from a missing key by looking at at the
744
+ value returned and the flags and CAS values as well.
745
+
746
+ * Based on the time out fix (CCBC-20), clients will be notified when
747
+ the connection was dropped or host isn't available.
748
+
749
+ ## 1.0.0 (2012-01-23)
750
+
751
+ 50 files changed, 4696 insertions(+), 2647 deletions(-)
752
+
753
+ * Port library to use libcouchbase instead of memcached gem.
754
+ Implemented following operations:
755
+
756
+ * get, []
757
+ * set, []=
758
+ * add
759
+ * replace
760
+ * append
761
+ * prepend
762
+ * compare-and-swap
763
+ * arithmetic (incr/decr)
764
+ * flush
765
+ * stats
766
+ * delete
767
+ * touch
768
+
769
+ * Introduce support for three data formats:
770
+
771
+ * document
772
+ * marshal
773
+ * plain
774
+
775
+ * Removed Views support
776
+
777
+ * Added benchmarks, couchbase vs. memcached vs. dalli
778
+
779
+ * Implement asynchronous protocol
780
+
781
+ ## 0.9.8 (2011-12-16)
782
+
783
+ 3 files changed, 8 insertions(+), 3 deletions(-)
784
+
785
+ * RCBC-10 Always specify credentials for non-default buckets. It was
786
+ impossible to store data in non-default buckets
787
+
788
+ ## 0.9.7 (2011-10-05)
789
+
790
+ 7 files changed, 31 insertions(+), 19 deletions(-)
791
+
792
+ * Fix design doc removing
793
+
794
+ * Fix 'set' method signature: add missing options argument
795
+
796
+ * Rename gem to 'couchbase' for easy of use. The github project still
797
+ is 'couchbase-ruby-client'
798
+
799
+ ## 0.9.6 (2011-10-04)
800
+
801
+ 13 files changed, 609 insertions(+), 99 deletions(-)
802
+
803
+ * Fix bug with decoding multiget result
804
+
805
+ * Allow create design documents from IO and String
806
+
807
+ * Rename 'json' format to 'document', and describe possible formats
808
+
809
+ * Allow to handle errors in view result stream
810
+
811
+ * Remove dependency on libyajl library: it bundled with yaji now
812
+
813
+ ## 0.9.5 (2011-08-24)
814
+
815
+ 4 files changed, 59 insertions(+), 28 deletions(-)
816
+
817
+ * Update README. Make it more human-friendly
818
+
819
+ * Removed dependency on will_paginate in development mode
820
+
821
+ ## 0.9.4 (2011-08-01)
822
+
823
+ 24 files changed, 1240 insertions(+), 78 deletions(-)
824
+
825
+ * Use streaming json parser to iterate over view results
826
+
827
+ * Update memcached gem dependency to v1.3
828
+
829
+ * Proxy TOUCH command to memcached client
830
+
831
+ * Fix minor bugs in RestClient and Document classes
832
+
833
+ * Disable CouchDB API for nodes without 'couchApiBase' key provided.
834
+
835
+ * Fix bug with unicode parsing in config listener
836
+
837
+ * 61f394e RCBC-5 Add Dave's test case: ensure memcached client
838
+ initialized. Fixes Timeout error on connecting to membase with
839
+ Couchbase.new on Ruby 1.8.7
840
+
841
+ ## 0.9.3 (2011-07-29)
842
+
843
+ 6 files changed, 167 insertions(+), 9 deletions(-)
844
+
845
+ * Use Latch (via Mutex and ConditionVariable) to wait until initial
846
+ setup will be finished.
847
+
848
+ * Update prefix for development views (from '$dev_' to 'dev_')
849
+
850
+ ## 0.9.2 (2011-07-28)
851
+
852
+ 5 files changed, 31 insertions(+), 20 deletions(-)
853
+
854
+ * Use zero TTL by default to store records forever
855
+
856
+ * Update documentation
857
+
858
+ * Wait until configuration is done
859
+
860
+ ## 0.9.1 (2011-07-25)
861
+
862
+ 3 files changed, 5 insertions(+), 2 deletions(-)
863
+
864
+ * Minor bugfix for RestClient initialization
865
+
866
+ ## 0.9.0 (2011-07-25)
867
+
868
+ 19 files changed, 1174 insertions(+)
869
+
870
+ * Initial public release. It supports most of the binary protocol
871
+ commands through memcached gem and also is able to listen to bucket
872
+ configuration and make View requests.