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 bool was_blocking
= ptr
->flags
.no_block
;
17 memcached_return_t rc
;
19 ptr
->flags
.no_block
= false;
21 if (ptr
->flags
.binary_protocol
)
22 rc
= memcached_version_binary(ptr
);
24 rc
= memcached_version_textual(ptr
);
26 ptr
->flags
.no_block
= was_blocking
;
31 static inline memcached_return_t
memcached_version_textual(memcached_st
*ptr
)
34 memcached_return_t rc
;
35 char buffer
[MEMCACHED_DEFAULT_COMMAND_SIZE
];
37 const char *command
= "version\r\n";
39 send_length
= strlen(command
);
41 rc
= MEMCACHED_SUCCESS
;
42 for (uint32_t x
= 0; x
< memcached_server_count(ptr
); x
++)
44 memcached_return_t rrc
;
45 memcached_server_write_instance_st instance
=
46 memcached_server_instance_fetch(ptr
, x
);
48 // Optimization, we only fetch version once.
49 if (instance
->major_version
!= UINT8_MAX
)
52 rrc
= memcached_do(instance
, command
, send_length
, true);
53 if (rrc
!= MEMCACHED_SUCCESS
)
55 instance
->major_version
= instance
->minor_version
= instance
->micro_version
= UINT8_MAX
;
56 rc
= MEMCACHED_SOME_ERRORS
;
60 rrc
= memcached_response(instance
, buffer
, MEMCACHED_DEFAULT_COMMAND_SIZE
, NULL
);
61 if (rrc
!= MEMCACHED_SUCCESS
)
63 instance
->major_version
= instance
->minor_version
= instance
->micro_version
= UINT8_MAX
;
64 rc
= MEMCACHED_SOME_ERRORS
;
68 /* Find the space, and then move one past it to copy version */
69 response_ptr
= index(buffer
, ' ');
72 instance
->major_version
= (uint8_t)strtol(response_ptr
, (char **)NULL
, 10);
75 instance
->major_version
= instance
->minor_version
= instance
->micro_version
= UINT8_MAX
;
76 rc
= MEMCACHED_SOME_ERRORS
;
80 response_ptr
= index(response_ptr
, '.');
83 instance
->minor_version
= (uint8_t)strtol(response_ptr
, (char **)NULL
, 10);
86 instance
->major_version
= instance
->minor_version
= instance
->micro_version
= UINT8_MAX
;
87 rc
= MEMCACHED_SOME_ERRORS
;
91 response_ptr
= index(response_ptr
, '.');
93 instance
->micro_version
= (uint8_t)strtol(response_ptr
, (char **)NULL
, 10);
96 instance
->major_version
= instance
->minor_version
= instance
->micro_version
= UINT8_MAX
;
97 rc
= MEMCACHED_SOME_ERRORS
;
105 static inline memcached_return_t
memcached_version_binary(memcached_st
*ptr
)
107 memcached_return_t rc
;
108 protocol_binary_request_version request
= { .bytes
= {0}};
109 request
.message
.header
.request
.magic
= PROTOCOL_BINARY_REQ
;
110 request
.message
.header
.request
.opcode
= PROTOCOL_BINARY_CMD_VERSION
;
111 request
.message
.header
.request
.datatype
= PROTOCOL_BINARY_RAW_BYTES
;
113 rc
= MEMCACHED_SUCCESS
;
114 for (uint32_t x
= 0; x
< memcached_server_count(ptr
); x
++)
116 memcached_return_t rrc
;
118 memcached_server_write_instance_st instance
=
119 memcached_server_instance_fetch(ptr
, x
);
121 if (instance
->major_version
!= UINT8_MAX
)
124 rrc
= memcached_do(instance
, request
.bytes
, sizeof(request
.bytes
), true);
125 if (rrc
!= MEMCACHED_SUCCESS
)
127 memcached_io_reset(instance
);
128 rc
= MEMCACHED_SOME_ERRORS
;
133 for (uint32_t x
= 0; x
< memcached_server_count(ptr
); x
++)
135 memcached_server_write_instance_st instance
=
136 memcached_server_instance_fetch(ptr
, x
);
138 if (instance
->major_version
!= UINT8_MAX
)
141 if (memcached_server_response_count(instance
) > 0)
143 memcached_return_t rrc
;
147 rrc
= memcached_response(instance
, buffer
, sizeof(buffer
), NULL
);
148 if (rrc
!= MEMCACHED_SUCCESS
)
150 memcached_io_reset(instance
);
151 rc
= MEMCACHED_SOME_ERRORS
;
155 instance
->major_version
= (uint8_t)strtol(buffer
, &p
, 10);
158 instance
->major_version
= instance
->minor_version
= instance
->micro_version
= UINT8_MAX
;
159 rc
= MEMCACHED_SOME_ERRORS
;
163 instance
->minor_version
= (uint8_t)strtol(p
+ 1, &p
, 10);
166 instance
->major_version
= instance
->minor_version
= instance
->micro_version
= UINT8_MAX
;
167 rc
= MEMCACHED_SOME_ERRORS
;
171 instance
->micro_version
= (uint8_t)strtol(p
+ 1, NULL
, 10);
174 instance
->major_version
= instance
->minor_version
= instance
->micro_version
= UINT8_MAX
;
175 rc
= MEMCACHED_SOME_ERRORS
;