moneta 0.7.0 → 0.7.1

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 (179) hide show
  1. data/.gitignore +4 -0
  2. data/.travis.yml +39 -6
  3. data/CHANGES +18 -0
  4. data/README.md +69 -31
  5. data/Rakefile +1 -1
  6. data/SPEC.md +6 -0
  7. data/benchmarks/run.rb +235 -133
  8. data/lib/active_support/cache/moneta_store.rb +1 -0
  9. data/lib/moneta.rb +29 -19
  10. data/lib/moneta/adapters/activerecord.rb +18 -26
  11. data/lib/moneta/adapters/cassandra.rb +5 -7
  12. data/lib/moneta/adapters/client.rb +3 -5
  13. data/lib/moneta/adapters/cookie.rb +2 -0
  14. data/lib/moneta/adapters/couch.rb +1 -3
  15. data/lib/moneta/adapters/datamapper.rb +4 -6
  16. data/lib/moneta/adapters/dbm.rb +1 -3
  17. data/lib/moneta/adapters/file.rb +4 -0
  18. data/lib/moneta/adapters/fog.rb +2 -4
  19. data/lib/moneta/adapters/gdbm.rb +1 -3
  20. data/lib/moneta/adapters/hbase.rb +5 -7
  21. data/lib/moneta/adapters/leveldb.rb +2 -4
  22. data/lib/moneta/adapters/localmemcache.rb +1 -3
  23. data/lib/moneta/adapters/lruhash.rb +1 -3
  24. data/lib/moneta/adapters/memcached.rb +2 -2
  25. data/lib/moneta/adapters/{memcached_dalli.rb → memcached/dalli.rb} +4 -6
  26. data/lib/moneta/adapters/{memcached_native.rb → memcached/native.rb} +8 -7
  27. data/lib/moneta/adapters/mongo.rb +8 -9
  28. data/lib/moneta/adapters/pstore.rb +1 -3
  29. data/lib/moneta/adapters/redis.rb +2 -4
  30. data/lib/moneta/adapters/riak.rb +3 -5
  31. data/lib/moneta/adapters/sdbm.rb +1 -13
  32. data/lib/moneta/adapters/sequel.rb +3 -5
  33. data/lib/moneta/adapters/sqlite.rb +2 -4
  34. data/lib/moneta/adapters/tokyocabinet.rb +2 -4
  35. data/lib/moneta/base.rb +22 -2
  36. data/lib/moneta/builder.rb +3 -3
  37. data/lib/moneta/cache.rb +1 -1
  38. data/lib/moneta/expires.rb +27 -35
  39. data/lib/moneta/lock.rb +1 -3
  40. data/lib/moneta/logger.rb +3 -5
  41. data/lib/moneta/net.rb +7 -3
  42. data/lib/moneta/proxy.rb +2 -1
  43. data/lib/moneta/server.rb +33 -21
  44. data/lib/moneta/shared.rb +11 -7
  45. data/lib/moneta/stack.rb +1 -1
  46. data/lib/moneta/transformer.rb +15 -13
  47. data/lib/moneta/transformer/config.rb +33 -31
  48. data/lib/moneta/version.rb +1 -1
  49. data/lib/rack/cache/moneta.rb +6 -0
  50. data/lib/rack/moneta_cookies.rb +1 -0
  51. data/lib/rack/session/moneta.rb +1 -0
  52. data/moneta.gemspec +1 -1
  53. data/spec/generate.rb +403 -232
  54. data/spec/helper.rb +23 -2
  55. data/spec/moneta/adapter_activerecord_spec.rb +3 -2
  56. data/spec/moneta/adapter_cassandra_spec.rb +4 -3
  57. data/spec/moneta/adapter_client_spec.rb +4 -3
  58. data/spec/moneta/adapter_cookie_spec.rb +3 -2
  59. data/spec/moneta/adapter_couch_spec.rb +3 -2
  60. data/spec/moneta/adapter_datamapper_spec.rb +3 -2
  61. data/spec/moneta/adapter_dbm_spec.rb +3 -2
  62. data/spec/moneta/adapter_file_spec.rb +3 -2
  63. data/spec/moneta/adapter_fog_spec.rb +3 -2
  64. data/spec/moneta/adapter_gdbm_spec.rb +3 -2
  65. data/spec/moneta/adapter_hbase_spec.rb +3 -2
  66. data/spec/moneta/adapter_leveldb_spec.rb +3 -2
  67. data/spec/moneta/adapter_localmemcache_spec.rb +3 -2
  68. data/spec/moneta/adapter_lruhash_spec.rb +3 -2
  69. data/spec/moneta/adapter_memcached_dalli_spec.rb +4 -3
  70. data/spec/moneta/adapter_memcached_native_spec.rb +4 -3
  71. data/spec/moneta/adapter_memcached_spec.rb +4 -3
  72. data/spec/moneta/adapter_memory_spec.rb +50 -1
  73. data/spec/moneta/adapter_mongo_spec.rb +3 -2
  74. data/spec/moneta/adapter_pstore_spec.rb +124 -4
  75. data/spec/moneta/adapter_redis_spec.rb +4 -3
  76. data/spec/moneta/adapter_riak_spec.rb +3 -2
  77. data/spec/moneta/adapter_sdbm_spec.rb +3 -2
  78. data/spec/moneta/adapter_sequel_spec.rb +3 -2
  79. data/spec/moneta/adapter_sqlite_spec.rb +3 -2
  80. data/spec/moneta/adapter_tokyocabinet_bdb_spec.rb +3 -2
  81. data/spec/moneta/adapter_tokyocabinet_hdb_spec.rb +3 -2
  82. data/spec/moneta/adapter_yaml_spec.rb +32 -5
  83. data/spec/moneta/cache_file_memory_spec.rb +3 -2
  84. data/spec/moneta/cache_memory_null_spec.rb +3 -2
  85. data/spec/moneta/expires_file_spec.rb +23 -41
  86. data/spec/moneta/expires_memory_spec.rb +69 -13
  87. data/spec/moneta/lock_spec.rb +50 -1
  88. data/spec/moneta/null_adapter_spec.rb +26 -0
  89. data/spec/moneta/proxy_expires_memory_spec.rb +51 -12
  90. data/spec/moneta/proxy_redis_spec.rb +4 -3
  91. data/spec/moneta/shared_spec.rb +4 -3
  92. data/spec/moneta/simple_activerecord_spec.rb +105 -12
  93. data/spec/moneta/simple_activerecord_with_expires_spec.rb +106 -13
  94. data/spec/moneta/simple_cassandra_spec.rb +106 -13
  95. data/spec/moneta/simple_client_tcp_spec.rb +106 -13
  96. data/spec/moneta/simple_client_unix_spec.rb +106 -14
  97. data/spec/moneta/simple_couch_spec.rb +105 -12
  98. data/spec/moneta/simple_couch_with_expires_spec.rb +106 -13
  99. data/spec/moneta/simple_datamapper_spec.rb +105 -12
  100. data/spec/moneta/simple_datamapper_with_expires_spec.rb +106 -13
  101. data/spec/moneta/simple_datamapper_with_repository_spec.rb +105 -12
  102. data/spec/moneta/simple_dbm_spec.rb +105 -12
  103. data/spec/moneta/simple_dbm_with_expires_spec.rb +106 -13
  104. data/spec/moneta/simple_file_spec.rb +105 -12
  105. data/spec/moneta/simple_file_with_expires_spec.rb +106 -13
  106. data/spec/moneta/simple_fog_spec.rb +105 -12
  107. data/spec/moneta/simple_fog_with_expires_spec.rb +106 -13
  108. data/spec/moneta/simple_gdbm_spec.rb +105 -12
  109. data/spec/moneta/simple_gdbm_with_expires_spec.rb +106 -13
  110. data/spec/moneta/simple_hashfile_spec.rb +105 -12
  111. data/spec/moneta/simple_hashfile_with_expires_spec.rb +106 -13
  112. data/spec/moneta/simple_hbase_spec.rb +105 -12
  113. data/spec/moneta/simple_hbase_with_expires_spec.rb +106 -13
  114. data/spec/moneta/simple_leveldb_spec.rb +105 -12
  115. data/spec/moneta/simple_leveldb_with_expires_spec.rb +106 -13
  116. data/spec/moneta/simple_localmemcache_spec.rb +105 -12
  117. data/spec/moneta/simple_localmemcache_with_expires_spec.rb +106 -13
  118. data/spec/moneta/simple_lruhash_spec.rb +70 -12
  119. data/spec/moneta/simple_lruhash_with_expires_spec.rb +71 -13
  120. data/spec/moneta/simple_memcached_dalli_spec.rb +106 -13
  121. data/spec/moneta/simple_memcached_native_spec.rb +106 -13
  122. data/spec/moneta/simple_memcached_spec.rb +106 -13
  123. data/spec/moneta/simple_memory_spec.rb +70 -12
  124. data/spec/moneta/simple_memory_with_compress_spec.rb +70 -12
  125. data/spec/moneta/simple_memory_with_expires_spec.rb +71 -13
  126. data/spec/moneta/simple_memory_with_json_key_serializer_spec.rb +41 -15
  127. data/spec/moneta/simple_memory_with_json_serializer_spec.rb +24 -11
  128. data/spec/moneta/simple_memory_with_json_value_serializer_spec.rb +45 -14
  129. data/spec/moneta/simple_memory_with_prefix_spec.rb +70 -12
  130. data/spec/moneta/simple_memory_with_snappy_compress_spec.rb +70 -12
  131. data/spec/moneta/simple_mongo_spec.rb +105 -12
  132. data/spec/moneta/simple_mongo_with_expires_spec.rb +106 -13
  133. data/spec/moneta/simple_null_spec.rb +36 -1
  134. data/spec/moneta/simple_pstore_spec.rb +105 -12
  135. data/spec/moneta/simple_pstore_with_expires_spec.rb +106 -13
  136. data/spec/moneta/simple_redis_spec.rb +106 -13
  137. data/spec/moneta/simple_riak_spec.rb +105 -12
  138. data/spec/moneta/simple_riak_with_expires_spec.rb +106 -13
  139. data/spec/moneta/simple_sdbm_spec.rb +105 -12
  140. data/spec/moneta/simple_sdbm_with_expires_spec.rb +106 -13
  141. data/spec/moneta/simple_sequel_spec.rb +105 -12
  142. data/spec/moneta/simple_sequel_with_expires_spec.rb +106 -13
  143. data/spec/moneta/simple_sqlite_spec.rb +105 -12
  144. data/spec/moneta/simple_sqlite_with_expires_spec.rb +106 -13
  145. data/spec/moneta/simple_tokyocabinet_spec.rb +105 -12
  146. data/spec/moneta/simple_tokyocabinet_with_expires_spec.rb +106 -13
  147. data/spec/moneta/simple_yaml_spec.rb +104 -11
  148. data/spec/moneta/simple_yaml_with_expires_spec.rb +105 -12
  149. data/spec/moneta/stack_file_memory_spec.rb +3 -2
  150. data/spec/moneta/stack_memory_file_spec.rb +3 -1
  151. data/spec/moneta/transformer_bencode_spec.rb +23 -10
  152. data/spec/moneta/transformer_bert_spec.rb +23 -10
  153. data/spec/moneta/transformer_bson_spec.rb +23 -10
  154. data/spec/moneta/transformer_bzip2_spec.rb +13 -3
  155. data/spec/moneta/transformer_json_spec.rb +23 -10
  156. data/spec/moneta/transformer_lzma_spec.rb +13 -3
  157. data/spec/moneta/transformer_lzo_spec.rb +13 -3
  158. data/spec/moneta/transformer_marshal_base64_spec.rb +70 -12
  159. data/spec/moneta/transformer_marshal_escape_spec.rb +70 -12
  160. data/spec/moneta/transformer_marshal_hmac_spec.rb +70 -12
  161. data/spec/moneta/transformer_marshal_md5_spec.rb +70 -12
  162. data/spec/moneta/transformer_marshal_md5_spread_spec.rb +70 -12
  163. data/spec/moneta/transformer_marshal_prefix_spec.rb +70 -12
  164. data/spec/moneta/transformer_marshal_rmd160_spec.rb +70 -12
  165. data/spec/moneta/transformer_marshal_sha1_spec.rb +70 -12
  166. data/spec/moneta/transformer_marshal_sha256_spec.rb +70 -12
  167. data/spec/moneta/transformer_marshal_sha384_spec.rb +70 -12
  168. data/spec/moneta/transformer_marshal_sha512_spec.rb +70 -12
  169. data/spec/moneta/transformer_marshal_truncate_spec.rb +70 -12
  170. data/spec/moneta/transformer_marshal_uuencode_spec.rb +70 -12
  171. data/spec/moneta/transformer_msgpack_spec.rb +23 -10
  172. data/spec/moneta/transformer_ox_spec.rb +67 -9
  173. data/spec/moneta/transformer_quicklz_spec.rb +13 -3
  174. data/spec/moneta/transformer_snappy_spec.rb +13 -3
  175. data/spec/moneta/transformer_tnet_spec.rb +23 -10
  176. data/spec/moneta/transformer_yaml_spec.rb +67 -9
  177. data/spec/moneta/transformer_zlib_spec.rb +13 -3
  178. data/spec/monetaspecs.rb +4649 -1096
  179. metadata +8 -5
@@ -8,9 +8,7 @@ module Moneta
8
8
  # Constructor
9
9
  #
10
10
  # @param [Hash] options
11
- #
12
- # Options:
13
- # * :file - PStore file
11
+ # @option options [String] :file PStore file
14
12
  def initialize(options = {})
15
13
  raise ArgumentError, 'Option :file is required' unless options[:file]
16
14
  FileUtils.mkpath(::File.dirname(options[:file]))
@@ -8,10 +8,8 @@ module Moneta
8
8
  # Constructor
9
9
  #
10
10
  # @param [Hash] options
11
- #
12
- # Options:
13
- # * :expires - Default expiration time (default none)
14
- # * Other options passed to Redis#new
11
+ # @option options [String] :expires Default expiration time
12
+ # @option options Other options passed to `Redis#new`
15
13
  def initialize(options = {})
16
14
  @expires = options.delete(:expires)
17
15
  @redis = ::Redis.new(options)
@@ -11,11 +11,9 @@ module Moneta
11
11
  # Constructor
12
12
  #
13
13
  # @param [Hash] options
14
- #
15
- # Options:
16
- # * :bucket - Bucket name (default moneta)
17
- # * :content_type - Default content type (default application/octet-stream)
18
- # * All other options passed to Riak::Client#new
14
+ # @option options [String] :bucket ('moneta') Bucket name
15
+ # @option options [String] :content_type ('application/octet-stream') Default content type
16
+ # @option options All other options passed to `Riak::Client#new`
19
17
  def initialize(options = {})
20
18
  bucket = options.delete(:bucket) || 'moneta'
21
19
  @content_type = options.delete(:content_type) || 'application/octet-stream'
@@ -8,9 +8,7 @@ module Moneta
8
8
  # Constructor
9
9
  #
10
10
  # @param [Hash] options
11
- #
12
- # Options:
13
- # * :file - Database file
11
+ # @option options [String] :file Database file
14
12
  def initialize(options = {})
15
13
  raise ArgumentError, 'Option :file is required' unless options[:file]
16
14
  @hash = ::SDBM.new(options[:file])
@@ -20,16 +18,6 @@ module Moneta
20
18
  @hash.close
21
19
  nil
22
20
  end
23
-
24
- def store(key, value, options = {})
25
- super
26
- value
27
- rescue SDBMError
28
- # SDBM is not very robust!
29
- # You shouldn't put to much data into it, otherwise
30
- # it might raise a SDBMError.
31
- value
32
- end
33
21
  end
34
22
  end
35
23
  end
@@ -8,11 +8,9 @@ module Moneta
8
8
  # Constructor
9
9
  #
10
10
  # @param [Hash] options
11
- #
12
- # Options:
13
- # * :db - Sequel database
14
- # * :table - Table name (default :moneta)
15
- # * All other options passed to Sequel#connect
11
+ # @option options [String] :db Sequel database
12
+ # @option options [String/Symbol] :table (:moneta) Table name
13
+ # @option options All other options passed to `Sequel#connect`
16
14
  def initialize(options = {})
17
15
  raise ArgumentError, 'Option :db is required' unless db = options.delete(:db)
18
16
  table = options.delete(:table) || :moneta
@@ -10,10 +10,8 @@ module Moneta
10
10
  # Constructor
11
11
  #
12
12
  # @param [Hash] options
13
- #
14
- # Options:
15
- # * :file - Database file
16
- # * :table - Table name (default moneta)
13
+ # @option options [String] :file Database file
14
+ # @option options [String] :table ('moneta') Table name
17
15
  def initialize(options = {})
18
16
  raise ArgumentError, 'Option :file is required' unless options[:file]
19
17
  table = options[:table] || 'moneta'
@@ -8,10 +8,8 @@ module Moneta
8
8
  # Constructor
9
9
  #
10
10
  # @param [Hash] options
11
- #
12
- # Options:
13
- # * :file - Database file
14
- # * :type - Database type (default :hdb, :bdb and :hdb possible)
11
+ # @option options [String] :file Database file
12
+ # @option options [Symbol] :type (:hdb) Database type (:bdb and :hdb possible)
15
13
  def initialize(options = {})
16
14
  file = options[:file]
17
15
  raise ArgumentError, 'Option :file is required' unless options[:file]
data/lib/moneta/base.rb CHANGED
@@ -19,6 +19,8 @@ module Moneta
19
19
  # Not every Moneta store implements this method,
20
20
  # a NotImplementedError if it is not supported.
21
21
  #
22
+ # This method also accepts negative amounts.
23
+ #
22
24
  # @param [Object] key
23
25
  # @param [Integer] amount
24
26
  # @param [Hash] options
@@ -28,7 +30,23 @@ module Moneta
28
30
  raise NotImplementedError, 'increment is not supported'
29
31
  end
30
32
 
33
+ # Atomically decrement integer value with key
34
+ #
35
+ # This is just syntactic sugar for calling #increment with a negative value.
36
+ #
37
+ # This method also accepts negative amounts.
38
+ #
39
+ # @param [Object] key
40
+ # @param [Integer] amount
41
+ # @param [Hash] options
42
+ # @return [Object] value from store
43
+ # @api public
44
+ def decrement(key, amount = 1, options = {})
45
+ increment(key, -amount, options)
46
+ end
47
+
31
48
  # Explicitly close the store
49
+ # @return nil
32
50
  # @api public
33
51
  def close
34
52
  end
@@ -50,9 +68,11 @@ module Moneta
50
68
  def fetch(key, default = nil, options = nil)
51
69
  if block_given?
52
70
  raise ArgumentError, 'Only one argument accepted if block is given' if options
53
- load(key, default || {}) || yield(key)
71
+ result = load(key, default || {})
72
+ result == nil ? yield(key) : result
54
73
  else
55
- load(key, options || {}) || default
74
+ result = load(key, options || {})
75
+ result == nil ? default : result
56
76
  end
57
77
  end
58
78
 
@@ -1,5 +1,5 @@
1
1
  module Moneta
2
- # Builder implements the DSL to build a chain of store proxies
2
+ # Builder implements the DSL to build a stack of Moneta store proxies
3
3
  # @api private
4
4
  class Builder
5
5
  # @api private
@@ -17,7 +17,7 @@ module Moneta
17
17
  instance_eval(&block)
18
18
  end
19
19
 
20
- # Add proxy to chain
20
+ # Add proxy to stack
21
21
  #
22
22
  # @param [Symbol or Class] proxy Name of proxy class or proxy class
23
23
  # @param [Hash] options Options hash
@@ -28,7 +28,7 @@ module Moneta
28
28
  nil
29
29
  end
30
30
 
31
- # Add adapter to chain
31
+ # Add adapter to stack
32
32
  #
33
33
  # @param [Symbol] name Name of adapter class
34
34
  # @param [Hash] options Options hash
data/lib/moneta/cache.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Moneta
2
2
  # Combines two stores. One is used as cache, the other as backend.
3
3
  #
4
- # @example Add cache to chain
4
+ # @example Add `Moneta::Cache` to proxy stack
5
5
  # Moneta.build do
6
6
  # use(:Cache) do
7
7
  # backend { adapter :File, :dir => 'data' }
@@ -10,61 +10,53 @@ module Moneta
10
10
  #
11
11
  # @param [Moneta store] adapter The underlying store
12
12
  # @param [Hash] options
13
- #
14
- # Options:
15
- # * :expires - Default expiration time (default none)
13
+ # @option options [String] :expires Default expiration time
16
14
  def initialize(adapter, options = {})
17
15
  super
18
16
  @expires = options[:expires]
19
17
  end
20
18
 
21
19
  def key?(key, options = {})
22
- load(key, options) != nil
20
+ load_entry(key, options) != nil
23
21
  end
24
22
 
25
23
  def load(key, options = {})
26
- if options.include?(:raw)
27
- super
28
- else
29
- value = check_expired(key, super)
30
- if value && options.include?(:expires)
31
- store(key, value, options)
32
- else
33
- value
34
- end
35
- end
24
+ return super if options.include?(:raw)
25
+ value, expires = load_entry(key, options)
26
+ value
36
27
  end
37
28
 
38
29
  def store(key, value, options = {})
39
- if options.include?(:raw)
40
- super
30
+ return super if options.include?(:raw)
31
+ if expires = (options.delete(:expires) || @expires)
32
+ super(key, [value, Time.now.to_i + expires], options)
41
33
  else
42
- if expires = (options.delete(:expires) || @expires)
43
- super(key, [value, Time.now.to_i + expires], options)
44
- else
45
- super(key, [value], options)
46
- end
47
- value
34
+ super(key, [value], options)
48
35
  end
36
+ value
49
37
  end
50
38
 
51
39
  def delete(key, options = {})
52
- if options.include?(:raw)
53
- super
54
- else
55
- check_expired(key, super, false)
56
- end
40
+ return super if options.include?(:raw)
41
+ value, expires = super
42
+ value if !expires || Time.now.to_i <= expires
57
43
  end
58
44
 
59
- protected
45
+ private
60
46
 
61
- def check_expired(key, value, delete_expired = true)
62
- value, expires = value
63
- if expires && Time.now.to_i > expires
64
- delete(key) if delete_expired
65
- nil
66
- else
67
- value
47
+ def load_entry(key, options)
48
+ new_expires = options.delete(:expires)
49
+ if entry = @adapter.load(key, options)
50
+ value, expires = entry
51
+ if expires && Time.now.to_i > expires
52
+ delete(key)
53
+ nil
54
+ elsif new_expires
55
+ @adapter.store(key, [value, Time.now.to_i + new_expires], options)
56
+ entry
57
+ else
58
+ entry
59
+ end
68
60
  end
69
61
  end
70
62
  end
data/lib/moneta/lock.rb CHANGED
@@ -8,9 +8,7 @@ module Moneta
8
8
  #
9
9
  # @param [Moneta store] adapter The underlying store
10
10
  # @param [Hash] options
11
- #
12
- # Options:
13
- # * :mutex - Mutex object (default Mutex.new)
11
+ # @option options [String] :mutex (Mutex.new) Mutex object
14
12
  def initialize(adapter, options = {})
15
13
  super
16
14
  @lock = options[:mutex] || Mutex.new
data/lib/moneta/logger.rb CHANGED
@@ -37,11 +37,9 @@ module Moneta
37
37
  #
38
38
  # @param [Moneta store] adapter The underlying store
39
39
  # @param [Hash] options
40
- #
41
- # Options:
42
- # * :logger - Callable logger object (default Moneta::Logger::Format)
43
- # * :logprefix - Prefix string (default 'Moneta ')
44
- # * :logout - Output (default STDOUT)
40
+ # @option options [Object] :logger (Moneta::Logger::Format) Callable logger object
41
+ # @option options [String] :logprefix ('Moneta ') Prefix string
42
+ # @option options [IO] :logout (STDOUT) Output
45
43
  def initialize(adapter, options = {})
46
44
  super
47
45
  @logger = options[:logger] || Format.new(options)
data/lib/moneta/net.rb CHANGED
@@ -3,7 +3,12 @@ module Moneta
3
3
  module Net
4
4
  DEFAULT_PORT = 9000
5
5
 
6
- class Error < Exception; end
6
+ class Error < RuntimeError; end
7
+
8
+ def pack(o)
9
+ s = Marshal.dump(o)
10
+ [s.bytesize].pack('N') << s
11
+ end
7
12
 
8
13
  def read(io)
9
14
  size = io.read(4).unpack('N').first
@@ -11,8 +16,7 @@ module Moneta
11
16
  end
12
17
 
13
18
  def write(io, o)
14
- s = Marshal.dump(o)
15
- io.write([s.bytesize].pack('N') << s)
19
+ io.write(pack(o))
16
20
  end
17
21
  end
18
22
  end
data/lib/moneta/proxy.rb CHANGED
@@ -6,7 +6,7 @@ module Moneta
6
6
 
7
7
  # Constructor
8
8
  #
9
- # @param [Moneta store] underlying adapter
9
+ # @param [Moneta store] adapter underlying adapter
10
10
  # @param [Hash] options
11
11
  def initialize(adapter, options = {})
12
12
  @adapter = adapter
@@ -78,6 +78,7 @@ module Moneta
78
78
  end
79
79
 
80
80
  # Close this store
81
+ # @return nil
81
82
  # @api public
82
83
  def close
83
84
  @adapter.close
data/lib/moneta/server.rb CHANGED
@@ -4,45 +4,57 @@ module Moneta
4
4
  # Moneta server
5
5
  # @api public
6
6
  class Server
7
- TIMEOUT = 1
8
- include Net
9
-
10
7
  # Constructor
11
8
  #
12
9
  # @param [Hash] options
13
- #
14
- # Options:
15
- # * :port - TCP port (default 9000)
16
- # * :file - Unix socket file name (default none)
10
+ # @option options [Integer] :port (9000) TCP port
11
+ # @option options [String] :file Alternative Unix socket file name
17
12
  def initialize(store, options = {})
18
13
  @store = store
19
- @server = options[:file] ? UNIXServer.open(options[:file]) :
20
- TCPServer.open(options[:port] || DEFAULT_PORT)
14
+ @server =
15
+ if @file = options[:file]
16
+ UNIXServer.open(@file)
17
+ else
18
+ TCPServer.open(options[:port] || DEFAULT_PORT)
19
+ end
21
20
  @clients = [@server]
21
+ @running = false
22
+ end
23
+
24
+ def running?
25
+ @running
26
+ end
27
+
28
+ def run
29
+ raise 'Already running' if @running
30
+ @stop = false
22
31
  @running = true
23
- @thread = Thread.new do
24
- mainloop while @running
25
- File.unlink(options[:file]) if options[:file]
32
+ begin
33
+ until @stop
34
+ mainloop
35
+ end
36
+ ensure
37
+ File.unlink(@file) if @file
26
38
  end
27
39
  end
28
40
 
29
41
  def stop
30
- if @thread
31
- @running = false
32
- @server.close
33
- @server = nil
34
- @thread.join
35
- @thread = nil
36
- end
42
+ raise 'Not running' unless @running
43
+ @stop = true
44
+ @server.close
45
+ @server = nil
37
46
  end
38
47
 
39
48
  private
40
49
 
50
+ include Net
51
+ TIMEOUT = 1
52
+
41
53
  def mainloop
42
54
  client = accept
43
55
  handle(client) if client
44
56
  rescue Exception => ex
45
- puts "#{ex.message}\n#{ex.backtrace.join("\n")}"
57
+ puts ex.message
46
58
  write(client, Error.new(ex.message)) if client
47
59
  end
48
60
 
@@ -72,7 +84,7 @@ module Moneta
72
84
  write(client, @store.send(method, *args))
73
85
  when :store, :clear
74
86
  @store.send(method, *args)
75
- write(client, nil)
87
+ client.write(@nil ||= pack(nil))
76
88
  else
77
89
  raise 'Invalid method call'
78
90
  end
data/lib/moneta/shared.rb CHANGED
@@ -14,11 +14,9 @@ module Moneta
14
14
  # Constructor
15
15
  #
16
16
  # @param [Hash] options
17
- #
18
- # Options:
19
- # * :port - TCP port (default 9000)
20
- # * :host - Hostname (default empty)
21
- # * :file - Unix socket file name (default none)
17
+ # @option options [Integer] :port (9000) TCP port
18
+ # @option options [String] :host Server hostname
19
+ # @option options [String] :file Unix socket file name
22
20
  def initialize(options = {}, &block)
23
21
  @options = options
24
22
  @builder = Builder.new(&block)
@@ -27,7 +25,8 @@ module Moneta
27
25
  def close
28
26
  if @server
29
27
  @server.stop
30
- @server = nil
28
+ @thread.join
29
+ @server = @thread = nil
31
30
  end
32
31
  if @adapter
33
32
  @adapter.close
@@ -38,18 +37,23 @@ module Moneta
38
37
  private
39
38
 
40
39
  def wrap(*args)
41
- tries ||= 0
42
40
  @adapter ||= Adapters::Client.new(@options)
43
41
  yield
44
42
  rescue Exception => ex
45
43
  puts "Failed to connect: #{ex.message}"
46
44
  begin
45
+ # TODO: Implement this using forking (MRI) and threading (JRuby)
46
+ # to get maximal performance
47
47
  @adapter = Lock.new(@builder.build.last)
48
48
  @server = Server.new(@adapter, @options)
49
+ @thread = Thread.new { @server.run }
50
+ sleep 0.1 until @server.running?
49
51
  rescue Exception => ex
50
52
  puts "Failed to start server: #{ex.message}"
53
+ @adapter.close if @adapter
51
54
  @adapter = nil
52
55
  end
56
+ tries ||= 0
53
57
  if (tries += 1) > 2
54
58
  raise
55
59
  else