moneta 0.7.9 → 0.7.10

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.
Files changed (52) hide show
  1. data/.travis.yml +2 -2
  2. data/CHANGES +6 -0
  3. data/Gemfile +2 -0
  4. data/README.md +7 -4
  5. data/Rakefile +2 -2
  6. data/lib/moneta.rb +1 -0
  7. data/lib/moneta/adapters/activerecord.rb +1 -2
  8. data/lib/moneta/adapters/cassandra.rb +31 -26
  9. data/lib/moneta/adapters/cookie.rb +2 -2
  10. data/lib/moneta/adapters/couch.rb +5 -3
  11. data/lib/moneta/adapters/daybreak.rb +13 -9
  12. data/lib/moneta/adapters/dbm.rb +7 -3
  13. data/lib/moneta/adapters/file.rb +4 -3
  14. data/lib/moneta/adapters/fog.rb +5 -2
  15. data/lib/moneta/adapters/gdbm.rb +7 -3
  16. data/lib/moneta/adapters/hbase.rb +11 -9
  17. data/lib/moneta/adapters/kyotocabinet.rb +13 -8
  18. data/lib/moneta/adapters/leveldb.rb +9 -5
  19. data/lib/moneta/adapters/localmemcache.rb +7 -3
  20. data/lib/moneta/adapters/memcached/dalli.rb +16 -11
  21. data/lib/moneta/adapters/memcached/native.rb +20 -15
  22. data/lib/moneta/adapters/memory.rb +2 -1
  23. data/lib/moneta/adapters/mongo.rb +13 -8
  24. data/lib/moneta/adapters/pstore.rb +24 -21
  25. data/lib/moneta/adapters/redis.rb +14 -12
  26. data/lib/moneta/adapters/restclient.rb +10 -7
  27. data/lib/moneta/adapters/riak.rb +5 -1
  28. data/lib/moneta/adapters/sdbm.rb +7 -3
  29. data/lib/moneta/adapters/sequel.rb +13 -8
  30. data/lib/moneta/adapters/sqlite.rb +15 -10
  31. data/lib/moneta/adapters/tdb.rb +8 -4
  32. data/lib/moneta/adapters/tokyocabinet.rb +15 -10
  33. data/lib/moneta/adapters/tokyotyrant.rb +107 -0
  34. data/lib/moneta/cache.rb +17 -17
  35. data/lib/moneta/mixins.rb +7 -5
  36. data/lib/moneta/version.rb +1 -1
  37. data/lib/rack/moneta_store.rb +1 -1
  38. data/lib/rack/session/moneta.rb +6 -3
  39. data/script/benchmarks +28 -28
  40. data/script/generate-specs +96 -41
  41. data/script/memusage +40 -0
  42. data/script/start-services +1 -0
  43. data/spec/helper.rb +4 -1
  44. data/spec/moneta/adapter_tokyotyrant_spec.rb +30 -0
  45. data/spec/moneta/cache_file_memory_spec.rb +3 -3
  46. data/spec/moneta/cache_memory_null_spec.rb +1 -1
  47. data/spec/moneta/simple_tokyotyrant_spec.rb +155 -0
  48. data/spec/moneta/simple_tokyotyrant_with_expires_spec.rb +157 -0
  49. data/spec/monetaspecs.rb +79 -37
  50. data/spec/rack/moneta_store_spec.rb +1 -1
  51. data/spec/rack/session_moneta_spec.rb +27 -0
  52. metadata +10 -3
@@ -8,9 +8,9 @@ rvm:
8
8
  - rbx-19mode
9
9
  before_install:
10
10
  - script/kill-travis
11
- - script/start-services
12
11
  - script/install-kyotocabinet
13
- - sudo apt-get install -qq libtokyocabinet8 libtokyocabinet-dev liblzo2-dev libtdb-dev
12
+ - sudo apt-get install -qq libtokyocabinet8 libtokyocabinet-dev liblzo2-dev libtdb-dev tokyotyrant
13
+ - script/start-services
14
14
  - script/install-bundle
15
15
  - script/upload-bundle
16
16
  install: 'echo "Bundle installed"'
data/CHANGES CHANGED
@@ -1,3 +1,9 @@
1
+ 0.7.10
2
+
3
+ * Adapters::TokyoTyrant added
4
+ * Add attr_reader :backend and option :backend to some adapters
5
+ * Cache rename #backend to #adapter
6
+
1
7
  0.7.9
2
8
 
3
9
  * Adapters::KyotoCabinet added
data/Gemfile CHANGED
@@ -4,6 +4,7 @@ gemspec
4
4
  # Testing
5
5
  gem 'rake'
6
6
  gem 'rspec'
7
+ gem 'rspec-retry'
7
8
 
8
9
  # Serializer used by Transformer
9
10
  gem 'tnetstring'
@@ -37,6 +38,7 @@ gem 'sequel'
37
38
  gem 'dalli'
38
39
  gem 'riak-client'
39
40
  gem 'cassandra'
41
+ gem 'tokyotyrant'
40
42
  #gem 'hbaserb'
41
43
  #gem 'localmemcache'
42
44
  gem 'tdb', :platforms => :ruby
data/README.md CHANGED
@@ -107,6 +107,7 @@ Out of the box, it supports the following backends. Use the backend name symbol
107
107
  * [SDBM](http://www.ruby-doc.org/stdlib/libdoc/sdbm/rdoc/SDBM.html) (`:SDBM`)
108
108
  * [KyotoCabinet](http://fallabs.com/kyotocabinet/) (`:KyotoCabinet`)
109
109
  * [TokyoCabinet](http://fallabs.com/tokyocabinet/) (`:TokyoCabinet`)
110
+ * [TokyoTyrant](http://fallabs.com/tokyotyrant/) (`:TokyoTyrant`)
110
111
  * [Simple Samba database TDB](http://tdb.samba.org/) (`:TDB`)
111
112
  * Document databases:
112
113
  * [CouchDB](http://couchdb.apache.org/) (`:Couch`)
@@ -147,6 +148,8 @@ __NOTE:__ <a name="backend-matrix">The backend matrix</a> is much more readable
147
148
 
148
149
  <tr><td>PStore</td><td>-</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://ruby-doc.org/stdlib/libdoc/pstore/rdoc/PStore.html">PStore</a> store</td></tr>
149
150
 
151
+ <tr><td>TokyoTyrant</td><td>tokoytyrant</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://fallabs.com/tokyotyrant/">TokyoTyrant</a> database</td></tr>
152
+
150
153
  <tr><td>YAML</td><td>-</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://www.ruby-doc.org/stdlib/libdoc/yaml/rdoc/YAML/Store.html">YAML</a> store</td></tr>
151
154
 
152
155
  <tr><td>Daybreak</td><td>daybreak</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#55F">(✓)<sup>[7]</sup></td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td>Incredibly fast pure-ruby key/value store <a href="http://propublica.github.com/daybreak/">Daybreak</a></td></tr>
@@ -204,7 +207,7 @@ __NOTE:__ <a name="backend-matrix">The backend matrix</a> is much more readable
204
207
  * [1]: Make adapters thread-safe by using `Moneta::Lock` or by passing the option `:threadsafe => true` to `Moneta#new`. There is also `Moneta::Pool` which can be used to share a store between multiple threads if the store is multi-process safe. I recommend to add the option `:threadsafe` to ensure thread-safety since for example under JRuby and Rubinius even the basic datastructures are not thread safe due to the lack of a global interpreter lock (GIL). This differs from MRI where some adapters might appear thread safe already but only due to the GIL.
205
208
  * [2]: Share a Moneta store between multiple processes using `Moneta::Shared` (See below).
206
209
  * [3]: Add expiration support by using `Moneta::Expires` or by passing the option `:expires => true` to `Moneta#new`.
207
- * [4]: There are some servers which use the memcached protocol but which are persistent (e.g. [MemcacheDB](http://memcachedb.org/), [Kai](http://sourceforge.net/apps/mediawiki/kai), [IronCache](http://dev.iron.io/cache/reference/memcache/), [Roma](https://github.com/roma/roma/tree))
210
+ * [4]: There are some servers which use the memcached protocol but which are persistent (e.g. [MemcacheDB](http://memcachedb.org/), [Kai](http://sourceforge.net/apps/mediawiki/kai), [IronCache](http://dev.iron.io/cache/reference/memcache/), [Roma](https://github.com/roma/roma/tree) and [Flare](http://labs.gree.jp/Top/OpenSource/Flare-en.html))
208
211
  * [5]: Depends on server
209
212
  * [6]: Store is multi-process safe because it is an in-memory store, values are not shared between multiple processes
210
213
  * [7]: Store is multi-process safe, but not synchronized automatically between multiple processes
@@ -454,7 +457,7 @@ end
454
457
  begin
455
458
  mutex.lock
456
459
  mutex.locked? # returns true
457
- ...
460
+ # ...
458
461
  ensure
459
462
  mutex.unlock
460
463
  end
@@ -467,13 +470,13 @@ semaphore = Moneta::Semaphore.new(store, 'semaphore_counter', max_concurrent)
467
470
 
468
471
  semaphore.synchronize do
469
472
  semaphore.locked? # returns true
470
- ...
473
+ # ...
471
474
  end
472
475
 
473
476
  begin
474
477
  semaphore.enter
475
478
  semaphore.locked? # returns true
476
- ...
479
+ # ...
477
480
  ensure
478
481
  semaphore.leave
479
482
  end
data/Rakefile CHANGED
@@ -35,13 +35,13 @@ task :test do
35
35
  specs.shuffle!
36
36
  srand(old_seed)
37
37
 
38
- unstable = specs.select {|s| s =~ /quicklz|cassandra|action_dispatch/ }
38
+ unstable = specs.select {|s| s =~ /quicklz|action_dispatch/ }
39
39
  specs -= unstable
40
40
  end
41
41
 
42
42
  # Memcached and Redis specs cannot be used in parallel
43
43
  # because of flushing and lacking namespaces
44
- parallel = specs.reject {|s| s =~ /memcached|redis|client|shared|riak/ }
44
+ parallel = specs.reject {|s| s =~ /memcached|redis|client|shared|riak|tokyotyrant|couch|cassandra/ }
45
45
  serial = specs - parallel
46
46
 
47
47
  if ENV['TEST_GROUP'] =~ /^(\d+)\/(\d+)$/
@@ -57,6 +57,7 @@ module Moneta
57
57
  autoload :Sqlite, 'moneta/adapters/sqlite'
58
58
  autoload :TDB, 'moneta/adapters/tdb'
59
59
  autoload :TokyoCabinet, 'moneta/adapters/tokyocabinet'
60
+ autoload :TokyoTyrant, 'moneta/adapters/tokyotyrant'
60
61
  autoload :YAML, 'moneta/adapters/yaml'
61
62
  end
62
63
 
@@ -8,13 +8,12 @@ module Moneta
8
8
  include Defaults
9
9
 
10
10
  supports :create, :increment
11
+ attr_reader :table
11
12
 
12
13
  def self.tables
13
14
  @tables ||= {}
14
15
  end
15
16
 
16
- attr_reader :table
17
-
18
17
  # @param [Hash] options
19
18
  # @option options [String] :table ('moneta') Table name
20
19
  # @option options [Hash] :connection ActiveRecord connection configuration
@@ -11,43 +11,48 @@ module Moneta
11
11
  include Defaults
12
12
  include ExpiresSupport
13
13
 
14
+ attr_reader :backend
15
+
14
16
  # @param [Hash] options
15
17
  # @option options [String] :keyspace ('moneta') Cassandra keyspace
16
18
  # @option options [String] :column_family ('moneta') Cassandra column family
17
19
  # @option options [String] :host ('127.0.0.1') Server host name
18
20
  # @option options [Integer] :port (9160) Server port
19
21
  # @option options [Integer] :expires Default expiration time
22
+ # @option options [::Cassandra] :backend Use existing backend instance
20
23
  def initialize(options = {})
21
- options[:host] ||= '127.0.0.1'
22
- options[:port] ||= 9160
23
24
  self.default_expires = options[:expires]
24
- keyspace = (options[:keyspace] ||= 'moneta')
25
25
  @cf = (options[:column_family] || 'moneta').to_sym
26
- @client = ::Cassandra.new('system', "#{options[:host]}:#{options[:port]}")
27
- unless @client.keyspaces.include?(keyspace)
28
- cf_def = ::Cassandra::ColumnFamily.new(:keyspace => keyspace, :name => @cf.to_s)
29
- ks_def = ::Cassandra::Keyspace.new(:name => keyspace,
30
- :strategy_class => 'SimpleStrategy',
31
- :strategy_options => { 'replication_factor' => '1' },
32
- :replication_factor => 1,
33
- :cf_defs => [cf_def])
34
- # Wait for keyspace to be created (issue #24)
35
- 10.times do
36
- begin
37
- @client.add_keyspace(ks_def)
38
- rescue Exception => ex
39
- warn "Moneta::Adapters::Cassandra - #{ex.message}"
26
+ if options[:backend]
27
+ @backend = options[:backend]
28
+ else
29
+ keyspace = options[:keyspace] || 'moneta'
30
+ @backend = ::Cassandra.new('system', "#{options[:host] || '127.0.0.1'}:#{options[:port] || 9160}")
31
+ unless @backend.keyspaces.include?(keyspace)
32
+ cf_def = ::Cassandra::ColumnFamily.new(:keyspace => keyspace, :name => @cf.to_s)
33
+ ks_def = ::Cassandra::Keyspace.new(:name => keyspace,
34
+ :strategy_class => 'SimpleStrategy',
35
+ :strategy_options => { 'replication_factor' => '1' },
36
+ :replication_factor => 1,
37
+ :cf_defs => [cf_def])
38
+ # Wait for keyspace to be created (issue #24)
39
+ 10.times do
40
+ begin
41
+ @backend.add_keyspace(ks_def)
42
+ rescue Exception => ex
43
+ warn "Moneta::Adapters::Cassandra - #{ex.message}"
44
+ end
45
+ break if @backend.keyspaces.include?(keyspace)
46
+ sleep 0.1
40
47
  end
41
- break if @client.keyspaces.include?(keyspace)
42
- sleep 0.1
43
48
  end
49
+ @backend.keyspace = keyspace
44
50
  end
45
- @client.keyspace = keyspace
46
51
  end
47
52
 
48
53
  # (see Proxy#key?)
49
54
  def key?(key, options = {})
50
- if @client.exists?(@cf, key)
55
+ if @backend.exists?(@cf, key)
51
56
  load(key, options) if options.include?(:expires)
52
57
  true
53
58
  else
@@ -57,31 +62,31 @@ module Moneta
57
62
 
58
63
  # (see Proxy#load)
59
64
  def load(key, options = {})
60
- value = @client.get(@cf, key)
65
+ value = @backend.get(@cf, key)
61
66
  if value
62
67
  expires = expires_value(options, nil)
63
- @client.insert(@cf, key, {'value' => value['value'] }, :ttl => expires || nil) if expires != nil
68
+ @backend.insert(@cf, key, {'value' => value['value'] }, :ttl => expires || nil) if expires != nil
64
69
  value['value']
65
70
  end
66
71
  end
67
72
 
68
73
  # (see Proxy#store)
69
74
  def store(key, value, options = {})
70
- @client.insert(@cf, key, {'value' => value}, :ttl => expires_value(options) || nil)
75
+ @backend.insert(@cf, key, {'value' => value}, :ttl => expires_value(options) || nil)
71
76
  value
72
77
  end
73
78
 
74
79
  # (see Proxy#delete)
75
80
  def delete(key, options = {})
76
81
  if value = load(key, options)
77
- @client.remove(@cf, key)
82
+ @backend.remove(@cf, key)
78
83
  value
79
84
  end
80
85
  end
81
86
 
82
87
  # (see Proxy#clear)
83
88
  def clear(options = {})
84
- @client.each_key(@cf) do |key|
89
+ @backend.each_key(@cf) do |key|
85
90
  delete(key)
86
91
  end
87
92
  self
@@ -27,7 +27,7 @@ module Moneta
27
27
 
28
28
  # (see Proxy#clear)
29
29
  def clear(options = {})
30
- @hash.each_key { |key| @cookies[key] = nil }
30
+ @backend.each_key { |key| @cookies[key] = nil }
31
31
  super
32
32
  self
33
33
  end
@@ -35,7 +35,7 @@ module Moneta
35
35
  # Reset the cookie store
36
36
  # This method is used by the middleware.
37
37
  def reset(cookies)
38
- @cookies, @hash = {}, cookies
38
+ @cookies, @backend = {}, cookies
39
39
  end
40
40
  end
41
41
  end
@@ -7,13 +7,15 @@ module Moneta
7
7
  class Couch
8
8
  include Defaults
9
9
 
10
+ attr_reader :backend
11
+
10
12
  # @param [Hash] options
11
13
  # @option options [String] :host ('http://127.0.0.1:5984') Couch host
12
14
  # @option options [String] :db ('moneta') Couch database
15
+ # @option options [::CouchRest] :backend Use existing backend instance
13
16
  def initialize(options = {})
14
- options[:db] ||= 'moneta'
15
- options[:host] ||= '127.0.0.1:5984'
16
- @db = CouchRest.new(options[:host]).database!(options[:db])
17
+ @backend = options[:backend] || CouchRest.new(options[:host] || '127.0.0.1:5984')
18
+ @db = @backend.database!(options[:db] || 'moneta')
17
19
  end
18
20
 
19
21
  # (see Proxy#key?)
@@ -7,37 +7,41 @@ module Moneta
7
7
  class Daybreak < Memory
8
8
  # @param [Hash] options
9
9
  # @option options [String] :file Database file
10
+ # @option options [::Daybreak] :backend Use existing backend instance
10
11
  def initialize(options = {})
11
- raise ArgumentError, 'Option :file is required' unless options[:file]
12
- @hash = ::Daybreak::DB.new(options[:file], :serializer => ::Daybreak::Serializer::None)
12
+ @backend = options[:backend] ||
13
+ begin
14
+ raise ArgumentError, 'Option :file is required' unless options[:file]
15
+ ::Daybreak::DB.new(options[:file], :serializer => ::Daybreak::Serializer::None)
16
+ end
13
17
  end
14
18
 
15
19
  # (see Proxy#load)
16
20
  def load(key, options = {})
17
- @hash.load if options[:sync]
18
- @hash[key]
21
+ @backend.load if options[:sync]
22
+ @backend[key]
19
23
  end
20
24
 
21
25
  # (see Proxy#store)
22
26
  def store(key, value, options = {})
23
- @hash[key] = value
24
- @hash.flush if options[:sync]
27
+ @backend[key] = value
28
+ @backend.flush if options[:sync]
25
29
  value
26
30
  end
27
31
 
28
32
  # (see Proxy#increment)
29
33
  def increment(key, amount = 1, options = {})
30
- @hash.lock { super }
34
+ @backend.lock { super }
31
35
  end
32
36
 
33
37
  # (see Proxy#create)
34
38
  def create(key, value, options = {})
35
- @hash.lock { super }
39
+ @backend.lock { super }
36
40
  end
37
41
 
38
42
  # (see Proxy#close)
39
43
  def close
40
- @hash.close
44
+ @backend.close
41
45
  end
42
46
  end
43
47
  end
@@ -7,14 +7,18 @@ module Moneta
7
7
  class DBM < Memory
8
8
  # @param [Hash] options
9
9
  # @option options [String] :file Database file
10
+ # @option options [::DBM] :backend Use existing backend instance
10
11
  def initialize(options = {})
11
- raise ArgumentError, 'Option :file is required' unless options[:file]
12
- @hash = ::DBM.new(options[:file])
12
+ @backend = options[:backend] ||
13
+ begin
14
+ raise ArgumentError, 'Option :file is required' unless options[:file]
15
+ ::DBM.new(options[:file])
16
+ end
13
17
  end
14
18
 
15
19
  # (see Proxy#close)
16
20
  def close
17
- @hash.close
21
+ @backend.close
18
22
  nil
19
23
  end
20
24
  end
@@ -1,5 +1,4 @@
1
1
  require 'fileutils'
2
- require 'fcntl'
3
2
 
4
3
  module Moneta
5
4
  module Adapters
@@ -72,8 +71,10 @@ module Moneta
72
71
  def create(key, value, options = {})
73
72
  path = store_path(key)
74
73
  FileUtils.mkpath(::File.dirname(path))
75
- fd = ::File.sysopen(path, Fcntl::O_WRONLY | Fcntl::O_EXCL | Fcntl::O_CREAT)
76
- ::File.open(fd, 'wb') {|file| file.write(value) }
74
+ ::File.open(path, ::File::WRONLY | ::File::CREAT | ::File::EXCL) do |file|
75
+ file.binmode
76
+ file.write(value)
77
+ end
77
78
  true
78
79
  rescue Errno::EEXIST
79
80
  false
@@ -7,13 +7,16 @@ module Moneta
7
7
  class Fog
8
8
  include Defaults
9
9
 
10
+ attr_reader :backend
11
+
10
12
  # @param [Hash] options
11
13
  # @option options [String] :dir Fog directory
14
+ # @option options [::Fog::Storage] :backend Use existing backend instance
12
15
  # @option options Other options passed to `Fog::Storage#new`
13
16
  def initialize(options = {})
14
17
  raise ArgumentError, 'Option :dir is required' unless dir = options.delete(:dir)
15
- storage = ::Fog::Storage.new(options)
16
- @directory = storage.directories.get(dir) || storage.directories.create(:key => dir)
18
+ @backend = options[:backend] || ::Fog::Storage.new(options)
19
+ @directory = @backend.directories.get(dir) || @backend.directories.create(:key => dir)
17
20
  end
18
21
 
19
22
  # (see Proxy#key?)
@@ -7,14 +7,18 @@ module Moneta
7
7
  class GDBM < Memory
8
8
  # @param [Hash] options
9
9
  # @option options [String] :file Database file
10
+ # @option options [::GDBM] :backend Use existing backend instance
10
11
  def initialize(options = {})
11
- raise ArgumentError, 'Option :file is required' unless options[:file]
12
- @hash = ::GDBM.new(options[:file])
12
+ @backend = options[:backend] ||
13
+ begin
14
+ raise ArgumentError, 'Option :file is required' unless options[:file]
15
+ ::GDBM.new(options[:file])
16
+ end
13
17
  end
14
18
 
15
19
  # (see Proxy#close)
16
20
  def close
17
- @hash.close
21
+ @backend.close
18
22
  nil
19
23
  end
20
24
  end
@@ -7,22 +7,24 @@ module Moneta
7
7
  class HBase
8
8
  include Defaults
9
9
 
10
+ attr_reader :backend
11
+
10
12
  # @param [Hash] options
11
13
  # @option options [String] :host ('127.0.0.1') Server host name
12
14
  # @option options [Integer] :port (9090) Server port
13
15
  # @option options [String] :table ('moneta') Table name
14
16
  # @option options [String] :column_family ('moneta') Column family
15
17
  # @option options [String] :column ('value') Column
18
+ # @option options [::HBaseRb::Client] :backend Use existing backend instance
16
19
  def initialize(options = {})
17
- options[:host] ||= '127.0.0.1'
18
- options[:port] ||= '9090'
19
- options[:table] ||= 'moneta'
20
20
  options[:column] ||= 'value'
21
+ options[:table] ||= 'moneta'
21
22
  cf = (options[:column_family] || 'moneta')
22
- @db = HBaseRb::Client.new(options[:host], options[:port])
23
- @db.create_table(options[:table], cf) unless @db.has_table?(options[:table])
24
- @table = @db.get_table(options[:table])
25
23
  @column = "#{cf}:#{options[:column]}"
24
+ @backend = options[:backend] ||
25
+ HBaseRb::Client.new(options[:host] || '127.0.0.1', options[:port] || '9090')
26
+ @backend.create_table(options[:table], cf) unless @backend.has_table?(options[:table])
27
+ @table = @backend.get_table(options[:table])
26
28
  end
27
29
 
28
30
  # (see Proxy#key?)
@@ -54,7 +56,7 @@ module Moneta
54
56
  def delete(key, options = {})
55
57
  if value = load(key, options)
56
58
  @table.delete_row(key)
57
- unpack(value)
59
+ value
58
60
  end
59
61
  end
60
62
 
@@ -68,7 +70,7 @@ module Moneta
68
70
 
69
71
  # (see Proxy#close)
70
72
  def close
71
- @db.close
73
+ @backend.close
72
74
  nil
73
75
  end
74
76
 
@@ -81,7 +83,7 @@ module Moneta
81
83
  [intvalue].pack('Q>')
82
84
  elsif value.bytesize >= 8
83
85
  # Add nul character to make value distinguishable from integer
84
- value << "\0"
86
+ value + "\0"
85
87
  else
86
88
  value
87
89
  end