moneta 1.1.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.rubocop.yml +194 -0
- data/.travis.yml +65 -25
- data/CHANGES +36 -0
- data/CONTRIBUTORS +4 -2
- data/Gemfile +94 -65
- data/README.md +50 -25
- data/feature_matrix.yaml +3 -11
- data/lib/action_dispatch/middleware/session/moneta_store.rb +1 -0
- data/lib/active_support/cache/moneta_store.rb +5 -5
- data/lib/moneta.rb +20 -10
- data/lib/moneta/adapters/activerecord.rb +35 -19
- data/lib/moneta/adapters/activesupportcache.rb +3 -7
- data/lib/moneta/adapters/cassandra.rb +24 -16
- data/lib/moneta/adapters/client.rb +62 -21
- data/lib/moneta/adapters/couch.rb +225 -80
- data/lib/moneta/adapters/datamapper.rb +1 -0
- data/lib/moneta/adapters/file.rb +9 -6
- data/lib/moneta/adapters/hbase.rb +1 -1
- data/lib/moneta/adapters/kyotocabinet.rb +8 -7
- data/lib/moneta/adapters/leveldb.rb +1 -1
- data/lib/moneta/adapters/lmdb.rb +3 -4
- data/lib/moneta/adapters/lruhash.rb +29 -62
- data/lib/moneta/adapters/memcached.rb +1 -0
- data/lib/moneta/adapters/memcached/dalli.rb +1 -1
- data/lib/moneta/adapters/memcached/native.rb +10 -8
- data/lib/moneta/adapters/mongo.rb +256 -6
- data/lib/moneta/adapters/null.rb +1 -2
- data/lib/moneta/adapters/pstore.rb +3 -2
- data/lib/moneta/adapters/redis.rb +8 -4
- data/lib/moneta/adapters/restclient.rb +12 -3
- data/lib/moneta/adapters/riak.rb +2 -2
- data/lib/moneta/adapters/sequel.rb +137 -328
- data/lib/moneta/adapters/sequel/mysql.rb +66 -0
- data/lib/moneta/adapters/sequel/postgres.rb +80 -0
- data/lib/moneta/adapters/sequel/postgres_hstore.rb +240 -0
- data/lib/moneta/adapters/sequel/sqlite.rb +57 -0
- data/lib/moneta/adapters/sqlite.rb +25 -11
- data/lib/moneta/adapters/tokyotyrant.rb +1 -1
- data/lib/moneta/builder.rb +2 -3
- data/lib/moneta/create_support.rb +21 -0
- data/lib/moneta/dbm_adapter.rb +31 -0
- data/lib/moneta/{mixins.rb → defaults.rb} +3 -302
- data/lib/moneta/each_key_support.rb +27 -0
- data/lib/moneta/enumerable.rb +38 -0
- data/lib/moneta/expires.rb +12 -12
- data/lib/moneta/expires_support.rb +60 -0
- data/lib/moneta/fallback.rb +84 -0
- data/lib/moneta/hash_adapter.rb +68 -0
- data/lib/moneta/increment_support.rb +16 -0
- data/lib/moneta/lock.rb +7 -2
- data/lib/moneta/logger.rb +2 -2
- data/lib/moneta/nil_values.rb +35 -0
- data/lib/moneta/option_support.rb +51 -0
- data/lib/moneta/optionmerger.rb +0 -1
- data/lib/moneta/pool.rb +312 -30
- data/lib/moneta/proxy.rb +3 -3
- data/lib/moneta/server.rb +216 -65
- data/lib/moneta/shared.rb +13 -7
- data/lib/moneta/stack.rb +6 -6
- data/lib/moneta/synchronize.rb +3 -3
- data/lib/moneta/transformer.rb +68 -24
- data/lib/moneta/transformer/config.rb +63 -43
- data/lib/moneta/transformer/helper.rb +3 -3
- data/lib/moneta/transformer/helper/bson.rb +7 -14
- data/lib/moneta/utils.rb +3 -9
- data/lib/moneta/version.rb +1 -1
- data/lib/moneta/weak_each_key.rb +2 -4
- data/lib/rack/cache/moneta.rb +13 -11
- data/lib/rack/moneta_rest.rb +2 -2
- data/lib/rack/session/moneta.rb +3 -4
- data/moneta.gemspec +18 -4
- data/script/benchmarks +145 -46
- data/script/contributors +11 -6
- data/script/start-couchdb +27 -0
- data/script/start-hbase +3 -2
- data/script/start-services +3 -11
- data/spec/active_support/cache_moneta_store_spec.rb +30 -30
- data/spec/features/concurrent_create.rb +31 -10
- data/spec/features/concurrent_increment.rb +26 -19
- data/spec/features/create_expires.rb +15 -15
- data/spec/features/default_expires.rb +11 -12
- data/spec/features/expires.rb +215 -210
- data/spec/features/increment.rb +41 -41
- data/spec/features/store.rb +3 -3
- data/spec/helper.rb +23 -82
- data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +1 -1
- data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +4 -1
- data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +4 -1
- data/spec/moneta/adapters/activesupportcache/standard_activesupportcache_spec.rb +14 -0
- data/spec/moneta/adapters/cassandra/standard_cassandra_spec.rb +1 -1
- data/spec/moneta/adapters/client/adapter_client_spec.rb +6 -6
- data/spec/moneta/adapters/client/client_helper.rb +24 -0
- data/spec/moneta/adapters/client/standard_client_tcp_spec.rb +8 -8
- data/spec/moneta/adapters/client/standard_client_unix_spec.rb +23 -7
- data/spec/moneta/adapters/couch/adapter_couch_spec.rb +199 -2
- data/spec/moneta/adapters/couch/standard_couch_spec.rb +9 -3
- data/spec/moneta/adapters/couch/standard_couch_with_expires_spec.rb +8 -2
- data/spec/moneta/adapters/daybreak/standard_daybreak_spec.rb +1 -1
- data/spec/moneta/adapters/daybreak/standard_daybreak_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/dbm/standard_dbm_spec.rb +1 -1
- data/spec/moneta/adapters/dbm/standard_dbm_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/faraday_helper.rb +9 -0
- data/spec/moneta/adapters/file/standard_file_spec.rb +2 -2
- data/spec/moneta/adapters/file/standard_file_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/gdbm/standard_gdbm_spec.rb +1 -1
- data/spec/moneta/adapters/gdbm/standard_gdbm_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/kyotocabinet/adapter_kyotocabinet_spec.rb +1 -1
- data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_spec.rb +2 -2
- data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_with_expires_spec.rb +2 -2
- data/spec/moneta/adapters/leveldb/standard_leveldb_spec.rb +1 -1
- data/spec/moneta/adapters/leveldb/standard_leveldb_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/lmdb/standard_lmdb_spec.rb +1 -1
- data/spec/moneta/adapters/lmdb/standard_lmdb_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/lruhash/adapter_lruhash_spec.rb +2 -2
- data/spec/moneta/adapters/lruhash/standard_lruhash_spec.rb +1 -1
- data/spec/moneta/adapters/lruhash/standard_lruhash_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/memcached/adapter_memcached_spec.rb +1 -1
- data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_spec.rb +1 -1
- data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapters/memcached/dalli/standard_memcached_dalli_spec.rb +1 -1
- data/spec/moneta/adapters/memcached/native/adapter_memcached_native_spec.rb +1 -1
- data/spec/moneta/adapters/memcached/native/adapter_memcached_native_with_default_expires_spec.rb +1 -1
- data/spec/moneta/adapters/memcached/native/standard_memcached_native_spec.rb +1 -1
- data/spec/moneta/adapters/memcached/standard_memcached_spec.rb +1 -1
- data/spec/moneta/adapters/{memcached/helper.rb → memcached_helper.rb} +0 -0
- data/spec/moneta/adapters/memory/standard_memory_spec.rb +1 -1
- data/spec/moneta/adapters/memory/standard_memory_with_compress_spec.rb +1 -1
- data/spec/moneta/adapters/memory/standard_memory_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/memory/standard_memory_with_json_key_serializer_spec.rb +1 -1
- data/spec/moneta/adapters/memory/standard_memory_with_json_serializer_spec.rb +1 -1
- data/spec/moneta/adapters/memory/standard_memory_with_json_value_serializer_spec.rb +2 -2
- data/spec/moneta/adapters/memory/standard_memory_with_prefix_spec.rb +39 -2
- data/spec/moneta/adapters/memory/standard_memory_with_snappy_compress_spec.rb +2 -2
- data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +18 -2
- data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +5 -3
- data/spec/moneta/adapters/mongo/standard_mongo_spec.rb +2 -2
- data/spec/moneta/adapters/null/null_adapter_spec.rb +1 -1
- data/spec/moneta/adapters/pstore/standard_pstore_spec.rb +1 -1
- data/spec/moneta/adapters/pstore/standard_pstore_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/redis/standard_redis_spec.rb +1 -1
- data/spec/moneta/adapters/restclient/adapter_restclient_spec.rb +7 -5
- data/spec/moneta/adapters/restclient/helper.rb +12 -0
- data/spec/moneta/adapters/restclient/standard_restclient_spec.rb +9 -6
- data/spec/moneta/adapters/riak/standard_riak_with_expires_spec.rb +4 -0
- data/spec/moneta/adapters/sdbm/standard_sdbm_spec.rb +1 -1
- data/spec/moneta/adapters/sdbm/standard_sdbm_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +31 -79
- data/spec/moneta/adapters/sequel/helper.rb +75 -0
- data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +5 -11
- data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +8 -9
- data/spec/moneta/adapters/sqlite/standard_sqlite_spec.rb +1 -1
- data/spec/moneta/adapters/sqlite/standard_sqlite_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/tdb/standard_tdb_spec.rb +1 -1
- data/spec/moneta/adapters/tdb/standard_tdb_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_spec.rb +1 -1
- data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/tokyotyrant/adapter_tokyotyrant_spec.rb +6 -2
- data/spec/moneta/adapters/tokyotyrant/helper.rb +12 -0
- data/spec/moneta/adapters/tokyotyrant/standard_tokyotyrant_spec.rb +5 -2
- data/spec/moneta/adapters/tokyotyrant/standard_tokyotyrant_with_expires_spec.rb +5 -1
- data/spec/moneta/adapters/yaml/standard_yaml_spec.rb +1 -1
- data/spec/moneta/adapters/yaml/standard_yaml_with_expires_spec.rb +1 -1
- data/spec/moneta/builder_spec.rb +22 -0
- data/spec/moneta/proxies/enumerable/enumerable_spec.rb +26 -0
- data/spec/moneta/proxies/expires/expires_file_spec.rb +1 -1
- data/spec/moneta/proxies/fallback/fallback_spec.rb +42 -0
- data/spec/moneta/proxies/pool/pool_spec.rb +319 -6
- data/spec/moneta/proxies/shared/shared_tcp_spec.rb +14 -4
- data/spec/moneta/proxies/shared/shared_unix_spec.rb +14 -4
- data/spec/moneta/proxies/transformer/transformer_bencode_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_bert_spec.rb +3 -3
- data/spec/moneta/proxies/transformer/transformer_bson_spec.rb +2 -2
- data/spec/moneta/proxies/transformer/transformer_json_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_key_marshal_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_key_yaml_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_base64_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_escape_spec.rb +8 -4
- data/spec/moneta/proxies/transformer/transformer_marshal_hex_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_hmac_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_prefix_base64_spec.rb +33 -0
- data/spec/moneta/proxies/transformer/transformer_marshal_prefix_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_qp_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_urlsafe_base64_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_uuencode_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_msgpack_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_ox_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_php_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_tnet_spec.rb +1 -1
- data/spec/moneta/proxies/transformer/transformer_yaml_spec.rb +2 -2
- data/spec/moneta/proxies/weak_each_key/weak_each_key_spec.rb +0 -2
- data/spec/restserver.rb +55 -0
- data/spec/support/mongo_helper.rb +12 -0
- metadata +140 -32
- data/lib/moneta/adapters/mongo/base.rb +0 -103
- data/lib/moneta/adapters/mongo/moped.rb +0 -164
- data/lib/moneta/adapters/mongo/official.rb +0 -157
- data/script/install-kyotocabinet +0 -17
- data/spec/moneta/adapters/mongo/adapter_mongo_moped_spec.rb +0 -25
- data/spec/moneta/adapters/mongo/adapter_mongo_moped_with_default_expires_spec.rb +0 -12
- data/spec/moneta/adapters/mongo/adapter_mongo_official_spec.rb +0 -25
- data/spec/moneta/adapters/mongo/adapter_mongo_official_with_default_expires_spec.rb +0 -12
- data/spec/moneta/adapters/mongo/standard_mongo_moped_spec.rb +0 -7
- data/spec/moneta/adapters/mongo/standard_mongo_official_spec.rb +0 -7
- data/spec/quality_spec.rb +0 -51
@@ -1,103 +0,0 @@
|
|
1
|
-
require 'bson'
|
2
|
-
|
3
|
-
module Moneta
|
4
|
-
module Adapters
|
5
|
-
# @api private
|
6
|
-
class MongoBase
|
7
|
-
include Defaults
|
8
|
-
include ExpiresSupport
|
9
|
-
|
10
|
-
supports :each_key, :create, :increment
|
11
|
-
attr_reader :backend
|
12
|
-
|
13
|
-
DEFAULT_PORT = 27017
|
14
|
-
|
15
|
-
def initialize(options = {})
|
16
|
-
self.default_expires = options.delete(:expires)
|
17
|
-
@expires_field = options.delete(:expires_field) || 'expiresAt'
|
18
|
-
@value_field = options.delete(:value_field) || 'value'
|
19
|
-
@type_field = options.delete(:type_field) || 'type'
|
20
|
-
end
|
21
|
-
|
22
|
-
# (see Proxy#fetch_values)
|
23
|
-
def fetch_values(*keys, **options)
|
24
|
-
return values_at(*keys, **options) unless block_given?
|
25
|
-
hash = Hash[slice(*keys, **options)]
|
26
|
-
keys.map do |key|
|
27
|
-
if hash.key?(key)
|
28
|
-
hash[key]
|
29
|
-
else
|
30
|
-
yield key
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
# (see Proxy#values_at)
|
36
|
-
def values_at(*keys, **options)
|
37
|
-
hash = Hash[slice(*keys, **options)]
|
38
|
-
keys.map { |key| hash[key] }
|
39
|
-
end
|
40
|
-
|
41
|
-
protected
|
42
|
-
|
43
|
-
def doc_to_value(doc)
|
44
|
-
case doc[@type_field]
|
45
|
-
when 'Hash'
|
46
|
-
doc = doc.dup
|
47
|
-
doc.delete('_id')
|
48
|
-
doc.delete(@type_field)
|
49
|
-
doc.delete(@expires_field)
|
50
|
-
doc
|
51
|
-
when 'Number'
|
52
|
-
doc[@value_field]
|
53
|
-
else
|
54
|
-
# In ruby_bson version 2 (and probably up), #to_s no longer returns the binary data
|
55
|
-
from_binary(doc[@value_field])
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def value_to_doc(key, value, options)
|
60
|
-
case value
|
61
|
-
when Hash
|
62
|
-
value.merge('_id' => key,
|
63
|
-
@type_field => 'Hash',
|
64
|
-
# @expires_field must be a Time object (BSON date datatype)
|
65
|
-
@expires_field => expires_at(options) || nil)
|
66
|
-
when Float, Integer
|
67
|
-
{ '_id' => key,
|
68
|
-
@type_field => 'Number',
|
69
|
-
@value_field => value,
|
70
|
-
# @expires_field must be a Time object (BSON date datatype)
|
71
|
-
@expires_field => expires_at(options) || nil }
|
72
|
-
when String
|
73
|
-
intvalue = value.to_i
|
74
|
-
{ '_id' => key,
|
75
|
-
@type_field => 'String',
|
76
|
-
@value_field => intvalue.to_s == value ? intvalue : to_binary(value),
|
77
|
-
# @expires_field must be a Time object (BSON date datatype)
|
78
|
-
@expires_field => expires_at(options) || nil }
|
79
|
-
else
|
80
|
-
raise ArgumentError, "Invalid value type: #{value.class}"
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
# BSON will use String#force_encoding to make the string 8-bit
|
85
|
-
# ASCII. This could break unicode text so we should dup in this
|
86
|
-
# case, and it also fails with frozen strings.
|
87
|
-
def to_binary(s)
|
88
|
-
s = s.dup if s.frozen? || s.encoding != Encoding::ASCII_8BIT
|
89
|
-
::BSON::Binary.new(s)
|
90
|
-
end
|
91
|
-
|
92
|
-
if defined?(::BSON::VERSION) and ::BSON::VERSION[0].to_i >= 2
|
93
|
-
def from_binary(binary)
|
94
|
-
binary.is_a?(::BSON::Binary) ? binary.data : binary.to_s
|
95
|
-
end
|
96
|
-
else
|
97
|
-
def from_binary(binary)
|
98
|
-
binary.to_s
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
@@ -1,164 +0,0 @@
|
|
1
|
-
require 'moneta/adapters/mongo/base'
|
2
|
-
require 'moped'
|
3
|
-
|
4
|
-
module Moneta
|
5
|
-
module Adapters
|
6
|
-
# MongoDB backend
|
7
|
-
#
|
8
|
-
# Supports expiration, documents will be automatically removed starting
|
9
|
-
# with mongodb >= 2.2 (see {http://docs.mongodb.org/manual/tutorial/expire-data/}).
|
10
|
-
#
|
11
|
-
# You can store hashes directly using this adapter.
|
12
|
-
#
|
13
|
-
# @example Store hashes
|
14
|
-
# db = Moneta::Adapters::MongoMoped.new
|
15
|
-
# db['key'] = {a: 1, b: 2}
|
16
|
-
#
|
17
|
-
# @api public
|
18
|
-
class MongoMoped < MongoBase
|
19
|
-
# @param [Hash] options
|
20
|
-
# @option options [String] :collection ('moneta') MongoDB collection name
|
21
|
-
# @option options [String] :host ('127.0.0.1') MongoDB server host
|
22
|
-
# @option options [String] :user Username used to authenticate
|
23
|
-
# @option options [String] :password Password used to authenticate
|
24
|
-
# @option options [Integer] :port (MongoDB default port) MongoDB server port
|
25
|
-
# @option options [String] :db ('moneta') MongoDB database
|
26
|
-
# @option options [Integer] :expires Default expiration time
|
27
|
-
# @option options [String] :expires_field ('expiresAt') Document field to store expiration time
|
28
|
-
# @option options [String] :value_field ('value') Document field to store value
|
29
|
-
# @option options [String] :type_field ('type') Document field to store value type
|
30
|
-
# @option options [::Moped::Session] :backend Use existing backend instance
|
31
|
-
# @option options Other options passed to `Moped::Session#new`
|
32
|
-
def initialize(options = {})
|
33
|
-
super(options)
|
34
|
-
collection = options.delete(:collection) || 'moneta'
|
35
|
-
db = options.delete(:db) || 'moneta'
|
36
|
-
user = options.delete(:user)
|
37
|
-
password = options.delete(:password)
|
38
|
-
@backend = options[:backend] ||
|
39
|
-
begin
|
40
|
-
host = options.delete(:host) || '127.0.0.1'
|
41
|
-
port = options.delete(:port) || DEFAULT_PORT
|
42
|
-
::Moped::Session.new(["#{host}:#{port}"])
|
43
|
-
end
|
44
|
-
@backend.use(db)
|
45
|
-
@backend.login(user, password) if user && password
|
46
|
-
@collection = @backend[collection]
|
47
|
-
if @backend.command(buildinfo: 1)['version'] >= '2.2'
|
48
|
-
@collection.indexes.create({ @expires_field => 1 }, expireAfterSeconds: 0)
|
49
|
-
else
|
50
|
-
warn 'Moneta::Adapters::Mongo - You are using MongoDB version < 2.2, expired documents will not be deleted'
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# (see Proxy#load)
|
55
|
-
def load(key, options = {})
|
56
|
-
key = to_binary(key)
|
57
|
-
doc = @collection.find(_id: key).one
|
58
|
-
if doc && (!doc[@expires_field] || doc[@expires_field] >= Time.now)
|
59
|
-
# @expires_field must be a Time object (BSON date datatype)
|
60
|
-
expires = expires_at(options, nil)
|
61
|
-
@collection.find(_id: key).update(:$set => { @expires_field => expires || nil }) if expires != nil
|
62
|
-
doc_to_value(doc)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# (see Proxy#store)
|
67
|
-
def store(key, value, options = {})
|
68
|
-
key = to_binary(key)
|
69
|
-
@collection.find(_id: key).upsert(value_to_doc(key, value, options))
|
70
|
-
value
|
71
|
-
end
|
72
|
-
|
73
|
-
# (see Proxy#each_key)
|
74
|
-
def each_key
|
75
|
-
return enum_for(:each_key) unless block_given?
|
76
|
-
@collection.find.each { |doc| yield from_binary(doc[:_id]) }
|
77
|
-
self
|
78
|
-
end
|
79
|
-
|
80
|
-
# (see Proxy#delete)
|
81
|
-
def delete(key, options = {})
|
82
|
-
value = load(key, options)
|
83
|
-
@collection.find(_id: to_binary(key)).remove if value
|
84
|
-
value
|
85
|
-
end
|
86
|
-
|
87
|
-
# (see Proxy#increment)
|
88
|
-
def increment(key, amount = 1, options = {})
|
89
|
-
@backend.with(safe: true, consistency: :strong) do |safe|
|
90
|
-
safe[@collection.name].
|
91
|
-
find(_id: to_binary(key)).
|
92
|
-
modify({:$inc => { @value_field => amount }},
|
93
|
-
new: true,
|
94
|
-
upsert: true)[@value_field]
|
95
|
-
end
|
96
|
-
rescue ::Moped::Errors::OperationFailure
|
97
|
-
tries ||= 0
|
98
|
-
tries += 1
|
99
|
-
retry if tries < 3
|
100
|
-
raise # otherwise
|
101
|
-
end
|
102
|
-
|
103
|
-
# (see Proxy#create)
|
104
|
-
def create(key, value, options = {})
|
105
|
-
key = to_binary(key)
|
106
|
-
@backend.with(safe: true, consistency: :strong) do |safe|
|
107
|
-
safe[@collection.name].insert(value_to_doc(key, value, options))
|
108
|
-
end
|
109
|
-
true
|
110
|
-
rescue ::Moped::Errors::MongoError => ex
|
111
|
-
raise if ex.details['code'] != 11000 # duplicate key error
|
112
|
-
false
|
113
|
-
end
|
114
|
-
|
115
|
-
# (see Proxy#clear)
|
116
|
-
def clear(options = {})
|
117
|
-
@collection.find.remove_all
|
118
|
-
self
|
119
|
-
end
|
120
|
-
|
121
|
-
# (see Proxy#slice)
|
122
|
-
def slice(*keys, **options)
|
123
|
-
query = @collection.find(_id: {:$in => keys.map(&method(:to_binary))})
|
124
|
-
pairs = query.map do |doc|
|
125
|
-
next if doc[@expires_field] && doc[@expires_field] < Time.now
|
126
|
-
[from_binary(doc[:_id]), doc_to_value(doc)]
|
127
|
-
end.compact
|
128
|
-
|
129
|
-
if (expires = expires_at(options, nil)) != nil
|
130
|
-
query.update_all(:$set => { @expires_field => expires || nil })
|
131
|
-
end
|
132
|
-
|
133
|
-
pairs
|
134
|
-
end
|
135
|
-
|
136
|
-
# (see Proxy#merge!)
|
137
|
-
def merge!(pairs, options = {})
|
138
|
-
@backend.with(safe: true, consistency: :strong) do |safe|
|
139
|
-
collection = safe[@collection.name]
|
140
|
-
existing = collection.
|
141
|
-
find(_id: {:$in => pairs.map { |key, _| to_binary(key) }.to_a}).
|
142
|
-
map{ |doc| [from_binary(doc[:_id]), doc_to_value(doc)] }.
|
143
|
-
to_h
|
144
|
-
|
145
|
-
update_pairs, insert_pairs = pairs.partition { |key, _| existing.key?(key) }
|
146
|
-
unless insert_pairs.empty?
|
147
|
-
collection.insert(insert_pairs.map do |key, value|
|
148
|
-
value_to_doc(to_binary(key), value, options)
|
149
|
-
end)
|
150
|
-
end
|
151
|
-
|
152
|
-
update_pairs.each do |key, value|
|
153
|
-
value = yield(key, existing[key], value) if block_given?
|
154
|
-
binary = to_binary(key)
|
155
|
-
collection.
|
156
|
-
find(_id: binary).
|
157
|
-
update(value_to_doc(binary, value, options))
|
158
|
-
end
|
159
|
-
end
|
160
|
-
self
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
@@ -1,157 +0,0 @@
|
|
1
|
-
require 'moneta/adapters/mongo/base'
|
2
|
-
require 'mongo'
|
3
|
-
|
4
|
-
module Moneta
|
5
|
-
module Adapters
|
6
|
-
# MongoDB backend
|
7
|
-
#
|
8
|
-
# Supports expiration, documents will be automatically removed starting
|
9
|
-
# with mongodb >= 2.2 (see {http://docs.mongodb.org/manual/tutorial/expire-data/}).
|
10
|
-
#
|
11
|
-
# You can store hashes directly using this adapter.
|
12
|
-
#
|
13
|
-
# @example Store hashes
|
14
|
-
# db = Moneta::Adapters::MongoOfficial.new
|
15
|
-
# db['key'] = {a: 1, b: 2}
|
16
|
-
#
|
17
|
-
# @api public
|
18
|
-
class MongoOfficial < MongoBase
|
19
|
-
# @param [Hash] options
|
20
|
-
# @option options [String] :collection ('moneta') MongoDB collection name
|
21
|
-
# @option options [String] :host ('127.0.0.1') MongoDB server host
|
22
|
-
# @option options [String] :user Username used to authenticate
|
23
|
-
# @option options [String] :password Password used to authenticate
|
24
|
-
# @option options [Integer] :port (MongoDB default port) MongoDB server port
|
25
|
-
# @option options [String] :db ('moneta') MongoDB database
|
26
|
-
# @option options [Integer] :expires Default expiration time
|
27
|
-
# @option options [String] :expires_field ('expiresAt') Document field to store expiration time
|
28
|
-
# @option options [String] :value_field ('value') Document field to store value
|
29
|
-
# @option options [String] :type_field ('type') Document field to store value type
|
30
|
-
# @option options [::Mongo::Client] :backend Use existing backend instance
|
31
|
-
# @option options Other options passed to `Mongo::MongoClient#new`
|
32
|
-
def initialize(options = {})
|
33
|
-
super(options)
|
34
|
-
collection = options.delete(:collection) || 'moneta'
|
35
|
-
db = options.delete(:db) || 'moneta'
|
36
|
-
@backend = options[:backend] ||
|
37
|
-
begin
|
38
|
-
host = options.delete(:host) || '127.0.0.1'
|
39
|
-
port = options.delete(:port) || DEFAULT_PORT
|
40
|
-
options[:logger] ||= ::Logger.new(STDERR).tap do |logger|
|
41
|
-
logger.level = ::Logger::ERROR
|
42
|
-
end
|
43
|
-
::Mongo::Client.new(["#{host}:#{port}"], options)
|
44
|
-
end
|
45
|
-
@backend.use(db)
|
46
|
-
@collection = @backend[collection]
|
47
|
-
if @backend.command(buildinfo: 1).documents.first['version'] >= '2.2'
|
48
|
-
@collection.indexes.create_one({@expires_field => 1}, expire_after: 0)
|
49
|
-
else
|
50
|
-
warn 'Moneta::Adapters::Mongo - You are using MongoDB version < 2.2, expired documents will not be deleted'
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# (see Proxy#load)
|
55
|
-
def load(key, options = {})
|
56
|
-
key = to_binary(key)
|
57
|
-
doc = @collection.find(_id: key).limit(1).first
|
58
|
-
if doc && (!doc[@expires_field] || doc[@expires_field] >= Time.now)
|
59
|
-
expires = expires_at(options, nil)
|
60
|
-
# @expires_field must be a Time object (BSON date datatype)
|
61
|
-
@collection.update_one({ _id: key },
|
62
|
-
'$set' => { @expires_field => expires }) unless expires.nil?
|
63
|
-
doc_to_value(doc)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# (see Proxy#store)
|
68
|
-
def store(key, value, options = {})
|
69
|
-
key = to_binary(key)
|
70
|
-
@collection.replace_one({ _id: key },
|
71
|
-
value_to_doc(key, value, options),
|
72
|
-
upsert: true)
|
73
|
-
value
|
74
|
-
end
|
75
|
-
|
76
|
-
# (see Proxy#each_key)
|
77
|
-
def each_key
|
78
|
-
return enum_for(:each_key) unless block_given?
|
79
|
-
@collection.find.each { |doc| yield from_binary(doc[:_id]) }
|
80
|
-
self
|
81
|
-
end
|
82
|
-
|
83
|
-
# (see Proxy#delete)
|
84
|
-
def delete(key, options = {})
|
85
|
-
key = to_binary(key)
|
86
|
-
if doc = @collection.find(_id: key).find_one_and_delete and
|
87
|
-
!doc[@expires_field] || doc[@expires_field] >= Time.now
|
88
|
-
then
|
89
|
-
doc_to_value(doc)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
# (see Proxy#increment)
|
94
|
-
def increment(key, amount = 1, options = {})
|
95
|
-
@collection.find_one_and_update({ _id: to_binary(key) },
|
96
|
-
{ '$inc' => { @value_field => amount } },
|
97
|
-
:return_document => :after,
|
98
|
-
:upsert => true)[@value_field]
|
99
|
-
end
|
100
|
-
|
101
|
-
# (see Proxy#create)
|
102
|
-
def create(key, value, options = {})
|
103
|
-
key = to_binary(key)
|
104
|
-
@collection.insert_one(value_to_doc(key, value, options))
|
105
|
-
true
|
106
|
-
rescue ::Mongo::Error::OperationFailure => ex
|
107
|
-
raise unless ex.message =~ /^E11000 / # duplicate key error
|
108
|
-
false
|
109
|
-
end
|
110
|
-
|
111
|
-
# (see Proxy#clear)
|
112
|
-
def clear(options = {})
|
113
|
-
@collection.delete_many
|
114
|
-
self
|
115
|
-
end
|
116
|
-
|
117
|
-
# (see Proxy#close)
|
118
|
-
def close
|
119
|
-
@backend.close
|
120
|
-
nil
|
121
|
-
end
|
122
|
-
|
123
|
-
# (see Proxy#slice)
|
124
|
-
def slice(*keys, **options)
|
125
|
-
query = @collection.find(_id: {:$in => keys.map(&method(:to_binary))})
|
126
|
-
pairs = query.map do |doc|
|
127
|
-
next if doc[@expires_field] && doc[@expires_field] < Time.now
|
128
|
-
[from_binary(doc[:_id]), doc_to_value(doc)]
|
129
|
-
end.compact
|
130
|
-
|
131
|
-
if (expires = expires_at(options, nil)) != nil
|
132
|
-
query.update_many(:$set => { @expires_field => expires || nil })
|
133
|
-
end
|
134
|
-
|
135
|
-
pairs
|
136
|
-
end
|
137
|
-
|
138
|
-
# (see Proxy#merge!)
|
139
|
-
def merge!(pairs, options = {})
|
140
|
-
existing = Hash[slice(*pairs.map { |key, _| key })]
|
141
|
-
update_pairs, insert_pairs = pairs.partition { |key, _| existing.key?(key) }
|
142
|
-
|
143
|
-
@collection.insert_many(insert_pairs.map do |key, value|
|
144
|
-
value_to_doc(to_binary(key), value, options)
|
145
|
-
end)
|
146
|
-
|
147
|
-
update_pairs.each do |key, value|
|
148
|
-
value = yield(key, existing[key], value) if block_given?
|
149
|
-
binary = to_binary(key)
|
150
|
-
@collection.replace_one({_id: binary}, value_to_doc(binary, value, options))
|
151
|
-
end
|
152
|
-
|
153
|
-
self
|
154
|
-
end
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
data/script/install-kyotocabinet
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
|
3
|
-
if `wget --no-check-certificate --quiet -O kyotocabinet.tar.gz https://moneta:$DAV_PW@qxqx.de/dav/kyotocabinet.tar.gz`; then
|
4
|
-
tar -xf kyotocabinet.tar.gz
|
5
|
-
else
|
6
|
-
wget http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.76.tar.gz
|
7
|
-
tar -xzf kyotocabinet-*.tar.gz
|
8
|
-
rm kyotocabinet-*.tar.gz
|
9
|
-
cd kyotocabinet-*
|
10
|
-
./configure --prefix=/usr
|
11
|
-
make
|
12
|
-
cd ..
|
13
|
-
tar -czf kyotocabinet.tar.gz kyotocabinet-*
|
14
|
-
curl -u moneta:$DAV_PW -k -T kyotocabinet.tar.gz https://qxqx.de/dav/ || echo 'Nothing uploaded'
|
15
|
-
fi
|
16
|
-
cd kyotocabinet-*
|
17
|
-
sudo make install
|
@@ -1,25 +0,0 @@
|
|
1
|
-
describe 'adapter_mongo_moped', adapter: :Mongo do
|
2
|
-
let(:t_res) { 0.125 }
|
3
|
-
let(:min_ttl) { t_res }
|
4
|
-
|
5
|
-
moneta_build do
|
6
|
-
Moneta::Adapters::MongoMoped.new(db: "adapter_mongo",
|
7
|
-
collection: 'moped')
|
8
|
-
end
|
9
|
-
|
10
|
-
moneta_specs ADAPTER_SPECS.with_each_key.with_native_expires.simplevalues_only
|
11
|
-
|
12
|
-
it 'automatically deletes expired document' do
|
13
|
-
store.store('key', 'val', expires: 5)
|
14
|
-
|
15
|
-
i = 0
|
16
|
-
query = store.instance_variable_get(:@collection).find(_id: ::BSON::Binary.new('key'))
|
17
|
-
while i < 70 && query.first
|
18
|
-
i += 1
|
19
|
-
sleep 1 # Mongo needs up to 60 seconds
|
20
|
-
end
|
21
|
-
|
22
|
-
i.should be > 0 # Indicates that it took at least one sleep to expire
|
23
|
-
query.count.should == 0
|
24
|
-
end
|
25
|
-
end
|