moneta 1.5.2 → 1.6.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/CHANGES +12 -0
- data/CONTRIBUTORS +1 -0
- data/LICENSE +1 -1
- data/lib/active_support/cache/moneta_store.rb +32 -6
- data/lib/moneta/adapters/activerecord/backend.rb +50 -0
- data/lib/moneta/adapters/activerecord/v5_backend.rb +80 -0
- data/lib/moneta/adapters/activerecord.rb +50 -95
- data/lib/moneta/adapters/activesupportcache.rb +69 -14
- data/lib/moneta/adapters/client.rb +1 -1
- data/lib/moneta/adapters/hbase.rb +1 -1
- data/lib/moneta/adapters/redis.rb +2 -1
- data/lib/moneta/adapters/sequel/mysql.rb +6 -18
- data/lib/moneta/adapters/sequel/postgres_hstore.rb +8 -1
- data/lib/moneta/adapters/sqlite.rb +4 -2
- data/lib/moneta/adapters/tokyotyrant.rb +1 -1
- data/lib/moneta/adapters/yaml.rb +7 -1
- data/lib/moneta/pool.rb +16 -18
- data/lib/moneta/server.rb +9 -11
- data/lib/moneta/transformer/config.rb +4 -4
- data/lib/moneta/transformer.rb +4 -0
- data/lib/moneta/version.rb +1 -1
- metadata +9 -452
- data/.github/workflows/ruby.yml +0 -425
- data/.gitignore +0 -15
- data/.rspec +0 -4
- data/.rubocop.yml +0 -194
- data/.yardopts +0 -6
- data/Gemfile +0 -206
- data/feature_matrix.yaml +0 -227
- data/moneta.gemspec +0 -36
- data/script/benchmarks +0 -605
- data/script/contributors +0 -12
- data/script/memusage +0 -40
- data/script/parallel-tests +0 -82
- data/script/start-couchdb +0 -27
- data/script/start-hbase +0 -47
- data/script/start-services +0 -10
- data/script/travis-logs +0 -14
- data/script/update-feature-matrix +0 -148
- data/spec/active_support/cache_moneta_store_spec.rb +0 -282
- data/spec/features/concurrent_create.rb +0 -42
- data/spec/features/concurrent_increment.rb +0 -39
- data/spec/features/create.rb +0 -25
- data/spec/features/create_expires.rb +0 -19
- data/spec/features/default_expires.rb +0 -14
- data/spec/features/each_key.rb +0 -119
- data/spec/features/expires.rb +0 -296
- data/spec/features/features.rb +0 -16
- data/spec/features/increment.rb +0 -98
- data/spec/features/marshallable_key.rb +0 -43
- data/spec/features/marshallable_value.rb +0 -7
- data/spec/features/multiprocess.rb +0 -8
- data/spec/features/not_create.rb +0 -7
- data/spec/features/not_each_key.rb +0 -7
- data/spec/features/not_increment.rb +0 -13
- data/spec/features/not_persist.rb +0 -9
- data/spec/features/null.rb +0 -66
- data/spec/features/persist.rb +0 -14
- data/spec/features/returndifferent.rb +0 -9
- data/spec/features/returnsame.rb +0 -9
- data/spec/features/store.rb +0 -261
- data/spec/features/store_large.rb +0 -13
- data/spec/features/transform_value.rb +0 -44
- data/spec/features/transform_value_expires.rb +0 -41
- data/spec/helper.rb +0 -445
- data/spec/moneta/adapters/activerecord/adapter_activerecord_existing_connection_spec.rb +0 -62
- data/spec/moneta/adapters/activerecord/adapter_activerecord_spec.rb +0 -128
- data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +0 -22
- data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +0 -28
- data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +0 -54
- data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +0 -54
- data/spec/moneta/adapters/activesupportcache/standard_activesupportcache_spec.rb +0 -14
- data/spec/moneta/adapters/cassandra/adapter_cassandra_spec.rb +0 -17
- data/spec/moneta/adapters/cassandra/adapter_cassandra_with_default_expires_spec.rb +0 -18
- data/spec/moneta/adapters/cassandra/helper.rb +0 -18
- data/spec/moneta/adapters/cassandra/standard_cassandra_spec.rb +0 -18
- data/spec/moneta/adapters/client/adapter_client_spec.rb +0 -11
- data/spec/moneta/adapters/client/client_helper.rb +0 -25
- data/spec/moneta/adapters/client/standard_client_tcp_spec.rb +0 -23
- data/spec/moneta/adapters/client/standard_client_unix_spec.rb +0 -28
- data/spec/moneta/adapters/cookie/adapter_cookie_spec.rb +0 -7
- data/spec/moneta/adapters/couch/adapter_couch_spec.rb +0 -204
- data/spec/moneta/adapters/couch/standard_couch_spec.rb +0 -15
- data/spec/moneta/adapters/couch/standard_couch_with_expires_spec.rb +0 -19
- data/spec/moneta/adapters/datamapper/adapter_datamapper_spec.rb +0 -64
- data/spec/moneta/adapters/datamapper/standard_datamapper_spec.rb +0 -21
- data/spec/moneta/adapters/datamapper/standard_datamapper_with_expires_spec.rb +0 -26
- data/spec/moneta/adapters/datamapper/standard_datamapper_with_repository_spec.rb +0 -22
- data/spec/moneta/adapters/daybreak/adapter_daybreak_spec.rb +0 -7
- data/spec/moneta/adapters/daybreak/standard_daybreak_spec.rb +0 -7
- data/spec/moneta/adapters/daybreak/standard_daybreak_with_expires_spec.rb +0 -11
- data/spec/moneta/adapters/dbm/adapter_dbm_spec.rb +0 -7
- data/spec/moneta/adapters/dbm/standard_dbm_spec.rb +0 -7
- data/spec/moneta/adapters/dbm/standard_dbm_with_expires_spec.rb +0 -12
- data/spec/moneta/adapters/faraday_helper.rb +0 -10
- data/spec/moneta/adapters/file/adapter_file_spec.rb +0 -7
- data/spec/moneta/adapters/file/standard_file_spec.rb +0 -7
- data/spec/moneta/adapters/file/standard_file_with_expires_spec.rb +0 -11
- data/spec/moneta/adapters/fog/adapter_fog_spec.rb +0 -16
- data/spec/moneta/adapters/fog/standard_fog_spec.rb +0 -15
- data/spec/moneta/adapters/fog/standard_fog_with_expires_spec.rb +0 -20
- data/spec/moneta/adapters/gdbm/adapter_gdbm_spec.rb +0 -7
- data/spec/moneta/adapters/gdbm/standard_gdbm_spec.rb +0 -7
- data/spec/moneta/adapters/gdbm/standard_gdbm_with_expires_spec.rb +0 -11
- data/spec/moneta/adapters/hashfile/standard_hashfile_spec.rb +0 -7
- data/spec/moneta/adapters/hashfile/standard_hashfile_with_expires_spec.rb +0 -12
- data/spec/moneta/adapters/hbase/adapter_hbase_spec.rb +0 -7
- data/spec/moneta/adapters/hbase/standard_hbase_spec.rb +0 -4
- data/spec/moneta/adapters/hbase/standard_hbase_with_expires_spec.rb +0 -8
- data/spec/moneta/adapters/kyotocabinet/adapter_kyotocabinet_spec.rb +0 -7
- data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_spec.rb +0 -7
- data/spec/moneta/adapters/kyotocabinet/standard_kyotocabinet_with_expires_spec.rb +0 -14
- data/spec/moneta/adapters/leveldb/adapter_leveldb_spec.rb +0 -7
- data/spec/moneta/adapters/leveldb/standard_leveldb_spec.rb +0 -7
- data/spec/moneta/adapters/leveldb/standard_leveldb_with_expires_spec.rb +0 -11
- data/spec/moneta/adapters/lmdb/adapter_lmdb_spec.rb +0 -7
- data/spec/moneta/adapters/lmdb/adapter_lmdb_with_db_spec.rb +0 -7
- data/spec/moneta/adapters/lmdb/standard_lmdb_spec.rb +0 -7
- data/spec/moneta/adapters/lmdb/standard_lmdb_with_expires_spec.rb +0 -11
- data/spec/moneta/adapters/localmemcache/adapter_localmemcache_spec.rb +0 -7
- data/spec/moneta/adapters/localmemcache/standard_localmemcache_spec.rb +0 -7
- data/spec/moneta/adapters/localmemcache/standard_localmemcache_with_expires_spec.rb +0 -11
- data/spec/moneta/adapters/lruhash/adapter_lruhash_spec.rb +0 -118
- data/spec/moneta/adapters/lruhash/standard_lruhash_spec.rb +0 -4
- data/spec/moneta/adapters/lruhash/standard_lruhash_with_expires_spec.rb +0 -8
- data/spec/moneta/adapters/memcached/adapter_memcached_spec.rb +0 -13
- data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_spec.rb +0 -25
- data/spec/moneta/adapters/memcached/dalli/standard_memcached_dalli_spec.rb +0 -11
- data/spec/moneta/adapters/memcached/native/adapter_memcached_native_spec.rb +0 -25
- data/spec/moneta/adapters/memcached/native/standard_memcached_native_spec.rb +0 -11
- data/spec/moneta/adapters/memcached/standard_memcached_spec.rb +0 -17
- data/spec/moneta/adapters/memcached_helper.rb +0 -20
- data/spec/moneta/adapters/memory/adapter_memory_spec.rb +0 -7
- data/spec/moneta/adapters/memory/standard_memory_spec.rb +0 -4
- data/spec/moneta/adapters/memory/standard_memory_with_compress_spec.rb +0 -9
- data/spec/moneta/adapters/memory/standard_memory_with_expires_spec.rb +0 -8
- data/spec/moneta/adapters/memory/standard_memory_with_json_key_serializer_spec.rb +0 -4
- data/spec/moneta/adapters/memory/standard_memory_with_json_serializer_spec.rb +0 -9
- data/spec/moneta/adapters/memory/standard_memory_with_json_value_serializer_spec.rb +0 -9
- data/spec/moneta/adapters/memory/standard_memory_with_prefix_spec.rb +0 -41
- data/spec/moneta/adapters/memory/standard_memory_with_snappy_compress_spec.rb +0 -9
- data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +0 -41
- data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +0 -14
- data/spec/moneta/adapters/mongo/standard_mongo_spec.rb +0 -7
- data/spec/moneta/adapters/null/null_adapter_spec.rb +0 -7
- data/spec/moneta/adapters/null/standard_null_spec.rb +0 -9
- data/spec/moneta/adapters/pstore/adapter_pstore_spec.rb +0 -7
- data/spec/moneta/adapters/pstore/standard_pstore_spec.rb +0 -9
- data/spec/moneta/adapters/pstore/standard_pstore_with_expires_spec.rb +0 -13
- data/spec/moneta/adapters/redis/adapter_redis_spec.rb +0 -20
- data/spec/moneta/adapters/redis/standard_redis_spec.rb +0 -14
- data/spec/moneta/adapters/restclient/adapter_restclient_spec.rb +0 -13
- data/spec/moneta/adapters/restclient/helper.rb +0 -12
- data/spec/moneta/adapters/restclient/standard_restclient_spec.rb +0 -13
- data/spec/moneta/adapters/riak/adapter_riak_spec.rb +0 -14
- data/spec/moneta/adapters/riak/standard_riak_spec.rb +0 -10
- data/spec/moneta/adapters/riak/standard_riak_with_expires_spec.rb +0 -14
- data/spec/moneta/adapters/sdbm/adapter_sdbm_spec.rb +0 -7
- data/spec/moneta/adapters/sdbm/standard_sdbm_spec.rb +0 -7
- data/spec/moneta/adapters/sdbm/standard_sdbm_with_expires_spec.rb +0 -11
- data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +0 -133
- data/spec/moneta/adapters/sequel/helper.rb +0 -83
- data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +0 -8
- data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +0 -18
- data/spec/moneta/adapters/sqlite/adapter_sqlite_spec.rb +0 -7
- data/spec/moneta/adapters/sqlite/standard_sqlite_spec.rb +0 -7
- data/spec/moneta/adapters/sqlite/standard_sqlite_with_expires_spec.rb +0 -15
- data/spec/moneta/adapters/tdb/adapter_tdb_spec.rb +0 -7
- data/spec/moneta/adapters/tdb/standard_tdb_spec.rb +0 -7
- data/spec/moneta/adapters/tdb/standard_tdb_with_expires_spec.rb +0 -11
- data/spec/moneta/adapters/tokyocabinet/adapter_tokyocabinet_bdb_spec.rb +0 -7
- data/spec/moneta/adapters/tokyocabinet/adapter_tokyocabinet_hdb_spec.rb +0 -7
- data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_spec.rb +0 -7
- data/spec/moneta/adapters/tokyocabinet/standard_tokyocabinet_with_expires_spec.rb +0 -11
- data/spec/moneta/adapters/tokyotyrant/adapter_tokyotyrant_spec.rb +0 -11
- data/spec/moneta/adapters/tokyotyrant/helper.rb +0 -12
- data/spec/moneta/adapters/tokyotyrant/standard_tokyotyrant_spec.rb +0 -7
- data/spec/moneta/adapters/tokyotyrant/standard_tokyotyrant_with_expires_spec.rb +0 -12
- data/spec/moneta/adapters/yaml/adapter_yaml_spec.rb +0 -7
- data/spec/moneta/adapters/yaml/standard_yaml_spec.rb +0 -9
- data/spec/moneta/adapters/yaml/standard_yaml_with_expires_spec.rb +0 -13
- data/spec/moneta/builder_spec.rb +0 -50
- data/spec/moneta/config_spec.rb +0 -219
- data/spec/moneta/mutex_spec.rb +0 -55
- data/spec/moneta/proxies/cache/cache_file_memory_spec.rb +0 -24
- data/spec/moneta/proxies/cache/cache_memory_null_spec.rb +0 -12
- data/spec/moneta/proxies/enumerable/enumerable_spec.rb +0 -26
- data/spec/moneta/proxies/expires/expires_file_spec.rb +0 -28
- data/spec/moneta/proxies/expires/expires_memory_spec.rb +0 -15
- data/spec/moneta/proxies/expires/expires_memory_with_default_expires_spec.rb +0 -16
- data/spec/moneta/proxies/fallback/fallback_spec.rb +0 -42
- data/spec/moneta/proxies/lock/lock_spec.rb +0 -10
- data/spec/moneta/proxies/optionmerger/optionmerger_spec.rb +0 -96
- data/spec/moneta/proxies/pool/pool_spec.rb +0 -353
- data/spec/moneta/proxies/proxy/proxy_expires_memory_spec.rb +0 -16
- data/spec/moneta/proxies/shared/shared_tcp_spec.rb +0 -59
- data/spec/moneta/proxies/shared/shared_unix_spec.rb +0 -58
- data/spec/moneta/proxies/transformer/transformer_bencode_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_bert_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_bson_spec.rb +0 -25
- data/spec/moneta/proxies/transformer/transformer_bzip2_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_json_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_key_inspect_spec.rb +0 -17
- data/spec/moneta/proxies/transformer/transformer_key_marshal_spec.rb +0 -17
- data/spec/moneta/proxies/transformer/transformer_key_to_s_spec.rb +0 -17
- data/spec/moneta/proxies/transformer/transformer_key_yaml_spec.rb +0 -17
- data/spec/moneta/proxies/transformer/transformer_lz4_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_lzma_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_lzo_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_marshal_base64_spec.rb +0 -20
- data/spec/moneta/proxies/transformer/transformer_marshal_city128_spec.rb +0 -15
- data/spec/moneta/proxies/transformer/transformer_marshal_city32_spec.rb +0 -15
- data/spec/moneta/proxies/transformer/transformer_marshal_city64_spec.rb +0 -15
- data/spec/moneta/proxies/transformer/transformer_marshal_escape_spec.rb +0 -21
- data/spec/moneta/proxies/transformer/transformer_marshal_hex_spec.rb +0 -20
- data/spec/moneta/proxies/transformer/transformer_marshal_hmac_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_marshal_md5_spec.rb +0 -15
- data/spec/moneta/proxies/transformer/transformer_marshal_md5_spread_spec.rb +0 -15
- data/spec/moneta/proxies/transformer/transformer_marshal_prefix_base64_spec.rb +0 -33
- data/spec/moneta/proxies/transformer/transformer_marshal_prefix_spec.rb +0 -15
- data/spec/moneta/proxies/transformer/transformer_marshal_qp_spec.rb +0 -20
- data/spec/moneta/proxies/transformer/transformer_marshal_rmd160_spec.rb +0 -15
- data/spec/moneta/proxies/transformer/transformer_marshal_sha1_spec.rb +0 -15
- data/spec/moneta/proxies/transformer/transformer_marshal_sha256_spec.rb +0 -15
- data/spec/moneta/proxies/transformer/transformer_marshal_sha384_spec.rb +0 -15
- data/spec/moneta/proxies/transformer/transformer_marshal_sha512_spec.rb +0 -15
- data/spec/moneta/proxies/transformer/transformer_marshal_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_marshal_truncate_spec.rb +0 -15
- data/spec/moneta/proxies/transformer/transformer_marshal_urlsafe_base64_spec.rb +0 -20
- data/spec/moneta/proxies/transformer/transformer_marshal_uuencode_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_msgpack_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_ox_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_php_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_quicklz_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_snappy_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_tnet_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_value_marshal_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_value_yaml_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_yaml_spec.rb +0 -19
- data/spec/moneta/proxies/transformer/transformer_zlib_spec.rb +0 -19
- data/spec/moneta/proxies/weak_create/weak_create_spec.rb +0 -21
- data/spec/moneta/proxies/weak_each_key/weak_each_key_spec.rb +0 -22
- data/spec/moneta/proxies/weak_increment/weak_increment_spec.rb +0 -21
- data/spec/moneta/semaphore_spec.rb +0 -68
- data/spec/moneta/stack_file_memory_spec.rb +0 -15
- data/spec/moneta/stack_memory_file_spec.rb +0 -13
- data/spec/rack/cache_moneta_spec.rb +0 -355
- data/spec/rack/moneta_cookies_spec.rb +0 -83
- data/spec/rack/moneta_store_spec.rb +0 -83
- data/spec/rack/session_moneta_spec.rb +0 -350
- data/spec/restserver.rb +0 -44
- data/test/action_dispatch/fixtures/session_autoload_test/foo.rb +0 -10
- data/test/action_dispatch/session_moneta_store_test.rb +0 -204
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4b7e4bbe0345dcfa33a7217af5a4bbcef559b3d9cb0d8a53301a7c9ff30a7118
|
|
4
|
+
data.tar.gz: 7d3fe5f86885f39a418e8647f15243cb3728fad2daf12fd841b237c23d796fd4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 667443d645a8b75775bc43633e58eab9434e5c291043e2f4165a971391c67f5fdd5dffdda76f76924de56b28d2bd1f14c25eef0d16c032859aa91e67a22d123c
|
|
7
|
+
data.tar.gz: cf76836caa72d5fa5a2179b8937e06a24571f42eb7e26ba6ad4b606fbd70305817dbf6d33ae75a181d91e4f76b267db15b7fbb26e4471d148826a00ab8f9f6b6
|
data/CHANGES
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
1.6.0
|
|
2
|
+
|
|
3
|
+
* Adapters - Support for Rails 6.1 and above (Adapters::ActiveRecord,
|
|
4
|
+
Adapters::ActiveSupportCache, ActiveSupportCache::MonetaStore)
|
|
5
|
+
* Adapters::YAML - add `theadsafe` option
|
|
6
|
+
* Adapters::Sequel - fix deadlock issue with #increment on MySQL in newer
|
|
7
|
+
Sequel versions (#244)
|
|
8
|
+
* Adapters::Sequel - fix issue with Postgres HStore on newer Postgres (#243)
|
|
9
|
+
* Adapters - fixed an issue many adapters had where #merge! errored if passed
|
|
10
|
+
an empty hash (#246)
|
|
11
|
+
* Support changes - Drop support for 2.3 and 2.4, add support for 3.x
|
|
12
|
+
|
|
1
13
|
1.5.2
|
|
2
14
|
|
|
3
15
|
* Proxy - handle returning config when the adapter does not use config
|
data/CONTRIBUTORS
CHANGED
|
@@ -22,6 +22,7 @@ Jay Mitchell <jaybmitchell@gmail.com>
|
|
|
22
22
|
Jeremy Voorhis <jvoorhis@gmail.com>
|
|
23
23
|
Jon Crosby <jon@joncrosby.me>
|
|
24
24
|
Jonathan Gnagy <jonathan.l.gnagy@sherwin.com>
|
|
25
|
+
Jérôme Charaoui <jerome@riseup.net>
|
|
25
26
|
lakshan <lakshan@web2media.net>
|
|
26
27
|
Mal McKay <mal.mckay@gmail.com>
|
|
27
28
|
Marek Skrobacki <skrobul@skrobul.com>
|
data/LICENSE
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Copyright (c) 2009 -
|
|
1
|
+
Copyright (c) 2009 - 2023 Daniel Mendler, Yehuda Katz, Alastair Pharo
|
|
2
2
|
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
4
|
a copy of this software and associated documentation files (the
|
|
@@ -101,37 +101,38 @@ module ActiveSupport
|
|
|
101
101
|
end
|
|
102
102
|
end
|
|
103
103
|
|
|
104
|
-
def read_entry(key, options)
|
|
104
|
+
def read_entry(key, **options)
|
|
105
105
|
make_entry(@store.load(key, moneta_options(options, false)))
|
|
106
106
|
end
|
|
107
107
|
|
|
108
|
-
def write_entry(key, entry, options)
|
|
108
|
+
def write_entry(key, entry, **options)
|
|
109
109
|
value = options[:raw] ? entry.value.to_s : entry
|
|
110
110
|
@store.store(key, value, moneta_options(options))
|
|
111
111
|
true
|
|
112
112
|
end
|
|
113
113
|
|
|
114
|
-
def delete_entry(key, options)
|
|
114
|
+
def delete_entry(key, **options)
|
|
115
115
|
@store.delete(key, moneta_options(options))
|
|
116
116
|
true
|
|
117
117
|
end
|
|
118
118
|
|
|
119
|
-
def read_multi_entries(names, options)
|
|
119
|
+
def read_multi_entries(names, **options)
|
|
120
120
|
keys = names.map { |name| normalize_key(name, options) }
|
|
121
121
|
entries = @store
|
|
122
122
|
.values_at(*keys, **moneta_options(options, false))
|
|
123
123
|
.map(&method(:make_entry))
|
|
124
124
|
|
|
125
|
+
delete_options = moneta_options(options)
|
|
125
126
|
names.zip(keys, entries).map do |name, key, entry|
|
|
126
127
|
next if entry == nil
|
|
127
|
-
|
|
128
|
+
@store.delete(key, delete_options) if entry.expired?
|
|
128
129
|
next if entry.expired? || entry.mismatched?(normalize_version(name, options))
|
|
129
130
|
|
|
130
131
|
[name, entry.value]
|
|
131
132
|
end.compact.to_h
|
|
132
133
|
end
|
|
133
134
|
|
|
134
|
-
def write_multi_entries(hash, options)
|
|
135
|
+
def write_multi_entries(hash, **options)
|
|
135
136
|
pairs = if options[:raw]
|
|
136
137
|
hash.transform_values { |entry| entry.value.to_s }
|
|
137
138
|
else
|
|
@@ -142,6 +143,31 @@ module ActiveSupport
|
|
|
142
143
|
hash
|
|
143
144
|
end
|
|
144
145
|
|
|
146
|
+
# Before Rails 6.1, the `*_entry` methods didn't use keyword args
|
|
147
|
+
module Rails5Support
|
|
148
|
+
def read_entry(key, options)
|
|
149
|
+
super(key, **options)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def write_entry(key, entry, options)
|
|
153
|
+
super(key, entry, **options)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def delete_entry(key, options)
|
|
157
|
+
super(key, **options)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def read_multi_entries(names, options)
|
|
161
|
+
super(names, **options)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def write_multi_entries(hash, options)
|
|
165
|
+
super(hash, **options)
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
prepend Rails5Support if ActiveSupport.version < ::Gem::Version.new('6.1.0')
|
|
170
|
+
|
|
145
171
|
private
|
|
146
172
|
|
|
147
173
|
def moneta_options(options, include_expires = true)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'uri'
|
|
2
|
+
|
|
3
|
+
module Moneta
|
|
4
|
+
module Adapters
|
|
5
|
+
class ActiveRecord
|
|
6
|
+
# @api private
|
|
7
|
+
class Backend
|
|
8
|
+
@connection_lock = ::Mutex.new
|
|
9
|
+
|
|
10
|
+
class << self
|
|
11
|
+
attr_reader :connection_lock
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
attr_reader :table_name
|
|
15
|
+
delegate :connection_handler, to: ::ActiveRecord::Base
|
|
16
|
+
|
|
17
|
+
def initialize(table:, connection: nil, **options)
|
|
18
|
+
@table_name = table
|
|
19
|
+
@connection = connection
|
|
20
|
+
if connection
|
|
21
|
+
@owner_name =
|
|
22
|
+
case connection
|
|
23
|
+
when Symbol, String
|
|
24
|
+
connection.to_s
|
|
25
|
+
when Hash
|
|
26
|
+
hash = connection.reject { |key| [:username, 'username', :password, 'password'].member?(key) }
|
|
27
|
+
'moneta?' + URI.encode_www_form(hash.to_a.sort)
|
|
28
|
+
when nil
|
|
29
|
+
nil
|
|
30
|
+
else
|
|
31
|
+
raise "Unexpected connection: #{connection}"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def connection_pool
|
|
37
|
+
if @connection
|
|
38
|
+
connection_handler.retrieve_connection_pool(@owner_name) ||
|
|
39
|
+
self.class.connection_lock.synchronize do
|
|
40
|
+
connection_handler.retrieve_connection_pool(@owner_name) ||
|
|
41
|
+
connection_handler.establish_connection(@connection, owner_name: @owner_name)
|
|
42
|
+
end
|
|
43
|
+
else
|
|
44
|
+
::ActiveRecord::Base.connection_pool
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
require 'uri'
|
|
2
|
+
|
|
3
|
+
module Moneta
|
|
4
|
+
module Adapters
|
|
5
|
+
class ActiveRecord
|
|
6
|
+
# @api private
|
|
7
|
+
class V5Backend
|
|
8
|
+
@connection_lock = ::Mutex.new
|
|
9
|
+
|
|
10
|
+
class << self
|
|
11
|
+
attr_reader :connection_lock
|
|
12
|
+
delegate :configurations, :configurations=, :connection_handler, to: ::ActiveRecord::Base
|
|
13
|
+
|
|
14
|
+
def retrieve_connection_pool(spec_name)
|
|
15
|
+
connection_handler.retrieve_connection_pool(spec_name.to_s)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def establish_connection(spec_name)
|
|
19
|
+
connection_lock.synchronize do
|
|
20
|
+
if connection_pool = retrieve_connection_pool(spec_name)
|
|
21
|
+
connection_pool
|
|
22
|
+
else
|
|
23
|
+
connection_handler.establish_connection(spec_name.to_sym)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def retrieve_or_establish_connection_pool(spec_name)
|
|
29
|
+
retrieve_connection_pool(spec_name) || establish_connection(spec_name)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
attr_reader :table_name
|
|
34
|
+
|
|
35
|
+
def initialize(table:, connection: nil, **options)
|
|
36
|
+
@table_name = table
|
|
37
|
+
@spec =
|
|
38
|
+
case connection
|
|
39
|
+
when Symbol
|
|
40
|
+
connection
|
|
41
|
+
when Hash, String
|
|
42
|
+
# Normalize the connection specification to a hash
|
|
43
|
+
resolver = ::ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver.new \
|
|
44
|
+
'dummy' => connection
|
|
45
|
+
|
|
46
|
+
# Turn the config into a standardised hash, sans a couple of bits
|
|
47
|
+
hash = resolver.resolve(:dummy)
|
|
48
|
+
hash.delete('name')
|
|
49
|
+
hash.delete(:username) # For security
|
|
50
|
+
hash.delete(:password) # For security
|
|
51
|
+
# Make a name unique to this config
|
|
52
|
+
name = 'moneta?' + URI.encode_www_form(hash.to_a.sort)
|
|
53
|
+
# Add into configurations unless its already there (initially done without locking for
|
|
54
|
+
# speed)
|
|
55
|
+
unless self.class.configurations.key? name
|
|
56
|
+
self.class.connection_lock.synchronize do
|
|
57
|
+
self.class.configurations[name] = connection \
|
|
58
|
+
unless self.class.configurations.key? name
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
name.to_sym
|
|
63
|
+
when nil
|
|
64
|
+
nil
|
|
65
|
+
else
|
|
66
|
+
raise "Unexpected connection: #{connection}"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def connection_pool
|
|
71
|
+
if @spec
|
|
72
|
+
self.class.retrieve_or_establish_connection_pool(@spec)
|
|
73
|
+
else
|
|
74
|
+
::ActiveRecord::Base.connection_pool
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -1,59 +1,49 @@
|
|
|
1
1
|
require 'active_record'
|
|
2
|
-
require 'uri'
|
|
3
2
|
|
|
4
3
|
module Moneta
|
|
5
4
|
module Adapters
|
|
6
5
|
# ActiveRecord as key/value stores
|
|
7
6
|
# @api public
|
|
8
7
|
class ActiveRecord < Adapter
|
|
9
|
-
|
|
8
|
+
autoload :V5Backend, 'moneta/adapters/activerecord/v5_backend'
|
|
9
|
+
autoload :Backend, 'moneta/adapters/activerecord/backend'
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
delegate :with_connection, to: :connection_pool
|
|
11
|
+
@table_create_lock = ::Mutex.new
|
|
13
12
|
|
|
14
|
-
@connection_lock = ::Mutex.new
|
|
15
13
|
class << self
|
|
16
|
-
attr_reader :
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
def retrieve_connection_pool(spec_name)
|
|
20
|
-
connection_handler.retrieve_connection_pool(spec_name.to_s)
|
|
21
|
-
end
|
|
14
|
+
attr_reader :table_create_lock
|
|
15
|
+
end
|
|
22
16
|
|
|
23
|
-
|
|
24
|
-
connection_lock.synchronize do
|
|
25
|
-
if connection_pool = retrieve_connection_pool(spec_name)
|
|
26
|
-
connection_pool
|
|
27
|
-
else
|
|
28
|
-
connection_handler.establish_connection(spec_name.to_sym)
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
17
|
+
supports :create, :increment, :each_key
|
|
32
18
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
end
|
|
19
|
+
attr_reader :table
|
|
20
|
+
delegate :connection_pool, to: :@backend
|
|
21
|
+
delegate :with_connection, to: :connection_pool
|
|
37
22
|
|
|
38
23
|
config :key_column, default: :k
|
|
39
24
|
config :value_column, default: :v
|
|
40
25
|
|
|
41
|
-
backend
|
|
42
|
-
@spec = spec_for_connection(connection)
|
|
43
|
-
|
|
26
|
+
backend do |table: :moneta, create_table: true, **options|
|
|
44
27
|
# Ensure the table name is a symbol.
|
|
45
28
|
table_name = table.to_sym
|
|
46
29
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
30
|
+
backend =
|
|
31
|
+
if ::ActiveRecord.version < ::Gem::Version.new('6.0.0')
|
|
32
|
+
::Moneta::Adapters::ActiveRecord::V5Backend.new(table: table_name, **options)
|
|
33
|
+
else
|
|
34
|
+
::Moneta::Adapters::ActiveRecord::Backend.new(table: table_name, **options)
|
|
35
|
+
end
|
|
52
36
|
|
|
53
|
-
|
|
37
|
+
case create_table
|
|
38
|
+
when Proc
|
|
39
|
+
backend.connection_pool.with_connection(&create_table)
|
|
40
|
+
when true
|
|
41
|
+
backend.connection_pool.with_connection do |conn|
|
|
42
|
+
default_create_table(conn, table_name)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
54
45
|
|
|
55
|
-
|
|
56
|
-
nil
|
|
46
|
+
backend
|
|
57
47
|
end
|
|
58
48
|
|
|
59
49
|
# @param [Hash] options
|
|
@@ -67,12 +57,7 @@ module Moneta
|
|
|
67
57
|
# @option options [Symbol] :value_column (:v) The name of the column to use for values
|
|
68
58
|
def initialize(options = {})
|
|
69
59
|
super
|
|
70
|
-
|
|
71
|
-
# If a :backend was provided, use it to set the spec and table
|
|
72
|
-
if backend
|
|
73
|
-
@spec = backend.connection_pool.spec
|
|
74
|
-
@table = ::Arel::Table.new(backend.table_name)
|
|
75
|
-
end
|
|
60
|
+
@table = ::Arel::Table.new(backend.table_name)
|
|
76
61
|
end
|
|
77
62
|
|
|
78
63
|
# (see Proxy#key?)
|
|
@@ -127,19 +112,17 @@ module Moneta
|
|
|
127
112
|
# (see Proxy#increment)
|
|
128
113
|
def increment(key, amount = 1, options = {})
|
|
129
114
|
with_connection do |conn|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
value
|
|
142
|
-
end
|
|
115
|
+
conn_ins(conn, key, amount.to_s)
|
|
116
|
+
amount
|
|
117
|
+
rescue ::ActiveRecord::RecordNotUnique
|
|
118
|
+
conn.transaction do
|
|
119
|
+
sel = arel_sel_key(key).project(table[config.value_column]).lock
|
|
120
|
+
value = decode(conn, conn.select_value(sel))
|
|
121
|
+
value = (value ? Integer(value) : 0) + amount
|
|
122
|
+
# Re-raise if the upate affects no rows (i.e. row deleted after attempted insert,
|
|
123
|
+
# before select for update)
|
|
124
|
+
raise unless conn_upd(conn, key, value.to_s) == 1
|
|
125
|
+
value
|
|
143
126
|
end
|
|
144
127
|
end
|
|
145
128
|
rescue ::ActiveRecord::RecordNotUnique, ::ActiveRecord::Deadlocked
|
|
@@ -170,7 +153,7 @@ module Moneta
|
|
|
170
153
|
# (see Proxy#close)
|
|
171
154
|
def close
|
|
172
155
|
@table = nil
|
|
173
|
-
@
|
|
156
|
+
@connection_pool = nil
|
|
174
157
|
end
|
|
175
158
|
|
|
176
159
|
# (see Proxy#slice)
|
|
@@ -248,16 +231,13 @@ module Moneta
|
|
|
248
231
|
|
|
249
232
|
private
|
|
250
233
|
|
|
251
|
-
def
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
def default_create_table(table_name)
|
|
256
|
-
with_connection do |conn|
|
|
234
|
+
def default_create_table(conn, table_name)
|
|
235
|
+
# From 6.1, we can use the `if_not_exists?` check
|
|
236
|
+
if ::ActiveRecord.version < ::Gem::Version.new('6.1.0')
|
|
257
237
|
return if conn.table_exists?(table_name)
|
|
258
238
|
|
|
259
239
|
# Prevent multiple connections from attempting to create the table simultaneously.
|
|
260
|
-
self.class.
|
|
240
|
+
self.class.table_create_lock.synchronize do
|
|
261
241
|
conn.create_table(table_name, id: false) do |t|
|
|
262
242
|
# Do not use binary key (Issue #17)
|
|
263
243
|
t.string config.key_column, null: false
|
|
@@ -265,6 +245,13 @@ module Moneta
|
|
|
265
245
|
end
|
|
266
246
|
conn.add_index(table_name, config.key_column, unique: true)
|
|
267
247
|
end
|
|
248
|
+
else
|
|
249
|
+
conn.create_table(table_name, id: false, if_not_exists: true) do |t|
|
|
250
|
+
# Do not use binary key (Issue #17)
|
|
251
|
+
t.string config.key_column, null: false
|
|
252
|
+
t.binary config.value_column
|
|
253
|
+
end
|
|
254
|
+
conn.add_index(table_name, config.key_column, unique: true, if_not_exists: true)
|
|
268
255
|
end
|
|
269
256
|
end
|
|
270
257
|
|
|
@@ -305,7 +292,7 @@ module Moneta
|
|
|
305
292
|
conn.escape_bytea(value)
|
|
306
293
|
elsif defined?(::ActiveRecord::ConnectionAdapters::SQLite3Adapter) &&
|
|
307
294
|
conn.is_a?(::ActiveRecord::ConnectionAdapters::SQLite3Adapter)
|
|
308
|
-
Arel::Nodes::SqlLiteral.new("X'#{value.
|
|
295
|
+
Arel::Nodes::SqlLiteral.new("X'#{value.unpack1('H*')}'")
|
|
309
296
|
else
|
|
310
297
|
value
|
|
311
298
|
end
|
|
@@ -323,38 +310,6 @@ module Moneta
|
|
|
323
310
|
value
|
|
324
311
|
end
|
|
325
312
|
end
|
|
326
|
-
|
|
327
|
-
# Feed the connection info into ActiveRecord and get back a name to use
|
|
328
|
-
# for getting the connection pool
|
|
329
|
-
def spec_for_connection(connection)
|
|
330
|
-
case connection
|
|
331
|
-
when Symbol
|
|
332
|
-
connection
|
|
333
|
-
when Hash, String
|
|
334
|
-
# Normalize the connection specification to a hash
|
|
335
|
-
resolver = ::ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver.new \
|
|
336
|
-
'dummy' => connection
|
|
337
|
-
|
|
338
|
-
# Turn the config into a standardised hash, sans a couple of bits
|
|
339
|
-
hash = resolver.resolve(:dummy)
|
|
340
|
-
hash.delete('name')
|
|
341
|
-
hash.delete(:password) # For security
|
|
342
|
-
# Make a name unique to this config
|
|
343
|
-
name = 'moneta?' + URI.encode_www_form(hash.to_a.sort)
|
|
344
|
-
# Add into configurations unless its already there (initially done without locking for
|
|
345
|
-
# speed)
|
|
346
|
-
unless self.class.configurations.key? name
|
|
347
|
-
self.class.connection_lock.synchronize do
|
|
348
|
-
self.class.configurations[name] = connection \
|
|
349
|
-
unless self.class.configurations.key? name
|
|
350
|
-
end
|
|
351
|
-
end
|
|
352
|
-
|
|
353
|
-
name.to_sym
|
|
354
|
-
else
|
|
355
|
-
::ActiveRecord::Base.connection_pool.spec.name.to_s
|
|
356
|
-
end
|
|
357
|
-
end
|
|
358
313
|
end
|
|
359
314
|
end
|
|
360
315
|
end
|
|
@@ -15,20 +15,29 @@ module Moneta
|
|
|
15
15
|
|
|
16
16
|
# (see Proxy#key?)
|
|
17
17
|
def key?(key, options = {})
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
exists =
|
|
19
|
+
begin
|
|
20
|
+
backend_exist?(key)
|
|
21
|
+
rescue ArgumentError, TypeError
|
|
22
|
+
# these errors happen when certain adapters try to deserialize
|
|
23
|
+
# values, which means there's something present
|
|
24
|
+
true
|
|
22
25
|
end
|
|
26
|
+
|
|
27
|
+
if exists && (expires = expires_value(options, nil)) != nil
|
|
28
|
+
value = backend_read(key, **options)
|
|
29
|
+
backend_write(key, value, expires_in: expires ? expires.seconds : nil, **options)
|
|
23
30
|
end
|
|
31
|
+
|
|
32
|
+
exists
|
|
24
33
|
end
|
|
25
34
|
|
|
26
35
|
# (see Proxy#load)
|
|
27
36
|
def load(key, options = {})
|
|
28
37
|
expires = expires_value(options, nil)
|
|
29
|
-
value =
|
|
38
|
+
value = backend_read(key, **options)
|
|
30
39
|
if value and expires != nil
|
|
31
|
-
|
|
40
|
+
backend_write(key, value, expires_in: expires ? expires.seconds : nil, **options)
|
|
32
41
|
end
|
|
33
42
|
value
|
|
34
43
|
end
|
|
@@ -36,7 +45,7 @@ module Moneta
|
|
|
36
45
|
# (see Proxy#store)
|
|
37
46
|
def store(key, value, options = {})
|
|
38
47
|
expires = expires_value(options)
|
|
39
|
-
|
|
48
|
+
backend_write(key, value, expires_in: expires ? expires.seconds : nil, **options)
|
|
40
49
|
value
|
|
41
50
|
end
|
|
42
51
|
|
|
@@ -44,11 +53,11 @@ module Moneta
|
|
|
44
53
|
def increment(key, amount = 1, options = {})
|
|
45
54
|
expires = expires_value(options)
|
|
46
55
|
options.delete(:raw)
|
|
47
|
-
existing = Integer(
|
|
56
|
+
existing = Integer(backend_fetch(key, raw: true, **options) { 0 })
|
|
48
57
|
if amount > 0
|
|
49
|
-
|
|
58
|
+
backend_increment(key, amount, expires_in: expires ? expires.seconds : nil, **options)
|
|
50
59
|
elsif amount < 0
|
|
51
|
-
|
|
60
|
+
backend_decrement(key, -amount, expires_in: expires ? expires.seconds : nil, **options)
|
|
52
61
|
else
|
|
53
62
|
existing
|
|
54
63
|
end
|
|
@@ -56,9 +65,9 @@ module Moneta
|
|
|
56
65
|
|
|
57
66
|
# (see Proxy#delete)
|
|
58
67
|
def delete(key, options = {})
|
|
59
|
-
value =
|
|
68
|
+
value = backend_read(key, options)
|
|
60
69
|
if value != nil
|
|
61
|
-
|
|
70
|
+
backend_delete(key, **options)
|
|
62
71
|
options[:raw] ? value.to_s : value
|
|
63
72
|
end
|
|
64
73
|
end
|
|
@@ -74,7 +83,7 @@ module Moneta
|
|
|
74
83
|
hash = backend.read_multi(*keys)
|
|
75
84
|
if (expires = expires_value(options, nil)) != nil
|
|
76
85
|
hash.each do |key, value|
|
|
77
|
-
|
|
86
|
+
backend_write(key, value, expires_in: expires ? expires.seconds : nil, **options)
|
|
78
87
|
end
|
|
79
88
|
end
|
|
80
89
|
if options[:raw]
|
|
@@ -106,7 +115,7 @@ module Moneta
|
|
|
106
115
|
|
|
107
116
|
hash = Hash === pairs ? pairs : Hash[pairs.to_a]
|
|
108
117
|
expires = expires_value(options)
|
|
109
|
-
|
|
118
|
+
backend_write_multi(hash, expires_in: expires ? expires.seconds : nil, **options)
|
|
110
119
|
self
|
|
111
120
|
end
|
|
112
121
|
|
|
@@ -115,6 +124,52 @@ module Moneta
|
|
|
115
124
|
def expires_value(options, default = config.expires)
|
|
116
125
|
super.tap { options.delete(:expires) unless options.frozen? }
|
|
117
126
|
end
|
|
127
|
+
|
|
128
|
+
delegate :decrement, :delete, :exist?, :fetch, :increment, :read, :write, :write_multi,
|
|
129
|
+
to: :@backend,
|
|
130
|
+
prefix: :backend
|
|
131
|
+
private :backend_decrement, :backend_delete, :backend_exist?,
|
|
132
|
+
:backend_fetch, :backend_increment, :backend_read,
|
|
133
|
+
:backend_write, :backend_write_multi
|
|
134
|
+
|
|
135
|
+
# @api private
|
|
136
|
+
module Rails5Support
|
|
137
|
+
private
|
|
138
|
+
|
|
139
|
+
def backend_decrement(*args, **options)
|
|
140
|
+
super(*args, options)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def backend_delete(*args, **options)
|
|
144
|
+
super(*args, options)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def backend_exist?(*args, **options)
|
|
148
|
+
super(*args, options)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def backend_fetch(*args, **options)
|
|
152
|
+
super(*args, options)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def backend_increment(*args, **options)
|
|
156
|
+
super(*args, options)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def backend_read(*args, **options)
|
|
160
|
+
super(*args, options)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def backend_write(*args, **options)
|
|
164
|
+
super(*args, options)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def backend_write_multi(*args, **options)
|
|
168
|
+
super(*args, options)
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
prepend Rails5Support if ::ActiveSupport.version < ::Gem::Version.new('6.1.0')
|
|
118
173
|
end
|
|
119
174
|
end
|
|
120
175
|
end
|
|
@@ -106,7 +106,8 @@ module Moneta
|
|
|
106
106
|
|
|
107
107
|
# (see Defaults#merge!)
|
|
108
108
|
def merge!(pairs, options = {})
|
|
109
|
-
keys = pairs.map { |key, _| key }
|
|
109
|
+
keys = pairs.map { |key, _| key }.to_a
|
|
110
|
+
return self if keys.empty?
|
|
110
111
|
|
|
111
112
|
if block_given?
|
|
112
113
|
old_values = @backend.mget(*keys)
|