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
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) [![Build Status](https://secure.travis-ci.org/moneta-rb/moneta.svg?branch=master)](http://travis-ci.org/moneta-rb/moneta) [![Code Climate](https://codeclimate.com/github/moneta-rb/moneta.svg)](https://codeclimate.com/github/moneta-rb/moneta) [![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)
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`, `:MongoOffical` or `:MongoMoped`)
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 or 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>
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>-</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>
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:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td>Moneta client adapter</td></tr>
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::Expires` to add expiration support to stores which don't support it natively. Add it in the builder using `use :Expires`.
240
- * `Moneta::Stack` to stack multiple stores (Read returns result from first where the key is found, writes go to all stores). Add it in the builder using `use(:Stack) {}`.
241
- * `Moneta::Transformer` transforms keys and values (Marshal, YAML, JSON, Base64, MD5, ...). Add it in the builder using `use :Transformer`.
242
- * `Moneta::Cache` combine two stores, one as backend and one as cache (e.g. `Moneta::Adapters::File` + `Moneta::Adapters::LRUHash`). Add it in the builder using `use(:Cache) {}`.
243
- * `Moneta::Lock` to make store thread safe. Add it in the builder using `use :Lock`.
244
- * `Moneta::Pool` to create a pool of stores as a means of making the store thread safe. Add it in the builder using `use(:Pool) {}`.
245
- * `Moneta::Logger` to log database accesses. Add it in the builder using `use :Logger`.
246
- * `Moneta::Shared` to share a store between multiple processes. Add it in the builder using `use(:Shared) {}`.
247
- * `Moneta::WeakIncrement` and `Moneta::WeakCreate` to add `#create` and `#increment` support without atomicity (weak) to stores which don't support it.
248
- * `Moneta::WeakEachKey` to add key traversal to stores that don't support it, with the important caveat that only those keys previously seen by this proxy will be traversed.
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). Currently we support Ruby >= 1.9.3.
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 [Travis-CI](http://travis-ci.org/moneta-rb/moneta) for each build. Take a look there
893
- to compare the speed of the different key value stores for different key/value sizes and size distributions.
894
- Feel free to add your own configurations! The impact of Moneta should be minimal since it is only a thin layer
895
- on top of the different stores.
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
  ------
@@ -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 ]
@@ -3,6 +3,7 @@ require 'action_dispatch/middleware/session/abstract_store'
3
3
 
4
4
  module ActionDispatch
5
5
  module Session
6
+ # A Rails cache backed by any Moneta store
6
7
  class MonetaStore < Rack::Session::Moneta
7
8
  include Compatibility
8
9
  include StaleSessionCheck
@@ -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 |payload|
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.nil?
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
 
@@ -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/mixins'
5
- autoload :Defaults, 'moneta/mixins'
6
- autoload :EachKeySupport, 'moneta/mixins'
7
- autoload :ExpiresSupport, 'moneta/mixins'
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 :HashAdapter, 'moneta/mixins'
10
- autoload :IncrementSupport, 'moneta/mixins'
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/mixins'
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 symbol giving the name of a Rails connection (e.g. :production)
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.nil?
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
- if (tries += 1) <= 3; retry else raise end
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
- sel = arel_slice(keys).project(table[key_column], table[value_column])
201
- sel = sel.lock if lock
202
- result = conn.select_all(sel)
202
+ conn.create_table(:slice_keys, temporary: true) do |t|
203
+ t.string :key, null: false
204
+ end
203
205
 
204
- k = key_column.to_s
205
- v = value_column.to_s
206
- result.map do |row|
207
- [row[k], decode(conn, row[v])]
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 table_name
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
- conn.is_a?(::ActiveRecord::ConnectionAdapters::SQLite3Adapter)
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
- value.is_a?(::ActiveModel::Type::Binary::Data)
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 && !(expires = expires_value(options, nil)).nil?
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 !expires.nil?
39
+ if value and expires != nil
40
40
  @backend.write(key, value, options.merge(expires_in: expires ? expires.seconds : nil))
41
41
  end
42
- if options[:raw]
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
- row[@expired_column] != nil
87
- @backend.execute(@update_expires, options.merge(consistency: wc, arguments: [
88
- (expires || 0).to_i, timestamp, row[@value_column], key, row[@updated_column]
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, options.merge(consistency: wc, arguments: [
104
- (expires || 0).to_i, timestamp, row[@value_column], key, row[@updated_column]
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, _ = consistency
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
- rc, wc = consistency(options)
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 + ' = ' + MultiJson.dump(value).gsub('"', "'")
281
+ key.to_s + ' = ' + MultiJson.dump(value).tr(?", ?')
274
282
  end.join(' AND ')
275
283
 
276
- @backend.execute "CREATE KEYSPACE IF NOT EXISTS %s WITH %s" % [
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
- if (tries += 1) <= 3; retry else raise end
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