moneta 0.7.20 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -5
- data/CHANGES +6 -0
- data/CONTRIBUTORS +2 -0
- data/Gemfile +31 -44
- data/LICENSE +1 -1
- data/README.md +82 -59
- data/lib/active_support/cache/moneta_store.rb +3 -3
- data/lib/moneta.rb +4 -2
- data/lib/moneta/adapters/activerecord.rb +8 -8
- data/lib/moneta/adapters/cassandra.rb +8 -8
- data/lib/moneta/adapters/couch.rb +1 -1
- data/lib/moneta/adapters/datamapper.rb +5 -5
- data/lib/moneta/adapters/daybreak.rb +1 -1
- data/lib/moneta/adapters/fog.rb +2 -2
- data/lib/moneta/adapters/lmdb.rb +1 -1
- data/lib/moneta/adapters/localmemcache.rb +1 -1
- data/lib/moneta/adapters/memcached/dalli.rb +3 -3
- data/lib/moneta/adapters/memcached/native.rb +1 -1
- data/lib/moneta/adapters/mongo.rb +6 -164
- data/lib/moneta/adapters/mongo/base.rb +63 -0
- data/lib/moneta/adapters/mongo/moped.rb +113 -0
- data/lib/moneta/adapters/mongo/official.rb +121 -0
- data/lib/moneta/adapters/pstore.rb +1 -5
- data/lib/moneta/adapters/restclient.rb +1 -1
- data/lib/moneta/adapters/sequel.rb +10 -10
- data/lib/moneta/cache.rb +1 -1
- data/lib/moneta/logger.rb +2 -2
- data/lib/moneta/mixins.rb +4 -4
- data/lib/moneta/shared.rb +2 -2
- data/lib/moneta/stack.rb +2 -2
- data/lib/moneta/synchronize.rb +2 -2
- data/lib/moneta/transformer.rb +5 -5
- data/lib/moneta/transformer/config.rb +38 -40
- data/lib/moneta/version.rb +1 -1
- data/lib/rack/cache/moneta.rb +1 -1
- data/lib/rack/moneta_cookies.rb +2 -2
- data/lib/rack/moneta_rest.rb +1 -1
- data/lib/rack/moneta_store.rb +4 -4
- data/lib/rack/session/moneta.rb +14 -2
- data/moneta.gemspec +1 -0
- data/script/benchmarks +97 -96
- data/script/generate-specs +763 -730
- data/script/install-bundle +1 -1
- data/script/install-kyotocabinet +2 -2
- data/script/memusage +1 -1
- data/script/upload-bundle +1 -1
- data/spec/action_dispatch/session_moneta_store_spec.rb +5 -5
- data/spec/active_support/cache_moneta_store_spec.rb +20 -20
- data/spec/moneta/adapter_activerecord_exisiting_connection_spec.rb +2 -2
- data/spec/moneta/adapter_activerecord_spec.rb +6 -6
- data/spec/moneta/adapter_cassandra_spec.rb +1 -1
- data/spec/moneta/adapter_cassandra_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapter_couch_spec.rb +1 -1
- data/spec/moneta/adapter_datamapper_spec.rb +6 -6
- data/spec/moneta/adapter_daybreak_spec.rb +1 -1
- data/spec/moneta/adapter_dbm_spec.rb +1 -1
- data/spec/moneta/adapter_file_spec.rb +1 -1
- data/spec/moneta/adapter_fog_spec.rb +4 -4
- data/spec/moneta/adapter_gdbm_spec.rb +1 -1
- data/spec/moneta/adapter_hbase_spec.rb +1 -1
- data/spec/moneta/adapter_kyotocabinet_spec.rb +1 -1
- data/spec/moneta/adapter_leveldb_spec.rb +1 -1
- data/spec/moneta/adapter_lmdb_spec.rb +1 -1
- data/spec/moneta/adapter_lmdb_with_db_spec.rb +1 -1
- data/spec/moneta/adapter_localmemcache_spec.rb +1 -1
- data/spec/moneta/adapter_lruhash_spec.rb +1 -1
- data/spec/moneta/adapter_memcached_dalli_spec.rb +1 -1
- data/spec/moneta/adapter_memcached_dalli_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapter_memcached_native_spec.rb +1 -1
- data/spec/moneta/adapter_memcached_native_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapter_memcached_spec.rb +1 -1
- data/spec/moneta/adapter_memcached_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapter_mongo_moped_spec.rb +56 -0
- data/spec/moneta/adapter_mongo_moped_with_default_expires_spec.rb +51 -0
- data/spec/moneta/adapter_mongo_official_spec.rb +56 -0
- data/spec/moneta/adapter_mongo_official_with_default_expires_spec.rb +51 -0
- data/spec/moneta/adapter_mongo_spec.rb +1 -7
- data/spec/moneta/adapter_mongo_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapter_pstore_spec.rb +1 -1
- data/spec/moneta/adapter_redis_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapter_restclient_spec.rb +1 -1
- data/spec/moneta/adapter_sdbm_spec.rb +1 -1
- data/spec/moneta/adapter_sequel_spec.rb +1 -1
- data/spec/moneta/adapter_sqlite_spec.rb +1 -1
- data/spec/moneta/adapter_tdb_spec.rb +1 -1
- data/spec/moneta/adapter_tokyocabinet_bdb_spec.rb +1 -1
- data/spec/moneta/adapter_tokyocabinet_hdb_spec.rb +1 -1
- data/spec/moneta/adapter_yaml_spec.rb +1 -1
- data/spec/moneta/cache_file_memory_spec.rb +1 -1
- data/spec/moneta/expires_file_spec.rb +3 -3
- data/spec/moneta/expires_memory_with_default_expires_spec.rb +1 -1
- data/spec/moneta/mutex_spec.rb +1 -1
- data/spec/moneta/optionmerger_spec.rb +26 -26
- data/spec/moneta/pool_spec.rb +1 -1
- data/spec/moneta/semaphore_spec.rb +1 -1
- data/spec/moneta/shared_tcp_spec.rb +2 -2
- data/spec/moneta/shared_unix_spec.rb +2 -2
- data/spec/moneta/stack_file_memory_spec.rb +1 -1
- data/spec/moneta/stack_memory_file_spec.rb +1 -1
- data/spec/moneta/standard_activerecord_spec.rb +1 -1
- data/spec/moneta/standard_activerecord_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_cassandra_spec.rb +1 -1
- data/spec/moneta/standard_client_tcp_spec.rb +1 -1
- data/spec/moneta/standard_client_unix_spec.rb +2 -2
- data/spec/moneta/standard_couch_spec.rb +1 -1
- data/spec/moneta/standard_couch_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_datamapper_spec.rb +2 -2
- data/spec/moneta/standard_datamapper_with_expires_spec.rb +2 -2
- data/spec/moneta/standard_datamapper_with_repository_spec.rb +2 -2
- data/spec/moneta/standard_daybreak_spec.rb +1 -1
- data/spec/moneta/standard_daybreak_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_dbm_spec.rb +1 -1
- data/spec/moneta/standard_dbm_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_file_spec.rb +1 -1
- data/spec/moneta/standard_file_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_fog_spec.rb +4 -4
- data/spec/moneta/standard_fog_with_expires_spec.rb +5 -5
- data/spec/moneta/standard_gdbm_spec.rb +1 -1
- data/spec/moneta/standard_gdbm_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_hashfile_spec.rb +1 -1
- data/spec/moneta/standard_hashfile_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_hbase_spec.rb +1 -1
- data/spec/moneta/standard_hbase_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_kyotocabinet_spec.rb +1 -1
- data/spec/moneta/standard_kyotocabinet_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_leveldb_spec.rb +1 -1
- data/spec/moneta/standard_leveldb_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_lmdb_spec.rb +1 -1
- data/spec/moneta/standard_lmdb_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_localmemcache_spec.rb +1 -1
- data/spec/moneta/standard_localmemcache_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_lruhash_spec.rb +1 -1
- data/spec/moneta/standard_lruhash_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_memcached_dalli_spec.rb +1 -1
- data/spec/moneta/standard_memcached_native_spec.rb +1 -1
- data/spec/moneta/standard_memcached_spec.rb +1 -1
- data/spec/moneta/standard_memory_spec.rb +1 -1
- data/spec/moneta/standard_memory_with_compress_spec.rb +1 -1
- data/spec/moneta/standard_memory_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_memory_with_json_key_serializer_spec.rb +1 -1
- data/spec/moneta/standard_memory_with_json_serializer_spec.rb +1 -1
- data/spec/moneta/standard_memory_with_json_value_serializer_spec.rb +1 -1
- data/spec/moneta/standard_memory_with_prefix_spec.rb +1 -1
- data/spec/moneta/standard_memory_with_snappy_compress_spec.rb +1 -1
- data/spec/moneta/standard_mongo_moped_spec.rb +255 -0
- data/spec/moneta/standard_mongo_official_spec.rb +255 -0
- data/spec/moneta/standard_mongo_spec.rb +1 -1
- data/spec/moneta/standard_null_spec.rb +1 -1
- data/spec/moneta/standard_pstore_spec.rb +1 -1
- data/spec/moneta/standard_pstore_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_redis_spec.rb +1 -1
- data/spec/moneta/standard_restclient_spec.rb +1 -1
- data/spec/moneta/standard_riak_spec.rb +1 -1
- data/spec/moneta/standard_riak_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_sdbm_spec.rb +1 -1
- data/spec/moneta/standard_sdbm_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_sequel_spec.rb +1 -1
- data/spec/moneta/standard_sequel_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_sqlite_spec.rb +1 -1
- data/spec/moneta/standard_sqlite_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_tdb_spec.rb +1 -1
- data/spec/moneta/standard_tdb_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_tokyocabinet_spec.rb +1 -1
- data/spec/moneta/standard_tokyocabinet_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_tokyotyrant_spec.rb +1 -1
- data/spec/moneta/standard_tokyotyrant_with_expires_spec.rb +1 -1
- data/spec/moneta/standard_yaml_spec.rb +1 -1
- data/spec/moneta/standard_yaml_with_expires_spec.rb +1 -1
- data/spec/moneta/transformer_bencode_spec.rb +1 -1
- data/spec/moneta/transformer_bert_spec.rb +1 -1
- data/spec/moneta/transformer_bson_spec.rb +1 -1
- data/spec/moneta/transformer_bzip2_spec.rb +1 -1
- data/spec/moneta/transformer_json_spec.rb +1 -1
- data/spec/moneta/transformer_key_inspect_spec.rb +1 -1
- data/spec/moneta/transformer_key_marshal_spec.rb +1 -1
- data/spec/moneta/transformer_key_to_s_spec.rb +1 -1
- data/spec/moneta/transformer_key_yaml_spec.rb +1 -1
- data/spec/moneta/transformer_lz4_spec.rb +1 -1
- data/spec/moneta/transformer_lzma_spec.rb +1 -1
- data/spec/moneta/transformer_lzo_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_base64_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_city128_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_city32_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_city64_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_escape_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_hex_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_hmac_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_md5_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_md5_spread_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_prefix_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_qp_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_rmd160_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_sha1_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_sha256_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_sha384_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_sha512_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_truncate_spec.rb +1 -1
- data/spec/moneta/transformer_marshal_uuencode_spec.rb +1 -1
- data/spec/moneta/transformer_msgpack_spec.rb +1 -1
- data/spec/moneta/transformer_ox_spec.rb +1 -1
- data/spec/moneta/transformer_php_spec.rb +1 -1
- data/spec/moneta/transformer_quicklz_spec.rb +1 -1
- data/spec/moneta/transformer_snappy_spec.rb +1 -1
- data/spec/moneta/transformer_tnet_spec.rb +1 -1
- data/spec/moneta/transformer_value_marshal_spec.rb +1 -1
- data/spec/moneta/transformer_value_yaml_spec.rb +1 -1
- data/spec/moneta/transformer_yaml_spec.rb +1 -1
- data/spec/moneta/transformer_zlib_spec.rb +1 -1
- data/spec/moneta/weak_create_spec.rb +4 -4
- data/spec/moneta/weak_increment_spec.rb +4 -4
- data/spec/monetaspecs.rb +481 -481
- metadata +14 -185
@@ -4,21 +4,21 @@ module ActiveSupport
|
|
4
4
|
class MonetaStore < Store
|
5
5
|
def initialize(options = nil)
|
6
6
|
raise ArgumentError, 'Option :store is required' unless @store = options.delete(:store)
|
7
|
-
@store = ::Moneta.new(@store, :
|
7
|
+
@store = ::Moneta.new(@store, expires: true) if Symbol === @store
|
8
8
|
super(options)
|
9
9
|
extend Strategy::LocalCache
|
10
10
|
end
|
11
11
|
|
12
12
|
def increment(key, amount = 1, options = nil)
|
13
13
|
options = merged_options(options)
|
14
|
-
instrument(:increment, key, :
|
14
|
+
instrument(:increment, key, amount: amount) do
|
15
15
|
@store.increment(namespaced_key(key, options), amount, moneta_options(options))
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
def decrement(key, amount = 1, options = nil)
|
20
20
|
options = merged_options(options)
|
21
|
-
instrument(:decrement, key, :
|
21
|
+
instrument(:decrement, key, amount: amount) do
|
22
22
|
@store.increment(namespaced_key(key, options), -amount, moneta_options(options))
|
23
23
|
end
|
24
24
|
end
|
data/lib/moneta.rb
CHANGED
@@ -47,6 +47,8 @@ module Moneta
|
|
47
47
|
autoload :MemcachedNative, 'moneta/adapters/memcached/native'
|
48
48
|
autoload :Memory, 'moneta/adapters/memory'
|
49
49
|
autoload :Mongo, 'moneta/adapters/mongo'
|
50
|
+
autoload :MongoMoped, 'moneta/adapters/mongo/moped'
|
51
|
+
autoload :MongoOfficial, 'moneta/adapters/mongo/official'
|
50
52
|
autoload :Null, 'moneta/adapters/null'
|
51
53
|
autoload :PStore, 'moneta/adapters/pstore'
|
52
54
|
autoload :Redis, 'moneta/adapters/redis'
|
@@ -98,7 +100,7 @@ module Moneta
|
|
98
100
|
serializer = options.include?(:serializer) ? options.delete(:serializer) : :marshal
|
99
101
|
key_serializer = options.include?(:key_serializer) ? options.delete(:key_serializer) : serializer
|
100
102
|
value_serializer = options.include?(:value_serializer) ? options.delete(:value_serializer) : serializer
|
101
|
-
transformer = { :
|
103
|
+
transformer = { key: [key_serializer, :prefix], value: [value_serializer], prefix: options.delete(:prefix) }
|
102
104
|
transformer[:value] << (Symbol === compress ? compress : :zlib) if compress
|
103
105
|
raise ArgumentError, 'Name must be Symbol' unless Symbol === name
|
104
106
|
case name
|
@@ -123,7 +125,7 @@ module Moneta
|
|
123
125
|
a = Adapters.const_get(name).new(options)
|
124
126
|
build do
|
125
127
|
use :Logger, Hash === logger ? logger : {} if logger
|
126
|
-
use :Expires, :
|
128
|
+
use :Expires, expires: options[:expires] if !a.supports?(:expires) && expires
|
127
129
|
use :Transformer, transformer
|
128
130
|
use :Lock if threadsafe
|
129
131
|
adapter a
|
@@ -60,12 +60,12 @@ module Moneta
|
|
60
60
|
|
61
61
|
table.connection_pool.with_connection do |conn|
|
62
62
|
unless table.table_exists?
|
63
|
-
conn.create_table(table.table_name, :
|
63
|
+
conn.create_table(table.table_name, id: false) do |t|
|
64
64
|
# Do not use binary key (Issue #17)
|
65
|
-
t.string :k, :
|
65
|
+
t.string :k, null: false
|
66
66
|
t.binary :v
|
67
67
|
end
|
68
|
-
conn.add_index(table.table_name, :k, :
|
68
|
+
conn.add_index(table.table_name, :k, unique: true)
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
@@ -86,14 +86,14 @@ module Moneta
|
|
86
86
|
# (see Proxy#key?)
|
87
87
|
def key?(key, options = {})
|
88
88
|
@table.connection_pool.with_connection do
|
89
|
-
!@table.where(:
|
89
|
+
!@table.where(k: key).empty?
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
93
|
# (see Proxy#load)
|
94
94
|
def load(key, options = {})
|
95
95
|
@table.connection_pool.with_connection do
|
96
|
-
record = @table.select(:v).where(:
|
96
|
+
record = @table.select(:v).where(k: key).first
|
97
97
|
record && record.v
|
98
98
|
end
|
99
99
|
end
|
@@ -101,7 +101,7 @@ module Moneta
|
|
101
101
|
# (see Proxy#store)
|
102
102
|
def store(key, value, options = {})
|
103
103
|
@table.connection_pool.with_connection do
|
104
|
-
record = @table.select(:k).where(:
|
104
|
+
record = @table.select(:k).where(k: key).first_or_initialize
|
105
105
|
record.v = value
|
106
106
|
record.save
|
107
107
|
value
|
@@ -114,7 +114,7 @@ module Moneta
|
|
114
114
|
# (see Proxy#delete)
|
115
115
|
def delete(key, options = {})
|
116
116
|
@table.connection_pool.with_connection do
|
117
|
-
if record = @table.where(:
|
117
|
+
if record = @table.where(k: key).first
|
118
118
|
record.destroy
|
119
119
|
record.v
|
120
120
|
end
|
@@ -125,7 +125,7 @@ module Moneta
|
|
125
125
|
def increment(key, amount = 1, options = {})
|
126
126
|
@table.connection_pool.with_connection do
|
127
127
|
@table.transaction do
|
128
|
-
if record = @table.where(:
|
128
|
+
if record = @table.where(k: key).lock.first
|
129
129
|
value = Utils.to_int(record.v) + amount
|
130
130
|
record.v = value.to_s
|
131
131
|
record.save
|
@@ -33,12 +33,12 @@ module Moneta
|
|
33
33
|
"#{options[:host] || '127.0.0.1'}:#{options[:port] || 9160}",
|
34
34
|
options)
|
35
35
|
unless @backend.keyspaces.include?(keyspace)
|
36
|
-
cf_def = ::Cassandra::ColumnFamily.new(:
|
37
|
-
ks_def = ::Cassandra::Keyspace.new(:
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:
|
36
|
+
cf_def = ::Cassandra::ColumnFamily.new(keyspace: keyspace, name: @cf.to_s)
|
37
|
+
ks_def = ::Cassandra::Keyspace.new(name: keyspace,
|
38
|
+
strategy_class: 'SimpleStrategy',
|
39
|
+
strategy_options: { 'replication_factor' => '1' },
|
40
|
+
replication_factor: 1,
|
41
|
+
cf_defs: [cf_def])
|
42
42
|
# Wait for keyspace to be created (issue #24)
|
43
43
|
10.times do
|
44
44
|
begin
|
@@ -68,14 +68,14 @@ module Moneta
|
|
68
68
|
def load(key, options = {})
|
69
69
|
if value = @backend.get(@cf, key)
|
70
70
|
expires = expires_value(options, nil)
|
71
|
-
@backend.insert(@cf, key, {'value' => value['value'] }, :
|
71
|
+
@backend.insert(@cf, key, {'value' => value['value'] }, ttl: expires || nil) if expires != nil
|
72
72
|
value['value']
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
76
|
# (see Proxy#store)
|
77
77
|
def store(key, value, options = {})
|
78
|
-
@backend.insert(@cf, key, {'value' => value}, :
|
78
|
+
@backend.insert(@cf, key, {'value' => value}, ttl: expires_value(options) || nil)
|
79
79
|
value
|
80
80
|
end
|
81
81
|
|
@@ -30,7 +30,7 @@ module Moneta
|
|
30
30
|
@value_field = options[:value_field] || 'value'
|
31
31
|
@type_field = options[:type_field] || 'type'
|
32
32
|
url = "http://#{options[:host] || '127.0.0.1'}:#{options[:port] || 5984}/#{options[:db] || 'moneta'}"
|
33
|
-
@backend = options[:backend] || ::Faraday.new(:
|
33
|
+
@backend = options[:backend] || ::Faraday.new(url: url)
|
34
34
|
create_db
|
35
35
|
end
|
36
36
|
|
@@ -12,8 +12,8 @@ module Moneta
|
|
12
12
|
|
13
13
|
class Store
|
14
14
|
include ::DataMapper::Resource
|
15
|
-
property :k, String, :
|
16
|
-
property :v, Text, :
|
15
|
+
property :k, String, key: true, length: 255
|
16
|
+
property :v, Text, lazy: false
|
17
17
|
self.raise_on_save_failure = true
|
18
18
|
end
|
19
19
|
|
@@ -46,9 +46,9 @@ module Moneta
|
|
46
46
|
def store(key, value, options = {})
|
47
47
|
context do
|
48
48
|
if record = Store.get(key)
|
49
|
-
record.update(:
|
49
|
+
record.update(k: key, v: value)
|
50
50
|
else
|
51
|
-
Store.create(:
|
51
|
+
Store.create(k: key, v: value)
|
52
52
|
end
|
53
53
|
value
|
54
54
|
end
|
@@ -60,7 +60,7 @@ module Moneta
|
|
60
60
|
# (see Proxy#create)
|
61
61
|
def create(key, value, options = {})
|
62
62
|
context do
|
63
|
-
Store.create(:
|
63
|
+
Store.create(k: key, v: value)
|
64
64
|
true
|
65
65
|
end
|
66
66
|
rescue
|
@@ -12,7 +12,7 @@ module Moneta
|
|
12
12
|
@backend = options[:backend] ||
|
13
13
|
begin
|
14
14
|
raise ArgumentError, 'Option :file is required' unless options[:file]
|
15
|
-
::Daybreak::DB.new(options[:file], :
|
15
|
+
::Daybreak::DB.new(options[:file], serializer: ::Daybreak::Serializer::None)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
data/lib/moneta/adapters/fog.rb
CHANGED
@@ -16,7 +16,7 @@ module Moneta
|
|
16
16
|
def initialize(options = {})
|
17
17
|
raise ArgumentError, 'Option :dir is required' unless dir = options.delete(:dir)
|
18
18
|
@backend = options[:backend] || ::Fog::Storage.new(options)
|
19
|
-
@directory = @backend.directories.get(dir) || @backend.directories.create(:
|
19
|
+
@directory = @backend.directories.get(dir) || @backend.directories.create(key: dir)
|
20
20
|
end
|
21
21
|
|
22
22
|
# (see Proxy#key?)
|
@@ -42,7 +42,7 @@ module Moneta
|
|
42
42
|
# (see Proxy#store)
|
43
43
|
def store(key, value, options = {})
|
44
44
|
value = value.dup if value.frozen? # HACK: Fog needs unfrozen string
|
45
|
-
@directory.files.create(options.merge(:
|
45
|
+
@directory.files.create(options.merge(key: key, body: value))
|
46
46
|
value
|
47
47
|
end
|
48
48
|
|
data/lib/moneta/adapters/lmdb.rb
CHANGED
@@ -30,14 +30,14 @@ module Moneta
|
|
30
30
|
value = @backend.get(key)
|
31
31
|
if value
|
32
32
|
expires = expires_value(options, nil)
|
33
|
-
@backend.set(key, value, expires || nil, :
|
33
|
+
@backend.set(key, value, expires || nil, raw: true) if expires != nil
|
34
34
|
value
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
# (see Proxy#store)
|
39
39
|
def store(key, value, options = {})
|
40
|
-
@backend.set(key, value, expires_value(options) || nil, :
|
40
|
+
@backend.set(key, value, expires_value(options) || nil, raw: true)
|
41
41
|
value
|
42
42
|
end
|
43
43
|
|
@@ -76,7 +76,7 @@ module Moneta
|
|
76
76
|
|
77
77
|
# (see Defaults#create)
|
78
78
|
def create(key, value, options = {})
|
79
|
-
@backend.add(key, value, expires_value(options) || nil, :
|
79
|
+
@backend.add(key, value, expires_value(options) || nil, raw: true)
|
80
80
|
end
|
81
81
|
|
82
82
|
# (see Proxy#close)
|
@@ -22,7 +22,7 @@ module Moneta
|
|
22
22
|
self.default_expires = options.delete(:expires)
|
23
23
|
@backend = options[:backend] ||
|
24
24
|
begin
|
25
|
-
options.merge!(:
|
25
|
+
options.merge!(prefix_key: options.delete(:namespace)) if options[:namespace]
|
26
26
|
# We don't want a limitation on the key charset. Therefore we use the binary protocol.
|
27
27
|
# It is also faster.
|
28
28
|
options[:binary_protocol] = true unless options.include?(:binary_protocol)
|
@@ -1,169 +1,11 @@
|
|
1
|
-
require 'mongo'
|
2
|
-
|
3
1
|
module Moneta
|
4
2
|
module Adapters
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
#
|
12
|
-
# @example Store hashes
|
13
|
-
# db = Moneta::Adapters::Mongo.new
|
14
|
-
# db['key'] = {a: 1, b: 2}
|
15
|
-
#
|
16
|
-
# @api public
|
17
|
-
class Mongo
|
18
|
-
include Defaults
|
19
|
-
include ExpiresSupport
|
20
|
-
|
21
|
-
supports :create, :increment
|
22
|
-
attr_reader :backend
|
23
|
-
|
24
|
-
# @param [Hash] options
|
25
|
-
# @option options [String] :collection ('moneta') MongoDB collection name
|
26
|
-
# @option options [String] :host ('127.0.0.1') MongoDB server host
|
27
|
-
# @option options [String] :user Username used to authenticate
|
28
|
-
# @option options [String] :password Password used to authenticate
|
29
|
-
# @option options [Integer] :port (MongoDB default port) MongoDB server port
|
30
|
-
# @option options [String] :db ('moneta') MongoDB database
|
31
|
-
# @option options [Integer] :expires Default expiration time
|
32
|
-
# @option options [String] :expires_field ('expiresAt') Document field to store expiration time
|
33
|
-
# @option options [String] :value_field ('value') Document field to store value
|
34
|
-
# @option options [String] :type_field ('type') Document field to store value type
|
35
|
-
# @option options [::Mongo::MongoClient] :backend Use existing backend instance
|
36
|
-
# @option options Other options passed to `Mongo::MongoClient#new`
|
37
|
-
def initialize(options = {})
|
38
|
-
self.default_expires = options.delete(:expires)
|
39
|
-
collection = options.delete(:collection) || 'moneta'
|
40
|
-
db = options.delete(:db) || 'moneta'
|
41
|
-
@expires_field = options.delete(:expires_field) || 'expiresAt'
|
42
|
-
@value_field = options.delete(:value_field) || 'value'
|
43
|
-
@type_field = options.delete(:type_field) || 'type'
|
44
|
-
@backend = options[:backend] ||
|
45
|
-
begin
|
46
|
-
host = options.delete(:host) || '127.0.0.1'
|
47
|
-
port = options.delete(:port) || ::Mongo::MongoClient::DEFAULT_PORT
|
48
|
-
user = options.delete(:user)
|
49
|
-
password = options.delete(:password)
|
50
|
-
::Mongo::MongoClient.new(host, port, options)
|
51
|
-
end
|
52
|
-
db = @backend.db(db)
|
53
|
-
db.authenticate(user, password, true) if user && password
|
54
|
-
@collection = db.collection(collection)
|
55
|
-
if @backend.server_version >= '2.2'
|
56
|
-
@collection.ensure_index([[@expires_field, ::Mongo::ASCENDING]], :expireAfterSeconds => 0)
|
57
|
-
else
|
58
|
-
warn 'Moneta::Adapters::Mongo - You are using MongoDB version < 2.2, expired documents will not be deleted'
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
# (see Proxy#load)
|
63
|
-
def load(key, options = {})
|
64
|
-
key = to_binary(key)
|
65
|
-
doc = @collection.find_one('_id' => key)
|
66
|
-
if doc && (!doc[@expires_field] || doc[@expires_field] >= Time.now)
|
67
|
-
expires = expires_at(options, nil)
|
68
|
-
@collection.update({ '_id' => key },
|
69
|
-
# @expires_field must be a Time object (BSON date datatype)
|
70
|
-
{ '$set' => { @expires_field => expires || nil } }) if expires != nil
|
71
|
-
doc_to_value(doc)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
# (see Proxy#store)
|
76
|
-
def store(key, value, options = {})
|
77
|
-
key = to_binary(key)
|
78
|
-
@collection.update({ '_id' => key },
|
79
|
-
value_to_doc(key, value, options),
|
80
|
-
{ :upsert => true })
|
81
|
-
value
|
82
|
-
end
|
83
|
-
|
84
|
-
# (see Proxy#delete)
|
85
|
-
def delete(key, options = {})
|
86
|
-
value = load(key, options)
|
87
|
-
@collection.remove('_id' => to_binary(key)) if value
|
88
|
-
value
|
89
|
-
end
|
90
|
-
|
91
|
-
# (see Proxy#increment)
|
92
|
-
def increment(key, amount = 1, options = {})
|
93
|
-
@collection.find_and_modify(:query => { '_id' => to_binary(key) },
|
94
|
-
:update => { '$inc' => { @value_field => amount } },
|
95
|
-
:new => true,
|
96
|
-
:upsert => true)[@value_field]
|
97
|
-
end
|
98
|
-
|
99
|
-
# (see Proxy#create)
|
100
|
-
def create(key, value, options = {})
|
101
|
-
key = to_binary(key)
|
102
|
-
@collection.insert(value_to_doc(key, value, options))
|
103
|
-
true
|
104
|
-
rescue ::Mongo::OperationFailure => ex
|
105
|
-
raise if ex.error_code != 11000 # duplicate key error
|
106
|
-
false
|
107
|
-
end
|
108
|
-
|
109
|
-
# (see Proxy#clear)
|
110
|
-
def clear(options = {})
|
111
|
-
@collection.remove
|
112
|
-
self
|
113
|
-
end
|
114
|
-
|
115
|
-
# (see Proxy#close)
|
116
|
-
def close
|
117
|
-
@backend.close
|
118
|
-
nil
|
119
|
-
end
|
120
|
-
|
121
|
-
protected
|
122
|
-
|
123
|
-
def doc_to_value(doc)
|
124
|
-
case doc[@type_field]
|
125
|
-
when 'Hash'
|
126
|
-
doc = doc.dup
|
127
|
-
doc.delete('_id')
|
128
|
-
doc.delete(@type_field)
|
129
|
-
doc.delete(@expires_field)
|
130
|
-
doc
|
131
|
-
when 'Number'
|
132
|
-
doc[@value_field]
|
133
|
-
else
|
134
|
-
doc[@value_field].to_s
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
def value_to_doc(key, value, options)
|
139
|
-
case value
|
140
|
-
when Hash
|
141
|
-
value.merge('_id' => key,
|
142
|
-
@type_field => 'Hash',
|
143
|
-
# @expires_field must be a Time object (BSON date datatype)
|
144
|
-
@expires_field => expires_at(options) || nil)
|
145
|
-
when Float, Fixnum
|
146
|
-
{ '_id' => key,
|
147
|
-
@type_field => 'Number',
|
148
|
-
@value_field => value,
|
149
|
-
# @expires_field must be a Time object (BSON date datatype)
|
150
|
-
@expires_field => expires_at(options) || nil }
|
151
|
-
when String
|
152
|
-
intvalue = value.to_i
|
153
|
-
{ '_id' => key,
|
154
|
-
@type_field => 'String',
|
155
|
-
@value_field => intvalue.to_s == value ? intvalue : to_binary(value),
|
156
|
-
# @expires_field must be a Time object (BSON date datatype)
|
157
|
-
@expires_field => expires_at(options) || nil }
|
158
|
-
else
|
159
|
-
raise ArgumentError, "Invalid value type: #{value.class}"
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
def to_binary(s)
|
164
|
-
s = s.dup if s.frozen? # HACK: BSON::Binary needs unfrozen string
|
165
|
-
::BSON::Binary.new(s)
|
166
|
-
end
|
3
|
+
begin
|
4
|
+
require 'moneta/adapters/mongo/official'
|
5
|
+
Mongo = MongoOfficial
|
6
|
+
rescue LoadError
|
7
|
+
require 'moneta/adapters/mongo/moped'
|
8
|
+
Mongo = MongoMoped
|
167
9
|
end
|
168
10
|
end
|
169
11
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Moneta
|
2
|
+
module Adapters
|
3
|
+
# @api private
|
4
|
+
class MongoBase
|
5
|
+
include Defaults
|
6
|
+
include ExpiresSupport
|
7
|
+
|
8
|
+
supports :create, :increment
|
9
|
+
attr_reader :backend
|
10
|
+
|
11
|
+
DEFAULT_PORT = 27017
|
12
|
+
|
13
|
+
def initialize(options = {})
|
14
|
+
self.default_expires = options.delete(:expires)
|
15
|
+
@expires_field = options.delete(:expires_field) || 'expiresAt'
|
16
|
+
@value_field = options.delete(:value_field) || 'value'
|
17
|
+
@type_field = options.delete(:type_field) || 'type'
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
|
22
|
+
def doc_to_value(doc)
|
23
|
+
case doc[@type_field]
|
24
|
+
when 'Hash'
|
25
|
+
doc = doc.dup
|
26
|
+
doc.delete('_id')
|
27
|
+
doc.delete(@type_field)
|
28
|
+
doc.delete(@expires_field)
|
29
|
+
doc
|
30
|
+
when 'Number'
|
31
|
+
doc[@value_field]
|
32
|
+
else
|
33
|
+
doc[@value_field].to_s
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def value_to_doc(key, value, options)
|
38
|
+
case value
|
39
|
+
when Hash
|
40
|
+
value.merge('_id' => key,
|
41
|
+
@type_field => 'Hash',
|
42
|
+
# @expires_field must be a Time object (BSON date datatype)
|
43
|
+
@expires_field => expires_at(options) || nil)
|
44
|
+
when Float, Fixnum
|
45
|
+
{ '_id' => key,
|
46
|
+
@type_field => 'Number',
|
47
|
+
@value_field => value,
|
48
|
+
# @expires_field must be a Time object (BSON date datatype)
|
49
|
+
@expires_field => expires_at(options) || nil }
|
50
|
+
when String
|
51
|
+
intvalue = value.to_i
|
52
|
+
{ '_id' => key,
|
53
|
+
@type_field => 'String',
|
54
|
+
@value_field => intvalue.to_s == value ? intvalue : to_binary(value),
|
55
|
+
# @expires_field must be a Time object (BSON date datatype)
|
56
|
+
@expires_field => expires_at(options) || nil }
|
57
|
+
else
|
58
|
+
raise ArgumentError, "Invalid value type: #{value.class}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|