couchbase-jruby-client 0.2.2-java → 1.0.4-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.
- checksums.yaml +4 -4
- data/.rubocop.yml +103 -0
- data/.ruby-version +1 -1
- data/Rakefile +13 -2
- data/couchbase-jruby-client.gemspec +7 -6
- data/lib/couchbase/bucket.rb +11 -338
- data/lib/couchbase/cluster.rb +10 -88
- data/lib/couchbase/configuration.rb +39 -0
- data/lib/couchbase/design_doc.rb +18 -73
- data/lib/couchbase/document.rb +34 -0
- data/lib/couchbase/error.rb +0 -35
- data/lib/couchbase/operations.rb +60 -40
- data/lib/couchbase/version.rb +1 -1
- data/lib/couchbase/view.rb +55 -345
- data/lib/couchbase.rb +37 -141
- data/lib/jars/couchbase-core-io-1.1.4.jar +0 -0
- data/lib/jars/couchbase-java-client-2.1.4.jar +0 -0
- data/lib/jars/rxjava-1.0.8.jar +0 -0
- data/lib/jars/rxjruby-0.0.1.jar +0 -0
- data/test/{test_cas.rb → helper.rb} +15 -10
- data/test/test_bucket.rb +14 -228
- data/test/test_cluster.rb +1 -29
- data/test/test_configuration.rb +51 -0
- data/test/test_couchbase.rb +28 -28
- data/test/test_design_doc.rb +29 -0
- data/test/test_document.rb +51 -0
- data/test/test_operations.rb +49 -0
- data/test/test_view.rb +62 -116
- metadata +43 -125
- data/lib/couchbase/async/callback.rb +0 -38
- data/lib/couchbase/async/queue.rb +0 -26
- data/lib/couchbase/async.rb +0 -32
- data/lib/couchbase/constants.rb +0 -29
- data/lib/couchbase/operations/arithmetic.rb +0 -290
- data/lib/couchbase/operations/delete.rb +0 -115
- data/lib/couchbase/operations/design_docs.rb +0 -99
- data/lib/couchbase/operations/fetch.rb +0 -33
- data/lib/couchbase/operations/get.rb +0 -303
- data/lib/couchbase/operations/stats.rb +0 -42
- data/lib/couchbase/operations/store.rb +0 -463
- data/lib/couchbase/operations/touch.rb +0 -140
- data/lib/couchbase/operations/unlock.rb +0 -209
- data/lib/couchbase/operations/utils.rb +0 -68
- data/lib/couchbase/query.rb +0 -76
- data/lib/couchbase/result.rb +0 -60
- data/lib/couchbase/transcoder.rb +0 -81
- data/lib/couchbase/utils.rb +0 -62
- data/lib/couchbase/view_row.rb +0 -227
- data/lib/jars/commons-codec-1.5.jar +0 -0
- data/lib/jars/couchbase-client-1.3.2-javadoc.jar +0 -0
- data/lib/jars/couchbase-client-1.3.2-sources.jar +0 -0
- data/lib/jars/couchbase-client-1.3.2.jar +0 -0
- data/lib/jars/httpcore-4.3.1.jar +0 -0
- data/lib/jars/httpcore-nio-4.3.1.jar +0 -0
- data/lib/jars/jettison-1.1.jar +0 -0
- data/lib/jars/netty-3.5.5.Final.jar +0 -0
- data/lib/jars/spymemcached-2.10.5-javadoc.jar +0 -0
- data/lib/jars/spymemcached-2.10.5-sources.jar +0 -0
- data/lib/jars/spymemcached-2.10.5.jar +0 -0
- data/tasks/benchmark.rake +0 -6
- data/tasks/test.rake +0 -36
- data/tasks/util.rake +0 -21
- data/test/mock.rb +0 -85
- data/test/profile/.gitignore +0 -1
- data/test/profile/.jrubyrc +0 -722
- data/test/profile/Gemfile +0 -7
- data/test/profile/benchmark.rb +0 -177
- data/test/profile/profile.rb +0 -59
- data/test/setup.rb +0 -74
- data/test/test_arithmetic.rb +0 -155
- data/test/test_async.rb +0 -24
- data/test/test_couchbase_rails_cache_store.rb +0 -341
- data/test/test_delete.rb +0 -139
- data/test/test_design_docs.rb +0 -67
- data/test/test_errors.rb +0 -74
- data/test/test_fetch.rb +0 -71
- data/test/test_format.rb +0 -142
- data/test/test_get.rb +0 -363
- data/test/test_query.rb +0 -23
- data/test/test_result.rb +0 -15
- data/test/test_stats.rb +0 -44
- data/test/test_store.rb +0 -203
- data/test/test_touch.rb +0 -90
- data/test/test_unlock.rb +0 -89
- data/test/test_utils.rb +0 -67
- data/test/test_version.rb +0 -28
- data/test/test_view_row.rb +0 -74
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97f6ffc94c3d26dea77d88c7f57145ac9b8b061b
|
4
|
+
data.tar.gz: 5f969c7a83b8c5a62e2cd003f05182ddb9977091
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a04e21b82c3af1c422378f161d0102a5996788a1aa556f59e01618228643208acafe712e53e456bea8ead32cd35d3734b383b90c3c3bf9f06b2dfb73d2ac4e5
|
7
|
+
data.tar.gz: 52babb42001362e77794530e70113985b0fc08229c96c3beb1fd3b3a8602df6d8d9b16092f3de09543046be8da1a2295531a243682ca032f189a8f416f03dd24
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
AllCops:
|
2
|
+
Includes:
|
3
|
+
- '**/Gemfile'
|
4
|
+
- '**/Rakefile'
|
5
|
+
|
6
|
+
Style/EmptyLinesAroundClassBody:
|
7
|
+
Enabled: false
|
8
|
+
|
9
|
+
Style/EmptyLinesAroundModuleBody:
|
10
|
+
Enabled: false
|
11
|
+
|
12
|
+
Style/ModuleFunction:
|
13
|
+
Enabled: false
|
14
|
+
|
15
|
+
Metrics/AbcSize:
|
16
|
+
Enabled: true
|
17
|
+
Max: 20
|
18
|
+
|
19
|
+
# Avoid long parameter lists
|
20
|
+
ParameterLists:
|
21
|
+
Max: 3
|
22
|
+
CountKeywordArgs: true
|
23
|
+
|
24
|
+
MethodLength:
|
25
|
+
CountComments: false
|
26
|
+
Max: 15 # TODO: lower to 15
|
27
|
+
|
28
|
+
ClassLength:
|
29
|
+
CountComments: false
|
30
|
+
Max: 132 # TODO: lower to 100
|
31
|
+
|
32
|
+
CyclomaticComplexity:
|
33
|
+
Max: 6 # TODO: lower to 6
|
34
|
+
|
35
|
+
# Avoid more than `Max` levels of nesting.
|
36
|
+
BlockNesting:
|
37
|
+
Max: 3
|
38
|
+
|
39
|
+
# Align with the style guide.
|
40
|
+
CollectionMethods:
|
41
|
+
PreferredMethods:
|
42
|
+
collect: 'map'
|
43
|
+
inject: 'reduce'
|
44
|
+
find_all: 'select'
|
45
|
+
|
46
|
+
AccessModifierIndentation:
|
47
|
+
Enabled: false
|
48
|
+
|
49
|
+
# Limit line length
|
50
|
+
LineLength:
|
51
|
+
Enabled: false
|
52
|
+
|
53
|
+
# Disable documentation checking until a class needs to be documented once
|
54
|
+
Documentation:
|
55
|
+
Enabled: false
|
56
|
+
|
57
|
+
# Not all trivial readers/writers can be defined with attr_* methods
|
58
|
+
TrivialAccessors:
|
59
|
+
Enabled: false
|
60
|
+
|
61
|
+
# Enforce Ruby 1.8-compatible hash syntax
|
62
|
+
# HashSyntax:
|
63
|
+
# EnforcedStyle: hash_rockets
|
64
|
+
|
65
|
+
# No spaces inside hash literals
|
66
|
+
# SpaceInsideHashLiteralBraces:
|
67
|
+
# EnforcedStyle: no_space
|
68
|
+
|
69
|
+
Style/MultilineOperationIndentation:
|
70
|
+
Enabled: true
|
71
|
+
EnforcedStyle: indented
|
72
|
+
|
73
|
+
# Allow dots at the end of lines
|
74
|
+
DotPosition:
|
75
|
+
Enabled: false
|
76
|
+
|
77
|
+
# Don't require magic comment at the top of every file
|
78
|
+
Encoding:
|
79
|
+
Enabled: false
|
80
|
+
|
81
|
+
# Enforce outdenting of access modifiers (i.e. public, private, protected)
|
82
|
+
# AccessModifierIndentation:
|
83
|
+
# EnforcedStyle: outdent
|
84
|
+
|
85
|
+
EmptyLinesAroundAccessModifier:
|
86
|
+
Enabled: true
|
87
|
+
|
88
|
+
# Align ends correctly
|
89
|
+
EndAlignment:
|
90
|
+
AlignWith: variable
|
91
|
+
|
92
|
+
# Indentation of when/else
|
93
|
+
# CaseIndentation:
|
94
|
+
# IndentWhenRelativeTo: end
|
95
|
+
# IndentOneStep: false
|
96
|
+
|
97
|
+
# Use the old lambda literal syntax
|
98
|
+
# Lambda:
|
99
|
+
# Enabled: false
|
100
|
+
|
101
|
+
# Semicolon:
|
102
|
+
# Exclude:
|
103
|
+
# - 'spec/support/'
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
jruby-1.7.
|
1
|
+
jruby-1.7.21@cb-client
|
data/Rakefile
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
2
3
|
|
3
|
-
|
4
|
+
Rake::TestTask.new(:test) do |test|
|
5
|
+
test.libs << 'test'
|
6
|
+
test.pattern = 'test/**/test_*.rb'
|
7
|
+
test.verbose = true
|
8
|
+
end
|
4
9
|
|
5
|
-
task :
|
10
|
+
task default: :test
|
11
|
+
|
12
|
+
task :pry do
|
13
|
+
require 'couchbase'
|
14
|
+
require 'pry'
|
15
|
+
Pry.start
|
16
|
+
end
|
@@ -19,13 +19,14 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
20
20
|
s.require_paths = ['lib']
|
21
21
|
|
22
|
-
s.add_runtime_dependency 'multi_json'
|
23
|
-
s.add_runtime_dependency '
|
22
|
+
s.add_runtime_dependency 'multi_json'
|
23
|
+
# s.add_runtime_dependency 'jbundler'
|
24
|
+
# s.requirements << "jar 'com.couchbase:java-client', '2.1.1'"
|
24
25
|
|
25
|
-
s.add_development_dependency 'bundler'
|
26
|
+
s.add_development_dependency 'bundler'
|
26
27
|
s.add_development_dependency 'rake'
|
27
|
-
s.add_development_dependency 'minitest'
|
28
|
-
s.add_development_dependency 'jrjackson'
|
28
|
+
s.add_development_dependency 'minitest'
|
29
|
+
s.add_development_dependency 'jrjackson'
|
29
30
|
s.add_development_dependency 'pry'
|
30
|
-
s.add_development_dependency '
|
31
|
+
s.add_development_dependency 'rubocop'
|
31
32
|
end
|
data/lib/couchbase/bucket.rb
CHANGED
@@ -16,357 +16,30 @@
|
|
16
16
|
#
|
17
17
|
|
18
18
|
module Couchbase
|
19
|
-
|
20
19
|
class Bucket
|
21
|
-
|
22
|
-
java_import java.io.IOException
|
23
|
-
java_import java.net.SocketAddress
|
24
|
-
java_import java.net.URI
|
25
|
-
java_import java.net.URISyntaxException
|
26
|
-
java_import java.util.ArrayList
|
27
|
-
java_import java.util.LinkedList
|
28
|
-
java_import java.util.List
|
29
|
-
java_import java.util.concurrent.Future
|
30
|
-
java_import java.util.concurrent.TimeUnit
|
31
|
-
java_import com.couchbase.client.CouchbaseClient
|
32
|
-
java_import com.couchbase.client.CouchbaseConnectionFactory
|
33
|
-
java_import com.couchbase.client.CouchbaseConnectionFactoryBuilder
|
34
|
-
|
35
20
|
include Couchbase::Operations
|
36
|
-
include Couchbase::Async
|
37
|
-
|
38
|
-
attr_accessor :quiet, :hostname, :port, :pool, :bucket, :username,
|
39
|
-
:password, :default_ttl, :timeout, :default_format,
|
40
|
-
:default_arithmetic_init, :transcoder, :transcoders
|
41
|
-
|
42
|
-
attr_reader :client, :key_prefix, :default_format
|
43
|
-
|
44
|
-
DEFAULT_OPTIONS = {
|
45
|
-
type: nil,
|
46
|
-
quiet: false,
|
47
|
-
hostname: 'localhost',
|
48
|
-
port: 8091,
|
49
|
-
pool: 'default',
|
50
|
-
bucket: 'default',
|
51
|
-
password: '',
|
52
|
-
engine: nil,
|
53
|
-
default_ttl: 0,
|
54
|
-
default_arithmetic_init: 0,
|
55
|
-
default_flags: 0,
|
56
|
-
default_format: :document,
|
57
|
-
default_observe_timeout: 2_500_000,
|
58
|
-
on_error: nil,
|
59
|
-
on_connect: nil,
|
60
|
-
timeout: 0,
|
61
|
-
environment: nil,
|
62
|
-
key_prefix: nil,
|
63
|
-
node_list: nil,
|
64
|
-
destroying: 0,
|
65
|
-
connected: 0,
|
66
|
-
on_connect_proc: nil,
|
67
|
-
connected: false
|
68
|
-
}.freeze
|
69
|
-
|
70
|
-
# Initialize new Bucket.
|
71
|
-
#
|
72
|
-
# @since 1.0.0
|
73
|
-
#
|
74
|
-
# @overload initialize(url, options = {})
|
75
|
-
# Initialize bucket using URI of the cluster and options. It is possible
|
76
|
-
# to override some parts of URI using the options keys (e.g. :host or
|
77
|
-
# :port)
|
78
|
-
#
|
79
|
-
# @param [String] url The full URL of management API of the cluster.
|
80
|
-
# @param [Hash] options The options for connection. See options definition
|
81
|
-
# below.
|
82
|
-
#
|
83
|
-
# @overload initialize(options = {})
|
84
|
-
# Initialize bucket using options only.
|
85
|
-
#
|
86
|
-
# @param [Hash] options The options for operation for connection
|
87
|
-
# @option options [Array] :node_list (nil) the list of nodes to connect
|
88
|
-
# to. If specified it takes precedence over +:host+ option. The list
|
89
|
-
# must be array of strings in form of host names or host names with
|
90
|
-
# ports (in first case port 8091 will be used, see examples).
|
91
|
-
# @option options [String] :host ("localhost") the hostname or IP address
|
92
|
-
# of the node
|
93
|
-
# @option options [Fixnum] :port (8091) the port of the managemenent API
|
94
|
-
# @option options [String] :pool ("default") the pool name
|
95
|
-
# @option options [String] :bucket ("default") the bucket name
|
96
|
-
# @option options [Fixnum] :default_ttl (0) the TTL used by default during
|
97
|
-
# storing key-value pairs.
|
98
|
-
# @option options [Fixnum] :default_flags (0) the default flags.
|
99
|
-
# @option options [Symbol] :default_format (:document) the format, which
|
100
|
-
# will be used for values by default. Note that changing format will
|
101
|
-
# amend flags. (see {Bucket#default_format})
|
102
|
-
# @option options [String] :username (nil) the user name to connect to the
|
103
|
-
# cluster. Used to authenticate on management API. The username could
|
104
|
-
# be skipped for protected buckets, the bucket name will be used
|
105
|
-
# instead.
|
106
|
-
# @option options [String] :password (nil) the password of the user.
|
107
|
-
# @option options [true, false] :quiet (false) the flag controlling if raising
|
108
|
-
# exception when the client executes operations on non-existent keys. If it
|
109
|
-
# is +true+ it will raise {Couchbase::Error::NotFound} exceptions. The
|
110
|
-
# default behaviour is to return +nil+ value silently (might be useful in
|
111
|
-
# Rails cache).
|
112
|
-
# @option options [Symbol] :environment (:production) the mode of the
|
113
|
-
# connection. Currently it influences only on design documents set. If
|
114
|
-
# the environment is +:development+, you will able to get design
|
115
|
-
# documents with 'dev_' prefix, otherwise (in +:production+ mode) the
|
116
|
-
# library will hide them from you.
|
117
|
-
# @option options [String] :key_prefix (nil) the prefix string which will
|
118
|
-
# be prepended to each key before sending out, and sripped before
|
119
|
-
# returning back to the application.
|
120
|
-
# @option options [Fixnum] :timeout (2500000) the timeout for IO
|
121
|
-
# operations (in microseconds)
|
122
|
-
# @option options [Fixnum, true] :default_arithmetic_init (0) the default
|
123
|
-
# initial value for arithmetic operations. Setting this option to any
|
124
|
-
# non positive number forces creation missing keys with given default
|
125
|
-
# value. Setting it to +true+ will use zero as initial value. (see
|
126
|
-
# {Bucket#incr} and {Bucket#decr}).
|
127
|
-
# @option options [Symbol] :engine (:default) the IO engine to use
|
128
|
-
# Currently following engines are supported:
|
129
|
-
# :default :: Built-in engine (multi-thread friendly)
|
130
|
-
# :libevent :: libevent IO plugin from libcouchbase (optional)
|
131
|
-
# :libev :: libev IO plugin from libcouchbase (optional)
|
132
|
-
# :eventmachine :: EventMachine plugin (builtin, but requires EM gem and ruby 1.9+)
|
133
|
-
#
|
134
|
-
# @example Initialize connection using default options
|
135
|
-
# Couchbase.new
|
136
|
-
#
|
137
|
-
# @example Select custom bucket
|
138
|
-
# Couchbase.new(:bucket => 'foo')
|
139
|
-
# Couchbase.new('http://localhost:8091/pools/default/buckets/foo')
|
140
|
-
#
|
141
|
-
# @example Connect to protected bucket
|
142
|
-
# Couchbase.new(:bucket => 'protected', :username => 'protected', :password => 'secret')
|
143
|
-
# Couchbase.new('http://localhost:8091/pools/default/buckets/protected',
|
144
|
-
# :username => 'protected', :password => 'secret')
|
145
|
-
#
|
146
|
-
# @example Use list of nodes, in case some nodes might be dead
|
147
|
-
# Couchbase.new(:node_list => ['example.com:8091', 'example.org:8091', 'example.net'])
|
148
|
-
#
|
149
|
-
# @raise [Couchbase::Error::BucketNotFound] if there is no such bucket to
|
150
|
-
# connect to
|
151
|
-
#
|
152
|
-
# @raise [Couchbase::Error::Connect] if the socket wasn't accessible
|
153
|
-
# (doesn't accept connections or doesn't respond in time)
|
154
|
-
#
|
155
|
-
# @return [Bucket]
|
156
|
-
#
|
157
|
-
def initialize(url = nil, options = {})
|
158
|
-
url_options = expand_url_options(url)
|
159
|
-
|
160
|
-
options = Couchbase.normalize_connection_options(options)
|
161
|
-
|
162
|
-
connection_options = DEFAULT_OPTIONS.merge(url_options).merge(options)
|
163
|
-
|
164
|
-
connection_options.each_pair do |key, value|
|
165
|
-
instance_variable_set("@#{key}", value)
|
166
|
-
end
|
167
|
-
|
168
|
-
self.password = '' if self.password.nil?
|
169
|
-
|
170
|
-
@transcoders = {
|
171
|
-
document: Transcoder::Document.new,
|
172
|
-
marshal: Transcoder::Marshal.new,
|
173
|
-
plain: Transcoder::Plain.new
|
174
|
-
}
|
175
|
-
|
176
|
-
connect
|
177
|
-
end
|
178
|
-
|
179
|
-
def quiet?
|
180
|
-
!!quiet
|
181
|
-
end
|
182
|
-
|
183
|
-
def host
|
184
|
-
hostname
|
185
|
-
end
|
186
|
-
|
187
|
-
def connect
|
188
|
-
uris = expand_node_list
|
189
|
-
|
190
|
-
begin
|
191
|
-
builder = CouchbaseConnectionFactoryBuilder.new
|
192
|
-
builder.setTranscoder(transcoder)
|
193
|
-
connection_factory = builder.buildCouchbaseConnection(uris, bucket.to_java_string, password.to_java_string)
|
194
|
-
@client = CouchbaseClient.new(connection_factory)
|
195
|
-
@connected = true
|
196
|
-
rescue Java::ComCouchbaseClientVbucket::ConfigurationException => e
|
197
|
-
fail Couchbase::Error::Auth, "Couchbase configurations are incorrect: #{e.to_s}"
|
198
|
-
rescue java.net.ConnectException => e
|
199
|
-
fail Couchbase::Error::Connect, e.to_s
|
200
|
-
end
|
201
|
-
|
202
|
-
self
|
203
|
-
end
|
204
|
-
alias_method :reconnect, :connect
|
205
21
|
|
206
|
-
|
207
|
-
"#{hostname}:#{port}"
|
208
|
-
end
|
209
|
-
|
210
|
-
def base_url
|
211
|
-
"http://#{authority}/pools"
|
212
|
-
end
|
213
|
-
|
214
|
-
def url
|
215
|
-
"http://#{authority}/pools/#{pool}/buckets/#{bucket}/"
|
216
|
-
end
|
217
|
-
|
218
|
-
def connected?
|
219
|
-
@connected
|
220
|
-
end
|
221
|
-
|
222
|
-
def disconnect
|
223
|
-
if connected? && @client.shutdown(3, TimeUnit::SECONDS)
|
224
|
-
@client = nil
|
225
|
-
@connection_factory = nil
|
226
|
-
@connected = false
|
227
|
-
else
|
228
|
-
fail Couchbase::Error::Connect
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
def transcoder
|
233
|
-
transcoders[default_format]
|
234
|
-
end
|
22
|
+
attr_reader :bucket
|
235
23
|
|
236
|
-
def
|
237
|
-
@
|
24
|
+
def initialize(bucket)
|
25
|
+
@bucket = bucket
|
238
26
|
end
|
239
27
|
|
240
|
-
def
|
241
|
-
@
|
28
|
+
def async
|
29
|
+
@bucket.async
|
242
30
|
end
|
243
31
|
|
244
|
-
def
|
245
|
-
|
246
|
-
|
247
|
-
hash[ip.to_s] = ver
|
248
|
-
end
|
249
|
-
end
|
32
|
+
def save_design_doc(name, design_doc, development = false)
|
33
|
+
design_doc = DesignDoc.new(name, design_doc)
|
34
|
+
@bucket.bucket_manager.upsert_design_document(design_doc.create, development)
|
250
35
|
end
|
251
36
|
|
252
|
-
|
253
|
-
|
254
|
-
# @since 1.0.0
|
255
|
-
#
|
256
|
-
# Reads a key's value from the server and yields it to a block. Replaces
|
257
|
-
# the key's value with the result of the block as long as the key hasn't
|
258
|
-
# been updated in the meantime, otherwise raises
|
259
|
-
# {Couchbase::Error::KeyExists}. CAS stands for "compare and swap", and
|
260
|
-
# avoids the need for manual key mutexing. Read more info here:
|
261
|
-
#
|
262
|
-
# In asynchronous mode it will yield result twice, first for
|
263
|
-
# {Bucket#get} with {Result#operation} equal to +:get+ and
|
264
|
-
# second time for {Bucket#set} with {Result#operation} equal to +:set+.
|
265
|
-
#
|
266
|
-
# @see http://couchbase.com/docs/memcached-api/memcached-api-protocol-text_cas.html
|
267
|
-
#
|
268
|
-
# @param [String, Symbol] key
|
269
|
-
#
|
270
|
-
# @param [Hash] options the options for "swap" part
|
271
|
-
# @option options [Fixnum] :ttl (self.default_ttl) the time to live of this key
|
272
|
-
# @option options [Symbol] :format (self.default_format) format of the value
|
273
|
-
# @option options [Fixnum] :flags (self.default_flags) flags for this key
|
274
|
-
#
|
275
|
-
# @yieldparam [Object, Result] value old value in synchronous mode and
|
276
|
-
# +Result+ object in asynchronous mode.
|
277
|
-
# @yieldreturn [Object] new value.
|
278
|
-
#
|
279
|
-
# @raise [Couchbase::Error::KeyExists] if the key was updated before the the
|
280
|
-
# code in block has been completed (the CAS value has been changed).
|
281
|
-
# @raise [ArgumentError] if the block is missing for async mode
|
282
|
-
#
|
283
|
-
# @example Implement append to JSON encoded value
|
284
|
-
#
|
285
|
-
# c.default_format = :document
|
286
|
-
# c.set("foo", {"bar" => 1})
|
287
|
-
# c.cas("foo") do |val|
|
288
|
-
# val["baz"] = 2
|
289
|
-
# val
|
290
|
-
# end
|
291
|
-
# c.get("foo") #=> {"bar" => 1, "baz" => 2}
|
292
|
-
#
|
293
|
-
# @example Append JSON encoded value asynchronously
|
294
|
-
#
|
295
|
-
# c.default_format = :document
|
296
|
-
# c.set("foo", {"bar" => 1})
|
297
|
-
# c.run do
|
298
|
-
# c.cas("foo") do |val|
|
299
|
-
# case val.operation
|
300
|
-
# when :get
|
301
|
-
# val["baz"] = 2
|
302
|
-
# val
|
303
|
-
# when :set
|
304
|
-
# # verify all is ok
|
305
|
-
# puts "error: #{ret.error.inspect}" unless ret.success?
|
306
|
-
# end
|
307
|
-
# end
|
308
|
-
# end
|
309
|
-
# c.get("foo") #=> {"bar" => 1, "baz" => 2}
|
310
|
-
#
|
311
|
-
# @return [Fixnum] the CAS of new value
|
312
|
-
def cas(key, options = {})
|
313
|
-
val, flags, ver = get(key, :extended => true)
|
314
|
-
val = yield(val) # get new value from caller
|
315
|
-
set(key, val, options.merge(:cas => ver))
|
37
|
+
def query(design_doc, view)
|
38
|
+
View.new(design_doc, view, self)
|
316
39
|
end
|
317
|
-
alias :compare_and_swap :cas
|
318
40
|
|
319
|
-
# Delete contents of the bucket
|
320
|
-
#
|
321
|
-
# @see http://www.couchbase.com/docs/couchbase-manual-2.0/restapi-flushing-bucket.html
|
322
|
-
#
|
323
|
-
# @since 1.2.0.beta
|
324
|
-
#
|
325
|
-
# @yieldparam [Result] ret the object with +error+, +status+ and +operation+
|
326
|
-
# attributes.
|
327
|
-
#
|
328
|
-
# @raise [Couchbase::Error::Protocol] in case of an error is
|
329
|
-
# encountered. Check {Couchbase::Error::Base#status} for detailed code.
|
330
|
-
#
|
331
|
-
# @return [true] always return true (see raise section)
|
332
|
-
#
|
333
|
-
# @example Simple flush the bucket
|
334
|
-
# c.flush #=> true
|
335
|
-
#
|
336
41
|
def flush
|
337
|
-
|
42
|
+
bucket.bucket_manager.flush
|
338
43
|
end
|
339
|
-
|
340
|
-
def async_flush
|
341
|
-
@client.flush
|
342
|
-
end
|
343
|
-
|
344
|
-
private
|
345
|
-
|
346
|
-
def path_to_pool_and_bucket(path)
|
347
|
-
{}
|
348
|
-
end
|
349
|
-
|
350
|
-
def expand_url_options(url)
|
351
|
-
if url.is_a? String
|
352
|
-
fail ArgumentError.new unless url =~ /^http:\/\//
|
353
|
-
uri = URI.new(url)
|
354
|
-
{ hostname: uri.host, port: uri.port }.merge(path_to_pool_and_bucket(uri.path))
|
355
|
-
elsif url.nil?
|
356
|
-
{}
|
357
|
-
else
|
358
|
-
url
|
359
|
-
end
|
360
|
-
end
|
361
|
-
|
362
|
-
def expand_node_list
|
363
|
-
if @node_list
|
364
|
-
Array(@node_list).map { |n| URI.new(n) }
|
365
|
-
else
|
366
|
-
Array(URI.new(base_url))
|
367
|
-
end
|
368
|
-
end
|
369
|
-
|
370
44
|
end
|
371
|
-
|
372
45
|
end
|
data/lib/couchbase/cluster.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
# Author::
|
2
|
-
# Copyright::
|
1
|
+
# Author:: Mike Evans <mike@urlgonomics.com>
|
2
|
+
# Copyright:: 2013 Urlgonomics LLC.
|
3
3
|
# License:: Apache License, Version 2.0
|
4
4
|
#
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -17,100 +17,22 @@
|
|
17
17
|
|
18
18
|
module Couchbase
|
19
19
|
|
20
|
-
class ClusterError < Error::Base; end
|
21
|
-
|
22
20
|
class Cluster
|
23
21
|
|
24
|
-
java_import java.
|
25
|
-
java_import com.couchbase.client.clustermanager.BucketType
|
26
|
-
java_import com.couchbase.client.clustermanager.FlushResponse
|
27
|
-
java_import com.couchbase.client.clustermanager.AuthType
|
28
|
-
|
29
|
-
# Establish connection to the cluster for administration
|
30
|
-
#
|
31
|
-
# @param [Hash] options The connection parameter
|
32
|
-
# @option options [String] :username The username
|
33
|
-
# @option options [String] :password The password
|
34
|
-
# @option options [String] :pool ("default") The pool name
|
35
|
-
# @option options [String] :hostname ("localhost") The hostname
|
36
|
-
# @option options [String] :port (8091) The port
|
37
|
-
def initialize(options)
|
38
|
-
if options[:username].nil? || options[:password].nil?
|
39
|
-
raise ArgumentError, "username and password mandatory to connect to the cluster"
|
40
|
-
end
|
22
|
+
java_import com.couchbase.client.java.CouchbaseCluster
|
41
23
|
|
42
|
-
|
43
|
-
hostname: 'localhost',
|
44
|
-
port: 8091
|
45
|
-
}.merge(options)
|
24
|
+
attr_reader :cluster
|
46
25
|
|
47
|
-
|
48
|
-
|
49
|
-
uri_list = Array(URI.new(cluster_uri))
|
50
|
-
@manager = Java::ComCouchbaseClient::ClusterManager.new(uri_list, options[:username], options[:password])
|
26
|
+
def initialize(hosts = 'localhost')
|
27
|
+
@cluster = CouchbaseCluster.create(hosts)
|
51
28
|
end
|
52
29
|
|
53
|
-
|
54
|
-
|
55
|
-
@manager.listBuckets
|
30
|
+
def open_bucket(name = 'default', password = '')
|
31
|
+
Bucket.new(@cluster.open_bucket(name, password))
|
56
32
|
end
|
57
33
|
|
58
|
-
|
59
|
-
|
60
|
-
# @param [String] name The name of the bucket
|
61
|
-
# @param [Hash] options
|
62
|
-
def delete_bucket(bucket)
|
63
|
-
@manager.deleteBucket(bucket)
|
64
|
-
end
|
65
|
-
|
66
|
-
# Create data bucket
|
67
|
-
#
|
68
|
-
# @param [String] name The name of the bucket
|
69
|
-
# @param [Hash] options The bucket parameters
|
70
|
-
# @option options [String] :bucket_type ("couchbase") The type of the
|
71
|
-
# bucket. Possible values are "memcached" and "couchbase".
|
72
|
-
# @option options [Fixnum] :ram_quota (100) The RAM quota in megabytes.
|
73
|
-
# @option options [Fixnum] :replica_number (1) The number of replicas of
|
74
|
-
# each document
|
75
|
-
# @option options [String] :auth_type ("sasl") The authentication type.
|
76
|
-
# Possible values are "sasl" and "none". Note you should specify free
|
77
|
-
# port for "none"
|
78
|
-
# @option options [Fixnum] :proxy_port The port for moxi
|
79
|
-
def create_bucket(name, options = {})
|
80
|
-
ram_quota = options[:ram_quota] || 100
|
81
|
-
replicas = options[:replica_number] || 0
|
82
|
-
flush = options.fetch(:flush) { true }
|
83
|
-
password = options[:password]
|
84
|
-
proxy_port = options[:proxy_port]
|
85
|
-
auth_type = options[:auth_type] || 'sasl'
|
86
|
-
bucket_type = options[:bucket_type] == 'memcached' ? BucketType::MEMCACHED : BucketType::COUCHBASE
|
87
|
-
|
88
|
-
if name == 'default'
|
89
|
-
@manager.createDefaultBucket(bucket_type, ram_quota, replicas, flush)
|
90
|
-
elsif auth == 'sasl'
|
91
|
-
@manager.createPortBucket(bucket_type, name, ram_quota, replicas, proxy_port, flush)
|
92
|
-
else
|
93
|
-
@manager.createNamedBucket(bucket_type, name, ram_quota, replicas, password, flush)
|
94
|
-
end
|
95
|
-
true
|
96
|
-
rescue Java::JavaLang::RuntimeException => e
|
97
|
-
raise ClusterError, e
|
98
|
-
end
|
99
|
-
|
100
|
-
def flush_bucket(bucket)
|
101
|
-
@manager.flushBucket(bucket) == FlushResponse::OK
|
102
|
-
end
|
103
|
-
|
104
|
-
def update_bucket(name, options)
|
105
|
-
# implement
|
106
|
-
end
|
107
|
-
|
108
|
-
def self.manage(cluster_uri, username, password, &block)
|
109
|
-
manager = new(cluster_uri, username, password)
|
110
|
-
yield manager
|
111
|
-
ensure
|
112
|
-
manager.shutdown
|
34
|
+
def disconnect
|
35
|
+
@cluster.disconnect
|
113
36
|
end
|
114
37
|
end
|
115
|
-
|
116
38
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Couchbase
|
2
|
+
|
3
|
+
class Configuration
|
4
|
+
|
5
|
+
DEFAULT_CONFIG = {
|
6
|
+
host: 'localhost',
|
7
|
+
bucket: 'default',
|
8
|
+
password: ''
|
9
|
+
}
|
10
|
+
|
11
|
+
Bucket = Struct.new(:name, :password)
|
12
|
+
|
13
|
+
attr_accessor :hosts, :buckets
|
14
|
+
|
15
|
+
def initialize(config = {})
|
16
|
+
config = DEFAULT_CONFIG.merge(symbolize_keys(config))
|
17
|
+
@hosts = Array(config[:hosts] || config[:host] || config[:hostname])
|
18
|
+
|
19
|
+
if config[:buckets]
|
20
|
+
@buckets = config[:buckets].map do |b|
|
21
|
+
b = symbolize_keys(b)
|
22
|
+
Bucket.new(b[:name], b[:password])
|
23
|
+
end
|
24
|
+
else
|
25
|
+
@buckets = [Bucket.new(config[:bucket], config[:password])]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def symbolize_keys(old_hash)
|
32
|
+
{}.tap do |hash|
|
33
|
+
old_hash.each_pair do |key, value|
|
34
|
+
hash[key.to_sym] = value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|