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.
- data/.gitignore +4 -0
- data/.travis.yml +39 -6
- data/CHANGES +18 -0
- data/README.md +69 -31
- data/Rakefile +1 -1
- data/SPEC.md +6 -0
- data/benchmarks/run.rb +235 -133
- data/lib/active_support/cache/moneta_store.rb +1 -0
- data/lib/moneta.rb +29 -19
- data/lib/moneta/adapters/activerecord.rb +18 -26
- data/lib/moneta/adapters/cassandra.rb +5 -7
- data/lib/moneta/adapters/client.rb +3 -5
- data/lib/moneta/adapters/cookie.rb +2 -0
- data/lib/moneta/adapters/couch.rb +1 -3
- data/lib/moneta/adapters/datamapper.rb +4 -6
- data/lib/moneta/adapters/dbm.rb +1 -3
- data/lib/moneta/adapters/file.rb +4 -0
- data/lib/moneta/adapters/fog.rb +2 -4
- data/lib/moneta/adapters/gdbm.rb +1 -3
- data/lib/moneta/adapters/hbase.rb +5 -7
- data/lib/moneta/adapters/leveldb.rb +2 -4
- data/lib/moneta/adapters/localmemcache.rb +1 -3
- data/lib/moneta/adapters/lruhash.rb +1 -3
- data/lib/moneta/adapters/memcached.rb +2 -2
- data/lib/moneta/adapters/{memcached_dalli.rb → memcached/dalli.rb} +4 -6
- data/lib/moneta/adapters/{memcached_native.rb → memcached/native.rb} +8 -7
- data/lib/moneta/adapters/mongo.rb +8 -9
- data/lib/moneta/adapters/pstore.rb +1 -3
- data/lib/moneta/adapters/redis.rb +2 -4
- data/lib/moneta/adapters/riak.rb +3 -5
- data/lib/moneta/adapters/sdbm.rb +1 -13
- data/lib/moneta/adapters/sequel.rb +3 -5
- data/lib/moneta/adapters/sqlite.rb +2 -4
- data/lib/moneta/adapters/tokyocabinet.rb +2 -4
- data/lib/moneta/base.rb +22 -2
- data/lib/moneta/builder.rb +3 -3
- data/lib/moneta/cache.rb +1 -1
- data/lib/moneta/expires.rb +27 -35
- data/lib/moneta/lock.rb +1 -3
- data/lib/moneta/logger.rb +3 -5
- data/lib/moneta/net.rb +7 -3
- data/lib/moneta/proxy.rb +2 -1
- data/lib/moneta/server.rb +33 -21
- data/lib/moneta/shared.rb +11 -7
- data/lib/moneta/stack.rb +1 -1
- data/lib/moneta/transformer.rb +15 -13
- data/lib/moneta/transformer/config.rb +33 -31
- data/lib/moneta/version.rb +1 -1
- data/lib/rack/cache/moneta.rb +6 -0
- data/lib/rack/moneta_cookies.rb +1 -0
- data/lib/rack/session/moneta.rb +1 -0
- data/moneta.gemspec +1 -1
- data/spec/generate.rb +403 -232
- data/spec/helper.rb +23 -2
- data/spec/moneta/adapter_activerecord_spec.rb +3 -2
- data/spec/moneta/adapter_cassandra_spec.rb +4 -3
- data/spec/moneta/adapter_client_spec.rb +4 -3
- data/spec/moneta/adapter_cookie_spec.rb +3 -2
- data/spec/moneta/adapter_couch_spec.rb +3 -2
- data/spec/moneta/adapter_datamapper_spec.rb +3 -2
- data/spec/moneta/adapter_dbm_spec.rb +3 -2
- data/spec/moneta/adapter_file_spec.rb +3 -2
- data/spec/moneta/adapter_fog_spec.rb +3 -2
- data/spec/moneta/adapter_gdbm_spec.rb +3 -2
- data/spec/moneta/adapter_hbase_spec.rb +3 -2
- data/spec/moneta/adapter_leveldb_spec.rb +3 -2
- data/spec/moneta/adapter_localmemcache_spec.rb +3 -2
- data/spec/moneta/adapter_lruhash_spec.rb +3 -2
- data/spec/moneta/adapter_memcached_dalli_spec.rb +4 -3
- data/spec/moneta/adapter_memcached_native_spec.rb +4 -3
- data/spec/moneta/adapter_memcached_spec.rb +4 -3
- data/spec/moneta/adapter_memory_spec.rb +50 -1
- data/spec/moneta/adapter_mongo_spec.rb +3 -2
- data/spec/moneta/adapter_pstore_spec.rb +124 -4
- data/spec/moneta/adapter_redis_spec.rb +4 -3
- data/spec/moneta/adapter_riak_spec.rb +3 -2
- data/spec/moneta/adapter_sdbm_spec.rb +3 -2
- data/spec/moneta/adapter_sequel_spec.rb +3 -2
- data/spec/moneta/adapter_sqlite_spec.rb +3 -2
- data/spec/moneta/adapter_tokyocabinet_bdb_spec.rb +3 -2
- data/spec/moneta/adapter_tokyocabinet_hdb_spec.rb +3 -2
- data/spec/moneta/adapter_yaml_spec.rb +32 -5
- data/spec/moneta/cache_file_memory_spec.rb +3 -2
- data/spec/moneta/cache_memory_null_spec.rb +3 -2
- data/spec/moneta/expires_file_spec.rb +23 -41
- data/spec/moneta/expires_memory_spec.rb +69 -13
- data/spec/moneta/lock_spec.rb +50 -1
- data/spec/moneta/null_adapter_spec.rb +26 -0
- data/spec/moneta/proxy_expires_memory_spec.rb +51 -12
- data/spec/moneta/proxy_redis_spec.rb +4 -3
- data/spec/moneta/shared_spec.rb +4 -3
- data/spec/moneta/simple_activerecord_spec.rb +105 -12
- data/spec/moneta/simple_activerecord_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_cassandra_spec.rb +106 -13
- data/spec/moneta/simple_client_tcp_spec.rb +106 -13
- data/spec/moneta/simple_client_unix_spec.rb +106 -14
- data/spec/moneta/simple_couch_spec.rb +105 -12
- data/spec/moneta/simple_couch_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_datamapper_spec.rb +105 -12
- data/spec/moneta/simple_datamapper_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_datamapper_with_repository_spec.rb +105 -12
- data/spec/moneta/simple_dbm_spec.rb +105 -12
- data/spec/moneta/simple_dbm_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_file_spec.rb +105 -12
- data/spec/moneta/simple_file_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_fog_spec.rb +105 -12
- data/spec/moneta/simple_fog_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_gdbm_spec.rb +105 -12
- data/spec/moneta/simple_gdbm_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_hashfile_spec.rb +105 -12
- data/spec/moneta/simple_hashfile_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_hbase_spec.rb +105 -12
- data/spec/moneta/simple_hbase_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_leveldb_spec.rb +105 -12
- data/spec/moneta/simple_leveldb_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_localmemcache_spec.rb +105 -12
- data/spec/moneta/simple_localmemcache_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_lruhash_spec.rb +70 -12
- data/spec/moneta/simple_lruhash_with_expires_spec.rb +71 -13
- data/spec/moneta/simple_memcached_dalli_spec.rb +106 -13
- data/spec/moneta/simple_memcached_native_spec.rb +106 -13
- data/spec/moneta/simple_memcached_spec.rb +106 -13
- data/spec/moneta/simple_memory_spec.rb +70 -12
- data/spec/moneta/simple_memory_with_compress_spec.rb +70 -12
- data/spec/moneta/simple_memory_with_expires_spec.rb +71 -13
- data/spec/moneta/simple_memory_with_json_key_serializer_spec.rb +41 -15
- data/spec/moneta/simple_memory_with_json_serializer_spec.rb +24 -11
- data/spec/moneta/simple_memory_with_json_value_serializer_spec.rb +45 -14
- data/spec/moneta/simple_memory_with_prefix_spec.rb +70 -12
- data/spec/moneta/simple_memory_with_snappy_compress_spec.rb +70 -12
- data/spec/moneta/simple_mongo_spec.rb +105 -12
- data/spec/moneta/simple_mongo_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_null_spec.rb +36 -1
- data/spec/moneta/simple_pstore_spec.rb +105 -12
- data/spec/moneta/simple_pstore_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_redis_spec.rb +106 -13
- data/spec/moneta/simple_riak_spec.rb +105 -12
- data/spec/moneta/simple_riak_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_sdbm_spec.rb +105 -12
- data/spec/moneta/simple_sdbm_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_sequel_spec.rb +105 -12
- data/spec/moneta/simple_sequel_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_sqlite_spec.rb +105 -12
- data/spec/moneta/simple_sqlite_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_tokyocabinet_spec.rb +105 -12
- data/spec/moneta/simple_tokyocabinet_with_expires_spec.rb +106 -13
- data/spec/moneta/simple_yaml_spec.rb +104 -11
- data/spec/moneta/simple_yaml_with_expires_spec.rb +105 -12
- data/spec/moneta/stack_file_memory_spec.rb +3 -2
- data/spec/moneta/stack_memory_file_spec.rb +3 -1
- data/spec/moneta/transformer_bencode_spec.rb +23 -10
- data/spec/moneta/transformer_bert_spec.rb +23 -10
- data/spec/moneta/transformer_bson_spec.rb +23 -10
- data/spec/moneta/transformer_bzip2_spec.rb +13 -3
- data/spec/moneta/transformer_json_spec.rb +23 -10
- data/spec/moneta/transformer_lzma_spec.rb +13 -3
- data/spec/moneta/transformer_lzo_spec.rb +13 -3
- data/spec/moneta/transformer_marshal_base64_spec.rb +70 -12
- data/spec/moneta/transformer_marshal_escape_spec.rb +70 -12
- data/spec/moneta/transformer_marshal_hmac_spec.rb +70 -12
- data/spec/moneta/transformer_marshal_md5_spec.rb +70 -12
- data/spec/moneta/transformer_marshal_md5_spread_spec.rb +70 -12
- data/spec/moneta/transformer_marshal_prefix_spec.rb +70 -12
- data/spec/moneta/transformer_marshal_rmd160_spec.rb +70 -12
- data/spec/moneta/transformer_marshal_sha1_spec.rb +70 -12
- data/spec/moneta/transformer_marshal_sha256_spec.rb +70 -12
- data/spec/moneta/transformer_marshal_sha384_spec.rb +70 -12
- data/spec/moneta/transformer_marshal_sha512_spec.rb +70 -12
- data/spec/moneta/transformer_marshal_truncate_spec.rb +70 -12
- data/spec/moneta/transformer_marshal_uuencode_spec.rb +70 -12
- data/spec/moneta/transformer_msgpack_spec.rb +23 -10
- data/spec/moneta/transformer_ox_spec.rb +67 -9
- data/spec/moneta/transformer_quicklz_spec.rb +13 -3
- data/spec/moneta/transformer_snappy_spec.rb +13 -3
- data/spec/moneta/transformer_tnet_spec.rb +23 -10
- data/spec/moneta/transformer_yaml_spec.rb +67 -9
- data/spec/moneta/transformer_zlib_spec.rb +13 -3
- data/spec/monetaspecs.rb +4649 -1096
- 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
|
-
#
|
|
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)
|
data/lib/moneta/adapters/riak.rb
CHANGED
|
@@ -11,11 +11,9 @@ module Moneta
|
|
|
11
11
|
# Constructor
|
|
12
12
|
#
|
|
13
13
|
# @param [Hash] options
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
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'
|
data/lib/moneta/adapters/sdbm.rb
CHANGED
|
@@ -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
|
-
#
|
|
13
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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 || {})
|
|
71
|
+
result = load(key, default || {})
|
|
72
|
+
result == nil ? yield(key) : result
|
|
54
73
|
else
|
|
55
|
-
load(key, options || {})
|
|
74
|
+
result = load(key, options || {})
|
|
75
|
+
result == nil ? default : result
|
|
56
76
|
end
|
|
57
77
|
end
|
|
58
78
|
|
data/lib/moneta/builder.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module Moneta
|
|
2
|
-
# Builder implements the DSL to build a
|
|
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
|
|
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
|
|
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
data/lib/moneta/expires.rb
CHANGED
|
@@ -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
|
-
|
|
20
|
+
load_entry(key, options) != nil
|
|
23
21
|
end
|
|
24
22
|
|
|
25
23
|
def load(key, options = {})
|
|
26
|
-
if options.include?(:raw)
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
54
|
-
|
|
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
|
-
|
|
45
|
+
private
|
|
60
46
|
|
|
61
|
-
def
|
|
62
|
-
|
|
63
|
-
if
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
#
|
|
42
|
-
#
|
|
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 <
|
|
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
|
-
|
|
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
|
-
#
|
|
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 =
|
|
20
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
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(
|
|
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
|
-
#
|
|
19
|
-
#
|
|
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
|
-
@
|
|
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
|