+
+memcached_return_t memcached_delete_by_key(memcached_st *ptr,
+ const char *group_key, size_t group_key_length,
+ const char *key, size_t key_length,
+ time_t expiration)
+{
+ LIBMEMCACHED_MEMCACHED_DELETE_START();
+
+ memcached_return_t rc;
+ if (memcached_failed(rc= initialize_query(ptr)))
+ {
+ return rc;
+ }
+
+ rc= memcached_validate_key_length(key_length, ptr->flags.binary_protocol);
+ if (memcached_failed(rc))
+ {
+ return rc;
+ }
+
+ // If a delete trigger exists, we need a response, so no buffering/noreply
+ if (ptr->delete_trigger)
+ {
+ if (ptr->flags.buffer_requests)
+ {
+ return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT,
+ memcached_literal_param("Delete triggers cannot be used if buffering is enabled"));
+ }
+
+ if (ptr->flags.no_reply)
+ {
+ return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT,
+ memcached_literal_param("Delete triggers cannot be used if MEMCACHED_BEHAVIOR_NOREPLY is set"));
+ }
+ }
+
+
+ uint32_t server_key= memcached_generate_hash_with_redistribution(ptr, group_key, group_key_length);
+ memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, server_key);
+
+ bool to_write= (ptr->flags.buffer_requests) ? false : true;
+
+ // Invert the logic to make it simpler to read the code
+ bool reply= (ptr->flags.no_reply) ? false : true;
+
+ if (ptr->flags.binary_protocol)
+ {
+ rc= binary_delete(ptr, instance, server_key, key, key_length, expiration, reply, to_write);
+ }
+ else
+ {
+ rc= ascii_delete(ptr, instance, server_key, key, key_length, expiration, reply, to_write);
+ }
+
+ if (rc == MEMCACHED_SUCCESS)
+ {
+ if (to_write == false)
+ {
+ rc= MEMCACHED_BUFFERED;
+ }
+ else if (reply)
+ {
+ char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
+ rc= memcached_response(instance, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, NULL);
+ if (rc == MEMCACHED_DELETED)
+ {
+ rc= MEMCACHED_SUCCESS;
+ }
+ }
+
+ if (rc == MEMCACHED_SUCCESS and ptr->delete_trigger)
+ {
+ ptr->delete_trigger(ptr, key, key_length);
+ }
+ }
+
+ LIBMEMCACHED_MEMCACHED_DELETE_END();
+ return rc;
+}