3 const char * memcached_lib_version(void)
5 return LIBMEMCACHED_VERSION_STRING
;
8 static inline memcached_return_t
memcached_version_binary(memcached_st
*ptr
);
9 static inline memcached_return_t
memcached_version_textual(memcached_st
*ptr
);
11 memcached_return_t
memcached_version(memcached_st
*ptr
)
13 if (ptr
->flags
.use_udp
)
14 return MEMCACHED_NOT_SUPPORTED
;
16 if (ptr
->flags
.binary_protocol
)
17 return memcached_version_binary(ptr
);
19 return memcached_version_textual(ptr
);
22 static inline memcached_return_t
memcached_version_textual(memcached_st
*ptr
)
25 memcached_return_t rc
;
26 char buffer
[MEMCACHED_DEFAULT_COMMAND_SIZE
];
28 const char *command
= "version\r\n";
30 send_length
= strlen(command
);
32 rc
= MEMCACHED_SUCCESS
;
33 for (uint32_t x
= 0; x
< memcached_server_count(ptr
); x
++)
35 memcached_return_t rrc
;
36 memcached_server_instance_st
*instance
=
37 memcached_server_instance_fetch(ptr
, x
);
39 rrc
= memcached_do(instance
, command
, send_length
, true);
40 if (rrc
!= MEMCACHED_SUCCESS
)
42 rc
= MEMCACHED_SOME_ERRORS
;
46 rrc
= memcached_response(instance
, buffer
, MEMCACHED_DEFAULT_COMMAND_SIZE
, NULL
);
47 if (rrc
!= MEMCACHED_SUCCESS
)
49 rc
= MEMCACHED_SOME_ERRORS
;
53 /* Find the space, and then move one past it to copy version */
54 response_ptr
= index(buffer
, ' ');
57 instance
->major_version
= (uint8_t)strtol(response_ptr
, (char **)NULL
, 10);
58 response_ptr
= index(response_ptr
, '.');
60 instance
->minor_version
= (uint8_t)strtol(response_ptr
, (char **)NULL
, 10);
61 response_ptr
= index(response_ptr
, '.');
63 instance
->micro_version
= (uint8_t)strtol(response_ptr
, (char **)NULL
, 10);
69 static inline memcached_return_t
memcached_version_binary(memcached_st
*ptr
)
71 memcached_return_t rc
;
73 protocol_binary_request_version request
= { .bytes
= {0}};
74 request
.message
.header
.request
.magic
= PROTOCOL_BINARY_REQ
;
75 request
.message
.header
.request
.opcode
= PROTOCOL_BINARY_CMD_VERSION
;
76 request
.message
.header
.request
.datatype
= PROTOCOL_BINARY_RAW_BYTES
;
78 rc
= MEMCACHED_SUCCESS
;
79 for (x
= 0; x
< memcached_server_count(ptr
); x
++)
81 memcached_return_t rrc
;
83 memcached_server_instance_st
*instance
=
84 memcached_server_instance_fetch(ptr
, x
);
86 rrc
= memcached_do(instance
, request
.bytes
, sizeof(request
.bytes
), true);
87 if (rrc
!= MEMCACHED_SUCCESS
)
89 memcached_io_reset(instance
);
90 rc
= MEMCACHED_SOME_ERRORS
;
95 for (x
= 0; x
< memcached_server_count(ptr
); x
++)
97 memcached_server_instance_st
*instance
=
98 memcached_server_instance_fetch(ptr
, x
);
100 if (memcached_server_response_count(instance
) > 0)
102 memcached_return_t rrc
;
106 rrc
= memcached_response(instance
, buffer
, sizeof(buffer
), NULL
);
107 if (rrc
!= MEMCACHED_SUCCESS
)
109 memcached_io_reset(instance
);
110 rc
= MEMCACHED_SOME_ERRORS
;
114 instance
->major_version
= (uint8_t)strtol(buffer
, &p
, 10);
115 instance
->minor_version
= (uint8_t)strtol(p
+ 1, &p
, 10);
116 instance
->micro_version
= (uint8_t)strtol(p
+ 1, NULL
, 10);