memcached 0.10 → 0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data.tar.gz.sig +0 -0
- data/CHANGELOG +4 -2
- data/COMPATIBILITY +1 -0
- data/Manifest +1 -1
- data/README +4 -4
- data/Rakefile +30 -0
- data/TODO +3 -3
- data/ext/rlibmemcached.i +20 -37
- data/ext/rlibmemcached_wrap.c +815 -799
- data/lib/memcached.rb +4 -0
- data/lib/memcached/behaviors.rb +8 -7
- data/lib/memcached/memcached.rb +53 -76
- data/lib/memcached/rails.rb +1 -1
- data/memcached.gemspec +103 -56
- data/test/profile/benchmark.rb +1 -1
- data/test/profile/profile.rb +1 -1
- data/test/profile/valgrind.rb +1 -1
- data/test/unit/memcached_test.rb +136 -121
- data/test/unit/rails_test.rb +1 -1
- metadata +17 -8
- metadata.gz.sig +0 -0
- data/test/profile/key.rb +0 -41
data/lib/memcached.rb
CHANGED
@@ -20,8 +20,12 @@ require 'rlibmemcached'
|
|
20
20
|
|
21
21
|
class Memcached
|
22
22
|
Lib = Rlibmemcached
|
23
|
+
REQUIRED_VERSION = File.read("#{File.dirname(__FILE__)}/../COMPATIBILITY")[/:: ([\d\.]+)/, 1]
|
24
|
+
RECEIVED_VERSION = Lib.memcached_lib_version
|
25
|
+
raise LoadError, "Requires libmemcached #{REQUIRED_VERSION}; you have #{RECEIVED_VERSION}" unless REQUIRED_VERSION == RECEIVED_VERSION
|
23
26
|
end
|
24
27
|
|
28
|
+
|
25
29
|
require 'memcached/integer'
|
26
30
|
require 'memcached/exceptions'
|
27
31
|
require 'memcached/behaviors'
|
data/lib/memcached/behaviors.rb
CHANGED
@@ -3,9 +3,9 @@ class Memcached
|
|
3
3
|
|
4
4
|
#:stopdoc:
|
5
5
|
|
6
|
-
def self.load_constants(prefix, hash = {}
|
6
|
+
def self.load_constants(prefix, hash = {})
|
7
7
|
Lib.constants.grep(/^#{prefix}/).each do |const_name|
|
8
|
-
hash[const_name[prefix.length..-1].downcase.to_sym] = Lib.const_get(const_name)
|
8
|
+
hash[const_name[prefix.length..-1].downcase.to_sym] = Lib.const_get(const_name)
|
9
9
|
end
|
10
10
|
hash
|
11
11
|
end
|
@@ -18,10 +18,10 @@ class Memcached
|
|
18
18
|
}
|
19
19
|
|
20
20
|
HASH_VALUES = {}
|
21
|
-
BEHAVIOR_VALUES.merge!(load_constants("MEMCACHED_HASH_", HASH_VALUES
|
21
|
+
BEHAVIOR_VALUES.merge!(load_constants("MEMCACHED_HASH_", HASH_VALUES))
|
22
22
|
|
23
23
|
DISTRIBUTION_VALUES = {}
|
24
|
-
BEHAVIOR_VALUES.merge!(load_constants("MEMCACHED_DISTRIBUTION_", DISTRIBUTION_VALUES
|
24
|
+
BEHAVIOR_VALUES.merge!(load_constants("MEMCACHED_DISTRIBUTION_", DISTRIBUTION_VALUES))
|
25
25
|
|
26
26
|
DIRECT_VALUE_BEHAVIORS = [:retry_timeout, :connect_timeout, :socket_recv_size, :poll_timeout, :socket_send_size]
|
27
27
|
|
@@ -43,9 +43,10 @@ class Memcached
|
|
43
43
|
raise(ArgumentError, msg) unless BEHAVIOR_VALUES[value]
|
44
44
|
end
|
45
45
|
|
46
|
-
|
47
|
-
#
|
48
|
-
Lib.memcached_behavior_set(@struct, b_id,
|
46
|
+
lib_value = BEHAVIOR_VALUES[value] || value
|
47
|
+
#STDERR.puts "Setting #{behavior}:#{b_id} => #{value} (#{lib_value})"
|
48
|
+
Lib.memcached_behavior_set(@struct, b_id, lib_value)
|
49
|
+
#STDERR.puts " -> set to #{get_behavior(behavior).inspect}"
|
49
50
|
end
|
50
51
|
|
51
52
|
# Get a behavior value for this Memcached instance. Accepts a Symbol.
|
data/lib/memcached/memcached.rb
CHANGED
@@ -18,12 +18,11 @@ class Memcached
|
|
18
18
|
:retry_timeout => 60,
|
19
19
|
# :poll_timeout => 5,
|
20
20
|
:connect_timeout => 5,
|
21
|
-
:
|
21
|
+
:prefix_key => nil,
|
22
22
|
:sort_hosts => false,
|
23
|
-
:failover => false
|
23
|
+
:failover => false,
|
24
|
+
:verify_key => true
|
24
25
|
}
|
25
|
-
|
26
|
-
# :verify_key => false # XXX We do this ourselves already in Rlibmemcached.ns()
|
27
26
|
|
28
27
|
#:stopdoc:
|
29
28
|
IGNORED = 0
|
@@ -36,22 +35,22 @@ class Memcached
|
|
36
35
|
###### Configuration
|
37
36
|
|
38
37
|
=begin rdoc
|
39
|
-
Create a new Memcached instance. Accepts a single server string such as '
|
40
|
-
|
41
|
-
Hostname lookups are not currently supported; you need to use the IP address.
|
38
|
+
Create a new Memcached instance. Accepts a single server string such as 'localhost:11211', or an array of such strings, as well an an optional configuration hash.
|
42
39
|
|
43
40
|
Valid option parameters are:
|
44
41
|
|
45
|
-
<tt>:
|
42
|
+
<tt>:prefix_key</tt>:: A string to prepend to every key, for namespacing. Max length is 11.
|
46
43
|
<tt>:hash</tt>:: The name of a hash function to use. Possible values are: <tt>:crc</tt>, <tt>:default</tt>, <tt>:fnv1_32</tt>, <tt>:fnv1_64</tt>, <tt>:fnv1a_32</tt>, <tt>:fnv1a_64</tt>, <tt>:hsieh</tt>, <tt>:md5</tt>, and <tt>:murmur</tt>. <tt>:default</tt> is the fastest. Use <tt>:md5</tt> for compatibility with other ketama clients.
|
47
44
|
<tt>:distribution</tt>:: Either <tt>:modula</tt>, <tt>:consistent</tt>, or <tt>:consistent_wheel</tt>. Defaults to <tt>:consistent</tt>, which is ketama-compatible.
|
48
45
|
<tt>:failover</tt>:: Whether to permanently eject failed hosts from the pool. Defaults to <tt>false</tt>. Note that in the event of a server failure, <tt>:failover</tt> will remap the entire pool unless <tt>:distribution</tt> is set to <tt>:consistent</tt>.
|
46
|
+
<tt>:cache_lookups</tt>:: Whether to cache hostname lookups for the life of the instance. Defaults to <tt>true</tt>.
|
49
47
|
<tt>:support_cas</tt>:: Flag CAS support in the client. Accepts <tt>true</tt> or <tt>false</tt>. Defaults to <tt>false</tt> because it imposes a slight performance penalty. Note that your server must also support CAS or you will trigger <b>Memcached::ProtocolError</b> exceptions.
|
50
48
|
<tt>:tcp_nodelay</tt>:: Turns on the no-delay feature for connecting sockets. Accepts <tt>true</tt> or <tt>false</tt>. Performance may or may not change, depending on your system.
|
51
49
|
<tt>:no_block</tt>:: Whether to use non-blocking, asynchronous IO for writes. Accepts <tt>true</tt> or <tt>false</tt>.
|
52
50
|
<tt>:buffer_requests</tt>:: Whether to use an internal write buffer. Accepts <tt>true</tt> or <tt>false</tt>. Calling <tt>get</tt> or closing the connection will force the buffer to flush. Note that <tt>:buffer_requests</tt> might not work well without <tt>:no_block</tt> also enabled.
|
53
51
|
<tt>:show_not_found_backtraces</tt>:: Whether <b>Memcached::NotFound</b> exceptions should include backtraces. Generating backtraces is slow, so this is off by default. Turn it on to ease debugging.
|
54
52
|
<tt>:sort_hosts</tt>:: Whether to force the server list to stay sorted. This defeats consistent hashing and is rarely useful.
|
53
|
+
<tt>:verify_key</tt>:: Validate keys before accepting them. Never disable this.
|
55
54
|
|
56
55
|
Please note that when non-blocking IO is enabled, setter and deleter methods do not raise on errors. For example, if you try to set an invalid key with <tt>:no_block => true</tt>, it will appear to succeed. The actual setting of the key occurs after libmemcached has returned control to your program, so there is no way to backtrack and raise the exception.
|
57
56
|
|
@@ -61,9 +60,6 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
61
60
|
@struct = Lib::MemcachedSt.new
|
62
61
|
Lib.memcached_create(@struct)
|
63
62
|
|
64
|
-
# Set the servers on the struct
|
65
|
-
set_servers(servers)
|
66
|
-
|
67
63
|
# Merge option defaults
|
68
64
|
@options = DEFAULTS.merge(opts)
|
69
65
|
|
@@ -72,6 +68,9 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
72
68
|
# consistently
|
73
69
|
options[:no_block] = true if options[:buffer_requests]
|
74
70
|
|
71
|
+
# Legacy accessor
|
72
|
+
options[:prefix_key] = options.delete(:namespace) if options[:namespace]
|
73
|
+
|
75
74
|
# Disallow :sort_hosts with consistent hashing
|
76
75
|
if options[:sort_hosts] and options[:distribution] == :consistent
|
77
76
|
raise ArgumentError, ":sort_hosts defeats :consistent hashing"
|
@@ -79,20 +78,14 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
79
78
|
|
80
79
|
# Set the behaviors on the struct
|
81
80
|
set_behaviors
|
82
|
-
|
83
|
-
# Merge the actual behaviors back in
|
84
|
-
BEHAVIORS.keys.each do |behavior|
|
85
|
-
options[behavior] = get_behavior(behavior)
|
86
|
-
end
|
81
|
+
set_callbacks
|
87
82
|
|
88
83
|
# Freeze the hash
|
89
84
|
options.freeze
|
85
|
+
|
86
|
+
# Set the servers on the struct
|
87
|
+
set_servers(servers)
|
90
88
|
|
91
|
-
# Namespace
|
92
|
-
raise ArgumentError, "Invalid namespace" if options[:namespace].to_s =~ / /
|
93
|
-
@namespace = options[:namespace].to_s
|
94
|
-
@namespace_size = @namespace.size
|
95
|
-
|
96
89
|
# Not found exceptions
|
97
90
|
# Note that these have global effects since the NotFound class itself is modified. You should only
|
98
91
|
# be enabling the backtrace for debugging purposes, so it's not really a big deal.
|
@@ -100,8 +93,7 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
100
93
|
NotFound.restore_backtraces
|
101
94
|
else
|
102
95
|
NotFound.remove_backtraces
|
103
|
-
end
|
104
|
-
|
96
|
+
end
|
105
97
|
end
|
106
98
|
|
107
99
|
# Return the array of server strings used to configure this instance.
|
@@ -114,43 +106,22 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
114
106
|
# Safely copy this instance. Returns a Memcached instance.
|
115
107
|
#
|
116
108
|
# <tt>clone</tt> is useful for threading, since each thread must have its own unshared Memcached
|
117
|
-
# object.
|
109
|
+
# object.
|
118
110
|
#
|
119
111
|
def clone
|
120
112
|
memcached = super
|
121
113
|
memcached.instance_variable_set('@struct', Lib.memcached_clone(nil, @struct))
|
122
114
|
memcached
|
123
115
|
end
|
124
|
-
|
125
|
-
# Destroy this instance. Frees memory associated with the C implementation.
|
126
|
-
#
|
127
|
-
# Accepts an optional parameter <tt>disable_methods</tt>. When <tt>false</tt>, destroy
|
128
|
-
# runs much faster, but your instance will segfault if you try to call any other methods on it
|
129
|
-
# after destroy. Defaults to <tt>true</tt>, which safely overwrites all instance methods.
|
130
|
-
def destroy(disable_methods = true)
|
131
|
-
# XXX Should be implemented with rb_wrap_struct
|
132
|
-
Lib.memcached_free(@struct)
|
133
|
-
@struct = nil
|
134
116
|
|
135
|
-
if disable_methods
|
136
|
-
class << self
|
137
|
-
Memcached.instance_methods.each do |method_name|
|
138
|
-
define_method method_name do |*args|
|
139
|
-
raise Memcached::ClientError, "Instance has been explicitly destroyed"
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
117
|
# Reset the state of the libmemcached struct. This is useful for changing the server list at runtime.
|
147
118
|
def reset(current_servers = nil)
|
148
119
|
current_servers ||= servers
|
149
|
-
Lib.memcached_free(@struct)
|
150
120
|
@struct = Lib::MemcachedSt.new
|
151
121
|
Lib.memcached_create(@struct)
|
152
|
-
set_servers(current_servers)
|
153
122
|
set_behaviors
|
123
|
+
set_callbacks
|
124
|
+
set_servers(current_servers)
|
154
125
|
end
|
155
126
|
|
156
127
|
#:stopdoc:
|
@@ -185,7 +156,7 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
185
156
|
def set(key, value, timeout=0, marshal=true)
|
186
157
|
value = marshal ? Marshal.dump(value) : value.to_s
|
187
158
|
check_return_code(
|
188
|
-
Lib.memcached_set(@struct,
|
159
|
+
Lib.memcached_set(@struct, key, value, timeout, FLAGS)
|
189
160
|
)
|
190
161
|
end
|
191
162
|
|
@@ -193,7 +164,7 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
193
164
|
def add(key, value, timeout=0, marshal=true)
|
194
165
|
value = marshal ? Marshal.dump(value) : value.to_s
|
195
166
|
check_return_code(
|
196
|
-
Lib.memcached_add(@struct,
|
167
|
+
Lib.memcached_add(@struct, key, value, timeout, FLAGS)
|
197
168
|
)
|
198
169
|
end
|
199
170
|
|
@@ -203,14 +174,14 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
203
174
|
#
|
204
175
|
# Note that the key must be initialized to an unmarshalled integer first, via <tt>set</tt>, <tt>add</tt>, or <tt>replace</tt> with <tt>marshal</tt> set to <tt>false</tt>.
|
205
176
|
def increment(key, offset=1)
|
206
|
-
ret, value = Lib.memcached_increment(@struct,
|
177
|
+
ret, value = Lib.memcached_increment(@struct, key, offset)
|
207
178
|
check_return_code(ret)
|
208
179
|
value
|
209
180
|
end
|
210
181
|
|
211
182
|
# Decrement a key's value. The parameters and exception behavior are the same as <tt>increment</tt>.
|
212
183
|
def decrement(key, offset=1)
|
213
|
-
ret, value = Lib.memcached_decrement(@struct,
|
184
|
+
ret, value = Lib.memcached_decrement(@struct, key, offset)
|
214
185
|
check_return_code(ret)
|
215
186
|
value
|
216
187
|
end
|
@@ -224,7 +195,7 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
224
195
|
def replace(key, value, timeout=0, marshal=true)
|
225
196
|
value = marshal ? Marshal.dump(value) : value.to_s
|
226
197
|
check_return_code(
|
227
|
-
Lib.memcached_replace(@struct,
|
198
|
+
Lib.memcached_replace(@struct, key, value, timeout, FLAGS)
|
228
199
|
)
|
229
200
|
end
|
230
201
|
|
@@ -234,7 +205,7 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
234
205
|
def append(key, value)
|
235
206
|
# Requires memcached 1.2.4
|
236
207
|
check_return_code(
|
237
|
-
Lib.memcached_append(@struct,
|
208
|
+
Lib.memcached_append(@struct, key, value.to_s, IGNORED, FLAGS)
|
238
209
|
)
|
239
210
|
end
|
240
211
|
|
@@ -242,7 +213,7 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
242
213
|
def prepend(key, value)
|
243
214
|
# Requires memcached 1.2.4
|
244
215
|
check_return_code(
|
245
|
-
Lib.memcached_prepend(@struct,
|
216
|
+
Lib.memcached_prepend(@struct, key, value.to_s, IGNORED, FLAGS)
|
246
217
|
)
|
247
218
|
end
|
248
219
|
|
@@ -260,7 +231,7 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
260
231
|
value = marshal ? Marshal.dump(value) : value.to_s
|
261
232
|
|
262
233
|
check_return_code(
|
263
|
-
Lib.memcached_cas(@struct,
|
234
|
+
Lib.memcached_cas(@struct, key, value, timeout, FLAGS, @struct.result.cas)
|
264
235
|
)
|
265
236
|
end
|
266
237
|
|
@@ -269,7 +240,7 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
269
240
|
# Deletes a key/value pair from the server. Accepts a String <tt>key</tt>. Raises <b>Memcached::NotFound</b> if the key does not exist.
|
270
241
|
def delete(key)
|
271
242
|
check_return_code(
|
272
|
-
Lib.memcached_delete(@struct,
|
243
|
+
Lib.memcached_delete(@struct, key, IGNORED)
|
273
244
|
)
|
274
245
|
end
|
275
246
|
|
@@ -295,23 +266,24 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
295
266
|
def get(keys, marshal=true)
|
296
267
|
if keys.is_a? Array
|
297
268
|
# Multi get
|
298
|
-
keys.map! { |key|
|
269
|
+
keys.map! { |key| key }
|
299
270
|
hash = {}
|
300
271
|
|
301
|
-
Lib.memcached_mget(@struct, keys);
|
272
|
+
ret = Lib.memcached_mget(@struct, keys);
|
273
|
+
check_return_code(ret)
|
302
274
|
|
303
275
|
keys.size.times do
|
304
276
|
value, key, flags, ret = Lib.memcached_fetch_rvalue(@struct)
|
305
277
|
break if ret == Lib::MEMCACHED_END
|
306
278
|
check_return_code(ret)
|
307
279
|
value = Marshal.load(value) if marshal
|
308
|
-
# Assign the value
|
309
|
-
hash[key
|
280
|
+
# Assign the value
|
281
|
+
hash[key] = value
|
310
282
|
end
|
311
283
|
hash
|
312
284
|
else
|
313
285
|
# Single get
|
314
|
-
value, flags, ret = Lib.memcached_get_rvalue(@struct,
|
286
|
+
value, flags, ret = Lib.memcached_get_rvalue(@struct, keys)
|
315
287
|
check_return_code(ret)
|
316
288
|
value = Marshal.load(value) if marshal
|
317
289
|
value
|
@@ -356,12 +328,7 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
356
328
|
### Operations helpers
|
357
329
|
|
358
330
|
private
|
359
|
-
|
360
|
-
# Returns the hash value for a master key
|
361
|
-
def hash(key)
|
362
|
-
Lib.memcached_generate_hash(@struct, Lib.ns(@namespace, key))
|
363
|
-
end
|
364
|
-
|
331
|
+
|
365
332
|
# Checks the return code from Rlibmemcached against the exception list. Raises the corresponding exception if the return code is not Memcached::Success or Memcached::ActionQueued. Accepts an integer return code.
|
366
333
|
def check_return_code(ret) #:doc:
|
367
334
|
# 0.16 --enable-debug returns 0 for an ActionQueued result but --disable-debug does not
|
@@ -394,8 +361,8 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
394
361
|
# Set the servers on the struct
|
395
362
|
def set_servers(servers)
|
396
363
|
Array(servers).each_with_index do |server, index|
|
397
|
-
unless server.is_a? String and server =~ /^
|
398
|
-
raise ArgumentError, "Servers must be in the format
|
364
|
+
unless server.is_a? String and server =~ /^[\w\d\.]+(:\d{1,5})?$/
|
365
|
+
raise ArgumentError, "Servers must be in the format host:port (e.g., 'localhost:11211')"
|
399
366
|
end
|
400
367
|
host, port = server.split(":")
|
401
368
|
Lib.memcached_server_add(@struct, host, port.to_i)
|
@@ -404,11 +371,21 @@ Please note that when non-blocking IO is enabled, setter and deleter methods do
|
|
404
371
|
|
405
372
|
# Set the behaviors on the struct from the current options
|
406
373
|
def set_behaviors
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
374
|
+
BEHAVIORS.keys.each do |behavior|
|
375
|
+
set_behavior(behavior, options[behavior]) if options.key?(behavior)
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
# Set the callbacks on the struct from the current options
|
380
|
+
def set_callbacks
|
381
|
+
# Only support prefix_key for now
|
382
|
+
if options[:prefix_key]
|
383
|
+
# XXX Libmemcached doesn't validate the key length properly
|
384
|
+
if options[:prefix_key].size > Lib::MEMCACHED_PREFIX_KEY_MAX_SIZE - 1
|
385
|
+
raise ArgumentError, "Max prefix_key size is #{Lib::MEMCACHED_PREFIX_KEY_MAX_SIZE - 1}"
|
386
|
+
end
|
387
|
+
Lib.memcached_callback_set(@struct, Lib::MEMCACHED_CALLBACK_PREFIX_KEY, options[:prefix_key])
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
414
391
|
end
|
data/lib/memcached/rails.rb
CHANGED
data/memcached.gemspec
CHANGED
@@ -1,61 +1,108 @@
|
|
1
1
|
|
2
|
-
# Gem::Specification for Memcached-0.
|
2
|
+
# Gem::Specification for Memcached-0.11
|
3
3
|
# Originally generated by Echoe
|
4
4
|
|
5
|
-
Gem::Specification
|
6
|
-
|
7
|
-
|
5
|
+
--- !ruby/object:Gem::Specification
|
6
|
+
name: memcached
|
7
|
+
version: !ruby/object:Gem::Version
|
8
|
+
version: "0.11"
|
9
|
+
platform: ruby
|
10
|
+
authors:
|
11
|
+
- Evan Weaver
|
12
|
+
autorequire:
|
13
|
+
bindir: bin
|
14
|
+
date: 2008-07-14 00:00:00 -04:00
|
15
|
+
default_executable:
|
16
|
+
dependencies:
|
17
|
+
- !ruby/object:Gem::Dependency
|
18
|
+
name: echoe
|
19
|
+
type: :development
|
20
|
+
version_requirement:
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: "0"
|
26
|
+
version:
|
27
|
+
description: An interface to the libmemcached C client.
|
28
|
+
email: ""
|
29
|
+
executables: []
|
8
30
|
|
9
|
-
|
31
|
+
extensions:
|
32
|
+
- ext/extconf.rb
|
33
|
+
extra_rdoc_files:
|
34
|
+
- BENCHMARKS
|
35
|
+
- CHANGELOG
|
36
|
+
- COMPATIBILITY
|
37
|
+
- lib/memcached/behaviors.rb
|
38
|
+
- lib/memcached/exceptions.rb
|
39
|
+
- lib/memcached/memcached.rb
|
40
|
+
- lib/memcached/rails.rb
|
41
|
+
- lib/memcached.rb
|
42
|
+
- LICENSE
|
43
|
+
- README
|
44
|
+
- TODO
|
45
|
+
files:
|
46
|
+
- BENCHMARKS
|
47
|
+
- CHANGELOG
|
48
|
+
- COMPATIBILITY
|
49
|
+
- ext/extconf.rb
|
50
|
+
- ext/rlibmemcached.i
|
51
|
+
- ext/rlibmemcached_wrap.c
|
52
|
+
- lib/memcached/behaviors.rb
|
53
|
+
- lib/memcached/exceptions.rb
|
54
|
+
- lib/memcached/integer.rb
|
55
|
+
- lib/memcached/memcached.rb
|
56
|
+
- lib/memcached/rails.rb
|
57
|
+
- lib/memcached.rb
|
58
|
+
- LICENSE
|
59
|
+
- Manifest
|
60
|
+
- Rakefile
|
61
|
+
- README
|
62
|
+
- test/profile/benchmark.rb
|
63
|
+
- test/profile/profile.rb
|
64
|
+
- test/profile/valgrind.rb
|
65
|
+
- test/setup.rb
|
66
|
+
- test/teardown.rb
|
67
|
+
- test/test_helper.rb
|
68
|
+
- test/unit/binding_test.rb
|
69
|
+
- test/unit/memcached_test.rb
|
70
|
+
- test/unit/rails_test.rb
|
71
|
+
- TODO
|
72
|
+
- memcached.gemspec
|
73
|
+
has_rdoc: true
|
74
|
+
homepage: http://blog.evanweaver.com/files/doc/fauna/memcached/
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options:
|
77
|
+
- --line-numbers
|
78
|
+
- --inline-source
|
79
|
+
- --title
|
80
|
+
- Memcached
|
81
|
+
- --main
|
82
|
+
- README
|
83
|
+
require_paths:
|
84
|
+
- lib
|
85
|
+
- ext
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: "0"
|
91
|
+
version:
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: "1.2"
|
97
|
+
version:
|
98
|
+
requirements: []
|
10
99
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
s.homepage = %q{http://blog.evanweaver.com/files/doc/fauna/memcached/}
|
21
|
-
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Memcached", "--main", "README"]
|
22
|
-
s.require_paths = ["lib", "ext"]
|
23
|
-
s.rubyforge_project = %q{fauna}
|
24
|
-
s.rubygems_version = %q{1.1.0}
|
25
|
-
s.summary = %q{An interface to the libmemcached C client.}
|
26
|
-
s.test_files = ["test/test_helper.rb", "test/unit/binding_test.rb", "test/unit/memcached_test.rb", "test/unit/rails_test.rb"]
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
|
-
# # Original Rakefile source (requires the Echoe gem):
|
31
|
-
#
|
32
|
-
# require 'echoe'
|
33
|
-
#
|
34
|
-
# Echoe.new("memcached") do |p|
|
35
|
-
# p.author = "Evan Weaver"
|
36
|
-
# p.project = "fauna"
|
37
|
-
# p.summary = "An interface to the libmemcached C client."
|
38
|
-
# p.url = "http://blog.evanweaver.com/files/doc/fauna/memcached/"
|
39
|
-
# p.docs_host = "blog.evanweaver.com:~/www/bax/public/files/doc/"
|
40
|
-
# p.rdoc_pattern = /README|TODO|LICENSE|CHANGELOG|BENCH|COMPAT|exceptions|behaviors|rails.rb|memcached.rb/
|
41
|
-
# end
|
42
|
-
#
|
43
|
-
# task :exceptions do
|
44
|
-
# $LOAD_PATH << "lib"
|
45
|
-
# require 'memcached'
|
46
|
-
# Memcached.constants.sort.each do |const_name|
|
47
|
-
# const = Memcached.send(:const_get, const_name)
|
48
|
-
# next if const == Memcached::Success or const == Memcached::Stored
|
49
|
-
# if const.is_a? Class and const < Memcached::Error
|
50
|
-
# puts "* Memcached::#{const_name}"
|
51
|
-
# end
|
52
|
-
# end
|
53
|
-
# end
|
54
|
-
#
|
55
|
-
# task :valgrind do
|
56
|
-
# exec("valgrind --tool=memcheck --leak-check=yes --show-reachable=no --num-callers=15 --track-fds=yes ruby #{File.dirname(__FILE__)}/test/profile/valgrind.rb")
|
57
|
-
# end
|
58
|
-
#
|
59
|
-
# task :profile do
|
60
|
-
# exec("ruby #{File.dirname(__FILE__)}/test/profile/profile.rb")
|
61
|
-
# end
|
100
|
+
rubyforge_project: fauna
|
101
|
+
rubygems_version: 1.2.0
|
102
|
+
specification_version: 2
|
103
|
+
summary: An interface to the libmemcached C client.
|
104
|
+
test_files:
|
105
|
+
- test/test_helper.rb
|
106
|
+
- test/unit/binding_test.rb
|
107
|
+
- test/unit/memcached_test.rb
|
108
|
+
- test/unit/rails_test.rb
|