moneta 1.1.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (208) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rubocop.yml +194 -0
  4. data/.travis.yml +65 -25
  5. data/CHANGES +36 -0
  6. data/CONTRIBUTORS +4 -2
  7. data/Gemfile +94 -65
  8. data/README.md +50 -25
  9. data/feature_matrix.yaml +3 -11
  10. data/lib/action_dispatch/middleware/session/moneta_store.rb +1 -0
  11. data/lib/active_support/cache/moneta_store.rb +5 -5
  12. data/lib/moneta.rb +20 -10
  13. data/lib/moneta/adapters/activerecord.rb +35 -19
  14. data/lib/moneta/adapters/activesupportcache.rb +3 -7
  15. data/lib/moneta/adapters/cassandra.rb +24 -16
  16. data/lib/moneta/adapters/client.rb +62 -21
  17. data/lib/moneta/adapters/couch.rb +225 -80
  18. data/lib/moneta/adapters/datamapper.rb +1 -0
  19. data/lib/moneta/adapters/file.rb +9 -6
  20. data/lib/moneta/adapters/hbase.rb +1 -1
  21. data/lib/moneta/adapters/kyotocabinet.rb +8 -7
  22. data/lib/moneta/adapters/leveldb.rb +1 -1
  23. data/lib/moneta/adapters/lmdb.rb +3 -4
  24. data/lib/moneta/adapters/lruhash.rb +29 -62
  25. data/lib/moneta/adapters/memcached.rb +1 -0
  26. data/lib/moneta/adapters/memcached/dalli.rb +1 -1
  27. data/lib/moneta/adapters/memcached/native.rb +10 -8
  28. data/lib/moneta/adapters/mongo.rb +256 -6
  29. data/lib/moneta/adapters/null.rb +1 -2
  30. data/lib/moneta/adapters/pstore.rb +3 -2
  31. data/lib/moneta/adapters/redis.rb +8 -4
  32. data/lib/moneta/adapters/restclient.rb +12 -3
  33. data/lib/moneta/adapters/riak.rb +2 -2
  34. data/lib/moneta/adapters/sequel.rb +137 -328
  35. data/lib/moneta/adapters/sequel/mysql.rb +66 -0
  36. data/lib/moneta/adapters/sequel/postgres.rb +80 -0
  37. data/lib/moneta/adapters/sequel/postgres_hstore.rb +240 -0
  38. data/lib/moneta/adapters/sequel/sqlite.rb +57 -0
  39. data/lib/moneta/adapters/sqlite.rb +25 -11
  40. data/lib/moneta/adapters/tokyotyrant.rb +1 -1
  41. data/lib/moneta/builder.rb +2 -3
  42. data/lib/moneta/create_support.rb +21 -0
  43. data/lib/moneta/dbm_adapter.rb +31 -0
  44. data/lib/moneta/{mixins.rb → defaults.rb} +3 -302
  45. data/lib/moneta/each_key_support.rb +27 -0
  46. data/lib/moneta/enumerable.rb +38 -0
  47. data/lib/moneta/expires.rb +12 -12
  48. data/lib/moneta/expires_support.rb +60 -0
  49. data/lib/moneta/fallback.rb +84 -0
  50. data/lib/moneta/hash_adapter.rb +68 -0
  51. data/lib/moneta/increment_support.rb +16 -0
  52. data/lib/moneta/lock.rb +7 -2
  53. data/lib/moneta/logger.rb +2 -2
  54. data/lib/moneta/nil_values.rb +35 -0
  55. data/lib/moneta/option_support.rb +51 -0
  56. data/lib/moneta/optionmerger.rb +0 -1
  57. data/lib/moneta/pool.rb +312 -30
  58. data/lib/moneta/proxy.rb +3 -3
  59. data/lib/moneta/server.rb +216 -65
  60. data/lib/moneta/shared.rb +13 -7
  61. data/lib/moneta/stack.rb +6 -6
  62. data/lib/moneta/synchronize.rb +3 -3
  63. data/lib/moneta/transformer.rb +68 -24
  64. data/lib/moneta/transformer/config.rb +63 -43
  65. data/lib/moneta/transformer/helper.rb +3 -3
  66. data/lib/moneta/transformer/helper/bson.rb +7 -14
  67. data/lib/moneta/utils.rb +3 -9
  68. data/lib/moneta/version.rb +1 -1
  69. data/lib/moneta/weak_each_key.rb +2 -4
  70. data/lib/rack/cache/moneta.rb +13 -11
  71. data/lib/rack/moneta_rest.rb +2 -2
  72. data/lib/rack/session/moneta.rb +3 -4
  73. data/moneta.gemspec +18 -4
  74. data/script/benchmarks +145 -46
  75. data/script/contributors +11 -6
  76. data/script/start-couchdb +27 -0
  77. data/script/start-hbase +3 -2
  78. data/script/start-services +3 -11
  79. data/spec/active_support/cache_moneta_store_spec.rb +30 -30
  80. data/spec/features/concurrent_create.rb +31 -10
  81. data/spec/features/concurrent_increment.rb +26 -19
  82. data/spec/features/create_expires.rb +15 -15
  83. data/spec/features/default_expires.rb +11 -12
  84. data/spec/features/expires.rb +215 -210
  85. data/spec/features/increment.rb +41 -41
  86. data/spec/features/store.rb +3 -3
  87. data/spec/helper.rb +23 -82
  88. data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +1 -1
  89. data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +1 -1
  90. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +4 -1
  91. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +4 -1
  92. data/spec/moneta/adapters/activesupportcache/standard_activesupportcache_spec.rb +14 -0
  93. data/spec/moneta/adapters/cassandra/standard_cassandra_spec.rb +1 -1
  94. data/spec/moneta/adapters/client/adapter_client_spec.rb +6 -6
  95. data/spec/moneta/adapters/client/client_helper.rb +24 -0
  96. data/spec/moneta/adapters/client/standard_client_tcp_spec.rb +8 -8
  97. data/spec/moneta/adapters/client/standard_client_unix_spec.rb +23 -7
  98. data/spec/moneta/adapters/couch/adapter_couch_spec.rb +199 -2
  99. data/spec/moneta/adapters/couch/standard_couch_spec.rb +9 -3
  100. data/spec/moneta/adapters/couch/standard_couch_with_expires_spec.rb +8 -2
  101. data/spec/moneta/adapters/daybreak/standard_daybreak_spec.rb +1 -1
  102. data/spec/moneta/adapters/daybreak/standard_daybreak_with_expires_spec.rb +1 -1
  103. data/spec/moneta/adapters/dbm/standard_dbm_spec.rb +1 -1
  104. data/spec/moneta/adapters/dbm/standard_dbm_with_expires_spec.rb +1 -1
  105. data/spec/moneta/adapters/faraday_helper.rb +9 -0
  106. data/spec/moneta/adapters/file/standard_file_spec.rb +2 -2
  107. data/spec/moneta/adapters/file/standard_file_with_expires_spec.rb +1 -1
  108. data/spec/moneta/adapters/gdbm/standard_gdbm_spec.rb +1 -1
  109. data/spec/moneta/adapters/gdbm/standard_gdbm_with_expires_spec.rb +1 -1
  110. data/spec/moneta/adapters/kyotocabinet/adapter_kyotocabinet_spec.rb +1 -1
  111. data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_spec.rb +2 -2
  112. data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_with_expires_spec.rb +2 -2
  113. data/spec/moneta/adapters/leveldb/standard_leveldb_spec.rb +1 -1
  114. data/spec/moneta/adapters/leveldb/standard_leveldb_with_expires_spec.rb +1 -1
  115. data/spec/moneta/adapters/lmdb/standard_lmdb_spec.rb +1 -1
  116. data/spec/moneta/adapters/lmdb/standard_lmdb_with_expires_spec.rb +1 -1
  117. data/spec/moneta/adapters/lruhash/adapter_lruhash_spec.rb +2 -2
  118. data/spec/moneta/adapters/lruhash/standard_lruhash_spec.rb +1 -1
  119. data/spec/moneta/adapters/lruhash/standard_lruhash_with_expires_spec.rb +1 -1
  120. data/spec/moneta/adapters/memcached/adapter_memcached_spec.rb +1 -1
  121. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_spec.rb +1 -1
  122. data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_with_default_expires_spec.rb +1 -1
  123. data/spec/moneta/adapters/memcached/dalli/standard_memcached_dalli_spec.rb +1 -1
  124. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_spec.rb +1 -1
  125. data/spec/moneta/adapters/memcached/native/adapter_memcached_native_with_default_expires_spec.rb +1 -1
  126. data/spec/moneta/adapters/memcached/native/standard_memcached_native_spec.rb +1 -1
  127. data/spec/moneta/adapters/memcached/standard_memcached_spec.rb +1 -1
  128. data/spec/moneta/adapters/{memcached/helper.rb → memcached_helper.rb} +0 -0
  129. data/spec/moneta/adapters/memory/standard_memory_spec.rb +1 -1
  130. data/spec/moneta/adapters/memory/standard_memory_with_compress_spec.rb +1 -1
  131. data/spec/moneta/adapters/memory/standard_memory_with_expires_spec.rb +1 -1
  132. data/spec/moneta/adapters/memory/standard_memory_with_json_key_serializer_spec.rb +1 -1
  133. data/spec/moneta/adapters/memory/standard_memory_with_json_serializer_spec.rb +1 -1
  134. data/spec/moneta/adapters/memory/standard_memory_with_json_value_serializer_spec.rb +2 -2
  135. data/spec/moneta/adapters/memory/standard_memory_with_prefix_spec.rb +39 -2
  136. data/spec/moneta/adapters/memory/standard_memory_with_snappy_compress_spec.rb +2 -2
  137. data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +18 -2
  138. data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +5 -3
  139. data/spec/moneta/adapters/mongo/standard_mongo_spec.rb +2 -2
  140. data/spec/moneta/adapters/null/null_adapter_spec.rb +1 -1
  141. data/spec/moneta/adapters/pstore/standard_pstore_spec.rb +1 -1
  142. data/spec/moneta/adapters/pstore/standard_pstore_with_expires_spec.rb +1 -1
  143. data/spec/moneta/adapters/redis/standard_redis_spec.rb +1 -1
  144. data/spec/moneta/adapters/restclient/adapter_restclient_spec.rb +7 -5
  145. data/spec/moneta/adapters/restclient/helper.rb +12 -0
  146. data/spec/moneta/adapters/restclient/standard_restclient_spec.rb +9 -6
  147. data/spec/moneta/adapters/riak/standard_riak_with_expires_spec.rb +4 -0
  148. data/spec/moneta/adapters/sdbm/standard_sdbm_spec.rb +1 -1
  149. data/spec/moneta/adapters/sdbm/standard_sdbm_with_expires_spec.rb +1 -1
  150. data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +31 -79
  151. data/spec/moneta/adapters/sequel/helper.rb +75 -0
  152. data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +5 -11
  153. data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +8 -9
  154. data/spec/moneta/adapters/sqlite/standard_sqlite_spec.rb +1 -1
  155. data/spec/moneta/adapters/sqlite/standard_sqlite_with_expires_spec.rb +1 -1
  156. data/spec/moneta/adapters/tdb/standard_tdb_spec.rb +1 -1
  157. data/spec/moneta/adapters/tdb/standard_tdb_with_expires_spec.rb +1 -1
  158. data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_spec.rb +1 -1
  159. data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_with_expires_spec.rb +1 -1
  160. data/spec/moneta/adapters/tokyotyrant/adapter_tokyotyrant_spec.rb +6 -2
  161. data/spec/moneta/adapters/tokyotyrant/helper.rb +12 -0
  162. data/spec/moneta/adapters/tokyotyrant/standard_tokyotyrant_spec.rb +5 -2
  163. data/spec/moneta/adapters/tokyotyrant/standard_tokyotyrant_with_expires_spec.rb +5 -1
  164. data/spec/moneta/adapters/yaml/standard_yaml_spec.rb +1 -1
  165. data/spec/moneta/adapters/yaml/standard_yaml_with_expires_spec.rb +1 -1
  166. data/spec/moneta/builder_spec.rb +22 -0
  167. data/spec/moneta/proxies/enumerable/enumerable_spec.rb +26 -0
  168. data/spec/moneta/proxies/expires/expires_file_spec.rb +1 -1
  169. data/spec/moneta/proxies/fallback/fallback_spec.rb +42 -0
  170. data/spec/moneta/proxies/pool/pool_spec.rb +319 -6
  171. data/spec/moneta/proxies/shared/shared_tcp_spec.rb +14 -4
  172. data/spec/moneta/proxies/shared/shared_unix_spec.rb +14 -4
  173. data/spec/moneta/proxies/transformer/transformer_bencode_spec.rb +1 -1
  174. data/spec/moneta/proxies/transformer/transformer_bert_spec.rb +3 -3
  175. data/spec/moneta/proxies/transformer/transformer_bson_spec.rb +2 -2
  176. data/spec/moneta/proxies/transformer/transformer_json_spec.rb +1 -1
  177. data/spec/moneta/proxies/transformer/transformer_key_marshal_spec.rb +1 -1
  178. data/spec/moneta/proxies/transformer/transformer_key_yaml_spec.rb +1 -1
  179. data/spec/moneta/proxies/transformer/transformer_marshal_base64_spec.rb +1 -1
  180. data/spec/moneta/proxies/transformer/transformer_marshal_escape_spec.rb +8 -4
  181. data/spec/moneta/proxies/transformer/transformer_marshal_hex_spec.rb +1 -1
  182. data/spec/moneta/proxies/transformer/transformer_marshal_hmac_spec.rb +1 -1
  183. data/spec/moneta/proxies/transformer/transformer_marshal_prefix_base64_spec.rb +33 -0
  184. data/spec/moneta/proxies/transformer/transformer_marshal_prefix_spec.rb +1 -1
  185. data/spec/moneta/proxies/transformer/transformer_marshal_qp_spec.rb +1 -1
  186. data/spec/moneta/proxies/transformer/transformer_marshal_spec.rb +1 -1
  187. data/spec/moneta/proxies/transformer/transformer_marshal_urlsafe_base64_spec.rb +1 -1
  188. data/spec/moneta/proxies/transformer/transformer_marshal_uuencode_spec.rb +1 -1
  189. data/spec/moneta/proxies/transformer/transformer_msgpack_spec.rb +1 -1
  190. data/spec/moneta/proxies/transformer/transformer_ox_spec.rb +1 -1
  191. data/spec/moneta/proxies/transformer/transformer_php_spec.rb +1 -1
  192. data/spec/moneta/proxies/transformer/transformer_tnet_spec.rb +1 -1
  193. data/spec/moneta/proxies/transformer/transformer_yaml_spec.rb +2 -2
  194. data/spec/moneta/proxies/weak_each_key/weak_each_key_spec.rb +0 -2
  195. data/spec/restserver.rb +55 -0
  196. data/spec/support/mongo_helper.rb +12 -0
  197. metadata +140 -32
  198. data/lib/moneta/adapters/mongo/base.rb +0 -103
  199. data/lib/moneta/adapters/mongo/moped.rb +0 -164
  200. data/lib/moneta/adapters/mongo/official.rb +0 -157
  201. data/script/install-kyotocabinet +0 -17
  202. data/spec/moneta/adapters/mongo/adapter_mongo_moped_spec.rb +0 -25
  203. data/spec/moneta/adapters/mongo/adapter_mongo_moped_with_default_expires_spec.rb +0 -12
  204. data/spec/moneta/adapters/mongo/adapter_mongo_official_spec.rb +0 -25
  205. data/spec/moneta/adapters/mongo/adapter_mongo_official_with_default_expires_spec.rb +0 -12
  206. data/spec/moneta/adapters/mongo/standard_mongo_moped_spec.rb +0 -7
  207. data/spec/moneta/adapters/mongo/standard_mongo_official_spec.rb +0 -7
  208. 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
@@ -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