memcached 0.5 → 0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -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[1-3]/).map do |process|
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 = "#{HERE}/log/memcached.log"
11
- system "touch #{log}"
10
+ log = "/tmp/memcached.log"
11
+ system ">#{log}"
12
12
 
13
- system "memcached -vv -p 43042 >> #{log} 2>&1 &"
14
- system "memcached -vv -p 43043 >> #{log} 2>&1 &"
13
+ verbosity = (ENV['DEBUG'] ? "-vv" : "")
14
+
15
+ system "memcached #{verbosity} -p 43042 >> #{log} 2>&1 &"
16
+ system "memcached #{verbosity} -p 43043 >> #{log} 2>&1 &"
@@ -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 => 'class_test_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
- "#{@cache.namespace}#{key}"
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
- "#{@cache.namespace}#{key}"
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
- # XXX Not implemented
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.5"
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-20 00:00:00 -05:00
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/benchmark_test.rb
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__ */