couchbase 2.0.0.pre.1-java

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.
@@ -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.