zend_bool s_memcached_result_to_zval()

in php_memcached.c [3682:3754]


zend_bool s_memcached_result_to_zval(memcached_st *memc, memcached_result_st *result, zval *return_value)
{
	zend_string *data;
	const char *payload;
	size_t payload_len;
	uint32_t flags;
	zend_bool retval = 1;

	payload     = memcached_result_value(result);
	payload_len = memcached_result_length(result);
	flags       = memcached_result_flags(result);

	if (!payload && payload_len > 0) {
		php_error_docref(NULL, E_WARNING, "Could not handle non-existing value of length %zu", payload_len);
		return 0;
	}

	if (MEMC_VAL_HAS_FLAG(flags, MEMC_VAL_COMPRESSED)) {
		data = s_decompress_value (payload, payload_len, flags);
		if (!data) {
			return 0;
		}
	} else {
		data = zend_string_init(payload, payload_len, 0);
	}

	switch (MEMC_VAL_GET_TYPE(flags)) {

		case MEMC_VAL_IS_STRING:
			ZVAL_STR_COPY(return_value, data);
			break;

		case MEMC_VAL_IS_LONG:
			ZVAL_LONG(return_value, strtol(ZSTR_VAL(data), NULL, 10));
			break;

		case MEMC_VAL_IS_DOUBLE:
		{
			if (zend_string_equals_literal(data, "Infinity")) {
				ZVAL_DOUBLE(return_value, php_get_inf());
			}
			else if (zend_string_equals_literal(data, "-Infinity")) {
				ZVAL_DOUBLE(return_value, -php_get_inf());
			}
			else if (zend_string_equals_literal(data, "NaN")) {
				ZVAL_DOUBLE(return_value, php_get_nan());
			}
			else {
				ZVAL_DOUBLE(return_value, zend_strtod(ZSTR_VAL(data), NULL));
			}
		}
			break;

		case MEMC_VAL_IS_BOOL:
			ZVAL_BOOL(return_value, payload_len > 0 && ZSTR_VAL(data)[0] == '1');
			break;

		case MEMC_VAL_IS_SERIALIZED:
		case MEMC_VAL_IS_IGBINARY:
		case MEMC_VAL_IS_JSON:
		case MEMC_VAL_IS_MSGPACK:
			retval = s_unserialize_value (memc, MEMC_VAL_GET_TYPE(flags), data, return_value);
			break;

		default:
			php_error_docref(NULL, E_WARNING, "unknown payload type");
			retval = 0;
			break;
	}
	zend_string_release(data);

	return retval;
}