static void php_memc_cas_impl()

in php_memcached.c [2066:2127]


static void php_memc_cas_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key)
{
	zval *zv_cas;
	uint64_t cas;
	zend_string *key;
	zend_string *server_key = NULL;
	zval *value;
	zend_long expiration = 0;
	zend_long ignored;
	zend_string *payload;
	uint32_t flags = 0;
	memcached_return status;
	MEMC_METHOD_INIT_VARS;

	if (by_key) {
		/* "zSSz|ll" */
		ZEND_PARSE_PARAMETERS_START(4, 6)
		        Z_PARAM_ZVAL(zv_cas)
		        Z_PARAM_STR(server_key)
		        Z_PARAM_STR(key)
		        Z_PARAM_ZVAL(value)
		        Z_PARAM_OPTIONAL
		        Z_PARAM_LONG(expiration)
		        Z_PARAM_LONG(ignored)
		ZEND_PARSE_PARAMETERS_END();
	} else {
		/* "zSz|ll" */
		ZEND_PARSE_PARAMETERS_START(3, 5)
		        Z_PARAM_ZVAL(zv_cas)
		        Z_PARAM_STR(key)
		        Z_PARAM_ZVAL(value)
		        Z_PARAM_OPTIONAL
		        Z_PARAM_LONG(expiration)
		        Z_PARAM_LONG(ignored)
		ZEND_PARSE_PARAMETERS_END();
	}

	MEMC_METHOD_FETCH_OBJECT;
	s_memc_set_status(intern, MEMCACHED_SUCCESS, 0);
	MEMC_CHECK_KEY(intern, key);

	cas = s_zval_to_uint64(zv_cas);

	payload = s_zval_to_payload(intern, value, &flags);
	if (payload == NULL) {
		intern->rescode = MEMC_RES_PAYLOAD_FAILURE;
		RETURN_FALSE;
	}

	if (by_key) {
		status = memcached_cas_by_key(intern->memc, ZSTR_VAL(server_key), ZSTR_LEN(server_key), ZSTR_VAL(key), ZSTR_LEN(key), ZSTR_VAL(payload), ZSTR_LEN(payload), expiration, flags, cas);
	} else {
		status = memcached_cas(intern->memc, ZSTR_VAL(key), ZSTR_LEN(key), ZSTR_VAL(payload), ZSTR_LEN(payload), expiration, flags, cas);
	}

	zend_string_release(payload);
	if (s_memc_status_handle_result_code(intern, status) == FAILURE) {
		RETURN_FALSE;
	}

	RETURN_TRUE;
}