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
data/README.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# Moneta: A unified interface for key/value stores
|
2
2
|
|
3
|
-
[![Gem Version](https://badge.fury.io/rb/moneta.svg)](http://rubygems.org/gems/moneta)
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/moneta.svg)](http://rubygems.org/gems/moneta)
|
4
|
+
[![Build Status](https://secure.travis-ci.org/moneta-rb/moneta.svg?branch=master)](http://travis-ci.org/moneta-rb/moneta)
|
5
|
+
[![Code Climate](https://codeclimate.com/github/moneta-rb/moneta.svg)](https://codeclimate.com/github/moneta-rb/moneta)
|
6
|
+
[![Flattr this git repo](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=min4d&url=https://github.com/moneta-rb/moneta&title=Moneta&language=&tags=github&category=software)
|
4
7
|
|
5
8
|
Moneta provides a standard interface for interacting with various kinds of key/value stores. Moneta supports the well-known
|
6
9
|
NoSQL and document based stores.
|
@@ -75,6 +78,9 @@ store.close
|
|
75
78
|
* API documentation:
|
76
79
|
* Latest Gem: <http://rubydoc.info/gems/moneta/frames>
|
77
80
|
* GitHub master: <http://rubydoc.info/github/moneta-rb/moneta/master/frames>
|
81
|
+
* Changelog: <https://github.com/moneta-rb/moneta/blob/master/CHANGES>
|
82
|
+
|
83
|
+
In case you are wondering, Moneta uses [Semantic Versioning](https://semver.org/) since v1.0.0.
|
78
84
|
|
79
85
|
------
|
80
86
|
|
@@ -114,7 +120,7 @@ Out of the box, it supports the following backends. Use the backend name symbol
|
|
114
120
|
* [Simple Samba database TDB](http://tdb.samba.org/) (`:TDB`)
|
115
121
|
* Document databases:
|
116
122
|
* [CouchDB](http://couchdb.apache.org/) (`:Couch`)
|
117
|
-
* [MongoDB](http://www.mongodb.org/) (`:Mongo
|
123
|
+
* [MongoDB](http://www.mongodb.org/) (`:Mongo`)
|
118
124
|
* Moneta network protocols:
|
119
125
|
* Moneta key/value client (`:Client` works with `Moneta::Server`)
|
120
126
|
* Moneta HTTP/REST client (`:RestClient` works with `Rack::MonetaRest`)
|
@@ -136,11 +142,7 @@ __NOTE:__ <a name="backend-matrix"></a>The backend matrix is much more readable
|
|
136
142
|
|
137
143
|
<tr><th colspan="2">Persistent stores</th><th colspan="12"></th></tr>
|
138
144
|
|
139
|
-
<tr><td>Mongo</td><td>mongo
|
140
|
-
|
141
|
-
<tr><td>MongoOfficial</td><td>mongo</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://www.mongodb.org/">MongoDB</a> database</td></tr>
|
142
|
-
|
143
|
-
<tr><td>MongoMoped</td><td>moped</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://www.mongodb.org/">MongoDB</a> database</td></tr>
|
145
|
+
<tr><td>Mongo</td><td>mongo</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://www.mongodb.org/">MongoDB</a> database</td></tr>
|
144
146
|
|
145
147
|
<tr><td>Redis</td><td>redis</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://redis.io/">Redis</a> database</td></tr>
|
146
148
|
|
@@ -164,7 +166,7 @@ __NOTE:__ <a name="backend-matrix"></a>The backend matrix is much more readable
|
|
164
166
|
|
165
167
|
<tr><td>DBM</td><td>-</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://www.ruby-doc.org/stdlib/libdoc/dbm/rdoc/DBM.html">Berkeley DB using DBM interface or NDBM (Depends on Ruby environment)</a></td></tr>
|
166
168
|
|
167
|
-
<tr><td>GDBM</td><td
|
169
|
+
<tr><td>GDBM</td><td>ffi-gdbm on JRuby</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://www.ruby-doc.org/stdlib/libdoc/gdbm/rdoc/GDBM.html">GDBM</a> database</td></tr>
|
168
170
|
|
169
171
|
<tr><td>LevelDB</td><td>leveldb</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://code.google.com/p/leveldb/">LevelDB</a> database</td></tr>
|
170
172
|
|
@@ -208,7 +210,7 @@ __NOTE:__ <a name="backend-matrix"></a>The backend matrix is much more readable
|
|
208
210
|
|
209
211
|
<tr><th colspan="2">Network clients</th><th colspan="12"></th></tr>
|
210
212
|
|
211
|
-
<tr><td>Client</td><td>-</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#
|
213
|
+
<tr><td>Client</td><td>-</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td>Moneta client adapter</td></tr>
|
212
214
|
|
213
215
|
<tr><td>RestClient</td><td>-</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#55F">?<sup>13</sup></td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td>Moneta REST client adapter</td></tr>
|
214
216
|
|
@@ -235,17 +237,37 @@ __NOTE:__ <a name="backend-matrix"></a>The backend matrix is much more readable
|
|
235
237
|
In addition it supports proxies (Similar to [Rack middlewares](http://rack.github.com/)) which
|
236
238
|
add additional features to storage backends:
|
237
239
|
|
238
|
-
* `Moneta::Proxy` and `Moneta::Wrapper` proxy base classes
|
239
|
-
* `Moneta::
|
240
|
-
|
241
|
-
|
242
|
-
* `Moneta::
|
243
|
-
|
244
|
-
* `Moneta::
|
245
|
-
|
246
|
-
|
247
|
-
* `Moneta::
|
248
|
-
|
240
|
+
* `Moneta::Proxy` and `Moneta::Wrapper` are the proxy base classes.
|
241
|
+
* `Moneta::Cache` combine two stores, one as backend and one as cache (e.g.
|
242
|
+
`Moneta::Adapters::File` + `Moneta::Adapters::LRUHash`). Add it in the
|
243
|
+
builder using `use(:Cache) {}`.
|
244
|
+
* `Moneta::Expires` to add expiration support to stores which don't support it
|
245
|
+
natively. Add it in the builder using `use :Expires`.
|
246
|
+
* `Moneta::Fallback` use a store as a fallback when exceptions occur (by default the
|
247
|
+
`:Null` adapter is used so that an error results in a no-op). Add it to the
|
248
|
+
builder using `use(:Fallback, rescue: IOError)`
|
249
|
+
* `Moneta::Lock` to make store thread safe. Add it in the builder using `use
|
250
|
+
:Lock`.
|
251
|
+
* `Moneta::Logger` to log database accesses. Add it in the builder using `use
|
252
|
+
:Logger`.
|
253
|
+
* `Moneta::Pool` to create a pool of stores as a means of making the store
|
254
|
+
thread safe. Add it in the builder using `use(:Pool, min: 2, max: 4, ttl: 60,
|
255
|
+
timeout: 5) {}`.
|
256
|
+
* `Moneta::Shared` to share a store between multiple processes. Add it in the
|
257
|
+
builder using `use(:Shared) {}`.
|
258
|
+
* `Moneta::Stack` to stack multiple stores (Read returns result from first
|
259
|
+
where the key is found, writes go to all stores). Add it in the builder using
|
260
|
+
`use(:Stack) {}`.
|
261
|
+
* `Moneta::Transformer` transforms keys and values (Marshal, YAML, JSON,
|
262
|
+
Base64, MD5, ...). Add it in the builder using `use :Transformer`.
|
263
|
+
* `Moneta::WeakIncrement` and `Moneta::WeakCreate` to add `#create` and
|
264
|
+
`#increment` support without atomicity (weak) to stores which don't support
|
265
|
+
it.
|
266
|
+
* `Moneta::WeakEachKey` to add key traversal to stores that don't support it,
|
267
|
+
with the important caveat that only those keys previously seen by this proxy
|
268
|
+
will be traversed.
|
269
|
+
|
270
|
+
Check the YARD documentation for more information and examples.
|
249
271
|
|
250
272
|
### Serializers and compressors (`Moneta::Transformer`)
|
251
273
|
|
@@ -887,12 +909,15 @@ Person.adapter :memory, Moneta.new(:Redis)
|
|
887
909
|
|
888
910
|
## Testing and Benchmarks
|
889
911
|
|
890
|
-
Testing is done using [Travis-CI](http://travis-ci.org/moneta-rb/moneta).
|
912
|
+
Testing is done using [Travis-CI](http://travis-ci.org/moneta-rb/moneta).
|
913
|
+
Currently we support MRI Ruby >= 2.3.0 and the JRuby >= 9.2.9.0.
|
891
914
|
|
892
|
-
Benchmarks for each store are done on
|
893
|
-
|
894
|
-
|
895
|
-
|
915
|
+
Benchmarks for each store are done on
|
916
|
+
[Travis-CI](http://travis-ci.org/moneta-rb/moneta) for each build. Take a look
|
917
|
+
there to compare the speed of the different key value stores for different
|
918
|
+
key/value sizes and size distributions. Feel free to add your own
|
919
|
+
configurations! The impact of Moneta should be minimal since it is only a thin
|
920
|
+
layer on top of the different stores.
|
896
921
|
|
897
922
|
|
898
923
|
------
|
data/feature_matrix.yaml
CHANGED
@@ -8,20 +8,10 @@ notes:
|
|
8
8
|
server if you want multiprocess concurrency!
|
9
9
|
backends:
|
10
10
|
- adapter: Mongo
|
11
|
-
platforms: [ MRI, JRuby ]
|
12
|
-
gems: mongo or moped
|
13
|
-
features: [ threadsafe, multiprocess, increment, create, expires, each_key, bulk_read, bulk_write ]
|
14
|
-
description: "[MongoDB](http://www.mongodb.org/) database"
|
15
|
-
- adapter: MongoOfficial
|
16
11
|
platforms: [ MRI, JRuby ]
|
17
12
|
gems: mongo
|
18
13
|
features: [ threadsafe, multiprocess, increment, create, expires, each_key, bulk_read, bulk_write ]
|
19
14
|
description: "[MongoDB](http://www.mongodb.org/) database"
|
20
|
-
- adapter: MongoMoped
|
21
|
-
platforms: [ MRI, JRuby ]
|
22
|
-
gems: moped
|
23
|
-
features: [ threadsafe, multiprocess, increment, create, expires, each_key, bulk_read, bulk_write ]
|
24
|
-
description: "[MongoDB](http://www.mongodb.org/) database"
|
25
15
|
- adapter: Redis
|
26
16
|
platforms: [ MRI, JRuby ]
|
27
17
|
gems: redis
|
@@ -82,6 +72,7 @@ backends:
|
|
82
72
|
description: "[Berkeley DB using DBM interface or NDBM (Depends on Ruby environment)](http://www.ruby-doc.org/stdlib/libdoc/dbm/rdoc/DBM.html)"
|
83
73
|
- adapter: GDBM
|
84
74
|
platforms: [ MRI, JRuby ]
|
75
|
+
gems: ffi-gdbm on JRuby
|
85
76
|
features: [ increment, create, each_key, bulk_read, bulk_write ]
|
86
77
|
description: "[GDBM](http://www.ruby-doc.org/stdlib/libdoc/gdbm/rdoc/GDBM.html) database"
|
87
78
|
- adapter: LevelDB
|
@@ -219,13 +210,14 @@ backends:
|
|
219
210
|
- adapter: Client
|
220
211
|
platforms: [ MRI, JRuby ]
|
221
212
|
features: [multiprocess]
|
222
|
-
unknown: [ increment, create, expires, persist ]
|
213
|
+
unknown: [ increment, create, expires, persist, each_key ]
|
223
214
|
description: "Moneta client adapter"
|
224
215
|
notes:
|
225
216
|
increment: depends on server
|
226
217
|
create: depends on server
|
227
218
|
expires: depends on server
|
228
219
|
persist: depends on server
|
220
|
+
each_key: depends on server
|
229
221
|
- adapter: RestClient
|
230
222
|
platforms: [ MRI, JRuby ]
|
231
223
|
features: [ multiprocess ]
|
@@ -79,7 +79,7 @@ module ActiveSupport
|
|
79
79
|
def write_multi(hash, options = nil)
|
80
80
|
options = merged_options(options)
|
81
81
|
|
82
|
-
instrument :write_multi, hash, options do
|
82
|
+
instrument :write_multi, hash, options do
|
83
83
|
entries = hash.each_with_object({}) do |(name, value), memo|
|
84
84
|
memo[normalize_key(name, options)] = \
|
85
85
|
Entry.new(value, options.merge(version: normalize_version(name, options)))
|
@@ -118,12 +118,12 @@ module ActiveSupport
|
|
118
118
|
|
119
119
|
def read_multi_entries(names, options)
|
120
120
|
keys = names.map { |name| normalize_key(name, options) }
|
121
|
-
entries = @store
|
122
|
-
values_at(*keys, **moneta_options(options, false))
|
123
|
-
map(&method(:make_entry))
|
121
|
+
entries = @store
|
122
|
+
.values_at(*keys, **moneta_options(options, false))
|
123
|
+
.map(&method(:make_entry))
|
124
124
|
|
125
125
|
names.zip(keys, entries).map do |name, key, entry|
|
126
|
-
next if entry
|
126
|
+
next if entry == nil
|
127
127
|
delete_entry(key, options) if entry.expired?
|
128
128
|
next if entry.expired? || entry.mismatched?(normalize_version(name, options))
|
129
129
|
|
data/lib/moneta.rb
CHANGED
@@ -1,18 +1,26 @@
|
|
1
|
+
# Provides two methods for constructing stores:
|
2
|
+
#
|
3
|
+
# * {Moneta.new}
|
4
|
+
# * {Moneta.build}
|
1
5
|
module Moneta
|
2
6
|
autoload :Builder, 'moneta/builder'
|
3
7
|
autoload :Cache, 'moneta/cache'
|
4
|
-
autoload :CreateSupport, 'moneta/
|
5
|
-
autoload :
|
6
|
-
autoload :
|
7
|
-
autoload :
|
8
|
+
autoload :CreateSupport, 'moneta/create_support'
|
9
|
+
autoload :DBMAdapter, 'moneta/dbm_adapter'
|
10
|
+
autoload :Defaults, 'moneta/defaults'
|
11
|
+
autoload :EachKeySupport, 'moneta/each_key_support'
|
12
|
+
autoload :Enumerable, 'moneta/enumerable'
|
13
|
+
autoload :ExpiresSupport, 'moneta/expires_support'
|
8
14
|
autoload :Expires, 'moneta/expires'
|
9
|
-
autoload :
|
10
|
-
autoload :
|
15
|
+
autoload :Fallback, 'moneta/fallback'
|
16
|
+
autoload :HashAdapter, 'moneta/hash_adapter'
|
17
|
+
autoload :IncrementSupport, 'moneta/increment_support'
|
11
18
|
autoload :Lock, 'moneta/lock'
|
12
19
|
autoload :Logger, 'moneta/logger'
|
13
20
|
autoload :Mutex, 'moneta/synchronize'
|
21
|
+
autoload :NilValues, 'moneta/nil_values'
|
14
22
|
autoload :OptionMerger, 'moneta/optionmerger'
|
15
|
-
autoload :OptionSupport, 'moneta/
|
23
|
+
autoload :OptionSupport, 'moneta/option_support'
|
16
24
|
autoload :Pool, 'moneta/pool'
|
17
25
|
autoload :Proxy, 'moneta/proxy'
|
18
26
|
autoload :Semaphore, 'moneta/synchronize'
|
@@ -26,9 +34,11 @@ module Moneta
|
|
26
34
|
autoload :WeakIncrement, 'moneta/weak'
|
27
35
|
autoload :Wrapper, 'moneta/wrapper'
|
28
36
|
|
37
|
+
# Adapters are classes which wrap databases, services etc., as described in
|
38
|
+
# {file:SPEC.md The Moneta Specification}.
|
29
39
|
module Adapters
|
30
40
|
autoload :ActiveRecord, 'moneta/adapters/activerecord'
|
31
|
-
autoload :ActiveSupportCache,'moneta/adapters/activesupportcache'
|
41
|
+
autoload :ActiveSupportCache, 'moneta/adapters/activesupportcache'
|
32
42
|
autoload :Cassandra, 'moneta/adapters/cassandra'
|
33
43
|
autoload :Client, 'moneta/adapters/client'
|
34
44
|
autoload :Cookie, 'moneta/adapters/cookie'
|
@@ -50,8 +60,6 @@ module Moneta
|
|
50
60
|
autoload :MemcachedNative, 'moneta/adapters/memcached/native'
|
51
61
|
autoload :Memory, 'moneta/adapters/memory'
|
52
62
|
autoload :Mongo, 'moneta/adapters/mongo'
|
53
|
-
autoload :MongoMoped, 'moneta/adapters/mongo/moped'
|
54
|
-
autoload :MongoOfficial, 'moneta/adapters/mongo/official'
|
55
63
|
autoload :Null, 'moneta/adapters/null'
|
56
64
|
autoload :PStore, 'moneta/adapters/pstore'
|
57
65
|
autoload :Redis, 'moneta/adapters/redis'
|
@@ -110,6 +118,8 @@ module Moneta
|
|
110
118
|
when :Sequel
|
111
119
|
# Sequel accept only base64 keys
|
112
120
|
transformer[:key] << :base64
|
121
|
+
# If using HStore, binary data is not allowed
|
122
|
+
transformer[:value] << :base64 if options[:hstore]
|
113
123
|
when :ActiveRecord, :DataMapper
|
114
124
|
# DataMapper and AR accept only base64 keys and values
|
115
125
|
transformer[:key] << :base64
|
@@ -40,7 +40,8 @@ module Moneta
|
|
40
40
|
# @param [Hash] options
|
41
41
|
# @option options [Object] :backend A class object inheriting from ActiveRecord::Base to use as a table
|
42
42
|
# @option options [String] :table ('moneta') Table name
|
43
|
-
# @option options [Hash/String/Symbol] :connection ActiveRecord connection configuration (`Hash` or `String`), or
|
43
|
+
# @option options [Hash/String/Symbol] :connection ActiveRecord connection configuration (`Hash` or `String`), or
|
44
|
+
# symbol giving the name of a Rails connection (e.g. :production)
|
44
45
|
# @option options [Proc, Boolean] :create_table Proc called with a connection if table
|
45
46
|
# needs to be created. Pass false to skip the create table check all together.
|
46
47
|
# @option options [Symbol] :key_column (:k) The name of the column to use for keys
|
@@ -87,7 +88,7 @@ module Moneta
|
|
87
88
|
|
88
89
|
table_name = (options.delete(:table) || :moneta).to_sym
|
89
90
|
create_table_proc = options.delete(:create_table)
|
90
|
-
if create_table_proc
|
91
|
+
if create_table_proc == nil
|
91
92
|
create_table(table_name)
|
92
93
|
elsif create_table_proc
|
93
94
|
with_connection(&create_table_proc)
|
@@ -164,10 +165,11 @@ module Moneta
|
|
164
165
|
end
|
165
166
|
end
|
166
167
|
end
|
167
|
-
rescue ::ActiveRecord::RecordNotUnique
|
168
|
-
# This handles the "no row updated" issue, above
|
168
|
+
rescue ::ActiveRecord::RecordNotUnique, ::ActiveRecord::Deadlocked
|
169
|
+
# This handles the "no row updated" issue, above, as well as deadlocks
|
170
|
+
# which may occur on some adapters
|
169
171
|
tries ||= 0
|
170
|
-
|
172
|
+
(tries += 1) <= 3 ? retry : raise
|
171
173
|
end
|
172
174
|
|
173
175
|
# (see Proxy#create)
|
@@ -197,14 +199,32 @@ module Moneta
|
|
197
199
|
# (see Proxy#slice)
|
198
200
|
def slice(*keys, lock: false, **options)
|
199
201
|
with_connection do |conn|
|
200
|
-
|
201
|
-
|
202
|
-
|
202
|
+
conn.create_table(:slice_keys, temporary: true) do |t|
|
203
|
+
t.string :key, null: false
|
204
|
+
end
|
203
205
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
206
|
+
begin
|
207
|
+
temp_table = ::Arel::Table.new(:slice_keys)
|
208
|
+
keys.each do |key|
|
209
|
+
conn.insert ::Arel::InsertManager.new
|
210
|
+
.into(temp_table)
|
211
|
+
.insert([[temp_table[:key], key]])
|
212
|
+
end
|
213
|
+
|
214
|
+
sel = arel_sel
|
215
|
+
.join(temp_table)
|
216
|
+
.on(table[key_column].eq(temp_table[:key]))
|
217
|
+
.project(table[key_column], table[value_column])
|
218
|
+
sel = sel.lock if lock
|
219
|
+
result = conn.select_all(sel)
|
220
|
+
|
221
|
+
k = key_column.to_s
|
222
|
+
v = value_column.to_s
|
223
|
+
result.map do |row|
|
224
|
+
[row[k], decode(conn, row[v])]
|
225
|
+
end
|
226
|
+
ensure
|
227
|
+
conn.drop_table(:slice_keys)
|
208
228
|
end
|
209
229
|
end
|
210
230
|
end
|
@@ -255,7 +275,7 @@ module Moneta
|
|
255
275
|
self.class.retrieve_or_establish_connection_pool(@spec)
|
256
276
|
end
|
257
277
|
|
258
|
-
def create_table
|
278
|
+
def create_table(table_name)
|
259
279
|
with_connection do |conn|
|
260
280
|
return if conn.table_exists?(table_name)
|
261
281
|
|
@@ -287,10 +307,6 @@ module Moneta
|
|
287
307
|
arel_sel.where(table[key_column].eq(key))
|
288
308
|
end
|
289
309
|
|
290
|
-
def arel_slice(keys)
|
291
|
-
arel_sel.where(table[key_column].eq_any(keys))
|
292
|
-
end
|
293
|
-
|
294
310
|
def conn_ins(conn, key, value)
|
295
311
|
ins = ::Arel::InsertManager.new.into(table)
|
296
312
|
ins.insert([[table[key_column], key], [table[value_column], value]])
|
@@ -311,7 +327,7 @@ module Moneta
|
|
311
327
|
elsif conn.respond_to?(:escape_bytea)
|
312
328
|
conn.escape_bytea(value)
|
313
329
|
elsif defined?(::ActiveRecord::ConnectionAdapters::SQLite3Adapter) &&
|
314
|
-
|
330
|
+
conn.is_a?(::ActiveRecord::ConnectionAdapters::SQLite3Adapter)
|
315
331
|
Arel::Nodes::SqlLiteral.new("X'#{value.unpack('H*').first}'")
|
316
332
|
else
|
317
333
|
value
|
@@ -322,7 +338,7 @@ module Moneta
|
|
322
338
|
if value == nil
|
323
339
|
nil
|
324
340
|
elsif defined?(::ActiveModel::Type::Binary::Data) &&
|
325
|
-
|
341
|
+
value.is_a?(::ActiveModel::Type::Binary::Data)
|
326
342
|
value.to_s
|
327
343
|
elsif conn.respond_to?(:unescape_bytea)
|
328
344
|
conn.unescape_bytea(value)
|
@@ -25,7 +25,7 @@ module Moneta
|
|
25
25
|
# (see Proxy#key?)
|
26
26
|
def key?(key, options = {})
|
27
27
|
@backend.exist?(key).tap do |exists|
|
28
|
-
if exists &&
|
28
|
+
if exists && (expires = expires_value(options, nil)) != nil
|
29
29
|
value = @backend.read(key, options)
|
30
30
|
@backend.write(key, value, options.merge(expires_in: expires ? expires.seconds : nil))
|
31
31
|
end
|
@@ -36,14 +36,10 @@ module Moneta
|
|
36
36
|
def load(key, options = {})
|
37
37
|
expires = expires_value(options, nil)
|
38
38
|
value = @backend.read(key, options)
|
39
|
-
if value and
|
39
|
+
if value and expires != nil
|
40
40
|
@backend.write(key, value, options.merge(expires_in: expires ? expires.seconds : nil))
|
41
41
|
end
|
42
|
-
|
43
|
-
value && value.to_s
|
44
|
-
else
|
45
|
-
value
|
46
|
-
end
|
42
|
+
value
|
47
43
|
end
|
48
44
|
|
49
45
|
# (see Proxy#store)
|
@@ -83,10 +83,14 @@ module Moneta
|
|
83
83
|
# and then re-set it in order to update the TTL.
|
84
84
|
return false unless
|
85
85
|
row = @backend.execute(@load, options.merge(consistency: rc, arguments: [key])).first and
|
86
|
-
|
87
|
-
@backend.execute(@update_expires,
|
88
|
-
|
89
|
-
|
86
|
+
row[@expired_column] != nil
|
87
|
+
@backend.execute(@update_expires,
|
88
|
+
options.merge(consistency: wc,
|
89
|
+
arguments: [(expires || 0).to_i,
|
90
|
+
timestamp,
|
91
|
+
row[@value_column],
|
92
|
+
key,
|
93
|
+
row[@updated_column]]))
|
90
94
|
true
|
91
95
|
elsif row = @backend.execute(@key, options.merge(consistency: rc, arguments: [key])).first
|
92
96
|
row[@expired_column] != nil
|
@@ -100,9 +104,13 @@ module Moneta
|
|
100
104
|
rc, wc = consistency(options)
|
101
105
|
if row = @backend.execute(@load, options.merge(consistency: rc, arguments: [key])).first and row[@expired_column] != nil
|
102
106
|
if (expires = expires_value(options, nil)) != nil
|
103
|
-
@backend.execute(@update_expires,
|
104
|
-
|
105
|
-
|
107
|
+
@backend.execute(@update_expires,
|
108
|
+
options.merge(consistency: wc,
|
109
|
+
arguments: [(expires || 0).to_i,
|
110
|
+
timestamp,
|
111
|
+
row[@value_column],
|
112
|
+
key,
|
113
|
+
row[@updated_column]]))
|
106
114
|
end
|
107
115
|
row[@value_column]
|
108
116
|
end
|
@@ -150,7 +158,7 @@ module Moneta
|
|
150
158
|
|
151
159
|
# (see Proxy#each_key)
|
152
160
|
def each_key
|
153
|
-
rc,
|
161
|
+
rc, = consistency
|
154
162
|
return enum_for(:each_key) unless block_given?
|
155
163
|
result = @backend.execute(@each_key, consistency: rc, page_size: 100)
|
156
164
|
loop do
|
@@ -229,7 +237,7 @@ module Moneta
|
|
229
237
|
end
|
230
238
|
end
|
231
239
|
|
232
|
-
|
240
|
+
_rc, wc = consistency(options)
|
233
241
|
expires = expires_value(options)
|
234
242
|
t = timestamp
|
235
243
|
batch = @backend.batch do |batch|
|
@@ -270,16 +278,16 @@ module Moneta
|
|
270
278
|
# but use single quotes instead of double-quotes.
|
271
279
|
require 'multi_json'
|
272
280
|
option_str = options.map do |key, value|
|
273
|
-
key.to_s + ' = ' +
|
281
|
+
key.to_s + ' = ' + MultiJson.dump(value).tr(?", ?')
|
274
282
|
end.join(' AND ')
|
275
283
|
|
276
|
-
@backend.execute "CREATE KEYSPACE IF NOT EXISTS
|
277
|
-
keyspace,
|
278
|
-
option_str
|
279
|
-
|
284
|
+
@backend.execute "CREATE KEYSPACE IF NOT EXISTS %<keyspace>s WITH %<options>s" % {
|
285
|
+
keyspace: keyspace,
|
286
|
+
options: option_str
|
287
|
+
}
|
280
288
|
rescue ::Cassandra::Errors::TimeoutError
|
281
289
|
tries ||= 0
|
282
|
-
|
290
|
+
(tries += 1) <= 3 ? retry : raise
|
283
291
|
end
|
284
292
|
|
285
293
|
def prepare_statements
|
@@ -338,7 +346,7 @@ module Moneta
|
|
338
346
|
CQL
|
339
347
|
end
|
340
348
|
|
341
|
-
def consistency(options={})
|
349
|
+
def consistency(options = {})
|
342
350
|
[
|
343
351
|
options[:read_consistency] || @read_consistency,
|
344
352
|
options[:write_consistency] || @write_consistency
|