moneta 0.7.20 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.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
|