X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fversion.c;h=8fcc11a0fb6b95b2ed95eedd17a9a69735f768f3;hb=c3992b4a4f0a52704af43fd8da166579caf52a56;hp=dde59066083c970d3c21105babd0d84c959873de;hpb=2842294a80328b5729cde780f0b6e6a3c9863e7d;p=m6w6%2Flibmemcached diff --git a/libmemcached/version.c b/libmemcached/version.c index dde59066..8fcc11a0 100644 --- a/libmemcached/version.c +++ b/libmemcached/version.c @@ -45,10 +45,14 @@ static inline memcached_return_t memcached_version_textual(memcached_st *ptr) memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, x); + // Optimization, we only fetch version once. + if (instance->major_version != UINT8_MAX) + continue; + rrc= memcached_do(instance, command, send_length, true); if (rrc != MEMCACHED_SUCCESS) { - instance->major_version= instance->minor_version= instance->micro_version= 0; + instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX; rc= MEMCACHED_SOME_ERRORS; continue; } @@ -56,7 +60,7 @@ static inline memcached_return_t memcached_version_textual(memcached_st *ptr) rrc= memcached_response(instance, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, NULL); if (rrc != MEMCACHED_SUCCESS) { - instance->major_version= instance->minor_version= instance->micro_version= 0; + instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX; rc= MEMCACHED_SOME_ERRORS; continue; } @@ -68,7 +72,7 @@ static inline memcached_return_t memcached_version_textual(memcached_st *ptr) instance->major_version= (uint8_t)strtol(response_ptr, (char **)NULL, 10); if (errno == ERANGE) { - instance->major_version= instance->minor_version= instance->micro_version= 0; + instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX; rc= MEMCACHED_SOME_ERRORS; continue; } @@ -79,7 +83,7 @@ static inline memcached_return_t memcached_version_textual(memcached_st *ptr) instance->minor_version= (uint8_t)strtol(response_ptr, (char **)NULL, 10); if (errno == ERANGE) { - instance->major_version= instance->minor_version= instance->micro_version= 0; + instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX; rc= MEMCACHED_SOME_ERRORS; continue; } @@ -89,7 +93,7 @@ static inline memcached_return_t memcached_version_textual(memcached_st *ptr) instance->micro_version= (uint8_t)strtol(response_ptr, (char **)NULL, 10); if (errno == ERANGE) { - instance->major_version= instance->minor_version= instance->micro_version= 0; + instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX; rc= MEMCACHED_SOME_ERRORS; continue; } @@ -114,6 +118,9 @@ static inline memcached_return_t memcached_version_binary(memcached_st *ptr) memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, x); + if (instance->major_version != UINT8_MAX) + continue; + rrc= memcached_do(instance, request.bytes, sizeof(request.bytes), true); if (rrc != MEMCACHED_SUCCESS) { @@ -128,6 +135,9 @@ static inline memcached_return_t memcached_version_binary(memcached_st *ptr) memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, x); + if (instance->major_version != UINT8_MAX) + continue; + if (memcached_server_response_count(instance) > 0) { memcached_return_t rrc; @@ -143,8 +153,29 @@ static inline memcached_return_t memcached_version_binary(memcached_st *ptr) } instance->major_version= (uint8_t)strtol(buffer, &p, 10); + if (errno == ERANGE) + { + instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX; + rc= MEMCACHED_SOME_ERRORS; + continue; + } + instance->minor_version= (uint8_t)strtol(p + 1, &p, 10); + if (errno == ERANGE) + { + instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX; + rc= MEMCACHED_SOME_ERRORS; + continue; + } + instance->micro_version= (uint8_t)strtol(p + 1, NULL, 10); + if (errno == ERANGE) + { + instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX; + rc= MEMCACHED_SOME_ERRORS; + continue; + } + } }