vinted-memcached 1.8.0

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.
Files changed (210) hide show
  1. checksums.yaml +7 -0
  2. data/BENCHMARKS +142 -0
  3. data/CHANGELOG +176 -0
  4. data/Gemfile +11 -0
  5. data/Gemfile.lock +45 -0
  6. data/LICENSE +184 -0
  7. data/Manifest +209 -0
  8. data/README.rdoc +124 -0
  9. data/Rakefile +134 -0
  10. data/TODO +1 -0
  11. data/ext/extconf-make.rb +25 -0
  12. data/ext/extconf.rb +78 -0
  13. data/ext/libmemcached-0.32/AUTHORS +7 -0
  14. data/ext/libmemcached-0.32/COPYING +32 -0
  15. data/ext/libmemcached-0.32/ChangeLog +303 -0
  16. data/ext/libmemcached-0.32/INSTALL +302 -0
  17. data/ext/libmemcached-0.32/Makefile.am +36 -0
  18. data/ext/libmemcached-0.32/Makefile.in +911 -0
  19. data/ext/libmemcached-0.32/NEWS +1 -0
  20. data/ext/libmemcached-0.32/README +33 -0
  21. data/ext/libmemcached-0.32/THANKS +14 -0
  22. data/ext/libmemcached-0.32/TODO +11 -0
  23. data/ext/libmemcached-0.32/aclocal.m4 +2108 -0
  24. data/ext/libmemcached-0.32/clients/Makefile.am +80 -0
  25. data/ext/libmemcached-0.32/clients/Makefile.in +773 -0
  26. data/ext/libmemcached-0.32/clients/client_options.h +32 -0
  27. data/ext/libmemcached-0.32/clients/execute.c +64 -0
  28. data/ext/libmemcached-0.32/clients/execute.h +5 -0
  29. data/ext/libmemcached-0.32/clients/generator.c +74 -0
  30. data/ext/libmemcached-0.32/clients/generator.h +20 -0
  31. data/ext/libmemcached-0.32/clients/memcat.c +178 -0
  32. data/ext/libmemcached-0.32/clients/memcp.c +251 -0
  33. data/ext/libmemcached-0.32/clients/memdump.c +170 -0
  34. data/ext/libmemcached-0.32/clients/memerror.c +80 -0
  35. data/ext/libmemcached-0.32/clients/memflush.c +143 -0
  36. data/ext/libmemcached-0.32/clients/memrm.c +160 -0
  37. data/ext/libmemcached-0.32/clients/memslap.c +441 -0
  38. data/ext/libmemcached-0.32/clients/memstat.c +326 -0
  39. data/ext/libmemcached-0.32/clients/utilities.c +207 -0
  40. data/ext/libmemcached-0.32/clients/utilities.h +41 -0
  41. data/ext/libmemcached-0.32/config/compile +143 -0
  42. data/ext/libmemcached-0.32/config/config.guess +1561 -0
  43. data/ext/libmemcached-0.32/config/config.rpath +666 -0
  44. data/ext/libmemcached-0.32/config/config.sub +1686 -0
  45. data/ext/libmemcached-0.32/config/depcomp +630 -0
  46. data/ext/libmemcached-0.32/config/install-sh +520 -0
  47. data/ext/libmemcached-0.32/config/ltmain.sh +9636 -0
  48. data/ext/libmemcached-0.32/config/missing +376 -0
  49. data/ext/libmemcached-0.32/config.h.in +254 -0
  50. data/ext/libmemcached-0.32/configure +23843 -0
  51. data/ext/libmemcached-0.32/configure.ac +120 -0
  52. data/ext/libmemcached-0.32/libmemcached/Makefile.am +111 -0
  53. data/ext/libmemcached-0.32/libmemcached/Makefile.in +1069 -0
  54. data/ext/libmemcached-0.32/libmemcached/byteorder.c +31 -0
  55. data/ext/libmemcached-0.32/libmemcached/common.h +189 -0
  56. data/ext/libmemcached-0.32/libmemcached/crc.c +86 -0
  57. data/ext/libmemcached-0.32/libmemcached/hsieh_hash.c +68 -0
  58. data/ext/libmemcached-0.32/libmemcached/jenkins_hash.c +213 -0
  59. data/ext/libmemcached-0.32/libmemcached/libmemcached.ver +1 -0
  60. data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.d +30 -0
  61. data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.h +82 -0
  62. data/ext/libmemcached-0.32/libmemcached/md5.c +354 -0
  63. data/ext/libmemcached-0.32/libmemcached/memcached/README.txt +7 -0
  64. data/ext/libmemcached-0.32/libmemcached/memcached/protocol_binary.h +385 -0
  65. data/ext/libmemcached-0.32/libmemcached/memcached.c +153 -0
  66. data/ext/libmemcached-0.32/libmemcached/memcached.h +305 -0
  67. data/ext/libmemcached-0.32/libmemcached/memcached.hpp +799 -0
  68. data/ext/libmemcached-0.32/libmemcached/memcached_allocators.c +72 -0
  69. data/ext/libmemcached-0.32/libmemcached/memcached_analyze.c +100 -0
  70. data/ext/libmemcached-0.32/libmemcached/memcached_auto.c +207 -0
  71. data/ext/libmemcached-0.32/libmemcached/memcached_behavior.c +290 -0
  72. data/ext/libmemcached-0.32/libmemcached/memcached_callback.c +175 -0
  73. data/ext/libmemcached-0.32/libmemcached/memcached_configure.h.in +23 -0
  74. data/ext/libmemcached-0.32/libmemcached/memcached_connect.c +371 -0
  75. data/ext/libmemcached-0.32/libmemcached/memcached_constants.h +146 -0
  76. data/ext/libmemcached-0.32/libmemcached/memcached_delete.c +0 -0
  77. data/ext/libmemcached-0.32/libmemcached/memcached_do.c +72 -0
  78. data/ext/libmemcached-0.32/libmemcached/memcached_dump.c +79 -0
  79. data/ext/libmemcached-0.32/libmemcached/memcached_exist.c +114 -0
  80. data/ext/libmemcached-0.32/libmemcached/memcached_exist.h +20 -0
  81. data/ext/libmemcached-0.32/libmemcached/memcached_fetch.c +102 -0
  82. data/ext/libmemcached-0.32/libmemcached/memcached_flush.c +89 -0
  83. data/ext/libmemcached-0.32/libmemcached/memcached_flush_buffers.c +23 -0
  84. data/ext/libmemcached-0.32/libmemcached/memcached_get.c +494 -0
  85. data/ext/libmemcached-0.32/libmemcached/memcached_get.h +87 -0
  86. data/ext/libmemcached-0.32/libmemcached/memcached_hash.c +252 -0
  87. data/ext/libmemcached-0.32/libmemcached/memcached_hosts.c +510 -0
  88. data/ext/libmemcached-0.32/libmemcached/memcached_internal.h +31 -0
  89. data/ext/libmemcached-0.32/libmemcached/memcached_io.c +594 -0
  90. data/ext/libmemcached-0.32/libmemcached/memcached_io.h +72 -0
  91. data/ext/libmemcached-0.32/libmemcached/memcached_key.c +28 -0
  92. data/ext/libmemcached-0.32/libmemcached/memcached_parse.c +74 -0
  93. data/ext/libmemcached-0.32/libmemcached/memcached_pool.h +38 -0
  94. data/ext/libmemcached-0.32/libmemcached/memcached_purge.c +76 -0
  95. data/ext/libmemcached-0.32/libmemcached/memcached_quit.c +75 -0
  96. data/ext/libmemcached-0.32/libmemcached/memcached_response.c +529 -0
  97. data/ext/libmemcached-0.32/libmemcached/memcached_result.c +57 -0
  98. data/ext/libmemcached-0.32/libmemcached/memcached_result.h +59 -0
  99. data/ext/libmemcached-0.32/libmemcached/memcached_sasl.c +225 -0
  100. data/ext/libmemcached-0.32/libmemcached/memcached_sasl.h +44 -0
  101. data/ext/libmemcached-0.32/libmemcached/memcached_server.c +159 -0
  102. data/ext/libmemcached-0.32/libmemcached/memcached_server.h +93 -0
  103. data/ext/libmemcached-0.32/libmemcached/memcached_stats.c +437 -0
  104. data/ext/libmemcached-0.32/libmemcached/memcached_storage.c +514 -0
  105. data/ext/libmemcached-0.32/libmemcached/memcached_storage.h +107 -0
  106. data/ext/libmemcached-0.32/libmemcached/memcached_strerror.c +92 -0
  107. data/ext/libmemcached-0.32/libmemcached/memcached_string.c +138 -0
  108. data/ext/libmemcached-0.32/libmemcached/memcached_string.h +53 -0
  109. data/ext/libmemcached-0.32/libmemcached/memcached_touch.c +60 -0
  110. data/ext/libmemcached-0.32/libmemcached/memcached_touch.h +31 -0
  111. data/ext/libmemcached-0.32/libmemcached/memcached_types.h +44 -0
  112. data/ext/libmemcached-0.32/libmemcached/memcached_util.h +15 -0
  113. data/ext/libmemcached-0.32/libmemcached/memcached_verbosity.c +36 -0
  114. data/ext/libmemcached-0.32/libmemcached/memcached_version.c +112 -0
  115. data/ext/libmemcached-0.32/libmemcached/memcached_watchpoint.h +38 -0
  116. data/ext/libmemcached-0.32/libmemcached/murmur_hash.c +76 -0
  117. data/ext/libmemcached-0.32/libmemcached/visibility.h +51 -0
  118. data/ext/libmemcached-0.32/libmemcachedutil/Makefile.am +11 -0
  119. data/ext/libmemcached-0.32/libmemcachedutil/Makefile.in +604 -0
  120. data/ext/libmemcached-0.32/libmemcachedutil/libmemcachedutil.ver +1 -0
  121. data/ext/libmemcached-0.32/libmemcachedutil/memcached_pool.c +170 -0
  122. data/ext/libmemcached-0.32/m4/ac_cxx_compile_stdcxx_0x.m4 +103 -0
  123. data/ext/libmemcached-0.32/m4/ac_cxx_header_stdcxx_98.m4 +67 -0
  124. data/ext/libmemcached-0.32/m4/acx_pthread.m4 +276 -0
  125. data/ext/libmemcached-0.32/m4/byteorder.m4 +40 -0
  126. data/ext/libmemcached-0.32/m4/deprecated.m4 +17 -0
  127. data/ext/libmemcached-0.32/m4/enable_utillib.m4 +16 -0
  128. data/ext/libmemcached-0.32/m4/extensions.m4 +94 -0
  129. data/ext/libmemcached-0.32/m4/hsieh.m4 +18 -0
  130. data/ext/libmemcached-0.32/m4/lib-prefix.m4 +221 -0
  131. data/ext/libmemcached-0.32/m4/libtool.m4 +7831 -0
  132. data/ext/libmemcached-0.32/m4/ltoptions.m4 +369 -0
  133. data/ext/libmemcached-0.32/m4/ltsugar.m4 +123 -0
  134. data/ext/libmemcached-0.32/m4/ltversion.m4 +23 -0
  135. data/ext/libmemcached-0.32/m4/lt~obsolete.m4 +98 -0
  136. data/ext/libmemcached-0.32/m4/memcached.m4 +30 -0
  137. data/ext/libmemcached-0.32/m4/pandora_64bit.m4 +55 -0
  138. data/ext/libmemcached-0.32/m4/pandora_canonical.m4 +151 -0
  139. data/ext/libmemcached-0.32/m4/pandora_check_compiler_version.m4 +37 -0
  140. data/ext/libmemcached-0.32/m4/pandora_check_cxx_standard.m4 +16 -0
  141. data/ext/libmemcached-0.32/m4/pandora_enable_dtrace.m4 +41 -0
  142. data/ext/libmemcached-0.32/m4/pandora_ensure_gcc_version.m4 +36 -0
  143. data/ext/libmemcached-0.32/m4/pandora_have_better_malloc.m4 +54 -0
  144. data/ext/libmemcached-0.32/m4/pandora_have_sasl.m4 +133 -0
  145. data/ext/libmemcached-0.32/m4/pandora_header_assert.m4 +23 -0
  146. data/ext/libmemcached-0.32/m4/pandora_libtool.m4 +15 -0
  147. data/ext/libmemcached-0.32/m4/pandora_optimize.m4 +79 -0
  148. data/ext/libmemcached-0.32/m4/pandora_shared_ptr.m4 +56 -0
  149. data/ext/libmemcached-0.32/m4/pandora_vc_build.m4 +32 -0
  150. data/ext/libmemcached-0.32/m4/pandora_warnings.m4 +262 -0
  151. data/ext/libmemcached-0.32/m4/pod2man.m4 +7 -0
  152. data/ext/libmemcached-0.32/m4/protocol_binary.m4 +23 -0
  153. data/ext/libmemcached-0.32/m4/setsockopt.m4 +57 -0
  154. data/ext/libmemcached-0.32/m4/visibility.m4 +52 -0
  155. data/ext/libmemcached-0.32/support/Makefile.am +4 -0
  156. data/ext/libmemcached-0.32/support/Makefile.in +487 -0
  157. data/ext/libmemcached-0.32/support/libmemcached-fc.spec.in +105 -0
  158. data/ext/libmemcached-0.32/support/libmemcached.pc.in +10 -0
  159. data/ext/libmemcached-0.32/support/libmemcached.spec +105 -0
  160. data/ext/libmemcached-0.32/support/libmemcached.spec.in +105 -0
  161. data/ext/libmemcached-0.32/support/set_benchmark.sh +5 -0
  162. data/ext/libmemcached-0.32/tests/Makefile.am +113 -0
  163. data/ext/libmemcached-0.32/tests/Makefile.in +762 -0
  164. data/ext/libmemcached-0.32/tests/atomsmasher.c +245 -0
  165. data/ext/libmemcached-0.32/tests/function.c +4904 -0
  166. data/ext/libmemcached-0.32/tests/ketama_test_cases.h +108 -0
  167. data/ext/libmemcached-0.32/tests/output.cmp +7 -0
  168. data/ext/libmemcached-0.32/tests/output.res +7 -0
  169. data/ext/libmemcached-0.32/tests/output2.res +46 -0
  170. data/ext/libmemcached-0.32/tests/plus.cpp +293 -0
  171. data/ext/libmemcached-0.32/tests/r/memcat.res +19 -0
  172. data/ext/libmemcached-0.32/tests/r/memcp.res +27 -0
  173. data/ext/libmemcached-0.32/tests/r/memrm.res +19 -0
  174. data/ext/libmemcached-0.32/tests/r/memslap.res +33 -0
  175. data/ext/libmemcached-0.32/tests/r/memstat.res +33 -0
  176. data/ext/libmemcached-0.32/tests/server.c +118 -0
  177. data/ext/libmemcached-0.32/tests/server.h +25 -0
  178. data/ext/libmemcached-0.32/tests/start.c +16 -0
  179. data/ext/libmemcached-0.32/tests/t/memcat.test +4 -0
  180. data/ext/libmemcached-0.32/tests/t/memcp.test +3 -0
  181. data/ext/libmemcached-0.32/tests/t/memrm.test +3 -0
  182. data/ext/libmemcached-0.32/tests/t/memslap.test +5 -0
  183. data/ext/libmemcached-0.32/tests/t/memstat.test +3 -0
  184. data/ext/libmemcached-0.32/tests/test.c +137 -0
  185. data/ext/libmemcached-0.32/tests/test.h +46 -0
  186. data/ext/libmemcached-0.32/tests/udp.c +76 -0
  187. data/ext/rlibmemcached.i +258 -0
  188. data/ext/rlibmemcached_wrap.c +13917 -0
  189. data/lib/memcached/auth.rb +16 -0
  190. data/lib/memcached/behaviors.rb +78 -0
  191. data/lib/memcached/exceptions.rb +84 -0
  192. data/lib/memcached/experimental.rb +48 -0
  193. data/lib/memcached/marshal_codec.rb +10 -0
  194. data/lib/memcached/memcached.rb +732 -0
  195. data/lib/memcached/rails.rb +250 -0
  196. data/lib/memcached.rb +33 -0
  197. data/memcached.gemspec +0 -0
  198. data/test/profile/benchmark.rb +280 -0
  199. data/test/profile/c_profiler.rb +14 -0
  200. data/test/profile/exercise.rb +185 -0
  201. data/test/profile/rb_profiler.rb +21 -0
  202. data/test/profile/valgrind.rb +10 -0
  203. data/test/setup.rb +30 -0
  204. data/test/teardown.rb +0 -0
  205. data/test/test_helper.rb +18 -0
  206. data/test/unit/binding_test.rb +8 -0
  207. data/test/unit/memcached_experimental_test.rb +272 -0
  208. data/test/unit/memcached_test.rb +1487 -0
  209. data/test/unit/rails_test.rb +330 -0
  210. metadata +336 -0
@@ -0,0 +1,118 @@
1
+ /*
2
+ Startup, and shutdown the memcached servers.
3
+ */
4
+
5
+ #define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT+10
6
+
7
+ #include "config.h"
8
+
9
+ #include <stdio.h>
10
+ #include <stdlib.h>
11
+ #include <string.h>
12
+ #include <time.h>
13
+ #include <assert.h>
14
+ #include <signal.h>
15
+ #include <libmemcached/memcached.h>
16
+ #include <unistd.h>
17
+ #include "server.h"
18
+
19
+ void server_startup(server_startup_st *construct)
20
+ {
21
+ unsigned int x;
22
+
23
+ if ((construct->server_list= getenv("MEMCACHED_SERVERS")))
24
+ {
25
+ printf("servers %s\n", construct->server_list);
26
+ construct->servers= memcached_servers_parse(construct->server_list);
27
+ construct->server_list= NULL;
28
+ construct->count= 0;
29
+ }
30
+ else
31
+ {
32
+ {
33
+ char server_string_buffer[8096];
34
+ char *end_ptr;
35
+ end_ptr= server_string_buffer;
36
+
37
+ for (x= 0; x < construct->count; x++)
38
+ {
39
+ char buffer[1024]; /* Nothing special for number */
40
+ int count;
41
+ int status;
42
+
43
+ sprintf(buffer, "/tmp/%umemc.pid", x);
44
+ if (access(buffer, F_OK) == 0)
45
+ {
46
+ FILE *fp= fopen(buffer, "r");
47
+ remove(buffer);
48
+
49
+ if (fp != NULL)
50
+ {
51
+ if (fgets(buffer, sizeof(buffer), fp) != NULL)
52
+ {
53
+ pid_t pid = (pid_t)atol(buffer);
54
+ if (pid != 0)
55
+ kill(pid, SIGTERM);
56
+ }
57
+
58
+ fclose(fp);
59
+ }
60
+ }
61
+
62
+ if (x == 0)
63
+ {
64
+ sprintf(buffer, "%s -d -P /tmp/%umemc.pid -t 1 -p %u -U %u -m 128",
65
+ MEMCACHED_BINARY, x, x + TEST_PORT_BASE, x + TEST_PORT_BASE);
66
+ }
67
+ else
68
+ {
69
+ sprintf(buffer, "%s -d -P /tmp/%umemc.pid -t 1 -p %u -U %u",
70
+ MEMCACHED_BINARY, x, x + TEST_PORT_BASE, x + TEST_PORT_BASE);
71
+ }
72
+ fprintf(stderr, "STARTING SERVER: %s\n", buffer);
73
+ status= system(buffer);
74
+ count= sprintf(end_ptr, "localhost:%u,", x + TEST_PORT_BASE);
75
+ end_ptr+= count;
76
+ }
77
+ *end_ptr= 0;
78
+
79
+ construct->server_list= strdup(server_string_buffer);
80
+ }
81
+ printf("servers %s\n", construct->server_list);
82
+ construct->servers= memcached_servers_parse(construct->server_list);
83
+ }
84
+
85
+ assert(construct->servers);
86
+
87
+ srandom((unsigned int)time(NULL));
88
+
89
+ for (x= 0; x < memcached_server_list_count(construct->servers); x++)
90
+ {
91
+ printf("\t%s : %u\n", construct->servers[x].hostname, construct->servers[x].port);
92
+ assert(construct->servers[x].fd == -1);
93
+ assert(construct->servers[x].cursor_active == 0);
94
+ }
95
+
96
+ printf("\n");
97
+ }
98
+
99
+ void server_shutdown(server_startup_st *construct)
100
+ {
101
+ unsigned int x;
102
+
103
+ if (construct->server_list)
104
+ {
105
+ for (x= 0; x < construct->count; x++)
106
+ {
107
+ char buffer[1024]; /* Nothing special for number */
108
+ sprintf(buffer, "cat /tmp/%umemc.pid | xargs kill", x);
109
+ /* We have to check the return value of this or the compiler will yell */
110
+ int sys_ret= system(buffer);
111
+ assert(sys_ret != -1);
112
+ sprintf(buffer, "/tmp/%umemc.pid", x);
113
+ unlink(buffer);
114
+ }
115
+
116
+ free(construct->server_list);
117
+ }
118
+ }
@@ -0,0 +1,25 @@
1
+ /*
2
+ Server startup and shutdown functions.
3
+ */
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include <libmemcached/memcached.h>
9
+
10
+ typedef struct server_startup_st server_startup_st;
11
+
12
+ struct server_startup_st
13
+ {
14
+ uint8_t count;
15
+ uint8_t udp;
16
+ memcached_server_st *servers;
17
+ char *server_list;
18
+ };
19
+
20
+ void server_startup(server_startup_st *construct);
21
+ void server_shutdown(server_startup_st *construct);
22
+
23
+ #ifdef __cplusplus
24
+ }
25
+ #endif
@@ -0,0 +1,16 @@
1
+ #include <stdio.h>
2
+ #include <string.h>
3
+ #include "server.h"
4
+
5
+ int main(void)
6
+ {
7
+ server_startup_st construct;
8
+
9
+ memset(&construct, 0, sizeof(server_startup_st));
10
+
11
+ construct.count= 4;
12
+
13
+ server_startup(&construct);
14
+
15
+ return 0;
16
+ }
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+ MEMCAT="../src/memcat"
3
+
4
+ $MEMCAT --help
@@ -0,0 +1,3 @@
1
+ MEMCP="../src/memcp"
2
+
3
+ $MEMCP --help
@@ -0,0 +1,3 @@
1
+ MEMRM="../src/memrm"
2
+
3
+ $MEMRM --help
@@ -0,0 +1,5 @@
1
+ MEMSLAP="../src/memslap"
2
+
3
+ $MEMSLAP --help
4
+
5
+ $MEMSLAP --initial-load=5000 --verbose --flush --concurrency=500 --execute-number=500 > /dev/null
@@ -0,0 +1,3 @@
1
+ MEMSTAT="../src/memslap"
2
+
3
+ $MEMSTAT --help
@@ -0,0 +1,137 @@
1
+ /*
2
+ Sample test application.
3
+ */
4
+ #include <assert.h>
5
+ #include <stdlib.h>
6
+ #include <string.h>
7
+ #include <sys/time.h>
8
+ #include <sys/types.h>
9
+ #include <sys/stat.h>
10
+ #include <unistd.h>
11
+ #include <time.h>
12
+ #include <fnmatch.h>
13
+ #include "server.h"
14
+
15
+ #include "test.h"
16
+
17
+ static long int timedif(struct timeval a, struct timeval b)
18
+ {
19
+ register int us, s;
20
+
21
+ us = (int)(a.tv_usec - b.tv_usec);
22
+ us /= 1000;
23
+ s = (int)(a.tv_sec - b.tv_sec);
24
+ s *= 1000;
25
+ return s + us;
26
+ }
27
+
28
+ int main(int argc, char *argv[])
29
+ {
30
+ unsigned int x;
31
+ char *collection_to_run= NULL;
32
+ char *wildcard= NULL;
33
+ server_startup_st *startup_ptr;
34
+ memcached_server_st *servers;
35
+ world_st world;
36
+ collection_st *collection;
37
+ collection_st *next;
38
+ uint8_t failed;
39
+ void *world_ptr;
40
+
41
+ memset(&world, 0, sizeof(world_st));
42
+ get_world(&world);
43
+ collection= world.collections;
44
+
45
+ if (world.create)
46
+ world_ptr= world.create();
47
+ else
48
+ world_ptr= NULL;
49
+
50
+ startup_ptr= (server_startup_st *)world_ptr;
51
+ servers= (memcached_server_st *)startup_ptr->servers;
52
+
53
+ if (argc > 1)
54
+ collection_to_run= argv[1];
55
+
56
+ if (argc == 3)
57
+ wildcard= argv[2];
58
+
59
+ for (next= collection; next->name; next++)
60
+ {
61
+ test_st *run;
62
+
63
+ run= next->tests;
64
+ if (collection_to_run && fnmatch(collection_to_run, next->name, 0))
65
+ continue;
66
+
67
+ fprintf(stderr, "\n%s\n\n", next->name);
68
+
69
+ for (x= 0; run->name; run++)
70
+ {
71
+ unsigned int loop;
72
+ memcached_st *memc;
73
+ memcached_return rc;
74
+ struct timeval start_time, end_time;
75
+ long int load_time;
76
+
77
+ if (wildcard && fnmatch(wildcard, run->name, 0))
78
+ continue;
79
+
80
+ fprintf(stderr, "Testing %s", run->name);
81
+
82
+ memc= memcached_create(NULL);
83
+ assert(memc);
84
+
85
+ rc= memcached_server_push(memc, servers);
86
+ assert(rc == MEMCACHED_SUCCESS);
87
+
88
+ if (run->requires_flush)
89
+ {
90
+ memcached_flush(memc, 0);
91
+ memcached_quit(memc);
92
+ }
93
+
94
+ for (loop= 0; loop < memcached_server_list_count(servers); loop++)
95
+ {
96
+ assert(memc->hosts[loop].fd == -1);
97
+ assert(memc->hosts[loop].cursor_active == 0);
98
+ }
99
+
100
+ if (next->pre)
101
+ {
102
+ rc= next->pre(memc);
103
+
104
+ if (rc != MEMCACHED_SUCCESS)
105
+ {
106
+ fprintf(stderr, "\t\t\t\t\t [ skipping ]\n");
107
+ goto error;
108
+ }
109
+ }
110
+
111
+ gettimeofday(&start_time, NULL);
112
+ failed= run->function(memc);
113
+ gettimeofday(&end_time, NULL);
114
+ load_time= timedif(end_time, start_time);
115
+ if (failed)
116
+ fprintf(stderr, "\t\t\t\t\t %ld.%03ld [ failed ]\n", load_time / 1000,
117
+ load_time % 1000);
118
+ else
119
+ fprintf(stderr, "\t\t\t\t\t %ld.%03ld [ ok ]\n", load_time / 1000,
120
+ load_time % 1000);
121
+
122
+ if (next->post)
123
+ (void)next->post(memc);
124
+
125
+ assert(memc);
126
+ error:
127
+ memcached_free(memc);
128
+ }
129
+ }
130
+
131
+ fprintf(stderr, "All tests completed successfully\n\n");
132
+
133
+ if (world.destroy)
134
+ world.destroy(world_ptr);
135
+
136
+ return 0;
137
+ }
@@ -0,0 +1,46 @@
1
+ /*
2
+ Structures for generic tests.
3
+ */
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include <libmemcached/memcached.h>
9
+ #include <stdio.h>
10
+
11
+ typedef struct world_st world_st;
12
+ typedef struct collection_st collection_st;
13
+ typedef struct test_st test_st;
14
+
15
+ typedef enum {
16
+ TEST_SUCCESS= 0, /* Backwards compatibility */
17
+ TEST_FAILURE,
18
+ TEST_MEMORY_ALLOCATION_FAILURE,
19
+ TEST_MAXIMUM_RETURN /* Always add new error code before */
20
+ } test_return;
21
+
22
+ struct test_st {
23
+ const char *name;
24
+ unsigned int requires_flush;
25
+ test_return (*function)(memcached_st *memc);
26
+ };
27
+
28
+ struct collection_st {
29
+ const char *name;
30
+ memcached_return (*pre)(memcached_st *memc);
31
+ memcached_return (*post)(memcached_st *memc);
32
+ test_st *tests;
33
+ };
34
+
35
+ struct world_st {
36
+ collection_st *collections;
37
+ void *(*create)(void);
38
+ void (*destroy)(void *collection_object);
39
+ };
40
+
41
+ /* How we make all of this work :) */
42
+ void get_world(world_st *world);
43
+
44
+ #ifdef __cplusplus
45
+ }
46
+ #endif
@@ -0,0 +1,76 @@
1
+ /*
2
+ Sample test application.
3
+ */
4
+ #include <assert.h>
5
+ #include <libmemcached/memcached.h>
6
+ #include <stdio.h>
7
+ #include <stdlib.h>
8
+ #include <string.h>
9
+ #include <sys/time.h>
10
+ #include <sys/types.h>
11
+ #include <sys/stat.h>
12
+ #include <unistd.h>
13
+ #include <time.h>
14
+ #include "test.h"
15
+ #include "server.h"
16
+
17
+ /* Prototypes */
18
+ test_return set_test(memcached_st *memc);
19
+ void *world_create(void);
20
+ void world_destroy(void *p);
21
+
22
+ test_return set_test(memcached_st *memc)
23
+ {
24
+ memcached_return rc;
25
+ const char *key= "foo";
26
+ const char *value= "when we sanitize";
27
+
28
+ rc= memcached_set(memc, key, strlen(key),
29
+ value, strlen(value),
30
+ (time_t)0, (uint32_t)0);
31
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
32
+
33
+ return TEST_SUCCESS;
34
+ }
35
+
36
+ test_st tests[] ={
37
+ {"set", 1, set_test },
38
+ {0, 0, 0}
39
+ };
40
+
41
+ collection_st collection[] ={
42
+ {"udp", 0, 0, tests},
43
+ {0, 0, 0, 0}
44
+ };
45
+
46
+ #define SERVERS_TO_CREATE 1
47
+
48
+ void *world_create(void)
49
+ {
50
+ server_startup_st *construct;
51
+
52
+ construct= (server_startup_st *)malloc(sizeof(server_startup_st));
53
+ memset(construct, 0, sizeof(server_startup_st));
54
+ construct->count= SERVERS_TO_CREATE;
55
+ construct->udp= 1;
56
+ server_startup(construct);
57
+
58
+ return construct;
59
+ }
60
+
61
+ void world_destroy(void *p)
62
+ {
63
+ server_startup_st *construct= (server_startup_st *)p;
64
+ memcached_server_st *servers= (memcached_server_st *)construct->servers;
65
+ memcached_server_list_free(servers);
66
+
67
+ server_shutdown(construct);
68
+ free(construct);
69
+ }
70
+
71
+ void get_world(world_st *world)
72
+ {
73
+ world->collections= collection;
74
+ world->create= world_create;
75
+ world->destroy= world_destroy;
76
+ }
@@ -0,0 +1,258 @@
1
+ %module rlibmemcached
2
+ %{
3
+ #include <libmemcached/visibility.h>
4
+ #include <libmemcached/memcached.h>
5
+ #include <libmemcached/memcached_exist.h>
6
+ %}
7
+
8
+ %warnfilter(SWIGWARN_RUBY_WRONG_NAME) memcached_st;
9
+ %warnfilter(SWIGWARN_RUBY_WRONG_NAME) memcached_server_st;
10
+ %warnfilter(SWIGWARN_RUBY_WRONG_NAME) memcached_stat_st;
11
+ %warnfilter(SWIGWARN_RUBY_WRONG_NAME) memcached_string_st;
12
+ %warnfilter(SWIGWARN_RUBY_WRONG_NAME) memcached_result_st;
13
+
14
+ %include "typemaps.i"
15
+ %include "libmemcached/visibility.h"
16
+
17
+ //// Memory management
18
+
19
+ // Register libmemcached's struct free function to prevent memory leaks
20
+ %freefunc memcached_st "memcached_free";
21
+ %freefunc memcached_stat_st "memcached_stat_free";
22
+ %freefunc memcached_server_st "memcached_server_free";
23
+
24
+ // Register which functions generate new objects
25
+ %newobject memcached_create;
26
+ %newobject memcached_clone;
27
+ %newobject memcached_stat_get_value;
28
+ // %newobject memcached_stat;
29
+
30
+ // %trackobjects; // Doesn't fix any interesting leaks
31
+
32
+ //// Input maps
33
+
34
+ %apply unsigned short { uint8_t };
35
+ %apply unsigned int { uint16_t };
36
+ %apply unsigned int { uint32_t server_failure_counter };
37
+ %apply unsigned int { uint32_t user_spec_len };
38
+ %apply unsigned long { uint32_t flags, uint32_t offset, uint32_t weight, time_t expiration };
39
+ %apply unsigned long long { uint64_t data, uint64_t cas };
40
+
41
+ // Array of strings map for multiget
42
+ %typemap(in) (const char **keys, size_t *key_length, size_t number_of_keys) {
43
+ unsigned int i;
44
+ VALUE str;
45
+ Check_Type($input, T_ARRAY);
46
+ $3 = (unsigned int) RARRAY_LEN($input);
47
+ $2 = (size_t *) malloc(($3+1)*sizeof(size_t));
48
+ $1 = (char **) malloc(($3+1)*sizeof(char *));
49
+ for(i = 0; i < $3; i ++) {
50
+ str = rb_string_value(&RARRAY_PTR($input)[i]);
51
+ $1[i] = RSTRING_PTR(str);
52
+ $2[i] = RSTRING_LEN(str);
53
+ }
54
+ }
55
+
56
+ %typemap(freearg) (const char **keys, size_t *key_length, size_t number_of_keys) {
57
+ free($1);
58
+ free($2);
59
+ }
60
+
61
+ // Generic strings
62
+ %typemap(in) (const char *str, size_t len) {
63
+ VALUE str;
64
+ str = rb_string_value(&$input);
65
+ $1 = RSTRING_PTR(str);
66
+ $2 = RSTRING_LEN(str);
67
+ };
68
+
69
+ // Void type strings without lengths for prefix_key callback
70
+ %typemap(in) (void *data) {
71
+ VALUE str;
72
+ str = rb_string_value(&$input);
73
+ if (RSTRING_LEN(str) == 0) {
74
+ $1 = NULL;
75
+ } else {
76
+ $1 = RSTRING_PTR(str);
77
+ }
78
+ };
79
+
80
+ %apply (const char *str, size_t len) {
81
+ (const char *namespace, size_t namespace_length),
82
+ (const char *key, size_t key_length),
83
+ (const char *value, size_t value_length)
84
+ };
85
+
86
+ // Key strings with same master key
87
+ // This will have to go if people actually want to set the master key separately
88
+ %typemap(in) (const char *master_key, size_t master_key_length, const char *key, size_t key_length) {
89
+ VALUE str;
90
+ str = rb_string_value(&$input);
91
+ $3 = $1 = RSTRING_PTR(str);
92
+ $4 = $2 = RSTRING_LEN(str);
93
+ };
94
+
95
+ //// Output maps
96
+
97
+ %apply unsigned short *OUTPUT {memcached_return *error}
98
+ %apply unsigned int *OUTPUT {uint32_t *flags}
99
+ %apply size_t *OUTPUT {size_t *value_length}
100
+ %apply unsigned long long *OUTPUT {uint64_t *value}
101
+
102
+ // Uint64
103
+ %typemap(out) (uint64_t) {
104
+ $result = ULL2NUM($1);
105
+ };
106
+
107
+ // Uint32
108
+ %typemap(out) (uint32_t) {
109
+ $result = UINT2NUM($1);
110
+ };
111
+
112
+ // String for memcached_fetch
113
+ %typemap(in, numinputs=0) (char *key, size_t *key_length) {
114
+ char string[256];
115
+ size_t length = 0;
116
+ $1 = string;
117
+ $2 = &length;
118
+ };
119
+
120
+ // Strings with lengths
121
+ %typemap(argout) (char *key, size_t *key_length) {
122
+ rb_ary_push($result, rb_str_new($1, *$2));
123
+ }
124
+
125
+ // Array of strings
126
+ // Only used by memcached_stat_get_keys() and not performance-critical
127
+ %typemap(out) (char **) {
128
+ int i;
129
+ VALUE ary = rb_ary_new();
130
+ $result = rb_ary_new();
131
+
132
+ for(i=0; $1[i] != NULL; i++) {
133
+ rb_ary_store(ary, i, rb_str_new2($1[i]));
134
+ }
135
+ rb_ary_push($result, ary);
136
+ free($1);
137
+ };
138
+
139
+ //// SWIG includes, for functions, constants, and structs
140
+
141
+ %include "libmemcached/visibility.h"
142
+ %include "libmemcached/memcached.h"
143
+ %include "libmemcached/memcached_constants.h"
144
+ %include "libmemcached/memcached_get.h"
145
+ %include "libmemcached/memcached_storage.h"
146
+ %include "libmemcached/memcached_result.h"
147
+ %include "libmemcached/memcached_server.h"
148
+ %include "libmemcached/memcached_sasl.h"
149
+ %include "libmemcached/memcached_touch.h"
150
+ %include "libmemcached/memcached_exist.h"
151
+
152
+ //// Custom C functions
153
+
154
+ VALUE rb_str_new_by_ref(char *ptr, long len);
155
+ %{
156
+ VALUE rb_str_new_by_ref(char *ptr, long len)
157
+ {
158
+ #ifdef OBJSETUP
159
+ NEWOBJ(str, struct RString);
160
+ OBJSETUP(str, rb_cString, T_STRING);
161
+ #ifdef RSTRING_NOEMBED
162
+ /* Ruby 1.9 */
163
+ str->as.heap.ptr = ptr;
164
+ str->as.heap.len = len;
165
+ str->as.heap.aux.capa = len + 1;
166
+ // Set STR_NOEMBED
167
+ FL_SET(str, FL_USER1);
168
+ #else
169
+ /* Ruby 1.8 */
170
+ str->ptr = ptr;
171
+ str->len = len;
172
+ str->aux.capa = 0;
173
+ #endif
174
+ #else
175
+ /* Rubinius, JRuby */
176
+ VALUE str = rb_str_new(ptr, len);
177
+ free(ptr);
178
+ #endif
179
+ return (VALUE)str;
180
+ }
181
+ %}
182
+
183
+ //// Manual wrappers
184
+
185
+ // Single get
186
+ VALUE memcached_get_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error);
187
+ %{
188
+ VALUE memcached_get_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error) {
189
+ size_t value_length = 0;
190
+ char *value = memcached_get(ptr, key, key_length, &value_length, flags, error);
191
+ return rb_str_new_by_ref(value, value_length);
192
+ };
193
+ %}
194
+
195
+ VALUE memcached_get_len_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t user_spec_len, uint32_t *flags, memcached_return *error);
196
+ %{
197
+ VALUE memcached_get_len_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t user_spec_len, uint32_t *flags, memcached_return *error) {
198
+ size_t value_length = 0;
199
+ char *value = memcached_get_len(ptr, key, key_length, user_spec_len, &value_length, flags, error);
200
+ return rb_str_new_by_ref(value, value_length);
201
+ };
202
+ %}
203
+
204
+ VALUE memcached_get_from_last_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error);
205
+ %{
206
+ VALUE memcached_get_from_last_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error) {
207
+ size_t value_length = 0;
208
+ char *value = memcached_get_from_last(ptr, key, key_length, &value_length, flags, error);
209
+ return rb_str_new_by_ref(value, value_length);
210
+ };
211
+ %}
212
+
213
+ // Multi get
214
+ VALUE memcached_fetch_rvalue(memcached_st *ptr, char *key, size_t *key_length, uint32_t *flags, memcached_return *error);
215
+ %{
216
+ VALUE memcached_fetch_rvalue(memcached_st *ptr, char *key, size_t *key_length, uint32_t *flags, memcached_return *error) {
217
+ size_t value_length = 0;
218
+ VALUE ary = rb_ary_new();
219
+ *key_length = 0;
220
+ if (error) *error = MEMCACHED_TIMEOUT; // timeouts leave error uninitialized
221
+ char *value = memcached_fetch(ptr, key, key_length, &value_length, flags, error);
222
+ VALUE str = rb_str_new_by_ref(value, value_length);
223
+ rb_ary_push(ary, str);
224
+ return ary;
225
+ };
226
+ %}
227
+
228
+ // Ruby isn't aware that the pointer is an array... there is probably a better way to do this
229
+ memcached_server_st *memcached_select_server_at(memcached_st *in_ptr, int index);
230
+ %{
231
+ memcached_server_st *memcached_select_server_at(memcached_st *in_ptr, int index) {
232
+ return &(in_ptr->hosts[index]);
233
+ };
234
+ %}
235
+
236
+ // Same, but for stats
237
+ memcached_stat_st *memcached_select_stat_at(memcached_st *in_ptr, memcached_stat_st *stat_ptr, int index);
238
+ %{
239
+ memcached_stat_st *memcached_select_stat_at(memcached_st *in_ptr, memcached_stat_st *stat_ptr, int index) {
240
+ return &(stat_ptr[index]);
241
+ };
242
+ %}
243
+
244
+ // Wrap only hash function
245
+ // Uint32
246
+ VALUE memcached_generate_hash_rvalue(const char *key, size_t key_length, memcached_hash hash_algorithm);
247
+ %{
248
+ VALUE memcached_generate_hash_rvalue(const char *key, size_t key_length,memcached_hash hash_algorithm) {
249
+ return UINT2NUM(memcached_generate_hash_value(key, key_length, hash_algorithm));
250
+ };
251
+ %}
252
+
253
+ // Initialization for SASL
254
+ %init %{
255
+ if (sasl_client_init(NULL) != SASL_OK) {
256
+ fprintf(stderr, "Failed to initialized SASL.\n");
257
+ }
258
+ %}