Work inspired by matt knox
[m6w6/libmemcached] / clients / memrm.c
1 #include "libmemcached/common.h"
2 #include <stdio.h>
3 #include <unistd.h>
4 #include <getopt.h>
5 #include <libmemcached/memcached.h>
6 #include <string.h>
7 #include "client_options.h"
8 #include "utilities.h"
9
10 static int opt_binary= 0;
11 static int opt_verbose= 0;
12 static time_t opt_expire= 0;
13 static char *opt_servers= NULL;
14 static char *opt_hash= NULL;
15
16 #define PROGRAM_NAME "memrm"
17 #define PROGRAM_DESCRIPTION "Erase a key or set of keys from a memcached cluster."
18
19 /* Prototypes */
20 void options_parse(int argc, char *argv[]);
21
22 int main(int argc, char *argv[])
23 {
24 memcached_st *memc;
25 memcached_return rc;
26 memcached_server_st *servers;
27
28 options_parse(argc, argv);
29
30 if (!opt_servers)
31 {
32 char *temp;
33
34 if ((temp= getenv("MEMCACHED_SERVERS")))
35 opt_servers= strdup(temp);
36 else
37 {
38 fprintf(stderr, "No Servers provided\n");
39 exit(1);
40 }
41 }
42
43 memc= memcached_create(NULL);
44 process_hash_option(memc, opt_hash);
45
46 servers= memcached_servers_parse(opt_servers);
47 memcached_server_push(memc, servers);
48 memcached_server_list_free(servers);
49 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL,
50 (uint64_t) opt_binary);
51
52 while (optind < argc)
53 {
54 if (opt_verbose)
55 printf("key: %s\nexpires: %llu\n", argv[optind], (unsigned long long)opt_expire);
56 rc = memcached_delete(memc, argv[optind], strlen(argv[optind]), opt_expire);
57
58 if (rc != MEMCACHED_SUCCESS)
59 {
60 fprintf(stderr, "memrm: %s: memcache error %s",
61 argv[optind], memcached_strerror(memc, rc));
62 if (memc->cached_errno)
63 fprintf(stderr, " system error %s", strerror(memc->cached_errno));
64 fprintf(stderr, "\n");
65 }
66
67 optind++;
68 }
69
70 memcached_free(memc);
71
72 if (opt_servers)
73 free(opt_servers);
74 if (opt_hash)
75 free(opt_hash);
76
77 return 0;
78 }
79
80
81 void options_parse(int argc, char *argv[])
82 {
83 memcached_programs_help_st help_options[]=
84 {
85 {0},
86 };
87
88 static struct option long_options[]=
89 {
90 {"version", no_argument, NULL, OPT_VERSION},
91 {"help", no_argument, NULL, OPT_HELP},
92 {"verbose", no_argument, &opt_verbose, OPT_VERBOSE},
93 {"debug", no_argument, &opt_verbose, OPT_DEBUG},
94 {"servers", required_argument, NULL, OPT_SERVERS},
95 {"expire", required_argument, NULL, OPT_EXPIRE},
96 {"hash", required_argument, NULL, OPT_HASH},
97 {"binary", no_argument, NULL, OPT_BINARY},
98 {0, 0, 0, 0},
99 };
100 int option_index= 0;
101 int option_rv;
102
103 while (1)
104 {
105 option_rv= getopt_long(argc, argv, "Vhvds:", long_options, &option_index);
106 if (option_rv == -1) break;
107 switch (option_rv)
108 {
109 case 0:
110 break;
111 case OPT_BINARY:
112 opt_binary = 1;
113 break;
114 case OPT_VERBOSE: /* --verbose or -v */
115 opt_verbose = OPT_VERBOSE;
116 break;
117 case OPT_DEBUG: /* --debug or -d */
118 opt_verbose = OPT_DEBUG;
119 break;
120 case OPT_VERSION: /* --version or -V */
121 version_command(PROGRAM_NAME);
122 break;
123 case OPT_HELP: /* --help or -h */
124 help_command(PROGRAM_NAME, PROGRAM_DESCRIPTION, long_options, help_options);
125 break;
126 case OPT_SERVERS: /* --servers or -s */
127 opt_servers= strdup(optarg);
128 break;
129 case OPT_EXPIRE: /* --expire */
130 opt_expire= (time_t)strtoll(optarg, (char **)NULL, 10);
131 break;
132 case OPT_HASH:
133 opt_hash= strdup(optarg);
134 break;
135 case '?':
136 /* getopt_long already printed an error message. */
137 exit(1);
138 default:
139 abort();
140 }
141 }
142 }