Remove use of system(). Not very portable
[awesomized/libmemcached] / libmemcached / flush.c
1 #include "common.h"
2
3 static memcached_return_t memcached_flush_binary(memcached_st *ptr,
4 time_t expiration);
5 static memcached_return_t memcached_flush_textual(memcached_st *ptr,
6 time_t expiration);
7
8 memcached_return_t memcached_flush(memcached_st *ptr, time_t expiration)
9 {
10 memcached_return_t rc;
11
12 LIBMEMCACHED_MEMCACHED_FLUSH_START();
13 if (ptr->flags.binary_protocol)
14 rc= memcached_flush_binary(ptr, expiration);
15 else
16 rc= memcached_flush_textual(ptr, expiration);
17 LIBMEMCACHED_MEMCACHED_FLUSH_END();
18 return rc;
19 }
20
21 static memcached_return_t memcached_flush_textual(memcached_st *ptr,
22 time_t expiration)
23 {
24 unsigned int x;
25 size_t send_length;
26 memcached_return_t rc;
27 char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
28
29 unlikely (memcached_server_count(ptr) == 0)
30 return MEMCACHED_NO_SERVERS;
31
32 for (x= 0; x < memcached_server_count(ptr); x++)
33 {
34 bool no_reply= ptr->flags.no_reply;
35 memcached_server_write_instance_st instance=
36 memcached_server_instance_fetch(ptr, x);
37
38 if (expiration)
39 send_length= (size_t) snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE,
40 "flush_all %llu%s\r\n",
41 (unsigned long long)expiration, no_reply ? " noreply" : "");
42 else
43 send_length= (size_t) snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE,
44 "flush_all%s\r\n", no_reply ? " noreply" : "");
45
46 rc= memcached_do(instance, buffer, send_length, true);
47
48 if (rc == MEMCACHED_SUCCESS && !no_reply)
49 (void)memcached_response(instance, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, NULL);
50 }
51
52 return MEMCACHED_SUCCESS;
53 }
54
55 static memcached_return_t memcached_flush_binary(memcached_st *ptr,
56 time_t expiration)
57 {
58 protocol_binary_request_flush request= {.bytes= {0}};
59
60 unlikely (memcached_server_count(ptr) == 0)
61 return MEMCACHED_NO_SERVERS;
62
63 request.message.header.request.magic= (uint8_t)PROTOCOL_BINARY_REQ;
64 request.message.header.request.opcode= PROTOCOL_BINARY_CMD_FLUSH;
65 request.message.header.request.extlen= 4;
66 request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES;
67 request.message.header.request.bodylen= htonl(request.message.header.request.extlen);
68 request.message.body.expiration= htonl((uint32_t) expiration);
69
70 for (uint32_t x= 0; x < memcached_server_count(ptr); x++)
71 {
72 memcached_server_write_instance_st instance=
73 memcached_server_instance_fetch(ptr, x);
74
75 if (ptr->flags.no_reply)
76 {
77 request.message.header.request.opcode= PROTOCOL_BINARY_CMD_FLUSHQ;
78 }
79 else
80 {
81 request.message.header.request.opcode= PROTOCOL_BINARY_CMD_FLUSH;
82 }
83
84 if (memcached_do(instance, request.bytes, sizeof(request.bytes), true) != MEMCACHED_SUCCESS)
85 {
86 memcached_io_reset(instance);
87 return MEMCACHED_WRITE_FAILURE;
88 }
89 }
90
91 for (uint32_t x= 0; x < memcached_server_count(ptr); x++)
92 {
93 memcached_server_write_instance_st instance=
94 memcached_server_instance_fetch(ptr, x);
95
96 if (memcached_server_response_count(instance) > 0)
97 (void)memcached_response(instance, NULL, 0, NULL);
98 }
99
100 return MEMCACHED_SUCCESS;
101 }