2 +--------------------------------------------------------------------+
3 | libmemcached-awesome - C/C++ Client Library for memcached |
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted under the terms of the BSD license. |
7 | You should have received a copy of the license in a bundled file |
8 | named LICENSE; in case you did not receive a copy you can review |
9 | the terms online at: https://opensource.org/licenses/BSD-3-Clause |
10 +--------------------------------------------------------------------+
11 | Copyright (c) 2006-2014 Brian Aker https://datadifferential.com/ |
12 | Copyright (c) 2020-2021 Michael Wallner https://awesome.co/ |
13 +--------------------------------------------------------------------+
16 #include "libmemcached/common.h"
18 const char *memcached_lib_version(void) {
19 return LIBMEMCACHED_VERSION_STRING
;
22 static inline memcached_return_t
memcached_version_textual(Memcached
*memc
) {
23 libmemcached_io_vector_st vector
[] = {
24 {memcached_literal_param("version\r\n")},
28 bool errors_happened
= false;
29 for (uint32_t x
= 0; x
< memcached_server_count(memc
); x
++) {
30 memcached_instance_st
*instance
= memcached_instance_fetch(memc
, x
);
32 // Optimization, we only fetch version once.
33 if (instance
->major_version
!= UINT8_MAX
) {
37 memcached_return_t rrc
;
38 if (memcached_failed(rrc
= memcached_vdo(instance
, vector
, 1, true))) {
39 errors_happened
= true;
40 (void) memcached_set_error(*instance
, rrc
, MEMCACHED_AT
);
47 // Collect the returned items
48 memcached_instance_st
*instance
;
49 memcached_return_t readable_error
;
50 while ((instance
= memcached_io_get_readable_server(memc
, readable_error
))) {
51 memcached_return_t rrc
= memcached_response(instance
, NULL
);
52 if (memcached_failed(rrc
)) {
53 errors_happened
= true;
58 return errors_happened
? MEMCACHED_SOME_ERRORS
: MEMCACHED_SUCCESS
;
61 static inline memcached_return_t
memcached_version_binary(Memcached
*memc
) {
62 protocol_binary_request_version request
= {};
64 request
.message
.header
.request
.opcode
= PROTOCOL_BINARY_CMD_VERSION
;
65 request
.message
.header
.request
.datatype
= PROTOCOL_BINARY_RAW_BYTES
;
67 libmemcached_io_vector_st vector
[] = {{request
.bytes
, sizeof(request
.bytes
)}};
70 bool errors_happened
= false;
71 for (uint32_t x
= 0; x
< memcached_server_count(memc
); x
++) {
72 memcached_instance_st
*instance
= memcached_instance_fetch(memc
, x
);
74 initialize_binary_request(instance
, request
.message
.header
);
76 if (instance
->major_version
!= UINT8_MAX
) {
80 memcached_return_t rrc
= memcached_vdo(instance
, vector
, 1, true);
81 if (memcached_failed(rrc
)) {
82 errors_happened
= true;
90 // Collect the returned items
91 memcached_instance_st
*instance
;
92 memcached_return_t readable_error
;
93 while ((instance
= memcached_io_get_readable_server(memc
, readable_error
))) {
95 memcached_return_t rrc
= memcached_response(instance
, buffer
, sizeof(buffer
), NULL
);
96 if (memcached_failed(rrc
)) {
97 errors_happened
= true;
102 return errors_happened
? MEMCACHED_SOME_ERRORS
: MEMCACHED_SUCCESS
;
105 static inline void version_ascii_instance(memcached_instance_st
*instance
) {
106 if (instance
->major_version
!= UINT8_MAX
) {
107 libmemcached_io_vector_st vector
[] = {
108 {memcached_literal_param("version\r\n")},
111 (void) memcached_vdo(instance
, vector
, 1, false);
115 static inline void version_binary_instance(memcached_instance_st
*instance
) {
116 if (instance
->major_version
!= UINT8_MAX
) {
117 protocol_binary_request_version request
= {};
119 request
.message
.header
.request
.opcode
= PROTOCOL_BINARY_CMD_VERSION
;
120 request
.message
.header
.request
.datatype
= PROTOCOL_BINARY_RAW_BYTES
;
122 libmemcached_io_vector_st vector
[] = {{request
.bytes
, sizeof(request
.bytes
)}};
124 initialize_binary_request(instance
, request
.message
.header
);
126 (void) memcached_vdo(instance
, vector
, 1, false);
130 void memcached_version_instance(memcached_instance_st
*instance
) {
132 if (memcached_has_root(instance
)) {
133 if (memcached_is_fetching_version(instance
->root
)) {
134 if (memcached_is_udp(instance
->root
) == false) {
135 if (memcached_is_binary(instance
->root
)) {
136 version_binary_instance(instance
);
140 version_ascii_instance(instance
);
147 int8_t memcached_version_instance_cmp(memcached_instance_st
*instance
, uint8_t maj
, uint8_t min
,
149 if (!instance
|| memcached_server_major_version(instance
) == UINT8_MAX
) {
154 sv
= memcached_server_micro_version(instance
) | memcached_server_minor_version(instance
) << 8
155 | memcached_server_major_version(instance
) << 16;
156 cv
= mic
| min
<< 8 | maj
<< 16;
164 memcached_return_t
memcached_version(memcached_st
*shell
) {
165 Memcached
*memc
= memcached2Memcached(shell
);
167 memcached_return_t rc
;
168 if (memcached_failed(rc
= initialize_query(memc
, true))) {
172 if (memcached_is_udp(memc
)) {
173 return MEMCACHED_NOT_SUPPORTED
;
176 if (memcached_is_binary(memc
)) {
177 return memcached_version_binary(memc
);
180 return memcached_version_textual(memc
);
183 return MEMCACHED_INVALID_ARGUMENTS
;