memcached 0.5 → 0.6
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 +2 -0
- data/Manifest +4 -2
- data/README +95 -11
- data/TODO +11 -0
- data/ext/extconf.rb +9 -1
- data/ext/libmemcached.i +12 -1
- data/ext/libmemcached_wrap.c +140 -0
- data/lib/memcached.rb +17 -0
- data/lib/memcached/behaviors.rb +6 -1
- data/lib/memcached/exceptions.rb +53 -8
- data/lib/memcached/memcached.rb +111 -35
- data/memcached.gemspec +18 -5
- data/test/benchmark/benchmark.rb +259 -0
- data/test/benchmark/benchmark_set_get.rb +56 -0
- data/test/benchmark/profile.rb +49 -0
- data/test/setup.rb +7 -5
- data/test/unit/memcached_test.rb +109 -18
- metadata +6 -5
- metadata.gz.sig +0 -0
- data/ext/libmemcached.h +0 -425
- data/test/benchmark/benchmark_test.rb +0 -42
@@ -0,0 +1,56 @@
|
|
1
|
+
|
2
|
+
HERE = File.dirname(__FILE__)
|
3
|
+
$LOAD_PATH << "#{HERE}/../../lib/"
|
4
|
+
|
5
|
+
require 'memcached'
|
6
|
+
require 'benchmark'
|
7
|
+
|
8
|
+
@value = []
|
9
|
+
@marshalled = Marshal.dump(@value)
|
10
|
+
|
11
|
+
@opts = [
|
12
|
+
['127.0.0.1:43042', '127.0.0.1:43043'],
|
13
|
+
{
|
14
|
+
:buffer_requests => true,
|
15
|
+
:no_block => true,
|
16
|
+
:namespace => "benchmark_namespace"
|
17
|
+
}
|
18
|
+
]
|
19
|
+
@key1 = "Short"
|
20
|
+
@key2 = "Sym1-2-3::45"*8
|
21
|
+
@key3 = "Long"*40
|
22
|
+
@key4 = "Medium"*8
|
23
|
+
|
24
|
+
def restart_servers
|
25
|
+
system("ruby #{HERE}/../setup.rb")
|
26
|
+
sleep(1)
|
27
|
+
end
|
28
|
+
|
29
|
+
Benchmark.bm(31) do |x|
|
30
|
+
n = 3000
|
31
|
+
restart_servers
|
32
|
+
|
33
|
+
@m = Memcached.new(*@opts)
|
34
|
+
x.report("set:ruby:memcached") do
|
35
|
+
n.times do
|
36
|
+
@m.set @key1, @value
|
37
|
+
@m.set @key2, @value
|
38
|
+
@m.set @key3, @value
|
39
|
+
@m.set @key1, @value
|
40
|
+
@m.set @key2, @value
|
41
|
+
@m.set @key3, @value
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
@m = Memcached.new(*@opts)
|
46
|
+
x.report("get:ruby:memcached") do
|
47
|
+
n.times do
|
48
|
+
@m.get @key1
|
49
|
+
@m.get @key2
|
50
|
+
@m.get @key3
|
51
|
+
@m.get @key1
|
52
|
+
@m.get @key2
|
53
|
+
@m.get @key3
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
|
2
|
+
HERE = File.dirname(__FILE__)
|
3
|
+
$LOAD_PATH << "#{HERE}/../../lib/"
|
4
|
+
|
5
|
+
require 'memcached'
|
6
|
+
require 'ostruct'
|
7
|
+
require 'benchmark'
|
8
|
+
require 'rubygems'
|
9
|
+
require 'ruby-prof'
|
10
|
+
|
11
|
+
@value = []
|
12
|
+
@marshalled = Marshal.dump(@value)
|
13
|
+
@opts = [
|
14
|
+
['127.0.0.1:43042', '127.0.0.1:43043'],
|
15
|
+
{
|
16
|
+
:buffer_requests => true,
|
17
|
+
:no_block => true,
|
18
|
+
:namespace => "benchmark_namespace"
|
19
|
+
}
|
20
|
+
]
|
21
|
+
@key1 = "Short"
|
22
|
+
@key2 = "Sym1-2-3::45"*8
|
23
|
+
@key3 = "Long"*40
|
24
|
+
@key4 = "Medium"*8
|
25
|
+
|
26
|
+
system("ruby #{HERE}/../setup.rb")
|
27
|
+
sleep(1)
|
28
|
+
|
29
|
+
@m = Memcached.new(*@opts)
|
30
|
+
|
31
|
+
result = RubyProf.profile do
|
32
|
+
1000.times do
|
33
|
+
@m.set @key1, @value
|
34
|
+
@m.set @key2, @value
|
35
|
+
@m.set @key3, @value
|
36
|
+
@m.get @key1
|
37
|
+
@m.get @key2
|
38
|
+
@m.get @key3
|
39
|
+
@m.set @key1, @value
|
40
|
+
@m.get @key1
|
41
|
+
@m.set @key2, @value
|
42
|
+
@m.get @key2
|
43
|
+
@m.set @key3, @value
|
44
|
+
@m.get @key3
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
printer = RubyProf::GraphPrinter.new(result)
|
49
|
+
printer.print(STDOUT, 0)
|
data/test/setup.rb
CHANGED
@@ -3,12 +3,14 @@
|
|
3
3
|
|
4
4
|
HERE = File.dirname(__FILE__)
|
5
5
|
|
6
|
-
`ps awx`.split("\n").grep(/4304[
|
6
|
+
`ps awx`.split("\n").grep(/4304[2-3]/).map do |process|
|
7
7
|
system("kill -9 #{process.to_i}")
|
8
8
|
end
|
9
9
|
|
10
|
-
log = "
|
11
|
-
system "
|
10
|
+
log = "/tmp/memcached.log"
|
11
|
+
system ">#{log}"
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
verbosity = (ENV['DEBUG'] ? "-vv" : "")
|
14
|
+
|
15
|
+
system "memcached #{verbosity} -p 43042 >> #{log} 2>&1 &"
|
16
|
+
system "memcached #{verbosity} -p 43043 >> #{log} 2>&1 &"
|
data/test/unit/memcached_test.rb
CHANGED
@@ -5,17 +5,28 @@ class MemcachedTest < Test::Unit::TestCase
|
|
5
5
|
|
6
6
|
def setup
|
7
7
|
@servers = ['127.0.0.1:43042', '127.0.0.1:43043']
|
8
|
+
@namespace = 'class_test_namespace'
|
8
9
|
@cache = Memcached.new(
|
9
10
|
@servers,
|
10
|
-
:namespace =>
|
11
|
+
:namespace => @namespace,
|
12
|
+
:distribution => :modula
|
13
|
+
)
|
14
|
+
@nb_cache = Memcached.new(
|
15
|
+
@servers,
|
16
|
+
:namespace => @namespace,
|
17
|
+
:no_block => true,
|
18
|
+
:buffer_requests => true,
|
19
|
+
:distribution => :modula
|
11
20
|
)
|
12
21
|
@value = OpenStruct.new(:a => 1, :b => 2, :c => GenericClass)
|
13
22
|
@marshalled_value = Marshal.dump(@value)
|
14
23
|
end
|
24
|
+
|
25
|
+
# Initialize
|
15
26
|
|
16
27
|
def test_initialize
|
17
28
|
cache = Memcached.new @servers, :namespace => 'test'
|
18
|
-
assert_equal 'test', cache.namespace
|
29
|
+
assert_equal 'test', cache.options[:namespace]
|
19
30
|
assert_equal 2, cache.send(:server_structs).size
|
20
31
|
assert_equal '127.0.0.1', cache.send(:server_structs).first.hostname
|
21
32
|
assert_equal '127.0.0.1', cache.send(:server_structs).last.hostname
|
@@ -30,18 +41,10 @@ class MemcachedTest < Test::Unit::TestCase
|
|
30
41
|
|
31
42
|
def test_initialize_without_namespace
|
32
43
|
cache = Memcached.new @servers
|
33
|
-
assert_equal nil, cache.namespace
|
44
|
+
assert_equal nil, cache.options[:namespace]
|
34
45
|
assert_equal 2, cache.send(:server_structs).size
|
35
46
|
end
|
36
47
|
|
37
|
-
def test_initialize_positive_behavior
|
38
|
-
cache = Memcached.new @servers,
|
39
|
-
:buffer_requests => true
|
40
|
-
assert_raise(Memcached::ActionQueued) do
|
41
|
-
cache.set key, @value
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
48
|
def test_initialize_negative_behavior
|
46
49
|
cache = Memcached.new @servers,
|
47
50
|
:buffer_requests => false
|
@@ -52,14 +55,16 @@ class MemcachedTest < Test::Unit::TestCase
|
|
52
55
|
|
53
56
|
def test_initialize_single_server
|
54
57
|
cache = Memcached.new '127.0.0.1:43042'
|
55
|
-
assert_equal nil, cache.namespace
|
58
|
+
assert_equal nil, cache.options[:namespace]
|
56
59
|
assert_equal 1, cache.send(:server_structs).size
|
57
60
|
end
|
58
61
|
|
59
62
|
def test_initialize_strange_argument
|
60
63
|
assert_raise(ArgumentError) { Memcached.new 1 }
|
61
64
|
end
|
62
|
-
|
65
|
+
|
66
|
+
# Get
|
67
|
+
|
63
68
|
def test_get
|
64
69
|
@cache.set key, @value
|
65
70
|
result = @cache.get key
|
@@ -71,7 +76,7 @@ class MemcachedTest < Test::Unit::TestCase
|
|
71
76
|
result = @cache.get key, false
|
72
77
|
direct_result = Libmemcached.memcached_get(
|
73
78
|
@cache.instance_variable_get("@struct"),
|
74
|
-
"#{@
|
79
|
+
"#{@namespace}#{key}"
|
75
80
|
).first
|
76
81
|
assert_equal result, direct_result
|
77
82
|
end
|
@@ -95,7 +100,7 @@ class MemcachedTest < Test::Unit::TestCase
|
|
95
100
|
result = @cache.get key, false
|
96
101
|
non_wrapped_result = Libmemcached.memcached_get(
|
97
102
|
@cache.instance_variable_get("@struct"),
|
98
|
-
"#{@
|
103
|
+
"#{@namespace}#{key}"
|
99
104
|
).first
|
100
105
|
assert result.size > non_wrapped_result.size
|
101
106
|
end
|
@@ -111,6 +116,13 @@ class MemcachedTest < Test::Unit::TestCase
|
|
111
116
|
assert_equal [1, 2],
|
112
117
|
@cache.get(["#{key}_1", "#{key}_2"])
|
113
118
|
end
|
119
|
+
|
120
|
+
def test_get_multi_missing
|
121
|
+
@cache.set "#{key}_1", 1
|
122
|
+
@cache.delete "#{key}_2" rescue nil
|
123
|
+
ary = @cache.get(["#{key}_1", "#{key}_2"])
|
124
|
+
assert_instance_of Memcached::NotFound, ary.last
|
125
|
+
end
|
114
126
|
|
115
127
|
def test_set_and_get_unmarshalled
|
116
128
|
@cache.set key, @value
|
@@ -118,6 +130,8 @@ class MemcachedTest < Test::Unit::TestCase
|
|
118
130
|
assert_equal @marshalled_value, result
|
119
131
|
end
|
120
132
|
|
133
|
+
# Set
|
134
|
+
|
121
135
|
def test_set
|
122
136
|
assert_nothing_raised do
|
123
137
|
@cache.set(key, @value)
|
@@ -147,6 +161,8 @@ class MemcachedTest < Test::Unit::TestCase
|
|
147
161
|
end
|
148
162
|
end
|
149
163
|
|
164
|
+
# Delete
|
165
|
+
|
150
166
|
def test_delete
|
151
167
|
@cache.set key, @value
|
152
168
|
@cache.delete key
|
@@ -161,6 +177,8 @@ class MemcachedTest < Test::Unit::TestCase
|
|
161
177
|
@cache.delete key
|
162
178
|
end
|
163
179
|
end
|
180
|
+
|
181
|
+
# Add
|
164
182
|
|
165
183
|
def test_add
|
166
184
|
@cache.delete key rescue nil
|
@@ -193,6 +211,8 @@ class MemcachedTest < Test::Unit::TestCase
|
|
193
211
|
assert_equal @marshalled_value, @cache.get(key, false)
|
194
212
|
assert_equal @value, @cache.get(key)
|
195
213
|
end
|
214
|
+
|
215
|
+
# Increment and decrement
|
196
216
|
|
197
217
|
def test_increment
|
198
218
|
@cache.set key, 10, 0, false
|
@@ -204,7 +224,7 @@ class MemcachedTest < Test::Unit::TestCase
|
|
204
224
|
assert_equal 15, @cache.increment(key, 5)
|
205
225
|
end
|
206
226
|
|
207
|
-
def test_missing_increment
|
227
|
+
def test_missing_increment; return
|
208
228
|
# XXX Fails due to libmemcached bug
|
209
229
|
@cache.delete key rescue nil
|
210
230
|
assert_raise(Memcached::NotFound) do
|
@@ -222,7 +242,7 @@ class MemcachedTest < Test::Unit::TestCase
|
|
222
242
|
assert_equal 5, @cache.decrement(key, 5)
|
223
243
|
end
|
224
244
|
|
225
|
-
def test_missing_decrement
|
245
|
+
def test_missing_decrement; return
|
226
246
|
# XXX Fails due to libmemcached bug
|
227
247
|
@cache.delete key rescue nil
|
228
248
|
assert_raise(Memcached::NotFound) do
|
@@ -230,6 +250,8 @@ class MemcachedTest < Test::Unit::TestCase
|
|
230
250
|
end
|
231
251
|
end
|
232
252
|
|
253
|
+
# Replace
|
254
|
+
|
233
255
|
def test_replace
|
234
256
|
@cache.set key, nil
|
235
257
|
assert_nothing_raised do
|
@@ -247,6 +269,8 @@ class MemcachedTest < Test::Unit::TestCase
|
|
247
269
|
assert_equal @value, @cache.get(key)
|
248
270
|
end
|
249
271
|
end
|
272
|
+
|
273
|
+
# Append and prepend
|
250
274
|
|
251
275
|
def test_append
|
252
276
|
@cache.set key, "start", 0, false
|
@@ -285,8 +309,14 @@ class MemcachedTest < Test::Unit::TestCase
|
|
285
309
|
end
|
286
310
|
|
287
311
|
def test_cas
|
288
|
-
|
312
|
+
assert_raise Memcached::NotImplemented do
|
313
|
+
@cache.cas(key) do
|
314
|
+
@value
|
315
|
+
end
|
316
|
+
end
|
289
317
|
end
|
318
|
+
|
319
|
+
# Stats
|
290
320
|
|
291
321
|
def test_stats
|
292
322
|
stats = @cache.stats
|
@@ -295,11 +325,72 @@ class MemcachedTest < Test::Unit::TestCase
|
|
295
325
|
assert_instance_of String, stats[:version].first
|
296
326
|
end
|
297
327
|
|
328
|
+
# Clone
|
329
|
+
|
298
330
|
def test_clone
|
299
331
|
cache = @cache.clone
|
300
332
|
assert_equal cache.servers, @cache.servers
|
301
333
|
assert_not_equal cache, @cache
|
302
334
|
end
|
335
|
+
|
336
|
+
# Non-blocking IO
|
337
|
+
|
338
|
+
def test_buffered_requests_return_value
|
339
|
+
cache = Memcached.new @servers,
|
340
|
+
:buffer_requests => true
|
341
|
+
assert_nothing_raised do
|
342
|
+
cache.set key, @value
|
343
|
+
end
|
344
|
+
ret = Libmemcached.memcached_set(
|
345
|
+
cache.instance_variable_get("@struct"),
|
346
|
+
"#{@namespace}#{key}",
|
347
|
+
@marshalled_value,
|
348
|
+
0,
|
349
|
+
Memcached::FLAGS
|
350
|
+
)
|
351
|
+
assert_equal 31, ret
|
352
|
+
end
|
353
|
+
|
354
|
+
def test_no_block_return_value
|
355
|
+
assert_nothing_raised do
|
356
|
+
@nb_cache.set key, @value
|
357
|
+
end
|
358
|
+
ret = Libmemcached.memcached_set(
|
359
|
+
@nb_cache.instance_variable_get("@struct"),
|
360
|
+
"#{@namespace}#{key}",
|
361
|
+
@marshalled_value,
|
362
|
+
0,
|
363
|
+
Memcached::FLAGS
|
364
|
+
)
|
365
|
+
assert_equal 31, ret
|
366
|
+
end
|
367
|
+
|
368
|
+
def test_no_block_missing_delete
|
369
|
+
@nb_cache.delete key rescue nil
|
370
|
+
assert_nothing_raised do
|
371
|
+
@nb_cache.delete key
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
def test_no_block_set_invalid_key
|
376
|
+
assert_nothing_raised do
|
377
|
+
@nb_cache.set "I'm so bad", @value
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
def test_no_block_set_object_too_large
|
382
|
+
assert_nothing_raised do
|
383
|
+
@nb_cache.set key, "I'm big" * 1000000
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
387
|
+
def test_no_block_existing_add
|
388
|
+
# Should still raise
|
389
|
+
@nb_cache.set key, @value
|
390
|
+
assert_raise(Memcached::NotStored) do
|
391
|
+
@nb_cache.add key, @value
|
392
|
+
end
|
393
|
+
end
|
303
394
|
|
304
395
|
def test_thread_contention
|
305
396
|
threads = []
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: memcached
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.6"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan Weaver
|
@@ -30,7 +30,7 @@ cert_chain:
|
|
30
30
|
yZ0=
|
31
31
|
-----END CERTIFICATE-----
|
32
32
|
|
33
|
-
date: 2008-01-
|
33
|
+
date: 2008-01-21 00:00:00 -05:00
|
34
34
|
default_executable:
|
35
35
|
dependencies: []
|
36
36
|
|
@@ -45,7 +45,6 @@ extra_rdoc_files: []
|
|
45
45
|
files:
|
46
46
|
- CHANGELOG
|
47
47
|
- ext/extconf.rb
|
48
|
-
- ext/libmemcached.h
|
49
48
|
- ext/libmemcached.i
|
50
49
|
- ext/libmemcached_wrap.c
|
51
50
|
- lib/memcached/behaviors.rb
|
@@ -56,12 +55,15 @@ files:
|
|
56
55
|
- LICENSE
|
57
56
|
- Manifest
|
58
57
|
- README
|
59
|
-
- test/benchmark/
|
58
|
+
- test/benchmark/benchmark.rb
|
59
|
+
- test/benchmark/benchmark_set_get.rb
|
60
|
+
- test/benchmark/profile.rb
|
60
61
|
- test/setup.rb
|
61
62
|
- test/teardown.rb
|
62
63
|
- test/test_helper.rb
|
63
64
|
- test/unit/binding_test.rb
|
64
65
|
- test/unit/memcached_test.rb
|
66
|
+
- TODO
|
65
67
|
- memcached.gemspec
|
66
68
|
has_rdoc: true
|
67
69
|
homepage: http://blog.evanweaver.com/files/doc/fauna/memcached/
|
@@ -91,7 +93,6 @@ signing_key:
|
|
91
93
|
specification_version: 2
|
92
94
|
summary: An interface to the libmemcached C client.
|
93
95
|
test_files:
|
94
|
-
- test/benchmark/benchmark_test.rb
|
95
96
|
- test/test_helper.rb
|
96
97
|
- test/unit/binding_test.rb
|
97
98
|
- test/unit/memcached_test.rb
|
metadata.gz.sig
CHANGED
Binary file
|
data/ext/libmemcached.h
DELETED
@@ -1,425 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* Summary: interface for memcached server
|
3
|
-
* Description: main include file for libmemcached
|
4
|
-
*
|
5
|
-
* Copy: See Copyright for the status of this software.
|
6
|
-
*
|
7
|
-
* Author: Brian Aker
|
8
|
-
*/
|
9
|
-
|
10
|
-
#ifndef __MEMCACHED_H__
|
11
|
-
#define __MEMCACHED_H__
|
12
|
-
|
13
|
-
#include <stdlib.h>
|
14
|
-
#include <inttypes.h>
|
15
|
-
#include <sys/types.h>
|
16
|
-
#include <netinet/in.h>
|
17
|
-
|
18
|
-
#ifdef __cplusplus
|
19
|
-
extern "C" {
|
20
|
-
#endif
|
21
|
-
|
22
|
-
typedef struct memcached_st memcached_st;
|
23
|
-
typedef struct memcached_stat_st memcached_stat_st;
|
24
|
-
typedef struct memcached_result_st memcached_result_st;
|
25
|
-
typedef struct memcached_string_st memcached_string_st;
|
26
|
-
typedef struct memcached_server_st memcached_server_st;
|
27
|
-
|
28
|
-
#define MEMCACHED_VERSION_STRING 12
|
29
|
-
#define MEMCACHED_DEFAULT_PORT 11211
|
30
|
-
#define MEMCACHED_DEFAULT_COMMAND_SIZE 350
|
31
|
-
#define SMALL_STRING_LEN 1024
|
32
|
-
#define HUGE_STRING_LEN 8196
|
33
|
-
#define MEMCACHED_MAX_KEY 251 /* We add one to have it null terminated */
|
34
|
-
#define MEMCACHED_MAX_BUFFER HUGE_STRING_LEN
|
35
|
-
#define MEMCACHED_MAX_HOST_LENGTH 64
|
36
|
-
#define MEMCACHED_WHEEL_SIZE 1024
|
37
|
-
#define MEMCACHED_STRIDE 4
|
38
|
-
#define MEMCACHED_DEFAULT_TIMEOUT INT32_MAX
|
39
|
-
|
40
|
-
typedef enum {
|
41
|
-
MEMCACHED_SUCCESS,
|
42
|
-
MEMCACHED_FAILURE,
|
43
|
-
MEMCACHED_HOST_LOOKUP_FAILURE,
|
44
|
-
MEMCACHED_CONNECTION_FAILURE,
|
45
|
-
MEMCACHED_CONNECTION_BIND_FAILURE,
|
46
|
-
MEMCACHED_WRITE_FAILURE,
|
47
|
-
MEMCACHED_READ_FAILURE,
|
48
|
-
MEMCACHED_UNKNOWN_READ_FAILURE,
|
49
|
-
MEMCACHED_PROTOCOL_ERROR,
|
50
|
-
MEMCACHED_CLIENT_ERROR,
|
51
|
-
MEMCACHED_SERVER_ERROR,
|
52
|
-
MEMCACHED_CONNECTION_SOCKET_CREATE_FAILURE,
|
53
|
-
MEMCACHED_DATA_EXISTS,
|
54
|
-
MEMCACHED_DATA_DOES_NOT_EXIST,
|
55
|
-
MEMCACHED_NOTSTORED,
|
56
|
-
MEMCACHED_STORED,
|
57
|
-
MEMCACHED_NOTFOUND,
|
58
|
-
MEMCACHED_MEMORY_ALLOCATION_FAILURE,
|
59
|
-
MEMCACHED_PARTIAL_READ,
|
60
|
-
MEMCACHED_SOME_ERRORS,
|
61
|
-
MEMCACHED_NO_SERVERS,
|
62
|
-
MEMCACHED_END,
|
63
|
-
MEMCACHED_DELETED,
|
64
|
-
MEMCACHED_VALUE,
|
65
|
-
MEMCACHED_STAT,
|
66
|
-
MEMCACHED_ERRNO,
|
67
|
-
MEMCACHED_FAIL_UNIX_SOCKET,
|
68
|
-
MEMCACHED_NOT_SUPPORTED,
|
69
|
-
MEMCACHED_NO_KEY_PROVIDED,
|
70
|
-
MEMCACHED_FETCH_NOTFINISHED,
|
71
|
-
MEMCACHED_TIMEOUT,
|
72
|
-
MEMCACHED_BUFFERED,
|
73
|
-
MEMCACHED_MAXIMUM_RETURN, /* Always add new error code before */
|
74
|
-
} memcached_return;
|
75
|
-
|
76
|
-
typedef enum {
|
77
|
-
MEMCACHED_DISTRIBUTION_MODULA,
|
78
|
-
MEMCACHED_DISTRIBUTION_CONSISTENT,
|
79
|
-
} memcached_server_distribution;
|
80
|
-
|
81
|
-
typedef enum {
|
82
|
-
MEMCACHED_BEHAVIOR_NO_BLOCK,
|
83
|
-
MEMCACHED_BEHAVIOR_TCP_NODELAY,
|
84
|
-
MEMCACHED_BEHAVIOR_HASH,
|
85
|
-
MEMCACHED_BEHAVIOR_KETAMA,
|
86
|
-
MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE,
|
87
|
-
MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE,
|
88
|
-
MEMCACHED_BEHAVIOR_CACHE_LOOKUPS,
|
89
|
-
MEMCACHED_BEHAVIOR_SUPPORT_CAS,
|
90
|
-
MEMCACHED_BEHAVIOR_POLL_TIMEOUT,
|
91
|
-
MEMCACHED_BEHAVIOR_DISTRIBUTION,
|
92
|
-
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS,
|
93
|
-
MEMCACHED_BEHAVIOR_USER_DATA,
|
94
|
-
} memcached_behavior;
|
95
|
-
|
96
|
-
typedef enum {
|
97
|
-
MEMCACHED_HASH_DEFAULT= 0,
|
98
|
-
MEMCACHED_HASH_MD5,
|
99
|
-
MEMCACHED_HASH_CRC,
|
100
|
-
MEMCACHED_HASH_FNV1_64,
|
101
|
-
MEMCACHED_HASH_FNV1A_64,
|
102
|
-
MEMCACHED_HASH_FNV1_32,
|
103
|
-
MEMCACHED_HASH_FNV1A_32,
|
104
|
-
MEMCACHED_HASH_KETAMA,
|
105
|
-
MEMCACHED_HASH_HSIEH,
|
106
|
-
} memcached_hash;
|
107
|
-
|
108
|
-
typedef enum {
|
109
|
-
MEMCACHED_CONNECTION_UNKNOWN,
|
110
|
-
MEMCACHED_CONNECTION_TCP,
|
111
|
-
MEMCACHED_CONNECTION_UDP,
|
112
|
-
MEMCACHED_CONNECTION_UNIX_SOCKET,
|
113
|
-
} memcached_connection;
|
114
|
-
|
115
|
-
typedef enum {
|
116
|
-
MEMCACHED_NOT_ALLOCATED,
|
117
|
-
MEMCACHED_ALLOCATED,
|
118
|
-
MEMCACHED_USED,
|
119
|
-
} memcached_allocated;
|
120
|
-
|
121
|
-
struct memcached_server_st {
|
122
|
-
char hostname[MEMCACHED_MAX_HOST_LENGTH];
|
123
|
-
unsigned int port;
|
124
|
-
int fd;
|
125
|
-
unsigned int cursor_active;
|
126
|
-
char write_buffer[MEMCACHED_MAX_BUFFER];
|
127
|
-
size_t write_buffer_offset;
|
128
|
-
char *write_ptr;
|
129
|
-
char read_buffer[MEMCACHED_MAX_BUFFER];
|
130
|
-
size_t read_data_length;
|
131
|
-
size_t read_buffer_length;
|
132
|
-
char *read_ptr;
|
133
|
-
memcached_allocated sockaddr_inited;
|
134
|
-
struct addrinfo *address_info;
|
135
|
-
memcached_connection type;
|
136
|
-
uint8_t major_version;
|
137
|
-
uint8_t minor_version;
|
138
|
-
uint8_t micro_version;
|
139
|
-
uint16_t count;
|
140
|
-
};
|
141
|
-
|
142
|
-
struct memcached_stat_st {
|
143
|
-
uint32_t pid;
|
144
|
-
uint32_t uptime;
|
145
|
-
uint32_t threads;
|
146
|
-
uint32_t time;
|
147
|
-
uint32_t pointer_size;
|
148
|
-
uint32_t rusage_user_seconds;
|
149
|
-
uint32_t rusage_user_microseconds;
|
150
|
-
uint32_t rusage_system_seconds;
|
151
|
-
uint32_t rusage_system_microseconds;
|
152
|
-
uint32_t curr_items;
|
153
|
-
uint32_t total_items;
|
154
|
-
uint32_t limit_maxbytes;
|
155
|
-
uint32_t curr_connections;
|
156
|
-
uint32_t total_connections;
|
157
|
-
uint32_t connection_structures;
|
158
|
-
uint64_t bytes;
|
159
|
-
uint64_t cmd_get;
|
160
|
-
uint64_t cmd_set;
|
161
|
-
uint64_t get_hits;
|
162
|
-
uint64_t get_misses;
|
163
|
-
uint64_t evictions;
|
164
|
-
uint64_t bytes_read;
|
165
|
-
uint64_t bytes_written;
|
166
|
-
char version[MEMCACHED_VERSION_STRING];
|
167
|
-
};
|
168
|
-
|
169
|
-
struct memcached_string_st {
|
170
|
-
memcached_st *root;
|
171
|
-
memcached_allocated is_allocated;
|
172
|
-
char *string;
|
173
|
-
char *end;
|
174
|
-
size_t current_size;
|
175
|
-
size_t block_size;
|
176
|
-
};
|
177
|
-
|
178
|
-
struct memcached_result_st {
|
179
|
-
memcached_allocated is_allocated;
|
180
|
-
memcached_st *root;
|
181
|
-
char key[MEMCACHED_MAX_KEY];
|
182
|
-
size_t key_length;
|
183
|
-
memcached_string_st value;
|
184
|
-
uint32_t flags;
|
185
|
-
uint64_t cas;
|
186
|
-
/* Add result callback function */
|
187
|
-
};
|
188
|
-
|
189
|
-
struct memcached_st {
|
190
|
-
memcached_allocated is_allocated;
|
191
|
-
memcached_server_st *hosts;
|
192
|
-
unsigned int number_of_hosts;
|
193
|
-
unsigned int cursor_server;
|
194
|
-
char connected;
|
195
|
-
int cached_errno;
|
196
|
-
unsigned long long flags;
|
197
|
-
int send_size;
|
198
|
-
int recv_size;
|
199
|
-
int32_t poll_timeout;
|
200
|
-
memcached_result_st result;
|
201
|
-
memcached_hash hash;
|
202
|
-
memcached_server_distribution distribution;
|
203
|
-
void *user_data;
|
204
|
-
unsigned int wheel[MEMCACHED_WHEEL_SIZE];
|
205
|
-
#ifdef NOT_USED /* Future Use */
|
206
|
-
uint8_t replicas;
|
207
|
-
memcached_return warning;
|
208
|
-
#endif
|
209
|
-
};
|
210
|
-
|
211
|
-
/* Public API */
|
212
|
-
memcached_st *memcached_create(memcached_st *ptr);
|
213
|
-
void memcached_free(memcached_st *ptr);
|
214
|
-
memcached_st *memcached_clone(memcached_st *clone, memcached_st *ptr);
|
215
|
-
|
216
|
-
memcached_return memcached_delete(memcached_st *ptr, char *key, size_t key_length,
|
217
|
-
time_t expiration);
|
218
|
-
memcached_return memcached_increment(memcached_st *ptr,
|
219
|
-
char *key, size_t key_length,
|
220
|
-
uint32_t offset,
|
221
|
-
uint64_t *value);
|
222
|
-
memcached_return memcached_decrement(memcached_st *ptr,
|
223
|
-
char *key, size_t key_length,
|
224
|
-
uint32_t offset,
|
225
|
-
uint64_t *value);
|
226
|
-
void memcached_stat_free(memcached_st *, memcached_stat_st *);
|
227
|
-
memcached_stat_st *memcached_stat(memcached_st *ptr, char *args, memcached_return *error);
|
228
|
-
memcached_return memcached_stat_servername(memcached_stat_st *stat, char *args,
|
229
|
-
char *hostname, unsigned int port);
|
230
|
-
memcached_return memcached_flush(memcached_st *ptr, time_t expiration);
|
231
|
-
memcached_return memcached_verbosity(memcached_st *ptr, unsigned int verbosity);
|
232
|
-
void memcached_quit(memcached_st *ptr);
|
233
|
-
char *memcached_strerror(memcached_st *ptr, memcached_return rc);
|
234
|
-
memcached_return memcached_behavior_set(memcached_st *ptr, memcached_behavior flag, void *data);
|
235
|
-
unsigned long long memcached_behavior_get(memcached_st *ptr, memcached_behavior flag);
|
236
|
-
|
237
|
-
/* All of the functions for adding data to the server */
|
238
|
-
memcached_return memcached_set(memcached_st *ptr, char *key, size_t key_length,
|
239
|
-
char *value, size_t value_length,
|
240
|
-
time_t expiration,
|
241
|
-
uint32_t flags);
|
242
|
-
memcached_return memcached_add(memcached_st *ptr, char *key, size_t key_length,
|
243
|
-
char *value, size_t value_length,
|
244
|
-
time_t expiration,
|
245
|
-
uint32_t flags);
|
246
|
-
memcached_return memcached_replace(memcached_st *ptr, char *key, size_t key_length,
|
247
|
-
char *value, size_t value_length,
|
248
|
-
time_t expiration,
|
249
|
-
uint32_t flags);
|
250
|
-
memcached_return memcached_append(memcached_st *ptr,
|
251
|
-
char *key, size_t key_length,
|
252
|
-
char *value, size_t value_length,
|
253
|
-
time_t expiration,
|
254
|
-
uint32_t flags);
|
255
|
-
memcached_return memcached_prepend(memcached_st *ptr,
|
256
|
-
char *key, size_t key_length,
|
257
|
-
char *value, size_t value_length,
|
258
|
-
time_t expiration,
|
259
|
-
uint32_t flags);
|
260
|
-
memcached_return memcached_cas(memcached_st *ptr,
|
261
|
-
char *key, size_t key_length,
|
262
|
-
char *value, size_t value_length,
|
263
|
-
time_t expiration,
|
264
|
-
uint32_t flags,
|
265
|
-
uint64_t cas);
|
266
|
-
|
267
|
-
/* Get functions */
|
268
|
-
char *memcached_get(memcached_st *ptr, char *key, size_t key_length,
|
269
|
-
size_t *value_length,
|
270
|
-
uint32_t *flags,
|
271
|
-
memcached_return *error);
|
272
|
-
memcached_return memcached_mget(memcached_st *ptr,
|
273
|
-
char **keys, size_t *key_length,
|
274
|
-
unsigned int number_of_keys);
|
275
|
-
char *memcached_fetch(memcached_st *ptr, char *key, size_t *key_length,
|
276
|
-
size_t *value_length, uint32_t *flags,
|
277
|
-
memcached_return *error);
|
278
|
-
memcached_result_st *memcached_fetch_result(memcached_st *ptr,
|
279
|
-
memcached_result_st *result,
|
280
|
-
memcached_return *error);
|
281
|
-
|
282
|
-
/* Server Public functions */
|
283
|
-
#define memcached_server_count(A) (A)->number_of_hosts
|
284
|
-
#define memcached_server_name(A,B) (B).hostname
|
285
|
-
#define memcached_server_port(A,B) (B).port
|
286
|
-
#define memcached_server_list(A) (A)->hosts
|
287
|
-
#define memcached_server_response_count(A,B) (A)->hosts[B].cursor_active
|
288
|
-
|
289
|
-
memcached_return memcached_server_add_udp(memcached_st *ptr,
|
290
|
-
char *hostname,
|
291
|
-
unsigned int port);
|
292
|
-
memcached_return memcached_server_add_unix_socket(memcached_st *ptr,
|
293
|
-
char *filename);
|
294
|
-
memcached_return memcached_server_add(memcached_st *ptr, char *hostname,
|
295
|
-
unsigned int port);
|
296
|
-
void memcached_server_list_free(memcached_server_st *ptr);
|
297
|
-
memcached_return memcached_server_push(memcached_st *ptr, memcached_server_st *list);
|
298
|
-
|
299
|
-
memcached_server_st *memcached_server_list_append(memcached_server_st *ptr,
|
300
|
-
char *hostname, unsigned int port,
|
301
|
-
memcached_return *error);
|
302
|
-
unsigned int memcached_server_list_count(memcached_server_st *ptr);
|
303
|
-
memcached_server_st *memcached_servers_parse(char *server_strings);
|
304
|
-
|
305
|
-
char *memcached_stat_get_value(memcached_st *ptr, memcached_stat_st *stat,
|
306
|
-
char *key, memcached_return *error);
|
307
|
-
char ** memcached_stat_get_keys(memcached_st *ptr, memcached_stat_st *stat,
|
308
|
-
memcached_return *error);
|
309
|
-
|
310
|
-
char *memcached_get_by_key(memcached_st *ptr,
|
311
|
-
char *master_key, size_t master_key_length,
|
312
|
-
char *key, size_t key_length,
|
313
|
-
size_t *value_length,
|
314
|
-
uint32_t *flags,
|
315
|
-
memcached_return *error);
|
316
|
-
|
317
|
-
memcached_return memcached_mget_by_key(memcached_st *ptr,
|
318
|
-
char *master_key, size_t master_key_length,
|
319
|
-
char **keys, size_t *key_length,
|
320
|
-
unsigned int number_of_keys);
|
321
|
-
|
322
|
-
memcached_return memcached_set_by_key(memcached_st *ptr,
|
323
|
-
char *master_key, size_t master_key_length,
|
324
|
-
char *key, size_t key_length,
|
325
|
-
char *value, size_t value_length,
|
326
|
-
time_t expiration,
|
327
|
-
uint32_t flags);
|
328
|
-
|
329
|
-
memcached_return memcached_add_by_key(memcached_st *ptr,
|
330
|
-
char *master_key, size_t master_key_length,
|
331
|
-
char *key, size_t key_length,
|
332
|
-
char *value, size_t value_length,
|
333
|
-
time_t expiration,
|
334
|
-
uint32_t flags);
|
335
|
-
|
336
|
-
memcached_return memcached_replace_by_key(memcached_st *ptr,
|
337
|
-
char *master_key, size_t master_key_length,
|
338
|
-
char *key, size_t key_length,
|
339
|
-
char *value, size_t value_length,
|
340
|
-
time_t expiration,
|
341
|
-
uint32_t flags);
|
342
|
-
|
343
|
-
memcached_return memcached_prepend_by_key(memcached_st *ptr,
|
344
|
-
char *master_key, size_t master_key_length,
|
345
|
-
char *key, size_t key_length,
|
346
|
-
char *value, size_t value_length,
|
347
|
-
time_t expiration,
|
348
|
-
uint32_t flags);
|
349
|
-
|
350
|
-
memcached_return memcached_append_by_key(memcached_st *ptr,
|
351
|
-
char *master_key, size_t master_key_length,
|
352
|
-
char *key, size_t key_length,
|
353
|
-
char *value, size_t value_length,
|
354
|
-
time_t expiration,
|
355
|
-
uint32_t flags);
|
356
|
-
|
357
|
-
memcached_return memcached_cas_by_key(memcached_st *ptr,
|
358
|
-
char *master_key, size_t master_key_length,
|
359
|
-
char *key, size_t key_length,
|
360
|
-
char *value, size_t value_length,
|
361
|
-
time_t expiration,
|
362
|
-
uint32_t flags,
|
363
|
-
uint64_t cas);
|
364
|
-
memcached_return memcached_delete_by_key(memcached_st *ptr,
|
365
|
-
char *master_key, size_t master_key_length,
|
366
|
-
char *key, size_t key_length,
|
367
|
-
time_t expiration);
|
368
|
-
|
369
|
-
memcached_return memcached_fetch_execute(memcached_st *ptr,
|
370
|
-
unsigned int (*callback[])(memcached_st *ptr, memcached_result_st *result, void *context),
|
371
|
-
void *context,
|
372
|
-
unsigned int number_of_callbacks
|
373
|
-
);
|
374
|
-
|
375
|
-
/* Result Struct */
|
376
|
-
void memcached_result_free(memcached_result_st *result);
|
377
|
-
memcached_result_st *memcached_result_create(memcached_st *ptr,
|
378
|
-
memcached_result_st *result);
|
379
|
-
#define memcached_result_key_value(A) (A)->key
|
380
|
-
#define memcached_result_key_length(A) (A)->key_length
|
381
|
-
#ifdef FIX
|
382
|
-
#define memcached_result_value(A) memcached_string_value((A)->value)
|
383
|
-
#define memcached_result_length(A) memcached_string_length((A)->value)
|
384
|
-
#else
|
385
|
-
char *memcached_result_value(memcached_result_st *ptr);
|
386
|
-
size_t memcached_result_length(memcached_result_st *ptr);
|
387
|
-
#endif
|
388
|
-
#define memcached_result_flags(A) (A)->flags
|
389
|
-
#define memcached_result_cas(A) (A)->cas
|
390
|
-
|
391
|
-
|
392
|
-
#ifndef __WATCHPOINT_H__
|
393
|
-
#define __WATCHPOINT_H__
|
394
|
-
/* Some personal debugging functions */
|
395
|
-
#ifdef HAVE_DEBUG
|
396
|
-
#define WATCHPOINT fprintf(stderr, "\nWATCHPOINT %s:%d (%s)\n", __FILE__, __LINE__,__func__);fflush(stdout);
|
397
|
-
#ifdef __MEMCACHED_H__
|
398
|
-
#define WATCHPOINT_ERROR(A) fprintf(stderr, "\nWATCHPOINT %s:%d %s\n", __FILE__, __LINE__, memcached_strerror(NULL, A));fflush(stdout);
|
399
|
-
#define WATCHPOINT_IFERROR(A) if(A != MEMCACHED_SUCCESS)fprintf(stderr, "\nWATCHPOINT %s:%d %s\n", __FILE__, __LINE__, memcached_strerror(NULL, A));fflush(stdout);
|
400
|
-
#endif
|
401
|
-
#define WATCHPOINT_STRING(A) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %s\n", __FILE__, __LINE__,__func__,A);fflush(stdout);
|
402
|
-
#define WATCHPOINT_STRING_LENGTH(A,B) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %.*s\n", __FILE__, __LINE__,__func__,(int)B,A);fflush(stdout);
|
403
|
-
#define WATCHPOINT_NUMBER(A) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %zu\n", __FILE__, __LINE__,__func__,(size_t)(A));fflush(stdout);
|
404
|
-
#define WATCHPOINT_ERRNO(A) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %s\n", __FILE__, __LINE__,__func__, strerror(A));A= 0;fflush(stdout);
|
405
|
-
#define WATCHPOINT_ASSERT(A) assert((A));
|
406
|
-
#else
|
407
|
-
#define WATCHPOINT
|
408
|
-
#ifdef __MEMCACHED_H__
|
409
|
-
#define WATCHPOINT_ERROR(A)
|
410
|
-
#define WATCHPOINT_IFERROR(A)
|
411
|
-
#endif
|
412
|
-
#define WATCHPOINT_STRING(A)
|
413
|
-
#define WATCHPOINT_NUMBER(A)
|
414
|
-
#define WATCHPOINT_ERRNO(A)
|
415
|
-
#define WATCHPOINT_ASSERT(A)
|
416
|
-
#endif
|
417
|
-
|
418
|
-
#endif /* __WATCHPOINT_H__ */
|
419
|
-
|
420
|
-
|
421
|
-
#ifdef __cplusplus
|
422
|
-
}
|
423
|
-
#endif
|
424
|
-
|
425
|
-
#endif /* __MEMCACHED_H__ */
|