moneta 0.7.13 → 0.7.14
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -0
- data/CHANGES +5 -0
- data/Rakefile +7 -2
- data/lib/moneta/adapters/activerecord.rb +68 -27
- data/lib/moneta/adapters/file.rb +7 -5
- data/lib/moneta/adapters/sequel.rb +1 -1
- data/lib/moneta/transformer/config.rb +2 -2
- data/lib/moneta/version.rb +1 -1
- data/script/benchmarks +2 -1
- data/script/generate-specs +60 -16
- data/spec/moneta/adapter_activerecord_exisiting_connection_spec.rb +31 -0
- data/spec/moneta/adapter_activerecord_spec.rb +23 -4
- data/spec/moneta/adapter_cassandra_spec.rb +1 -0
- data/spec/moneta/adapter_cassandra_with_default_expires_spec.rb +1 -0
- data/spec/moneta/adapter_client_spec.rb +2 -1
- data/spec/moneta/adapter_cookie_spec.rb +1 -0
- data/spec/moneta/adapter_couch_spec.rb +1 -0
- data/spec/moneta/adapter_datamapper_spec.rb +3 -2
- data/spec/moneta/adapter_daybreak_spec.rb +1 -0
- data/spec/moneta/adapter_dbm_spec.rb +1 -0
- data/spec/moneta/adapter_file_spec.rb +1 -0
- data/spec/moneta/adapter_fog_spec.rb +3 -2
- data/spec/moneta/adapter_gdbm_spec.rb +1 -0
- data/spec/moneta/adapter_hbase_spec.rb +1 -0
- data/spec/moneta/adapter_kyotocabinet_spec.rb +1 -0
- data/spec/moneta/adapter_leveldb_spec.rb +1 -0
- data/spec/moneta/adapter_localmemcache_spec.rb +1 -0
- data/spec/moneta/adapter_lruhash_spec.rb +1 -0
- data/spec/moneta/adapter_memcached_dalli_spec.rb +1 -0
- data/spec/moneta/adapter_memcached_dalli_with_default_expires_spec.rb +1 -0
- data/spec/moneta/adapter_memcached_native_spec.rb +1 -0
- data/spec/moneta/adapter_memcached_native_with_default_expires_spec.rb +1 -0
- data/spec/moneta/adapter_memcached_spec.rb +1 -0
- data/spec/moneta/adapter_memcached_with_default_expires_spec.rb +1 -0
- data/spec/moneta/adapter_memory_spec.rb +1 -0
- data/spec/moneta/adapter_mongo_spec.rb +1 -0
- data/spec/moneta/adapter_mongo_with_default_expires_spec.rb +1 -0
- data/spec/moneta/adapter_pstore_spec.rb +1 -0
- data/spec/moneta/adapter_redis_spec.rb +1 -0
- data/spec/moneta/adapter_redis_with_default_expires_spec.rb +1 -0
- data/spec/moneta/adapter_restclient_spec.rb +2 -1
- data/spec/moneta/adapter_riak_spec.rb +5 -4
- data/spec/moneta/adapter_sequel_spec.rb +1 -0
- data/spec/moneta/adapter_sqlite_spec.rb +1 -0
- data/spec/moneta/adapter_tdb_spec.rb +1 -0
- data/spec/moneta/adapter_tokyocabinet_bdb_spec.rb +1 -0
- data/spec/moneta/adapter_tokyocabinet_hdb_spec.rb +1 -0
- data/spec/moneta/adapter_tokyotyrant_spec.rb +1 -0
- data/spec/moneta/adapter_yaml_spec.rb +1 -0
- data/spec/moneta/cache_file_memory_spec.rb +1 -0
- data/spec/moneta/cache_memory_null_spec.rb +1 -0
- data/spec/moneta/expires_file_spec.rb +1 -0
- data/spec/moneta/expires_memory_spec.rb +1 -0
- data/spec/moneta/expires_memory_with_default_expires_spec.rb +1 -0
- data/spec/moneta/lock_spec.rb +1 -0
- data/spec/moneta/pool_spec.rb +1 -0
- data/spec/moneta/proxy_expires_memory_spec.rb +1 -0
- data/spec/moneta/proxy_redis_spec.rb +1 -0
- data/spec/moneta/shared_tcp_spec.rb +1 -0
- data/spec/moneta/shared_unix_spec.rb +1 -0
- data/spec/moneta/simple_activerecord_spec.rb +1 -0
- data/spec/moneta/simple_activerecord_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_cassandra_spec.rb +1 -0
- data/spec/moneta/simple_client_tcp_spec.rb +2 -1
- data/spec/moneta/simple_client_unix_spec.rb +2 -1
- data/spec/moneta/simple_couch_spec.rb +1 -0
- data/spec/moneta/simple_couch_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_datamapper_spec.rb +3 -2
- data/spec/moneta/simple_datamapper_with_expires_spec.rb +3 -2
- data/spec/moneta/simple_datamapper_with_repository_spec.rb +3 -2
- data/spec/moneta/simple_daybreak_spec.rb +1 -0
- data/spec/moneta/simple_daybreak_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_dbm_spec.rb +1 -0
- data/spec/moneta/simple_dbm_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_file_spec.rb +1 -0
- data/spec/moneta/simple_file_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_fog_spec.rb +3 -2
- data/spec/moneta/simple_fog_with_expires_spec.rb +3 -2
- data/spec/moneta/simple_gdbm_spec.rb +1 -0
- data/spec/moneta/simple_gdbm_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_hashfile_spec.rb +1 -0
- data/spec/moneta/simple_hashfile_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_hbase_spec.rb +1 -0
- data/spec/moneta/simple_hbase_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_kyotocabinet_spec.rb +1 -0
- data/spec/moneta/simple_kyotocabinet_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_leveldb_spec.rb +1 -0
- data/spec/moneta/simple_leveldb_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_localmemcache_spec.rb +1 -0
- data/spec/moneta/simple_localmemcache_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_lruhash_spec.rb +1 -0
- data/spec/moneta/simple_lruhash_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_memcached_dalli_spec.rb +1 -0
- data/spec/moneta/simple_memcached_native_spec.rb +1 -0
- data/spec/moneta/simple_memcached_spec.rb +1 -0
- data/spec/moneta/simple_memory_spec.rb +1 -0
- data/spec/moneta/simple_memory_with_compress_spec.rb +1 -0
- data/spec/moneta/simple_memory_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_memory_with_json_key_serializer_spec.rb +1 -0
- data/spec/moneta/simple_memory_with_json_serializer_spec.rb +1 -0
- data/spec/moneta/simple_memory_with_json_value_serializer_spec.rb +1 -0
- data/spec/moneta/simple_memory_with_prefix_spec.rb +1 -0
- data/spec/moneta/simple_memory_with_snappy_compress_spec.rb +1 -0
- data/spec/moneta/simple_mongo_spec.rb +1 -0
- data/spec/moneta/simple_pstore_spec.rb +1 -0
- data/spec/moneta/simple_pstore_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_redis_spec.rb +1 -0
- data/spec/moneta/simple_restclient_spec.rb +2 -1
- data/spec/moneta/simple_riak_spec.rb +5 -4
- data/spec/moneta/simple_riak_with_expires_spec.rb +5 -4
- data/spec/moneta/simple_sequel_spec.rb +1 -0
- data/spec/moneta/simple_sequel_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_sqlite_spec.rb +1 -0
- data/spec/moneta/simple_sqlite_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_tdb_spec.rb +1 -0
- data/spec/moneta/simple_tdb_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_tokyocabinet_spec.rb +1 -0
- data/spec/moneta/simple_tokyocabinet_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_tokyotyrant_spec.rb +1 -0
- data/spec/moneta/simple_tokyotyrant_with_expires_spec.rb +1 -0
- data/spec/moneta/simple_yaml_spec.rb +1 -0
- data/spec/moneta/simple_yaml_with_expires_spec.rb +1 -0
- data/spec/moneta/stack_file_memory_spec.rb +1 -0
- data/spec/moneta/stack_memory_file_spec.rb +1 -0
- data/spec/moneta/transformer_bencode_spec.rb +1 -0
- data/spec/moneta/transformer_bert_spec.rb +1 -0
- data/spec/moneta/transformer_bson_spec.rb +1 -0
- data/spec/moneta/transformer_bzip2_spec.rb +1 -0
- data/spec/moneta/transformer_json_spec.rb +1 -0
- data/spec/moneta/transformer_key_inspect_spec.rb +1 -0
- data/spec/moneta/transformer_key_marshal_spec.rb +1 -0
- data/spec/moneta/transformer_key_to_s_spec.rb +1 -0
- data/spec/moneta/transformer_key_yaml_spec.rb +1 -0
- data/spec/moneta/transformer_lzma_spec.rb +1 -0
- data/spec/moneta/transformer_lzo_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_base64_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_escape_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_hmac_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_md5_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_md5_spread_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_prefix_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_qp_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_rmd160_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_sha1_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_sha256_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_sha384_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_sha512_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_truncate_spec.rb +1 -0
- data/spec/moneta/transformer_marshal_uuencode_spec.rb +1 -0
- data/spec/moneta/transformer_msgpack_spec.rb +1 -0
- data/spec/moneta/transformer_ox_spec.rb +1 -0
- data/spec/moneta/transformer_quicklz_spec.rb +1 -0
- data/spec/moneta/transformer_snappy_spec.rb +1 -0
- data/spec/moneta/transformer_tnet_spec.rb +1 -0
- data/spec/moneta/transformer_value_marshal_spec.rb +1 -0
- data/spec/moneta/transformer_value_yaml_spec.rb +1 -0
- data/spec/moneta/transformer_yaml_spec.rb +1 -0
- data/spec/moneta/transformer_zlib_spec.rb +1 -0
- data/spec/moneta/weak_create_spec.rb +1 -0
- data/spec/moneta/weak_increment_spec.rb +1 -0
- data/spec/monetaspecs.rb +23 -2
- metadata +4 -3
data/.travis.yml
CHANGED
@@ -16,6 +16,8 @@ before_install:
|
|
16
16
|
install: 'echo "Bundle installed"'
|
17
17
|
before_script:
|
18
18
|
- mysql -e 'create database moneta;'
|
19
|
+
- mysql -e 'create database moneta_activerecord1;'
|
20
|
+
- mysql -e 'create database moneta_activerecord2;'
|
19
21
|
env:
|
20
22
|
global:
|
21
23
|
- secure: "B0vx1g1CB1A6mM3B/iy2ATicfS4OXT80bb2RVe8mSRsPzez1B4q4Q4hJcaMI\nrMARONN8Krtnti+IqvmDnB0Z0AKYMEyIc+zT37zJOCjLdkLJl+x/thuU/MbC\nvlLVwjMf6JE2EUzTfORDRFYc5ycCqfsfgNk1Go0D2CPT6P9u9uQ="
|
data/CHANGES
CHANGED
data/Rakefile
CHANGED
@@ -35,8 +35,13 @@ task :test do
|
|
35
35
|
#
|
36
36
|
# * Cassandra and Riak fail spuriously (An expert has to check the adapters!)
|
37
37
|
#
|
38
|
-
# *
|
39
|
-
|
38
|
+
# * PStore and File increment/locking doesn't work correctly on JRuby
|
39
|
+
#
|
40
|
+
unstable = %w(quicklz cassandra riak)
|
41
|
+
unstable += %w(file pstore) if defined?(JRUBY_VERSION)
|
42
|
+
|
43
|
+
unstable_re = /#{unstable.join('|')}/
|
44
|
+
unstable = specs.select {|s| s =~ unstable_re }
|
40
45
|
specs -= unstable
|
41
46
|
|
42
47
|
if group =~ /^(\d+)\/(\d+)$/
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_record'
|
2
|
+
require 'thread'
|
2
3
|
|
3
4
|
module Moneta
|
4
5
|
module Adapters
|
@@ -10,44 +11,78 @@ module Moneta
|
|
10
11
|
supports :create, :increment
|
11
12
|
attr_reader :table
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
end
|
14
|
+
@table_mutex = ::Mutex.new
|
15
|
+
@table_refcount = {}
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
c = Class.new(::ActiveRecord::Base)
|
25
|
-
c.table_name = table
|
26
|
-
c.primary_key = :k
|
27
|
-
c
|
17
|
+
class << self
|
18
|
+
def release(table)
|
19
|
+
@table_mutex.synchronize do
|
20
|
+
if (@table_refcount[table] -= 1) <= 0
|
21
|
+
remove_const(table.name.sub(/^.*::/, ''))
|
22
|
+
@table_refcount.delete(table)
|
23
|
+
end
|
28
24
|
end
|
25
|
+
end
|
29
26
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
27
|
+
def get(options)
|
28
|
+
name = 'Table_' << options.inspect.gsub(/[^\w]+/) do
|
29
|
+
$&.unpack('H2' * $&.bytesize).join.upcase
|
30
|
+
end
|
31
|
+
@table_mutex.synchronize do
|
32
|
+
table =
|
33
|
+
if const_defined?(name)
|
34
|
+
const_get(name)
|
35
|
+
else
|
36
|
+
create(name, options)
|
37
|
+
end
|
38
|
+
@table_refcount[table] ||= 0
|
39
|
+
@table_refcount[table] += 1
|
40
|
+
table
|
36
41
|
end
|
37
42
|
end
|
38
43
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
44
|
+
private
|
45
|
+
|
46
|
+
def create(name, options)
|
47
|
+
table = Class.new(::ActiveRecord::Base)
|
48
|
+
const_set(name, table)
|
49
|
+
table.table_name = options[:table] || 'moneta'
|
50
|
+
table.primary_key = :k
|
51
|
+
|
52
|
+
if options[:connection]
|
53
|
+
begin
|
54
|
+
table.establish_connection(options[:connection])
|
55
|
+
rescue
|
56
|
+
tries ||= 0
|
57
|
+
(tries += 1) < 3 ? retry : raise
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
table.connection_pool.with_connection do |conn|
|
62
|
+
unless table.table_exists?
|
63
|
+
conn.create_table(table.table_name, :id => false) do |t|
|
64
|
+
# Do not use binary key (Issue #17)
|
65
|
+
t.string :k, :null => false
|
66
|
+
t.binary :v
|
67
|
+
end
|
68
|
+
conn.add_index(table.table_name, :k, :unique => true)
|
45
69
|
end
|
46
|
-
conn.add_index(table, :k, :unique => true)
|
47
70
|
end
|
71
|
+
|
72
|
+
table
|
73
|
+
rescue
|
74
|
+
remove_const(name)
|
75
|
+
raise
|
48
76
|
end
|
49
77
|
end
|
50
78
|
|
79
|
+
# @param [Hash] options
|
80
|
+
# @option options [String] :table ('moneta') Table name
|
81
|
+
# @option options [Hash] :connection ActiveRecord connection configuration
|
82
|
+
def initialize(options = {})
|
83
|
+
@table = self.class.get(options)
|
84
|
+
end
|
85
|
+
|
51
86
|
# (see Proxy#key?)
|
52
87
|
def key?(key, options = {})
|
53
88
|
@table.connection_pool.with_connection do
|
@@ -129,6 +164,12 @@ module Moneta
|
|
129
164
|
end
|
130
165
|
self
|
131
166
|
end
|
167
|
+
|
168
|
+
# (see Proxy#close)
|
169
|
+
def close
|
170
|
+
self.class.release(@table)
|
171
|
+
@table = nil
|
172
|
+
end
|
132
173
|
end
|
133
174
|
end
|
134
175
|
end
|
data/lib/moneta/adapters/file.rb
CHANGED
@@ -32,7 +32,7 @@ module Moneta
|
|
32
32
|
path = store_path(key)
|
33
33
|
temp_file = ::File.join(@dir, "value-#{$$}-#{Thread.current.object_id}")
|
34
34
|
FileUtils.mkpath(::File.dirname(path))
|
35
|
-
::File.open(temp_file, 'wb') {|
|
35
|
+
::File.open(temp_file, 'wb') {|f| f.write(value) }
|
36
36
|
::File.rename(temp_file, path)
|
37
37
|
value
|
38
38
|
end
|
@@ -63,9 +63,11 @@ module Moneta
|
|
63
63
|
existed = ::File.exists?(path)
|
64
64
|
::File.open(path, 'ab+') do |f|
|
65
65
|
Thread.pass until f.flock(::File::LOCK_EX)
|
66
|
+
# FIXME: JRuby needs synchronous mode, otherwise f.read might return wrong value
|
67
|
+
f.sync = true if defined?(JRUBY_VERSION)
|
66
68
|
content = f.read
|
67
|
-
f.truncate(0)
|
68
69
|
amount += Utils.to_int(content) if existed || !content.empty?
|
70
|
+
f.truncate(0)
|
69
71
|
f.write(amount.to_s)
|
70
72
|
amount
|
71
73
|
end
|
@@ -75,9 +77,9 @@ module Moneta
|
|
75
77
|
def create(key, value, options = {})
|
76
78
|
path = store_path(key)
|
77
79
|
FileUtils.mkpath(::File.dirname(path))
|
78
|
-
::File.open(path, ::File::WRONLY | ::File::CREAT | ::File::EXCL) do |
|
79
|
-
|
80
|
-
|
80
|
+
::File.open(path, ::File::WRONLY | ::File::CREAT | ::File::EXCL) do |f|
|
81
|
+
f.binmode
|
82
|
+
f.write(value)
|
81
83
|
end
|
82
84
|
true
|
83
85
|
rescue Errno::EEXIST
|
@@ -18,8 +18,8 @@ module Moneta
|
|
18
18
|
:snappy => [ :compress, '::Snappy.inflate(%s)', '::Snappy.deflate(%s)', 'snappy' ],
|
19
19
|
:quicklz => [ :compress, '::QuickLZ.decompress(%s)', '::QuickLZ.compress(%s)', 'qlzruby' ],
|
20
20
|
:zlib => [ :compress, '::Zlib::Inflate.inflate(%s)', '::Zlib::Deflate.deflate(%s)', 'zlib' ],
|
21
|
-
:qp => [ :encode, "%s.unpack('M').first", "[%s].pack('M')
|
22
|
-
:uuencode => [ :encode, "%s.unpack('u').first", "[%s].pack('u')
|
21
|
+
:qp => [ :encode, "%s.unpack('M').first", "[%s].pack('M')" ],
|
22
|
+
:uuencode => [ :encode, "%s.unpack('u').first", "[%s].pack('u')" ],
|
23
23
|
:base64 => RUBY_VERSION > '1.9' ?
|
24
24
|
[ :encode, "%s.unpack('m0').first", "[%s].pack('m0')" ] :
|
25
25
|
[ :encode, "%s.unpack('m').first", "[%s].pack('m').gsub(\"\n\", '')" ],
|
data/lib/moneta/version.rb
CHANGED
data/script/benchmarks
CHANGED
@@ -31,8 +31,9 @@ class MonetaBenchmarks
|
|
31
31
|
FileUtils.mkpath(DIR)
|
32
32
|
|
33
33
|
STORES = {
|
34
|
-
# SDBM
|
34
|
+
# SDBM accepts only very short key/value pairs (1k for both)
|
35
35
|
# :SDBM => { :file => "#{DIR}/sdbm" },
|
36
|
+
# YAML is too slow
|
36
37
|
# :YAML => { :file => "#{DIR}/yaml" },
|
37
38
|
:ActiveRecord => { :table => 'activerecord', :connection => { :adapter => (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'), :username => 'root', :database => 'moneta' } },
|
38
39
|
:Cassandra => {},
|
data/script/generate-specs
CHANGED
@@ -41,6 +41,10 @@ class Specs
|
|
41
41
|
new(:specs => specs - [:increment, :concurrent_increment] + [:not_increment])
|
42
42
|
end
|
43
43
|
|
44
|
+
def without_large
|
45
|
+
new(:specs => specs - [:store_large])
|
46
|
+
end
|
47
|
+
|
44
48
|
def without_concurrent
|
45
49
|
new(:specs => specs - [:concurrent_increment, :concurrent_create])
|
46
50
|
end
|
@@ -91,7 +95,7 @@ class Specs
|
|
91
95
|
end
|
92
96
|
|
93
97
|
def without_store
|
94
|
-
new(:specs => specs - [:store, :transform_value, :marshallable_value])
|
98
|
+
new(:specs => specs - [:store, :store_large, :transform_value, :marshallable_value])
|
95
99
|
end
|
96
100
|
|
97
101
|
def with_default_expires
|
@@ -103,9 +107,9 @@ class Specs
|
|
103
107
|
end
|
104
108
|
end
|
105
109
|
|
106
|
-
ADAPTER_SPECS = Specs.new(:specs => [:null, :store, :returndifferent, :increment, :concurrent_increment, :concurrent_create, :persist, :multiprocess, :create, :features], :key => %w(string), :value => %w(string))
|
107
|
-
STANDARD_SPECS = Specs.new(:specs => [:null, :store, :returndifferent, :marshallable_key, :marshallable_value, :transform_value, :increment, :concurrent_increment, :concurrent_create, :persist, :multiprocess, :create, :features])
|
108
|
-
TRANSFORMER_SPECS = Specs.new(:specs => [:null, :store, :returndifferent, :transform_value, :increment, :create, :features])
|
110
|
+
ADAPTER_SPECS = Specs.new(:specs => [:null, :store, :returndifferent, :increment, :concurrent_increment, :concurrent_create, :persist, :multiprocess, :create, :features, :store_large], :key => %w(string), :value => %w(string))
|
111
|
+
STANDARD_SPECS = Specs.new(:specs => [:null, :store, :returndifferent, :marshallable_key, :marshallable_value, :transform_value, :increment, :concurrent_increment, :concurrent_create, :persist, :multiprocess, :create, :features, :store_large])
|
112
|
+
TRANSFORMER_SPECS = Specs.new(:specs => [:null, :store, :returndifferent, :transform_value, :increment, :create, :features, :store_large])
|
109
113
|
|
110
114
|
header = "# Generated by #{File.basename(__FILE__)}\n"
|
111
115
|
|
@@ -273,12 +277,12 @@ end
|
|
273
277
|
'simple_sdbm' => {
|
274
278
|
:store => :SDBM,
|
275
279
|
:options => ':file => File.join(make_tempdir, "simple_sdbm")',
|
276
|
-
:specs => STANDARD_SPECS.without_multiprocess
|
280
|
+
:specs => STANDARD_SPECS.without_multiprocess.without_large
|
277
281
|
},
|
278
282
|
'simple_sdbm_with_expires' => {
|
279
283
|
:store => :SDBM,
|
280
284
|
:options => ':file => File.join(make_tempdir, "simple_sdbm_with_expires"), :expires => true',
|
281
|
-
:specs => STANDARD_SPECS.without_multiprocess.with_expires
|
285
|
+
:specs => STANDARD_SPECS.without_multiprocess.with_expires.without_large
|
282
286
|
},
|
283
287
|
'simple_leveldb' => {
|
284
288
|
:store => :LevelDB,
|
@@ -1111,13 +1115,36 @@ it 'updates an existing key/value' do
|
|
1111
1115
|
records.count.should == 1
|
1112
1116
|
end
|
1113
1117
|
|
1114
|
-
it '
|
1115
|
-
ActiveRecord
|
1118
|
+
it 'supports different tables same database' do
|
1119
|
+
store1 = Moneta::Adapters::ActiveRecord.new(:table => 'adapter_activerecord1', :connection => { :adapter => (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'), :database => 'moneta', :username => 'root' })
|
1120
|
+
store2 = Moneta::Adapters::ActiveRecord.new(:table => 'adapter_activerecord2', :connection => { :adapter => (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'), :database => 'moneta', :username => 'root' })
|
1121
|
+
|
1122
|
+
store1['key'] = 'value1'
|
1123
|
+
store2['key'] = 'value2'
|
1124
|
+
store1['key'].should == 'value1'
|
1125
|
+
store2['key'].should == 'value2'
|
1116
1126
|
|
1117
|
-
|
1118
|
-
|
1127
|
+
store1.close
|
1128
|
+
store2.close
|
1119
1129
|
end
|
1120
|
-
|
1130
|
+
|
1131
|
+
it 'supports different databases same table' do
|
1132
|
+
store1 = Moneta::Adapters::ActiveRecord.new(:table => 'adapter_activerecord', :connection => { :adapter => (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'), :database => 'moneta_activerecord1', :username => 'root' })
|
1133
|
+
store2 = Moneta::Adapters::ActiveRecord.new(:table => 'adapter_activerecord', :connection => { :adapter => (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'), :database => 'moneta_activerecord2', :username => 'root' })
|
1134
|
+
|
1135
|
+
store1['key'] = 'value1'
|
1136
|
+
store2['key'] = 'value2'
|
1137
|
+
store1['key'].should == 'value1'
|
1138
|
+
store2['key'].should == 'value2'
|
1139
|
+
|
1140
|
+
store1.close
|
1141
|
+
store2.close
|
1142
|
+
end}
|
1143
|
+
},
|
1144
|
+
'adapter_activerecord_exisiting_connection' => {
|
1145
|
+
:preamble => "require 'active_record'\nActiveRecord::Base.establish_connection :adapter => (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'), :database => 'moneta', :username => 'root'\n",
|
1146
|
+
:build => "Moneta::Adapters::ActiveRecord.new(:table => 'adapter_activerecord_existing_connection')",
|
1147
|
+
:specs => ADAPTER_SPECS
|
1121
1148
|
},
|
1122
1149
|
'adapter_client' => {
|
1123
1150
|
:preamble => "start_server(Moneta::Adapters::Memory.new)\n",
|
@@ -1301,7 +1328,7 @@ end}
|
|
1301
1328
|
},
|
1302
1329
|
'adapter_sdbm' => {
|
1303
1330
|
:build => 'Moneta::Adapters::SDBM.new(:file => File.join(make_tempdir, "adapter_sdbm"))',
|
1304
|
-
:specs => ADAPTER_SPECS.without_multiprocess
|
1331
|
+
:specs => ADAPTER_SPECS.without_multiprocess.without_large
|
1305
1332
|
},
|
1306
1333
|
'adapter_leveldb' => {
|
1307
1334
|
:build => 'Moneta::Adapters::LevelDB.new(:dir => File.join(make_tempdir, "adapter_leveldb"))',
|
@@ -1720,6 +1747,18 @@ end}
|
|
1720
1747
|
end
|
1721
1748
|
end
|
1722
1749
|
|
1750
|
+
SPECS['store_large'] = %{it 'should store values up to 32k' do
|
1751
|
+
value = 'x' * (32 * 1024)
|
1752
|
+
store['large'] = value
|
1753
|
+
store['large'].should == value
|
1754
|
+
end
|
1755
|
+
|
1756
|
+
it 'should store keys up to 128 bytes' do
|
1757
|
+
key = 'x' * 128
|
1758
|
+
store[key] = 'value'
|
1759
|
+
store[key].should == 'value'
|
1760
|
+
end}
|
1761
|
+
|
1723
1762
|
SPECS['not_persist'] = %{it 'does not persist values' do
|
1724
1763
|
store['key'] = 'val'
|
1725
1764
|
store.close
|
@@ -1985,17 +2024,20 @@ end
|
|
1985
2024
|
it 'have atomic increment across multiple processes' do
|
1986
2025
|
a = increment_thread('a')
|
1987
2026
|
b = increment_thread('b')
|
2027
|
+
c = increment_thread('c')
|
1988
2028
|
a.join
|
1989
2029
|
b.join
|
2030
|
+
c.join
|
1990
2031
|
1000.times do |i|
|
1991
2032
|
store["a\#{i}"].should == i.to_s
|
1992
2033
|
store["b\#{i}"].should == i.to_s
|
2034
|
+
store["c\#{i}"].should == i.to_s
|
1993
2035
|
end
|
1994
|
-
store.raw['counter'].should ==
|
2036
|
+
store.raw['counter'].should == 3000.to_s
|
1995
2037
|
end}
|
1996
2038
|
|
1997
2039
|
SPECS['concurrent_create'] = %{def create_thread(name)
|
1998
|
-
|
2040
|
+
Thread.new do
|
1999
2041
|
s = new_store
|
2000
2042
|
1000.times do |i|
|
2001
2043
|
s[i.to_s].should == name if s.create(i.to_s, name, :expires => false)
|
@@ -2008,8 +2050,10 @@ end
|
|
2008
2050
|
it 'have atomic create across multiple processes' do
|
2009
2051
|
a = create_thread('a')
|
2010
2052
|
b = create_thread('b')
|
2053
|
+
c = create_thread('c')
|
2011
2054
|
a.join
|
2012
2055
|
b.join
|
2056
|
+
c.join
|
2013
2057
|
end}
|
2014
2058
|
|
2015
2059
|
SPECS['increment'] = %{it 'initializes in #increment with 1' do
|
@@ -2338,11 +2382,11 @@ TESTS.each do |name, options|
|
|
2338
2382
|
code = %{#{header}require 'helper'
|
2339
2383
|
|
2340
2384
|
describe_moneta #{name.inspect} do
|
2341
|
-
def features
|
2385
|
+
#{preamble}def features
|
2342
2386
|
#{specs.features.to_a.inspect}
|
2343
2387
|
end
|
2344
2388
|
|
2345
|
-
|
2389
|
+
def new_store
|
2346
2390
|
#{build.gsub("\n", "\n ")}
|
2347
2391
|
end
|
2348
2392
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Generated by generate-specs
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
describe_moneta "adapter_activerecord_exisiting_connection" do
|
5
|
+
require 'active_record'
|
6
|
+
ActiveRecord::Base.establish_connection :adapter => (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'), :database => 'moneta', :username => 'root'
|
7
|
+
def features
|
8
|
+
[:create, :increment]
|
9
|
+
end
|
10
|
+
|
11
|
+
def new_store
|
12
|
+
Moneta::Adapters::ActiveRecord.new(:table => 'adapter_activerecord_existing_connection')
|
13
|
+
end
|
14
|
+
|
15
|
+
def load_value(value)
|
16
|
+
Marshal.load(value)
|
17
|
+
end
|
18
|
+
|
19
|
+
include_context 'setup_store'
|
20
|
+
it_should_behave_like 'concurrent_create'
|
21
|
+
it_should_behave_like 'concurrent_increment'
|
22
|
+
it_should_behave_like 'create'
|
23
|
+
it_should_behave_like 'features'
|
24
|
+
it_should_behave_like 'increment'
|
25
|
+
it_should_behave_like 'multiprocess'
|
26
|
+
it_should_behave_like 'null_stringkey_stringvalue'
|
27
|
+
it_should_behave_like 'persist_stringkey_stringvalue'
|
28
|
+
it_should_behave_like 'returndifferent_stringkey_stringvalue'
|
29
|
+
it_should_behave_like 'store_stringkey_stringvalue'
|
30
|
+
it_should_behave_like 'store_large'
|
31
|
+
end
|
@@ -25,6 +25,7 @@ describe_moneta "adapter_activerecord" do
|
|
25
25
|
it_should_behave_like 'persist_stringkey_stringvalue'
|
26
26
|
it_should_behave_like 'returndifferent_stringkey_stringvalue'
|
27
27
|
it_should_behave_like 'store_stringkey_stringvalue'
|
28
|
+
it_should_behave_like 'store_large'
|
28
29
|
it 'updates an existing key/value' do
|
29
30
|
store['foo/bar'] = '1'
|
30
31
|
store['foo/bar'] = '2'
|
@@ -32,11 +33,29 @@ describe_moneta "adapter_activerecord" do
|
|
32
33
|
records.count.should == 1
|
33
34
|
end
|
34
35
|
|
35
|
-
it '
|
36
|
-
ActiveRecord
|
36
|
+
it 'supports different tables same database' do
|
37
|
+
store1 = Moneta::Adapters::ActiveRecord.new(:table => 'adapter_activerecord1', :connection => { :adapter => (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'), :database => 'moneta', :username => 'root' })
|
38
|
+
store2 = Moneta::Adapters::ActiveRecord.new(:table => 'adapter_activerecord2', :connection => { :adapter => (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'), :database => 'moneta', :username => 'root' })
|
37
39
|
|
38
|
-
|
39
|
-
|
40
|
+
store1['key'] = 'value1'
|
41
|
+
store2['key'] = 'value2'
|
42
|
+
store1['key'].should == 'value1'
|
43
|
+
store2['key'].should == 'value2'
|
44
|
+
|
45
|
+
store1.close
|
46
|
+
store2.close
|
40
47
|
end
|
41
48
|
|
49
|
+
it 'supports different databases same table' do
|
50
|
+
store1 = Moneta::Adapters::ActiveRecord.new(:table => 'adapter_activerecord', :connection => { :adapter => (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'), :database => 'moneta_activerecord1', :username => 'root' })
|
51
|
+
store2 = Moneta::Adapters::ActiveRecord.new(:table => 'adapter_activerecord', :connection => { :adapter => (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'), :database => 'moneta_activerecord2', :username => 'root' })
|
52
|
+
|
53
|
+
store1['key'] = 'value1'
|
54
|
+
store2['key'] = 'value2'
|
55
|
+
store1['key'].should == 'value1'
|
56
|
+
store2['key'].should == 'value2'
|
57
|
+
|
58
|
+
store1.close
|
59
|
+
store2.close
|
60
|
+
end
|
42
61
|
end
|